+
    lHàjë   ã                   óZ  a € R' t 0 t R t^ RIt^ RIt^ RIHt ^ RIHt ^ RIH	t	H
t
Ht ^ RIHt ]P                  ! R4      t^@tRt. R(Ot] ^ k R)t0 R*mtR R	 ltR
 R ltR R ltR R ltR+RR/R R llltR R ltRRRRRRRR/R R lltR R ltR R ltR+R R!R"R/R# R$ llltR% R& ltR# ),a  Plugin-provided skill serving for ``skill_view`` (``plugin:skill`` names) plus the JSON /
file-serving helpers shared with the local-skill path. Helpers tests patch on the origin module
(``_is_skill_disabled``, ``_parse_frontmatter``, ``skill_matches_platform``) resolve lazily.N)Úsuppress©ÚPath)ÚAnyÚDictÚList)ÚSkillReadinessStatusztools.skills_tooli   c                ó0   € V ^8„  d   QhR\         R\        /# )é   ÚpayloadÚreturn)ÚdictÚstr)Úformats   "Ú=/home/ubuntu/.hermes/hermes-agent/tools/skills_tool_plugin.pyÚ__annotate__r      s   € ÷ 3ñ 3”4ð 3œCñ 3ó    c                 ó2   € \         P                  ! V R R7      # )F)Úensure_ascii)ÚjsonÚdumps)r   s   &r   Ú_jsonr      s   € Ü�:Š:�g¨EÔ2Ð2r   c                ó0   € V ^8„  d   QhR\         R\         /# )r
   Úerrorr   ©r   )r   s   "r   r   r      s   € ÷ >ñ >”ð >¤#ñ >r   c                 ó$   € \        R RRV /VC4      # )ÚsuccessFr   )r   )r   Úextras   &,r   Ú_failr      s   € Ü�)˜U G¨UÐ<°eÐ<Ó=Ð=r   c                ó0   € V ^8„  d   QhR\         R\        /# )r
   Úpathr   )r   r   )r   s   "r   r   r   !   s   € ÷ Bñ Bœ4ð B¤Cñ Br   c                ó(   € V P                  RRR7      # )zžutf-8-sig + errors="replace": user-authored SKILL.md may carry a Notepad BOM or stray
bytes; pinning UTF-8 keeps skill_view deterministic across host locales.z	utf-8-sigÚreplace)ÚencodingÚerrors)Ú	read_text)r    s   &r   Ú_read_skill_textr&   !   s   € ð �>‰> ;°yˆ>ÓAÐAr   c                ó0   € V ^8„  d   QhR\         R\         /# )r
   Údescriptionr   r   )r   s   "r   r   r   '   s   € ÷ =ñ =¤sð =¬sñ =r   c                 ó\   € \        V 4      \        8:  d   V # V R \        ^,
           R,           # )Nz...)ÚlenÚMAX_DESCRIPTION_LENGTH)r(   s   &r   Ú_truncate_descriptionr,   '   s/   € Ü
ˆ;ÓÔ1Ô1ØÐØÐ3Ô/°!Õ3Ð4°uÕ<Ð<r   Úcontentc                óz   € V ^8„  d   QhR\         R,          R\        R,          R\        \        \        3,          /# )r
   r    Nr-   r   )r   r   r   r   )r   s   "r   r   r   -   s6   € ÷ ñ œD 4�Kð ¼CÀ$½Jð ÔRVÔWZÔ\_ÐW_ÕR`ñ r   c               óÈ   € ^ RI Hp \        \        4      ;_uu_ 4        TP	                  Vf   \        V 4      MT4      ^ ,          uuRRR4       #   + '       g   i     / # ; i)z›Frontmatter of *path* (or of *content*), ``{}`` on any read/parse failure.
Parses via ``tools.skills_tool._parse_frontmatter`` so test patches are honored.©Úskills_toolN)Útoolsr1   r   Ú	ExceptionÚ_parse_frontmatterr&   )r    r-   Ú_sts   &$ r   Ú_safe_frontmatterr6   -   sG   € õ )Ü	”)×	Õ	Ø×%Ñ%ÀÂÔ&6°tÔ&<ÐU\Ó]Ð^_Õ`÷ 
×	×	Ñ	à€Iús   ž'AÁA!	c                óh   € V ^8„  d   QhR\         R\        \        \        \        ,          3,          /# )r
   Ú	skill_dirr   ©r   r   r   Úlist)r   s   "r   r   r   6   s+   € ÷ Lñ L¤dð L¬t´C¼¼c½°NÕ/Cñ Lr   c                ó  € / pV P                  R4       F½  pVP                  4       '       d   VP                  R8X  d   K,  VP                  V 4      P	                  4       pRV9   d   VP                  R^4      ^ ,          MRpV\        9   g   VP                  \        9   g   K�  TP                  V\        9   d   TMR. 4      P                  V4       K¿  	  . \        ORN Uu/ uF  qUV9   g   K  WQV,          bK  	  up# u upi )zrNon-SKILL.md files grouped by support dir (+ "other" for known source extensions
elsewhere); empty groups dropped.Ú*zSKILL.mdÚ/NÚother)ÚrglobÚis_fileÚnameÚrelative_toÚas_posixÚsplitÚ_SUPPORT_DIRSÚsuffixÚ_SKILL_FILE_EXTSÚ
setdefaultÚappend)r8   ÚgroupsÚfÚrelÚtopÚks   &     r   Ú_available_skill_filesrO   6   sÔ   € ð $&€FØ�_‰_˜SÖ!ˆØ�y‰y�{Š{˜aŸf™f¨
Ô2ÙØ�m‰m˜IÓ&×/Ñ/Ó1ˆØ&)¨S¤jˆc�i‰i˜˜QÓ Ö"°dˆØ”-Ô 1§8¡8Ô/?Ö#?Ø×Ñ S¬MÔ%9™c¸wÈÓK×RÑRÐSVÖWñ "ð #<¤MÐ";°7Ñ";ÓKÑ";˜QÀF¹{ŒLˆA�a�yŠLÑ";ÑKÐKùÒKs   Ã!C>Ã.C>ÚhintÚlist_availableFÚread_error_prefixÚ	mark_readc                ó†   € V ^8„  d   QhR\         R\        R\        R\        R,          R\        R\        R\        R	\        /# )
r
   Ú
skill_rootÚ	file_pathÚlabelrP   NrQ   rR   rS   r   ©r   r   Úbool)r   s   "r   r   r   D   sP   € ÷ "%ñ "%Üð"%Ü!$ð"%Ü-0ð"%Ü;>À½:ð"%äð"%ä59ð"%äNRð"%ä_bñ"%r   c               ó   € ^ RI HpHp V'       d   RV/M/ p	V! V4      '       d   \        R/ V	B # W,          p
V! W 4      ;p'       d   \        V3/ V	B # V
P	                  4       '       g-   V'       g   / MR\        V 4      RR/p\        RV RV R23/ VB #  \        V
4      pT'       d   \        T
4       \        RR	R
TRTRTRT
P                  /4      #   \         dB    \        RR	R
TRTRR	RRT
P                   RT
P                  4       P                   R2/4      u # \         d%   pT'       g   h \        RT RT 24      u Rp?# Rp?ii ; i)a0  Serve one linked file from a skill directory as a skill_view JSON result. ``hint``
decorates traversal/containment errors; ``list_available`` adds the available-files listing
on not-found (local); ``read_error_prefix`` wraps non-decode read errors (plugin) instead
of propagating to the caller's handler.)Úhas_traversal_componentÚvalidate_within_dirrP   Úavailable_filesz0Use one of the available file paths listed abovezFile 'z' not found in skill 'z'.r   TrA   ÚfileÚ	is_binaryr-   z[Binary file: z, size: z bytes]zFailed to read 'ú': NÚ	file_type)z%Path traversal ('..') is not allowed.)Útools.path_securityr[   r\   r   r@   rO   r&   ÚUnicodeDecodeErrorr   rA   ÚstatÚst_sizer3   Ú_mark_background_review_readrF   )rU   rV   rW   rP   rQ   rR   rS   r[   r\   r   ÚtargetÚ
path_errorÚlistingr-   Úexcs   &&&$$$$        r   Ú_serve_skill_filerk   D   ss  € ÷ Qß"ˆV�T‰N¨€EÙ˜y×)Ò)ÜÑFÀÑFÐFØÕ#€FÙ(¨Ó<Ð<€zÖ<Ü�ZÑ) 5Ñ)Ð)à�>‰>×Òß*‘"ØÔ5°jÓAØÐFð1Hˆô �v˜i˜[Ð(>¸u¸gÀRÐHÑTÈGÑTÐTð	=Ü" 6Ó*ˆ÷ Ü$ VÔ,ÜØ�4˜ ¨°	¸9ÀgØ�V—]‘]ð$ó %ð %øô ô ^ÜØ�t˜V U¨F°I¸{ÈDØ˜¨¯© }°H¸V¿[¹[»]×=RÑ=RÐ<SÐSZÐ[ð]ó ^ò 	^ô ô =ß ØÜÐ'¨	 {°#°c°UÐ;Ó<Õ<ûð=ús+   ÂC ÃA	EÄEÄ(EÄ)EÅEÅEc                ó(   € V ^8„  d   QhR\         RR/# )r
   r    r   Nr   )r   s   "r   r   r   i   s   € ÷ bñ b¤tð b°ñ br   c                 óx   €  ^ RI Hp V! V 4       R#   \         d    \        P	                  RT RR7        R# i ; i)é    )Ú!mark_background_review_skill_readz4Could not record background-review skill read for %sT)Úexc_infoN)Útools.skill_manager_guardsro   r3   ÚloggerÚdebug)r    ro   s   & r   rf   rf   i   s8   € ðbÝPÙ)¨$Ö/øÜô bÜ�‰ÐKÈTÐ\`ˆ×aðbús   ‚ ’#9¸9c                ó<   € V ^8„  d   QhR\         R\         R\         /# )r
   r-   Ú	debug_msgr   r   )r   s   "r   r   r   q   s"   € ÷ ñ œsð Äcð ÔUXñ r   c                ó~   €  ^ RI Hp V! WVR7      #   \         d     \        P                  ! T.TO5RR/  T u # i ; i)zJApply the configured SKILL.md preprocessing; on failure log and serve raw.)Úpreprocess_skill_content)Ú
session_idrp   T)Úagent.skill_preprocessingrw   r3   rr   rs   )r-   r8   rx   ru   Úargsrw   s   &&&&* r   Ú_preprocess_skillr{   q   sA   € ðÝFÙ'¨ÀzÔRÐRøÜô Ü�Š�YÐ5 Ò5°Ò5ØŠðús   ‚ ’'<»<Ú
preprocessTrx   c                óˆ   € V ^8„  d   QhR\         R\        R\        R\        R,          R\        R\        R,          R\        /# )	r
   Úskill_mdÚ	namespaceÚbarerV   Nr|   rx   r   rX   )r   s   "r   r   r   {   sL   € ÷ &,ñ &,Üð&,Ü"ð&,Ü*-ð&,Ü:=À½*ð&,äð&,ä),¨t­ð&,ä?Bñ&,r   c               ó>  a€ ^ RI HpHp ^ RIHp W! 4       9   d   \        RV RV 24      # V RV 2p	 \        V 4      o\        SR	7      pTP                  T	4      '       d   \        R
T	 R24      # TP                  T4      '       g*   \        R
T	 R2\        P                  P                  R7      # T'       d   \        T P                  Y9RR7      # \         ;QJ d#    T3R l\"         4       F  '       g   K   RM	  RM! T3R l\"         4       4      '       d   \$        P'                  RY4       Rp\)        \        4      ;_uu_ 4        T! 4       P+                  T4       Uu. uF  qÝT8w  g   K  TNK  	  ppRT R2T'       d#   RRP-                  T4       RT RT^ ,           R2MR,           R,           pRRR4       T'       g   SM\/        ST P                  TRY4      p\1        RRRT	RYÏ,           R\3        \5        TP7                  RR4      4      4      R \9        T P                  4      R!\        P:                  P                  R"\5        T P                  4      /4      #   \         d   p
\        RT	 RT
 24      u Rp
?
# Rp
?
ii ; iu upi   + '       g   i     Là; i)#z8Read a plugin-provided skill, apply guards, return JSON.)Ú_get_disabled_pluginsÚget_plugin_managerr0   zPlugin 'z5' is disabled. Re-enable with: hermes plugins enable Ú:zFailed to read skill 'r`   N)r-   zSkill 'z' is disabled.z$' is not supported on this platform.)Úreadiness_statusT)rR   c              3   óH   <"  € T F  qSP                  4       9   x € K  	  R # 5i©N)Úlower)Ú.0Úpr-   s   & €r   Ú	<genexpr>Ú&_serve_plugin_skill.<locals>.<genexpr>�   s   øé € Ð
=Ñ)< A�—‘“ÖÓ)<ùs   ƒ"FzIPlugin skill '%s:%s' contains patterns that may indicate prompt injectionÚ z,[Bundle context: This skill is part of the 'z	' plugin.z
Sibling skills: z, z..
Use qualified form to invoke siblings (e.g. z).z]

z'Could not preprocess plugin skill %s:%sr   rA   r-   r(   Úlinked_filesr…   r8   )Úhermes_cli.pluginsr‚   rƒ   r2   r1   r   r&   r3   r6   Ú_is_skill_disabledÚskill_matches_platformr   ÚUNSUPPORTEDÚvaluerk   ÚparentÚanyÚ_INJECTION_PATTERNSrr   Úwarningr   Úlist_plugin_skillsÚjoinr{   r   r,   r   ÚgetÚ_plugin_skill_linked_filesÚ	AVAILABLE)r~   r   r€   rV   r|   rx   r‚   rƒ   r5   Úqualified_nameÚeÚparsed_frontmatterÚbannerÚsÚsiblingsÚrendered_contentr-   s   &&&&$$          @r   Ú_serve_plugin_skillr¤   {   ss  ø€ ÷ MÝ(ØÐ)Ó+Ô+Ü�x 	˜{Ð*_Ð`iÐ_jÐkÓlÐlØ!�{ ! D 6Ð*€NðFÜ" 8Ó,ˆô +°7Ô;ÐØ
×Ñ˜n×-Ò-Ü�w˜~Ð.¨nÐ=Ó>Ð>Ø×%Ñ%Ð&8×9Ò9Ü�w˜~Ð.Ð.RÐSÜ&:×&FÑ&F×&LÑ&LôNð 	NçÜ  §¡°)Ð_cÔdÐdß
ƒsÔ
=Õ)<Ó
=‡s‡s‚sÔ
=Õ)<Ó
=×=Ò=Ü�‰ØWÐYbô	jà€FÜ	”)×	Õ	Ù1Ó3×FÑFÀyÔQÓ_ÑQ˜!ÐZ^ÑU^—A�AÑQˆÐ_Ø?À	¸{È)ÐTç4<ð ! §¡¨8Ó!4Ð 5ð 6Ø�K˜q ¨!¥ ¨Rñ1ØBDõFàHOõPˆ÷ 
÷
 '1‘wÔ6GØ�—‘ *Ð.WØó7Ðô Ø�4˜ °¸FÕ<UØÔ,¬SÐ1C×1GÑ1GÈÐWYÓ1ZÓ-[Ó\ØÔ2°8·?±?ÓCØÔ0×:Ñ:×@Ñ@Ø”S˜Ÿ™Ó)ð+ó ,ð ,øô- ô FÜÐ-¨nÐ-=¸SÀÀÐDÓEÕEûðFüò `÷ 
×	úsB   ´I ÅJÅ!JÅ.JÅ4A JÉJÉ)I?É9JÉ?JÊJÊJ	c                óv   € V ^8„  d   QhR\         R\        \        \        \        ,          3,          R,          /# )r
   rU   r   Nr9   )r   s   "r   r   r   ¤   s,   € ÷ 	ñ 	¬4ð 	´D¼¼dÄ3½i¸Õ4HÈ4Õ4Oñ 	r   c           	      ó@  € ^ RI Hp / p\         F|  p\        W,          P	                  R4      4       Uu. uFA  pVP                  4       '       g   K  V! W@4      e   K'  \        VP                  V 4      4      NKC  	  ppV'       g   Kx  WRV&   K~  	  T;'       g    R# u upi )rn   )r\   r<   N)rb   r\   rE   Úsortedr?   r@   r   rB   )rU   r\   ÚlinkedÚcategoryr    Úfiless   &     r   r›   r›   ¤   s•   € Ý7Ø#%€Fß!ˆä:@À*ÕBW×A^ÑA^Ð_bÓAcÔ:dóQÙ:d°$Ø�|‰|�~ô .Ù"5°dÓ"Gô .ŒC�× Ñ  Ó,Ö-Ñ:dð 	ð Q÷ ‰5Ø$�8Óñ "ð �>ˆ>�TÐùòQs   ´BÁBÁBc                ó@   € V ^8„  d   Qh/ ^ \         9   d
   \        ;R&   # )r
   r–   )Ú__conditional_annotations__r:   )r   s   "r   r   r      s%   € ÷ `ñ `÷ )ò )”Tñ )ò!`r   )	zignore previous instructionszignore all previouszyou are nowzdisregard yourzforget your instructionsznew instructions:zsystem prompt:z<system>z]]>)Ú
referencesÚ	templatesÚassetsÚscripts>   ú.mdú.pyú.shú.texú.ymlú.jsonú.yamlr‡   )!r¬   Ú__doc__r   ÚloggingÚ
contextlibr   Úpathlibr   Útypingr   r   r   Útools.skills_tool_setupr   Ú	getLoggerrr   ÚMAX_NAME_LENGTHr+   r–   rE   rG   r   r   r&   r,   r6   rO   rk   rf   r{   r¤   r›   r   )r¬   s   @r   Ú<module>rÀ      s×   øðö`ó Û Ý Ý ß "Ñ "å 8à	×	Ò	Ð.Ó	/€à€ØÐ ò)Ð ó )ð A€ÚJÐ õ3õ>õBõ=ñÈ÷ ð õLð"%ØHLð"%à ð"%à<Að"%àUZ÷"%õJbõñ&,àð&,à6:÷&,ð &,÷R	r   