+
    lHàj�x  ã                   óÊ  a	€ RÂ to0 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 ^ RIHtHtHtHt ^ RIHt ^ RIHtHt ]P0                  ! ]4      tRtRÃtRÄtRÅtRÆt ! R R] 4      t!R	 R
 lt"R R lt#RÇR R llt$^ R^R^R^R^
R^R^R^R^R^R/
t%R R lt&/ s'] ^ k RÈt(])! 4       s*] ^k ]PV                  ! 4       t,RRRRRR/t-R  R! lt.R" R# lt/R$ R% lt0R& R' lt1R( R) lt2R* R+ lt3R, R- lt4R.R/R/ R0 llt5R1 R2 lt6R3 R4 lt7R5 R6 lt8R7 R8 lt9R9 R: lt:R; R< lt;R= R> lt<R? R@ lt=RA RB lt>RC RD lt?RE RF lt@RÉRG RH lltARÊRI RJ lltBRK RL ltCRËRN RO lltDRP RQ ltE]E! RRRSRT4      tF]E! RURSRV4      tG]E! RURWRX4      tH]E! RRRYRZ4      tI]E! RURYR[4      tJR\];R]R^3R_]<R`Ra3Rb]=R`Rc3Rd]>ReRf3Rg]?R`Rh3Ri]@RjRk3Rl]ARmRn3Ro]BReRp3Rq]CReRr3Rs]FRtRu3Rv]GRtRw3Rx]HRtRy3Rz]DR{R|3R}]IR~R3R€]JR~R�3.tK]K U UUUu/ uF  w  rr#WbK
  	  upppp tL]K U UUUUu/ uF[  w  rrSYP›                  R]4      P�                  R‚4       Uu. uF*  qfP›                  4       '       g   K  VP›                  4       NK,  	  upbK]  	  uppppp tO] ^k ]P! 0 RÌm4      tQ]LP¥                  4        UUu/ uF  w  rxV]Q9   g   K  WxbK  	  upptS]LP¥                  4        UUu/ uF  w  rxV]Q9  g   K  WxbK  	  upptT]P! RiRl04      tURƒ R„ ltVR… R† ltWR‡RÍRˆRÎ/tXR‰RŠR‹RŒR�/RŽRŠR‹RŒR�/R�RŠR‹RŒR‘/R’RŠR‹RŒR“/R”RŠR‹RŒR•/R–RŠR‹RŒR—/R˜RŠR‹RŒR™/RšRŠR›Rœ^R�^dRŒRž/RŸRŠR‹RŒR /R¡RŠR‹RŒR¢/R£RŠR›R¤. RÏORŒR¥//tY] ^k R¦tZRÐR§ R¨ llt[R© Rª lt\]Pº                  ! ]\]SRˆ4      t^]Pº                  ! ]\]TR‡4      t_R«t`R¬taR­tbRs]` R®2Rv]` R¯2Rx]` R°2RzR±R}]b R²2R€]bRo]aRq]aRdR³RlR´RiRµ/tcR¶ R· ltdR¸ R¹ lteR‰RºRŽRºR�RºR’RºR”RºR–RºR˜RºRš^2RŸRºR¡RºR£RM/tfR» R¼ ltg]Pº                  ! ]g]SRˆR½7      th]Pº                  ! ]g]TR‡R½7      tiRˆ]S]h3R‡]T]i33 F5  w  tjtktl]PÚ                  ! ]j]j][! ]n! ]k4      RR/]jR¾7      ]l3R¿ l]eRÀ.RÁ7       K7  	  R# u upppp i u upi u uppppp i u uppi u uppi )ÑuÈ  Discord server introspection and management tool (REST API + bot token).

The model-visible schema is filtered by two gates: privileged intents from GET /applications/@me
(search_members / member_info need GUILD_MEMBERS; fetch_messages / list_pins are annotated when
MESSAGE_CONTENT is missing) and the ``discord.server_actions`` config allowlist. Per-guild
permissions are NOT pre-checked â€” a call-time 403 is mapped to guidance by :func:`_enrich_403`.
N©ÚPath)ÚAnyÚDictÚListÚOptional)Ú
get_secret)ÚregistryÚ
tool_errorzhttps://discord.com/api/v10c                   ó>   a a€ ] tR t^$t oV3R lV 3R lltRtVtV ;t# )ÚDiscordAPIErrorc                ó&   <€ V ^8„  d   QhRS[ RS[/# )é   ÚstatusÚbody©ÚintÚstr)ÚformatÚ__classdict__s   "€Ú7/home/ubuntu/.hermes/hermes-agent/tools/discord_tool.pyÚ__annotate__ÚDiscordAPIError.__annotate__%   s   ø€ ÷ @ñ @™sð @©#ñ @ó    c                óJ   <€ Wn         W n        \        SV `  R V RV 24       R# )zDiscord API error z: N)r   r   ÚsuperÚ__init__)Úselfr   r   Ú	__class__s   &&&€r   r   ÚDiscordAPIError.__init__%   s(   ø€ ØŒØŒ	Ü‰ÑÐ-¨f¨X°R¸°vÐ>Ö?r   )r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   Ú__static_attributes__Ú__classdictcell__Ú__classcell__)r   r   s   @@r   r   r   $   s   ù‡ € ÷@÷ @ó @r   r   c                óH   € V ^8„  d   QhR\         R\        R\        R\        /# )r   ÚsourceÚlimitÚlabelÚreturn)r   r   r   Úbytes)r   s   "r   r   r   +   s(   € ÷ ñ ¬ð ´Cð Ä3ð Ì5ñ r   c                ó|   € V P                  V^,           4      p\        V4      V8”  d   \        RRV RV R24      hV# )é   iö  zDiscord API z
 exceeded z bytes.)ÚreadÚlenr   )r(   r)   r*   r   s   &&$ r   Ú_read_limited_response_bodyr1   +   sA   € Ø�;‰;�u˜q•yÓ!€DÜ
ˆ4ƒy�5ÔÜ˜c \°%°¸
À5À'ÈÐ#QÓRÐRØ€Kr   c                ó:   € V ^8„  d   QhR\         \        ,          /# ©r   r+   )r   r   )r   s   "r   r   r   2   s   € ÷ Gñ Gœ¤�ñ Gr   c                 ó^   € \        RR4      ;'       g    RP                  4       ;'       g    R# )zDResolve the Discord bot token under the active profile secret scope.ÚDISCORD_BOT_TOKENÚ N)r   Ústrip© r   r   Ú_get_bot_tokenr9   2   s)   € äÐ*¨BÓ/×5Ð5°2×<Ñ<Ó>×FÐFÀ$ÐFr   c                óÜ   € V ^8„  d   QhR\         R\         R\         R\        \        \         \         3,          ,          R\        \        \         \        3,          ,          R\        R\        /# )r   ÚmethodÚpathÚtokenÚparamsr   Útimeoutr+   )r   r   Údictr   r   )r   s   "r   r   r   7   s^   € ÷ 9ñ 9Üð9Üð9Ü#&ð9Ü08¼¼cÄ3¸h½Õ0Hð9ä
”4œœS˜•>Õ
"ð9ä47ð9äADñ9r   c                óˆ  € \          V 2pV'       d.   VR\        P                  P                  V4      ,           ,          p\        P                  P                  Ydf   RM$\        P                  ! V4      P                  R4      V RRV 2RRRR	/R
7      p \        P                  P                  WuR7      ;_uu_ 4       pVP                  ^Ì8X  d    RRR4       R# \        V\        RR7      p\        P                  ! VP                  R4      4      uuRRR4       #   + '       g   i     R# ; i  \        P                  P                    dt   p	 \        T	\"        RR7      P                  RRR7      p
M2  \$         d   pTP&                  p
 Rp?MRp?i\(         d    Rp
 Mi ; i\%        T	P*                  T
4      T	hRp	?	ii ; i)z'Make a request to the Discord REST API.Ú?Núutf-8ÚAuthorizationzBot zContent-Typezapplication/jsonz
User-Agentz;Hermes-Agent (https://github.com/NousResearch/hermes-agent))Údatar;   Úheaders©r?   zresponse body)r*   z
error bodyÚreplace)Úerrorsr6   )ÚDISCORD_API_BASEÚurllibÚparseÚ	urlencodeÚrequestÚRequestÚjsonÚdumpsÚencodeÚurlopenr   r1   Ú _DISCORD_RESPONSE_BODY_MAX_BYTESÚloadsÚdecodeÚerrorÚ	HTTPErrorÚ_DISCORD_ERROR_BODY_MAX_BYTESr   r   Ú	ExceptionÚcode)r;   r<   r=   r>   r   r?   ÚurlÚreqÚrespÚeÚ
error_bodyÚ	too_larges   &&&&&&      r   Ú_discord_requestrb   7   st  € ô Ð˜t˜fÐ
%€CßØˆs”V—\‘\×+Ñ+¨FÓ3Õ3Õ3ˆÜ
�.‰.×
 Ñ
 Øš,‘$¬D¯JªJ°tÓ,<×,CÑ,CÀGÓ,LÐU[à˜t E 7˜^¨^Ð=OØÐWðYð !ó Z€Cð
9Ü�^‰^×#Ñ# CÐ#×9Ô9¸TØ�{‰{˜cÔ!Ø÷ :Ñ9ô /¨tÔ5UÐ]lÔmˆDÜ—:’:˜dŸk™k¨'Ó2Ó3÷	 :×9×9Ó9ûô
 �<‰<×!Ñ!ô 9ð	Ü4ØÔ0¸ôFßFLÁfÈWÐ]fÀfÓFgñ øäô 	(Ø"Ÿ™�JûÜô 	ØŠJð	úä˜aŸf™f jÓ1°qÐ8ûð9úsx   Â(D/ Â=DÃD/ Ã6DÄ
D/ ÄD,	Ä&D/ Ä,D/ Ä/GÅ#E3Å2F<Å3F"Å>FÆ
F<ÆF"ÆF"ÆF<Æ!F"Æ"F<Æ<GÚtextÚvoiceÚcategoryÚannouncementÚannouncement_threadÚpublic_threadÚprivate_threadÚstageÚforumÚmediac                ó0   € V ^8„  d   QhR\         R\        /# )r   Útype_idr+   r   )r   s   "r   r   r   Y   s   € ÷ Cñ C¤ð C¬ñ Cr   c                 ó6   € \         P                  V R V  R24      # )zunknown(Ú))Ú_CHANNEL_TYPE_NAMESÚget)rn   s   &r   Ú_channel_type_namers   Y   s   € Ü×"Ñ" 7¨h°w°i¸qÐ,AÓBÐBr   Úhas_members_intentTÚhas_message_contentÚdetectedFc                ó$   € V ^8„  d   QhR\         /# r3   r   )r   s   "r   r   r   o   s   € ÷ Eñ E¤Tñ Er   c                  ó8   € ^ RI Hp  V ! 4       R,          R,          # )é    ©Úget_hermes_homeÚcachezdiscord_capabilities.json)Úhermes_constantsr{   rz   s    r   Ú_capability_disk_cache_pathr~   o   s   € Ý0ÙÓ˜wÕ&Ð)DÕDÐDr   c                ó0   € V ^8„  d   QhR\         R\         /# ©r   r=   r+   ©r   )r   s   "r   r   r   t   s   € ÷ Bñ BœCð B¤Cñ Br   c                óv   € \         P                  ! V P                  R4      4      P                  4       R,          # )z0Stable non-reversible cache key for a bot token.rC   :Né   N)ÚhashlibÚsha256rR   Ú	hexdigest)r=   s   &r   Ú_token_cache_keyr‡   t   s(   € ä�>Š>˜%Ÿ,™, wÓ/Ó0×:Ñ:Ó<¸SÕAÐAr   c                óR   € V ^8„  d   QhR\         R\        \        \        3,          /# )r   r<   r+   )r   r@   r   r   )r   s   "r   r   r   y   s"   € ÷ ñ œ$ð ¤4¬¬S¨¥>ñ r   c                óø   €  V P                  RRR7      ;_uu_ 4       p\        P                  ! V4      pRRR4       \        X\        4      '       d   V# / #   + '       g   i     L*; i  \
         d    / u # i ; i)zKDisk cache contents ({token_key: {"caps", "ts"}}); {} when missing/corrupt.Úrz	utf-8-sig©ÚencodingN)ÚopenrP   ÚloadÚ
isinstancer@   rZ   )r<   ÚfrE   s   &  r   Ú_read_caps_filer‘   y   sc   € ðØ�Y‰Y�s [ˆY×1Ô1°QÜ—9’9˜Q“<ˆD÷ 2ä! $¬×-Ò-ˆtÐ5°2Ð5÷ 2×1ûô ô ØŠ	ðús-   ‚A) �A´A) ÁA) ÁA&	Á!A) Á)A9Á8A9c                óh   € V ^8„  d   QhR\         R\        \        \         \        3,          ,          /# r€   )r   r   r@   r   )r   s   "r   r   r   ƒ   s'   € ÷ 	ñ 	¤ð 	¬´´c¼3°hµÕ(@ñ 	r   c                óŽ  €  \        \        4       4      P                  \        V 4      4      p\	        V\
        4      '       d?   \        P                  ! 4       \        VP                  R^ 4      4      ,
          \        8”  d   R# VP                  R4      p\	        V\
        4      '       d
   RV9   d   V# R#   \         d     R# i ; i)z;Return fresh disk-cached capabilities for *token*, or None.ÚtsNÚcapsrt   )
r‘   r~   rr   r‡   r�   r@   ÚtimeÚfloatÚ_CAPABILITY_DISK_TTL_SECONDSrZ   )r=   Úentryr•   s   &  r   Ú_load_caps_from_diskrš   ƒ   sš   € ðÜÔ ;Ó =Ó>×BÑBÔCSÐTYÓCZÓ[ˆÜ˜%¤×&Ò&¬$¯)ª)«+¼¸e¿i¹iÈÈaÓ>PÓ8QÕ*QÔTpÔ*pÙØ�y‰y˜Ó ˆÜ! $¬×-Ò-Ð2FÈ$Ô2NˆtÐXÐTXÐXøÜô Úðús   ‚A?B5 Â/B5 Â3B5 Â5CÃCc                óV   € V ^8„  d   QhR\         R\        \         \        3,          RR/# )r   r=   r•   r+   N©r   r@   r   )r   s   "r   r   r   �   s.   € ÷ Rñ Rœcð R¬¬c´3¨h­ð R¸Dñ Rr   c                 óæ  €  \        4       pVP                  P                  R R R7       \        V4      pRVR\        P                  ! 4       /V\        V 4      &   VP                  R4      pVP                  RRR7      ;_uu_ 4       p\        P                  ! W54       RRR4       VP                  V4       R#   + '       g   i     L#; i  \         d    \        P                  R	R R
7        R# i ; i)T)ÚparentsÚexist_okr•   r”   z	.json.tmpÚwrC   r‹   Nz*discord capability disk-cache write failed©Úexc_info)r~   ÚparentÚmkdirr‘   r–   r‡   Úwith_suffixr�   rP   ÚdumprH   rZ   ÚloggerÚdebug)r=   r•   r<   rE   Útmpr�   s   &&    r   Ú_save_caps_to_diskrª   �   s¾   € ð
RÜ*Ó,ˆØ�‰×Ñ $°ÐÔ6Ü˜tÓ$ˆØ)/°°t¼T¿YºY»[Ð(IˆÔ˜eÓ$Ñ%Ø×Ñ˜{Ó+ˆØ�X‰X�c GˆX×,Ô,°Ü�IŠI�dÔ÷ -à�‰�DÖ÷ -×,ûô ô RÜ�‰ÐAÈDˆ×QðRús*   ‚BC
 ÂB7ÂC
 Â7C	ÃC
 Ã
"C0Ã/C0c                óR   € V ^8„  d   QhR\         R\        \         \        3,          /# r€   rœ   )r   s   "r   r   r   �   s"   € ÷ ñ ¬Cð ´D¼¼c¸µNñ r   c                ó˜  a € \         P                  S 4      pVe   V# \        S 4      pVe   V\         S &   V# \        \        4      pV\         S &   \
        ;_uu_ 4        S \        9  dF   \        P                  S 4       R V 3R llp\        P                  ! VRRR7      P                  4        RRR4       V#   + '       g   i     T# ; i)uø   Schema-build lookup: in-process cache â†’ fresh disk cache â†’ permissive default plus a
fire-and-forget background detection that fills the disk cache for the NEXT process
(the ~2-5s blocking HTTPS call must stay off the cold-start critical path).Nc                ó   € V ^8„  d   QhRR/# ©r   r+   Nr8   )r   s   "r   r   Ú6_detect_capabilities_nonblocking.<locals>.__annotate__±   s   € ÷ bñ b ñ br   c                  ó¼   <€  \        S4      p V P                  R 4      '       d   \        SV 4       R# R#   \         d    \        P                  RRR7        R# i ; i)rv   z.background discord capability detection failedTr¡   N)Ú_fetch_capabilitiesrr   rª   rZ   r§   r¨   )r•   r=   s    €r   Ú
_bg_detectÚ4_detect_capabilities_nonblocking.<locals>._bg_detect±   sT   ø€ ðbÜ.¨uÓ5�DØ—x‘x 
×+Ò+Ü*¨5°$Ö7ñ ,øä ô bÜ—L‘LÐ!QÐ\`�L×aðbús   ƒ!5 ¥5 µ"AÁAzdiscord-caps-detectT)ÚtargetÚnameÚdaemon)Ú_capability_cacherr   rš   r@   Ú_PERMISSIVE_CAPSÚ_capability_bg_lockÚ_capability_bg_startedÚaddÚ	threadingÚThreadÚstart)r=   ÚcachedÚdiskÚcaps_defaultr²   s   f    r   Ú _detect_capabilities_nonblockingrÂ   �   s¾   ø€ ô ×"Ñ" 5Ó)€FØÒØˆÜ Ó&€DØÒØ#'Ô˜%Ñ Øˆô Ô(Ó)€LØ+Ô�eÑß	Ö	ØÔ.Ô.Ü"×&Ñ& uÔ-÷bð bô ×Ò JÐ5JÐSWÔX×^Ñ^Ô`÷ 
ð Ð÷ 
Ö	ð Ðús   ÁAB8Â8C		c                óR   € V ^8„  d   QhR\         R\        \         \        3,          /# r€   rœ   )r   s   "r   r   r   ½   s"   € ÷ ñ œsð ¤t¬C´¨H¥~ñ r   c                óZ  € \        \        4      p \        RRV ^R7      p\        VP	                  R^ 4      ;'       g    ^ 4      p\        V\        ,          4      VR&   \        V\        ,          4      VR&   RVR&   V#   \         d"   p\        P                  R	T4        R
p?T# R
p?ii ; i)uÅ   Fetch capabilities from GET /applications/@me. Pure network fetch â€” never touches
the in-process cache (background detection must not mutate schemas mid-process).
Detection failure is permissive.ÚGETz/applications/@merG   Úflagsrt   ru   Trv   z?Discord capability detection failed (%s); exposing all actions.N)r@   r¸   rb   r   rr   ÚboolÚ_FLAGS_GUILD_MEMBERSÚ_FLAGS_MESSAGE_CONTENTrZ   r§   Úinfo)r=   r•   ÚapprÆ   Úexcs   &    r   r±   r±   ½   s¬   € ô  Ô 0Ó1€Dð\Ü˜uÐ&9¸5È!ÔLˆÜ�C—G‘G˜G QÓ'×,Ð,¨1Ó-ˆÜ%)¨%Ô2FÕ*FÓ%GˆÐ!Ñ"Ü&*¨5Ô3IÕ+IÓ&JˆÐ"Ñ#ØˆˆZÑð €Køô ô \Ü�‰ÐUÐWZ×[Ð[Ø€Kûð\ús   ‘A+A> Á>B*Â	B%Â%B*Úforcec                ó^   € V ^8„  d   QhR\         R\        R\        \         \        3,          /# )r   r=   rÍ   r+   )r   rÇ   r@   r   )r   s   "r   r   r   Í   s)   € ÷ ñ ¤ð ¬tð ÄÄSÌ#ÀXÅñ r   c               ón   € V \         9   d   V'       g   \         V ,          # \        V 4      pV\         V &   V# )z”Blocking detection via GET /applications/@me, cached per token (the warm-up path;
schema builds use the non-blocking variant). ``force`` re-fetches.)r·   r±   )r=   rÍ   r•   s   &$ r   Ú_detect_capabilitiesrÐ   Í   s4   € ð Ô!Ô!¯%Ü  Õ'Ð'Ü˜uÓ%€DØ#Ô�eÑØ€Kr   c                ó   € V ^8„  d   QhRR/# r®   r8   )r   s   "r   r   r   ×   s   € ÷ 'ñ ' ñ 'r   c                 ót   € / s \        ;_uu_ 4        \        4       sRRR4       R#   + '       g   i     R# ; i)z%Test hook: clear the detection cache.N)r·   r¹   Úsetrº   r8   r   r   Ú_reset_capability_cacherÔ   ×   s'   € ð Ðß	Ö	Ü!$£Ð÷ 
×	×	Ò	ús   ‘&¦7	c                ót   € V ^8„  d   QhR\         R\        \        \         \        3,          ,          R\         /# )r   ÚkeyÚitemsr+   )r   Úlistr@   r   )r   s   "r   r   r   à   s.   € ÷ 9ñ 9”#ð 9œd¤4¬¬S¨¥>Õ2ð 9´sñ 9r   c                 óF   € \         P                  ! WR \        V4      /4      # )Úcount)rP   rQ   r0   )rÖ   r×   s   &&r   Ú_listingrÛ   à   s   € Ü�:Š:�s 7¬C°«JÐ7Ó8Ð8r   c                ó€   € V ^8„  d   QhR\         \        \        3,          R\        R\         \        \        3,          /# )r   ÚmÚfullr+   )r@   r   r   rÇ   )r   s   "r   r   r   ä   s6   € ÷ pñ p”tœC¤˜H•~ð p´ð p¼¼cÄ3¸h½ñ pr   c               óÚ  € V P                  R/ 4      pRVP                  R4      RVP                  R4      RVP                  R4      RV P                  R4      R	VP                  R	4      R
VP                  R
R4      RV P                  R. 4      RV P                  R4      RV P                  R4      /	pV'       d   V# VP                  4        UUu/ uF  w  rEVR9  g   K  WEbK  	  upp# u uppi )z�Member row; ``full`` adds the avatar/join fields member_info exposes
(key order is part of the result text, so the two shapes stay explicit).ÚuserÚuser_idÚidÚusernameÚdisplay_nameÚglobal_nameÚnicknameÚnickÚavatarÚbotFÚrolesÚ	joined_atÚpremium_since)rè   rë   rì   )rr   r×   )rÝ   rÞ   rà   ÚrowÚkÚvs   &$    r   Ú_member_summaryrð   ä   sÕ   € ð �5‰5�˜Ó€Dà�4—8‘8˜D“> :¨t¯x©x¸
Ó/CÀ^ÐUY×U]ÑU]Ð^kÓUlØ�A—E‘E˜&“M 8¨T¯X©X°hÓ-?ÀÈÏÉÐQVÐX]ÓH^Ø�—‘�w Ó# [°!·%±%¸Ó2DÀoÐWX×W\ÑW\Ð]lÓWmðo€C÷ ˆ3Ðo¨c¯i©i¬kÔo©k¡d a¸QÐFnÑ=nœT˜QšT©kÒoÐoùÓos   ÃC'ÃC'c                ót   € V ^8„  d   QhR\         \        \        3,          R\         \        \        3,          /# )r   Úmsgr+   )r@   r   r   )r   s   "r   r   r   ï   s*   € ÷ ,ñ ,œ$œs¤C˜x�.ð ,¬T´#´s°(­^ñ ,r   c                 óð  € V P                  R / 4      pRV R,          RV P                  RR4      R RVP                  R4      RVP                  R4      RVP                  R4      RVP                  RR4      /R	V P                  R	4      R
V P                  R
4      RV P                  R. 4       Uu. uF8  pRVP                  R4      RVP                  R4      RVP                  R4      /NK:  	  upRV P                  R4      '       dV   V P                  R. 4       Uu. uF8  pRVP                  R/ 4      P                  R4      RVP                  R^ 4      /NK:  	  upM. RV P                  RR4      /# u upi u upi )Úauthorrâ   Úcontentr6   rã   rä   rå   ré   FÚ	timestampÚedited_timestampÚattachmentsÚfilenamer\   ÚsizeÚ	reactionsÚemojirµ   rÚ   Úpinned©rr   )rò   rô   ÚarŠ   s   &   r   Ú_message_summaryr   ï   sd  € Ø�W‰W�X˜rÓ"€Fàˆc�$�i˜ C§G¡G¨I°rÓ$:ØØ�&—*‘*˜TÓ" J°·
±
¸:Ó0FØ˜FŸJ™J }Ó5°u¸f¿j¹jÈÐPUÓ>VðXð 	�S—W‘W˜[Ó)Ð+=¸s¿w¹wÐGYÓ?ZØà—W‘W˜]¨BÔ/ó1á/�ð ˜Ÿ™˜zÓ*¨E°1·5±5¸³<ÀÈÏÉÈvËÓWÙ/ñ1ð 	à25·'±'¸+×2FÒ2F�S—W‘W˜[¨"Ô-ó/á-�ð �a—e‘e˜G RÓ(×,Ñ,¨VÓ4°g¸q¿u¹uÀWÈaÓ?PÓQÙ-ò/àLNØ�#—'‘'˜( EÓ*ð,ð ,ùò1ùò/s   Â,>E.Ä>E3c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r   r)   Údefaultr+   )r   r   r   )r   s   "r   r   r      s!   € ÷ &ñ &œð &¤cð &¬cñ &r   c                ó˜   €  \        \        \        V 4      ^d4      4      #   \        \        3 d    \        \        T^d4      4      u # i ; i)z,Discord caps list endpoints at 100 per page.)r   Úminr   Ú	TypeErrorÚ
ValueError)r)   r  s   &&r   Ú_limit_paramr     sC   € ð&Ü”3”s˜5“z 3Ó'Ó(Ð(øÜ”zÐ"ô &Ü”3�w Ó$Ó%Ò%ð&ús   ‚   &A	ÁA	c                ó<   € V ^8„  d   QhR\         R\        R\         /# )r   r=   Ú_kwargsr+   ©r   r   )r   s   "r   r   r     s!   € ÷ ñ œð ¬ð ´ñ r   c                 óê   € \        R RV 4      p\        RV Uu. uFK  pRVR,          RVR,          RVP                  R4      RVP                  RR4      RVP                  R4      /NKM  	  up4      # u upi )	rÅ   z/users/@me/guildsÚguildsrâ   rµ   ÚiconÚownerFÚpermissions©rb   rÛ   rr   )r=   r	  r  Úgs   &,  r   Ú_list_guildsr    sƒ   € Ü˜eÐ%8¸%Ó@€FÜ�Hñ ó	ñ ˆAð �!�D•'˜6 1 V¥9¨f°a·e±e¸F³mØ�Q—U‘U˜7 EÓ*¨M¸1¿5¹5ÀÓ;Oó	Qñ ñ	ó ð ùò s   ˜AA0
c                óH   € V ^8„  d   QhR\         R\         R\        R\         /# ©r   r=   Úguild_idr	  r+   r
  )r   s   "r   r   r     s(   € ÷ <ñ <œð <¤sð <´sð <¼sñ <r   c                 ó®  € \        R RV 2V RR/R7      p\        P                  ! RVR,          RVR,          RVP                  R4      RVP                  R4      R	VP                  R	4      R
VP                  R4      RVP                  R4      RVP                  R. 4      RVP                  R4      RVP                  R4      RVP                  R4      /4      # )rÅ   ú/guilds/Úwith_countsÚtrue©r>   râ   rµ   Údescriptionr  Úowner_idÚmember_countÚapproximate_member_countÚonline_countÚapproximate_presence_countÚfeaturesÚpremium_tierÚpremium_subscription_countÚverification_level©rb   rP   rQ   rr   )r=   r  r	  r  s   &&, r   Ú_server_infor&    sË   € Ü˜ (¨8¨*Ð 5°uÀmÐU[ÐE\Ô]€AÜ�:Š:Øˆa��g�v˜q �y¨-¸¿¹¸}Ó9MÈvÐWX×W\ÑW\Ð]cÓWdØ�A—E‘E˜*Ó% ~°q·u±uÐ=WÓ7XØ˜Ÿ™Ð:Ó;¸ZÈÏÉÈzÐ[]ÓI^Ø˜Ÿ™˜nÓ-Ð/KÈQÏUÉUÐSoÓMpØ˜aŸe™eÐ$8Ó9ð;ó <ð <r   c                óH   € V ^8„  d   QhR\         R\         R\        R\         /# r  r
  )r   s   "r   r   r     s.   € ÷ mñ mœ#ð m¬ð m¼ð mÄñ mr   c                óP  € \        RRV R2V 4      p\        R V 4       R R7      pR. /V Uu/ uF  qUR,          . bK  	  upCpV F¦  pVR	,          ^8X  d   K  VP                  R
4      pYhV9   d   TMR,          P                  RVR,          RVP                  RR4      R	\	        VR	,          4      RVP                  R^ 4      RVP                  R4      RVP                  RR4      /4       K¨  	  VP                  4        F  p	V	P                  R R7       K  	  VR,          '       d   RRRVR,          /.M. p
Y¤ Uu. uF(  pRRVR,          RVR,          /RWeR,          ,          /NK*  	  up,          p
\        P                  ! RV
R\        R V
 4       4      /4      # u upi u upi )zPAll channels grouped by category (uncategorized first), each sorted by position.rÅ   r  z	/channelsc              3   óD   "  € T F  qR ,          ^8X  g   K  Vx € K  	  R# 5i)ÚtypeNr8   )Ú.0Úchs   & r   Ú	<genexpr>Ú!_list_channels.<locals>.<genexpr>  s   é € Ð<¡˜"¨v­J¸!©O—2’2£ùs   ‚ –
 c                 ó&   € V P                  R ^ 4      # ©Úpositionrþ   ©Úcs   &r   Ú<lambda>Ú _list_channels.<locals>.<lambda>  s   € ÈAÏEÉEÐR\Ð^_ÔL`r   )rÖ   Nrâ   r*  Ú	parent_idrµ   r6   r1  ÚtopicÚnsfwFc                 ó   € V R ,          # r0  r8   r2  s   &r   r4  r5  (  s   €   :¦r   re   ÚchannelsÚchannel_groupsÚtotal_channelsc              3   óF   "  € T F  p\        VR ,          4      x € K  	  R# 5i)r:  N)r0   )r+  r  s   & r   r-  r.  +  s   é € ÐFjÑciÐ^_ÄsÈ1ÈZÍ=×GYÐGYÓciùs   ‚!)
rb   Úsortedrr   Úappendrs   ÚvaluesÚsortrP   rQ   Úsum)r=   r  r	  r:  Úcatsr3  Úgroupsr,  r£   ÚgroupÚresults   &&,        r   Ú_list_channelsrG    s§  € ä ¨°(°¸9Ð'EÀuÓM€HÜÑ<¡Ó<ÑB`Ôa€DØ9=¸rÐ8aÑ[_ÓE`Ñ[_ÐVWÈÅgÈrÂkÑ[_ÑE`Ð8a€FÛˆØˆf�:˜Œ?ÙØ—‘˜Ó$ˆØ 6Ô)‰v¨tÕ4×;Ñ;Ø�"�T•(˜F B§F¡F¨6°2Ó$6¸Ô@RÐSUÐV\ÕS]Ó@^Ø˜Ÿ™˜z¨1Ó-¨w¸¿¹¸w»ÈÐQS×QWÑQWÐX^Ð`eÓQfð=hö 	iñ	 ð —‘–ˆØ�
‰
Ñ.ˆ
Ö/ñ !à?EÀd¿|¼|ˆz˜4 ¨V°D­\Ð:Ñ;ÐQS€FØ
ÐfjÓkÑfjÐab�
˜T 1 T¥7¨F°A°fµIÐ>À
ÈFÐUYÕSZÍOÓ\ÑfjÑkÕk€FÜ�:Š:Ð'¨Ð1AÄ3ÑFjÑciÓFjÓCjÐkÓlÐlùò Faùò ls   ®FÄ=.F#c                óH   € V ^8„  d   QhR\         R\         R\        R\         /# ©r   r=   Ú
channel_idr	  r+   r
  )r   s   "r   r   r   .  s.   € ÷ pñ pœð p¬#ð p¼#ð pÄ#ñ pr   c                 ó˜  € \        R RV 2V 4      p\        P                  ! RVR,          RVP                  R4      R\	        VR,          4      RVP                  R4      RVP                  R4      RVP                  RR4      R	VP                  R	4      R
VP                  R
4      RVP                  R^ 4      RVP                  R4      /
4      # )rÅ   ú
/channels/râ   rµ   r*  r  r7  r8  Fr1  r6  Úrate_limit_per_userÚlast_message_id)rb   rP   rQ   rr   rs   )r=   rJ  r	  r,  s   &&, r   Ú_channel_inforO  .  s¼   € Ü	˜% :¨j¨\Ð!:¸EÓ	B€BÜ�:Š:Øˆb��h˜ §¡ v£°Ô8JÈ2ÈfÍ:Ó8VØ�B—F‘F˜:Ó&¨°·±¸³À&È"Ï&É&ÐQWÐY^ÓJ_Ø�B—F‘F˜:Ó&¨°R·V±V¸KÓ5HØ˜rŸv™vÐ&;¸QÓ?ÐARÐTV×TZÑTZÐ[lÓTmð	oó pð pr   c                óH   € V ^8„  d   QhR\         R\         R\        R\         /# r  r
  )r   s   "r   r   r   7  s.   € ÷ 	Sñ 	S”sð 	S¤cð 	S´cð 	S¼cñ 	Sr   c                 ó´  € \        R RV R2V 4      p\        R\        VR RR7       Uu. uFŸ  pRVR,          RVR,          R	VP                  R	4      '       d   R
VP                  R	^ 4      R 2MRRVP                  R^ 4      RVP                  RR4      RVP                  RR4      RVP                  R4      RVP                  RR4      /NK¡  	  up4      # u upi )rÅ   r  z/rolesrê   c                 ó&   € V P                  R ^ 4      # r0  rþ   )rŠ   s   &r   r4  Ú_list_roles.<locals>.<lambda>@  s   € ¨Q¯U©U°:¸qÔ-Ar   T)rÖ   Úreverserâ   rµ   ÚcolorÚ#Ú06xNr1  ÚmentionableFÚmanagedr  Úhoist)rb   rÛ   r>  rr   )r=   r  r	  rê   rŠ   s   &&,  r   Ú_list_rolesr[  7  sç   € Ü˜U h¨x¨j¸Ð$?ÀÓG€EÜ�Gô ˜Ñ#AÈ4ÕPóRñ QˆAð �!�D•'˜6 1 V¥9Ø°A·E±E¸'·N²N�q˜Ÿ™˜w¨Ó*¨3Ð/Ñ0ÈØ˜Ÿ™˜j¨!Ó,¨m¸Q¿U¹UÀ=ÐRWÓ=XØ�q—u‘u˜Y¨Ó.°ÀÇÁÀnÓ@UØ�Q—U‘U˜7 EÓ*ó	,ñ QñRó Sð Sùò Rs   ©.C
ÁA6C
c          
      óT   € V ^8„  d   QhR\         R\         R\         R\        R\         /# )r   r=   r  rá   r	  r+   r
  )r   s   "r   r   r   C  s/   € ÷ 5ñ 5œð 5¤sð 5´Sð 5ÄSð 5ÌSñ 5r   c                 ój   € \        R RV RV 2V 4      p\        P                  ! \        VRR7      4      # )rÅ   r  z	/members/T©rÞ   )rb   rP   rQ   rð   )r=   r  rá   r	  rÝ   s   &&&, r   Ú_member_infor_  C  s3   € Ü˜ (¨8¨*°I¸g¸YÐ GÈÓO€AÜ�:Š:”o a¨dÔ3Ó4Ð4r   c                ó`   € V ^8„  d   QhR\         R\         R\         R\        R\        R\         /# )r   r=   r  Úqueryr)   r	  r+   )r   r   r   )r   s   "r   r   r   H  s@   € ÷ Rñ Rœ3ð R¬#ð R´cð RÄ#ð RÔWZð RÔ_bñ Rr   c                óž   € RVR\        V^4      /p\        RRV R2WR7      p\        RV Uu. uF  p\        VRR	7      NK  	  up4      # u upi )
z>Name-prefix member search (requires the GUILD_MEMBERS intent).ra  r)   rÅ   r  z/members/searchr  ÚmembersFr^  )r  rb   rÛ   rð   )r=   r  ra  r)   r	  r>   rc  rÝ   s   &&&&,   r   Ú_search_membersrd  H  sT   € à�u˜g¤|°E¸2Ó'>Ð?€FÜ˜u¨°°
¸/Ð&JÈEÔa€GÜ�IÉÓPÉÀ1¤°¸× >ÉÑPÓQÐQùÒPs   ­A

c                ó˜   € V ^8„  d   QhR\         R\         R\        R\        \         ,          R\        \         ,          R\        R\         /# )r   r=   rJ  r)   ÚbeforeÚafterr	  r+   )r   r   r   r   )r   s   "r   r   r   O  sU   € ÷ 
Mñ 
MÜð
MÜð
MÜ(+ð
Mä”S�Mð
Mä)1´#­ð
MäJMð
MäRUñ
Mr   c           	     óÆ   € R\        V^24      /pV'       d   W6R&   V'       d   WFR&   \        RRV R2WR7      p\        RV Uu. uF  p\        V4      NK  	  up4      # u upi )	zK``before``/``after`` are message snowflakes for reverse/forward pagination.r)   rf  rg  rÅ   rL  z	/messagesr  Úmessages)r  rb   rÛ   r   )	r=   rJ  r)   rf  rg  r	  r>   ri  rò   s	   &&&&&,   r   Ú_fetch_messagesrj  O  sf   € ð &¤|°E¸2Ó'>Ð?€FßØ!ˆxÑßØˆw‰Ü ¨°J°<¸yÐ'IÈ5Ô`€HÜ�JÁ(Ó KÁ(¸3Ô!1°#Ö!6Á(Ñ KÓLÐLùÒ Ks   ÁA
c                óH   € V ^8„  d   QhR\         R\         R\        R\         /# rI  r
  )r   s   "r   r   r   \  s(   € ÷ ñ ”cð ¤sð ´sð ¼sñ r   c                ó  € \        RRV R2V 4      p\        RV Uu. uFY  pRVR,          RVP                  RR4      R,          R	VP                  R	/ 4      P                  R
4      RVP                  R4      /NK[  	  up4      # u upi )z1Pinned messages (content truncated for overview).rÅ   rL  z/pinsÚpinned_messagesrâ   rõ   r6   :NéÈ   Nrô   rã   rö   r  )r=   rJ  r	  ri  rò   s   &&,  r   Ú
_list_pinsro  \  s˜   € ä ¨°J°<¸uÐ'EÀuÓM€HÜÐ%ñ ó	(ñ ˆCð �#�d•)˜Y¨¯©°	¸2Ó(>¸tÕ(DØ�c—g‘g˜h¨Ó+×/Ñ/°
Ó;¸[È#Ï'É'ÐR]ÓJ^ó	`ñ ñ	(ó ð ùò (s   œAB
é   c                ó‚   € V ^8„  d   QhR\         R\         R\         R\        \         ,          R\        R\        R\         /# )r   r=   rJ  rµ   Ú
message_idÚauto_archive_durationr	  r+   )r   r   r   r   )r   s   "r   r   r   f  sQ   € ÷ `ñ `Üð`Üð`Ü'*ð`Ü8@Ä½ð`äð`ä25ð`ä:=ñ`r   c           
     óÈ   € RVRV/pRV R2pV'       d   RV RV R2pM^VR&   \        RWpVR7      p\        P                  ! R	R
RVR,          RVP                  R4      /4      # )uR   Create a thread â€” anchored to ``message_id`` when given, else standalone public.rµ   rs  rL  z/threadsz
/messages/r*  ÚPOST)r   ÚsuccessTÚ	thread_idrâ   r%  )	r=   rJ  rµ   rr  rs  r	  r   r<   Úthreads	   &&&&&,   r   Ú_create_threadry  f  sz   € ð # DÐ*AÐCXÐY€DØ˜
�| 8Ð,€DßØ˜J˜< z°*°¸XÐF‰àˆˆV‰Ü˜f d¸Ô=€FÜ�:Š:�y $¨°V¸Dµ\À6È6Ï:É:ÐV\ÓK]Ð^Ó_Ð_r   c                ó<   € V ^8„  d   QhR\         R\         R\         /# )r   r;   r<   Úmessager�   )r   s   "r   r   r   t  s!   € ÷ ñ ”cð ¤ð ¬sñ r   c                ó"   a aa€ R VV V3R llpV# )zYBody-less write action: ``path``/``message`` are format templates over the action kwargs.c                ó<   € V ^8„  d   QhR\         R\        R\         /# )r   r=   Úkwr+   r
  )r   s   "r   r   Ú_mutation.<locals>.__annotate__v  s&   € ÷ Nñ N”sð N¤#ð N¬#ñ Nr   c           
      ó’   <€ \        SSP                  ! R/ VB V 4       \        P                  ! R RRSP                  ! R/ VB /4      # )rv  Tr{  r8   )rb   r   rP   rQ   )r=   r~  r{  r;   r<   s   &,€€€r   Ú_actionÚ_mutation.<locals>._actionv  s?   ø€ Ü˜ §¢Ñ!2¨rÑ!2°EÔ:Ü�zŠz˜9 d¨I°w·~²~Ñ7KÈÑ7KÐLÓMÐMr   r8   )r;   r<   r{  r�  s   fff r   Ú	_mutationrƒ  t  s   ú€ ÷Nò Nð €Nr   ÚPUTz(/channels/{channel_id}/pins/{message_id}zMessage {message_id} pinned.ÚDELETEzMessage {message_id} unpinned.z,/channels/{channel_id}/messages/{message_id}zMessage {message_id} deleted.z4/guilds/{guild_id}/members/{user_id}/roles/{role_id}z'Role {role_id} added to user {user_id}.z+Role {role_id} removed from user {user_id}.Úlist_guildsz()zlist servers the bot is inÚserver_infoz
(guild_id)zserver details + member countsÚlist_channelsz all channels grouped by categoryÚchannel_infoz(channel_id)zsingle channel detailsÚ
list_roleszroles sorted by positionÚmember_infoz(guild_id, user_id)zlookup a specific memberÚsearch_membersz(guild_id, query)zfind members by name prefixÚfetch_messagesz1recent messages; optional before/after snowflakesÚ	list_pinszpinned messages in a channelÚpin_messagez(channel_id, message_id)zpin a messageÚunpin_messagezunpin a messageÚdelete_messagezdelete a messageÚcreate_threadz(channel_id, name)z2create a public thread; optional message_id anchorÚadd_rolez(guild_id, user_id, role_id)zassign a roleÚremove_rolezremove a roleÚ,c                óP   € V ^8„  d   QhR\         \        \        ,          ,          /# r3   )r   rØ   r   )r   s   "r   r   r   ª  s   € ÷ /ñ /¤h¬t´C­yÕ&9ñ /r   c                 óŒ  €  ^ RI Hp  V ! 4       pTP                  R4      ;'       g    / P                  R4      pTe   TR8X  d   R# \        T\        4      '       d   TP                  R4      pMG\        T\        \        34      '       g,   \        P                  R\        T4      P                  4       R# T Uu. uF=  p\        T4      P                  4       '       g   K$  \        T4      P                  4       NK?  	  ppT Uu. uF  qD\        9  g   K  TNK  	  ppT'       dH   \        P                  R	R
P!                  T4      R
P!                  \        P#                  4       4      4       T Uu. uF  qD\        9   g   K  TNK  	  up#   \         d"   p\        P	                  RT4        Rp?R# Rp?ii ; iu upi u upi u upi )zŠ``discord.server_actions`` allowlist (comma string or YAML list), or ``None`` when
unrestricted. Unknown names are dropped with a warning.)Úload_configz:discord: could not load config (%s); allowing all actions.NÚdiscordÚserver_actionsr6   r•  z5discord.server_actions: unexpected type %s; ignoring.z@discord.server_actions: unknown action(s) ignored: %s. Known: %sú, )Úhermes_cli.configr˜  rZ   r§   r¨   rr   r�   r   ÚsplitrØ   ÚtupleÚwarningr*  r    r7   Ú_ACTIONSÚjoinÚkeys)r˜  ÚcfgrÌ   ÚrawÚnÚnamesÚinvalids          r   Ú_load_allowed_actions_configr¨  ª  sQ  € ðÝ1Ù‹mˆð �7‰7�9Ó×#Ð# ×
(Ñ
(Ð)9Ó
:€CØ
‚{�c˜R”iÙÜ�#”s×ÒØ�i‰i˜‹n‰Ü˜œd¤E˜]×+Ò+Ü�‰ÐNÔPTÐUXÓPY×PbÑPbÔcÙÙ%(Ó;¡S ¬C°«F¯L©L¯NŒ^ŒS�‹V�\‰\Ž^¡S€EÐ;ÙÓ5™%�Q¬HÑ#4�qˆq™%€GÐ5ßÜ�‰ØNØ�I‰I�gÓ §	¡	¬(¯-©-«/Ó :ô	<ñ Ó.‘u�!¤X¡�AˆA‘uÑ.Ð.øô# ô Ü�‰ÐQÐSVÔWÝûðüò <ùÚ5ùò
 /s;   ‚F Â9!F7ÃF7ÄF<ÄF<Å.GÅ?GÆF4ÆF/Æ/F4c                ó    € V ^8„  d   QhR\         \        \        3,          R\        \        \        ,          ,          R\        \        ,          /# )r   r•   Ú	allowlistr+   )r@   r   r   r   rØ   )r   s   "r   r   r   Ä  s>   € ÷ kñ kœT¤#¤s (�^ð k¼ÄÄcÅÕ8Kð kÔPTÔUXÕPYñ kr   c                óž   € V P                  RR4      p\         Uu. uF&  pV'       g   V\        9  g   K  Ve	   W19   g   K$  VNK(  	  up# u upi )zKVisible actions from intents + config allowlist, in :data:`_ACTIONS` order.rt   T)rr   r   Ú_INTENT_GATED_MEMBERS)r•   rª  Ú
members_okrµ   s   &&  r   Ú_available_actionsr®  Ä  sY   € à—‘Ð.°Ó5€Jå!ókÙ!�ß˜$Ô&;Ñ;ô 	ØBKÒBSÐW[ÑWh÷ 	ˆ™ñkð kùò ks   ›A
¨A
µA
ÁA
Údiscord_adminr™  r  r*  Ústringr  zDiscord server (guild) ID.rJ  zDiscord channel ID.rá   zDiscord user ID.Úrole_idzDiscord role ID.rr  zDiscord message ID.ra  z2Member name prefix to search for (search_members).rµ   z New thread name (create_thread).r)   ÚintegerÚminimumÚmaximumzDMax results (default 50). Applies to fetch_messages, search_members.rf  z5Snowflake ID for reverse pagination (fetch_messages).rg  z5Snowflake ID for forward pagination (fetch_messages).rs  ÚenumzAThread archive duration in minutes (create_thread, default 1440).a?  

NOTE: Bot does NOT have the MESSAGE_CONTENT privileged intent. {names} will return message metadata (author, timestamps, attachments, reactions, pin state) but `content` will be empty for messages not sent as a direct mention to the bot or in DMs. Enable the intent in the Discord Developer Portal to see all content.c                óÎ   € V ^8„  d   QhR\         \        ,          R\        \        \        \        3,          ,          R\        R\        \        \        \        3,          ,          /# )r   Úactionsr•   Ú	tool_namer+   )rØ   r   r   r@   r   )r   s   "r   r   r   û  sJ   € ÷ %ñ %Ü”#�Yð%Ü&¤t¬C´¨H¥~Õ6ð%ÜJMð%äŒd”3œ�8�nÕñ%r   c                óî  a € T;'       g    / pS '       g   R# RP                  V 3R l\         4       4      pRpRR0\        S 4      ,          pV'       d[   VP                  R4      '       dD   VP                  R4      R	J d/   \        P                  R
P                  \        V4      4      R7      p\        P                  V\        R,          4      w  rgRVRV RV RV V 2RRRRRRRRS //\        CRR.//# )zNTool schema for the filtered action list; ``None`` when empty (drop the tool).NÚ
c              3   óP   <"  € T F  w  rr4VS9   g   K  R V V RV 2x € K  	  R# 5i)z  u     â€” Nr8   )r+  rµ   Ú_fnÚsigÚdescr·  s   &    €r   r-  Ú _build_schema.<locals>.<genexpr>  s8   øé € ð fÙAQÑ)=¨°CÐUYÐ]dÑUdÔ$ˆ"ˆTˆF�3�%�v˜d˜VÕ$ÓAQùs   ƒ&”&r6   r�  rŽ  rv   ru   Fz and )r¦  r™  rµ   r  z

Available actions:
z

Ú
parametersr*  ÚobjectÚ
propertiesÚactionr°  rµ  Úrequired)	r¡  Ú_ACTION_MANIFESTrÓ   rr   Ú_CONTENT_NOTEr   r>  Ú_TOOL_DESCRIPTIONSÚ_SCHEMA_PROPERTIES)r·  r•   r¸  Úmanifest_blockÚcontent_noteÚaffected_actionsÚleadÚguidances   f&&     r   Ú_build_schemarÎ  û  s  ø€ ð �:ˆ:�2€DßÙØ—Y‘Yô fÝAQófó f€Nà€LØ(¨+Ð6¼¸W»ÕEÐß˜DŸH™H Z×0Ò0°T·X±XÐ>SÓ5TÐX]Ó5]Ü$×+Ñ+°'·,±,¼vÐFVÓ?WÓ2XÐ+ÓYˆÜ'×+Ñ+¨IÔ7IÈ)Õ7TÓU�N€Dà�	Ø˜$˜Ð7¸Ð7GÀtÈHÈ:ÐVbÐUcÐdØØ�HØ˜8 f¨h¸ÀÐ%HÐ_ÔL^Ð_Ø˜˜
ð$ð%ð %r   c          	      ó–   € V ^8„  d   QhR\         \        \        3,          R\        R\        \         \        \        3,          ,          /# )r   Úaction_subsetr¸  r+   )r@   r   r   r   )r   s   "r   r   r     s@   € ÷ Rñ R¤t¬C´¨H¥~ð RÄ#ð RÌ(ÔSWÔX[Ô]`ÐX`ÕSaÕJbñ Rr   c                óÎ   € \        4       pV'       g   R# \        V4      p\        V\        4       4       Uu. uF  qDV 9   g   K  VNK  	  ppV'       d   \	        WSVR7      # R# u upi )zHBuild a dynamic schema for *action_subset* filtered by intents + config.N)r¸  )r9   rÂ   r®  r¨  rÎ  )rÐ  r¸  r=   r•   rÿ   r·  s   &&    r   Ú_get_dynamic_schemarÒ    s]   € äÓ€EßÙÜ+¨EÓ2€DÜ,¨TÔ3OÓ3QÔRÓiÑR�QÐ[hÑVh�qˆqÑR€GÐiß@GŒ=˜°)Ô<ÐQÈTÐQùò js   ¶A"ÁA"z4Bot lacks MANAGE_MESSAGES permission in this channelzLBot cannot view this channel (missing VIEW_CHANNEL or READ_MESSAGE_HISTORY).z^Either the bot lacks MANAGE_ROLES, or the target role sits higher than the bot's highest role.zd. Ask the server admin to grant the bot a role that has MANAGE_MESSAGES, or a per-channel overwrite.Ú.z%, or cannot view the channel/message.zCBot lacks CREATE_PUBLIC_THREADS in this channel, or cannot view it.zO Roles can only be assigned below the bot's own position in the role hierarchy.z4Bot cannot view this channel (missing VIEW_CHANNEL).u|   Likely missing the Server Members privileged intent â€” enable it in the Discord Developer Portal under your bot's settings.z]Bot cannot see this guild member (missing Server Members intent or insufficient permissions).c                ó<   € V ^8„  d   QhR\         R\         R\         /# )r   rÃ  r   r+   r�   )r   s   "r   r   r   9  s&   € ÷ Oñ Oœð O¤3ð O¬3ñ Or   c                ón   € \         P                  V 4      pRV  R2pV'       d   V RV RV R2# V RV R2# )z?Return a user-friendly guidance string for a 403 on ``action``.z Discord API 403 (forbidden) on 'z'.Ú z (Raw: rp   )Ú_ACTION_403_HINTrr   )rÃ  r   ÚhintÚbases   &&  r   Ú_enrich_403rÚ  9  sM   € ä×Ñ Ó'€DØ-¨f¨X°RÐ8€Dß-1ˆdˆV�1�T�F˜' $  qÐ)ÐN¸$¸¸wÀtÀfÈAÐ7NÐNr   c                ó$   € V ^8„  d   QhR\         /# r3   )rÇ   )r   s   "r   r   r   @  s   € ÷ "ñ "¬ñ "r   c                 ó(   € \        \        4       4      # )z>Tool is available only when a Discord bot token is configured.)rÇ   r9   r8   r   r   Úcheck_discord_tool_requirementsrÝ  @  s   € ä”Ó Ó!Ð!r   r6   c          
      óv   € V ^8„  d   QhR\         R\        \         \        3,          R\         R\        R\         /# )r   rÃ  Úvalid_actionsÚ
tool_labelr>   r+   rœ   )r   s   "r   r   r   K  s:   € ÷ 4ñ 4¤ð 4´D¼¼c¸µNð 4ÔPSð 4Ô_bð 4Ôgjñ 4r   c           	     óæ  € \        4       pV'       g   \        R4      # VP                  V 4      pV'       g(   \        RV  2\        VP	                  4       4      R7      # \        4       pVe7   W9  d1   \        RT  RV'       d   RP                  V4       24      # R 24      # \        P                  4        UUu/ uF  w  rxWsP                  Wx4      bK  	  p	pp\        P                  V . 4       U
u. uF  q©P                  V
4      '       d   K  V
NK  	  pp
V'       d!   \        R	V  R
RP                  V4       24      #  V! RRV/V	B # u uppi u up
i   \         d\   p\        P                  RY T4       \        TP                  R8X  d   \        YP                  4      M
\!        T4      4      u Rp?# Rp?i\"         d/   p\        P%                  RY 4       \        RT 24      u Rp?# Rp?ii ; i)z_Shared handler logic for both discord tools (``params`` default per :data:`_HANDLER_DEFAULTS`).z!DISCORD_BOT_TOKEN not configured.zUnknown action: )Úavailable_actionsNzAction 'z;' is disabled by config (discord.server_actions). Allowed: r›  z<none>z!Missing required parameters for 'z': r=   z'Discord API error in %s action '%s': %si“  z"Unexpected error in %s action '%s'zUnexpected error: r8   )r9   r
   rr   rØ   r¢  r¨  r¡  Ú_HANDLER_DEFAULTSr×   Ú_REQUIRED_PARAMSr   r§   rŸ  r   rÚ  r   r   rZ   Ú	exception)rÃ  rß  rà  r>   r=   Ú	action_fnrª  rî   rï   ÚkwargsÚpÚmissingr_   s   &&&,         r   Ú_run_discord_actionrê  K  sÊ  € äÓ€EßÜÐ=Ó>Ð>Ø×!Ñ! &Ó)€IßÜÐ,¨V¨HÐ5ÌÈm×N`ÑN`ÓNbÓIcÔdÐdô -Ó.€IØÒ Ô!8ÜØ�v�hð ß09˜Ÿ	™	 )Ó,ÐHðJóKð 	Kà?GÐHðJóKð 	Kô /@×.EÑ.EÔ.GÔHÑ.G¡d aˆa—‘˜AÓ!Ò!Ñ.G€FÑHÜ*×.Ñ.¨v°rÔ:ÓPÑ:�QÇ*Á*ÈQÇ-�qˆqÑ:€GÐPßÜÐ=¸f¸XÀSÈÏÉÐSZÓI[ÐH\Ð]Ó^Ð^ð4ÙÑ/˜uÐ/¨Ñ/Ð/ùó IùÚPøô
 ô VÜ�‰Ð@À*ÐVWÔXÜ¸¿¹ÀS¼œ+ f¯f©fÔ5ÌcÐRSËfÓUÕUûÜô 4Ü×ÑÐ=¸zÔRÜÐ.¨q¨cÐ2Ó3Õ3ûð4úsI   Â9EÃ0EÄEÄ>	E ÅG0ÅAF4Æ.G0Æ4G0ÇG0Ç#G+Ç%G0Ç+G0)rß  rà  )r•   r¸  c                 ó   € V! R/ R R/V CB # )rÃ  r6   r8   r8   )ÚargsÚ_hr~  s   &&,r   r4  r4  w  s   € ±Ñ0L°hÀÐ5KÀdÐ5KÒ0Lr   r5   )rµ   ÚtoolsetÚschemaÚhandlerÚcheck_fnÚrequires_envc                óV  € V ^8„  d   Qh/ ^ \         9   d,   \        \        \        \        \        3,          3,          ;R&   ^\         9   d
   \        ;R&   ^\         9   d&   \        \        \
        \        ,          3,          ;R&   ^\         9   d   \        \        \        3,          ;R&   # )r   r·   rº   rä  rÈ  )Ú__conditional_annotations__r@   r   r   rÓ   rØ   )r   s   "r   r   r      s‹   € ÷ ñ ÷| 2Ò 1”4œœT¤#¤s (�^Ð+Õ,Ñ 1ñ}÷L $Ò #œÑ #ñM÷v3ò 3”$”sœD¤�I�~Õ&ñ 3ñw÷tò ”Dœœc˜•Nñ òur   i  @ i   i À  i   )NNé   i€Q )é   )é2   NN)Nrp  >   r’  r�  rŒ  )z)Manage a Discord server via the REST API.zÁCall list_guilds first to discover guild_ids, then list_channels for channel_ids. Runtime errors will tell you if the bot lacks a specific per-guild permission (e.g. MANAGE_ROLES for add_role).)z)Read and participate in a Discord server.zpUse the channel_id from the current conversation context. Use search_members to look up user IDs by name prefix.)é<   rp  ià  i`'  )Nr™  )prô  Ú__doc__Ú	functoolsr„   rP   Úloggingr¼   r–   Úurllib.errorrK   Úurllib.parseÚurllib.requestÚpathlibr   Útypingr   r   r   r   Úagent.secret_scoper   Útools.registryr	   r
   Ú	getLoggerr    r§   rJ   rT   rY   rÈ   rÉ   rZ   r   r1   r9   rb   rq   rs   r·   r˜   rÓ   rº   ÚLockr¹   r¸   r~   r‡   r‘   rš   rª   rÂ   r±   rÐ   rÔ   rÛ   rð   r   r  r  r&  rG  rO  r[  r_  rd  rj  ro  ry  rƒ  Ú_pin_messageÚ_unpin_messageÚ_delete_messageÚ	_add_roleÚ_remove_rolerÅ  r   r7   r�  rä  Ú	frozensetÚ_CORE_ACTION_NAMESr×   Ú_CORE_ACTIONSÚ_ADMIN_ACTIONSr¬  r¨  r®  rÇ  rÈ  rÆ  rÎ  rÒ  ÚpartialÚget_dynamic_schema_coreÚget_dynamic_schema_adminÚ_NO_MANAGE_MESSAGESÚ_VIEW_HISTORYÚ_ROLE_HIERARCHYr×  rÚ  rÝ  rã  rê  Údiscord_coreÚdiscord_admin_handlerÚ_nameÚ_actionsÚ_handlerÚregisterrØ   r   )
rµ   ÚfnÚ_sigÚ_descr¼  r½  rè  rî   rï   rô  s
   000000000@r   Ú<module>r     ss  øðöó Û Û Û Û Û Û Û Û Ý ß ,Ó ,å )ß /à	×	Ò	˜8Ó	$€à0Ð Ø#2Ð  Ø )Ð ð -Ð Ø.Ð ô@�iô @õõG÷
9ð< €vˆq�'˜1˜j¨!¨^¸RÐAVØˆ˜Ð-¨r°7¸BÀÈÈWðVÐ õ
Cð 02Ð Ó 1ð
  )Ð ñ "›eÐ Ó #Ø—n’nÓ&Ð ð )¨$Ð0EÀtÈZÐY^Ð_Ð õEõ
Bõ
õ	õRõõ@ð °e÷ õ'õ9õpõ,õ"&õõ<õmõ&põ	Sõ5÷
R÷
Mõ÷`õñ ˜Ð JÐLjÓk€Ù˜8Ð%OÐQqÓr€ÙØÐ<Ð>]ó_€áØ	ÐAÐClón€	áØÐDØ1ó3€ð �L $Ð(DÐEØ�L ,Ð0PÐQØ�n lÐ4VÐWØ�] NÐ4LÐMØ�; Ð.HÐIØ�LÐ"7Ð9SÐTØ�Ð(;Ð=ZÐ[Ø�¨Ð8kÐlØ�*˜nÐ.LÐMØ�LÐ"<¸oÐNØ�nÐ&@ÐBSÐTØ�Ð(BÐDVÐWØ�nÐ&:Ð<pÐqØ�Ð:¸OÐLØ�LÐ"@À/ÐRðÐ ñ" 3CÖCÑ2BÑ.˜ 4ˆDŠHÑ2BÔC€ñ "2÷*3á!1Ñˆ�3ð 	Ÿi™i¨›o×3Ñ3°CÔ8Ó
FÑ8˜¿G¹G¿IŒ9ˆ1�7‰7Ž9Ñ8Ñ
FÒFÙ!1õ*3Ð ó 3ñ ÒTÓUÐ Ø"*§.¡.Ô"2ÔNÑ"2™$˜!°aÐ;MÑ6M”�’Ñ"2ÒN€Ø#+§>¡>Ô#3ÔSÑ#3™4˜1°qÐ@RÑ7R”$�!’$Ñ#3ÒS€ñ " =Ð2BÐ"CÓDÐ õ/õ4kð ð ð ð ðÐ ð �˜ =Ð2NÐOØ�6˜8 ]Ð4IÐJØ�˜ -Ð1CÐDØ�˜ -Ð1CÐDØ�6˜8 ]Ð4IÐJØˆf�h Ð/cÐdØ
ˆV�X˜}Ð.PÐQØØ�	Ø�1Ø�3ØÐ]ð	ð ˆv�x Ð0gÐhØˆf�h Ð/fÐgØØ�	ØÒ'ØÐZðð!&Ð ó ð0Lð ÷%õ.Rð $×+Ò+Ð,?ÀÐPYÓZÐ Ø$×,Ò,Ð-@À.ÐRaÓbÐ ð MÐ Ø^€Ør€ð ØÐ
ð  mð 	màÐ+Ð,¨AÐ.ØÐ,Ð-Ð-RÐSØÐZØØÐ
ÐjÐkØ�?Ø�mØ�ØÐJØð	%àÐrð!tÐ õ&Oõ"ð ��L " i°°YÀÀLÐRTÐV]Ð_aØ
ˆB�˜˜X r¨7°BÐ8OÐQUðWÐ õ
4ð< × Ò Ð!4ÀMÐ^gÔh€Ø!×)Ò)Ø ~À/ôSÐ ð �˜|Ð,¨ÀÐPeÐ.fó"Ñ€Eˆ8�Xð ×ÒØØÙ™T (›^°:¸uÐ2EÐQVÔWØ (ÓLØ0Ø)Ð*÷,ó"ùõk Dùâ
Fùö*3ùó OùÛSs<   Ç0Q
È*QÈ6QÉQÉ&QÊQÊ%QËQËQÑQ