
    Pmjs                    n   U 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mZm	Z	 ddl
mZ ddlmZmZ ddlmZ ddlmZ d	d
lmZ d	dlmZmZmZmZmZmZmZmZmZ d	dlm Z   ej!        e"          Z# e$h d          Z% e&            Z'i Z(de)d<    ej*                    Z+d?dZ,e G d d                      Z-e G d d                      Z.e G d d                      Z/ G d d          Z0d@dZ1dAd!Z2dBd%Z3dCd&Z4dDd*Z5d+d,dEd1Z6ddd2dFd7Z7d8dd9dGd=Z8ej9        :                    ee5           dCd>Z;dS )Hz?Direct NeMo Relay integration for Hermes shared client metrics.    )annotationsN)	dataclassfield)monotonic_ns)AnyCallable)relay_runtime)__version__   )SharedMetricsStore)	MODEL_CALL_SCOPE
SCHEMA_KEYSCHEMA_VERSIONSUBSCRIBER_NAME
TASK_SCOPEmodel_call_fieldsmodel_call_outcometask_start_fieldstask_terminal_fields)SharedMetricsSubscriber>
   pre_llm_callsubagent_stopon_session_endpost_tool_callpre_api_requeston_session_reseton_session_startpost_api_requestapi_request_erroron_session_finalizezdict[str, _Runtime | object]	_RUNTIMESeventdict[str, Any]return
int | Nonec                    |                      d          }t          |t                    rt          |t                    s|dk    r|S d S )Nretry_countr   )get
isinstanceintbool)r"   values     S/home/thesage/.hermes/hermes-agent/hermes_cli/observability/relay_shared_metrics.py_retry_ordinalr.   2   sH    IIm$$E% j&=&= %1**4    c                  <    e Zd ZU ded<   ded<   ded<   dZded	<   dS )

_ModelCallr   handlestrtask_iddict[str, str]fieldsNr%   retry_ordinal)__name__
__module____qualname____annotations__r7    r/   r-   r1   r1   9   sA         KKKLLL $M$$$$$$r/   r1   c                      e Zd ZU ded<   ded<   ded<   ded<    ee	          Zd
ed<    ee	          Zd
ed<    ee	          Zd
ed<   dZ	ded<   dZ
ded<   dS )_TaskRunr   r2   zcontextvars.Contextcontextr*   
started_nsr5   start_fieldsdefault_factoryzset[str]model_call_idstool_call_idsturn_idsr   unidentified_tool_callsr'   N)r8   r9   r:   r;   r   setrD   rE   rF   rG   r'   r<   r/   r-   r>   r>   A   s         KKK    OOO    $uS999N9999#eC888M8888s333H3333#$$$$$Kr/   r>   c                      e Zd ZU ded<   ded<    eej        d          Zded<   dZd	ed
<    ee	          Z
ded<    ee	          Zded<   dS )_MetricsSessionr3   
session_idzrelay_runtime.RelaySessionrelay_sessionF)rC   reprzthreading.RLocklockr+   closingrB   zdict[str, _ModelCall]model_callszdict[str, _TaskRun]tasksN)r8   r9   r:   r;   r   	threadingRLockrN   rO   dictrP   rQ   r<   r/   r-   rJ   rJ   N   s         OOO----!E)/NNNDNNNNG).t)D)D)DKDDDD!&t!<!<!<E<<<<<<r/   rJ   c                     e Zd ZdZd7d8dZd9dZd:dZd;dZd<dZd=dZ	d=dZ
d7d>dZd=dZd=dZd=d Zd?d!Zd?d"Zd9d#Zed@d%            Zd&d'dAd*Zed@d+            ZdBd,ZdCd/ZdDd0ZdEd2Zd?d3ZdFd5ZedGd6            ZdS )H_Runtimez?Own shared-metrics state layered on the Hermes core Relay host.Nhost!relay_runtime.RelayRuntime | Noner$   Nonec                   |pt          j                    }|t          d          || _        | j        j        | _        t          j                    | _        d| _        i | _	        t          j                    | _
        t          j                    | _        i | _        i | _        t           d| j        j         | _        t#          t%                      t&          | j        j                  | _        | j        j                            | j        | j                   | j                            | j                   d| _        t3          j        | j                   d S )Nz(Hermes core Relay runtime is unavailableT.)
runtime_id)r	   get_runtimeRuntimeErrorrW   relayrR   rS   _sessions_lock_active	_sessions_task_creation_lock_task_sessions_lock_task_sessions_turn_sessionsr   r\   _subscriber_namer   r   r
   
subscribersubscribersregisterretain_managed_execution_registeredatexitshutdown)selfrW   resolved_hosts      r-   __init__z_Runtime.__init__[   s*   ; 9 ; ; IJJJ0=	Y_
'o//57#,?#4#4 #,?#4#4 FHFH#2 K KTY5I K K1  y+
 
 

 	
''(=tOOO	**4+@AAA&&&&&r/   r"   r#   _MetricsSession | Nonec                   t          |                    d          pd          }|sd S | j        5  | j        s	 d d d            d S | j                            |          }|	 d d d            d S | j                            |          }|t          ||          }|| j        |<   d d d            n# 1 swxY w Y   |j        5  |j	        r	 d d d            d S 	 d d d            n# 1 swxY w Y   |S )NrK    )rK   rL   )
r3   r(   r`   ra   rW   ensure_sessionrb   rJ   rN   rO   )ro   r"   rK   rL   sessions        r-   ru   z_Runtime.ensure_sessions   s   <006B77
 	4  	5 	5< 	5 	5 	5 	5 	5 	5 	5 	5 !I44U;;M$	5 	5 	5 	5 	5 	5 	5 	5 n((44G))"/   .5z*	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 \ 	 	 	 	 	 	 	 	 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 s/   	B3B307B33B7:B7	C((C,/C,rv   rJ   callbackCallable[..., Any]argsr   kwargsc                :     | j         j        |j        |g|R i |S N)rW   run_in_sessionrL   )ro   rv   rw   ry   rz   s        r-   _run_in_sessionz_Runtime._run_in_session   sD     (ty'!
 
 
 
 	
 
 	
r/   _TaskRun | Nonec                                          |          }|dS |\  }} j        5                       |          }||j        5  |j        r	 ddd           ddd           dS |j                            |          }|                     |||           |cddd           cddd           S # 1 swxY w Y                        |          }|	 ddd           dS |j        5  |j        s|j	        j
        	 ddd           ddd           dS |j	        j
                                        }t          |          t          j        |j                  }	|j	        j        |	.|	j        j        |j        k    r|	j        |k    r|	j        |	j        d fd}
|                    |
          }t)          ||t+                                }||j        |<    j        5  | j        |<   ddd           n# 1 swxY w Y                        |||           |cddd           cddd           S # 1 swxY w Y   	 ddd           dS # 1 swxY w Y   dS )z4Open one Relay function scope for a Hermes task run.Nr$   r   c                     j                                          j         j                            t          j         j        j                                                   S )N)r2   inputmetadata)r_   get_scope_stackscopepushr   	ScopeTypeFunction_event_metadata)parent_handlero   rA   s   r-   	push_taskz&_Runtime.start_task.<locals>.push_task   s\    J..000:+00"
,5,*!%!5!5!7!7 1   r/   )r2   r?   r@   rA   r$   r   )	_task_keyrc   _task_sessionrN   rO   rQ   r(   _remember_turnru   rL   r?   copyr   r	   active_turnrK   r2   leaser4   runr>   r   rd   re   )ro   r"   task_key_r4   ownertaskrv   task_contextr   r   r2   r   rA   s   `           @@r-   
start_taskz_Runtime.start_task   s`   >>%((4
7% 2	 2	&&u--E Z    } $#           2	 2	 2	 2	 2	 2	 2	 2	 !;??733D'++E4???             2	 2	 2	 2	 2	 2	 2	 2	                ))%00G2	 2	 2	 2	 2	 2	 2	 2	  $ $?  g&;&C&K$ $ $ $ $ $2	 2	 2	 2	 2	 2	 2	 2	"  '4<AACC077+78JKK ' 5 <+#)48JJJ#+w66#*6$/$6M        &)))44!(+~~!-	   *.g&- < <4;D'1< < < < < < < < < < < < < < <##GT5999I$ $ $ $ $ $ $2	 2	 2	 2	 2	 2	 2	 2	$ $ $ $ $ $ $ $ $2	 2	 2	 2	 2	 2	 2	 2	 2	 2	 2	 2	 2	 2	 2	 2	 2	 2	s   I	B6I)4B6I6B:	:I=B:	>I&I-H<ICH<)H 4H< HH<HH<#I<I 	 II 	IIIr   r>   c                t     d fd}|j                                                             |          S )Nr$   r   c                 F    j                                            i S r|   )r_   r   )ry   rw   rz   ro   s   r-   invokez%_Runtime._run_in_task.<locals>.invoke   s,    J&&(((8T,V,,,r/   r   )r?   r   r   )ro   r   rw   ry   rz   r   s   ` ``` r-   _run_in_taskz_Runtime._run_in_task   sW    	- 	- 	- 	- 	- 	- 	- 	- 	- |  ""&&v...r/   c           
        t          |                    d          pd          }|                     |d          }||j                            |          nd }|.|                     |          }||                     |          nd }||                     |          }|d S t          |                    d          pd          }|sd S t          |          }t          |          }|d         }|j        5  |j	        r	 d d d            d S || 
                    |||           |j                            |          }	|	r||	_        |=||	j        |xj        dz  c_        n#||	j        k    r|xj        ||	j        z
  z  c_        |t          |	j        pd|          |	_        	 d d d            d S ||j                            |           ||dk    r|xj        dz  c_        |                     || j        j        j        t,          | j                            i i           |j        |                                 |	          }
ne|                     || j        j        j        t,          | j                            i i           |j        j        |                                 |	          }
t9          |
t          |                    d          pd          ||
          |j        |<   d d d            d S # 1 swxY w Y   d S )Nr4   rt   Tallow_task_id_fallbackapi_request_idmodel_familyr   r   )r2   r   
model_name)r2   r4   r6   r7   )r3   r(   r   rQ   r   ru   r   r.   rN   rO   r   rP   r6   r7   r'   maxrD   addr   r_   llmcallr   
LLMRequestr2   r   r~   rL   r1   )ro   r"   r4   rv   r   
request_idr6   r7   r   existingr2   s              r-   start_model_callz_Runtime.start_model_call   s   eii	**0b11$$U4$HH-4-@w}  )))d<??5))D373Cd((///G?))%00G?F#344:;;
 	F"5))&u--n-\ 1	 1	 1	 1	 1	 1	 1	 1	 1	 1	 ##GT5999*..z::H#"(#$,0F0N((A-(((&)???((MH<R,RR(( ,-0 .3!%. .H* %1	 1	 1	 1	 1	 1	 1	 1	& #''
333 ,1B1B $$)$$**JN'$J))"b11;!1133+ +   --JN'$J))"b11"07!1133+ .   /9EIIi006B77+	/ / /G
+Y1	 1	 1	 1	 1	 1	 1	 1	 1	 1	 1	 1	 1	 1	 1	 1	 1	 1	s    :	K;BK;7D7K;;K?K?c                ^   t          |                    d          pd          }|                     |d          }||j                            |          nd}|.|                     |          }||                     |          nd}||dS t          |                    d          pd          }|j        5  |j        r	 ddd           dS |                     |||           |r|j        	                    |           n|xj
        dz  c_
        ddd           dS # 1 swxY w Y   dS )z7Count one unique tool invocation under its owning task.r4   rt   Tr   Ntool_call_idr   )r3   r(   r   rQ   r   rN   rO   r   rE   r   rG   )ro   r"   r4   rv   r   r   s         r-   record_tool_callz_Runtime.record_tool_call"  s   eii	**0b11$$U4$HH-4-@w}  )))d<??5))D373Cd((///G?dlF599^44:;;\ 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 u555 2"&&|4444,,1,,	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2s   ;	D"AD""D&)D&outcome
str | Nonec                   |                      |d          }||                     |          }|d S t          |                    d          pd          }|j        5  |j        r	 d d d            d S |j                            |          }|	 d d d            d S t          |          }||_        | 	                    |||pt          |                     d d d            d S # 1 swxY w Y   d S )NTr   r   rt   )r   _sessionr3   r(   rN   rO   rP   r   r6   _finish_model_callr   )ro   r"   r   rv   r   
model_callr6   s          r-   end_model_callz_Runtime.end_model_call6  s   $$U4$HH?mmE**G?F#344:;;
\ 	 	 	 	 	 	 	 	 	 	 !,00<<J!	 	 	 	 	 	 	 	 'u--F &J##4-e44  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   	C'4C'<C''C+.C+c                    |                      |d          }||                     |          }|d S |j        5  |j        r	 d d d            d S |                     ||           d d d            d S # 1 swxY w Y   d S )NTr   )r   r   rN   rO   _end_pending_model_calls)ro   r"   rv   s      r-   end_pending_model_callsz _Runtime.end_pending_model_callsK  s    $$U4$HH?mmE**G?F\ 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: ))'5999	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	:s   	A3A33A7:A7c                   t          |                    d          pd          }|                     |d          p|                     |          }|dS |j        5  |j        r	 ddd           dS |                     |||          }ddd           n# 1 swxY w Y   |rb	 | j        j        	                                 | 
                                 dS # t          $ r  t                              dd           Y dS w xY wdS )z?Close one task scope exactly once with bounded terminal fields.r4   rt   Tr   Nz'Hermes shared-metrics task flush failedexc_info)r3   r(   r   r   rN   rO   _finish_taskr_   ri   flush_export	Exceptionloggerwarning)ro   r"   r4   rv   finisheds        r-   finish_taskz_Runtime.finish_taskV  s   eii	**0b11$$#' % 
 
 " ]]5!! 	 ?F\ 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B (('5AAH	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B  		
&,,...     =!       		 		s*   	B2BBB#C &D Dc                D   |                      |          }|d S g }|j        5  |j        r	 d d d            d S d|_        t          |j                  D ]#}|                     ||i ||ddddd           $|                     ||           d d d            n# 1 swxY w Y   	 | j        j        	                                 | 
                                 n/# t          $ r"}|                    d|            Y d }~nd }~ww xY w| j        5  | j                            |j                  |u r | j                            |j        d            d d d            n# 1 swxY w Y   |r6t$                              d|j        d                    |                     d S d S )NTFsystem_aborted)r4   	completedfailedinterruptedturn_exit_reasonzsubscriber flush failed: z7Hermes shared-metrics session %s closed with errors: %sz; )r   rN   rO   listrQ   r   r   r_   ri   r   r   r   appendr`   rb   r(   rK   popr   r   join)ro   r"   rv   failuresr4   excs         r-   close_sessionz_Runtime.close_sessionn  s   --&&?F \ 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: #GO..  !!#*%*"&',,<      ))'5999#	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	:$	J"((*** LLNNNN  	? 	? 	?OO===>>>>>>>>	?   	= 	=~!!'"455@@""7#5t<<<	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	=  	NNI"		(##    	 	sB   	BABB!B&C 
D#D  DAEE!$E!c                   | j         5  d| _        t          | j                  }d d d            n# 1 swxY w Y   |D ]}|                     | j        d|i            | j        sd S 	 | j        j        	                                 | 
                                 n,# t          $ r t                              dd           Y nw xY w|                     | j        j        j        | j                   | j                            | j                   d| _        	 t%          j        | j                   d S # t          $ r Y d S w xY w)NFrK   z+Hermes shared-metrics shutdown flush failedTr   )r`   ra   r   rb   _safer   rl   r_   ri   r   r   r   r   r   
deregisterrg   rW   release_managed_executionrm   
unregisterrn   )ro   session_idsrK   s      r-   rn   z_Runtime.shutdown  s     	/ 	/ DLt~..K	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ & 	G 	GJJJt)L*+EFFFF 	F	J"((*** LLNNNN  	 	 	NN=      	 	

4:)4d6KLLL	++D,ABBB 	dm,,,,, 	 	 	DD	s0   044'B &CCD2 2
E ?E c                >   | j         5  d| _        ddd           n# 1 swxY w Y   | j                                         | j        rP|                     | j        j        j        | j	                   | j
                            | j	                   d| _        | j         5  t          | j                                                  }ddd           n# 1 swxY w Y   |D ]}|j        5  |j        r	 ddd           d|_        t          |j                  D ]#}|                     |||j        |ddd           $|                     |i            ddd           n# 1 swxY w Y   | j         5  | j                                         ddd           n# 1 swxY w Y   | j        5  | j                                         | j                                         ddd           n# 1 swxY w Y   	 t3          j        | j                   dS # t8          $ r Y dS w xY w)z=Stop collection without exporting locally aggregated metrics.FNTr   )rK   r4   r   r   )r`   ra   rh   
deactivaterl   r   r_   ri   r   rg   rW   r   r   rb   valuesrN   rO   rQ   r   rK   r   clearrd   re   rf   rm   r   rn   r   )ro   sessionsrv   r4   s       r-   r   z_Runtime.deactivate  s     	! 	! DL	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!""$$$ 	%JJtz-8$:OPPPI//0EFFF$D  	5 	5DN113344H	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	; 	;G ; ;? ; ; ; ; ; ; ; #'#GM22 
 
G%%*1*<'.&*0@	 	 	 	 	 --gr:::; ; ; ; ; ; ; ; ; ; ; ; ; ; ;    	# 	#N  """	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#% 	( 	(%%'''%%'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(	dm,,,,, 	 	 	DD	sm     'CCC'	E<AEE!	$E!	0FFF(3G''G+.G+3H 
HHc                    t          |                    d          pd          }| j        5  | j                            |          cd d d            S # 1 swxY w Y   d S )NrK   rt   )r3   r(   r`   rb   )ro   r"   rK   s      r-   r   z_Runtime._session  s    <006B77
  	2 	2>%%j11	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2s   AAAtuple[str, str] | Nonec                    t          |                     d          pd          }t          |                     d          pd          }|r|sd S ||fS )NrK   rt   r4   r3   r(   )r"   rK   r4   s      r-   r   z_Runtime._task_key  ]    <006B77
eii	**0b11 	 	47""r/   Fr   r   r+   c               R  
 |                      |          }|d S |                     |          }| j        5  |*| j                            |          }||cd d d            S | j                            |          }||s|cd d d            S |d         }g }| j                                        D ]?\  \  }}	
|	|k    rt          
fd|D                       s|                    
           @t          |          dk    r|d         nd cd d d            S # 1 swxY w Y   d S )Nr   c              3      K   | ]}|u V  	d S r|   r<   ).0	candidaterv   s     r-   	<genexpr>z)_Runtime._task_session.<locals>.<genexpr>  s(      LLI9/LLLLLLr/   r   )
r   	_turn_keyrd   rf   r(   re   itemsanyr   len)ro   r"   r   r   turn_keyr   r4   
candidatesr   candidate_task_idrv   s             @r-   r   z_Runtime._task_session  s    >>%((4>>%((% 	C 	C#+//99$ 		C 	C 	C 	C 	C 	C 	C 	C
 '++H55E (> 	C 	C 	C 	C 	C 	C 	C 	C qkG02J373F3L3L3N3N / //&%$//LLLLLLLLL /%%g...$'
OOq$8$8:a==d	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	Cs    D$DA?DD #D c                    t          |                     d          pd          }t          |                     d          pd          }|r|sd S ||fS )NrK   rt   turn_idr   )r"   rK   r   s      r-   r   z_Runtime._turn_key  r   r/   c                    t          |                    d          pd          }|sd S |j                            |           | j        5  || j        |j        |f<   d d d            d S # 1 swxY w Y   d S )Nr   rt   )r3   r(   rF   r   rd   rf   rK   )ro   rv   r   r"   r   s        r-   r   z_Runtime._remember_turn  s     eii	**0b11 	F'"""% 	I 	IAHD!3W =>	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	Is   
A))A-0A-r   r3   c                   |j                             |d           }|d S 	 |j                            |j                  }|M|                     || j        j        j        |j	        i |j
        d|i|                                            d S |                     || j        j        j        |j	        i |j
        d|i|                                            d S # t          $ r  t                              dd           Y d S w xY w)Nr   )r   z-Hermes shared-metrics model call close failedTr   )rP   r   rQ   r(   r4   r   r_   r   call_endr2   r6   r   r~   r   r   r   )ro   rv   r   r   r   r   s         r-   r   z_Runtime._finish_model_call  sT    (,,Z>>
F	=$$Z%788D!!JN+%=z(=)W==!1133 "      $$JN+%=z(=)W==!1133 %       	 	 	NN?$       	s   A,C AC &DDc                   t          |                    d          pd          fd|j                                        D             }|                    d          rdnd}|D ]}|                     |||           d S )Nr4   rt   c                4    g | ]\  }}r|j         k    |S r<   )r4   )r   r   r   r4   s      r-   
<listcomp>z5_Runtime._end_pending_model_calls.<locals>.<listcomp>7  s?     
 
 
&
J
 )0G;; ;;;r/   r   	cancelledr   )r3   r(   rP   r   r   )ro   rv   r"   request_idsr   r   r4   s         @r-   r   z!_Runtime._end_pending_model_calls1  s    
 eii	**0b11
 
 
 
*1*=*C*C*E*E
 
 

 "'=!9!9G++x% 	B 	BJ##GZAAAA	B 	Br/   r4   c                \   |j                             |          }|dS |                     |i |d|i           t          i |j        |t          dt                      |j        z
  dz            t          |j	                  t          |j
                  |j        z   |j                  }	 |                     || j        j        j        |j        ||                                            n,# t&          $ r t(                              dd	           Y nw xY w|j                             |d            | j        5  |j        |f}| j                            |          |u r| j                            |d            |j        D ]B}|j        |f}| j                            |          |u r| j                            |d            C	 d d d            n# 1 swxY w Y   n# |j                             |d            | j        5  |j        |f}| j                            |          |u r| j                            |d            |j        D ]B}|j        |f}| j                            |          |u r| j                            |d            C	 d d d            w # 1 swxY w Y   w xY wdS )
NFr4   r   i@B )duration_msmodel_call_counttool_call_countr'   )outputr   z'Hermes shared-metrics task close failedTr   )rQ   r(   r   r   rA   r   r   r@   r   rD   rE   rG   r'   r   r_   r   r   r2   r   r   r   r   rd   rK   re   rF   rf   )	ro   rv   r4   r"   r   r6   r   r   r   s	            r-   r   z_Runtime._finish_task@  s    }  ))<5%%g/L%/LG/L/LMMM%*t *E*A @YNOO !455 233d6RR(
 
 
	@
 $--//       	U 	U 	UNNDtNTTTTT	U Mgt,,,) @ @#.8&**844??'++Hd;;;#} @ @G ' 2G<H*..x88GCC+//$???@	@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ Mgt,,,) @ @#.8&**844??'++Hd;;;#} @ @G ' 2G<H*..x88GCC+//$???@	@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ tsc   /A C0 /G" 0&DG" DG" >BGGG"#J)BJJ)J!!J)$J!%J)c                N    |                      | j        j        j                   d S r|   )r   rh   store create_and_export_package_if_duero   s    r-   r   z_Runtime._exportg  s"    

4?(IJJJJJr/   r5   c                J    t           t          t          j        | j        j        iS r|   )r   r   r	   RUNTIME_INSTANCE_KEYrW   r\   r   s    r-   r   z_Runtime._event_metadataj  s    .	0D
 	
r/   c                n    	  | |i |S # t           $ r  t                              dd           Y d S w xY w)Nz&Hermes shared metrics operation failedTr   )r   r   r   )rw   ry   rz   s      r-   r   z_Runtime._safep  sU    	8T,V,,, 	 	 	NNCdNSSS44	s   
 &44r|   )rW   rX   r$   rY   )r"   r#   r$   rr   )
rv   rJ   rw   rx   ry   r   rz   r   r$   r   )r"   r#   r$   r   )
r   r>   rw   rx   ry   r   rz   r   r$   r   )r"   r#   r$   rY   )r"   r#   r   r   r$   rY   r$   rY   )r"   r#   r$   r   )r"   r#   r   r+   r$   rr   )rv   rJ   r   r>   r"   r#   r$   rY   )rv   rJ   r   r3   r   r3   r$   rY   )rv   rJ   r"   r#   r$   rY   )rv   rJ   r4   r3   r"   r#   r$   r+   )r$   r5   )rw   rx   ry   r   rz   r   r$   r   )r8   r9   r:   __doc__rq   ru   r~   r   r   r   r   r   r   r   r   rn   r   r   staticmethodr   r   r   r   r   r   r   r   r   r   r<   r/   r-   rV   rV   X   sS       II' ' ' ' '0   ,
 
 
 
8 8 8 8t/ / / /B B B BH2 2 2 2(    *	: 	: 	: 	:   0% % % %N   2$ $ $ $L2 2 2 2
 # # # \# (-	C C C C C C6 # # # \#I I I I   @B B B B% % % %NK K K K
 
 
 
    \  r/   rV   r+   c                    t          j                    } 	 ddlm}  |            pi }t	          |t
                    r|                    d          nd}t	          |t
                    r|                    d          nd}t	          |t
                    o|                    d          du }n.# t          $ r! t          	                    dd	           d
}Y nw xY w|rdS t          5  t                              | d          }t	          |t                    r|                                 ddd           n# 1 swxY w Y   d
S )z?Return the shared-metrics policy for the active Hermes profile.r   )read_raw_config_readonly	telemetryNshared_metricsenabledTz+Unable to read Hermes shared-metrics policyr   F)r	   current_profile_keyhermes_cli.configr  r)   rT   r(   r   r   debug_RUNTIME_LOCKr!   r   rV   r   )profile_keyr  configr  r	  r,   runtimes          r-   r
  r
  y  s   355K
>>>>>> *)++1r
 0:&$/G/GQFJJ{+++T	/9)T/J/JTIMM*+++PT 	 ~t,, 6""9--5 	    BTRRR  t	 ! !--T22gx(( 	!   ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 5s$   B, ,(CC%AD66D:=D:	hook_namer3   c                0    | t           v ot                      S r|   )HANDLED_HOOKSr
  )r  s    r-   handles_hookr    s    %3'))3r/   rz   r   rY   c                :   t          |           sdS t                      }|dS 	 | dk    r|                    |           dS | dk    r|                    |           dS | dk    r|                    |           dS | dk    r|                    |           dS | dk    r|                    |d           dS | dk    r1|                    d	          d
u r|                    |d           dS dS | dk    r|                    |           dS | dk    rAt          |                    d          pd          }|r|
                    d|i           dS dS | dv r|
                    |           dS dS # t          $ r! t                              d| d           Y dS w xY w)zCProject one Hermes lifecycle event into the core Relay integration.Nr   r   r   r   r   successr   	retryableFr   r   r   child_session_idrt   rK   >   r   r    z%Hermes shared metrics hook failed: %sTr   )r  _get_runtimeru   r   r   r   r   r(   r   r3   r   r   r   r   )r  rz   r  r  s       r-   observe_lifecycler    s6   	"" nnG
***""6*****.((v&&&&&+++$$V,,,,,***$$V,,,,,,,,""6955555---zz+&&%//&&vx88888 0/***'''''/))"6::.@#A#A#GRHH H%%|5E&FGGGGGH HEEE!!&))))) FE 
 
 
3Y 	 	
 	
 	
 	
 	
 	

sB   E/ E/ E/ <E/ E/ 73E/ .E/ AE/ E/ /'FFc                 F    t                      rt          d           dS dS )zDRegister the subscriber before any producer opens the session scope.Tretry_failedN)r
  r  r<   r/   r-   prepare_session_startr    s/    yy ($''''''( (r/   rW   relay_runtime.RelayRuntimer?   c                    ~| j         t          j                    k    r!t                      rt	          d|            dS dS dS )zDPrepare the profile subscriber before the coordinator opens a scope.Tr  rW   N)r  r	   r  r
  r  )rW   r?   s     r-   _prepare_core_sessionr#    sU    
 	=<>>>>99 	7d666666 ?>	7 	7r/   rt   )parent_session_idrK   r4   platformr$  c                    t                      sdS t          d          }|dS |                    |j        | |||d           dS )z:Start task metrics at the outer Hermes execution boundary.NTr  )rK   r4   r%  r$  )r
  r  r   r   )rK   r4   r%  r$  r  s        r-   start_task_runr'    sk     99 ---GMM$ !2		
 	
    r/   )resulterrorr(  dict[str, Any] | Noner)  BaseException | Nonec                   t                      sdS t                      }|dS t          |t                    r|ni }|                    d          du }|                    d          du }|                    d          du }	t          |                    d          p|                    d          pd          }
|[t          |t          t          f          pt          |          j	        d	k    }t          |t                    }d
}| }	|rd}
n|rd}
nd}
n|
s|	rdnd}
|                    |j        | ||||	||
d           dS )z7Finish task metrics for every return or exception path.Nr   Tr   r   r   failure_reasonrt   CancelledErrorFinterrupted_by_user	timed_outr   unknown)rK   r4   r%  r   r   r   r   )r
  r  r)   rT   r(   r3   KeyboardInterruptInterruptedErrortyper8   TimeoutErrorr   r   )rK   r4   r%  r(  r)  r  terminalr   r   r   reasonr0  s               r-   finish_task_runr8    s    99 nnG#FD119vvrH,,}--5K[))T1I\\(##t+F'((PHLL9I,J,JPb F  ):<L(MNN 
KK $44 	 ul33		  	&*FF 	& FF%FF 3#2MM$ "& &	
 	
    r/   Fr"  r  rX   _Runtime | Nonec                   t          j                    }t          5  t                              |          }t          |t                    rH|	|j        |u r|cd d d            S |                                 t          	                    |d            |t          u r| s	 d d d            d S |t          u rt          	                    |d            	 t          |          }nG# t          $ r: t                              dd           t          t          |<   Y d d d            d S w xY w|t          |<   |cd d d            S # 1 swxY w Y   d S )N)rW   z+Hermes shared metrics initialization failedTr   )r	   r  r  r!   r(   r)   rV   rW   r   r   _RUNTIME_FAILEDr   r   r   )r  rW   r  r  s       r-   r  r    s   
  355K	  --,,gx(( 	-|w|t33	       
    MM+t,,,o%%l%        o%%MM+t,,,	D)))GG 	 	 	NNHSWNXXX%4Ik"!       	 ")	+%                 sA   <E$;E,$EC"!E"5D&E%D&&EEEc                    t           5  t          t                                                    } t                                           ddd           n# 1 swxY w Y   | D ]+}t          |t                    r|                                 ,dS )zAReset all profile-scoped shared-metrics state for isolated tests.N)r  r   r!   r   r   r)   rV   rn   )runtimesr  s     r-   _reset_for_testsr>  ?  s    	  	((**++                 gx(( 	 s   A AAA)r"   r#   r$   r%   )r$   r+   )r  r3   r$   r+   )r  r3   rz   r   r$   rY   r  )rW   r   r?   r#   r$   rY   )
rK   r3   r4   r3   r%  r3   r$  r3   r$   rY   )rK   r3   r4   r3   r%  r3   r(  r*  r)  r+  r$   rY   )r  r+   rW   rX   r$   r9  )<r  
__future__r   rm   contextvarsloggingrR   dataclassesr   r   timer   typingr   r   agentr	   
hermes_clir
   r	  r   shared_metrics_contractr   r   r   r   r   r   r   r   r   shared_metrics_subscriberr   	getLoggerr8   r   	frozensetr  objectr;  r!   r;   rS   r  r.   r1   r>   rJ   rV   r
  r  r  r  r#  r'  r8  r  SESSION_COORDINATORregister_session_initializerr>  r<   r/   r-   <module>rN     s   E E E " " " " " "           ( ( ( ( ( ( ( (                             " " " " " " . . . . . .
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 ? > > > > >		8	$	$	      &((*,	 , , , ,	!!    % % % % % % % % 	 	 	 	 	 	 	 	 = = = = = = = =^ ^ ^ ^ ^ ^ ^ ^B   B4 4 4 4 
  
  
  
F( ( ( (7 7 7 7        : %)"&1 1 1 1 1 1l .2     6  ! > >       r/   