Ë
    ãß²jðz  ã                   óô
  — U d Z ddlZddlZddlZddlZddlZddlZddlZddl	Zddl
ZddlmZ ddlmZmZmZmZ ddlmZ ddlmZmZ  ej.                  e«      ZdZdZd	Zd
ZdZ G d„ de«      Z dede!de"de#fd„Z$dee"   fd„Z%	 	 dÎde"de"de"deee"e"f      deee"ef      de!defd„Z&dddddd d!d"d#d$d%œ
Z'd&e!de"fd'„Z(i a)ee"ee"ef   f   e*d(<   d)Z+ e,«       a-e,e*d*<    ej\                  «       Z/d+d+d,d-œZ0defd.„Z1de"de"fd/„Z2dedee"ef   fd0„Z3de"deee"ef      fd1„Z4de"d2ee"ef   ddfd3„Z5de"dee"ef   fd4„Z6de"dee"ef   fd5„Z7d,d6œde"d7e8dee"ef   fd8„Z9dÏd9„Z:d:e"d;eee"ef      de"fd<„Z;d=ee"ef   d>e8dee"ef   fd?„Z<d@ee"ef   dee"ef   fdA„Z=dedBe!de"fdC„Z>de"dDede"fdE„Z?de"dFe"dDede"fdG„Z@de"dFe"dDede"fdH„ZAde"dIe"dDede"fdJ„ZBde"dFe"dDede"fdK„ZCde"dFe"dLe"dDede"f
dM„ZDdÐde"dFe"dNe"de!dDede"fdO„ZE	 	 dÑde"dIe"de!dQee"   dRee"   dDede"fdS„ZFde"dIe"dDede"fdT„ZG	 	 dÒde"dIe"dVe"dWee"   dXe!dDede"fdY„ZHde"de"dZe"fd[„ZI eId\d]d^«      ZJ eId_d]d`«      ZK eId_dadb«      ZL eId\dcdd«      ZM eId_dcde«      ZNdfe?dgdhfdie@djdkfdleAdjdmfdneBdodpfdqeCdjdrfdseDdtdufdveEdwdxfdyeFdodzfd{eGdod|fd}eJd~dfd€eKd~d�fd‚eLd~dƒfd„eHd…d†fd‡eMdˆd‰fdŠeNdˆd‹fgZOeOD � ���ci c]
  \  } }}}| |“Œ c}}}} ZPeOD � ����ci c]U  \  } }}}| |j£                  dg«      j¥                  dŒ«      D �cg c]#  }|j£                  «       sŒ|j£                  «       ‘Œ% c}“ŒW c}}}}} ZSee"ee"   f   e*d�<    eTh dŽ£«      ZUePj­                  «       D ��ci c]  \  }}|eUv sŒ||“Œ c}}ZWePj­                  «       D ��ci c]  \  }}|eUvsŒ||“Œ c}}ZX eTdsdvh«      ZYdeee"      fd�„ZZd2ee"ef   d�eee"      dee"   fd‘„Z[d’d“d”œZ\d•d–d—œd•d˜d—œd•d™d—œd•dšd—œd•d›d—œd•dœd—œd•d�d—œdždŸd d¡d¢œd•d£d—œd•d¤d—œdžg d¥¢d¦d§œd¨œZ]ee"ef   e*d©<   dªZ^	 dÓd¬ee"   d2eee"ef      d­e"deee"ef      fd®„Z_d¯ee"ef   d­e"deee"ef      fd°„Z` ejÂ                  e`eWd««      Zb ejÂ                  e`eXd±«      Zcd²Zdd³Zed´Zfed› dµ�ed› d¶�ed› d·�d¸ef› d¹�efeeeedºd»d¼d½œZgd¾e"de"de"fd¿„Zhde8fdÀ„ZidÁdÁdÁdÁdÁdÁdÁdPdÁdÁdUd¨œZjd¾e"dÂee"ef   dÃe"dede"f
dÄ„Zk ejÂ                  ekeWd«¬Å«      Zl ejÂ                  ekeXd±¬Å«      Zmd«eWelfd±eXemffD ]3  \  ZnZoZp ejâ                  enen e_ ereo«      dÆd,ien¬Ç«      epfdÈ„eidÉg¬Ê«       Œ5 ddËlmsZs ddÌlmtZt deee"ef      fdÍ„Zuyc c}}}} w c c}w c c}}}}} w c c}}w c c}}w )Ô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/v10i  @ i   i À  i   c                   ó(   ‡ — e Zd Zdedefˆ fd„Zˆ xZS )ÚDiscordAPIErrorÚstatusÚbodyc                 óL   •— || _         || _        t        ‰| �  d|› d|› �«       y )NzDiscord API error z: )r   r   ÚsuperÚ__init__)Úselfr   r   Ú	__class__s      €ú7/home/ubuntu/.hermes/hermes-agent/tools/discord_tool.pyr   zDiscordAPIError.__init__%   s,   ø€ ØˆŒØˆŒ	Ü‰ÑÐ-¨f¨X°R¸°vÐ>Õ?ó    )Ú__name__Ú
__module__Ú__qualname__ÚintÚstrr   Ú__classcell__)r   s   @r   r   r   $   s   ø„ ð@˜sð @¨#÷ @ñ @r   r   ÚsourceÚlimitÚlabelÚreturnc                óp   — | j                  |dz   «      }t        |«      |kD  rt        dd|› d|› d�«      ‚|S )Né   iö  zDiscord API z
 exceeded z bytes.)ÚreadÚlenr   )r   r   r   r   s       r   Ú_read_limited_response_bodyr$   +   sA   € Ø�;‰;�u˜q‘yÓ!€DÜ
ˆ4ƒy�5ÒÜ˜c \°%°¸
À5À'ÈÐ#QÓRÐRØ€Kr   c                  óF   — t        dd«      xs dj                  «       xs dS )zDResolve the Discord bot token under the active profile secret scope.ÚDISCORD_BOT_TOKENÚ N)r   Ústrip© r   r   Ú_get_bot_tokenr*   2   s#   € äÐ*¨BÓ/Ò5°2×<Ñ<Ó>ÒFÀ$ÐFr   ÚmethodÚpathÚtokenÚparamsr   Útimeoutc           	      ó0  — t         › |› �}|r%|dt        j                  j                  |«      z   z  }t        j                  j                  ||€dn#t        j                  |«      j                  d«      | d|› �dddœ¬«      }	 t        j                  j                  ||¬	«      5 }|j                  d
k(  r
	 ddd«       yt        |t        d¬«      }t        j                  |j                  d«      «      cddd«       S # 1 sw Y   yxY w# t        j                  j                   $ ro}		 t        |	t"        d¬«      j                  dd¬«      }
n.# t$        $ r}|j&                  }
Y d}~nd}~wt(        $ r d}
Y nw xY wt%        |	j*                  |
«      |	‚d}	~	ww xY w)z'Make a request to the Discord REST API.ú?Núutf-8zBot zapplication/jsonz;Hermes-Agent (https://github.com/NousResearch/hermes-agent))ÚAuthorizationzContent-Typez
User-Agent)Údatar+   Úheaders©r/   éÌ   zresponse body)r   z
error bodyÚreplace)Úerrorsr'   )ÚDISCORD_API_BASEÚurllibÚparseÚ	urlencodeÚrequestÚRequestÚjsonÚdumpsÚencodeÚurlopenr   r$   Ú _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_requestrR   7   sv  € ô Ð˜t˜fÐ
%€CÙØˆs”V—\‘\×+Ñ+¨FÓ3Ñ3Ñ3ˆÜ
�.‰.×
 Ñ
 Ø˜$˜,‘$¬D¯J©J°tÓ,<×,CÑ,CÀGÓ,LÐU[à# E 7˜^Ð=OØWñYð !ó Z€Cð
9Ü�^‰^×#Ñ# C°Ð#Ó9ð 	4¸TØ�{‰{˜cÒ!Ø÷	4ð 	4ô /¨tÔ5UÐ]lÔmˆDÜ—:‘:˜dŸk™k¨'Ó2Ó3÷		4÷ 	4ò 	4ûô
 �<‰<×!Ñ!ò 9ð	Ü4ØÔ0¸ôFßFLÁfÈWÐ]fÀfÓFgñ øäò 	(Ø"Ÿ™�JûÜò 	ØŠJð	úä˜aŸf™f jÓ1°qÐ8ûð9úsr   Â!D	 Â$C=Â5D	 Â>5C=Ã3	D	 Ã=DÄD	 ÄD	 Ä	FÄ'#EÅ
FÅ	E6ÅE%Å FÅ%E6Å3FÅ5E6Å6FÆFÚtextÚvoiceÚcategoryÚannouncementÚannouncement_threadÚpublic_threadÚprivate_threadÚstageÚforumÚmedia)
r   é   é   é   é
   é   é   é   é   é   Útype_idc                 ó6   — t         j                  | d| › d�«      S )Nzunknown(ú))Ú_CHANNEL_TYPE_NAMESÚget)rf   s    r   Ú_channel_type_namerk   Y   s   € Ü×"Ñ" 7¨h°w°i¸qÐ,AÓBÐBr   Ú_capability_cachei€Q Ú_capability_bg_startedTF)Úhas_members_intentÚhas_message_contentÚdetectedc                  ó(   — ddl m}   | «       dz  dz  S )Nr   ©Úget_hermes_homeÚcachezdiscord_capabilities.json)Úhermes_constantsrs   rr   s    r   Ú_capability_disk_cache_pathrv   o   s   € Ý0ÙÓ˜wÑ&Ð)DÑDÐDr   c                 ól   — t        j                  | j                  d«      «      j                  «       dd S )z0Stable non-reversible cache key for a bot token.r2   Nre   )ÚhashlibÚsha256rB   Ú	hexdigest)r-   s    r   Ú_token_cache_keyr{   t   s*   € ä�>‰>˜%Ÿ,™, wÓ/Ó0×:Ñ:Ó<¸S¸bÐAÐAr   c                 óÈ   — 	 | j                  dd¬«      5 }t        j                  |«      }ddd«       t        t        «      r|S i S # 1 sw Y   ŒxY w# t
        $ r i cY S w xY w)zKDisk cache contents ({token_key: {"caps", "ts"}}); {} when missing/corrupt.Úrr2   ©ÚencodingN)Úopenr@   ÚloadÚ
isinstanceÚdictrJ   )r,   Úfr4   s      r   Ú_read_caps_filer…   y   sd   € ðØ�Y‰Y�s WˆYÓ-ð 	 °Ü—9‘9˜Q“<ˆD÷	 ä! $¬Ô-ˆtÐ5°2Ð5÷	 ð 	 ûô ò ØŠ	ðús-   ‚A •A«A ÁA ÁAÁA ÁA!Á A!c                 óZ  — 	 t        t        «       «      j                  t        | «      «      }t	        |t
        «      r7t        j                  «       t        |j                  dd«      «      z
  t        kD  ry|j                  d«      }t	        |t
        «      rd|v r|S dS # t        $ r Y yw xY w)z;Return fresh disk-cached capabilities for *token*, or None.Útsr   NÚcapsrn   )
r…   rv   rj   r{   r‚   rƒ   ÚtimeÚfloatÚ_CAPABILITY_DISK_TTL_SECONDSrJ   )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   ‚A2B Á5&B ÂB Â	B*Â)B*rˆ   c                 ó¼  — 	 t        «       }|j                  j                  dd¬«       t        |«      }|t	        j                  «       dœ|t        | «      <   |j                  d«      }|j                  dd¬«      5 }t        j                  ||«       d d d «       |j                  |«       y # 1 sw Y   ŒxY w# t        $ r t        j                  dd¬	«       Y y w xY w)
NT)ÚparentsÚexist_ok)rˆ   r‡   z	.json.tmpÚwr2   r~   z*discord capability disk-cache write failed©Úexc_info)rv   ÚparentÚmkdirr…   r‰   r{   Úwith_suffixr€   r@   Údumpr8   rJ   ÚloggerÚdebug)r-   rˆ   r,   r4   Útmpr„   s         r   Ú_save_caps_to_diskr›   �   sÀ   € ð
RÜ*Ó,ˆØ�‰×Ñ $°ÐÔ6Ü˜tÓ$ˆØ15¼T¿Y¹Y»[Ñ(IˆÔ˜eÓ$Ñ%Ø×Ñ˜{Ó+ˆØ�X‰X�c GˆXÓ,ð 	°Ü�I‰I�d˜AÔ÷	à�‰�DÕ÷	ð 	ûô ò RÜ�‰ÐAÈDˆÖQðRús*   ‚A9B8 Á;B,ÂB8 Â,B5Â1B8 Â8 CÃCc                 ód  ‡ — t         j                  ‰ «      }|�|S t        ‰ «      }|�|t         ‰ <   |S t        t        «      }|t         ‰ <   t
        5  ‰ t        vrAt        j                  ‰ «       dˆ fd„}t        j                  |dd¬«      j                  «        ddd«       |S # 1 sw Y   |S xY w)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                  ó¦   •— 	 t        ‰«      } | j                  d«      rt        ‰| «       y y # t        $ r t        j                  dd¬«       Y y w xY w)Nrp   z.background discord capability detection failedTr’   )Ú_fetch_capabilitiesrj   r›   rJ   r˜   r™   )rˆ   r-   s    €r   Ú
_bg_detectz4_detect_capabilities_nonblocking.<locals>._bg_detect±   sQ   ø€ ðbÜ.¨uÓ5�DØ—x‘x 
Ô+Ü*¨5°$Õ7ð ,øä ò bÜ—L‘LÐ!QÐ\`�LÖaðbús   ƒ(- ­ AÁAzdiscord-caps-detectT)ÚtargetÚnameÚdaemon©r   N)rl   rj   r�   rƒ   Ú_PERMISSIVE_CAPSÚ_capability_bg_lockrm   ÚaddÚ	threadingÚThreadÚstart)r-   ÚcachedÚdiskÚcaps_defaultrŸ   s   `    r   Ú _detect_capabilities_nonblockingr­   �   sº   ø€ ô ×"Ñ" 5Ó)€FØÐØˆÜ Ó&€DØÐØ#'Ô˜%Ñ Øˆô Ô(Ó)€LØ+Ô�eÑÜ	ñ aØÔ.Ñ.Ü"×&Ñ& uÔ-õbô ×Ñ JÐ5JÐSWÔX×^Ñ^Ô`÷að Ð÷að Ðús   ÁA
B%Â%B/c                 ó:  — t        t        «      }	 t        dd| d¬«      }t        |j	                  dd«      xs d«      }t        |t        z  «      |d<   t        |t        z  «      |d<   d	|d
<   |S # t        $ r!}t        j                  d|«       Y d}~|S d}~ww xY w)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/@mer_   r6   Úflagsr   rn   ro   Trp   z?Discord capability detection failed (%s); exposing all actions.N)rƒ   r¤   rR   r   rj   ÚboolÚ_FLAGS_GUILD_MEMBERSÚ_FLAGS_MESSAGE_CONTENTrJ   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A0 Á0	BÁ9BÂB)Úforcer·   c                óT   — | t         v r|s	t         |    S t        | «      }|t         | <   |S )z˜Blocking detection via GET /applications/@me, cached per token (the warm-up path;
    schema builds use the non-blocking variant). ``force`` re-fetches.)rl   rž   )r-   r·   rˆ   s      r   Ú_detect_capabilitiesr¹   Í   s4   € ð Ô!Ñ!©%Ü  Ñ'Ð'Ü˜uÓ%€DØ#Ô�eÑØ€Kr   c                  óR   — i a t        5  t        «       addd«       y# 1 sw Y   yxY w)z%Test hook: clear the detection cache.N)rl   r¥   Úsetrm   r)   r   r   Ú_reset_capability_cacher¼   ×   s*   € ð ÐÜ	ñ 'Ü!$£Ð÷'÷ 'ñ 'ús   ‰�&ÚkeyÚitemsc                 óF   — t        j                  | |dt        |«      i«      S )NÚcount)r@   rA   r#   )r½   r¾   s     r   Ú_listingrÁ   à   s   € Ü�:‰:�s˜E 7¬C°«JÐ7Ó8Ð8r   ÚmÚfullc                ó¶  — | j                  di «      }|j                  d«      |j                  d«      |j                  d«      | j                  d«      |j                  d«      |j                  dd«      | j                  d	g «      | j                  d
«      | j                  d«      dœ	}|r|S |j                  «       D ��ci c]  \  }}|dvsŒ||“Œ c}}S c c}}w )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ÚidÚusernameÚglobal_nameÚnickÚavatarÚbotFÚrolesÚ	joined_atÚpremium_since)	Úuser_idrÇ   Údisplay_nameÚnicknamerÊ   rË   rÌ   rÍ   rÎ   )rÊ   rÍ   rÎ   )rj   r¾   )rÂ   rÃ   rÅ   ÚrowÚkÚvs         r   Ú_member_summaryrÕ   ä   sÁ   € ð �5‰5�˜Ó€Dà—8‘8˜D“>¨t¯x©x¸
Ó/CÐUY×U]ÑU]Ð^kÓUlØ—E‘E˜&“M¨T¯X©X°hÓ-?ÈÏÉÐQVÐX]ÓH^Ø—‘�w Ó#°!·%±%¸Ó2DÐWX×W\ÑW\Ð]lÓWmño€Cñ ˆ3Ðo¨c¯i©i«k×o¡d a¨¸QÐFnÒ=n˜Q ™TÓoÐoùÓos   Â?CÃCÚmsgc                 óº  — | j                  di «      }| d   | j                  dd«      |j                  d«      |j                  d«      |j                  d«      |j                  dd«      d	œ| j                  d
«      | j                  d«      | j                  dg «      D �cg c]5  }|j                  d«      |j                  d«      |j                  d«      dœ‘Œ7 c}| j                  d«      rR| j                  dg «      D �cg c]6  }|j                  di «      j                  d«      |j                  dd«      dœ‘Œ8 c}ng | j                  dd«      dœS c c}w c c}w )NÚauthorrÆ   Úcontentr'   rÇ   rÈ   rË   F)rÆ   rÇ   rÐ   rË   Ú	timestampÚedited_timestampÚattachmentsÚfilenamerL   Úsize)rÝ   rL   rÞ   Ú	reactionsÚemojir¡   rÀ   r   )rà   rÀ   Úpinned)rÆ   rÙ   rØ   rÚ   rÛ   rÜ   rß   rá   ©rj   )rÖ   rØ   Úar}   s       r   Ú_message_summaryrä   ï   s3  € Ø�W‰W�X˜rÓ"€Fà�$‰i C§G¡G¨I°rÓ$:à—*‘*˜TÓ"°·
±
¸:Ó0FØ"ŸJ™J }Ó5¸f¿j¹jÈÐPUÓ>VñXð —W‘W˜[Ó)¸s¿w¹wÐGYÓ?Zð —W‘W˜]¨BÓ/ö1àð Ÿ™˜zÓ*°1·5±5¸³<ÈÏÉÈvËÓWò1ð
 36·'±'¸+Ô2F�S—W‘W˜[¨"Ó-ö/àð —e‘e˜G RÓ(×,Ñ,¨VÓ4¸q¿u¹uÀWÈaÓ?PÓQó/àLNØ—'‘'˜( EÓ*ñ,ð ,ùò1ùò/s   Â:EÄ ;EÚdefaultc                 ó”   — 	 t        t        t        | «      d«      «      S # t        t        f$ r t        t        |d«      «      cY S w xY w)z,Discord caps list endpoints at 100 per page.éd   )r   Úminr   Ú	TypeErrorÚ
ValueError)r   rå   s     r   Ú_limit_paramrë      sC   € ð&Ü”3”s˜5“z 3Ó'Ó(Ð(øÜ”zÐ"ò &Ü”3�w Ó$Ó%Ò%ð&ús   ‚   $AÁAÚ_kwargsc                 óÎ   — t        dd| «      }t        d|D �cg c]>  }|d   |d   |j                  d«      |j                  dd«      |j                  d	«      d
œ‘Œ@ c}«      S c c}w )Nr¯   z/users/@me/guildsÚguildsrÆ   r¡   ÚiconÚownerFÚpermissions)rÆ   r¡   rï   rð   rñ   ©rR   rÁ   rj   )r-   rì   rî   Úgs       r   Ú_list_guildsrô     sr   € Ü˜eÐ%8¸%Ó@€FÜ�Hð ö	ð ð �D‘' 1 V¡9°a·e±e¸F³mØ—U‘U˜7 EÓ*¸1¿5¹5ÀÓ;Oó	Qòó ð ùò s   ˜AA"
Úguild_idc                 óˆ  — t        dd|› �| ddi¬«      }t        j                  |d   |d   |j                  d«      |j                  d	«      |j                  d
«      |j                  d«      |j                  d«      |j                  dg «      |j                  d«      |j                  d«      |j                  d«      dœ«      S )Nr¯   ú/guilds/Úwith_countsÚtrue©r.   rÆ   r¡   Údescriptionrï   Úowner_idÚapproximate_member_countÚapproximate_presence_countÚfeaturesÚpremium_tierÚpremium_subscription_countÚverification_level)rÆ   r¡   rû   rï   rü   Úmember_countÚonline_countrÿ   r   r  r  ©rR   r@   rA   rj   )r-   rõ   rì   ró   s       r   Ú_server_infor    s´   € Ü˜ (¨8¨*Ð 5°uÀmÐU[ÐE\Ô]€AÜ�:‰:Ø�‰g˜q ™y¸¿¹¸}Ó9MÐWX×W\ÑW\Ð]cÓWdØ—E‘E˜*Ó%°q·u±uÐ=WÓ7XØŸ™Ð:Ó;ÈÏÉÈzÐ[]ÓI^ØŸ™˜nÓ-ÈQÏUÉUÐSoÓMpØŸe™eÐ$8Ó9ñ;ó <ð <r   c                 ó¼  — t        dd|› d�| «      }t        d„ |D «       d„ ¬«      }dg i|D �ci c]  }|d   g “Œ
 c}¥}|D ]‹  }|d	   d
k(  rŒ|j                  d«      }|||v r|nd   j                  |d   |j                  dd«      t	        |d	   «      |j                  dd«      |j                  d«      |j                  dd«      dœ«       Œ� |j                  «       D ]  }	|	j                  d„ ¬«       Œ |d   r	d|d   dœgng }
|
|D �cg c]  }|d   |d   dœ||d      dœ‘Œ c}z  }
t        j                  |
t        d„ |
D «       «      dœ«      S c c}w c c}w )zPAll channels grouped by category (uncategorized first), each sorted by position.r¯   r÷   z	/channelsc              3   ó2   K  — | ]  }|d    dk(  sŒ|–— Œ y­w)Útyper^   Nr)   )Ú.0Úchs     r   ú	<genexpr>z!_list_channels.<locals>.<genexpr>  s   è ø€ Ò<˜"¨B¨v©J¸!«O”2Ñ<ùs   ‚�c                 ó&   — | j                  dd«      S ©NÚpositionr   râ   ©Úcs    r   ú<lambda>z _list_channels.<locals>.<lambda>  s   € ÈAÏEÉEÐR\Ð^_ÓL`€ r   )r½   NrÆ   r	  r^   Ú	parent_idr¡   r'   r  r   ÚtopicÚnsfwF)rÆ   r¡   r	  r  r  r  c                 ó   — | d   S )Nr  r)   r  s    r   r  z _list_channels.<locals>.<lambda>(  s
   €   :¡€ r   )rU   Úchannels)rÆ   r¡   c              3   ó8   K  — | ]  }t        |d    «      –— Œ y­w)r  N)r#   )r
  ró   s     r   r  z!_list_channels.<locals>.<genexpr>+  s   è ø€ ÒFjÐ^_ÄsÈ1ÈZÉ=×GYÑFjùs   ‚)Úchannel_groupsÚtotal_channels)
rR   Úsortedrj   Úappendrk   ÚvaluesÚsortr@   rA   Úsum)r-   rõ   rì   r  Úcatsr  Úgroupsr  r”   ÚgroupÚresults              r   Ú_list_channelsr$    sŽ  € ä ¨°(°¸9Ð'EÀuÓM€HÜÑ< Ô<ÑB`Ôa€DØ9=¸rÐ8aÐ[_ÖE`ÐVWÀaÈÁgÈrÁkÒE`Ð8a€FØò iˆØˆf‰:˜Š?ØØ—‘˜Ó$ˆØ˜ 6Ñ)‰v¨tÑ4×;Ñ;Ø�T‘( B§F¡F¨6°2Ó$6Ô@RÐSUÐV\ÑS]Ó@^ØŸ™˜z¨1Ó-¸¿¹¸w»ÐQS×QWÑQWÐX^Ð`eÓQfñ=hõ 	ið	ið —‘“ò 0ˆØ�
‰
Ñ.ˆ
Õ/ð0à?EÀdº|˜4¨V°D©\Ñ:Ñ;ÐQS€FØ
ÐfjÖkÐab 1 T¡7°A°f±IÑ>ÈFÐSTÐUYÑSZÉOÓ\ÒkÑk€FÜ�:‰:¨Ä3ÑFjÐciÔFjÓCjÑkÓlÐlùò Faùò ls   ®EÄEÚ
channel_idc                 ót  — t        dd|› �| «      }t        j                  |d   |j                  d«      t	        |d   «      |j                  d«      |j                  d«      |j                  dd	«      |j                  d
«      |j                  d«      |j                  dd«      |j                  d«      dœ
«      S )Nr¯   ú
/channels/rÆ   r¡   r	  rõ   r  r  Fr  r  Úrate_limit_per_userr   Úlast_message_id)
rÆ   r¡   r	  rõ   r  r  r  r  r(  r)  )rR   r@   rA   rj   rk   )r-   r%  rì   r  s       r   Ú_channel_infor*  .  s§   € Ü	˜% :¨j¨\Ð!:¸EÓ	B€BÜ�:‰:Ø�‰h §¡ v£Ô8JÈ2ÈfÉ:Ó8VØ—F‘F˜:Ó&°·±¸³È"Ï&É&ÐQWÐY^ÓJ_Ø—F‘F˜:Ó&°R·V±V¸KÓ5HØ!Ÿv™vÐ&;¸QÓ?ÐTV×TZÑTZÐ[lÓTmñ	oó pð pr   c                 ó†  — t        dd|› d�| «      }t        dt        |d„ d¬«      D �cg c]‰  }|d   |d	   |j                  d
«      rd|j                  d
d«      d›�nd |j                  dd«      |j                  dd«      |j                  dd«      |j                  d«      |j                  dd«      dœ‘Œ‹ c}«      S c c}w )Nr¯   r÷   z/rolesrÌ   c                 ó&   — | j                  dd«      S r  râ   )r}   s    r   r  z_list_roles.<locals>.<lambda>@  s   € ¨Q¯U©U°:¸qÓ-A€ r   T)r½   ÚreverserÆ   r¡   Úcolorú#r   Ú06xr  ÚmentionableFÚmanagedr  Úhoist)rÆ   r¡   r.  r  r1  r2  r  r3  )rR   rÁ   r  rj   )r-   rõ   rì   rÌ   r}   s        r   Ú_list_rolesr4  7  sÌ   € Ü˜U h¨x¨j¸Ð$?ÀÓG€EÜ�Gô ˜Ñ#AÈ4ÔPöRð ð �D‘' 1 V¡9Ø45·E±E¸'´N�q˜Ÿ™˜w¨Ó*¨3Ð/Ñ0ÈØŸ™˜j¨!Ó,¸Q¿U¹UÀ=ÐRWÓ=XØ—u‘u˜Y¨Ó.ÀÇÁÀnÓ@UØ—U‘U˜7 EÓ*ó	,òRó Sð Sùò Rs   ©BB>
rÏ   c                 óh   — t        dd|› d|› �| «      }t        j                  t        |d¬«      «      S )Nr¯   r÷   z	/members/T©rÃ   )rR   r@   rA   rÕ   )r-   rõ   rÏ   rì   rÂ   s        r   Ú_member_infor7  C  s3   € Ü˜ (¨8¨*°I¸g¸YÐ GÈÓO€AÜ�:‰:”o a¨dÔ3Ó4Ð4r   Úqueryc           
      óš   — |t        |d«      dœ}t        dd|› d�| |¬«      }t        d|D �cg c]  }t        |d¬	«      ‘Œ c}«      S c c}w )
z>Name-prefix member search (requires the GUILD_MEMBERS intent).é   )r8  r   r¯   r÷   z/members/searchrú   ÚmembersFr6  )rë   rR   rÁ   rÕ   )r-   rõ   r8  r   rì   r.   r;  rÂ   s           r   Ú_search_membersr<  H  sO   € à¤|°E¸2Ó'>Ñ?€FÜ˜u¨°°
¸/Ð&JÈEÐZ`Ôa€GÜ�IÈÖPÀ1¤°¸Ö >ÒPÓQÐQùÒPs   ­A
é2   ÚbeforeÚafterc           	      ó°   — dt        |d«      i}|r||d<   |r||d<   t        dd|› d�| |¬«      }t        d	|D �cg c]  }t        |«      ‘Œ c}«      S c c}w )
zK``before``/``after`` are message snowflakes for reverse/forward pagination.r   r=  r>  r?  r¯   r'  z	/messagesrú   Úmessages)rë   rR   rÁ   rä   )	r-   r%  r   r>  r?  rì   r.   rA  rÖ   s	            r   Ú_fetch_messagesrB  O  si   € ð &¤|°E¸2Ó'>Ð?€FÙØ!ˆˆxÑÙØˆˆw‰Ü ¨°J°<¸yÐ'IÈ5ÐY_Ô`€HÜ�JÀ(Ö K¸3Ô!1°#Õ!6Ò KÓLÐLùÒ Ks   ºA
c                 óô   — t        dd|› d�| «      }t        d|D �cg c]M  }|d   |j                  dd«      dd	 |j                  d
i «      j                  d«      |j                  d«      dœ‘ŒO c}«      S c c}w )z1Pinned messages (content truncated for overview).r¯   r'  z/pinsÚpinned_messagesrÆ   rÙ   r'   NéÈ   rØ   rÇ   rÚ   )rÆ   rÙ   rØ   rÚ   rò   )r-   r%  rì   rA  rÖ   s        r   Ú
_list_pinsrF  \  s‹   € ä ¨°J°<¸uÐ'EÀuÓM€HÜÐ%ð ö	(ð ð �d‘)¨¯©°	¸2Ó(>¸tÀÐ(DØ—g‘g˜h¨Ó+×/Ñ/°
Ó;È#Ï'É'ÐR]ÓJ^ó	`ò(ó ð ùò (s   œAA5
é   r¡   Ú
message_idÚauto_archive_durationc                 ó®   — ||dœ}d|› d�}|r
d|› d|› d�}nd|d<   t        d|| |¬«      }t        j                  d	|d
   |j                  d«      dœ«      S )uR   Create a thread â€” anchored to ``message_id`` when given, else standalone public.)r¡   rI  r'  z/threadsz
/messages/ra   r	  ÚPOST)r   TrÆ   r¡   )ÚsuccessÚ	thread_idr¡   r  )	r-   r%  r¡   rH  rI  rì   r   r,   Úthreads	            r   Ú_create_threadrO  f  sq   € ð %)ÐCXÑY€DØ˜
�| 8Ð,€DÙØ˜J˜< z°*°¸XÐF‰àˆˆV‰Ü˜f d¨E¸Ô=€FÜ�:‰: $°V¸D±\È6Ï:É:ÐV\ÓK]Ñ^Ó_Ð_r   Úmessagec                 ó@   ‡ ‡‡— dt         dt        dt         fˆˆ ˆfd„}|S )zYBody-less write action: ``path``/``message`` are format templates over the action kwargs.r-   Úkwr   c                 óŽ   •— t        ‰ ‰j                  di |¤Ž| «       t        j                  d ‰j                  di |¤Ždœ«      S )NT)rL  rP  r)   )rR   Úformatr@   rA   )r-   rR  rP  r+   r,   s     €€€r   Ú_actionz_mutation.<locals>._actionv  s?   ø€ Ü˜  §¡Ñ!2¨rÑ!2°EÔ:Ü�z‰z d°~°w·~±~Ñ7KÈÑ7KÑLÓMÐMr   )r   r   )r+   r,   rP  rU  s   ``` r   Ú	_mutationrV  t  s(   ú€ ðN”sð N¤#ð 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ú,Ú_REQUIRED_PARAMS>   re  r`  r_  c                  ó$  — 	 ddl m}   | «       }|j                  d«      xs i j                  d«      }|�|dk(  ryt        |t        «      r|j                  d«      }n@t        |t        t        f«      s*t        j                  d	t        |«      j                  «       y|D �cg c]5  }t        |«      j                  «       sŒt        |«      j                  «       ‘Œ7 }}|D �cg c]  }|t        vsŒ|‘Œ }}|rGt        j                  d
dj!                  |«      dj!                  t        j#                  «       «      «       |D �cg c]  }|t        v sŒ|‘Œ c}S # t        $ r }t        j	                  d|«       Y d}~yd}~ww xY wc c}w c c}w c c}w )zŽ``discord.server_actions`` allowlist (comma string or YAML list), or ``None`` when
    unrestricted. Unknown names are dropped with a warning.r   )Úload_configz:discord: could not load config (%s); allowing all actions.NÚdiscordÚserver_actionsr'   rh  z5discord.server_actions: unexpected type %s; ignoring.z@discord.server_actions: unknown action(s) ignored: %s. Known: %sú, )Úhermes_cli.configrk  rJ   r˜   r™   rj   r‚   r   ÚsplitÚlistÚtupleÚwarningr	  r   r(   Ú_ACTIONSÚjoinÚkeys)rk  Úcfgr¶   ÚrawÚnÚnamesÚinvalids          r   Ú_load_allowed_actions_configr|  ª  s@  € ðÝ1Ù‹mˆð �7‰7�9ÓÒ# ×
(Ñ
(Ð)9Ó
:€CØ
€{�c˜R’iØÜ�#”sÔØ�i‰i˜‹n‰Ü˜œd¤E˜]Ô+Ü�‰ÐNÔPTÐUXÓPY×PbÑPbÔcØØ%(Ö; ¬C°«F¯L©L­NŒS�‹V�\‰\�^Ð;€EÐ;ØÖ5�Q 1¬HÒ#4ŠqÐ5€GÐ5ÙÜ�‰ØNØ�I‰I�gÓ §	¡	¬(¯-©-«/Ó :ô	<ð Ö.�! ¤X¢ŠAÒ.Ð.øô# ò Ü�‰ÐQÐSVÔWÜûðüò <ùÚ5ùò
 /s;   ‚E Â!FÃ FÃ!FÃ/FÅFÅFÅ	F Å E;Å;F Ú	allowlistc                 óx   — | j                  dd«      }t        D �cg c]  }|s|t        vr|�||v r|‘Œ c}S c c}w )zKVisible actions from intents + config allowlist, in :data:`_ACTIONS` order.rn   T)rj   rt  Ú_INTENT_GATED_MEMBERS)rˆ   r}  Ú
members_okr¡   s       r   Ú_available_actionsr�  Ä  sP   € à—‘Ð.°Ó5€Jä!ökØÙ˜$Ô&;Ñ;À)ÐBSÐW[Ð_hÑWhò 	òkð kùò ks   ›7)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.)Údiscord_adminrl  ÚstringzDiscord server (guild) ID.)r	  rû   zDiscord channel ID.zDiscord user ID.zDiscord role ID.zDiscord message ID.z2Member name prefix to search for (search_members).z New thread name (create_thread).Úintegerr!   rç   zDMax results (default 50). Applies to fetch_messages, search_members.)r	  ÚminimumÚmaximumrû   z5Snowflake ID for reverse pagination (fetch_messages).z5Snowflake ID for forward pagination (fetch_messages).)é<   rG  ià  i`'  zAThread archive duration in minutes (create_thread, default 1440).)r	  Úenumrû   )rõ   r%  rÏ   Úrole_idrH  r8  r¡   r   r>  r?  rI  Ú_SCHEMA_PROPERTIESa?  

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.rl  ÚactionsÚ	tool_namec                 óž  ‡ — |xs i }‰ sydj                  ˆ fd„t        D «       «      }d}ddht        ‰ «      z  }|rR|j                  d«      rA|j                  d«      d	u r.t        j                  d
j                  t        |«      «      ¬«      }t        j                  |t        d   «      \  }}||› d|› d|› |› �ddd‰ dœit        ¥dgdœdœS )zNTool schema for the filtered action list; ``None`` when empty (drop the tool).NÚ
c              3   óF   •K  — | ]  \  }}}}|‰v sŒd |› |› d|› �–— Œ y­w)z  u     â€” Nr)   )r
  r¡   Ú_fnÚsigÚdescr‹  s        €r   r  z _build_schema.<locals>.<genexpr>  s:   øè ø€ ò fÙ)=¨¨s°C¸ÐUYÐ]dÒUdˆ"ˆTˆF�3�%�v˜d˜VÔ$ñfùs   ƒ!’!r'   r`  ra  rp   ro   Fz and )rz  rl  z

Available actions:
z

ÚobjectÚactionrƒ  )r	  rˆ  )r	  Ú
propertiesÚrequired)r¡   rû   Ú
parameters)	ru  Ú_ACTION_MANIFESTr»   rj   Ú_CONTENT_NOTErT  r  Ú_TOOL_DESCRIPTIONSrŠ  )r‹  rˆ   rŒ  Úmanifest_blockÚcontent_noteÚaffected_actionsÚleadÚguidances   `       r   Ú_build_schemar   û  sò   ø€ ð Š:�2€DÙØØ—Y‘Yó fÜAQôfó f€Nà€LØ(¨+Ð6¼¸W»ÑEÐÙ˜DŸH™H ZÔ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ÀÑ%HÐ_ÔL^Ð_Ø!˜
ñ$ñ%ð %r   Úaction_subsetc                 ó¬   — t        «       }|syt        |«      }t        |t        «       «      D �cg c]	  }|| v sŒ|‘Œ }}|rt	        |||¬«      S dS c c}w )zHBuild a dynamic schema for *action_subset* filtered by intents + config.N)rŒ  )r*   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�QÐVWÐ[hÒVhŠqÐi€GÐiÙ@GŒ=˜ $°)Ô<ÐQÈTÐQùò js
   ¯	A¹Ar‚  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).)rb  rc  rd  re  rf  rg  r`  ra  r\  r_  r^  r”  c                 ób   — t         j                  | «      }d| › d�}|r|› d|› d|› d�S |› d|› d�S )z?Return a user-friendly guidance string for a 403 on ``action``.z Discord API 403 (forbidden) on 'z'.Ú z (Raw: rh   )Ú_ACTION_403_HINTrj   )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                  ó(   — t        t        «       «      S )z>Tool is available only when a Discord bot token is configured.)r±   r*   r)   r   r   Úcheck_discord_tool_requirementsr¬  @  s   € ä”Ó Ó!Ð!r   r'   Úvalid_actionsÚ
tool_labelc           	      óš  — t        «       }|st        d«      S |j                  | «      }|s't        d| › �t        |j	                  «       «      ¬«      S t        «       }|�.| |vr*t        d| › d|rdj                  |«      › �«      S d› �«      S t        j                  «       D ��ci c]  \  }}||j                  ||«      “Œ }	}}t        j                  | g «      D �
cg c]  }
|	j                  |
«      rŒ|
‘Œ }}
|r t        d	| › d
dj                  |«      › �«      S 	  |dd|i|	¤ŽS c c}}w c c}
w # t        $ r[}t        j                  d|| |«       t        |j                  dk(  rt        | |j                  «      n
t!        |«      «      cY d}~S d}~wt"        $ r/}t        j%                  d|| «       t        d|› �«      cY d}~S d}~ww xY w)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: rn  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: r)   )r*   r
   rj   rq  rv  r|  ru  Ú_HANDLER_DEFAULTSr¾   ri  r   r˜   rs  r   rª  r   r   rJ   Ú	exception)r”  r­  r®  r.   r-   Ú	action_fnr}  rÓ   rÔ   ÚkwargsÚpÚmissingrO   s                r   Ú_run_discord_actionr·  K  sÒ  € äÓ€EÙÜÐ=Ó>Ð>Ø×!Ñ! &Ó)€IÙÜÐ,¨V¨HÐ5ÌÈm×N`ÑN`ÓNbÓIcÔdÐdô -Ó.€IØÐ ¨yÑ!8ÜØ�v�hð Ù09˜Ÿ	™	 )Ó,ÐHðJóKð 	Kà?GÐHðJóKð 	Kô /@×.EÑ.EÓ.G×H¡d a¨ˆa�—‘˜A˜qÓ!Ñ!ÐH€FÑHÜ*×.Ñ.¨v°rÓ:ÖP�QÀ&Ç*Á*ÈQÅ-ŠqÐP€GÐPÙÜÐ=¸f¸XÀSÈÏÉÐSZÓI[ÐH\Ð]Ó^Ð^ð4ÙÑ/˜uÐ/¨Ñ/Ð/ùó IùÚPøô
 ò VÜ�‰Ð@À*ÈfÐVWÔXÜ¸¿¹ÀSºœ+ f¨a¯f©fÔ5ÌcÐRSËfÓUÕUûÜò 4Ü×ÑÐ=¸zÈ6ÔRÜÐ.¨q¨cÐ2Ó3Õ3ûð4úsC   Â#D%ÃD+Ã2D+Ä	D0 Ä0	G
Ä9AFÆ	G
ÆG
Æ$GÆ?G
ÇG
)r­  r®  rp   )rˆ   rŒ  c                 ó   —  |di ddi| ¥¤ŽS )Nr”  r'   r)   r)   )ÚargsÚ_hrR  s      r   r  r  w  s   € ±Ñ0L°hÀÐ5KÀdÐ5KÑ0L€ r   r&   )r¡   ÚtoolsetÚschemaÚhandlerÚcheck_fnÚrequires_env)ÚTYPE_CHECKING)ÚTuplec                  ó   — t        «       S )u0   Backward-compat wrapper â€” returns core schema.)Úget_dynamic_schema_corer)   r   r   Úget_dynamic_schemarÄ  ƒ  s   € ä"Ó$Ð$r   )NNrd   r£   )r:  )r=  NN)NrG  )Nrl  )vÚ__doc__Ú	functoolsrx   r@   Úloggingr§   r‰   Úurllib.errorr;   Úurllib.parseÚurllib.requestÚpathlibr   Útypingr   r   r   r   Úagent.secret_scoper   Útools.registryr	   r
   Ú	getLoggerr   r˜   r:   rD   rI   r²   r³   rJ   r   r   r   Úbytesr$   r*   rR   ri   rk   rl   Ú__annotations__r‹   r»   rm   ÚLockr¥   r¤   rv   r{   r…   r�   r›   r­   rž   r±   r¹   r¼   rÁ   rÕ   rä   rë   rô   r  r$  r*  r4  r7  r<  rB  rF  rO  rV  Ú_pin_messageÚ_unpin_messageÚ_delete_messageÚ	_add_roleÚ_remove_roler˜  rt  r(   rp  ri  Ú	frozensetÚ_CORE_ACTION_NAMESr¾   Ú_CORE_ACTIONSÚ_ADMIN_ACTIONSr  r|  r�  rš  rŠ  r™  r   r£  ÚpartialrÃ  Úget_dynamic_schema_adminÚ_NO_MANAGE_MESSAGESÚ_VIEW_HISTORYÚ_ROLE_HIERARCHYr§  rª  r¬  r±  r·  Údiscord_coreÚdiscord_admin_handlerÚ_nameÚ_actionsÚ_handlerÚregisterrq  rÀ  rÁ  rÄ  )	r¡   ÚfnÚ_sigÚ_descr�  r‘  rµ  rÓ   rÔ   s	   000000000r   ú<module>rê     sŸ
  ðòó Û Û Û Û Û Û Û Û Ý ß ,Ó ,å )ß /à	ˆ×	Ñ	˜8Ó	$€à0Ð Ø#2Ð  Ø )Ð ð -Ð Ø.Ð ô@�iô @ð¨ð °Cð À3ð È5ó ðG˜ ™ó Gð LPØ:<ñ9Øð9Øð9Ø#&ð9Ø08¸¸cÀ3¸h¹Ñ0Hð9à
�4˜˜S˜‘>Ñ
"ð9à47ð9àADó9ð< �'˜j¨^ÐAVØÐ-°7ÀÈWñVÐ ð
C ð C¨ó Cð 02Ð �4˜˜T # s (™^Ð+Ñ,Ó 1ð
  )Ð ñ "›eÐ ˜Ó #Ø$�i—n‘nÓ&Ð ð +/ÀtÐY^Ñ_Ð ðE Tó Eð
B˜Cð B Có Bð
˜$ð  4¨¨S¨¡>ó ð	 ð 	¨°°c¸3°h±Ñ(@ó 	ðR˜cð R¨¨c°3¨h©ð R¸Dó Rð¨Cð °D¸¸c¸±Nó ð@˜sð  t¨C°¨H¡~ó ð  7<ò  ð ¨tð ÀÀSÈ#ÀXÁó ó'ð9�#ð 9˜d 4¨¨S¨¡>Ñ2ð 9°só 9ðp�t˜C ˜H‘~ð p°ð p¸¸cÀ3¸h¹ó pð,˜$˜s C˜x™.ð ,¨T°#°s°(©^ó ,ð"&˜ð & cð &¨có &ð˜ð ¨ð °ó ð<˜ð < sð <°sð <¸só <ðm˜#ð m¨ð m¸ð mÀó mð&p˜ð p¨#ð p¸#ð pÀ#ó pð	S�sð 	S cð 	S°cð 	S¸có 	Sð5˜ð 5 sð 5°Sð 5ÀSð 5ÈSó 5ñ
R˜3ð R¨#ð R°cð RÀ#ð RÐWZð RÐ_bó Rð /1Ø9=ñ
MØð
MØð
MØ(+ð
Mà�S‰Mð
Mà)1°#©ð
MàJMð
MàRUó
Mð�cð  sð °sð ¸só ð IMØ!%ñ`Øð`Øð`Ø'*ð`Ø8@À¹ð`àð`à25ð`à:=ó`ð�cð  ð ¨só ñ ˜Ð 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ÑCÑ.˜˜r 4¨ˆD�"‰HÕC€ð "2÷*3ò *3áˆˆc�3˜ð 	˜cŸi™i¨›o×3Ñ3°CÓ8Ö
F˜¸A¿G¹G½Iˆ1�7‰7�9Ò
FÑFö*3Ð �$�s˜D ™I�~Ñ&ó 3ñ ÒTÓUÐ Ø"*§.¡.Ó"2×N™$˜!˜Q°aÐ;MÒ6M��A‘ÓN€Ø#+§>¡>Ó#3×S™4˜1˜a°qÐ@RÒ7R�!�Q‘$ÓS€ñ " =Ð2BÐ"CÓDÐ ð/ h¨t°C©yÑ&9ó /ð4k˜T # s (™^ð k¸ÀÀcÁÑ8Kð kÐPTÐUXÑPYó kððñÐ ð "Ð2NÑOØ#Ð4IÑJØ Ð1CÑDØ Ð1CÑDØ#Ð4IÑJØÐ/cÑdØÐ.PÑQàØØØ]ñ	ð  Ð0gÑhØÐ/fÑgàÚ'ØZññ!&Ð �D˜˜c˜‘Nó ð0Lð ð QZñ%Ø�#‰Yð%Ø& t¨C°¨H¡~Ñ6ð%ØJMð%àˆd�3˜�8‰nÑó%ð.R t¨C°¨H¡~ð RÀ#ð RÈ(ÐSWÐX[Ð]`ÐX`ÑSaÑJbó Rð ,˜)×+Ñ+Ð,?ÀÐPYÓZÐ Ø,˜9×,Ñ,Ð-@À.ÐRaÓbÐ ð MÐ Ø^€Ør€ð
 Ð
ð  mð 	mà+Ð,¨AÐ.Ø,Ð-Ð-RÐSØZàÐ
ÐjÐkØ"Ø#ØØJð	%àrñ!tÐ ð&O˜ð O 3ð O¨3ó Oð"¨ó "ð  "°ÀÐRTÐ_aØ˜ r°BÐQUñWÐ ð
4 ð 4°D¸¸c¸±Nð 4ÐPSð 4Ð_bð 4Ðgjó 4ð< !ˆy× Ñ Ð!4ÀMÐ^gÔh€Ø)˜	×)Ñ)Ø ~À/ôSÐ ð �˜|Ð,¨ÀÐPeÐ.fð"ò 	,Ñ€Eˆ8�Xð €H×ÑØØÙ™T (›^°:¸uÐ2EÐQVÔWØ (ÒLØ0Ø)Ð*ö,ð	,õ  !Ý ð%˜H T¨#¨s¨(¡^Ñ4ô %ùõQ Dùâ
Fùö*3ùó OùÛSs<   ËU
Ë%-U%ÌU Ì(U Ì:U%Í0U.Í=U.ÎU4Î&U4Õ U%