
    `gj                     |   d Z ddlZ ej                          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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	j0                         Zej4                  fdefdZddZddZdededefdZd Z e!dk(  r e         yy)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)handle_spurious_eof)Consolenamedefaultreturnc                     t         j                  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      K/root/.hermes/venv/lib/python3.12/site-packages/tui_gateway/slash_worker.py
_env_floatr   "   sF    
 **..
CSzz" s   
0 AA皙?HERMES_SLASH_WATCHDOG_POLL_Sg       @g        HERMES_SLASH_WATCHDOG_GRACE_Sg      @c                      |       | k7  S )zCReturn whether this worker no longer has its original POSIX parent. )original_ppidgetppids     r   _is_orphanedr   5   s    9%%    c                  h    ddl } ddlm}m} | j	                  t
              } ||d        |        y)u   Start bounded MCP discovery before HermesCLI snapshots tools.

    Each slash_worker child is its own process — the parent ``hermes serve``
    discovery thread does not populate this registry (issue #61891).
    r   N)start_background_mcp_discoverywait_for_mcp_discoveryzslash-worker-mcp-discovery)loggerthread_name)logginghermes_cli.mcp_startupr   r   	getLogger__name__)r!   r   r   r   s       r   _prepare_slash_worker_runtimer%   :   s4     
 x(F"0 r   c                 Z      fd}t        j                  |d      j                          y )Nc                     t              s%t        j                  t               t              s%t        j                         t
        z   } t        j                         rXt        j                         | k  rAt        j                  d       t        j                         rt        j                         | k  rAt        j                  d       y )Nr   r   )
r   timesleep_WATCHDOG_POLL_S	monotonic_ORPHAN_GRACE_S
_in_flightis_setr
   _exit)deadliner   s    r   _loopz+_start_parent_death_watchdog.<locals>._loopP   s    }-JJ'( }->>#o5!dnn&6&AJJt !dnn&6&A
r   T)targetdaemon)	threadingThreadstart)r   r1   s   ` r   _start_parent_death_watchdogr7   O   s#     E$/557r   clicommandc                 J   |xs dj                         }|sy|j                  d      sd| }t        j                         }t	        |dd      | _        t        t        dd       }|d t        _        	 t        j                  |      5  t        j                  |      5  | j                  |       d d d        d d d        ||t        _        	 dd	lm}  ||j                         j!                               S # 1 sw Y   IxY w# 1 sw Y   MxY w# ||t        _        w w xY w)
N /Tx   )fileforce_terminalwidth_cprintc                     t        |       S )N)print)texts    r   <lambda>z_run.<locals>.<lambda>k   s
    uT{ r   r   )
strip_ansi)strip
startswithioStringIOr   consolegetattrcli_modrA   
contextlibredirect_stdoutredirect_stderrprocess_commandtools.ansi_striprF   getvaluerstrip)r8   r9   cmdbufoldrF   s         r   _runrX   [   s   =b


!C>>##i
++-C
 s4sCCK
'9d
+C
2"'', 	%j.H.H.M 	%$	% 	% ?!GO ,clln++-..	% 	% 	% 	% ?!GO s<   5D 
D C:2D:D :D	?DDD D"c            
         t        j                  d      } | j                  dd       | j                  dd       | j                         }|j                  t
        j                  d	<   d
t
        j                  d<   t        j                         }t        |       t                t        j                  t        j                               5  t        j                  t        j                               5  t        |j                   xs d d|j                  d      }d d d        d d d        g }dt"        dd fd}	 t$        j&                  j)                         }|st+        ||      sy /|j-                         }|sBt.        j1                          d }	 t3        j4                  |      }	|	j7                  d      }t9        |	j7                  dd            }
t$        j:                  j=                  t3        j>                  |d|
d      dz          t$        j:                  jA                          t.        jE                          # 1 sw Y   (xY w# 1 sw Y   -xY w# tB        $ rj}t$        j:                  j=                  t3        j>                  |dt#        |      d      dz          t$        j:                  jA                          Y d }~d }~ww xY w# t.        jE                          w xY w)NF)add_helpz--session-keyT)requiredz--modelr;   )r   HERMES_SESSION_KEY1HERMES_INTERACTIVE)modelcompactresumeverbosereasonr   c                 B    t        d|  t        j                  d       y )Nz[slash-worker] T)r>   flush)rC   sysstderr)rc   s    r   _sw_logzmain.<locals>._sw_log   s    x(szzFr   idr9   )ri   okoutput
)ri   rj   error)#argparseArgumentParseradd_argument
parse_argssession_keyr
   r   r   r7   r%   rN   rO   rI   rJ   rP   r   r_   strrf   stdinreadliner   rG   r-   setjsonloadsr   rX   stdoutwritedumpsre   	Exceptionclear)pargs	orig_ppidr8   _sw_recovery_timesrh   r   lineridreqoutes               r   mainr   ~   s?   /ANN?TN2NN9bN)<<>D'+'7'7BJJ#$'*BJJ#$ 

I +!#		#	#BKKM	2 hJ4N4Nr{{}4] hdjj0D$tGWGWafgh h ')G G G ii  "&'97Cyy{
	**T"C''$-CsCGGIr23CJJTZZs$#(NORVVWJJ
 / h h h h<  	JJTZZs%#a&(QRUYYZJJ	 sP   (I5(IIBI I	II	K&A KK KK K)__main__)r   N)"__doc__hermes_bootstrapharden_import_pathrn   rN   rI   rw   r
   rf   r4   r(   r8   rM   r   tui_gateway._stdin_recoveryr   rich.consoler   rs   r   r   maxr*   r,   Eventr-   r   boolr   r%   r7   rX   r   r$   r   r   r   <module>r      s     #  # # %   	  	 
     ;  S 5 U  tZ(FLM c:&EsKLY__
 )+

 &t &
*	8 /i  /#  /#  /F1h zF r   