+
    lHàj\C  ã                   ó2  € 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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Ht ^ RIHtHtHtHtHtHt ]P>                  ! ] 4      t!]PD                  R8g  t#]t$R	 R
 lt%RR R llt& ! R R]4      t'R# )zKSSH remote execution environment with ControlMaster connection persistence.N©ÚPath)ÚIterable)ÚBaseEnvironmentÚEnvironmentConnectionError)Ú_popen_bash)ÚFileSyncManagerÚiter_sync_filesÚquoted_mkdir_commandÚquoted_rm_commandÚunique_parent_dirs)Ú	bash_argvÚclient_env_withÚload_hermes_env_varsÚprepend_unsetÚresolve_passthrough_envÚrun_captureÚntc                ó   € V ^8„  d   QhRR/# ©é   ÚreturnN© )Úformats   "Ú;/home/ubuntu/.hermes/hermes-agent/tools/environments/ssh.pyÚ__annotate__r       s   € ÷ Uñ U˜tñ Uó    c                 óˆ   € R F;  p \         P                  ! V 4      '       d   K!  \        V P                  4        R24      h	  R# )z@Fail fast with a clear error when the SSH client is unavailable.zT is not installed or not in PATH. Install OpenSSH client: apt install openssh-clientN)ÚsshÚscp)ÚshutilÚwhichÚRuntimeErrorÚupper)Útools    r   Ú_ensure_ssh_availabler%       s@   € ãˆÜ�|Š|˜D×!Ô!Ü $§*¡*£, ð 0Tð  Tó Uð Uó r   c                óH   € V ^8„  d   QhR\         R\         R\         R\        /# )r   ÚreasonÚsubjectÚwhatr   )Ústrr   )r   s   "r   r   r   (   s/   € ÷ Zñ Zœð Z¤cð Z´ð ZÔPjñ Zr   c                 ó&   € \        W R V R2R7      # )u    failed â€” verify z is healthy, then retry.©Ú
retry_hint)r   )r'   r(   r)   s   &&&r   Ú_sync_errorr.   (   s#   € Ü%Ø˜YÐ&9¸$¸Ð?WÐXôZð Zr   c                   ój  a a€ ] tR t^-t oRtRtRtR)V3R lV 3R llltV3R lR ltV3R lR	 lt	V3R
 lR lt
R*V3R lR lltV3R lR ltV3R lR ltR tV3R lR ltV3R lR ltV3R lR ltV3R lR ltV3R lR ltV3R lR ltV3R  lR! ltR"RR#^xR$R/V3R% lR& lltR' tR(tVtV ;t# )+ÚSSHEnvironmenta'  Run commands on a remote machine over SSH.

Spawn-per-call: every execute() spawns a fresh ``ssh ... bash -c`` process.
Session snapshot preserves exported env vars across calls (unless
``persistent=False``); CWD persists via in-band
stdout markers. Uses SSH ControlMaster for connection reuse.
TFc                óP   <€ V ^8„  d   QhRS[ RS[ RS[ RS[RS[RS[ RS[RS[R	S[/	# )
r   ÚhostÚuserÚcwdÚtimeoutÚportÚkey_pathÚ
probe_onlyÚ
sync_filesÚ
persistent)r*   ÚintÚbool)r   Ú__classdict__s   "€r   r   ÚSSHEnvironment.__annotate__;   sR   ø€ ÷ ñ ™Sð ©ð ±#ð ÙðÙ*-ðÙ>Aðá!ðá7;ðáPTñr   c
                óˆ  <a € \         SS `  W4V	R 7       WWV3w  S n        S n        S n        S n        \        \        P                  ! 4       4      R,          S n	        S P                  P                  RRR7       V RV RV 2p
V'       d   V
 RS P                   2p
\        P                  ! V
P                  4       4      P                  4       R,          pS P                  V R2,          S n        \#        4        S P%                  4        V'       d
   R	S n        R	# R
S n        S P+                  4       S n        R	S n        V'       dn   S P/                  4        \1        V 3R lS P2                  S P4                  S P6                  S P8                  R7      S n        S P&                  P;                  RR7       S P=                  4        R	# ))r4   r5   Úpersist_envz
hermes-sshT)ÚparentsÚexist_okÚ@Ú:z:probe::Né   Nú.sockNFc                  ó4   <€ \        S P                   R 24      # )ú/.hermes)r	   Ú_remote_home©Úselfs   €r   Ú<lambda>Ú)SSHEnvironment.__init__.<locals>.<lambda>V   s   ø€ ¤_¸×8IÑ8IÐ7JÈ(Ð5SÔ%Tr   )Úget_files_fnÚ	upload_fnÚ	delete_fnÚbulk_upload_fnÚbulk_download_fn)Úforce)ÚsuperÚ__init__r2   r3   r6   r7   r   ÚtempfileÚ
gettempdirÚcontrol_dirÚmkdirÚ_session_idÚhashlibÚsha256ÚencodeÚ	hexdigestÚcontrol_socketr%   Ú_establish_connectionÚ_sync_managerÚ_remote_home_detectedÚ_detect_remote_homerI   Ú_ensure_remote_dirsr   Ú_scp_uploadÚ_ssh_deleteÚ_ssh_bulk_uploadÚ_ssh_bulk_downloadÚsyncÚinit_session)rK   r2   r3   r4   r5   r6   r7   r8   r9   r:   Ú
socket_keyÚ
_socket_idÚ	__class__s   f&&&&&&&&&  €r   rU   ÚSSHEnvironment.__init__;   s  ù€ ô 	‰Ñ˜S¸zÐÔJØ9=ÀTÐ9SÑ6ˆŒ	�4”9˜dœi¨¬Ü¤× 3Ò 3Ó 5Ó6¸ÕEˆÔØ×Ñ×Ñ t°dÐÔ;ð
 �v˜Q˜t˜f A d VÐ,ˆ
ßØ&˜< w¨t×/?Ñ/?Ð.@ÐAˆJÜ—^’^ J×$5Ñ$5Ó$7Ó8×BÑBÓDÀSÕIˆ
Ø"×.Ñ.°J°<¸uÐ1EÕEˆÔÜÔØ×"Ñ"Ô$ßØ!%ˆDÔÙØ%*ˆÔ"Ø ×4Ñ4Ó6ˆÔØ!ˆÔßØ×$Ñ$Ô&Ü!0ÜTØ×*Ñ*°d×6FÑ6FØ#×4Ñ4Àt×G^ÑG^ô"`ˆDÔð ×Ñ×#Ñ#¨$Ð#Ô/Ø×ÑÖr   c                ó:   <€ V ^8„  d   QhRS[ S[R3,          RS[/# )r   Úsend_env.r   )Útupler*   r   )r   r=   s   "€r   r   r>   \   s'   ø€ ÷ 
Añ 
A©E±#°s°(­Oð 
AÁñ 
Ar   c                ó  € \        V P                  4      pV'       g   V# \        P                  ! RP	                  V4      P                  4       4      P                  4       R,          pVP                  VP                  R,           V R24      # )a  One ControlMaster per SendEnv name-set, beside the plain target socket: a mux master only
relays the env names it was itself started with and silently drops the rest, so a passthrough
command must ride a master that knows its names. scp/sync/probes keep the plain socket.Ú ºNé   NrF   )	r   r_   r[   r\   Újoinr]   r^   Ú	with_nameÚstem)rK   rp   ÚplainÚdigests   &&  r   Ú_control_socket_forÚ"SSHEnvironment._control_socket_for\   so   € ô �T×(Ñ(Ó)ˆßØˆLô —’ §¡¨Ó 2× 9Ñ 9Ó ;Ó<×FÑFÓHÈÕLˆØ�‰ %§*¡*¨R¥.Ð!1°&°¸Ð?Ó@Ð@r   c                ó0   <€ V ^8„  d   QhRS[ S[,          /# ©r   r   )Úlistr   )r   r=   s   "€r   r   r>   h   s   ø€ ÷ =ñ =¡$¡t¥*ñ =r   c                ó   a€ \        V P                  4      oSP                  P                  4       '       d9   \	        SP                  P                  SP                  R,           R24      4      M. pS.V3R lV 4       O# )zNThe plain socket plus every SendEnv-set sibling (shared 8-char target prefix).rt   z*.sockc              3   ó8   <"  € T F  qS8w  g   K  Vx € K  	  R # 5i©Nr   )Ú.0Úsry   s   & €r   Ú	<genexpr>Ú2SSHEnvironment._control_sockets.<locals>.<genexpr>l   s   øé € Ð;¡H˜q°U±
Ÿš£Hùs   ƒ�
)r   r_   ÚparentÚis_dirÚsortedÚglobrx   )rK   Úsiblingsry   s   & @r   Ú_control_socketsÚSSHEnvironment._control_socketsh   se   ø€ ä�T×(Ñ(Ó)ˆØKPÏ<É<×K^ÑK^×K`ÒK`”6˜%Ÿ,™,×+Ñ+¨u¯z©z¸"­~Ð.>¸fÐ,EÓFÔGÐfhˆØÐ<Ô;¡HÓ;Ð<Ð<r   c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   Ú	port_flagr   )r*   r   )r   r=   s   "€r   r   r>   n   s   ø€ ÷ Hñ H¡sð H©tñ Hr   c                ó²   € V P                   ^8w  d   V\        V P                   4      .M. pY P                  '       d   RV P                  .,           # . ,           # )z7Port/key flags shared by ssh (``-p``) and scp (``-P``).z-i)r6   r*   r7   )rK   r�   Úflagss   && r   Ú_target_flagsÚSSHEnvironment._target_flagsn   sB   € à/3¯y©y¸B¬�œC §	¡	›NÑ+ÀBˆØ··°˜˜tŸ}™}Ð-ÕGÐGÀBÕGÐGr   Nc                óJ   <€ V ^8„  d   QhRS[ R,          RS[S[,          RS[ /# )r   Ú
extra_argsNrp   r   )r   r   r*   )r   r=   s   "€r   r   r>   s   s,   ø€ ÷ ñ ©T°D­[ð É8ÑTWÍ=ð Ñbfñ r   c                ó¾  € \        \        V4      4      pR .p\        '       d*   VP                  RRV P	                  V4       2RRRR.4       VP                  . RO4       VP                  R V 4       4       VP                  V P                  R4      4       TP                  T;'       g    . 4       VP                  V P                   RV P                   24       V# )	r   ú-oúControlPath=zControlMaster=autozControlPersist=300c              3   ó@   "  € T F  pR RV 23 F  q"x € K  	  K  	  R# 5i)r—   zSendEnv=Nr   )rƒ   ÚnameÚargs   &  r   r…   Ú4SSHEnvironment._build_ssh_command.<locals>.<genexpr>{   s%   é € ÐQ¡8˜4¸ÀÈÈÐ>OÓ7P°”3Ñ7P‘3£8ùs   ‚z-prC   )r—   zBatchMode=yesr—   z StrictHostKeyChecking=accept-newr—   zConnectTimeout=10)	rq   r‰   Ú_SSH_MULTIPLEXÚextendr{   r’   Úappendr3   r2   )rK   r•   rp   Úcmds   &&& r   Ú_build_ssh_commandÚ!SSHEnvironment._build_ssh_commands   sÀ   € Üœ Ó)Ó*ˆØˆgˆß‹>Ø�J‰J˜ ¨T×-EÑ-EÀhÓ-OÐ,PÐQØÐ2°DÐ:NðPô Qà�
‰
ÒoÔpà�
‰
ÑQ¡8ÓQÔQØ�
‰
�4×%Ñ% dÓ+Ô,Ø�
‰
�:×#Ð# Ô$Ø�
‰
�d—i‘i�[  $§)¡) Ð-Ô.Øˆ
r   c                ó@   <€ V ^8„  d   QhRS[ RS[RS[P                  /# )r   Ú
remote_cmdr5   r   )r*   ÚfloatÚ
subprocessÚCompletedProcess)r   r=   s   "€r   r   r>   �   s-   ø€ ÷ Vñ V¡3ð V±ð V¹:×;VÑ;Vñ Vr   c                óH   € \        V P                  4       V.,           VR7      # )zORun one remote shell command over the multiplexed connection, capturing output.©r5   )r   r¡   )rK   r¤   r5   s   &&&r   Ú_run_sshÚSSHEnvironment._run_ssh�   s   € ä˜4×2Ñ2Ó4¸
°|ÕCÈWÔUÐUr   c          
      ó6   <€ V ^8„  d   QhRS[ RS[RS[ RS[ RR/# )r   r¤   r5   r'   r(   r   N)r*   r¥   )r   r=   s   "€r   r   r>   …   s9   ø€ ÷ Mñ M©3ð M¹ð MÉð MÑVYð MÐ^bñ Mr   c                óž   € V P                  WR 7      pVP                  ^ 8w  d*   \        V RVP                  P	                  4        2V4      hR# )r©   z: N)rª   Ú
returncoder.   ÚstderrÚstrip)rK   r¤   r5   r'   r(   Úresults   &&&&& r   Ú_run_ssh_checkedÚSSHEnvironment._run_ssh_checked…   sK   € Ø—‘˜z�Ó;ˆØ×Ñ Ô!Ü  ¨¨6¯=©=×+>Ñ+>Ó+@Ð*AÐBÀGÓLÐLñ "r   c           
     óð  €  V P                  R ^R7      pTP                  ^ 8w  du   TP                  P                  4       ;'       g    TP                  P                  4       p\        R	T 2RT P
                   R
T P                   RT P                   R2R7      hR#   \        P                   dE    \        RT P                   RT P
                   R2RT P
                   RT P                   R2R7      hi ; i)z!echo 'SSH connection established'r©   zSSH connection to rC   z
 timed outzCheck that z is up and reachable on port z& and that sshd is running, then retry.r,   zSSH connection failed: z  is up, sshd is running on port z, and uc    can log in with the configured key, then retry â€” the connection is re-established automatically.N)rª   r¦   ÚTimeoutExpiredr   r3   r2   r6   r®   r¯   r°   Ústdout)rK   r±   Ú	error_msgs   &  r   r`   Ú$SSHEnvironment._establish_connectionŠ   s  € ð	FØ—]‘]Ð#FÐPR�]ÓSˆFð ×Ñ Ô!ØŸ™×+Ñ+Ó-×FÐF°·±×1DÑ1DÓ1FˆIÜ,Ø)¨)¨Ð5Ø)¨$¯)©)¨Ð4TÐUY×U^ÑU^ÐT_Ð_eØ#Ÿy™y˜kð *NðNôPð Pñ "øô ×(Ñ(ô 	FÜ,Ø$ T§Y¡Y K¨q°·±°¸:ÐFØ)¨$¯)©)¨Ð4QÐRV×R[ÑR[ÐQ\ð ]Dð DôFð Fð	Fús   ‚B ÂAC5c                ó    <€ V ^8„  d   QhRS[ /# r~   ©r*   )r   r=   s   "€r   r   r>   š   s   ø€ ÷ Hñ H¡Sñ Hr   c                óü  € \         P                  ! \        4      ;_uu_ 4        V P                  R^
R7      pVP                  ^ 8X  dz   VP
                  P                  4       '       dZ   \        P                  RVP
                  P                  4       4       RV n	        VP
                  P                  4       uuRRR4       # RRR4       V P                  R8X  d   R# RV P                   2#   + '       g   i     L2; i)	z(Detect the remote user's home directory.z
echo $HOMEr©   zSSH: remote home = %sTNÚrootz/rootz/home/)Ú
contextlibÚsuppressÚ	Exceptionrª   r®   r¶   r°   ÚloggerÚdebugrb   r3   )rK   r±   s   & r   rc   Ú"SSHEnvironment._detect_remote_homeš   s°   € ä× Ò ¤×+Õ+Ø—]‘] <¸�]Ó<ˆFØ× Ñ  AÔ%¨&¯-©-×*=Ñ*=×*?Ò*?Ü—‘Ð4°f·m±m×6IÑ6IÓ6KÔLØ-1�Ô*Ø—}‘}×*Ñ*Ó,÷ ,×+Ò+ð Ÿ)™) vÔ-ˆwÐG°V¸D¿I¹I¸;Ð3GÐG÷ ,×+ús   £AC+Á(AC+Ã+C;	c                ó   <€ V ^8„  d   QhRR/# r   r   )r   r=   s   "€r   r   r>   ¤   s   ø€ ÷ "ñ " Tñ "r   c           	     ót   € V P                    R2pV P                  \        W R2V R2V R2.4      ^
R7       R# )z?Create base ~/.hermes directory tree on remote in one SSH call.rH   z/skillsz/credentialsz/cacher©   N)rI   rª   r
   )rK   Úbases   & r   rd   Ú"SSHEnvironment._ensure_remote_dirs¤   sP   € à×#Ñ#Ð$ HÐ-ˆØ�‰Ô*¨D°F¸'Ð2BÀtÀfÈLÐDYÐ^bÐ]cÐciÐ[jÐ+kÓlØ ð 	ö 	"r   c                ó*   <€ V ^8„  d   QhRS[ RS[ RR/# )r   Ú	host_pathÚremote_pathr   Nrº   )r   r=   s   "€r   r   r>   ª   s'   ø€ ÷ oñ o¡Sð o±sð o¸tñ or   c           
     ó  € V P                  R\        P                  ! \        \	        V4      P
                  4      4       2^
R7       R.\        '       d   RRV P                   2.M. ,           pW0P                  R4      WP                   RV P                   RV 2.,           ,          p\        V^R7      pVP                  ^ 8w  dB   \        R	VP                  P                  4        2R
V P                   RV P                   24      hR# )z0Upload a single file via scp over ControlMaster.z	mkdir -p r©   r   r—   r˜   z-PrC   rD   zscp failed: zFile sync to N)rª   ÚshlexÚquoter*   r   r‡   r�   r_   r’   r3   r2   r   r®   r.   r¯   r°   )rK   rÈ   rÉ   Úscp_cmdr±   s   &&&  r   re   ÚSSHEnvironment._scp_uploadª   sð   € à�‰˜	¤%§+¢+¬c´$°{Ó2C×2JÑ2JÓ.KÓ"LÐ!MÐNÐXZˆÔ[Ø�'Ï^Ë^˜d l°4×3FÑ3FÐ2GÐ$HÑIÐacÕdˆØ×%Ñ% dÓ+¨y¿Y¹Y¸KÀqÈÏÉÈÐSTÐU`ÐTaÐ:bÐ.cÕcÕcˆÜ˜W¨bÔ1ˆØ×Ñ Ô!Ü ¨V¯]©]×-@Ñ-@Ó-BÐ,CÐDÈÐVZ×V_ÑV_ÐU`Ð`aÐbf×bkÑbkÐalÐFmÓnÐnñ "r   c                óJ   <€ V ^8„  d   QhRS[ S[S[S[3,          ,          RR/# )r   Úfilesr   N)r   rq   r*   )r   r=   s   "€r   r   r>   ³   s0   ø€ ÷ BOñ BO¡d©5±±c°­?Õ&;ð BOÀñ BOr   c                óþ  € V'       g   R# V P                    R2p\        V4      pV'       d+   V P                  \        V4      ^RRV P                   24       \
        P                  ! RR7      ;_uu_ 4       pV Fß  w  rV \        P                  P                  Wb4      pTR	8X  g   TP                  R
4      '       d   \        RT: RT: 24      h\        P                  P                  YG4      p	\        P                  ! \        P                  P                  T	4      RR7        \        P                   ! \        P                  P#                  T4      T	4       Ká  	  V P-                  4       R\.        P0                  ! V4       2.,           p\2        P4                  ! RRRRVR	.\2        P6                  \2        P8                  \2        P8                  R7      p \2        P4                  ! W¼P:                  \2        P8                  \2        P8                  R7      pTP:                  PC                  4         TPE                  ^xR7      w  rïTPG                  4       f   TPE                  ^
R7      w  ppM/TPH                  '       d   TPH                  PK                  4       MRp TPP                  ^ 8w  d:   \        RTPP                   RTPS                  RR7      PU                  4        24      hTPP                  ^ 8w  dJ   \W        R TPP                   RTPS                  RR7      PU                  4        2R!T P                   2R"R#7      h RRR4       \X        P[                  R$\]        T4      4       R#   \         d   p\        RT: RT: 24      ThRp?ii ; i  \$         d6   p
\'        T
RR4      R8w  d   h \(        P*                  ! YY4        Rp
?
EKR  Rp
?
ii ; i  \<         d#    TP?                  4        TPA                  4        h i ; i  \2        PL                   dQ    YÍ3 F  pTP?                  4        K  	  YÍ3 F  pTPA                  4        K  	  \O        RRT P                   R2R7      hi ; i  + '       g   i     EL4; i)%z˜Upload many files in one tar-over-SSH stream: local ``tar c`` piped through one SSH
connection to remote ``tar x``, after a single batched ``mkdir -p``.NrH   zremote mkdir failedzRemote directory setup on zhermes-ssh-bulk-)Úprefixzremote path z is not under sync base Ú.z../z escapes sync base T)rB   Úwinerrori"  ztar xf - --no-overwrite-dir -C Útarz-chfÚ-z-C)Ústdinr¶   r¯   r©   r   zSSH bulk upload timed outzBulk file sync to u.    timed out â€” check the connection and retry.r,   ztar create failed (rc=z): Úreplace©Úerrorsz tar extract over SSH failed (rc=zFile sync over SSH to zthe connection)r)   z*SSH: bulk-uploaded %d file(s) via tar pipe)/rI   r   r²   r
   r2   rV   ÚTemporaryDirectoryÚosÚpathÚrelpathÚ
ValueErrorr"   Ú
startswithrv   ÚmakedirsÚdirnameÚsymlinkÚabspathÚOSErrorÚgetattrr    Úcopy2r¡   rË   rÌ   r¦   ÚPopenÚDEVNULLÚPIPEr¶   r¿   ÚkillÚwaitÚcloseÚcommunicateÚpollr¯   Úreadrµ   r   r®   Údecoder°   r.   rÀ   rÁ   Úlen)rK   rÐ   rÅ   rA   ÚstagingrÈ   rÉ   Ú
rel_remoteÚexcÚstagedÚeÚssh_cmdÚtar_procÚssh_procÚ_Ú
ssh_stderrÚtar_stderr_rawÚprocs   &&                r   rg   ÚSSHEnvironment._ssh_bulk_upload³   sä  € ÷ ÙØ×#Ñ#Ð$ HÐ-ˆÜ$ UÓ+ˆßØ×!Ñ!Ô"6°wÓ"?ÀÐEZØ$>¸t¿y¹y¸kÐ"JôLô ×(Ò(Ð0B×CÕCÀwÛ*/Ñ&�	ðpÜ!#§¡§¡°Ó!C�Jð  Ô$¨
×(=Ñ(=¸e×(DÒ(DÜ&¨°k±_ÐDWÐX\ÑW_Ð'`ÓaÐaÜŸ™Ÿ™ gÓ:�Ü—’œBŸG™GŸO™O¨FÓ3¸dÕCð4Ü—J’JœrŸw™wŸ™¨yÓ9¸6ÖBñ +0ð$ ×-Ñ-Ó/Ð5TÔUZ×U`ÒU`ÐaeÓUfÐTgÐ3hÐ2iÕiˆGÜ!×'Ò'¨°¸¸TÀ7ÈCÐ(PÔXb×XjÑXjÜ/9¯©ÄzÇÁôXˆHðÜ%×+Ò+¨G¿?¹?Ü3=·?±?Ì:Ï?É?ô\�ð �O‰O×!Ñ!Ô#ðoØ (× 4Ñ 4¸SÐ 4Ó A‘�à—=‘=“?Ò*Ø(0×(<Ñ(<ÀRÐ(<Ó(HÑ%�A‘~à?G¿¿¸ X§_¡_×%9Ñ%9Ô%;ÐTW‘Nð ×"Ñ" aÔ'Ü"Ð%;¸H×<OÑ<OÐ;PÐPSØ&4×&;Ñ&;À9Ð&;Ó&M×&SÑ&SÓ&UÐ%Vð$Xó Yð Yà×"Ñ" aÔ'Ü!Ð$DÀX×EXÑEXÐDYÐY\Ø%/×%6Ñ%6¸iÐ%6Ó%H×%NÑ%NÓ%PÐ$Qð#Sà$:¸4¿9¹9¸+Ð"FÐM]ô_ð _ð (÷a Dôh 	�‰ÐAÄ3ÀuÃ:ÖNøôa "ô pÜ&¨°k±_ÐD\Ð]aÑ\dÐ'eÓfÐloÐoûðpûô ô 4Ü˜q *¨dÓ3°tÔ;ØÜ—L’L ×3Ó3ûð4ûô ô Ø—‘”Ø—‘”Øðûô ×,Ñ,ô oØ%Ó0�DØ—I‘I–Kñ 1à%Ó0�DØ—I‘I–Kñ 1ä0Ø/Ø!3°D·I±I°;Ð>lÐmôoð oðoú÷K D×CÐCús¦   Á6Q+Á?M)ÂQ+Â<A'Q+Ä$4NÅA=Q+Ç?OÈQ+È0;PÉ+Q+É,PÉ>PÊB%Q+Í)N	Í4N	ÎN	ÎQ+ÎO	Î)O	ÏQ+ÏO	ÏQ+Ï-P Ð Q+ÐA%Q(Ñ(Q+Ñ+Q<	c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   Údestr   Nr   )r   r=   s   "€r   r   r>   ÷   s   ø€ ÷ Añ A¡tð A°ñ Ar   c                óf  € V P                    R2P                  R4      pV P                  4       R\        P                  ! V4       2.,           p\        VR4      ;_uu_ 4       p\        P                  ! V\        P                  V\        P                  ^xRR7      pRRR4       XP                  ^ 8w  då   VP                  P                  RR	7      P                  4       pVP                  4        Uu. uF  qwP                  4       '       g   K  VNK  	  ppVP                  ^8H  ;'       dH    \        V4      ;'       d5    \         ;QJ d    R
 V 4       F  '       d   K   RM	  RM! R
 V 4       4      p	V	'       g   \#        RV 2RV P$                   24      hR# R#   + '       g   i     EL; iu upi )z*Download remote .hermes/ as a tar archive.rH   Ú/z!tar cf - --exclude='*.sock' -C / ÚwbF)r×   r¶   r¯   r5   ÚcheckNrØ   rÙ   c              3   óB   "  € T F  qP                  R 4      x € K  	  R# 5i)z: socket ignoredN)Úendswith)rƒ   Úlines   & r   r…   Ú4SSHEnvironment._ssh_bulk_download.<locals>.<genexpr>	  s!   é € ð RPÙ>N°d—‘Ð0×1Ð1Ó>Nùs   ‚TzSSH bulk download failed: zFile sync from )rI   Úlstripr¡   rË   rÌ   Úopenr¦   Úrunré   rê   r®   r¯   rñ   r°   Ú
splitlinesr<   Úallr.   r2   )
rK   r  Úrel_baserø   Úfr±   r¯   r  Údiagnostic_linesÚ	tolerateds
   &&        r   rh   Ú!SSHEnvironment._ssh_bulk_download÷   s”  € ð ×'Ñ'Ð(¨Ð1×8Ñ8¸Ó=ˆð ×)Ñ)Ó+Ø/´·²¸HÓ0EÐ/FÐGð/Iõ Iˆä�$˜×Ô Ü—^’^ G´:×3EÑ3EÈaÔXb×XgÑXgÐqtð  }Bô  CˆF÷ à×Ñ Ô!Ø—]‘]×)Ñ)°Ð)Ó;×AÑAÓCˆFð 28×1BÑ1BÔ1DÓUÑ1D¨Ï
É
Ï§ Ñ1DÐÐUØ×)Ñ)¨QÑ.÷ Pð P´4Ð8HÓ3I÷ Pð PÏcËcñ RPÙ>NóRPÏcÏcÊcñ RPÙ>NóRPó OPˆIçÜ!Ð$>¸v¸hÐ"GØ$3°D·I±I°;Ð"?óAð Añ ñ "÷ ×Ðüò  Vs   Á"9FÃ0F.ÄF.ÆF+	c                ó4   <€ V ^8„  d   QhRS[ S[,          RR/# )r   Úremote_pathsr   N)r   r*   )r   r=   s   "€r   r   r>     s#   ø€ ÷ Eñ E©©S­	ð E°dñ Er   c                óZ   € V P                  \        V4      ^
RRV P                   24       R# )é
   zremote rm failedzRemote file cleanup on N)r²   r   r2   )rK   r  s   &&r   rf   ÚSSHEnvironment._ssh_delete  s,   € Ø×ÑÔ/°Ó=¸rÐCUØ 7¸¿	¹	°{ÐCö	Er   c                ó   <€ V ^8„  d   QhRR/# r   r   )r   r=   s   "€r   r   r>     s   ø€ ÷ &ñ & ñ &r   c                óZ   € V P                   e   V P                   P                  4        R # R # r‚   )ra   ri   rJ   s   &r   Ú_before_executeÚSSHEnvironment._before_execute  s%   € Ø×ÑÒ)Ø×Ñ×#Ñ#Ö%ñ *r   Úloginr5   Ú
stdin_datac          
      óZ   <€ V ^8„  d   QhRS[ RS[RS[RS[ R,          RS[P                  /# )r   Ú
cmd_stringr  r5   r  Nr   )r*   r<   r;   r¦   rè   )r   r=   s   "€r   r   r>     sC   ø€ ÷ 
xñ 
x¡Cð 
x±4ð 
xÉ#ð 
xÙ! D�jð
xÙ4>×4DÑ4Dñ
xr   c          	     óô   € \        \        R7      w  rVV P                  VR7      \        \        P
                  ! \        W4      4      V4      ,           p\        V4      pVe   \        WtVR7      # \        Wt4      # )a«  Forward the passthrough allowlist (skill ``required_environment_variables`` +
``terminal.env_passthrough``) the way docker does: ``SendEnv`` carries the names, the ssh
client's env carries the values, so secrets never enter the remote ``bash -c`` argv. The
remote sshd must ``AcceptEnv`` them (#14091). Profile-scoped names missing from the active
scope are unset remotely so a shared host cannot serve another profile's value.)Úhermes_env_loader)rp   )Úenv)	r   Ú_load_hermes_env_varsr¡   r   rË   rÌ   r   r   r   )	rK   r   r  r5   r  ÚvaluesÚunset_namesr    Ú
client_envs	   &&$$$    r   Ú	_run_bashÚSSHEnvironment._run_bash  si   € ô 6ÔH]Ô^ÑˆØ×%Ñ%¨vÐ%Ó6¼Ä5Ç;Â;Ì}Ð]gÓOuÓCvÐx}Ó9~Õ~ˆÜ$ VÓ,ˆ
Ø?IÒ?UŒ{˜3°
Ô;ÐwÔ[fÐgjÓ[wÐwr   c                óº  € V P                   '       d0   \        P                  R 4       V P                   P                  4        V P	                  4        FÝ  pVP                  4       '       g   K  \        P                  ! \        \        P                  4      ;_uu_ 4        RRRV 2RRV P                   RV P                   2.p\        P                  ! VR^\        P                  RR	7       R
R
R
4       \        P                  ! \        4      ;_uu_ 4        VP                  4        R
R
R
4       Kß  	  R
#   + '       g   i     LQ; i  + '       g   i     EK  ; i)z"SSH: syncing files from sandbox...r   r—   r˜   z-OÚexitrC   TF)Úcapture_outputr5   r×   r  N)ra   rÀ   ÚinfoÚ	sync_backrŒ   Úexistsr½   r¾   rå   r¦   ÚSubprocessErrorr3   r2   r  ré   Úunlink)rK   Úsocketr    s   &  r   ÚcleanupÚSSHEnvironment.cleanup#  só   € Ø××ÐÜ�K‰KÐ<Ô=Ø×Ñ×(Ñ(Ô*Ø×+Ñ+Ö-ˆFØ—=‘=—?’?ÙÜ×$Ò$¤W¬j×.HÑ.H×IÕIØ˜d l°6°(Ð$;¸TÀ6ÈdÏiÉiÈ[ÐXYÐZ^×ZcÑZcÐYdÐKeÐf�Ü—’˜s°4ÀÌ*×J\ÑJ\ÐdiÕj÷ Jô ×$Ò$¤W×-Õ-Ø—‘”÷ .Ñ-ó .÷ J×Iú÷ .×-Ñ-ús   ÂAD5ÄEÄ5EÅE)	rI   rb   ra   rX   r_   r2   r7   r6   r3   )Ú~é<   é   Ú FTT)Nr   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú_profile_scoped_passthroughÚ"_passwordless_sudo_probe_supportedrU   r{   rŒ   r’   r¡   rª   r²   r`   rc   rd   re   rg   rh   rf   r  r(  r3  Ú__static_attributes__Ú__classdictcell__Ú__classcell__)rm   r=   s   @@r   r0   r0   -   sð   ù‡ € ñð #'ÐØ)-Ð&÷õ ÷B
Að 
A÷=ð =÷Hð H÷
ò ÷Vð V÷Mð Mò
P÷ Hð H÷"ð "÷oð o÷BOð BO÷HAð A÷0Eð E÷&ð &ð
x¸%ð 
xÐPSð 
xØ+/÷
xò 
x÷ ò  r   r0   )zthe SSH connection)(r=  r½   r[   ÚloggingrÜ   rË   r    r¦   rV   Úpathlibr   Útypingr   Útools.environments.baser   r   Útools.environments.base_outputr   Útools.environments.file_syncr   r	   r
   r   r   Ú tools.environments.remote_commonr   r   r   r   r   r   Ú	getLoggerr9  rÀ   rš   r�   r$  r%   r.   r0   r   r   r   Ú<module>rK     s‡   ðÙ Qã Û Û Û 	Û Û Û Û Ý Ý ç OÝ 6÷cõ c÷k÷ kð 
×	Ò	˜8Ó	$€ð
 —‘˜D‘€ð -Ð õU÷Zô
A �_ö A r   