+
    jHàjÏI  ã                   ó0  € R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RI	H
t
 ^ RIHtHt ^ RIHt ^ RIHtHtHtHt ]P*                  ! ]4      tRt]! R4      t]
! R	R
7       ! R R4      4       tRR/R R lltRRRR	/R R lltR R lt]R=R R ll4       tRR/R R lltRt RRRR/R R llt!RR/R R llt"RR /R! R" llt#R# R$ lt$R% R& lt%R' R( lt&R) R* lt'R+ R, lt(R-R	/R. R/ llt)R0R R1R /R2 R3 llt*R4 R5 lt+R6 R7 lt,R=R8 R9 llt-R:R /R; R< llt.R# )>zhManaged-files policy for the dashboard file browser: root resolution, path containment, entry metadata.
N)Úcontextmanager)Ú	dataclass)ÚHTTPExceptionÚRequest©ÚPath)ÚAnyÚDictÚIteratorÚOptionalÚHERMES_DASHBOARD_FILES_ROOTz	/opt/dataT)Úfrozenc                   ó,   a € ] tR t^t o V 3R ltRtV tR# )ÚManagedFilesPolicyc                óL   <€ V ^8„  d   Qh/ S[ ;R&   S[ R,          ;R&   S[;R&   # )é   Údefault_pathNÚlocked_rootÚcan_change_path©r   Úbool)ÚformatÚ__classdict__s   "€Ú@/home/ubuntu/.hermes/hermes-agent/hermes_cli/web_server_files.pyÚ__annotate__ÚManagedFilesPolicy.__annotate__   s.   ø‡ ‚ áÑñ ñ ˜•Ññ ñ Ñò	 ó    © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__annotate_func__Ú__static_attributes__Ú__classdictcell__)r   s   @r   r   r      s   ø‡ ‡ „ r   r   Úcwdc                óJ   € V ^8„  d   QhR\         R\         R,          R\        /# )r   Úrawr%   NÚreturn©Ústrr   )r   s   "r   r   r      s%   € ÷ +ñ +œsð +¬C°$­Jð +Ä$ñ +r   c                ó>  € \        V 4      P                  4       pVP                  4       '       g^   Ve   \        V4      P                  4       M\         P                  ! 4       pVP                  4       '       g   \	        RRR7      hW2,          pVP                  RR7      # )Né�  z(Session working directory is unavailable©Ústatus_codeÚdetailF©Ústrict)r   Ú
expanduserÚis_absoluter%   r   Úresolve)r'   r%   Ú	candidateÚbases   &$  r   Ú_resolve_fs_candidater7      sz   € Ü�S“	×$Ñ$Ó&€IØ× Ñ ×"Ò"Ø),ªŒt�C‹y×#Ñ#Ô%¼d¿hºh»jˆØ×Ñ×!Ò!Ü¨CÐ8bÔcÐcØÕ$ˆ	Ø×Ñ EÐÓ*Ð*r   Údecode_fallbackc                óV   € V ^8„  d   QhR\         R\         R,          R\        R\        /# )r   Úraw_pathr%   Nr8   r(   )r*   r   r   )r   s   "r   r   r   &   s3   € ÷  Dñ  D”sð  D¤C¨$¥Jð  DÌð  DÔX\ñ  Dr   c                ó´  € \        T ;'       g    R 4      P                  4       pV'       g   \        RRR7      hRV9   d   \        RRR7      h VP                  4       P	                  R4      '       d©   \
        P                  P                  V4      pVP                  pVP                  '       dL   VP                  P                  4       R8w  d-   \        P                  R8w  d   \        hR	VP                   V 2p\
        P                  P                  V4      pM#\        P                  R8X  d   ^ R
IHp V! V4      p\#        W1R7      pV'       d`   RV9   dY   VP%                  4       '       gC   \#        \
        P                  P'                  V4      VR7      pVP%                  4       '       d   TpV#   \(        \*        \        3 d    \        RRR7      hi ; i)Ú r,   zPath is requiredr-   Ú úInvalid pathúfile:Ú	localhostÚntú//©Ú_msys_to_windows_path©r%   Ú%)r*   Ústripr   ÚlowerÚ
startswithÚurllibÚparseÚurlparseÚpathÚnetlocÚosÚnameÚ
ValueErrorÚrequestÚurl2pathnameÚtools.environments.localrD   r7   ÚexistsÚunquoteÚOSErrorÚRuntimeError)	r:   r%   r8   r'   ÚparsedÚuri_pathrD   r5   Údecodeds	   &$$      r   Ú_fs_pathr\   &   sc  € Ü
ˆh�nˆn˜"Ó
×
#Ñ
#Ó
%€CßÜ¨Ð4FÔGÐGØˆs„{Ü¨°NÔCÐCðDØ�9‰9‹;×!Ñ! '×*Ò*Ü—\‘\×*Ñ*¨3Ó/ˆFØ—{‘{ˆHØ�}�}ˆ} §¡×!4Ñ!4Ó!6¸+Ô!EÜ—7‘7˜d”?Ü$Ð$Ø §¡˜¨x¨jÐ9�Ü—.‘.×-Ñ-¨hÓ7‰CÜ�W‰W˜Œ_åFá'¨Ó,ˆCÜ)¨#Ô7ˆ	÷ ˜s cœz°)×2BÑ2B×2DÒ2DÜ+¬F¯L©L×,@Ñ,@ÀÓ,EÈ3ÔOˆGØ�~‰~×ÒØ#�	ØÐøÜ”\¤:Ð.ô DÜ¨°NÔCÐCðDús    Á$F3 Á3<F3 Â0B>F3 Å/AF3 Æ3$Gc                ó>   € V ^8„  d   QhR\         R\         R,          /# )r   r5   r(   Nr   )r   s   "r   r   r   I   s"   € ÷ Iñ I¤Tð I¬d°T­kñ Ir   c                ó^   € ^ RI HpHp ^ RIHp V! 4        V! 4       '       g   R# V! V RR7      # )a0  One translation attempt under whatever scope is bound; None off the docker backend.

The gate keeps a local-backend gateway with leftover ``docker_volumes`` from serving
mount sources in place of real host files. Quiet: fs callers also see ordinary host
paths, which are not MEDIA misses worth a warning.)Ú_docker_env_activeÚ&_translate_docker_container_media_path)Ú_ensure_terminal_env_bridgedNT)Úquiet)Úgateway.platforms.baser_   r`   Útools.terminal_toolra   )r5   r_   r`   ra   s   &   r   Ú_translate_agent_pathre   I   s*   € ÷ bÝ@á Ô"Ù×ÒÙÙ1°)À4ÔHÐHr   c                óL   € V ^8„  d   QhR\         R,          R\        R,          /# )r   Úprofile_homeNr(   )r   r
   )r   s   "r   r   r   Y   s"   € ÷ 3ñ 3¤D¨4¥Kð 3¼8ÀD½>ñ 3r   c              #  ó  "  € ^ RI Hp ^ RIHpHpHpHp ^ RIHpH	pH
p R;ršV eC   \        V 4      P                  4       V! 4       P                  4       8w  d   V! \        V 4      4      p	 V! 4       RJ;'       d,    V! 4       P                  4       V! 4       P                  4       8g  pV	f   V'       d   V! 4       f   V! V! 4       4      p
Rx € V
e	   V! V
4       V	e   V! V	4       R# R#   T
e	   T! T
4       T	e
   T! T	4       i i ; i5i)a‚  Bind the profile whose sandbox a container path names: its home and its terminal policy.

A requested ``profile_home`` other than the current home binds that home and its complete
terminal policy, as MEDIA delivery does (#109024). A home already bound by the caller (a
native profile ticket's override) gets its own terminal policy when no scope is bound, so
translation never reads the launch profile's ambient ``TERMINAL_DOCKER_VOLUMES``. An
override naming the launch home keeps the ambient env, which may carry env-only policy.
Translation and the unmapped-path classification both run inside this scope, so they
agree about the backend.
©Úget_hermes_home)Úget_hermes_home_overrideÚget_process_hermes_homeÚreset_hermes_home_overrideÚset_hermes_home_override)Úget_terminal_scopeÚinstall_profile_terminal_scopeÚreset_terminal_scopeN)Úhermes_cli.configrj   Úhermes_constantsrk   rl   rm   rn   Útools.terminal_scopero   rp   rq   r   r4   r*   )rg   rj   rk   rl   rm   rn   ro   rp   rq   Ú
home_tokenÚscope_tokenÚforeign_overrides   &           r   Ú_agent_path_scoperx   X   s  é € õ 2÷ó ÷ nÑmà#Ð#€JØÒ¤D¨Ó$6×$>Ñ$>Ó$@ÁOÓDU×D]ÑD]ÓD_Ô$_Ù-¬c°,Ó.?Ó@ˆ
ð
3Ù4Ó6¸dÐB÷ cð cÙ /Ó 1× 9Ñ 9Ó ;Ñ?VÓ?X×?`Ñ?`Ó?bÑ bð 	àÒ!×&6Ñ;MÓ;OÒ;WÙ8¹Ó9JÓKˆKÛàÒ"Ù  Ô-ØÒ!Ù& zÖ2ñ "øð Ò"Ù  Ô-ØÒ!Ù& zÕ2ð "üs*   ‚A&DÁ)C' Á97C' Â1C' ÃDÃ'DÄDrg   c                óX   € V ^8„  d   QhR\         R\        R,          R\        R,          /# ©r   r'   rg   Nr(   r)   )r   s   "r   r   r   {   s*   € ÷ $ñ $œsð $´T¸Dµ[ð $ÌDÐSWÍKñ $r   c               ó2  € V P                  R4      '       d.   V P                  R4      '       g   RV P                  R4      9   d   R#  ^ RIHp ^ RIHpHpHpHp \        V 4      p\        V4      ;_uu_ 4        \        V4      pVf
   V! 4       e   VuuRRR4       # V! V! V! 4       4      4      p	 \        V4      V! V	4       uuRRR4       #   T! T	4       i ; i  + '       g   i     R# ; i  \         d    \        P                  RT RR	7        R# i ; i)
aH  Map an agent-visible container path to its host bind mount, or None.

Docker agents emit container paths (``/workspace/...``, ``/root/...``) in
transcripts and MEDIA tags, while the dashboard fs routes stat the gateway
HOST filesystem (#85238). Reuse the gateway's MEDIA volume translator inside
``_agent_path_scope(profile_home)``. When no terminal scope is bound even
then (``serve --isolated`` after a failed early bridge), retry once under the
current profile's complete terminal policy, never replacing an already-bound
scope or refusal (retry from #104992).

Runs on the raw string, before host normalization: on a Windows gateway
``Path("/workspace/x").resolve()`` anchors to the current drive and the
container path is gone before translation sees it. ``..`` segments are never
translated, so the managed routes keep refusing them.
Ú/rB   ú..Nri   )Úbuild_profile_terminal_scopero   rq   Úset_terminal_scopez.agent container path translation failed for %sT©Úexc_info)rI   Úsplitrr   rj   rt   r~   ro   rq   r   r   rx   re   Ú	ExceptionÚloggerÚdebug)
r'   rg   rj   r~   ro   rq   r   r5   Ú
translatedÚtokens
   &$        r   Ú_agent_container_pathrˆ   {   sð   € ð  �>‰>˜#×Ò #§.¡.°×"6Ò"6¸$À#Ç)Á)ÈCÃ.Ô:PÙðÝ5÷	
ó 	
ô ˜“Iˆ	Ü˜|×,Õ,Ü.¨yÓ9ˆJØÒ%Ñ);Ó)=Ò)IØ!÷ -Ò,ñ 'Ñ'CÁOÓDUÓ'VÓWˆEð,Ü,¨YÓ7á$ UÔ+÷ -Ò,øñ % UÕ+ú÷ -×,Ð,ûô ô Ü�‰ÐEÀsÐUYˆÔZÚðúsT   Á0C/ Á8CÂ
C/ ÂCÂ1
CÂ;CÃ
C/ Ã
CÃCÃC,	Ã&C/ Ã,C/ Ã/#DÄDzNFile not found on the gateway host: the path may live inside the agent sandboxc                ód   € V ^8„  d   QhR\         R\         R,          R\        R,          R\        /# )r   r:   r%   Nrg   r(   r)   )r   s   "r   r   r   ¥   s4   € ÷ 'ñ 'Üð'Ü �:ð'Ü<@À4½Kð'ä	ñ'r   c               óŽ  € \        T ;'       g    R4      P                  4       p\        P                  R8w  dN   \	        WR7      p\        P
                  ! V\        P                  4      '       d   V# \        W2R7      pVe   V# T# \        W2R7      pVe   V# \        W2R7      '       d   \        R\        R7      h\	        WR7      # )a¸  ``_fs_path`` for agent-facing reads; container paths resolve to their host
mount, so callers' boundary guards see the real host target.

POSIX: a readable host path wins, and translation only runs when the host
lookup misses, so a root-run gateway can still browse its own ``/root``.
Windows: a container-shaped path never names a host file (it would anchor to
the current drive), so a translation miss is a 404 rather than a drive lookup.
r<   rA   rE   )rg   é”  r-   )r*   rG   rO   rP   r\   ÚaccessÚR_OKrˆ   Ú_is_unmapped_container_pathr   ÚSANDBOX_NOT_FOUND)r:   r%   rg   r'   Úhostr†   s   &$$   r   Ú_agent_fs_pathr‘   ¥   s    € ô ˆh�nˆn˜"Ó
×
#Ñ
#Ó
%€CÜ	‡w�w�$„Ü˜Ô*ˆÜ�9Š9�Tœ2Ÿ7™7×#Ò#ØˆKÜ*¨3ÔJˆ
Ø'Ò3ˆzÐ=¸Ð=Ü& sÔF€JØÒØÐÜ" 3×BÓBÜ¨Ô4EÔFÐFÜ�HÔ&Ð&r   c                óJ   € V ^8„  d   QhR\         R\        R,          R\        /# rz   )r*   r   r   )r   s   "r   r   r   ¿   s+   € ÷ Oñ O¤Sð O¼4À$½;ð OÔRVñ Or   c               ó  a € S P                  R4      '       d   S P                  R4      '       d   R#  ^ RIHpHp ^ RIHp \        V4      ;_uu_ 4        V! 4       '       d   V! S 4      S 8w  d    RRR4       R# RR0R	 V! 4        4       mpRRR4       \        ;QJ d    T 3R lX 4       F  '       g   K   R# 	  R# ! T 3R lX 4       4      #   + '       g   i     LJ; i  \         d    \        P                  R
S RR7        R# i ; i)zÜA docker-backend container path (``/workspace``, ``/root`` or a configured
volume target) rather than a host path or a typo elsewhere on the host. Reads
the backend and volumes in the same profile scope translation used.r|   rB   F)r_   Ú_parse_docker_volume_mountsrC   Nz
/workspacez/rootc              3   óF   "  € T F  w  rVP                  4       x € K  	  R # 5i©N)Úas_posix)Ú.0Ú_Úcs   &  r   Ú	<genexpr>Ú._is_unmapped_container_path.<locals>.<genexpr>Ì   s   é € Ð-eÑGd¹t¸q¨a¯j©j¯l¨lÓGdùs   ‚!z+container path classification failed for %sTr€   c              3   óŒ   <"  € T F9  pSV8H  ;'       g(    SP                  VP                  R 4      R ,           4      x € K;  	  R# 5i)r|   N)rI   Úrstrip)r˜   Úrr'   s   & €r   r›   rœ   Ð   s6   øé € ÐNÉÀ1ˆs�a‰x×>Ð>˜3Ÿ>™>¨!¯(©(°3«-¸#Õ*=Ó>Ô>Ëùs
   ƒA”0A)rI   rc   r_   r”   rT   rD   rx   rƒ   r„   r…   Úany)r'   rg   r_   r”   rD   Úrootss   f$    r   rŽ   rŽ   ¿   s×   ø€ ð �>‰>˜#×Ò #§.¡.°×"6Ò"6Ùð
ßZÝBä˜|×,Õ,Ù%×'Ò'Ñ+@ÀÓ+EÈÔ+LØ÷ -Ñ,ð " 7ÐfÑ-eÑGbÔGdÓ-eÐfˆE÷ -÷ ‹3ÔNÉÓN�3Œ3ÐNŠ3ÐNˆ3ÔNÉÓNÓNÐN÷ -×,ûô ô Ü�‰ÐBÀCÐRVˆÔWÚðús;   ³!C! ÁCÁ0C! Á:CÂC! ÃC	ÃC! ÃC! Ã!#DÄDÚrequire_existsFc                ó<   € V ^8„  d   QhR\         R\        R\         /# )r   rM   r¢   r(   r   )r   s   "r   r   r   Ó   s&   € ÷ Dñ Dœ$ð D´4ð DÄDñ Dr   c                óÈ   €  V P                  4       P                  VR 7      #   \         d    T'       d   \        RRR7      hh \        \
        3 d    \        RRR7      hi ; i)r0   r‹   zPath not foundr-   r,   r>   )r2   r4   ÚFileNotFoundErrorr   rW   rX   )rM   r¢   s   &$r   Ú_canonical_pathr¦   Ó   sb   € ðDØ�‰Ó ×(Ñ(°Ð(Ó?Ð?øÜô ßÜ¨CÐ8HÔIÐIØÜ”\Ð"ô DÜ¨°NÔCÐCðDús   ‚" ¢A!µA!ÁA!c                óF   € V ^8„  d   QhR\         \        ,          R\        /# )r   r:   r(   r)   )r   s   "r   r   r   Þ   s   € ÷ 	ñ 	¤3¬¥:ð 	´$ñ 	r   c                 ó  € \        V 4      P                  4       p VP                  R R R7       VP                  4       pTP                  4       '       g   \        RRR7      hT#   \        \
        3 d   p\        RRT 2R7      hRp?ii ; i)T)ÚparentsÚexist_okéô  z#Managed files root is unavailable: r-   Nz%Managed files root is not a directory)r   r2   Úmkdirr4   rW   rX   r   Úis_dir)r:   ÚrootÚresolvedÚexcs   &   r   Ú_ensure_managed_rootr±   Þ   s‡   € Ü�‹>×$Ñ$Ó&€DðaØ�
‰
˜4¨$ˆ
Ô/Ø—<‘<“>ˆð �?‰?×ÒÜ¨Ð4[Ô\Ð\Ø€Oøô	 ”\Ð"ô aÜ¨Ð6YÐZ]ÐY^Ð4_Ô`Ð`ûðaús   ›#A# Á#B	Á4BÂB	c                ó<   € V ^8„  d   QhR\         R\         R\        /# ©r   r®   Útargetr(   r   )r   s   "r   r   r   ê   s!   € ÷ 4ñ 4œð 4¤tð 4´ñ 4r   c                 ó6   € W8H  ;'       g    WP                   9   # r–   )r©   )r®   r´   s   &&r   Ú_path_is_underr¶   ê   s   € Ø‰>×3Ð3˜T§^¡^Ñ3Ð3r   c                ó>   € V ^8„  d   QhR\         R,          R\         /# )r   r:   Nr(   )r*   )r   s   "r   r   r   î   s   € ÷ ñ œ˜t�ð ¬ñ r   c                 ót   € \        T ;'       g    R 4      P                  4       pRV9   d   \        RRR7      hV# )r<   r=   r,   r>   r-   )r*   rG   r   )r:   Útexts   & r   Ú
_path_textrº   î   s4   € Üˆx�~ˆ~˜2Ó×$Ñ$Ó&€DØ�„~Ü¨°NÔCÐCØ€Kr   c                ó$   € V ^8„  d   QhR\         /# ©r   r(   ©r   )r   s   "r   r   r   õ   s   € ÷ 
.ñ 
.¬$ñ 
.r   c                  ól  € \         P                  P                  R R4      P                  4       p V '       g   R#  ^ RIHp V! 4       P                  4       P                  RR7      pV\        8H  #   \        \        3 d5    \        T 4      P                  4       P                  RR7      p T\        8H  # i ; i)ÚHERMES_HOMEr<   F)Úget_default_hermes_rootr0   )rO   ÚenvironÚgetrG   rs   rÀ   r2   r4   rW   rX   r   Ú_HOSTED_MANAGED_FILES_ROOT)r'   rÀ   r®   s      r   Ú _default_hermes_root_is_opt_datarÄ   õ   sœ   € Ü
�*‰*�.‰.˜¨Ó
+×
1Ñ
1Ó
3€CßÙð<Ý<á&Ó(×3Ñ3Ó5×=Ñ=ÀUÐ=ÓKˆð Ô-Ñ-Ð-øô ”\Ð"ô <Ü�C‹y×#Ñ#Ó%×-Ñ-°UÐ-Ó;‰ØÔ-Ñ-Ð-ð<ús   º+A. Á.:B3Â2B3c                ó$   € V ^8„  d   QhR\         /# r¼   r½   )r   s   "r   r   r     s   € ÷ ñ ´Dñ r   c                 óÚ   € ^ RI Hp  ^ RIHp \	        4       '       d   R#  ^ RIHp V! 4       '       g   R#   T! T 4      R8X  d   R#  R#   \         d     R# i ; i  \         d     R# i ; i)uX  True when the dashboard should not offer ``hermes update``.

Containerized dashboards are updated by the outer launcher/image â€” except a
``git`` install (bind-mounted checkout, e.g. the hermes-webui image), where
the update button is the correct path. pip stays blocked in containers: its
apply path mutates the running container filesystem.
)ÚPROJECT_ROOT)Údetect_install_methodT)Úis_containerFÚgit)Úhermes_cli.web_serverrÇ   rr   rÈ   rÄ   rs   rÉ   rƒ   )rÇ   rÈ   rÉ   s      r   Ú*_dashboard_local_update_managed_externallyrÌ     sv   € õ 3Ý7Ü'×)Ò)ÙðÝ1á�~Š~Ùð ðÙ  Ó.°%Ô7Ùð 8ñ øô ô Úðûô
 ô ØÙðús"    A	 ·A Á	AÁAÁA*Á)A*Úcreate_rootc                óR   € V ^8„  d   QhR\         \        ,          R\        R\        /# )r   rR   rÍ   r(   )r   r   r   r   )r   s   "r   r   r     s,   € ÷ Yñ Y¤8¬GÕ#4ð YÄdð YÔVhñ Yr   c                óª  € \         P                  P                  \        R 4      P	                  4       pV'       d5   V'       d   \        V4      M\        \        V4      4      p\        W3RR7      # \        4       '       d+   V'       d   \        \        4      M\        p\        W3RR7      # \        \        P                  ! 4       4      p\        VRRR7      # )r<   F)r   r   r   NT)rO   rÁ   rÂ   Ú_MANAGED_FILES_ROOT_ENVrG   r±   r¦   r   r   rÄ   rÃ   Úhome)rR   rÍ   Úraw_forced_rootr®   rÑ   s   &$   r   Ú_managed_files_policyrÓ     s–   € Ü—j‘j—n‘nÔ%<¸bÓA×GÑGÓI€Oßß8CÔ# OÔ4ÌÔY]Ð^mÓYnÓIoˆÜ!¨tÐW\Ô]Ð]ô
 (×)Ò)ßCNÔ#Ô$>Ô?ÔTnˆÜ!¨tÐW\Ô]Ð]äœ4Ÿ9š9›;Ó'€DÜ¨4¸TÐSWÔXÐXr   Ú	for_writeÚfor_agent_readc                óŽ   € V ^8„  d   QhR\         R,          R\        R\        R\        R\        \        \
        \         3,          /# )r   r:   NrR   rÔ   rÕ   r(   )r*   r   r   Útupler   r   )r   s   "r   r   r   .  sG   € ÷ *+ñ *+Ü�D�jð*+Ü#*ð*+Ü:>ð*+äð*+ô Ôœt¤SÐ(Õ)ñ*+r   c                óZ  € \        V4      p\        V 4      pVP                  pV'       dz   V'       dr   VP                  R 4      '       g[   \        P
                  R8X  g,   \        P                  ! V\        P                  4      '       g   \        V4      pVe   \        V4      pVe   V'       d   VR9   d   TpMÏV'       g   VP                  pMº\        V4      P                  4       pVe{   VP                  4       '       ge   \        ;QJ d&    R VP                   4       F  '       g   K   RM	  RM! R VP                   4       4      '       d   \!        RRR7      hWh,          pM#VP                  4       '       g   \!        RRR7      hR	VP                  9   d   \!        RRR7      hV'       d?   VP#                  4       '       g)   \%        VP&                  4      p	W˜P
                  ,          p
M\%        W‚'       * R
7      p
Ve   \)        Wj4      '       g   \!        RRR7      hWJ\        V
4      3# )r?   rA   c              3   ó*   "  € T F	  qR 8H  x € K  	  R# 5i)r}   Nr   )r˜   Úparts   & r   r›   Ú(_resolve_managed_path.<locals>.<genexpr>F  s   é € Ð<©O D˜4–<«Oùs   ‚TFr,   zPath cannot contain '..'r-   zPath must be absoluter}   )r¢   é“  úPath outside managed files root>   Ú.r|   )rÓ   rº   r   rI   rO   rP   rŒ   r�   rˆ   r*   r   r   r2   r3   r    Úpartsr   rU   r¦   Úparentr¶   )r:   rR   rÔ   rÕ   Úpolicyr¹   r®   r†   r5   rà   r¯   s   &&$$       r   Ú_resolve_managed_pathrâ   .  s”  € ô # 7Ó+€FÜ�hÓ€DØ×Ñ€DçŸ$ t§¡°w×'?Ò'?Ü�G‰G�tŒO¤2§9¢9¨T´2·7±7×#;Ò#;ô +¨4Ó0ˆ
ØÒ!Ü�z“?ˆDàÒ§¨°Ô);Ø‰	ßØ×'Ñ'‰	ä˜“J×)Ñ)Ó+ˆ	ØÒ I×$9Ñ$9×$;Ò$;ß‹sÑ<¨I¯OªOÓ<�s�sŠsÑ<¨I¯OªOÓ<×<Ò<Ü#°Ð<VÔWÐWØÕ(‰IØ×&Ñ&×(Ò(Ü¨CÐ8OÔPÐPàˆy�‰ÔÜ¨Ð4NÔOÐOç˜×)Ñ)×+Ò+Ü  ×!1Ñ!1Ó2ˆØŸN™NÕ*‰ä" 9¼]ÔKˆàÒ¤¨t× >Ò >Ü¨Ð4UÔVÐVàœS ›]Ð*Ð*r   c                óR   € V ^8„  d   QhR\         R\        \        \        3,          /# )r   rá   r(   )r   Údictr*   r   )r   s   "r   r   r   [  s'   € ÷ hñ hÔ#5ð h¼$¼sÄC¸x½.ñ hr   c                 óp   € V P                   e   \        V P                   4      MR pRVRVRV P                  /# )Nr®   r   r   )r   r*   r   )rá   r   s   & r   Ú_managed_response_metaræ   [  s;   € Ø-3×-?Ñ-?Ò-K”#�f×(Ñ(Ô)ÐQU€KØ�K °Ð=NÐPV×PfÑPfÐgÐgr   c                ó<   € V ^8„  d   QhR\         R\         R\        /# r³   r   )r   s   "r   r   r   `  s&   € ÷ Uñ U¤$ð U´ð U¼ñ Ur   c                 óŽ   € ^ RI Hp \        V4      p\        W4      ;'       d#    V! V4      '       * ;'       d    V! V4      '       * # )é    )Ú_is_sensitive_path)Úhermes_cli.web_routers.filesrê   r¦   r¶   )r®   r´   rê   r¯   s   &&  r   Ú_hosted_fs_path_allowedrì   `  sK   € Ý?ä˜vÓ&€HÜ˜4Ó*÷ Tð TÙ& vÓ.Ô.÷Tð TÙ7IÈ(Ó7SÔ3SðUr   c                ó`   € V ^8„  d   QhR\         R\        \        ,          R\         R,          /# )r   r´   rR   r(   N)r   r   r   )r   s   "r   r   r   h  s+   € ÷ 	ñ 	¤$ð 	´¼'Õ1Bð 	ÌdÐUYÍkñ 	r   c                óx   € \        VRR7      P                  pVe   \        W 4      '       g   \        RRR7      hV# )zÜPreview and Git reads share managed-file restrictions on locked deployments.

``request`` is unused (the policy is env/home driven) and optional so the
route functions stay callable directly, e.g. from agent-side tests.
F)rÍ   rÜ   z)Path is outside the managed read boundaryr-   )rÓ   r   rì   r   )r´   rR   r®   s   && r   Ú_hosted_fs_read_guardrï   h  s:   € ô ! °eÔ<×HÑH€DØÒÔ 7¸× EÒ EÜ¨Ð4_Ô`Ð`Ø€Kr   Úskip_missingc          
      óx   € V ^8„  d   QhR\         R\        R\        R\        \        \
        3,          R,          /# )r   rá   r´   rð   r(   N)r   r   r   rä   r*   r   )r   s   "r   r   r   t  s9   € ÷ ;ñ ;Üð;Ü(,ð;Ü?Cð;ä	Œ#Œsˆ(…^�dÕñ;r   c               ó  €  VP                  4       pRpTP	                  4       '       d    TP                  4       pT P                  e*   \        T P                  T4      '       g   \        RRR7      hTf    TP                  4       p\
        P                  ! TP                  4      pT'       d   RM0\        P                  ! TP                  4      ^ ,          ;'       g    RpRTP                  ;'       g     TP                  ;'       g    \        T4      R\        T4      R	TRT'       d   RMTP                   RTP"                  RT/#   \        \        3 d    \        RRR7      hi ; i  \         d®    T P                  eS   \        T P                  TP                  P                  4       TP                  ,          4      '       g   \        RRR7      hRTP                  ;'       g     TP                  ;'       g    \        T4      R\        T4      R	R
RRRRRRRR/u # \         d     ELói ; i  \         d$   pT'       d    Rp?R# \        RRT 2R7      hRp?i\         d   p\        RRT 2R7      hRp?ii ; i)zNDescribe an entry; listings may skip vanished files, while writes stay strict.r,   r>   r-   NrÜ   rÝ   rP   rM   Úis_directoryFÚbroken_linkTÚsizeÚmtimeÚ	mime_typer«   zCould not stat path: zapplication/octet-stream)r4   rW   rX   r   Ú
is_symlinkÚstatr¥   r   r¶   rà   rP   r*   ÚS_ISDIRÚst_modeÚ	mimetypesÚ
guess_typeÚst_sizeÚst_mtime)rá   r´   rð   r¯   Ústr°   r­   r÷   s   &&$     r   Ú_managed_file_entryr  t  s7  € ðDØ—>‘>Ó#ˆð 
€BØ×Ñ×Òð	Ø—‘“ˆBð( ×ÑÒ%¬n¸V×=OÑ=OÐQY×.ZÒ.ZÜ¨Ð4UÔVÐVà	‚zð	WØ—‘“ˆBô �\Š\˜"Ÿ*™*Ó%€Fß‘¤Y×%9Ò%9¸(¿-¹-Ó%HÈÕ%K×%iÐ%iÐOi€Ià�—‘×=Ð=˜xŸ}™}×=Ð=´°H³Ø”�H“Ø˜ØŸ‘ B§J¡JØ�—‘Ø�Yðð øô] ”\Ð"ô DÜ¨°NÔCÐCðDûô !ô 	ð ×!Ñ!Ò-´nØ×"Ñ" F§M¡M×$9Ñ$9Ó$;¸f¿k¹kÕ$I÷7ò 7ô $°Ð<]Ô^Ð^à˜Ÿ™×EÐE x§}¡}×EÐE¼¸H»Øœ˜F›Ø Ø˜tØ˜Ø˜Ø˜Tðò ô ô 	Úð	ûô !ô 	WßÝÜ¨CÐ:OÐPSÈuÐ8UÔVÐVûÜô 	WÜ¨CÐ:OÐPSÈuÐ8UÔVÐVûð	Wúse   ‚E «E* Á7H2 ÅE'Å*A>H/Ç)H/Ç="H/È!H/È*H/È.H/È2I>È=IÉIÉI>É(I>É)I9É9I>r–   )/Ú__doc__Úloggingrü   rO   rù   Úurllib.requestrJ   Ú
contextlibr   Údataclassesr   Úfastapir   r   Úpathlibr   Útypingr   r	   r
   r   Ú	getLoggerr   r„   rÐ   rÃ   r   r7   r\   re   rx   rˆ   r�   r‘   rŽ   r¦   r±   r¶   rº   rÄ   rÌ   rÓ   râ   ræ   rì   rï   r  r   r   r   Ú<module>r     sQ  ðñó Û Û 	Û Û Ý %Ý !ß *Ý ß 0Ó 0à	×	Ò	˜8Ó	$€à7Ð Ù! +Ó.Ð ñ �$Ô÷ð ó ðð+¸÷ +ð D°ð  DÈt÷  DõFIð ö3ó ð3ðD$À4÷ $ðN eÐ ð'Ø(,ð'ØJN÷'ð4OÈ÷ Oð(D¸%÷ Dõ	õ4õõ
.õð6YÈT÷ Yð"*+ØAFð*+à ÷*+õZhõ
U÷	ð;ØFK÷;ñ ;r   