
    Ki%                         d Z ddlZddlZddlZddlZddlZddlZddlmZ ddl	m
Z
  ej        e          Z G d d          ZdS )zKPersistent shell mixin: file-based IPC protocol for long-lived bash shells.    N)abstractmethod)is_interruptedc                      e Zd ZU dZeed<   edej        fd            Z	ede
dee
         fd            Zed             Zeddd	d
e
de
dedz  de
dz  def
d            Zed             ZdZe
ed<   dZeed<   dZeed<   ede
fd            Zd Zd Zd$ddd	d
e
de
dedz  de
dz  def
dZd Zd Zde
fdZdee
ee
f         fdZddd	d
e
de
dedz  de
dz  def
dZ d
e
de
dedefd Z!e"d!e
d"e
de
fd#            Z#dS )%PersistentShellMixinzMixin that adds persistent shell capability to any BaseEnvironment.

    Subclasses must implement ``_spawn_shell_process()``, ``_read_temp_files()``,
    ``_kill_shell_children()``, ``_execute_oneshot()``, and ``_cleanup_temp_files()``.
    
persistentreturnc                     d S N selfs    @/home/ubuntu/hermes-agent/tools/environments/persistent_shell.py_spawn_shell_processz)PersistentShellMixin._spawn_shell_process   s    8;    pathsc                     d S r
   r   )r   r   s     r   _read_temp_filesz%PersistentShellMixin._read_temp_files   s    :=#r   c                     d S r
   r   r   s    r   _kill_shell_childrenz)PersistentShellMixin._kill_shell_children   s    $'Cr   Ntimeout
stdin_datacommandcwdr   r   c                    d S r
   r   r   r   r   r   r   s        r   _execute_oneshotz%PersistentShellMixin._execute_oneshot"   s     BEr   c                     d S r
   r   r   s    r   _cleanup_temp_filesz(PersistentShellMixin._cleanup_temp_files'   s    #&3r    _session_idg{Gz?_poll_interval_startg      ?_poll_interval_maxc                     d| j          S )Nz/tmp/hermes-persistent-)r!   r   s    r   _temp_prefixz!PersistentShellMixin._temp_prefix.   s    ;)9;;;r   c                    t          j                    | _        d | _        d| _        d | _        t          j                    j        d d         | _	        | j
        }| d| _        | d| _        | d| _        | d| _        | d| _        |                                 | _        d| _        t          j        | j        d	          | _        | j                                         d
| j         d| j         d| j         d| j         d| j         d| j         d| j         d}|                     |           t-          j                    dz   }t-          j                    |k     r|                     | j                  d                                         }|                                rt7          |          | _        nLt-          j        d           t-          j                    |k     t:                              d           d | _        | j        r&t:                              d| j	        | j                   |                     | j                  d                                         }|r	|| _         d S d S )NF   z-stdoutz-stderrz-statusz-cwdz-pidT)targetdaemonz export TERM=${TERM:-dumb}
touch  z
echo $$ > z
pwd > 
g      @r   g?z#Could not read persistent shell PIDz-Persistent shell started (session=%s, pid=%d))!	threadingLock_shell_lock_shell_proc_shell_alive
_shell_piduuiduuid4hexr!   r%   _pshell_stdout_pshell_stderr_pshell_status_pshell_cwd_pshell_pid_filer   Thread_drain_shell_output_drain_threadstart_send_to_shelltime	monotonicr   stripisdigitintsleeploggerwarninginfor   )r   pinit_scriptdeadlinepid_strreported_cwds         r   _init_persistent_shellz+PersistentShellMixin._init_persistent_shell6   s   $>++48"'&*:<<+CRC0!"mmm!"mmm!"mmm:::#$


4466 &-+D
 
 
 	  """*(* *+/+>* *"* *%)%5* *8<8M* * .* * %	* * * 	 	K(((>##c)n))++D,ABB1EKKMMG   "%g,,Jt n)) NN@AAA"DO? 	KK? $/  
 ,,T-=>>qAGGII 	$#DHHH	$ 	$r   c                 "   | j         d S | j        r|                                  	 | j         j                                         n# t
          $ r Y nw xY w	 | j                                          | j                             d           n.# t          j	        $ r | j         
                                 Y nw xY wd| _        d | _         t          | d          r6| j                                        r| j                            d           d S d S d S )N   )r   Fr<   g      ?)r/   r!   r   stdinclose	Exception	terminatewait
subprocessTimeoutExpiredkillr0   hasattrr<   is_alivejoinr   s    r   _cleanup_persistent_shellz.PersistentShellMixin._cleanup_persistent_shellj   sK   #F 	'$$&&&	"((**** 	 	 	D		$&&(((!!!!,,,,( 	$ 	$ 	$!!#####	$ "4)) 	1d.@.I.I.K.K 	1##C#00000	1 	1 	1 	1s#   A 
AA4B (B65B6c                t    | j         r|                     ||||          S |                     ||||          S )Nr   )r   _execute_persistentr   r   s        r   executezPersistentShellMixin.execute   s\     ? 	++g* ,    $$S'j % 
 
 	
r   c                 @    | j         r|                                  d S d S r
   )r   r[   r   s    r   cleanupzPersistentShellMixin.cleanup   s.    ? 	-**,,,,,	- 	-r   c                 V    	 | j         j        D ]}n# t          $ r Y nw xY wd| _        d S NF)r/   stdoutrR   r0   )r   _s     r   r;   z(PersistentShellMixin._drain_shell_output   sR    	%,   	 	 	D	!s    
textc                     | j         r| j        d S 	 | j        j                            |           | j        j                                         d S # t
          t          f$ r d| _         Y d S w xY wrb   )r0   r/   rP   writeflushBrokenPipeErrorOSError)r   re   s     r   r>   z#PersistentShellMixin._send_to_shell   s      	D$4$<F	&"((..."((*****) 	& 	& 	& %D	&s   =A A-,A-c                    |                      | j        | j        | j        | j                  \  }}}}|                     ||          }|                                }d|v r|                    dd          d         }	 t          |                                          }n# t          $ r d}Y nw xY w|||                                fS )N:   )
r   r5   r6   r7   r8   _merge_outputrA   splitrC   
ValueError)r   rc   stderr
status_rawr   outputstatus	exit_codes           r   _read_persistent_outputz,PersistentShellMixin._read_persistent_output   s    *.*?*?!4!1+
 +
'
C ##FF33!!##&==\\#q))!,F	FLLNN++II 	 	 	III	y#))++--s   =!B B.-B.c                X   | j         s.t                              d           |                                  |                     |          \  }}|p| j        }|s|r|                     ||||          S | j        5  |                     |||          cd d d            S # 1 swxY w Y   d S )Nz$Persistent shell died, restarting...r   )	r0   rE   rG   rM   _prepare_commandr   r   r.   _execute_persistent_locked)r   r   r   r   r   exec_command
sudo_stdineffective_timeouts           r   r]   z(PersistentShellMixin._execute_persistent   s      	*KK>???'')))#'#8#8#A#A j#3t| 	 	((g* )     	 	22c#4 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   ;BB#&B#c                 h   |p| j         }t          j                    j        d d         }d| j         d| j         d| j         d}|                     |           |                    dd          }dt          j
        |           d| d	| j         d
| j         d| j         d| d| j         d}|                     |           t          j                    |z   }	| j        }
	 t                      r4|                                  |                                 \  }}}|dz   ddS t          j                    |	k    rO|                                  |                                 \  }}}|r|d| dz   ddS |                     |          S | j        sdddS |                     | j                  d                                         }|                    |dz             rn.t          j        |
           t1          |
dz  | j                  }
-|                                 \  }}}|r|| _         ||dS )N   z: > z
: > r+   'z'\''zcd z
eval 'z' < /dev/null > z 2> z
__EC=$?
pwd > z
echo z	:$__EC > Tz
[Command interrupted]   )rs   
returncodez
[Command timed out after zs]|   z&Persistent shell died during executionrm   r   rl   g      ?)r   r2   r3   r4   r5   r6   r7   r>   replaceshlexquoter8   r?   r@   r"   r   r   rv   _timeout_resultr0   r   rA   
startswithrD   minr#   )r   r   r   r   work_dircmd_idtruncateescaped
ipc_scriptrJ   poll_intervalrs   rd   status_contentru   new_cwds                   r   ry   z/PersistentShellMixin._execute_persistent_locked   s   ?$(!"1"%+4& + +&+ +&+ + + 	
 	H%%%//#w//=%+h'' = == =.2.A= =GKGZ= = %= = 	= = &*%8	= = = 	 	J'''>##g-1!	N ))+++#;;==1$'@@"%  
 ~(**))+++#;;==1 "(+T+T+T+T"T&)   ++G444$ F"#  
 "2243FGGJPPRRN((#66 J}%%%   3T5LMMMC!	NF &*%A%A%C%C"	7 	DH 	:::r   rc   rq   c                     g }|                                  r(|                    |                     d                     |                                 r(|                    |                    d                     d                    |          S )Nr+   )rA   appendrstriprZ   )rc   rq   partss      r   rn   z"PersistentShellMixin._merge_output  su    <<>> 	.LLt,,---<<>> 	.LLt,,---yyr   )r    )$__name__
__module____qualname____doc__bool__annotations__r   rU   Popenr   strlistr   r   rC   dictr   r   r!   r"   floatr#   propertyr%   rM   r[   r^   r`   r;   r>   tuplerv   r]   ry   staticmethodrn   r   r   r   r   r      s          ;j&6;;; ^;=s=tCy=== ^='' ^'/326E E E E# E"%*E%(4ZE;?E E E ^E && ^&K"&%&&& $$$$<c < < < X<2$ 2$ 2$h1 1 16	
&*)-	
 	
 	
s 	
 	
t	
$J	
26	
 	
 	
 	
- - -" " "&3 & & & &.sC})= . . . .( 3759  3 S %(4Z(+d
>B   &=;# =;C =;,/=;48=; =; =; =;~  c  3  3       \     r   r   )r   loggingr   rU   r,   r?   r2   abcr   tools.interruptr   	getLoggerr   rE   r   r   r   r   <module>r      s    Q Q                   * * * * * *		8	$	$E  E  E  E  E  E  E  E  E  E r   