§
    ‰eîia  ã                  óf   — d Z ddlmZ ddlZddlmZ ddlmZ dd„Zdd„Z	dd„Z
dd„Zdd„Zdd„ZdS )z:Shared file safety rules used by both tools and ACP shims.é    )ÚannotationsN)ÚPath)ÚOptionalÚreturnr   c                 óœ   — 	 ddl m}   | ¦   «         S # t          $ r/ t          t          j                             d¦  «        ¦  «        cY S w xY w)zHResolve the active HERMES_HOME (profile-aware) without circular imports.r   ©Úget_hermes_homez	~/.hermes)Úhermes_constantsr	   Ú	Exceptionr   ÚosÚpathÚ
expanduserr   s    ú3/home/div/.hermes/hermes-agent/agent/file_safety.pyÚ_hermes_home_pathr   
   sf   € ð5Ø4Ð4Ð4Ð4Ð4Ð4ØˆÑ Ô Ð øÝð 5ð 5ð 5Ý•B”G×&Ò& {Ñ3Ô3Ñ4Ô4Ð4Ð4Ð4ð5øøøs   ‚ ’6AÁ
AÚhomeÚstrúset[str]c                óŒ  — t          ¦   «         }d„ t          j                             | dd¦  «        t          j                             | dd¦  «        t          j                             | dd¦  «        t          j                             | dd¦  «        t	          |dz  ¦  «        t          j                             | d¦  «        t          j                             | d	¦  «        t          j                             | d
¦  «        t          j                             | d¦  «        t          j                             | d¦  «        t          j                             | d¦  «        t          j                             | d¦  «        t          j                             | d¦  «        t          j                             | d¦  «        dddfD ¦   «         S )z8Return exact sensitive paths that must never be written.c                óL   — h | ]!}t           j                             |¦  «        ’Œ"S © )r   r   Úrealpath©Ú.0Úps     r   ú	<setcomp>z+build_write_denied_paths.<locals>.<setcomp>   s8   € ð ð ð àõ 	Œ×Ò˜ÑÔðð ð ó    ú.sshÚauthorized_keysÚid_rsaÚ
id_ed25519Úconfigz.envz.bashrcz.zshrcz.profilez.bash_profilez	.zprofilez.netrcz.pgpassz.npmrcz.pypircz/etc/sudoersz/etc/passwdz/etc/shadow)r   r   r   Újoinr   )r   Úhermes_homes     r   Úbuild_write_denied_pathsr$      sK  € å#Ñ%Ô%€Kðð õ ŒG�LŠL˜˜vÐ'8Ñ9Ô9ÝŒG�LŠL˜˜v xÑ0Ô0ÝŒG�LŠL˜˜v |Ñ4Ô4ÝŒG�LŠL˜˜v xÑ0Ô0Ý�˜fÑ$Ñ%Ô%ÝŒG�LŠL˜˜yÑ)Ô)ÝŒG�LŠL˜˜xÑ(Ô(ÝŒG�LŠL˜˜zÑ*Ô*ÝŒG�LŠL˜˜Ñ/Ô/ÝŒG�LŠL˜˜{Ñ+Ô+ÝŒG�LŠL˜˜xÑ(Ô(ÝŒG�LŠL˜˜yÑ)Ô)ÝŒG�LŠL˜˜xÑ(Ô(ÝŒG�LŠL˜˜yÑ)Ô)ØØØð#
ðñ ô ð r   ú	list[str]c                óÒ  — d„ t           j                             | d¦  «        t           j                             | d¦  «        t           j                             | d¦  «        t           j                             | d¦  «        ddt           j                             | d¦  «        t           j                             | d	¦  «        t           j                             | d
d¦  «        f	D ¦   «         S )z?Return sensitive directory prefixes that must never be written.c                óf   — g | ].}t           j                             |¦  «        t           j        z   ‘Œ/S r   )r   r   r   Úsepr   s     r   ú
<listcomp>z/build_write_denied_prefixes.<locals>.<listcomp>0   s?   € ð ð ð àõ 	Œ×Ò˜ÑÔ�bœfÑ$ðð ð r   r   z.awsz.gnupgz.kubez/etc/sudoers.dz/etc/systemdz.dockerz.azurez.configÚgh)r   r   r"   )r   s    r   Úbuild_write_denied_prefixesr+   .   s´   € ðð õ ŒG�LŠL˜˜vÑ&Ô&ÝŒG�LŠL˜˜vÑ&Ô&ÝŒG�LŠL˜˜xÑ(Ô(ÝŒG�LŠL˜˜wÑ'Ô'ØØÝŒG�LŠL˜˜yÑ)Ô)ÝŒG�LŠL˜˜xÑ(Ô(ÝŒG�LŠL˜˜y¨$Ñ/Ô/ð

ðñ ô ð r   úOptional[str]c                 óÐ   — t          j        dd¦  «        } | sdS 	 t           j                             t           j                             | ¦  «        ¦  «        S # t
          $ r Y dS w xY w)zBReturn the resolved HERMES_WRITE_SAFE_ROOT path, or None if unset.ÚHERMES_WRITE_SAFE_ROOTÚ N)r   Úgetenvr   r   r   r   )Úroots    r   Úget_safe_write_rootr2   @   sn   € åŒ9Ð-¨rÑ2Ô2€DØð ØˆtðÝŒw×Ò¥¤× 2Ò 2°4Ñ 8Ô 8Ñ9Ô9Ð9øÝð ð ð Øˆtˆtðøøøs   ›;A Á
A%Á$A%r   Úboolc                óþ  — t           j                             t           j                             d¦  «        ¦  «        }t           j                             t           j                             t	          | ¦  «        ¦  «        ¦  «        }|t          |¦  «        v rdS t          |¦  «        D ]}|                     |¦  «        r dS Œt          ¦   «         }|r*||k    s$|                     |t           j	        z   ¦  «        sdS dS )zBReturn True if path is blocked by the write denylist or safe root.Ú~TF)
r   r   r   r   r   r$   r+   Ú
startswithr2   r(   )r   r   ÚresolvedÚprefixÚ	safe_roots        r   Úis_write_deniedr:   K   sé   € åŒ7×Ò�BœG×.Ò.¨sÑ3Ô3Ñ4Ô4€DÝŒw×Ò¥¤× 2Ò 2µ3°t±9´9Ñ =Ô =Ñ>Ô>€HàÕ+¨DÑ1Ô1Ð1Ð1ØˆtÝ-¨dÑ3Ô3ð ð ˆØ×Ò˜vÑ&Ô&ð 	Ø�4�4ð	õ $Ñ%Ô%€IØð ˜( iÒ/Ð/°8×3FÒ3FÀyÕSUÔSYÑGYÑ3ZÔ3ZÐ/Øˆtàˆ5r   c                ó8  — t          | ¦  «                             ¦   «                              ¦   «         }t          ¦   «                              ¦   «         }|dz  dz  dz  |dz  dz  g}|D ]0}	 |                     |¦  «         n# t
          $ r Y Œ%w xY wd| › d�c S dS )zHReturn an error message when a read targets internal Hermes cache files.Úskillsz.hubzindex-cachezAccess denied: z‹ is an internal Hermes cache file and cannot be read directly to prevent prompt injection. Use the skills_list or skill_view tools instead.N)r   r   Úresolver   Úrelative_toÚ
ValueError)r   r7   r#   Úblocked_dirsÚblockeds        r   Úget_read_block_errorrB   ]   sÛ   € å�D‰zŒz×$Ò$Ñ&Ô&×.Ò.Ñ0Ô0€HÝ#Ñ%Ô%×-Ò-Ñ/Ô/€Kà�hÑ Ñ'¨-Ñ7Ø�hÑ Ñ'ð€Lð  ð 	
ð 	
ˆð	Ø× Ò  Ñ)Ô)Ð)Ð)øÝð 	ð 	ð 	ØˆHð	øøøð?˜dð ?ð ?ð ?ð	
ð 	
ð 	
ð
 ˆ4s   Á,BÂ
BÂB)r   r   )r   r   r   r   )r   r   r   r%   )r   r,   )r   r   r   r3   )r   r   r   r,   )Ú__doc__Ú
__future__r   r   Úpathlibr   Útypingr   r   r$   r+   r2   r:   rB   r   r   r   ú<module>rG      sÌ   ðØ @Ð @à "Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ð5ð 5ð 5ð 5ðð ð ð ð6ð ð ð ð$ð ð ð ðð ð ð ð$ð ð ð ð ð r   