+
    iHàjëš  ã                   óT  a € RŽ tv0 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	H
t
Ht ^ RIHtHtHtHtHtHtHt ^ RIHtHtHt ]P0                  ! ]4      tRRRRRR	/t]! R�4      t]! R�4      tR
R/R R lltR
R/R R llt Rs!R R lt"R R lt#R R lt$R R lt%/ t&] ^ k R R lt'R R lt(R]'R](RR /t)] ^k R R  lt*R! R" lt+R# R$ lt,/ t-] ^k ^€t.]P^                  ! 4       t0R% R& lt1R' R( lt2R) R* lt3R+ R, lt4R- R. lt5R/ R0 lt6R1 R2 lt7]! R304      t8] ^k R‘R4 R5 llt9R6 R7 lt:R8 R9 lt;/ t<] ^k R: R; lt=R< R= lt>R> R? lt?R@ RA lt@RB RC ltA]B! ^4      w  tCtDtEtFRDtG]H! 4       tI] ^k R‘RERF/RG RH llltJRI RJ ltKRK RL ltLRM RN ltMRO RP ltNRQ RR ltORS RT ltP]P¢                  P¥                  RURV4      ]P¢                  P¥                  RWRV4      3tS^@tTR‘RX RY lltURZ R[ ltVR\ R] ltWR^ R_ ltXR` Ra ltYRb Rc ltZRd Re lt[Rft\/ t]] ^k Rg Rh lt^Ri Rj lt_Rk Rl lt`Rm Rn ltaRo Rp ltbRq Rr ltcR’tdRs Rt lteRu Rv ltfRw Rx ltgRythRz R{ lti]PÔ                  ! R|4      tkR} R~ ltlR R€ ltm^<tnR� R‚ ltoRƒ R„ ltpR… R† ltqR‡ Rˆ ltr]PÔ                  ! R‰4      tsRŠ R‹ lttRŒ R� ltuR# )“zœLightweight skill metadata utilities shared by prompt_builder and skills_tool.
Import-light by design: no tool registry, CLI config, or provider resolution.N)ÚPathÚPurePath)ÚAnyÚCallableÚDictÚListÚOptionalÚSetÚTuple)Úget_config_pathÚget_skills_dirÚget_subprocess_homeÚmacosÚdarwinÚlinuxÚwindowsÚwin32Úrootc                óF   € V ^8„  d   QhR\         \        ,          R\        /# ©é   r   Úreturn©r   r   Úbool)Úformats   "Ú6/home/ubuntu/.hermes/hermes-agent/agent/skill_utils.pyÚ__annotate__r   "   s"   € ÷ hñ h¬(´4­.ð hÄDñ hó    c               óÎ   € \        \        V 4      4      P                  p\        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      ;'       g    \	        WR7      # )z“True if *path* should be skipped by skill scanners (VCS/dependency/cache
dirs + support packages). Apply to every SKILL.md from a direct ``rglob``.c              3   ó2   "  € T F  q\         9   x € K  	  R # 5i©N)ÚEXCLUDED_SKILL_DIRS)Ú.0Úparts   & r   Ú	<genexpr>Ú)is_excluded_skill_path.<locals>.<genexpr>&   s   é € Ð=±u¨tÔ*Ö*³uùó   ‚TF©r   )r   ÚstrÚpartsÚanyÚis_skill_support_path)Úpathr   r)   s   &$ r   Úis_excluded_skill_pathr-   "   sH   € ô ”S˜“YÓ×%Ñ%€Eß‹3Ñ=±uÓ=�3�3Š3Ñ=±uÓ=Ó=×gÐgÔAVÐW[ÔAgÐgr   c                óF   € V ^8„  d   QhR\         \        ,          R\        /# r   r   )r   s   "r   r   r   )   s   € ÷ ñ ¬´$­ð Ä4ñ r   c               ój  aa€ \        V \        4      '       d   T M\        \        V 4      4      pVP                  oVe   VP	                  4       '       g   TM	\        4       o\
        ;QJ d,    VV3R l\        SRR 4       4       F  '       g   K   R# 	  R# ! VV3R l\        SRR 4       4       4      # )zšTrue if *path* is under a support dir sitting directly inside a skill root
(``skills/scripts/foo`` stays discoverable: no ``SKILL.md`` above ``scripts``).Nc              3   ó¬   <"  € T FI  w  rV^ 8”  g   K  V\         9   ;'       d)    S\        SRV !  ,          R,          P                  4       x € KK  	  R# 5i)é    NúSKILL.md)ÚSKILL_SUPPORT_DIRSr   Úexists)r"   Úidxr#   Úbaser)   s   &  €€r   r$   Ú(is_skill_support_path.<locals>.<genexpr>0   sS   øé € ð á.‰IˆCØ�‰7ô 	YˆÔ"Ñ"×XÐX¨¬t°U¸4¸C°[Ñ/AÕ(AÀJÕ(N×'VÑ'VÓ'XÔXÛ.ùs   ƒA“A£1ATFéÿÿÿÿ)Ú
isinstancer   r(   r)   Úis_absoluter*   Ú	enumerate)r,   r   Úpath_objr6   r)   s   &$ @@r   r+   r+   )   s–   ù€ ô " $¬×-Ò-‰t´4¼¸D»	³?€HØ�N‰N€EØÒ#¨H×,@Ñ,@×,BÒ,B‰4ÌË€Dç‹3õ ä" 5¨¨" :Ô.ó�3Œ3ð Š3ð ˆ3õ ä" 5¨¨" :Ô.óó ð r   c                ó$   € V ^8„  d   QhR\         /# )r   Úcontent©r(   )r   s   "r   r   r   :   s   € ÷ "ñ "”sñ "r   c                ó8   € \         f	   ^ RIHp Vs \        V 4      # )z8Parse YAML with the shared safe loader, imported lazily.)Ú	safe_load)Ú_yaml_load_fnÚhermes_yamlrA   )r>   rA   s   & r   Ú	yaml_loadrD   :   s   € ô ÒÝ)Ø!ˆÜ˜Ó!Ð!r   c                ót   € V ^8„  d   QhR\         R\        \        \         \        3,          \         3,          /# )r   r>   r   )r(   ÚtupleÚdictr   )r   s   "r   r   r   C   s,   € ÷ ñ œsð ¤u¬T´#´s°(­^¼SÐ-@Õ'Añ r   c                óN  € V P                  R4      p V P                  R4      '       d   \        P                  ! RV R,          4      MRpV'       g   / V 3# V ^VP	                  4       ^,            pWP                  4       ^,           R p/ p \        V4      p\        V\        4      '       d   TpWC3#   \         di    TP                  4       P                  R4       F@  pRT9   g   K  TP                  R^4      w  rxTP                  4       YGP                  4       &   KB  	   YC3# i ; i)zâParse YAML frontmatter from markdown; returns (frontmatter_dict, body).
Malformed YAML falls back to key:value line splitting. A leading UTF-8 BOM
(Windows editors) is stripped first or it would defeat the ``---`` fence check.u   ï»¿z---z
\n---\s*\n:é   NNNÚ
Ú:)ÚremoveprefixÚ
startswithÚreÚsearchÚstartÚendrD   r9   rG   Ú	ExceptionÚstripÚsplit)	r>   Ú	end_matchÚyaml_contentÚbodyÚfrontmatterÚparsedÚlineÚkeyÚvalues	   &        r   Úparse_frontmatterr]   C   s  € ð ×"Ñ" 8Ó,€GØ9@×9KÑ9KÈE×9RÒ9R”—	’	˜-¨°­Ô5ÐX\€IßØ�7ˆ{ÐØ˜1˜yŸ™Ó0°1Õ4Ð5€LØ—=‘=“? QÕ&Ð(Ð)€DØ"$€Kð9Ü˜<Ó(ˆÜ�fœd×#Ò#Ø ˆKð ÐÐøô ô 9Ø ×&Ñ&Ó(×.Ñ.¨tÖ4ˆDØ�dŽ{Ø!ŸZ™Z¨¨QÓ/‘
�Ø+0¯;©;«=�ŸI™I›KÓ(ò 5ð ÐÐð9ús   Â#B1 Â11D$Ã'8D$Ä#D$c                ó0   € V ^8„  d   QhR\         R\        /# )r   Ú	platformsr   )r   r   )r   s   "r   r   r   Z   s   € ÷ ñ ¬3ð ´4ñ r   c                ó*  € V '       g   R# \        V \        4      '       g   V .p \        P                  pV  FY  p\	        V4      P                  4       P                  4       p\        P                  W34      pVP                  V4      '       g   KX   R# 	  R# )z?Return True when *platforms* is compatible with the current OS.TF)
r9   ÚlistÚsysÚplatformr(   ÚlowerrS   ÚPLATFORM_MAPÚgetrM   )r_   Úcurrentrc   Ú
normalizedÚmappeds   &    r   Úskill_matches_platform_listrj   Z   ss   € çÙÜ�i¤×&Ò&Ø�Kˆ	Ü�l‰l€GÛˆÜ˜“]×(Ñ(Ó*×0Ñ0Ó2ˆ
Ü×!Ñ! *Ó9ˆØ×Ñ˜f×%Ô%Úñ	 ñ
 r   c                óR   € V ^8„  d   QhR\         \        \        3,          R\        /# ©r   rX   r   ©rG   r(   r   r   )r   s   "r   r   r   i   s&   € ÷ Eñ E¬¬S´#¨X­ð E¼4ñ Er   c                ó6   € \        V P                  R4      4      # )zITrue when the skill's ``platforms:`` list (absent = all) matches this OS.r_   )rj   rf   ©rX   s   &r   Úskill_matches_platformrp   i   s   € ä& {§¡°{Ó'CÓDÐDr   c                ó$   € V ^8„  d   QhR\         /# ©r   r   ©r   )r   s   "r   r   r   u   s   € ÷ ñ œñ r   c                  ó  € \         P                  ! R 4      '       g   \         P                  ! R4      '       d    ^ RIHp  V ! 4       pV'       d   R#  ^ RIHp \        V! 4       4      #   \         d    Rp L0i ; i  \         d     R# i ; i)ÚHERMES_KANBAN_TASKÚHERMES_KANBAN_BOARD)Ú"is_dispatcher_owned_worker_contextT)Ú_profile_has_kanban_toolsetF)ÚosÚgetenvÚagent.delegation_contextrw   rR   Útools.kanban_toolsrx   r   )rw   Úownedrx   s      r   Ú_detect_kanbanr~   u   s{   € ô 
‡y‚yÐ%×&Ò&¬"¯)ª)Ð4I×*JÒ*Jð	ÝSÙ6Ó8ˆE÷ ÙðÝBÜÑ/Ó1Ó2Ð2øô ô 	ØŠEð	ûô ô Úðús#   ºA( ÁA; Á(A8Á7A8Á;B
Â	B
c                ó$   € V ^8„  d   QhR\         /# rr   rs   )r   s   "r   r   r   ˆ   s   € ÷ ñ œñ r   c                  óB   €  ^ RI Hp  V ! 4       #   \         d     R# i ; i)r1   ©Úis_containerF)Úhermes_constantsr‚   rR   r�   s    r   Ú_detect_dockerr„   ˆ   s$   € ðÝ1Ù‹~ÐøÜô Úðús   ‚ ��ÚkanbanÚdockerÚs6c                  óŽ   € \         P                  P                  R 4      ;'       g     \         P                  P                  R4      # )z/run/s6z/package/admin/s6-overlay)ry   r,   Úisdir© r   r   Ú<lambda>r‹   ’   s*   € ”"—'‘'—-‘- 	Ó*×XÐX¬b¯g©g¯m©mÐ<WÓ.XÐXr   c                ó0   € V ^8„  d   QhR\         R\        /# )r   Úenvr   )r(   r   )r   s   "r   r   r   –   s   € ÷ 
ñ 
œSð 
¤Tñ 
r   c                ó¢   € V R8w  d   V \         9   d   \         V ,          # \        P                  V 4      pV'       d   V! 4       MRpV\         V &   V# )a  True when the named runtime environment is active (unknown => True).
Cached per process EXCEPT ``kanban``: that verdict is context-dependent
(delegate children / in-process cron see the worker's vars), so a
process-wide cache would leak the first asker's answer to the others.r…   T)Ú_ENV_DETECT_CACHEÚ_ENV_DETECTORSrf   )r�   ÚdetectorÚresults   &  r   Ú_detect_environmentr“   –   sI   € ð
 ˆh„˜3Ô"3Ô3Ü  Õ%Ð%Ü×!Ñ! #Ó&€Hß#‰XŒZ¨€FØ#Ô�cÑØ€Mr   c                óR   € V ^8„  d   QhR\         \        \        3,          R\        /# rl   rm   )r   s   "r   r   r   £   s&   € ÷ @ñ @¬4´´S°­>ð @¼dñ @r   c                óH  € V P                  R4      pV'       g   R# \        V\        4      '       d   TMV. Uu. uF*  p\        V4      P	                  4       P                  4       NK,  	  pp\        ;QJ d    R V 4       F  '       g   K   R# 	  R# ! R V 4       4      # u upi )zvTrue when ANY declared ``environments:`` tag is active (absent = all;
unknown tags fail open). Offer-time filter only.ÚenvironmentsTc              3   óJ   "  € T F  q'       g   K  \        V4      x € K  	  R # 5ir    )r“   )r"   Útags   & r   r$   Ú,skill_matches_environment.<locals>.<genexpr>ª   s   é € Ð?±4¨C»3Ô'Ô" 3×'Ð'³4ùs   ‚	#�#F)rf   r9   ra   r(   rd   rS   r*   )rX   r–   r�   Útagss   &   r   Úskill_matches_environmentr›   £   s‡   € ð —?‘? >Ó2€LßÙÜAKÈLÔZ^×A_ÒA_±ÐfrÐesÐ1sÓuÑ1s¨ŒC�‹H�N‰NÓ×"Ñ"Ö$Ñ1s€DÐuß‹3Ñ?±4Ó?�3Œ3Ð?Š3Ð?ˆ3Ñ?±4Ó?Ó?Ð?ùò vs   ¹0Bc                óR   € V ^8„  d   QhR\         \        \        3,          R\        /# rl   rm   )r   s   "r   r   r   ­   s"   € ÷ ñ ¤D¬¬c¨¥Nð ´tñ r   c                óH  € V P                  R4      pV'       g   R# ^ RIHp ^ RIHp \        V\        4      '       d   TMV. F[  pVP                  \        V4      P                  4       4      pVe   VP                  f    R# V! V4      P                  '       d   KZ   R# 	  R# )at  True when every app named in ``requires_apps:`` has a registered declaration this host satisfies.

Names resolve through ``hermes_platform.declaration`` (registered by whoever owns the server,
e.g. the plugin loader); the check is the same ``availability()`` the MCP check_fn uses. An
unknown name hides the skill (fail closed). Offer-time filter, like ``environments:``.
Úrequires_appsT)Údeclaration)ÚavailabilityF)rf   Úhermes_platformrŸ   Ú%hermes_platform.resolver.availabilityr    r9   ra   Úlookupr(   rS   ÚappÚ	offerable)rX   ÚnamesrŸ   r    ÚnameÚdecls   &     r   Úskill_matches_appsr©   ­   s€   € ð �O‰O˜OÓ,€EßÙÝ+ÝBä# E¬4×0Ò0‘°u°gÒ=ˆØ×!Ñ!¤# d£)§/¡/Ó"3Ó4ˆØŠ<˜4Ÿ8™8Ò+ÚÙ˜DÓ!×+×+Ò+Úñ >ñ r   c                ó   € V ^8„  d   QhRR/# ©r   r   NrŠ   )r   s   "r   r   r   Í   s   € ÷ "ñ " ñ "r   c                 ó„   € \         ;_uu_ 4        \        P                  4        RRR4       R#   + '       g   i     R# ; i)u/   Test hook â€” drop the shared raw config cache.N)Ú_RAW_CONFIG_CACHE_LOCKÚ_RAW_CONFIG_CACHEÚclearrŠ   r   r   Ú_raw_config_cache_clearr°   Í   s#   € ç	Ö	Ü×ÑÔ!÷ 
 ×	×	Ò	ús   �.®?	c          
      ó†   € V ^8„  d   QhR\         R\        \        \        \        \        \        \        3,          ,          /# )r   Úconfig_pathr   )r   r   rF   r(   Úint)r   s   "r   r   r   Ó   s/   € ÷ ñ ¤4ð ¬H´U¼3ÄÄSÌ#ÌsÐ;RÕ5SÕ,Tñ r   c                óz   €  ^ RI Hp \        V 4      .V! V P                  4       4      O5#   \         d     R# i ; i)zT``(path, *file_signature)`` identity of config.yaml, or None when unreadable/absent.)Úfile_signatureN)Úutilsrµ   r(   ÚstatÚOSError)r²   rµ   s   & r   Ú_config_cache_keyr¹   Ó   s=   € ðÝ(Ü�KÓ ÐF¡>°+×2BÑ2BÓ2DÓ#EÑFÐFøÜô Úðús   ‚(+ «:¹:c                óF   € V ^8„  d   QhR\         \        \        3,          /# rr   ©rG   r(   r   )r   s   "r   r   r   Ü   s   € ÷ ñ œ$œs¤C˜x�.ñ r   c            	     óä  € ^ RI Hp  V ! 4       pVe   V# \        4       pVP                  4       '       g   / # \	        V4      p\
        ;_uu_ 4        Ve   \        P                  V4      MRpRRR4       Xe   V#  \        VP                  RR7      4      p\        T\        4      '       g   / # Tei   \
        ;_uu_ 4        T\        T&   \        \        4      \         8”  d.   \        P#                  \%        \'        \        4      4      4       KE   RRR4       T# T#   + '       g   i     L¸; i  \         d#   p\        P                  RY&4       / u Rp?# Rp?ii ; i  + '       g   i     T# ; i)zNRead config.yaml with an mtime+size keyed cache (no hermes_cli.config import).)Úworker_config_snapshotNú	utf-8-sig©Úencodingz"Could not read skill config %s: %s)Úagent.safe_worker_policyr½   r   r4   r¹   r­   r®   rf   rD   Ú	read_textrR   ÚloggerÚdebugr9   rG   ÚlenÚ_RAW_CONFIG_CACHE_MAXÚpopÚnextÚiter)r½   Úsnapshotr²   Ú	cache_keyÚcachedrY   Úes          r   Ú_load_raw_configrÎ   Ü   s1  € å?á%Ó'€HØÒØˆÜ!Ó#€KØ×Ñ×ÒØˆ	Ü! +Ó.€Iß	Ö	Ø5>Ò5JÔ"×&Ñ& yÔ1ÐPTˆ÷ 
 àÒØˆðÜ˜;×0Ñ0¸+Ð0ÓFÓGˆô �fœd×#Ò#Øˆ	ØÒß#Ö#Ø+1Ô˜iÑ(ÜÔ'Ó(Ô+@Ô@Ü!×%Ñ%¤d¬4Ô0AÓ+BÓ&CÖDð A÷ $ð €Mˆ6€M÷! 
 ×	ûô ô Ü�‰Ð9¸;ÔJØ�	ûðú÷ $Ö#ð €Mús7   ÁDÁ:D. Â?AEÄD+	Ä.EÄ9EÅEÅEÅE/	c                ó\   € V ^8„  d   QhR\         \        \        \        3,          ,          /# rr   )r   rG   r(   r   )r   s   "r   r   r   ú   s#   € ÷ @ñ @”Xœd¤3¬ 8�nÕ-ñ @r   c                 óh   € \        4       P                  R4      p \        V \        4      '       d   V # R# )zHThe ``skills:`` mapping from config.yaml, or None when absent/malformed.ÚskillsN)rÎ   rf   r9   rG   )Ú
skills_cfgs    r   Ú_skills_cfgrÓ   ú   s,   € ä!Ó#×'Ñ'¨Ó1€JÜ# J´×5Ò5ˆ:Ð?¸4Ð?r   c                ó0   € V ^8„  d   QhR\         R\        /# )r   r[   r   )r(   r   )r   s   "r   r   r      s   € ÷ Cñ Cœð C¤ñ Cr   c                óD   € \        4       pVe   VP                  V 4      # R# )zP``skills.<key>`` from config.yaml, or None when the section is absent/malformed.N)rÓ   rf   )r[   rÒ   s   & r   Ú_skills_cfg_getrÖ      s"   € ä“€JØ",Ò"8ˆ:�>‰>˜#ÓÐB¸dÐBr   c                ó0   € V ^8„  d   QhR\         R\        /# )r   Úentryr   )r(   r   )r   s   "r   r   r     s   € ÷ ?ñ ?œð ?¤ñ ?r   c                óŒ   € \        \        P                  P                  \        P                  P	                  V 4      4      4      # )z3Expand ``~`` and ``${VAR}`` in a config path entry.)r   ry   r,   Ú
expanduserÚ
expandvars)rØ   s   &r   Ú_expand_pathrÜ     s+   € ä”—‘×"Ñ"¤2§7¡7×#5Ñ#5°eÓ#<Ó=Ó>Ð>r   c                ó0   € V ^8„  d   QhR\         R\         /# )r   Úpr   ©r   )r   s   "r   r   r     s   € ÷ ;ñ ;”dð ;œtñ ;r   c                óZ   € ^ RI Hp V P                  4       '       d   V # V! 4       V ,          # )zJAnchor a relative config path at HERMES_HOME; absolute paths pass through.©Úget_hermes_home)rƒ   râ   r:   )rÞ   râ   s   & r   Ú_home_relativerã     s"   € å0Ø—‘—’ˆ1Ð:¡_Ó%6¸Õ%:Ð:r   zhermes-agentc                óT   € V ^8„  d   QhR\         R,          R\        \         ,          /# )r   rc   Nr   )r(   Úset)r   s   "r   r   r     s"   € ÷ 'ñ '¤s¨T¥zð '¼SÄ½Xñ 'r   c                ó€  € \        4       pVf   \        4       # ^ RIHp T ;'       g'    \        P
                  ! R4      ;'       g	    V! R4      p\        VP                  R4      4      pV'       d+   VP                  R4      ;'       g    / P                  V4      MRpVe   V\        V4      ,          pV\        ,
          # )u�   Disabled skill names from config.yaml: global list âˆª platform list
(*platform* defaults to ``HERMES_PLATFORM`` / ``HERMES_SESSION_PLATFORM``).N)Úget_session_envÚHERMES_PLATFORMÚHERMES_SESSION_PLATFORMÚdisabledÚplatform_disabled)	rÓ   rå   Úgateway.session_contextrç   ry   rz   Ú_normalize_string_setrf   ÚESSENTIAL_SKILLS)rc   rÒ   rç   Úresolved_platformrê   rë   s   &     r   Úget_disabled_skill_namesrð     s    € ô “€JØÒÜ‹uˆÝ7Ø ×nÐn¤B§I¢IÐ.?Ó$@×nÐnÁOÐTmÓDnÐÜ$ Z§^¡^°JÓ%?Ó@€Hß^o˜Ÿ™Ð(;Ó<×BÐBÀ×GÑGÐHYÔZÐuyÐØÒ$ØÔ)Ð*;Ó<Õ<ˆØÔ&Õ&Ð&r   c                ó:   € V ^8„  d   QhR\         \        ,          /# rr   ©ra   r(   )r   s   "r   r   r   %  s   € ÷ eñ e¤t¬C¥yñ er   c                óö  € \        V \        4      '       d   V P                  4       P                  R4      '       dW    \        P
                  ! V P                  4       4      p\        V\        4      '       d   V Uu. uF  p\        V4      NK  	  up# V .# \        V \        \        \        \        34      '       d   V  Uu. uF  p\        V4      NK  	  up# . #   \        \        3 d    Rp LŒi ; iu upi u upi )a
  Normalize a config value that may hold a JSON-array string into a list.
``hermes config set`` stores lists as quoted JSON/Python-literal strings;
treating one as a single name would silently filter nothing. A scalar
string still means one name.

See #13026, #86661.
Ú[N)r9   r(   rS   rM   ÚastÚliteral_evalÚ
ValueErrorÚSyntaxErrorra   rF   rå   Ú	frozenset)r\   rY   Úitems   &  r   Úparse_config_string_listrû   %  sÉ   € ô �%œ×ÒØ�;‰;‹=×#Ñ# C×(Ò(ðÜ×)Ò)¨%¯+©+«-Ó8�ô ˜&¤$×'Ò'Ù.4Ó5©f dœ˜Dž	©fÑ5Ð5ØˆwˆÜ,6°u¼tÄUÌCÔQZÐ>[×,\Ò,\¡%Ó(¡%˜$ŒC�ŽI¡%Ñ(ÐdÐbdÐdøô ¤Ð,ô Ø’ðüò 6ùâ(s   ½$C Á;C1Â?C6ÃC.Ã-C.c                ó:   € V ^8„  d   QhR\         \        ,          /# rr   )rå   r(   )r   s   "r   r   r   9  s   € ÷ Wñ W¤S¬¥Xñ Wr   c                 óŒ   € \        V 4       Uu0 uF*  qP                  4       '       g   K  VP                  4       kK,  	  up# u upi r    )rû   rS   )Úvaluesr§   s   & r   rí   rí   9  s/   € Ü%=¸fÔ%EÓVÑ%E˜TÏÉÏŒLˆD�J‰JŽLÑ%EÑVÐVùÒVs
   ŽAªAc                ó   € V ^8„  d   QhRR/# r«   rŠ   )r   s   "r   r   r   B  s   € ÷ ñ  Dñ r   c                 óB   € \         P                  4        \        4        R# )u(   Test hook â€” drop the in-process cache.N)Ú_EXTERNAL_DIRS_CACHEr¯   r°   rŠ   r   r   Ú_external_dirs_cache_clearr  B  s   € ä×ÑÔ ÜÖr   c                ó:   € V ^8„  d   QhR\         \        ,          /# rr   rò   )r   s   "r   r   r   H  s   € ÷ Cñ CœT¤#�Yñ Cr   c                ó²   € \        V \        4      '       d   V .p \        V \        4      '       g   . # R V  4        Uu. uF  q'       g   K  VNK  	  up# u upi )zFA scalar-or-list config entry as a list of stripped non-empty strings.c              3   óT   "  € T F  p\        V4      P                  4       x € K   	  R # 5ir    )r(   rS   )r"   rØ   s   & r   r$   Ú#_config_str_list.<locals>.<genexpr>N  s    é € Ð<¹¨uœ˜E›
×(Ñ(×*Ð*»ùs   ‚&()r9   r(   ra   )ÚrawrÍ   s   & r   Ú_config_str_listr  H  sK   € ä�#”s×ÒØˆeˆÜ�cœ4× Ò Øˆ	Ù<¹Ô<ÓBÑ<�!Ã�AˆAÑ<ÑBÐBùÒBs   ½	AÁAc                ó:   € V ^8„  d   QhR\         \        ,          /# rr   ©ra   r   )r   s   "r   r   r   Q  s   € ÷ ñ ¤$¤t¥*ñ r   c                 óX  € \        4       p V P                  4       '       g   . # \        V 4      pTpVe   \        P	                  V4      MRpVe   \        V4      # \        4       pVf   . # \        4       P                  4       p. p\        VP	                  R4      4       Fr  p\        \        V4      4      P                  4       pW…8X  g   W†9   d   K3  VP                  4       '       d   VP                  V4       K\  \        P                  RV4       Kt  	  Ve   \        V4      \        V&   V# )z§Validated, deduplicated ``skills.external_dirs`` (existing dirs only). Entries
are ``~``/``${VAR}`` expanded, relative to HERMES_HOME; the local skills dir is skipped.NÚexternal_dirsz0External skills dir does not exist, skipping: %s)r   r4   r¹   r  rf   ra   rÓ   r   Úresolver  rã   rÜ   Úis_dirÚappendrÃ   rÄ   )	r²   Úfull_keyrË   rÌ   rÒ   Úlocal_skillsr’   rØ   rÞ   s	            r   Úget_external_skills_dirsr  Q  sÿ   € ô "Ó#€KØ×Ñ×ÒØˆ	Ü  Ó-€HØ€IØ4=Ò4IÔ!×%Ñ% iÔ0Èt€FØÒÜ�F‹|ÐÜ“€JØÒØˆ	Ü!Ó#×+Ñ+Ó-€LØ€FÜ! *§.¡.°Ó"AÖBˆÜœ<¨Ó.Ó/×7Ñ7Ó9ˆØÔ ¤ÙØ�8‰8�:Š:Ø�M‰M˜!Öä�L‰LÐKÈQÖOñ Cð ÒÜ*.¨v«,Ô˜YÑ'Ø€Mr   c                ó:   € V ^8„  d   QhR\         \        ,          /# rr   ©r   r   )r   s   "r   r   r   n  s   € ÷ ñ œh¤t�nñ r   c                 ó˜  € \        R4      p V '       d@   \        V \        \        P                  34      '       d   \        V 4      P                  4       MRpV'       g   R# \        \        V4      4      p VP                  4       p V\        4       P                  4       8X  d   R#  V#   \         d    Tp L2i ; i  \         d     T# i ; i)zšConfigured ``skills.create_dir`` (need not exist yet), or None when unset;
relative to HERMES_HOME; a value equal to the local skills dir counts as unset.Ú
create_dirÚ N)rÖ   r9   r(   ry   ÚPathLikerS   rã   rÜ   r  r¸   r   )r  rØ   rÞ   Úresolveds       r   Úget_skill_create_dirr  n  s³   € ô ˜,Ó
'€Cß #¬
°3¼¼b¿k¹kÐ8J×(KÒ(KŒC�‹H�N‰NÔÐQS€EßÙÜ”| EÓ*Ó+€AðØ—9‘9“;ˆðØ”~Ó'×/Ñ/Ó1Ô1Ùð 2ð €Oøô ô ØŠðûô
 ô ØØ€Oðús$   Á4B' ÂB: Â'B7Â6B7Â:C	ÃC	c                ó$   € V ^8„  d   QhR\         /# rr   r?   )r   s   "r   r   r   ‚  s   € ÷ 	'ñ 	'¤#ñ 	'r   c                 ó@  € ^ RI Hp  \        4       pVf   V ! 4        R2# VP                  \        P
                  ! 4       4      '       dA   RVP                  \        P
                  ! 4       4      P                  4       ,           R,           # VP                  4       R,           # )z’User-facing path where new skills are created (``~/`` shorthand when
possible); tool schema descriptions and prompts follow ``skills.create_dir``.)Údisplay_hermes_homez/skills/ú~/Ú/)rƒ   r  r  Úis_relative_tor   ÚhomeÚrelative_toÚas_posix)r  r  s     r   Údisplay_skill_create_dirr$  ‚  s{   € õ 5Ü%Ó'€JØÒÙ%Ó'Ð(¨Ð1Ð1Ø× Ñ ¤§¢£×-Ò-Ø�j×,Ñ,¬T¯YªY«[Ó9×BÑBÓDÕDÀsÕJÐJØ×ÑÓ  3Õ&Ð&r   zAmbiguous skill name Úinclude_projectTc          	      óŠ   € V ^8„  d   QhR\         \        ,          R\        R\        \        \
        \        3,          ,          /# )r   Úlocalr%  r   )r   r   r   ra   rF   r³   )r   s   "r   r   r   ™  s=   € ÷ Hñ H¤(¬4¥.ð HÌTð HÔ]aÔbgÔhkÔmqÐhqÕbrÕ]sñ Hr   c               ó  € V'       d!   \        4        Uu. uF  p\        V3NK  	  upM. pTP                  \        V e   \	        V 4      M	\        4       34       \        4       pVe.   VP                  4       '       d   VP                  \        V34       T\        4        Uu. uF  p\        V3NK  	  up,          p\        4       pV UUu. uF)  w  rbW%9   d   K  VP                  V4      '       d   K&  Wb3NK+  	  upp# u upi u upi u uppi )u  ``(tier, dir)`` for every skill root in precedence order â€” the ONE ordering the skills list,
prompt index, slash commands, skill_view, preload and cron share. *local* overrides the profile
skills dir (skills_tool passes its live root); that entry is kept even when missing.)Úget_project_skills_dirsÚTIER_PROJECTr  Ú
TIER_LOCALr   r   r  r  ÚTIER_CREATE_DIRr  ÚTIER_EXTERNALrå   Úadd)r'  r%  ÚdÚrootsr  ÚseenÚts   &$     r   Úget_skill_search_rootsr3  ™  sÛ   € ÷ GVÔ(?Ô(AÓBÑ(A 1Œl˜AÓÑ(AÒBÐ[]€EØ	‡L�L”*¨UÒ->œd 5œkÄNÓDTÐUÔVÜ%Ó'€JØÒ *×"3Ñ"3×"5Ò"5Ø�‰”o zÐ2Ô3Ø	Ô*BÔ*DÓEÑ*D QŒ}˜aÓ Ñ*DÑEÕE€EÜ“e€DÙ$ÔG™u‘t�q¨Q©YŒF¸$¿(¹(À1¿+ŒFˆQ‹F™uÒGÐGùò Cùò
 FùãGs   •C=Â!DÃ

DÃDÃ2Dc                ó:   € V ^8„  d   QhR\         \        ,          /# rr   r
  )r   s   "r   r   r   §  s   € ÷ Mñ MœT¤$�Zñ Mr   c                 óN   € \        RR7       U Uu. uF  w  rVNK	  	  upp # u upp i )z¦Skill dirs: local ``~/.hermes/skills/`` first, then create_dir, then external.
Trusted project dirs are NOT included (higher precedence; see get_project_skills_dirs).F)r%  )r3  )Ú_tierr/  s     r   Úget_all_skills_dirsr7  §  s%   € ô 5ÀUÕKÔLÑK‘(�%‹AÑKÒLÐLùÓLs   �!c                ó$   € V ^8„  d   QhR\         /# rr   rs   )r   s   "r   r   r   ­  s   € ÷ 	ñ 	¤dñ 	r   c           
     óh  €  \        V  Uu0 uF"  p\        P                  P                  V4      kK$  	  up4      ^8X  d   R# \        V  Uu0 uF>  p\        P
                  ! \        V4      P                  4       4      P                  4       kK@  	  up4      ^8H  # u upi u upi   \         d     R# i ; i)a   True only when every path is the SAME skill: one resolved file (symlink view) or byte-identical
content (copy). Anything else is two different skills sharing a name, and picking one by depth
would let ``<root>/evil`` (``name: github``) shadow the real one.TF)
rÅ   ry   r,   ÚrealpathÚhashlibÚsha256r   Ú
read_bytesÚ	hexdigestr¸   )Ú	skill_mdsrÞ   s   & r   Úprovably_same_skillr@  ­  sŽ   € ðÜ©YÓ7©Y¨”—‘× Ñ  Ö#©YÑ7Ó8¸AÔ=ÙÜÉiÓXÉiÈ”G—N’N¤4¨£7×#5Ñ#5Ó#7Ó8×BÑBÖDÉiÑXÓYÐ]^Ñ^Ð^ùò 8ùâXøÜô Úðús4   ‚	B" ‹(B³B" Á	B" Á
ABÂ	B" Â
B" Â"B1Â0B1c                óF   € V ^8„  d   QhR\         \        \        3,          /# rr   )rF   r   r³   )r   s   "r   r   r   ¹  s   € ÷ Pñ P¬E´$¼°)Õ,<ñ Pr   c                ó~   € \        V 4      p V P                  R8g  \        V P                  V4      P                  4      3# )z®Same-root order of identical copies: a real SKILL.md beats a legacy flat ``<name>.md``,
then the shallower path wins (shared by skill_view and :func:`resolve_skill_catalog`).r2   )r   r§   rÅ   r"  r)   )Úskill_mdr   s   &&r   Úskill_candidate_rankrD  ¹  s7   € ô �H‹~€HØ�M‰M˜ZÑ'¬¨X×-AÑ-AÀ$Ó-G×-MÑ-MÓ)NÐOÐOr   c                ór   € V ^8„  d   QhR\         \        \        ,          \        \        ,          3,          /# rr   )rF   r   r³   ra   )r   s   "r   r   r   À  s(   € ÷ Iñ I¬¬h´s­m¼TÄ#½YÐ.FÕ(Gñ Ir   c                óV  a € \        R S  4       4      p\        S 4       UUu. uF  w  r#V^ ,          V8X  g   K  VNK  	  ppp\        V4      ^8”  d«   \        V Uu0 uF  pS V,          ^,          kK  	  up4      ^8X  d}   \        V Uu. uF  pS V,          ^,          NK  	  up4      '       dN   \	        VV 3R lR7      pS V^ ,          ,          ^,          S V^,          ,          ^,          8w  d   V^ ,          V3# \        V4      ^8X  d   V^ ,          V3# RV3# u uppi u upi u upi )a  Winner index among one identifier's ``(tier, root, rank, skill_md)`` candidates, plus the
winning tier's contender indexes. The lowest tier wins; inside it a lone candidate wins, identical
copies under one root resolve to the strictly best ``rank``, anything else is ambiguous (None).c              3   ó2   "  € T F  q^ ,          x € K  	  R# 5i)r1   NrŠ   )r"   Úcs   & r   r$   Ú'pick_skill_candidate.<locals>.<genexpr>Ä  s   é € Ð'™J�q��dŠd›Jùr&   c                 ó$   <€ SV ,          ^,          # )r   rŠ   )ÚiÚ
candidatess   &€r   r‹   Ú&pick_skill_candidate.<locals>.<lambda>È  s   ø€ °*¸Qµ-ÀÖ2Br   )r[   N)Úminr;   rÅ   r@  Úsorted)rL  ÚtoprK  rH  Ú
contendersÚrankeds   f     r   Úpick_skill_candidaterS  À  s  ø€ ô Ñ'™JÓ'Ó
'€CÜ )¨*Ô 5ÔEÑ 5™˜¸¸1½À¹—!�!Ñ 5€JÑEÜ
ˆ:ƒ˜Ôœs¹jÓ#I¹j¸ J¨q¥M°!×$4Ð$4¹jÑ#IÓJÈaÔOÔTgÙ'1Ó2¡z !ˆZ˜�]˜1×Ð¡zÑ2÷U4ò U4ä˜
Ô(BÔCˆØ�f˜Q•iÕ  Õ# z°&¸µ)Õ'<¸QÕ'?Ô?Ø˜!•9˜jÐ(Ð(Ü  ›_°Ô1ˆJ�q�M¸jÐHÐH°t¸jÐHÐHùó FùÚ#IùÚ2s   ¢D¹DÁD!Â	D&c                ót   € V ^8„  d   QhR\         \        \        3,          R\        \        ,          R\        /# )r   rØ   rê   r   )rG   r(   r   rå   r   )r   s   "r   r   r   Î  s2   € ÷ Zñ ZœT¤#¤s (�^ð Z´s¼3µxð ZÄDñ Zr   c                ó€   € VP                  \        V R,          4      V P                  R4      0R0,
          4      '       * # )u  ``skills.disabled`` matches a resolved catalog entry by its declared name OR its ``load_name`` â€”
the exact path a same-tier duplicate's list/config/web row shows (``a/one``) and saves. A unique
copy elsewhere that merely sits at the same relative path is not matched.r§   Ú	load_nameN)Ú
isdisjointr(   rf   )rØ   rê   s   &&r   Úis_disabled_entryrX  Î  s8   € ð ×"Ñ"¤C¨¨f­Ó$6¸¿	¹	À+Ó8NÐ#OÐSWÐRXÕ#XÓYÔYÐYr   c                ó    € V ^8„  d   QhR\         \        \        \        3,          ,          R\         \        \        \        3,          ,          /# )r   Úentriesr   ©ra   rG   r(   r   )r   s   "r   r   r   Õ  s4   € ÷ #ñ #¤4¬¬S´#¨X­Õ#7ð #¼DÄÄcÌ3ÀhÅÕ<Pñ #r   c                ó   aa€ V  Uu. uF  p\        V4      NK  	  upo/ p\        S4       F™  w  po\        SR,          4      P                  pVP	                  SR,          4      P                  4       SR&   \        SR,          4      VP                  SR,          0 F$  pVP                  V. 4      P                  V4       K&  	  K›  	  / pVP                  4        F�  w  rW\        V Uu. uFb  pSV,          R,          \        SV,          R,          4      \        SV,          R,          SV,          R,          4      SV,          R,          3NKd  	  up4      w  ršV	f   RMWy,          We&   K‘  	  \        S4       EF‚  w  po\        SR,          4      SR,          rËW+,           Uu. uF#  pSV,          R,          SR,          8  g   K!  VNK%  	  ppV'       g   Wk,          RV39  dÑ   SP                  RRR7       \        SR,          4      .\        V3R	 lV 4       4      O5pV'       dŠ   V\        9  d|   \        P!                  V4       \"        ;QJ d     VV3R
 lV 4       F  '       g   K   RM	  RM! VV3R
 lV 4       4      '       g"   \$        P'                  RVSR,          4       EK4  EK7  EK:  EK=  Wk,          V8X  d   SP                  RVR7       EK`  SP                  RWl,          V8X  d   TMRR7       EK…  	  S# u upi u upi u upi )aß  Copies of scanned skills (each with ``name``, ``tier``, ``root`` and ``path`` = its SKILL.md)
annotated with what skill_view() resolves, using its aliases (declared name, directory name, path
relative to the root) and :func:`pick_skill_candidate`. Adds ``relative_path`` and ``status``:
``unique`` (``load_name`` = name), ``ambiguous`` (``load_name`` = the exact relative path, or None
when even that is shared) or ``shadowed`` (a higher tier owns the name: hidden, warned once).r,   r   Úrelative_pathr§   ÚtierNÚshadowed)ÚstatusrV  c              3   óV   <"  € T F  p\        SV,          R ,          4      x € K   	  R# 5i©r,   Nr?   )r"   ÚjÚouts   & €r   r$   Ú(resolve_skill_catalog.<locals>.<genexpr>î  s!   øé € Ð*OÉÀ1¬3¨s°1­v°f­~×+>Ð+>Ëùs   ƒ&)c              3   óh   <"  € T F'  p\        SR ,          SV,          R ,          .4      x € K)  	  R# 5irb  )r@  )r"   rc  rÍ   rd  s   & €€r   r$   re  ñ  s.   øé € Ð\ÑU[ÐPQÔ.°°&µ	¸3¸q½6À&½>Ð/J×KÐKÓU[ùs   ƒ/2TFzgSkill '%s' at %s is shadowed by a higher-precedence copy (project > local > create_dir > external_dirs)ÚuniqueÚ	ambiguous)rG   r;   r   Úparentr"  r#  r(   r§   Ú
setdefaultr  ÚitemsrS  rD  ÚupdaterO  Ú_SHADOW_CHECKEDr.  r*   rÃ   Úwarning)rZ  rÍ   ÚownersrK  Ú	skill_dirÚaliasÚwinnerÚidxsrc  ÚwonÚ_r§   ÚrelÚhigherr[   rd  s   &`             @r   Úresolve_skill_catalogrx  Õ  s‰  ù€ ñ $Ó
$™G�qŒ4�Ž7™GÑ
$€CØ#%€FÜ˜#–‰ˆˆ1Ü˜˜6�“O×*Ñ*ˆ	Ø&×2Ñ2°1°Vµ9Ó=×FÑFÓHˆˆ/ÑÜ˜!˜F�)“n i§n¡n°a¸Õ6HÓIˆEØ×Ñ˜e RÓ(×/Ñ/°Ö2ó Jñ ð
 (*€FØ—|‘|–~‰ˆÜ%áó'á�ð ��V�F�^œS  Q¥¨¥Ó0Ô2FÀsÈ1ÅvÈfÅ~ÐWZÐ[\ÕW]Ð^dÕWeÓ2fÐhkÐlmÕhnÐouÕhvÓwÙñ'ó ‰ˆð !$¢™°µˆ‹ñ	 &ô
 ˜#—‰ˆˆ1Ü˜˜&�	“N A oÕ$6ˆcØ#ž\ÓH™\˜¨S°­V°F­^¸aÀ½iÑ-G—!�!™\ˆÐHß�V•\¨$°¨Ô2Ø�H‰H˜J°$ˆHÔ7ä�q˜•y“>ÐP¤FÔ*OÉÓ*OÓ$OÑPˆCß˜#¤_Ô4Ü×#Ñ# CÔ(ß“sÕ\ÑU[Ó\—s—s’sÕ\ÑU[Ó\×\Ò\Ü—N‘Nð $TØUYÐ[\Ð]cÕ[d÷fò ]ò 5Švð
 �\˜QÔØ�H‰H˜H°ˆH×5à�H‰H˜K¸&½+ÈÔ:J±3ÐPTˆH×Uñ ð  €Jùò; %ùò'ùò Is   ‡LÃ(A(L
Æ#LÇLz.hermesrÑ   z.agentsc                ó\   € V ^8„  d   QhR\         \        ,          R\         \        ,          /# )r   rP   r   r  )r   s   "r   r   r     s"   € ÷ ñ œX¤d�^ð ´xÄµ~ñ r   c                ó®  €  V f   ^ RI Hp V! 4       p \        V 4      P                  4       p\        P
                  ! 4       P                  4       p \        \        4       FN  pTR,          P                  4       '       d   Y#8X  d   Ru # Tu # TP                  T8X  d    R# TP                  pKP  	  R#   \         d     R# i ; i  \         d     R# i ; i)uÅ  Nearest ancestor containing ``.git`` (dir or worktree file), or None.
Without *start*, the surface's effective working directory wins over the process cwd â€” the same
ladder every other cwd consumer reads (``resolve_agent_cwd``: session-bound cwd, then the scope's
``TERMINAL_CWD``, then the process cwd). The session cwd comes first because a multi-session host
(TUI/desktop gateway) pins each session's workspace there while its terminal scope resolves a
placeholder ``terminal.cwd`` to ``$HOME``; reading only the scope made every project skill invisible
on those surfaces (#114359). ``TERMINAL_CWD`` is the per-surface workdir the terminal tool and cron
jobs use (a cron job sets it from its per-job ``workdir`` without chdir'ing the scheduler process),
which lets non-interactive surfaces inherit a prior interactive trust decision by project identity â€”
and a surface with no workdir in a trusted repo simply resolves no project and loads nothing (#48975).
N)Úresolve_agent_cwdú.git)
Úagent.runtime_cwdr{  r   r  r¸   r!  ÚrangeÚ_PROJECT_ROOT_MAX_DEPTHr4   ri  )rP   r{  Úcurr!  ru  s   &    r   Úfind_project_rootr�    s¿   € ðØŠ=Ý;Ù%Ó'ˆEÜ�5‹k×!Ñ!Ó#ˆô �9Š9‹;×ÑÓ €Dð
ÜÔ.Ö/ˆAØ�f•×$Ñ$×&Ò&ð  #œ{�tÒ3°Ò3Ø�z‰z˜SÔ ÚØ—*‘*ŠCñ 0ñ øô ô Úðûô ô ØÙðús5   ‚*B3 Á8C Â	C ÂC Â!C Â3CÃCÃCÃCc                ó:   € V ^8„  d   QhR\         \        ,          /# rr   )rå   r   )r   s   "r   r   r   (  s   € ÷ ñ ¬3¬t­9ñ r   c                 óÆ   € \        4       p \        \        R4      4       F,  p V P                  \	        V4      P                  4       4       K.  	  V #   \         d     K@  i ; i)zKResolved set of trusted project roots from ``skills.trusted_project_dirs``.Útrusted_project_dirs)rå   r  rÖ   r.  rÜ   r  r¸   )r’   rØ   s     r   Ú!_project_trusted_dirs_from_configr…  (  sY   € ä›€FÜ!¤/Ð2HÓ"IÖJˆð	Ø�J‰J”| EÓ*×2Ñ2Ó4Ö5ñ Kð
 €Møô ô 	Úð	ús   £(AÁA ÁA c                ó0   € V ^8„  d   QhR\         R\        /# r   )r   r   )r   s   "r   r   r   3  s   € ÷ ñ ¤$ð ¬4ñ r   c                óp   €  \        V 4      P                  4       \        4       9   #   \         d     R# i ; i)z>True when *root* is listed in ``skills.trusted_project_dirs``.F)r   r  r…  r¸   r'   s   &r   Úis_project_root_trustedrˆ  3  s5   € ðÜ�D‹z×!Ñ!Ó#Ô'HÓ'JÑJÐJøÜô Úðús   ‚#& ¦5´5c                óF   € V ^8„  d   QhR\         R\        \         ,          /# r   )r   ra   )r   s   "r   r   r   ;  s   € ÷ ñ ¬ð ´$´tµ*ñ r   c                ó,  a € \        4       P                  4       p. pV 3R l\         4        FR  p VP                  4       '       d9   VP                  4       V8w  d"   VP	                  VP                  4       4       KP  KR  KT  	  V#   \
         d     Kf  i ; i)z}Existing skill dirs under *root*, excluding the profile's own skills dir
(HERMES_HOME itself may live inside a git checkout).c              3   ó6   <"  € T F  pSV,          x € K  	  R # 5ir    rŠ   )r"   Úsubr   s   & €r   r$   Ú1_candidate_project_skills_dirs.<locals>.<genexpr>@  s   øé € Ð>Ñ'= �˜—’Ó'=ùs   ƒ)r   r  ÚPROJECT_SKILLS_SUBDIRSr  r  r¸   )r   r  ÚdirsÚcands   f   r   Ú_candidate_project_skills_dirsr‘  ;  s}   ø€ ô "Ó#×+Ñ+Ó-€LØ€DÜ>Õ'=Ö>ˆð	Ø�{‰{�}Š} §¡£°<Ô!?Ø—‘˜DŸL™L›NÖ+ñ "@‰}ñ ?ð €Køô ô 	Úð	ús   °A
BÂBÂBc                óF   € V ^8„  d   QhR\         R\        \        ,          /# )r   Útrustedr   )r   r   r   )r   s   "r   r   r   I  s"   € ÷ [ñ [¤4ð [¬H´T­Nñ [r   c                óh   € \        R4      RJ d   R# \        4       pVe   \        V4      V 8X  d   V# R# )zIcwd's project root when discovery is on and its trust state == *trusted*.Úproject_discoveryFN)rÖ   r�  rˆ  )r“  r   s   & r   Ú_current_project_rootr–  I  s9   € äÐ*Ó+¨uÓ4ÙÜÓ€DØÒ#Ô(?ÀÓ(EÈÔ(Pˆ4ÐZÐVZÐZr   c                ó:   € V ^8„  d   QhR\         \        ,          /# rr   r
  )r   s   "r   r   r   Q  s   € ÷ Lñ L¤¤d¥ñ Lr   c                 ó<   € \        RR7      p V e   \        V 4      # . # )zDTrusted project-local skill dirs for the current cwd (may be empty).T©r“  )r–  r‘  r'   s    r   r)  r)  Q  s"   € ä ¨Ô.€DØ37Ò3CÔ)¨$Ó/ÐKÈÐKr   c                ó\   € V ^8„  d   QhR\         \        \        \        3,          ,          /# rr   )r   rF   r   r³   )r   s   "r   r   r   W  s!   € ÷ 	,ñ 	,¬8´E¼$Ä¸)Õ4DÕ+Eñ 	,r   c            	     óÔ   € \        RR7      p ^ pV e   \        V 4      MR F'  p V\        R \        VR4       4       4      ,          pK)  	  V'       d   W3# R#   \         d     KF  i ; i)zP(root, skill_count) when cwd's project has skills but is NOT trusted, else None.Fr™  Nc              3   ó&   "  € T F  p^x € K	  	  R# 5i)é   NrŠ   )r"   ru  s   & r   r$   Ú4get_untrusted_project_skills_root.<locals>.<genexpr>]  s   é € ÐJÑ$I˜q�Ó$Iùs   ‚r2   rŠ   )r–  r‘  ÚsumÚiter_skill_index_filesr¸   )r   Úcountr/  s      r   Ú!get_untrusted_project_skills_rootr¢  W  ss   € ä ¨Ô/€DØ€EØ59Ò5EÔ+¨DÔ1È2ÒMˆð	Ø”SÑJÔ$:¸1¸jÔ$IÓJÓJÕJŠEñ N÷
 "ˆDˆ=Ð+ tÐ+øô ô 	Úð	ús   ¤#AÁA'Á&A'zproject-localc                ó$   € V ^8„  d   QhR\         /# rr   rs   )r   s   "r   r   r   w  s   € ÷ ñ ¬dñ r   c                ó  € \        V 4      P                  p \        VP                  4       4      pV\
        9   d   \
        V,          #  ^ RIHp ^ RIH	p V! 4       R,          R,          pV! V\        VR7      w  rgVP                  R8H  pV'       d!   \        P                  RWP                  4       T\
        T&   T#   \         d    \        T4      p L¥i ; i  \         d    \        P                  RTR	R
7       R	p LNi ; i)uÅ   True when a project skill's scan verdict is ``dangerous``. Fail-closed: a
scanner crash or missing scanner quarantines the skill. Scans
unconditionally â€” non-project callers should not call this.)Úscan_skill_cachedrá   ÚcacheÚproject_skill_scans)ÚsourceÚ	cache_dirÚ	dangerousu8   Project skill quarantined (verdict=dangerous): %s â€” %su<   Project skill scan failed â€” quarantining (fail closed): %sT)Úexc_info)r   ri  r(   r  r¸   Ú_PROJECT_QUARANTINE_CACHEÚtools.skills_guardr¥  rƒ   râ   Ú_PROJECT_SCAN_SOURCEÚverdictrÃ   rn  ÚsummaryrR   )	rC  rp  r[   r¥  râ   r©  r’   Ú_provÚquarantineds	   &        r   Úis_quarantined_project_skillr³  w  sï   € ô �X“×%Ñ%€IðÜ�)×#Ñ#Ó%Ó&ˆð Ô'Ô'Ü(¨Õ-Ð-ð
Ý8Ý4Ù#Ó%¨Õ/Ð2GÕGˆ	Ù)¨)Ô<PÐ\eÔf‰ˆØ—n‘n¨Ñ3ˆßÜ�N‰NÐUÐW`×bpÑbpÔqð &1Ô˜cÑ"ØÐøô! ô Ü�)‹nŠðûô ô Ü�‰ÐUÐW`ÐkoˆÔpØŠðús$   —B= Á	A)C Â=CÃCÃ%DÄ Dc                ó$   € V ^8„  d   QhR\         /# )r   Úproject_dirrß   )r   s   "r   r   r   ‘  s   € ÷ sñ s¬$ñ sr   c              #  óH   "  € R \        V R4       4        Rj  x€L
  R#  L5i)uÄ   Yield non-quarantined SKILL.md files under a trusted project dir â€” the
single iteration chokepoint for the project tier, so the quarantine cannot
be bypassed by a call site forgetting the check.c              3   óL   "  € T F  p\        V4      '       d   K  Vx € K  	  R # 5ir    )r³  )r"   rÞ   s   & r   r$   Ú+iter_project_skill_files.<locals>.<genexpr>•  s   é € ÐrÑJ�aÔRnÐop×Rq—’ÓJùs   ‚$š
$r2   N)r   )rµ  s   &r   Úiter_project_skill_filesr¹  ‘  s   é € ñ sÔ1°+¸zÔJÓr×rÔrùs   ‚"™ š"c                ó0   € V ^8„  d   QhR\         R\         /# )r   Ú
identifierr   r?   )r   s   "r   r   r   ˜  s   € ÷ $ñ $¬Cð $´Cñ $r   c                óä  € T ;'       g    RP                  4       pV'       g   V# \        V4      P                  4       pVP                  4       '       g   VP	                  R4      #  ^ RIHp VP                  4       pV.p\        \        3 F  p VP                  V! 4       4       K  	  V F6  pVP                  V4      '       g   K  \        VP                  V4      4      u # 	   \        VP!                  4       P                  VP!                  4       4      4      #   \         d    \        4       p L·i ; i  \         d     Kº  i ; i  \         d    \"        P%                  RT4       Tu # i ; i)z}Translate a trusted absolute skill path (slash commands / cron may store
them) to the relative form ``skill_view()`` accepts.r  r  )Úskills_toolu~   Skill identifier %r is an absolute path outside trusted skills roots â€” passing through unchanged (skill_view will reject it))rS   r   rÚ   r:   ÚlstripÚtoolsr½  Ú_skills_dirrR   r   r)  r  Úextendr   r(   r"  r  rÃ   rÄ   )r»  Úraw_identifierÚidentifier_pathÚ_skills_toolÚprimary_rootÚtrusted_rootsÚgetterr   s   &       r   Únormalize_skill_lookup_namerÈ  ˜  sS  € ð !×&Ð& B×-Ñ-Ó/€NßØÐÜ˜>Ó*×5Ñ5Ó7€OØ×&Ñ&×(Ò(Ø×$Ñ$ SÓ)Ð)ð
(å5Ø#×/Ñ/Ó1ˆð "�N€MÜ*Ô,DÓEˆð	Ø× Ñ ¡£Ö*ñ Fó ˆØ×)Ñ)¨$×/Ô/Ü�×2Ñ2°4Ó8Ó9Ò9ñ ðÜ�?×*Ñ*Ó,×8Ñ8¸×9MÑ9MÓ9OÓPÓQÐQøô ô (Ü%Ó'Šð(ûô ô 	Úð	ûô ô Ü�‰ð WØXfô	hàÒðús6   Á&D ÂD7Ã&5E	 ÄD4Ä3D4Ä7EÅEÅ	#E/Å.E/c                ó$   € V ^8„  d   QhR\         /# rr   rß   )r   s   "r   r   r   ¿  s   € ÷ 0ñ 0¬$ñ 0r   c                 ó  € \        V \        4      '       d   T M\        \        V 4      4      p VP                  4       P	                  4       #   \
        \        3 d"    TP                  4       P                  4       u # i ; ir    )r9   r   r(   rÚ   r  r¸   ÚRuntimeErrorÚabsolute)r,   r<   s   & r   Ú_resolve_for_skill_ownershiprÍ  ¿  sf   € Ü! $¬×-Ò-‰t´4¼¸D»	³?€Hð0Ø×"Ñ"Ó$×,Ñ,Ó.Ð.øÜ”\Ð"ô 0Ø×"Ñ"Ó$×-Ñ-Ó/Ò/ð0ús   ®A Á/A>Á=A>c                ó$   € V ^8„  d   QhR\         /# rr   rs   )r   s   "r   r   r   Ç  s   € ÷ 
_ñ 
_¤Dñ 
_r   c                ó
  a€ \        V 4      o\        \        4       4      p VP                  \	        4       4       \        ;QJ d    V3R lV 4       F  '       g   K   R# 	  R# ! V3R lV 4       4      #   \
         d     LGi ; i)zÏTrue when ``path`` lives under an external or trusted project skills dir.
Those are externally owned: autonomous lifecycle maintenance treats them as
read-only (user-directed tool calls may still edit them).c              3   óX   <"  € T F  pSP                  \        V4      4      x € K!  	  R # 5ir    )r   rÍ  )r"   r   Ú	candidates   & €r   r$   Ú)is_external_skill_path.<locals>.<genexpr>Ñ  s(   øé € Ð^ÑX]ÐPTˆy×'Ñ'Ô(DÀTÓ(J×KÐKÓX]ùs   ƒ'*TF)rÍ  ra   r  rÁ  r)  rR   r*   )r,   r0  rÑ  s   & @r   Úis_external_skill_pathrÓ  Ç  ss   ø€ ô -¨TÓ2€IÜÔ5Ó7Ó8€EðØ�‰Ô,Ó.Ô/÷ ‹3Ô^ÑX]Ó^�3Œ3Ð^Š3Ð^ˆ3Ô^ÑX]Ó^Ó^Ð^øô ô Ùðús   ¡A4 Á4BÂBc                ót   € V ^8„  d   QhR\         \        \        3,          R\         \        \        3,          /# rl   r»   )r   s   "r   r   r   Ô  s*   € ÷ 6ñ 6¤$¤s¬C x¥.ð 6´T¼#¼s¸(µ^ñ 6r   c                óª   € V P                  R4      p\        V\        4      '       d   VP                  R4      MRp\        V\        4      '       d   V# / # )zG``metadata.hermes`` mapping from frontmatter, or ``{}`` when malformed.ÚmetadataÚhermesN)rf   r9   rG   )rX   rÖ  r×  s   &  r   Ú_hermes_metadatarØ  Ô  sC   € à�‰˜zÓ*€HÜ'1°(¼D×'AÒ'AˆX�\‰\˜(Ô#Àt€FÜ ¬×-Ò-ˆ6Ð5°2Ð5r   c                ót   € V ^8„  d   QhR\         \        \        3,          R\         \        \        3,          /# rl   ©rG   r(   r   ra   )r   s   "r   r   r   à  s.   € ÷ Añ A¬$¬s´C¨x­.ð A¼TÄ#ÄtÀ)½_ñ Ar   c                ón   € \        V 4      p\         Uu/ uF  q"VP                  V. 4      bK  	  up# u upi )zPExtract conditional activation fields from parsed frontmatter (absent = ``[]``).)rØ  Ú_CONDITION_KEYSrf   )rX   r×  r[   s   &  r   Úextract_skill_conditionsrÝ  à  s2   € ä˜kÓ*€FÝ0?Ó@±¨�—‘˜C Ó$Ò$±Ñ@Ð@ùÒ@s   ”2c                óŠ   € V ^8„  d   QhR\         \        \        3,          R\        \         \        \        3,          ,          /# rl   rÚ  )r   s   "r   r   r   æ  s/   € ÷ !ñ !¬4´´S°­>ð !¼dÄ4ÌÌSÈÅ>Õ>Rñ !r   c                óî  € \        V 4      P                  R4      p\        V\        4      '       d   V.pV'       d   \        V\        4      '       g   . # / pV EF  p\        V\        4      '       g   K  \        VP                  RR4      4      P                  4       p\        VP                  RR4      4      P                  4       pV'       d   WB9   g	   V'       g   K†  RVRV/pVP                  R4      e   VR,          VR&   VP                  R4      p\        V\
        4      '       d'   VP                  4       '       d   VP                  4       MTVR&   WbV&   EK  	  \	        VP                  4       4      # )z±Extract ``metadata.hermes.config`` declarations (key/description/default/prompt).
Entries missing ``key`` or ``description`` are skipped; ``prompt`` defaults to the description.Úconfigr[   r  ÚdescriptionÚdefaultÚprompt)rØ  rf   r9   rG   ra   r(   rS   rþ   )rX   r  r’   rú   r[   ÚdescrØ   Úprompt_texts   &       r   Úextract_skill_config_varsræ  æ  s+  € ô ˜;Ó
'×
+Ñ
+¨HÓ
5€CÜ�#”t×ÒØˆeˆß”j ¤d×+Ò+Øˆ	Ø(*€FÜˆÜ˜$¤×%Ò%ÙÜ�$—(‘(˜5 "Ó%Ó&×,Ñ,Ó.ˆÜ�4—8‘8˜M¨2Ó.Ó/×5Ñ5Ó7ˆß�c”m¯4ÙØ!&¨¨]¸DÐ AˆØ�8‰8�IÓÒ*Ø# I�ˆE�)ÑØ—h‘h˜xÓ(ˆÜ1;¸KÌ×1MÒ1MÐR]×RcÑRc×ReÒRe˜+×+Ñ+Ô-Ðkoˆˆh‰ØˆsŒñ ô �—‘“Ó Ð r   c                ó\   € V ^8„  d   QhR\         \        \        \        3,          ,          /# rr   r[  )r   s   "r   r   r   ÿ  s    € ÷ #ñ #¬¬T´#´s°(­^Õ(<ñ #r   c                 ó(  € / p \        4       p\        4        FÎ  pVP                  4       '       g   K  \        VR4       F£  p \	        VP                  RR7      4      w  rE\        TP                  R4      ;'       g    TP                  P                  4      pYa9   g   \        T4      '       g   Kr  \        T4       F"  pTR,          T 9  g   K  YgR&   YpTR,          &   K$  	  K¥  	  KÐ  	  \        V P                  4       4      #   \         d     KÒ  i ; i)z‹Config var declarations across all enabled, platform-compatible skills,
deduplicated by key; each dict carries a ``skill`` attribution key.r2   r¾   r¿   r§   r[   Úskill)rð   r7  r  r   r]   rÂ   rR   r(   rf   ri  r§   rp   ræ  ra   rþ   )Úall_varsrê   Ú
skills_dirÚ
skill_filerX   ru  Ú
skill_nameÚvars           r   Údiscover_all_skill_config_varsrï  ÿ  sõ   € ð +-€HÜ'Ó)€HÜ)Ö+ˆ
Ø× Ñ ×"Ò"ÙÜ0°¸ZÖHˆJðÜ!2°:×3GÑ3GÐQ\Ð3GÓ3]Ó!^‘�ô ˜[Ÿ_™_¨VÓ4×NÐN¸
×8IÑ8I×8NÑ8NÓOˆJØÔ%Ô-CÀK×-PÒ-PÙÜ0°Ö=�Ø�u•: XÖ-Ø#-˜‘LØ+.˜S �ZÓ(ó >ó Iñ ,ô �—‘Ó!Ó"Ð"øô ô Úðús   ÁDÄDÄDzskills.configc                óR   € V ^8„  d   QhR\         \        \        3,          R\        /# )r   rà  Ú
dotted_keyr»   )r   s   "r   r   r     s"   € ÷ ñ œT¤#¤s (�^ð ¼ñ r   c                óˆ   € T pVP                  R4       F*  p\        V\        4      '       d   W29  d    R# W#,          pK,  	  V# )zGWalk a nested dict following a dotted key; None if any part is missing.Ú.N)rT   r9   rG   )rà  rñ  rg   r#   s   &&  r   Ú_resolve_dotpathrô    s?   € à€GØ× Ñ  Ö%ˆÜ˜'¤4×(Ò(¨DÔ,?ÚØ•-Šñ &ð €Nr   z\$(?:\{HOME\}|HOME)(?=$|[/\\])c                ó0   € V ^8„  d   QhR\         R\         /# )r   r\   r   r?   )r   s   "r   r   r   '  s   € ÷ 9ñ 9¤Sð 9¬Sñ 9r   c                ó0  a€ \        4       oS'       dI   V R8X  g   V P                  R4      '       d   SV R,          ,           p \        P                  V3R lV 4      p \        P
                  P                  \        P
                  P                  V 4      4      # )a\  Expand ``~`` / ``$HOME`` against the HOME Hermes injects into tool subprocesses.

Skill config defaults describe paths the agent hands to tools, so in a container where the
control process HOME (``/opt/data``) differs from the tool HOME (``{HERMES_HOME}/home``) a
plain ``expanduser`` pointed the prompt at a path no tool would ever read (#12260).
Ú~:r�  NNc                 ó   <€ S# r    rŠ   )Ú_mÚsubprocess_homes   &€r   r‹   Ú+_expand_skill_config_path.<locals>.<lambda>4  s   ø€ ©Or   )r  z~\)r   rM   Ú_HOME_VAR_RErŒ  ry   r,   rÚ   rÛ   )r\   rú  s   &@r   Ú_expand_skill_config_pathrý  '  sn   ø€ ô *Ó+€OßØ�CŒ<˜5×+Ñ+¨M×:Ò:Ø# e¨B¥iÕ/ˆEô × Ñ Ô!;¸UÓCˆÜ�7‰7×ÑœbŸg™g×0Ñ0°Ó7Ó8Ð8r   c                óŠ   € V ^8„  d   QhR\         \        \        \        3,          ,          R\        \        \        3,          /# )r   Úconfig_varsr   r[  )r   s   "r   r   r   8  s0   € ÷ ñ ¬T´$´s¼C°xµ.Õ-Að ÄdÌ3ÔPSÈ8Ånñ r   c                ó`  € \        4       p/ pV  F›  p\        V\         RVR,           24      pVe-   \        V\        4      '       d)   VP                  4       '       g   VP                  RR4      p\        V\        4      '       d   RV9   g   RV9   d   \        V4      pWBVR,          &   K�  	  V# )zžMap logical skill config keys to current values (or declared defaults);
path-like string values are ``~``/``$HOME``/``${VAR}`` expanded against the tool HOME.ró  r[   râ  r  r÷  Ú$)rÎ   rô  ÚSKILL_CONFIG_PREFIXr9   r(   rS   rf   rý  )rÿ  rà  r  rî  r\   s   &    r   Úresolve_skill_config_valuesr  8  s™   € ô Ó€FØ!€HÛˆÜ  Ô,?Ð+@ÀÀ#ÀeÅ*ÀÐ)NÓOˆØŠ=œZ¨¬s×3Ò3¸E¿K¹K¿MºMØ—G‘G˜I rÓ*ˆEÜ�eœS×!Ò! s¨e¤|°s¸e´|Ü-¨eÓ4ˆEØ$��U•Óñ ð €Or   c                óR   € V ^8„  d   QhR\         \        \        3,          R\        /# rl   r»   )r   s   "r   r   r   J  s&   € ÷ Bñ B¬d´3¼°8­nð BÄñ Br   c                óŠ   € V P                  RR4      pV'       d)   \        V4      P                  4       P                  R4      # R# )z@Normalize a skill's description field for comparison/truncation.rá  r  z'")rf   r(   rS   )rX   Úraw_descs   & r   Ú_normalize_skill_descriptionr  J  s7   € à�‰˜}¨bÓ1€Hß19Œ3ˆx‹=×ÑÓ ×&Ñ& uÓ-ÐA¸rÐAr   c                óR   € V ^8„  d   QhR\         \        \        3,          R\        /# rl   r»   )r   s   "r   r   r   P  s&   € ÷ gñ g¬4´´S°­>ð g¼cñ gr   c                ór   € \        V 4      p\        V4      \        8”  d   VR\        ^,
           R,           # T# )zCExtract a system-prompt-length description from parsed frontmatter.Nz...)r  rÅ   ÚSKILL_PROMPT_DESC_LIMIT)rX   rä  s   & r   Úextract_skill_descriptionr  P  s7   € ä'¨Ó4€DÜ9<¸T»ÔE\Ô9\ˆ4Ð,Ô(¨1Õ,Ð-°Õ5ÐfÐbfÐfr   c                óR   € V ^8„  d   QhR\         \        \        3,          R\        /# rl   rm   )r   s   "r   r   r   V  s&   € ÷ Tñ T¼4ÄÄSÀ½>ð TÌdñ Tr   c                ó8   € \        \        V 4      4      \        8„  # )zMTrue when the description will be truncated in the system prompt skill index.)rÅ   r  r
  ro   s   &r   Ú)is_skill_description_truncated_for_promptr  V  s   € äÔ+¨KÓ8Ó9Ô<SÑSÐSr   c                ó0   € V ^8„  d   QhR\         R\        /# )r   rë  Úfilename)r   r(   )r   s   "r   r   r   [  s   € ÷ 	*ñ 	*¤tð 	*´sñ 	*r   c              #  óš  "  € . p\         P                  ! \        V 4      RR7       Fw  w  r4pRV9   pV Uu. uF&  qw\        9  g   K  V'       d   V\        9   d   K$  VNK(  	  upVR&   W9   g   KI  VP                  \         P                  P                  W14      4       Ky  	  \        \        \        V4      4       Rj  x€L
  R# u upi  L5i)zvWalk skills_dir yielding sorted paths matching *filename*; prunes
EXCLUDED_SKILL_DIRS and support dirs of skill roots.T)Úfollowlinksr2   :NNNN)ry   Úwalkr(   r!   r3   r  r,   ÚjoinÚmapr   rO  )rë  r  Úmatchesr   r�  ÚfilesÚhas_skill_mdr/  s   &&      r   r   r   [  s¢   é € ð €GÜŸWšW¤S¨£_À$×GÑˆ�EØ! UÑ*ˆÙ"Óv™d˜Ô/BÑ&B”1ÏLÐ]^ÔbtÑ]t—1�1™dÑvˆˆQ‰ØÖØ�N‰Nœ2Ÿ7™7Ÿ<™<¨Ó7Ö8ñ	 Hô
 ”4œ ›Ó)×)Ò)ùò wñ *ùs5   ‚3CµCÁCÁCÁCÁ!	CÁ/ACÂ=C	Â>Cz^[a-zA-Z0-9_-]+$c                óh   € V ^8„  d   QhR\         R\        \        \         ,          \         3,          /# )r   r§   r   )r(   rF   r   )r   s   "r   r   r   k  s(   € ÷ 6ñ 6œsð 6¤u¬X´c­]¼CÐ-?Õ'@ñ 6r   c                óH   € V P                  R4      w  rpV'       d   W3# RV 3# )zcSplit ``'namespace:skill-name'`` into ``(namespace, bare_name)``; ``(None, name)`` without ``':'``.rK   N)Ú	partition)r§   Ú	namespaceÚsepÚbares   &   r   Úparse_qualified_namer  k  s)   € àŸ>™>¨#Ó.Ñ€I�Dß #ˆIÐÐ5¨$°¨Ð5r   c                óF   € V ^8„  d   QhR\         \        ,          R\        /# )r   rÑ  r   )r   r(   r   )r   s   "r   r   r   q  s"   € ÷ Dñ D¤(¬3¥-ð D´Dñ Dr   c                ód   € \        V 4      ;'       d    \        \        P                  V 4      4      # )zDCheck whether *candidate* is a valid namespace (``[a-zA-Z0-9_-]+``).)r   Ú_NAMESPACE_REÚmatch)rÑ  s   &r   Úis_valid_namespacer$  q  s$   € ä�	‹?×CÐCœt¤M×$7Ñ$7¸	Ó$BÓCÐCr   c                óÜ  € V ^8„  d   Qh/ ^ \         9   d   \        \        \        3,          ;R&   ^\         9   d(   \        \        \        . \        3,          3,          ;R&   ^\         9   dL   \        \
        \        \        \        \        \        3,          \        \        \        3,          3,          ;R&   ^\         9   d
   \        ;R&   ^\         9   dF   \        \
        \        \        \        \        \        3,          \        \        ,          3,          ;R&   ^\         9   d"   \        \
        \        R3,          ,          ;R&   ^\         9   d   \        \        \        3,          ;R&   # )	r   r�   r�   r®   rî   r  .rm  r¬  )Ú__conditional_annotations__rG   r(   r   r   rF   r³   r   rù   ra   r   rå   )r   s   "r   r   r      s  € ÷ Qñ Q÷b (Ò '”4œœT˜	•?Ñ 'ñcQ÷^ò ””Sœ( 2¤t 8Õ,Ð,Õ-ñ ñ_Q÷D MÒ L”4œœc¤3¬¬S´#Ð5Õ6¼¼SÄ#¸X½ÐFÕGÑ LñEQ÷d :Ò 9”)Ñ 9ñeQ÷|	 LÒ K”dœ5¤¤c¬3´´SÐ!8Õ9¼4Ä½:ÐEÕFÑ Kñ}	Q÷j .Ò -””Uœ3 ˜8•_Õ%Ñ -ñkQ÷f 0Ò /œ4¤¤T 	�?Ñ /ògQr   )r|  z.githubz.hubz.archivez.curator_backupsz.locksz.venvÚvenvÚnode_moduleszsite-packagesÚ__pycache__z.toxz.noxz.pytest_cachez.mypy_cachez.ruff_cache)Ú
referencesÚ	templatesÚassetsÚscriptsr    )Úfallback_for_toolsetsÚrequires_toolsetsÚfallback_for_toolsÚrequires_toolsÚsession_platforms)wr&  Ú__doc__rõ   r;  Úloggingry   rN   rb   Ú	threadingÚpathlibr   r   Útypingr   r   r   r   r   r	   r
   rƒ   r   r   r   Ú	getLoggerÚ__name__rÃ   re   rù   r!   r3   r-   r+   rB   rD   r]   rj   rp   r�   r~   r„   r�   r“   r›   r©   r®   rÆ   ÚLockr­   r°   r¹   rÎ   rÓ   rÖ   rÜ   rã   rî   rð   rû   rí   r  r  r  r  r  r$  r~  r*  r+  r,  r-  ÚAMBIGUOUS_SKILL_PREFIXrå   rm  r3  r7  r@  rD  rS  rX  rx  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ô  Úcompilerü  rý  r  r
  r  r  r  r   r"  r  r$  r   )r&  s   @r   Ú<module>r=     së  øðöQó Û Û Û 	Û 	Û 
Û ß "ß B× BÑ B÷ñ ð 
×	Ò	˜8Ó	$€à˜ 7¨G°YÀÐH€áð !ó Ð ñ ÐOÓPÐ ðh¸4÷ hð¸$÷ ð €õ"õõ.õEð &(Ð Ó 'õõ&ð ˆn˜h¨ØÑ
Xð1€ó õ
õ@õð, KMÐ Ó Lð Ð ð #ŸšÓ)Ð õ"õõõ<@õCõ?õ
;ñ (¨Ð(8Ó9Ð Ó 9÷'õeõ(Wð JLÐ Ó KõõCõõ:õ(	'ñ <AÀ»8Ñ 8€ˆj˜/¨=à0Ð ñ ),«€Ó -ñHÐTX÷ Hð HõMõ	õPõIõZõ#ðX Ÿ'™'Ÿ,™, y°(Ó;¸R¿W¹W¿\¹\È)ÐU]Ó=^Ð_Ð àÐ ÷õDõõõ[õLõ	,ð8 'Ð Ø-/Ð Ó /õõ4sõ$õN0õ
_õ6ð ~€õAõ!õ2#ð0 &Ð õð �zŠzÐ;Ó<€õ9õ"ð Ð õBõgõTõ
	*ð —
’
Ð.Ó/€õ6÷Dr   