+
    wi                         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H	t	H
t
 ^ RIHt ^ RIHt ^ RIHtHtHtHtHt ^ RIHt ^ RIHtHt  ! R R	]	4      tR
 R ltR R lt]R8X  d
   ]! 4        R# R# )z
Hermes Web UI -- Main server entry point.
Thin routing shell: imports Handler, delegates to api/routes.py, runs server.
All business logic lives in api/*.
N)BaseHTTPRequestHandlerThreadingHTTPServer)urlparse)
check_auth)HOSTPORT	STATE_DIRSESSION_DIRDEFAULT_WORKSPACE)j)
handle_gethandle_postc                   d   a  ] tR t^t o RtR 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 t
R
# )HandlerzHermesWebUI/0.2c                    R # )N )selffmtargss   &&*#/home/ubuntu/hermes-webui/server.pylog_messageHandler.log_message   s    t    c                *   < V ^8  d   QhRS[ RS[ RR/# )   codesizereturnNstr)format__classdict__s   "r   __annotate__Handler.__annotate__   s"     / / /s /4 /r   c                   ^ RI p\        \        P                  ! 4       \        V R\        P                  ! 4       4      ,
          R,          ^4      pTP	                  R\        P
                  ! R\        P                  ! 4       4      RV P                  ;'       g    RRV P                  ;'       g    RR	\        V4      P                  4       '       d   \        V4      MTR
V/4      p\        RV 2RR7       R# )z&Structured JSON logs for each request.N_req_t0i  tsz%Y-%m-%dT%H:%M:%SZmethod-pathstatusmsz[webui] Tflush)jsonroundtimegetattrdumpsstrftimegmtimecommandr)   r   isdigitintprint)r   r   r   _jsonduration_msrecords   &&&   r   log_requestHandler.log_request   s    TYY[74DIIK+PPTXXZ[\$-- 4dkkmDdll))cDII$$3t9#4#4#6#6c$iD+
  	!.r   c                   < V ^8  d   QhRR/# r   r   Nr   )r    r!   s   "r   r"   r#   '   s     
K 
K 
Kr   c                   \         P                   ! 4       V n         \        V P                  4      p\	        W4      '       g   R # \        W4      pVRJ d   \        V RR/RR7      # R #   \         d]   p\        RT P                   RT P                   R2\        P                  ! 4       ,           R	R
7       \        T RR/RR7      u R p?# R p?ii ; iNFerrorz	not foundi  )r*   z[webui] ERROR  
Tr,   zInternal server errori  )r0   r%   r   r)   r   r   r   	Exceptionr8   r5   	traceback
format_excr   parsedresultes   &   r   do_GETHandler.do_GET'   s    yy{	Kdii(Fd++V-F5cBB  	KN4<<.$))B?)BVBVBXX`deTG%<=cJJ	K$   &A'  A' 'C2AC	C	Cc                   < V ^8  d   QhRR/# r?   r   )r    r!   s   "r   r"   r#   3   s     
K 
K 
Kr   c                   \         P                   ! 4       V n         \        V P                  4      p\	        W4      '       g   R # \        W4      pVRJ d   \        V RR/RR7      # R #   \         d]   p\        RT P                   RT P                   R2\        P                  ! 4       ,           R	R
7       \        T RR/RR7      u R p?# R p?ii ; irA   )r0   r%   r   r)   r   r   r   rE   r8   r5   rF   rG   rH   s   &   r   do_POSTHandler.do_POST3   s    yy{	Kdii(Fd++V .F5cBB  	KN4<<.$))B?)BVBVBXX`deTG%<=cJJ	KrN   )r%   N)r(   r(   )__name__
__module____qualname____firstlineno__server_versionr   r<   rL   rQ   __static_attributes____classdictcell__)r!   s   @r   r   r      s/     &N+/ /
K 
K
K 
Kr   r   c                    V ^8  d   QhRR/# r?   r   )r    s   "r   r"   r"   @   s     # #4 #r   c                    aa R  R lo \         P                  ! \        P                  RR7       R V3R lloVV3R lp \
        P                  ! V3R l4       \        \        RR	4      \        \        R
R	4      \        \        RR	4      \        \        RR	4      3 F   pVf   K	   \        P                  ! W4       K"  	  R	#   \         d     Li ; i  \         d     KE  i ; i)c                (    V ^8  d   QhR\         RR/# )r   msgr   Nr   )r    s   "r   r"   /_install_exit_diagnostics.<locals>.__annotate__A   s     6 6# 6$ 6r   c                 &    \        R V  2RR7       R# )z[webui] LIFECYCLE Tr,   N)r8   )r]   s   &r   _log'_install_exit_diagnostics.<locals>._logA   s    "3%(5r   Tfileall_threadsc                (    V ^8  d   QhR\         RR/# )r   reasonr   Nr   )r    s   "r   r"   r^   I   s     0 0S 0T 0r   c           	         < S! R V  R\         P                  ! 4        R\         P                  ! 4        24        \        P                  ! \
        P                  RR7       S! RV  24       R#   \         d   pS! RT 24        Rp?L(Rp?ii ; i)zstack dump start reason= pid= ppid=Trb   zstack dump failed: Nzstack dump end reason=)osgetpidgetppidfaulthandlerdump_tracebacksysstderrrE   )rf   excr`   s   & r   _dump_stacks/_install_exit_diagnostics.<locals>._dump_stacksI   s{    'xuRYY[M

~VW	.''SZZTJ 	%fX./  	.&se,--	.s   &A- -B8BBc           	        <  \         P                  ! V 4      P                  pS! R V R\
        P                  ! 4        R\
        P                  ! 4        24       S! RV 24       \         P                   ! V \         P                  4       \
        P                  ! \
        P                  ! 4       V 4       R#   \         d    \	        T 4      p Li ; i)zreceived signal rh   ri   zsignal:N)
signalSignalsnamerE   r   rj   rk   rl   SIG_DFLkill)signumframesignamerr   r`   s   && r   _signal_handler2_install_exit_diagnostics.<locals>._signal_handlerQ   s    	"nnV,11G 	ybiik]&OPwwi()ffnn-
		V$  	"&kG	"s    B6 6CCc                  l   < S ! R \         P                  ! 4        R\         P                  ! 4        24      # )zatexit pid=ri   )rj   rk   rl   )r`   s   r   <lambda>+_install_exit_diagnostics.<locals>.<lambda>[   s#    D;ryy{m6"**,!PQr   SIGTERMNSIGHUPSIGINTSIGUSR1)	rm   enablero   rp   rE   atexitregisterr1   ru   )r}   sigrr   r`   s     @@r   _install_exit_diagnosticsr   @   s    6>0 0% OOQR	40'&(D2QSZ[ackmqSrt{  }C  EN  PT  uU  V;	MM#/	 V/  8  		s#   &C &CCCC"!C"c                    V ^8  d   QhRR/# r?   r   )r    s   "r   r"   r"   f   s     > >d >r   c                     ^ RI Hp HpHp \	        4        \        R\        P                  ! 4        R\        P                  ! 4        R\        P                   2RR7       V ! 4        V! 4       w  r4pV'       gR   V'       dJ   \        RV 2RR7       VP                  4        F  w  rg\        RV R	V 2RR7       K  	  \        R
RR7       \        P                  ! RRR7       \        P                  ! RRR7       \        P                  ! RRR7       \!        \"        \$        3\&        4      p\        R\"         R\$         2RR7       \"        R8X  d   \        R\$         R\$         R2RR7       \        R\$         2RR7       \        RRR7        VP)                  4        \        RRR7       \        RRR7       R#   \        RRR7       i ; i)    )print_startup_configverify_hermes_imports_HERMES_FOUNDz[webui] LIFECYCLE startup pid=ri   z argv=Tr,   z6[!!] Warning: Hermes agent found but missing modules: z     z: z+     Agent features may not work correctly.)parentsexist_okz$  Hermes Web UI listening on http://:z	127.0.0.1z  Remote access: ssh -N -L z:127.0.0.1:z <user>@<your-server>z"  Then open:     http://localhost: z1[webui] LIFECYCLE serve_forever returned normallyz [webui] LIFECYCLE main() exitingN)
api.configr   r   r   r   r8   rj   rk   rl   ro   argvitemsr   mkdirr	   r
   r   r   r   r   serve_forever)	r   r   r   okmissingerrorsmoderrhttpds	            r   mainr   f   si   UU	*299;-vbjjl^6RURZRZQ[
\dhi/1B-FwiPX\]HCE#b&d3 ';4HOOD40dT2D48tg6E	0av
>dK{+D6TFBWX`de	.tf
5TB	"D>AN0=0=s   F; ;G
__main__)__doc__r   rm   rj   ru   ro   r0   rF   http.serverr   r   urllib.parser   api.authr   r   r   r   r   r	   r
   api.helpersr   
api.routesr   r   r   r   r   rS   r   r   r   <module>r      se   
   	  
   C !  L L  .'K$ 'KT#L>: zF r   