
    |+jy                     \   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ZddlZddl	Z	ddl
Zddl
mZ ddlmZ dededefdZ ed	 ed
d                    Z ed edd                    Z ej                    Zej        fdefdZddZdededefdZd Zedk    r e             dS dS )u   Persistent slash-command worker — one HermesCLI per TUI session.

Protocol: reads JSON lines from stdin {id, command}, writes {id, ok, output|error} to stdout.
    N)	HermesCLI)Consolenamedefaultreturnc                     t           j                            |           }|s|S 	 t          |          S # t          t
          f$ r |cY S w xY w)a  Parse a float env knob, falling back to ``default`` on absent/malformed
    values. A bare ``float(os.environ.get(...))`` would raise ValueError at
    import time on a typo (e.g. ``HERMES_SLASH_WATCHDOG_POLL_S=2s``) and kill
    the worker before it can serve a single command.)osenvirongetfloat	TypeError
ValueError)r   r   raws      7/usr/local/lib/hermes-agent/tui_gateway/slash_worker.py
_env_floatr      s^    
 *..

C Szzz"   s   4 A
	A
皙?HERMES_SLASH_WATCHDOG_POLL_Sg       @        HERMES_SLASH_WATCHDOG_GRACE_Sg      @c                      |            | k    rdS 	 t          j        |           sdS t          j        |                                           |k    S # t           j        $ r Y dS w xY w)zTrue once our spawning gateway is gone. Compare to the ORIGINAL ppid
    (never ==1: Linux reparents to a subreaper) and guard PID reuse via
    create_time.T)psutil
pid_existsProcesscreate_timeError)original_ppidparent_create_timegetppids      r   _is_orphanedr   )   s}     wyyM!!t // 	4~m,,88::>PPP<   tts   A )A A%$A%c                 f      fd}t          j        |d                                           d S )Nc                     t                    s)t          j        t                     t                    )t          j                    t
          z   } t                                          r[t          j                    | k     rDt          j        d           t                                          rt          j                    | k     Dt          j	        d           d S )Nr   r   )
r   timesleep_WATCHDOG_POLL_S	monotonic_ORPHAN_GRACE_S
_in_flightis_setr	   _exit)deadliner   r   s    r   _loopz+_start_parent_death_watchdog.<locals>._loop8   s    }.@AA 	)J'((( }.@AA 	)>##o5!! 	dn&6&6&A&AJt !! 	dn&6&6&A&A
    T)targetdaemon)	threadingThreadstart)r   r   r+   s   `` r   _start_parent_death_watchdogr2   7   sL          E$///5577777r,   clicommandc                 t   |pd                                 }|sdS |                    d          sd| }t          j                    }t	          |dd          | _        t          t          dd           }|d t          _        	 t          j
        |          5  t          j        |          5  |                     |           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   ||t          _        n# ||t          _        w xY w|                                                                S )N /Tx   )fileforce_terminalwidth_cprintc                      t          |           S )N)print)texts    r   <lambda>z_run.<locals>.<lambda>S   s    uT{{ r,   )strip
startswithioStringIOr   consolegetattrcli_modr<   
contextlibredirect_stdoutredirect_stderrprocess_commandgetvaluerstrip)r3   r4   cmdbufolds        r   _runrQ   C   s   =b


!
!C r>># #ii
+--C
 s4sCCCCK
'9d
+
+C
22"',, 	% 	%j.H.M.M 	% 	%$$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% ?!GO ?!GO!!!!<<>>  """sT   D C'.CC'C	C'C	C'D 'C++D .C+/D Dc                  "   t          j        d          } |                     dd           |                     dd           |                                 }|j        t
          j        d	<   d
t
          j        d<   t          j                    }	 t          j	        |          
                                }n# t          j        $ r d}Y nw xY wt          ||           t          j        t          j                              5  t          j        t          j                              5  t%          |j        pd d|j        d          }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   t(          j        D ]}|                                }|st.                                           d }	 t3          j        |          }|                    d          }t9          ||                    dd                    }	t(          j                            t3          j        |d|	d          dz              t(          j                                          nz# tB          $ rm}
t(          j                            t3          j        |dtE          |
          d          dz              t(          j                                          Y d }
~
nd }
~
ww xY wt.          #                                 o# t.          #                                 w xY wd S )NF)add_helpz--session-keyT)requiredz--modelr6   )r   HERMES_SESSION_KEY1HERMES_INTERACTIVEr   )modelcompactresumeverboseidr4   )r\   okoutput
)r\   r]   error)$argparseArgumentParseradd_argument
parse_argssession_keyr	   r
   r   r   r   r   r   r2   rH   rI   rC   rD   rJ   r   rX   sysstdinrA   r'   setjsonloadsr   rQ   stdoutwritedumpsflush	Exceptionstrclear)pargs	orig_ppidr   r3   r   lineridreqoutes              r   mainrz   _   sh   ///ANN?TN222NN9bN)))<<>>D'+'7BJ#$'*BJ#$ 
I!#^I66BBDD< ! ! ! ! ,>???		#BKMM	2	2 h hJ4Nr{}}4]4] h hdj0D$tGWafgggh h h h h h h h h h h h h h h h h h h h h h h h h h h h h h y  yy{{ 	
	*T""C''$--CsCGGIr2233CJTZs$#(N(NOORVVWWWJ 	 	 	JTZs%#a&&(Q(QRRUYYZZZJ	 J# sz   &B6 6C
	C
&E+( EE+E	E+E	E++E/2E/8B#IK1
K&A#K	K1KK11L__main__)r   N)__doc__ra   rH   rC   ri   r	   rf   r/   r"   r   r3   rG   r   rich.consoler   rp   r   r   maxr$   r&   Eventr'   r   boolr   r2   rQ   rz   __name__ r,   r   <module>r      s   
      				  				 



                            S 5 U     3tZZ(FLLMM #c::&EsKKLLY_
 =?J  4    	8 	8 	8 	8#i ## ## # # # #8& & &R zDFFFFF r,   