+
    jHàj(  ã                   ó„   € R t ^ RIt^ RIHtHtHt ^ RIHt ^ RIH	t	 Rt
R R ltR R	 ltR
 R ltR R lt]	3R R lltR# )z8Validation for the ``platform_toolsets`` config section.N)ÚCallableÚListÚOptional)Ú	PLATFORMS)Útoolset_allowed_for_platformzQthe agent will have no tools on this platform. Run `hermes tools` to reconfigure.c                ó\   € V ^8„  d   QhR\         R\        \        \        ,          ,          /# )é   ÚvalueÚreturn)Úobjectr   ÚlistÚstr)Úformats   "ÚB/home/ubuntu/.hermes/hermes-agent/hermes_cli/toolset_validation.pyÚ__annotate__r      s#   € ÷ ñ ¬ð ´H¼TÄ#½YÕ4Gñ ó    c                ó’  € \        V \        4      '       d   V # \        V \        4      '       d|   V P                  4       P	                  R4      '       dW    \
        P                  ! V P                  4       4      p\        T\        4      '       d   T Uu. uF  p\        T4      NK  	  up# R#   \        \        3 d     R# i ; iu upi )a  The toolset list a saved ``platform_toolsets.<platform>`` value encodes, or None.

Older ``hermes config set`` builds stored a bare ``[...]`` argument as a plain string, so an
explicit selection like ``'["browser", "terminal"]'`` parses as str, not list (#115866).
Every reader and writer of the section goes through this one parser so the runtime,
``hermes doctor`` and ``hermes plugins enable`` agree on what the user configured. Any other
shape (null, scalar, unparseable string) is None: the caller decides how to report it.
Ú[N)	Ú
isinstancer   r   ÚstripÚ
startswithÚastÚliteral_evalÚ
ValueErrorÚSyntaxError)r	   ÚparsedÚitems   &  r   Úparse_platform_toolsets_valuer      sœ   € ô �%œ×ÒØˆÜ�%œ×Ò %§+¡+£-×":Ñ":¸3×"?Ò"?ð	Ü×%Ò% e§k¡k£mÓ4ˆFô �fœd×#Ò#Ù*0Ó1©& $”C˜–I©&Ñ1Ð1Ùøô	 œKÐ(ô 	Úð	üò 2s   Á$B, ÂCÂ,CÃ Cc                ó0   € V ^8„  d   QhR\         R\        /# )r   Úplatformr
   )r   r   )r   s   "r   r   r   !   s   € ÷ Nñ N¬ð N´3ñ Nr   c                 óX   € \         P                  ! V 4      pVe   VP                  # RV  2# )Núhermes-)r   ÚgetÚdefault_toolset)r   Úinfos   & r   Ú_platform_default_toolsetr%   !   s-   € Ü�=Š=˜Ó"€DØ#'Ò#3ˆ4×ÑÐM¸7À8À*Ð9MÐMr   c          
      ó¦   € V ^8„  d   QhR\         R\        R\        \        .\        3,          R\        \        \        .\        3,          R\        /# )r   r   r#   Úis_valid_toolsetÚis_allowed_for_platformr
   )r   r   r   Úbool)r   s   "r   r   r   &   sM   € ÷ ñ ÜðÜ'*ðÜ>FÌÀuÌdÀ{Õ>Sðä%¤s¬C j´$Ð&6Õ7ðä<@ñr   c                 ó¦   € V! V4      '       d   V! V\        V 4      4      '       d   R #  ^ RIHp VP                  V 4      #   \         d     R# i ; i)T)Úplatform_registryF)r   Úgateway.platform_registryr+   Úis_registeredÚ	Exception)r   r#   r'   r(   r+   s   &&&& r   Ú_platform_default_is_validr/   &   sQ   € ñ ˜×(Ò(Ñ-DÀ_ÔVYÐZbÓVc×-dÒ-dÙðÝ?à ×.Ñ.¨xÓ8Ð8øÜô Úðús   ªA ÁAÁAc                óT   € V ^8„  d   QhR\         R\        \        .\        3,          /# )r   Úconfigr
   )Údictr   r   r)   )r   s   "r   r   r   5   s)   € ÷ Rñ R¤4ð R¬H´c°U¼D°[Õ,Añ Rr   c                óR  aaaa€ ^ RI Hp ^ RIHo V P	                  R4      p\        V\        4      '       d   V Uu0 uF  p\        V4      kK  	  upM	\        4       pYD Uu0 uF  pRV 2kK
  	  up,          R0,          oVR R l4       oVR R	 l4       oVVVV3R
 l# u upi u upi )a  ``is_valid_toolset`` for a saved ``platform_toolsets`` list, mirroring what
``tools_config._get_platform_tools`` lets through: registered toolsets, any configured MCP server by
its ``mcp-<server>`` toolset name or bare alias (neither is registered before MCP discovery; a
disabled server is inactive, not a typo), ``hermes-<platform>`` plugin-platform bundles and the
``no_mcp`` sentinel. The manifest scan and the plugin lookup (which may run plugin discovery)
happen only for a name the cheaper checks cannot place.)Úcache)Úvalidate_toolsetÚmcp_serversúmcp-Úno_mcpc                ó$   € V ^8„  d   QhR\         /# ©r   r
   ©Ú	frozenset)r   s   "r   r   Ú,saved_toolset_resolver.<locals>.__annotate__E   s   € ÷ _ñ _œiñ _r   c                  ó<   € ^ RI Hp  \        R V ! 4        4       4      # )é    ©Ú_platform_plugin_manifestsc              3   ó0   "  € T F  w  rR V 2x € K  	  R# 5i)r!   N© )Ú.0ÚnameÚ	_manifests   &  r   Ú	<genexpr>ÚCsaved_toolset_resolver.<locals>.platform_bundles.<locals>.<genexpr>H   s   é € Ð^ÑA]©o¨d˜7 4 &Õ)ÓA]ùs   ‚)Úhermes_cli.configrA   r<   r@   s    r   Úplatform_bundlesÚ0saved_toolset_resolver.<locals>.platform_bundlesD   s   € å@äÑ^ÑA[ÔA]Ó^Ó^Ð^r   c                ó$   € V ^8„  d   QhR\         /# r:   r;   )r   s   "r   r   r=   K   s   € ÷ mñ mœ)ñ mr   c                  óŒ   € ^ RI Hp Hp V! 4       p\        V ! 4       V,          V Uu0 uF  pRV 2kK
  	  up,          4      # u upi )r?   )Úget_plugin_toolset_keys_nowaitÚ$get_portable_mcp_server_names_nowaitr7   )Úhermes_cli.pluginsrN   rO   r<   )rN   rO   ÚportablerE   s       r   Úplugin_namesÚ,saved_toolset_resolver.<locals>.plugin_namesJ   sB   € çká7Ó9ˆÜÑ7Ó9¸HÕDÑbjÓGkÑbjÐZ^È$ÈtÈfËÑbjÑGkÕkÓlÐlùÒGks   ¦A
c                 óv   <€ S! V 4      ;'       g*    V S9   ;'       g    V S! 4       9   ;'       g    V S! 4       9   # )NrC   )rE   ÚknownrJ   rR   r5   s   &€€€€r   Ú<lambda>Ú(saved_toolset_resolver.<locals>.<lambda>Q   sQ   ø€ Ñ)¨$Ó/÷ Qð Q°4¸5±=÷ Qð QØ Ñ$4Ó$6Ñ6÷Qð QØ:>Á,Ã.Ñ:PðQr   )	Ú	functoolsr4   Útoolsetsr5   r"   r   r2   r   Úset)	r1   r4   r6   rE   ÚserversrU   rJ   rR   r5   s	   &    @@@@r   Úsaved_toolset_resolverr\   5   s§   û€ õ  å)à—*‘*˜]Ó+€KÜ5?ÀÌT×5RÒ5R¡[Ó1¡[˜TŒs�4Žy¡[Ò1ÔX[ÓX]€GØ°Ó9±¨˜˜d˜V“}±Ñ9Õ9¸X¸JÕF€Eà
ô_ó ð_ð
 ômó ðm÷Rð Rùò! 2ùÚ9s   ¼BÁ!B$c          	      ó°   € V ^8„  d   QhR\         R\        \        .\        3,          R\        \        \        .\        3,          R\        \        ,          /# )r   Úplatform_toolsetsr'   r(   r
   )r   r   r   r)   r   )r   s   "r   r   r   U   sK   € ÷ <ñ <Üð<Ü19¼3¸%Ä¸+Õ1Fð<ä%¤s¬C j´$Ð&6Õ7ð<ô 
Œ#…Yñ<r   c           
     ó  € . p\        V \        4      '       d	   V '       g   V# ^ pV P                  4        EF³  w  rV\        V4      p\	        WWW4      p^ p	\        V4      p
V
f«   V'       d   V^,          pV	^,          p	V'       d   RV R2MRV R2pVf   RpM6\        V\        4      '       d   RV R2pMR\        V4      P                   R2pVP                  RV R	V R
V R24       V	^ 8X  d   VP                  RV R\         24       KØ  V
 F¡  p\        V\        4      '       d	   V'       g   K#  V! V4      '       g-   V'       d   RV R2MRpVP                  RV RV RV 24       K]  V! V\        V4      4      '       d   V^,          pV	^,          p	K‰  VP                  RV RV R24       K£  	  V	^ 8X  g   EK‰  V
'       g   RMRpVP                  RV RV R
\         24       EK¶  	  V^ 8X  d   VP                  R4       V# )a  Return human-readable warnings for a ``platform_toolsets`` mapping.
Reports: a toolset name ``is_valid_toolset`` rejects (suggesting ``hermes-<platform>`` when that
would have been valid); a non-empty mapping resolving to zero valid toolsets (agent would start with
no tools); a platform with no valid toolsets, checked per-platform because the global net is
suppressed once any platform is valid; and non-list platform values, which fall back to the platform
default. ``is_valid_toolset`` is injected so this does no registry imports or I/O.zfalling back to 'Ú'z!falling back to unknown default 'za null toolset valuezinvalid toolset value 'zinvalid z toolset valuez
platform 'z' has u    â€” z-. Run `hermes tools` to configure explicitly.u'   ' has no valid toolsets configured â€” u    â€” did you mean 'z'?Ú z' references unknown toolset 'z' references toolset 'z)' which is not available on this platformz(is configured with an empty toolset listz has no valid toolsets configuredz' uv   platform_toolsets resolves to zero valid toolsets â€” the agent will have no tools. Run `hermes tools` to reconfigure.)r   r2   Úitemsr%   r/   r   r   ÚtypeÚ__name__ÚappendÚ	_NO_TOOLS)r^   r'   r(   ÚwarningsÚvalid_countr   ÚrawÚdefaultÚdefault_validÚplatform_valid_countrY   Úfallback_detailÚvalue_detailrE   ÚhintÚreasons   &&&             r   Úvalidate_platform_toolsetsrq   U   s7  € ð €HÜÐ'¬×.Ò.×6GØˆà€KØ*×0Ñ0×2‰ˆÜ+¨HÓ5ˆÜ2°8ÐFVÓpˆØ ÐÜ0°Ó5ˆØÒßØ˜qÕ �Ø$¨Õ)Ð$ß@MÐ 1°'°¸!Ñ<ÐUvÐw~Ðvð  @Að  TBˆOØŠ{Ø5‘Ü˜C¤×%Ò%Ø!8¸¸¸QÐ?‘à!)¬$¨s«)×*<Ñ*<Ð)=¸^ÐL�Ø�O‰OØ˜X˜J f¨\¨N¸%Ø"Ð#Ð#PðRôSð $ qÔ(Ø—‘ *¨X¨JÐ6]Ô^gÐ]hÐ iÔjÙãˆDÜ˜d¤C×(Ò(·ÙÙ# D×)Ò)ß<IÐ,¨W¨I°RÑ8Èr�Ø—‘ *¨X¨JÐ6TÐUYÐTZÐZ[Ð\`Ð[aÐ bÖcÙ(¨¬s°8«}×=Ò=Ø˜qÕ �Ø$¨Õ)Ò$à—‘Ø   
Ð*@ÀÀÐFoÐpöñ ð   1×$ßGOÑ?ÐUwˆFØ�O‰O˜j¨¨
°"°V°H¸EÄ)ÀÐM×NñO 3ðR �aÔØ�‰ð@ô	Að €Or   )Ú__doc__r   Útypingr   r   r   Úhermes_cli.platformsr   Úhermes_cli.toolset_scoper   rf   r   r%   r/   r\   rq   rC   r   r   Ú<module>rv      sC   ðÙ >ã 
ß +Ñ +å *Ý Aà_€	õõ*Nõ
õRðD ;W÷<ñ <r   