
    `gji                    T   d Z ddlm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mZ ddlmZ ddlmZmZ ddZe G d d	             Ze G d
 d             Z G d d      ZddZddZ G d d      ZddZddZdddZdddZ e!dk(  r e" e              y)zPersistent dashboard compute-host process.

Phase 0 used this module as a deterministic line-JSON spike.  Phase 1 keeps the
same transport and turns it into the long-lived child that owns live AIAgent
objects when ``dashboard.turn_isolation`` is enabled.
    )annotationsN)	dataclassfield)Path)AnyCallablec                 *    t        j                         S N)timeperf_counter_ns     K/root/.hermes/venv/lib/python3.12/site-packages/tui_gateway/compute_host.pynow_nsr      s    !!r   c                      e Zd ZU dZded<    ee      Zded<    eej                        Z
ded<   dd	Zdd
Zddddd	 	 	 	 	 	 	 	 	 	 	 ddZy)
SpikeAgentzFA deterministic AIAgent-shaped object for pipe/interrupt measurements.str
session_iddefault_factoryzlist[dict[str, str]]historyzthreading.Event
_interruptc                8    | j                   j                          y r
   )r   clearselfs    r   clear_interruptzSpikeAgent.clear_interrupt%   s    r   c                8    | j                   j                          y r
   )r   setr   s    r   	interruptzSpikeAgent.interrupt(   s    r   N   MbP?conversation_historystream_callbackdelta_countdelay_sc                  t        ||n| j                        }g }d}t        t        dt	        |                  D ]l  }	| j
                  j                         rd} nN| j                   d| d|	dd}
|j                  |
       | ||
       |dkD  sXt        j                  |       n | j
                  j                         rd}dj                  |      }|r|dz  }g |d	|d
d|d
}|| _        |||dS )NFr   T:04d  z[interrupted]user)rolecontent	assistant)final_responsemessagesinterrupted)listr   rangemaxintr   is_setr   appendr   sleepjoin)r   promptr$   r%   r&   r'   base_historychunksr3   indexchunkfinalr2   s                r   run_conversationzSpikeAgent.run_conversation+   s    4H4T0Z^ZfZfg3q#k"234 		$E%%'"'q%A>EMM% *&{

7#		$ ??!!#K_$E

/
 !U3

  "'XkZZr   returnNone)r<   r   r$   zlist[dict[str, str]] | Noner%   zCallable[[str], None] | Noner&   r7   r'   floatrD   dict[str, Any])__name__
__module____qualname____doc____annotations__r   r4   r   	threadingEventr   r   r    rB   r   r   r   r   r      s    PO$)$$?G!?"'	"HJH  =A8<![![ :	![
 6![ ![ ![ 
![r   r   c                  n    e Zd ZU ded<   ded<   dZded<   dZd	ed
<    eej                        Z	ded<   y)HostSessionr   sidr   agentr   r7   history_versionFboolrunningr   zthreading.LocklockN)
rH   rI   rJ   rL   rS   rU   r   rM   LockrV   r   r   r   rP   rP   O   s4    	HOSGT @D.@r   rP   c                  $    e Zd ZddZddZddZy)_HostTransportc                    || _         y r
   )_emit)r   emits     r   __init__z_HostTransport.__init__Y   s	    
r   c                    d}	 |j                  d      dk(  r1t        |j                  d      xs i j                  d      xs d      }| j                  d||d       y# t        $ r d}Y #w xY w)	Nr,   methodeventparamsr   rpc)typerQ   messageT)getr   	Exceptionr[   )r   objrQ   s      r   writez_HostTransport.write\   ss    	wwx G+CGGH-388FM2N 	

E##>?  	C	s   AA A-,A-c                     y r
   r   r   s    r   closez_HostTransport.closef   s    r   N)r\   z Callable[[dict[str, Any]], None]rD   rE   )rg   dictrD   rT   rC   )rH   rI   rJ   r]   rh   rj   r   r   r   rY   rY   X   s    r   rY   c                 V    t        t              j                         j                  d   S N   )r   __file__resolveparentsr   r   r   
_repo_rootrr   j   s     >!!#++A..r   c                     	 t        j                  g dt        t                     dt         j                  d      j                         S # t        $ r Y yw xY w)N)gitz	rev-parseHEADT   )cwdtextstderrtimeoutunknown)
subprocesscheck_outputr   rr   DEVNULLstriprf   r   r   r   
_build_shar   n   sS    	&&(JL!%%
 %'	  s   AA 	AAc                      e Zd Zdddd	 	 	 	 	 	 	 ddZddZddZddddd	Zdd
ddZddZddZ	ddZ
ddZddZddZddZddZddZddZddZddZddZy) ComputeHostN)stdoutmax_workersheartbeat_secsc                  |xs t         j                  | _        t        j                         | _        i | _        t        j                  j                  |xs
 t               d      | _        t        j                         | _        t        j                         | _        t#        j$                         j&                  | _        d| _        t        j                         | _        t/               | _        t        j                         | _        t5        | j6                        | _        |t;        |      n+t;        t        j<                  j?                  d      xs d      | _         | j@                  dkD  rat        jB                  | jD                  dd      jG                          t        jB                  | jH                  d	d      jG                          y y )
Nzcompute-host-turn)r   thread_name_prefixr   "HERMES_COMPUTE_HOST_HEARTBEAT_SECS15zcompute-host-heartbeatTtargetnamedaemonzcompute-host-ppid-guard)%sysr   _stdoutrM   rW   _write_lock	_sessions
concurrentfuturesThreadPoolExecutor_default_workers	_executorrN   _closedosgetppid_parent_piduuiduuid4hex_boot_id_progress_counter_progress_lockr   _turn_futures_turn_futures_lockrY   r\   
_transportrF   environre   _heartbeat_secsThread_heartbeat_loopstart_parent_guard_loop)r   r   r   r   s       r   r]   zComputeHost.__init__|   sW    +$>>+13#++>>#9'7'92 ? 
 !(::<

((!"'nn.=@U"+.."2(3 ) .!rzz~~&JKStT 	
 !#D$8$8?W`dekkmD$;$;B[dhiooq $r   c                    |j                  dt                      t        j                  |dd      }| j                  5  t        || j                  d       d d d        y # 1 sw Y   y xY w)Nhost_ns),r)   F)
separatorsensure_asciiT)fileflush)
setdefaultr   jsondumpsr   printr   )r   framedatas      r   r\   zComputeHost.emit   sT    FH-zz%JUK 	7$T\\6	7 	7 	7s   A!!A*c                r    | j                   j                          | j                  j                  dd       y )NFTwaitcancel_futures)r   r   r   shutdownr   s    r   rj   zComputeHost.close   s)    U4@r   r   g      $@reasonr   c                  | j                   j                          | j                  |       t        j                         t        d|      z   }t        j                         |k  ro| j                  5  | j                  D cg c]  }|j                         r| }}d d d        sn-t        j                  d       t        j                         |k  ro| j                  j                  dd       y c c}w # 1 sw Y   \xY w)Nr           g?FTr   )r   r   flush_all_sessionsr   	monotonicr6   r   r   doner:   r   r   )r   r   r   deadlinefpendings         r   r   zComputeHost.shutdown   s    v.>>#c#tn4nn)(( J&*&8&8I1IIJJJt nn) 	U4@	 JJ Js$   1C7 C2C2C72C77D r   c                   	 ddl m} t        t	        |di       j                               D ]  }	 |j                  |d|         y # t        $ r Y y w xY w# t        $ r Y 7w xY w)Nr   serverr   compute_host_)
end_reason)tui_gatewayr   rf   r4   getattrvalues_finalize_session)r   r   r   sessions       r   r   zComputeHost.flush_all_sessions   sx    	* GFK<CCEF 	G((}VH=U(V	  		
  s"   A	 A		AA	A$#A$c                4   t        |j                  d      xs d      }|dk(  r| j                  |       y |dk(  r| j                  |       y |dk(  r| j	                  |       y |dk(  r| j                  |       y |dk(  r| j                  |       y |dk(  r[| j                  d	|j                  d
      d       | j                  j                          | j                  j                  dd       y | j                  d|j                  d
      d| d       y )Nrc   r,   zsession.seedz
turn.startr    
reload_mcpcontrolr   zshutdown.ack
request_id)rc   r   FTr   errorzunknown frame type: rc   r   rd   )r   re   _handle_seed_handle_turn_start_handle_interrupt_handle_reload_mcp_handle_controlr\   r   r   r   r   )r   r   kinds      r   handle_framezComputeHost.handle_frame   s    599V$*+>!e$\!##E*[ ""5)\!##E*Y  'ZII~UYY|=TUV LLNN##t#DII#"'))L"9!5dV<r   c           	     v   t        |j                  d      xs d      }|s%| j                  d|j                  d      dd       y |j                  d      }t        |t              sg }t        |t        |t	        |                  | j                  |<   | j                  d	||j                  d      d
       y )NrQ   r,   r   r   sid requiredr   r   )rQ   rR   zsession.seeded)rc   rQ   r   )r   re   r\   
isinstancer4   rP   r   r   )r   r   rQ   r   s       r   r   zComputeHost._handle_seed   s    %))E"(b)IIweii6MZhij))I&'4(G)cCg9WXs		+CuyyQ]G^_`r   c                   t        |j                  d      xs d      }|| j                  v r| j                  |       y | j                  j                  | j                  t        |            }| j                  5  | j                  j                  |       d d d        |j                  | j                  j                         y # 1 sw Y   /xY w)NrQ   r,   )r   re   r   _handle_spike_turn_startr   submit_run_real_turnrk   r   r   addadd_done_callbackdiscard)r   r   rQ   futures       r   r   zComputeHost._handle_turn_start   s    %))E"(b)$.. ))%0&&t':':DKH$$ 	+""6*	+  !3!3!;!;<	+ 	+s   :CCc                   t        |j                  d      xs d      }| j                  j                  |      }|&| j                  d||j                  d      dd       y |j                  5  |j
                  r/| j                  d||j                  d      dd       	 d d d        y d|_        d d d        | j                  j                  | j                  |t        |            }| j                  5  | j                  j                  |       d d d        |j                  | j                  j                         y # 1 sw Y   xY w# 1 sw Y   ;xY w)	NrQ   r,   
turn.errorr   zunknown sessionrc   rQ   r   rd   session busyT)r   re   r   r\   rV   rU   r   r   _run_spike_turnrk   r   r   r   r   r   )r   r   rQ   r   r   s        r   r   z$ComputeHost._handle_spike_turn_start   s   %))E"(b)..$$S)?II|CuyyQ]G^k|}~\\ 	#		<599UaKbo}~	# 	# #GO		#
 &&t';';Wd5kR$$ 	+""6*	+  !3!3!;!;<	# 	#	+ 	+s   .3D?*D?5E?EEc           
     j   t        |j                  d      xs d      }| j                  j                  |      }|I|j                  j	                          | j                  d||j                  d      dt               d       y 	 ddlm} |j                  j                  |      }|&| j                  d||j                  d      d	d
       y |j                  d      }|t        |d      r|j	                          |j                  dt        j                               5  d|d<   d |d<   d d d        | j                  d||j                  d      dt               d       y # 1 sw Y   8xY w# t        $ r9}| j                  d||j                  d      d	t        |      d       Y d }~y d }~ww xY w)NrQ   r,   zinterrupt.ackr   T)rc   rQ   r   applied
applied_nsr   r   F)rc   rQ   r   r   rR   r    history_lock_turn_cancel_requestedqueued_prompt)rc   rQ   r   r   rd   )r   re   r   rR   r    r\   r   r   r   hasattrrM   rW   rf   )r   r   rQ   spiker   r   rR   excs           r   r   zComputeHost._handle_interrupt   s   %))E"(b)""3'KK!!#II+"'))L"9#"(( 	K*&&**3/G		?3eiiXdNerwxyKK(E WUK%@!^Y^^-=> 04801+/(0 IIs%))T`Janr  CI  CK  L  M0 0  	KIIs%))T`Jans  AD  EH  AI  J  K  K	Ks8   AE0 AE0 "E$-6E0 $E-)E0 0	F29/F--F2c                6    |j                  d      xs t        j                         j                  t	        |j                  d      xs |j                  d      xs d      }	 t        |j                  dd            }	 t        |j                  dd            }j                  5  t        j                  j                        }d d d        j                  j                           j                  d	j                  t!               d
       d fd}	 j                  j#                  ||||      }j                  5  xj$                  dz  c_        d_        j$                  }	d d d         j)                           j                  dj                  	t+        |j                  d      xs g       t-        |j                  d            t!               d       y # t        t        f$ r d}Y |w xY w# t        t        f$ r d}Y xw xY w# 1 sw Y   RxY w# 1 sw Y   xY w# t.        $ r\}
j                  5  d_        d d d        n# 1 sw Y   nxY w j                  dj                  t	        |
      d       Y d }
~
y d }
~
ww xY w)Nr   r<   rx   r,   r&   r!   r'   r"   turn.startedrc   rQ   r   
started_nsc                x    j                          j                  dj                  | t               d       y )Ndelta)rc   rQ   r   rx   
emitted_ns)_bump_progressr\   rQ   r   )r   r   r   r   s    r   streamz+ComputeHost._run_spike_turn.<locals>.stream.  s5    !II#";;",!"((r   r#   rn   Fturn.endr2   r3   )rc   rQ   r   rS   message_countr3   ended_nsr   r   )r   r   rD   rE   )re   r   r   r   r   r7   	TypeError
ValueErrorrF   rV   r4   rR   r   r   r\   rQ   r   rB   rS   rU   r   lenrT   rf   )r   r   r   r<   r&   r'   r   r   resultrS   r   r   s   ``         @r   r   zComputeHost._run_spike_turn  s9   YY|,@

0@0@
UYYx(CEIIf,=CD	eiir:;K	EIIi78G \\ 	27==001G	2%%'		>'++Zgmgopq
		q]]33%, &' 4 F  :''1,'"'")"9"9: !II&";;",'6%(J)?)E2%F#'

=(A#B &
I :& 	K	 :& 	G		2 	22: :   	q ("'( ( (II|GKKzfijmfnopp	qsy   'G* H * H,H3 	)H'2A7H3 *G?>G?HHH$'H0,H3 3	J<JI	JI"	0JJc                |   t        |j                  d      xs d      }t        |j                  d      xs t        j                         j                        }|s| j                  d||dd       y 	 ddlm} | j                  ||      }|d	   5  |j                  d
      r | j                  d||dd       	 d d d        y d|d
<   d|d<   t        j                         |d<   |j                  |d|v r|j                  d      n|j                  d             d d d        | j                  d||t               d       	 |j                  |       	 dd l}|j                  |d          	 |j!                  |       d|v r|j                  d      n|j                  dd      }|j#                  ||||       |j                  d      }|t%        |d      r|j'                          |d	   5  t)        |j                  dd            }	t+        |j                  d      xs g       }
t-        |j                  d            }t        |j                  d      xs d      }d d d        |j/                  |j                  d      |      }| j1                          | j                  d||	
t               |dd
       y # 1 sw Y   xY w# t        $ r Y w xY w# t        $ r Y zw xY w# t        $ r Y xw xY w# 1 sw Y   xY w# t        $ r}	 ddlm} |j2                  j                  |      }|P|j                  d	t5        j6                               5  d|d
<   |j9                  |       d d d        n# 1 sw Y   nxY wn# t        $ r Y nw xY w| j                  d||dt        |      d       Y d }~y d }~ww xY w)NrQ   r,   r   r   r   r   r   r   r   rU   r   TFr   last_activerx   r<   r   r   session_key_run_threadr;   rS   r   rR   r   )
rc   rQ   r   rS   r	  r  r3   r  session_infosession_info_emitted	exception)rc   rQ   r   r   rd   )r   re   r   r   r   r\   r   r   _ensure_server_sessionr   _start_inflight_turnr   _ensure_session_db_rowrf   hermes_undoon_user_message_appended_persist_branch_seed_run_prompt_submitr   r;   r7   r  rT   _session_infor   r   rM   rW   _clear_inflight_turn)r   r   rQ   r   r   r   r  rx   
run_threadrS   r  r3   r	  r  r   s                  r   r   zComputeHost._run_real_turnY  s   %))E"(b)<0DDJJL4D4DE
II|Cz^lmn@	@*11&%@G( t;;y)II|Czftuvt t &*	"4901)-&++G&TY/UYYv5F_d_h_hiq_rst II~ccicklm--g6"44W]5KL++G4 )/%599V$UYYxQS=TD%%j#wE ]3J%'*f*E!( D"%gkk2CQ&G"H #GKK	$:$@b A"7;;/G#HI!'++m"<"BC	D
 "//G0DgNL!II&",'6#.%2#. &$0,0Gt t      D D*  	@	. **..s3& ^Y^^5EF =-2	*33G<= = =  II|Cz]huxy|u}~	@s   3L )J;9L AJ;&L  K K +K( <A/L +A2K8AL ;K L 	KL KL 	K%!L $K%%L (	K51L 4K55L 8L=L 	N;ANM5,	N5M>	:NN6	NN6N#N66N;c                	   t        |j                  d      xs d      }t        |j                  d      xs |      }|j                  j                  |      }|| j                  |d<   |j                  d      !t	        |j                  d      xs d      |d<   |j                  d      rt        |j                  d            |d<   |j                  d      rt        |j                  d            |d<   t        |j                  d	      t              r!t        |j                  d	      xs g       |d	<   |S t        |j                  d
      t              r|j                  d
      ng }t        |j                  d      xs d      }d }d }		 |r)ddlm}
 ddl	m
}  |
|      }	 |t        |      dz        }|j                  ||||j                  d      |j                  d      |j                  d      |j                  d      |      }|		 ddlm}  ||	       	 ddlm}m}  || j                        }	 |j%                  |||t        |      t	        |j                  d      xs d      t        |j                  d      xs d      xs d ||j                  d              ||       	 |j                  |   }| j                  |d<   |xs |j                  d      |d<   t        |j                  d	      t              r!t        |j                  d	      xs g       |d	<   |j                  d      |j                  d      |d<   |S # t        $ r Y ;w xY w# |		 ddlm}  ||	       w # t        $ r Y w w xY ww xY w#  ||       w xY w# t        $ rE i d|d|d
t        |      dt'        j(                         dt	        |j                  d      xs d      dd dt+        j*                         dt+        j*                         ddd	g d ddt        |j                  d      xs t-        j.                               dt	        |j                  d      xs d      d!d d"|j1                         d#|j3                         d$i i |j                  d      |j5                  |j                  d            | j                  d%|j                  |<   Y .w xY w)&NrQ   r,   r	  	transportcolsP   rw   profile_homeattached_imagesr   r   )set_hermes_home_override)	SessionDBzstate.db)db_pathmodel_overridereasoning_config_overrideservice_tier_overridesource)r   r!  r"  r#  platform_override
session_db)reset_hermes_home_override)bind_transportreset_transport)r  rw   r&  r$  rR   r   rS   inflight_turn
created_atr  rU   Fimage_counterslash_workershow_reasoningtool_progress_modeedit_snapshots)tool_started_atr!  r$  r  )r   re   r   r   r7   r   r4   hermes_constantsr  hermes_stater  r   _make_agentr'  rf   tui_gateway.transportr(  r)  _init_sessionrM   rW   r   r   getcwd_load_show_reasoning_load_tool_progress_mode_sanitize_client_source)r   r   r   rQ   keyr   r   r  r&  
home_tokenr  r  rR   r'  r(  r)  tokens                    r   r  z"ComputeHost._ensure_server_session  s   %))E"(b)%))M*1c2""&&s+#'??GK yy ,"%eii&7&=2">yy!$UYYu%5!6yy(*-eii.G*H'%))$56=-1%))<M2N2TRT-U)*N*4UYYy5I4*P%))I&VX599^4:;

	E25lC
&tL/AJ/NO
&&$yy)9:*/))4O*P&+ii0G&H"'))H"5% ' 	E %K.z:+	M"4??3E'$$MUYYv.4"5EIIe,23;t) 99X. % 	  &8 ""3'#"."M'++n2Meii 12D9)-eii8I.J.Pb)QG%&99%&2(-		2B(CG$%k !  %K.z:   &.  & 	%%s% 4=% 	 0	%
 "3uyy1B'C'Hq#I%  % diik% tyy{% 5% "2%  % s599U+:ryy{;% EIIf-34% % !&"="="?%  %f&E&E&G!%" !"#%$ $&"')),<"= 8889LM!__+%FS!		so   B M M  N ;A-N (N 	MMN"M10N1	M=:N<M==N
NN ES S c           	     6   t        |j                  d      xs d      }|j                  d      }	 ddlm} |j	                  |d|ddd	      }| j                  d
|||d       y # t        $ r)}| j                  d||t        |      d       Y d }~y d }~ww xY w)NrQ   r,   r   r   r   
reload.mcpT)r   confirm)idr_   ra   zreload_mcp.ack)rc   rQ   r   responsecontrol.errorr   )r   re   r   r   handle_requestr\   rf   )r   r   rQ   r   r   respr   s          r   r   zComputeHost._handle_reload_mcp  s    %))E"(b)YY|,
	l*((
lmp  ~B  _C  *D  EDII/:cghi 	lIIs*adehaijkk	ls   4A& &	B/BBc                8   t        |j                  d      xs d      }|j                  d      }t        |j                  d      xs d      }	 ddlm} ddlm} |j                  |      }|| j                  d||d	| d
       y |j                  j                  |      }|| j                  d||dd
       y |dk(  r(|j                  d      r| j                  d||dd
       y |dk(  r| j                  i |ddi       y t        |j                  d      xs d      }	d}
|	r|j                  |||	      }
|d   5  t        |j                  dd            }t        |j                  d      xs g       }t        |j                  d      xs d      }d d d        | j                  d||||
|j                  |j                  d      |      d	       y # 1 sw Y   DxY w# t        $ r)}| j                  d||t        |      d
       Y d }~y d }~ww xY w)NrQ   r,   r   
route_namer   r   )MUTATOR_ROUTE_TABLErC  zunclassified route: r   zsession not foundz
idle-gatedrU   r   r?  rc   r   commandr   rS   r   r	  zcontrol.ackrR   )	rc   rQ   r   rG  outputr	  rS   r  r  )r   re   r   r   tui_gateway.host_supervisorrH  r\   r   r   _mirror_slash_side_effectsr7   r  r  rf   )r   r   rQ   r   rG  r   rH  router   rI  rJ  rS   r  r	  r   s                  r   r   zComputeHost._handle_control  s,   %))E"(b)YY|,
<06B7
(	l*G'++J7E}		?3jg{  }G  |H  fI  J  K&&**3/G		?3jexyz$Y)?		?3jestu\)''(G5(G&,(GH%))I.4"5GF::3Q( D"%gkk2CQ&G"H #GKK	$:$@b A!'++m"<"BCD II)",",$#.'6%2$*$8$8W9Mw$W
	D D"  	lIIs*adehaijkk	lsJ   8G' 3G' <,G' )G' :G'  AGAG' G$ G' '	H0HHc                p    | j                   5  | xj                  dz  c_        d d d        y # 1 sw Y   y xY wrm   )r   r   r   s    r   r   zComputeHost._bump_progress<  s1       	(""a'"	( 	( 	(s   ,5c           	        | j                   j                  | j                        s| j                  5  t	        d | j
                  D              }d d d        | j                  5  | j                  }d d d        | j                  dt        t        j                               d       | j                   j                  | j                        sy y # 1 sw Y   xY w# 1 sw Y   nxY w)Nc              3  B   K   | ]  }|j                         rd   yw)rn   N)r   ).0r   s     r   	<genexpr>z.ComputeHost._heartbeat_loop.<locals>.<genexpr>C  s     "Q1"Qs   hb)rc   active_turnsprogress_counterrss_mb)r   r   r   r   sumr   r   r   r\   _rss_mbr   getpid)r   rT  counters      r   r   zComputeHost._heartbeat_loop@  s    ,,##D$8$89(( R""Qd.@.@"QQR$$ 1001II $0(/%biik2	 ,,##D$8$89R R1 1s   C#CCC&c                f   | j                   j                  d      st        j                         }|dv s| j                  rU|| j                  k7  rF| j                  d| j                  |d       | j                  d       t        j                  d       | j                   j                  d      sy y )Ng      ?>   r   rn   orphan)rc   old_ppidppidr   r   )r   r   r   r   r   r\   r   _exit)r   r^  s     r   r   zComputeHost._parent_guard_loopO  s    ,,##C(::<Dv~$"2"2tt?O?O7O		89I9ISWXYX. ,,##C(r   )r   r   r   z
int | Noner   zint | float | NonerD   rE   )r   rG   rD   rE   rC   )r   r   r   rF   rD   rE   )r   r   rD   rE   )r   rP   r   rG   rD   rE   )r   r   r   rG   rD   rk   )rH   rI   rJ   r]   r\   rj   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r   r   r   r   r   r   {   s     "&-1r r  	r
 +r 
r>7A )3$ 
A 3= 	:	a== K@7qvF@P`D	l,l\(r   r   c           	     (   	 t        j                  ddddt        |       gdt         j                  t         j                  d      j	                         }|r-t        |j                         d   j	                               d	z  S d
S # t        $ r Y y
w xY w)Npsz-ozrss=z-pTrv   )rx   stdinry   rz   g      @r   )r|   r}   r   r~   r   r7   
splitlinesrf   )pidouts     r   rX  rX  X  s    %%tT64S&JQU]g]o]o  yC  yK  yK  UV  W  ]  ]  _=@s3>>#B'--/069IcI s   B B B 	BBc                     	 t        dt        t        j                  j	                  d      xs d            S # t
        t        f$ r Y yw xY w)Nrv   HERMES_TUI_RPC_POOL_WORKERS8   )r6   r7   r   r   re   r  r  r   r   r   r   r   `  sC    1c"**..)FGN3OPPz" s   58 A
	A
c                    dt         j                  d<    xs t        j                   t	        |xs t        j
                        t        j                         dfd}	 t        j                  t        j                  |       t        j                  t        j                  |       j                  dt        j                         j                  t               t        j                          t         j                  j#                  dd      d       d fd	}t        j$                  |d
d      }|j'                          	 j(                  j+                  d      s-|j-                         snj(                  j+                  d      s-j/                  dd       y # t        $ r Y w xY w# j/                  dd       w xY w)N1HERMES_COMPUTE_HOST_CHILD)r   c                    j                         ry j                          j                  d       t        d      )Nsigtermr   r   )r8   r   r   
SystemExit)_signum_framehostshutting_downs     r   _signal_handlerz!run_host.<locals>._signal_handlerm  s6    !Y'mr   helloHERMES_HOMEr,   )rc   host_pidboot_id	build_sharw   hermes_homec                    D ]  } j                   j                         r y 	 t        j                  |       }t        |t              sj                  ddd       Zj                  |       |j                  d      dk(  rt        j                  d       j                   j                         s y  y # t        j                  $ r!}j                  dd| d       Y d }~d }~ww xY w)Nr   zinvalid json: )rc   rd   zframe must be an objectrc   r   r   )r   r8   r   loadsJSONDecodeErrorr\   r   rk   r   re   r   r_  )rawr   r   rs  rb  s      r   _readerzrun_host.<locals>._reader  s     	C||""$

3 eT*		77PQRe$yy J.||""$	
 '' 		7u7MNOs   B77C+
C&&C+zcompute-host-control-readerTr   g?stdin_closedg       @r   rC   )r   r   r   rb  r   r   rM   rN   signalSIGTERMSIGINTrf   r\   rY  r   r   r7  re   r   r   r   r   is_aliver   )rb  r   ru  r  readerrs  rt  s   `    @@r   run_hostr  g  sL   .1BJJ*+SYYEf2

3DOO%Mfnno6fmm_5 	II		}}#99;::>>-<	
	$ W3PY]^F
LLN7,,##C(??$ ,,##C( 	^#6O  N 	^#6s    %AF% 	AF5 %	F21F25G
c                f    t        j                  d      }|j                  |        t                y)NzDashboard compute-host process)descriptionr   )argparseArgumentParser
parse_argsr  )argvparsers     r   mainr    s)    $$1QRF
dJr   __main__)rD   r7   )rD   r   )rD   r   )re  r7   rD   rF   )NN)rb  r   r   r   rD   rE   r
   )r  zlist[str] | NonerD   r7   )#rK   
__future__r   r  concurrent.futuresr   r   r   r  r|   r   rM   r   r   dataclassesr   r   pathlibr   typingr   r   r   r   rP   rY   rr   r   r   rX  r   r  r  rH   rp  r   r   r   <module>r     s    #    	   
    (   " .[ .[ .[b A A A $/
Z Zz77t z
TV
 r   