§
    ÷žyj®—  ã                  ó  — 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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mZ ddlmZ  ej        e¦  «        ZdZdZd	Zd
ZdZdZi Zded<   e G d„ d¦  «        ¦   «         Z G d„ d¦  «        Z ed¬¦  «         G d„ d¦  «        ¦   «         Z ee z  Z! G d„ d¦  «        Z" e"¦   «         Z#e G d„ d¦  «        ¦   «         Z$e G d„ d¦  «        ¦   «         Z% ej&        dd¬¦  «        Z'ded <    ej&        d!d¬¦  «        Z(d"ed#<    G d$„ d%¦  «        Z) G d&„ d'¦  «        Z* e*¦   «         Z+dWd*„Z,dXd,„Z-dYdZd/„Z.d[d2„Z/ddd3œd\d8„Z0d]d<„Z1d^d?„Z2d_dC„Z3d_dD„Z4d`dE„Z5dadI„Z6dddJœdbdN„Z7dddJœdcdP„Z8dddQ„Z9dedR„Z:dfdT„Z;dgdV„Z<dS )hzBProfile-scoped NeMo Relay runtimes owned by the Hermes agent core.é    )ÚannotationsN)Ú	dataclassÚfield)ÚAnyÚCallable)Úget_hermes_homezhermes.sessionzhermes.turnzhermes.logical_llm_callzhermes.relay.schema_versionzhermes.relay.runtime.v1zhermes.relay.runtime_instancezdict[str, str]Ú_PROFILE_KEY_CACHEc                  ó„   — e Zd ZU dZded<   dZded<    eej        d¬¦  «        Z	ded	<   dZ
d
ed<   dZded<   dZded<   dS )ÚRelaySessionz9One isolated Relay scope stack owned by a Hermes session.ÚstrÚ
session_idÚ Úparent_session_idF©Údefault_factoryÚreprúthreading.RLockÚlockÚboolÚclosingNr   Úhandlezcontextvars.Context | NoneÚcontext)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r   Ú	threadingÚRLockr   r   r   r   © ó    ú9/home/ragecks/.hermes/hermes-agent/agent/relay_runtime.pyr   r      sˆ   € € € € € € àCÐCà€O€O�OØÐÐÐÐÑØ!˜E°)´/ÈÐNÑNÔN€DÐNÐNÐNÑNØ€GÐÐÐÑØ€FÐÐÐÑØ*.€GÐ.Ð.Ð.Ñ.Ð.Ð.r!   r   c                  óÌ   — e Zd ZdZd1ddœd2d
„Zd3d„Zd3d„Zd4d„Zdddœd5d„Zddœd6d„Z	d7d„Z
d8d„Zd9d„Zdd œd:d(„Zdd œd:d)„Zdddœd;d+„Zd<d-„Zd7d.„Zd=d/„Zed>d0„¦   «         ZdS )?ÚRelayRuntimezAOwn Relay session scopes independently of any exporter or plugin.N©Úprofile_keyÚrelayr   r&   ú
str | NoneÚreturnÚNonec               ó„  — |pt          ¦   «         | _        |pt          ¦   «         | _        t	          j        ¦   «         j        | _        t          j	        ¦   «         | _
        i | _        i | _        i | _        t          j	        ¦   «         | _        t          ¦   «         | _        d| _        t%          j        | j        ¦  «         d S )NT)Ú_load_nemo_relayr'   Úcurrent_profile_keyr&   ÚuuidÚuuid4ÚhexÚ
runtime_idr   r   Ú_sessions_lockÚ	_sessionsÚ_subagent_parentsÚ_subagent_parent_handlesÚ_execution_consumers_lockÚsetÚ_execution_consumersÚ_shutdown_registeredÚatexitÚregisterÚshutdown)Úselfr'   r&   s      r"   Ú__init__zRelayRuntime.__init__,   sœ   € ØÐ0Õ.Ñ0Ô0ˆŒ
Ø&Ð?Õ*=Ñ*?Ô*?ˆÔÝœ*™,œ,Ô*ˆŒÝ'œoÑ/Ô/ˆÔØ24ˆŒØ13ˆÔØ8:ˆÔ%Ý)2¬Ñ):Ô):ˆÔ&Ý.1©e¬eˆÔ!Ø$(ˆÔ!ÝŒ˜œÑ&Ô&Ð&Ð&Ð&r!   Úconsumerr   c                óœ   — |st          d¦  «        ‚| j        5  | j                             |¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z<Keep managed LLM and tool execution active for one consumer.z2Relay managed-execution consumer must not be emptyN)Ú
ValueErrorr6   r8   Úadd©r=   r?   s     r"   Úretain_managed_executionz%RelayRuntime.retain_managed_execution9   sž   € àð 	SÝÐQÑRÔRÐRØÔ+ð 	4ð 	4ØÔ%×)Ò)¨(Ñ3Ô3Ð3ð	4ð 	4ð 	4ñ 	4ô 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4øøøð 	4ð 	4ð 	4ð 	4ð 	4ð 	4s   ™AÁAÁAc                óz   — | j         5  | j                             |¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z3Release a consumer's managed-execution requirement.N)r6   r8   ÚdiscardrC   s     r"   Úrelease_managed_executionz&RelayRuntime.release_managed_execution@   s†   € àÔ+ð 	8ð 	8ØÔ%×-Ò-¨hÑ7Ô7Ð7ð	8ð 	8ð 	8ñ 	8ô 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8øøøð 	8ð 	8ð 	8ð 	8ð 	8ð 	8s   ˆ0°4·4r   c                ól   — | j         5  t          | j        ¦  «        cddd¦  «         S # 1 swxY w Y   dS )zBReturn whether a Hermes-managed consumer needs the Relay pipeline.N)r6   r   r8   ©r=   s    r"   Úmanaged_execution_enabledz&RelayRuntime.managed_execution_enabledE   s}   € àÔ+ð 	3ð 	3Ý˜Ô1Ñ2Ô2ð	3ð 	3ð 	3ð 	3ñ 	3ô 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3øøøð 	3ð 	3ð 	3ð 	3ð 	3ð 	3s   ˆ)©-°-©ÚdataÚmetadataÚeventúdict[str, Any]rL   rM   údict[str, Any] | NoneúRelaySession | Nonec          
     óŽ  — t          |¦  «        }|sdS | j        5  | j                             |¦  «        }|€6| j                             |d¦  «        }t          ||¬¦  «        }|| j        |<   ddd¦  «         n# 1 swxY w Y   |j        5  |j        r	 ddd¦  «         dS |j        �€d}i |pi ¥t          t          t          | j        i¥}|j        re| j        5  | j                             |¦  «        }ddd¦  «         n# 1 swxY w Y   |€%|                      d|j        i¦  «        }	|	�|	j        }d|d<   t!          j        ¦   «         }
	 |
                     | j        j        j        t,          | j        j        j        ||i |¬¦  «        |_        n# t2          $ r	 d|_        ‚ w xY w|
|_        ddd¦  «         n# 1 swxY w Y   |S )z4Return the existing session scope or create it once.Nr   )r   r   r   ÚsubagentÚnemo_relay_scope_role)r   rL   ÚinputrM   )Ú_session_idr2   r3   Úgetr4   r   r   r   r   ÚRUNTIME_SCHEMA_KEYÚRUNTIME_SCHEMA_VERSIONÚRUNTIME_INSTANCE_KEYr1   r   r5   Úensure_sessionÚcontextvarsÚContextÚrunr'   ÚscopeÚpushÚSESSION_SCOPEÚ	ScopeTypeÚAgentÚ	Exceptionr   )r=   rN   rL   rM   r   Úsessionr   Úparent_handleÚscope_metadataÚparentr   s              r"   r[   zRelayRuntime.ensure_sessionJ   s  € õ ! Ñ'Ô'ˆ
Øð 	Ø�4ØÔ ð 	5ð 	5Ø”n×(Ò(¨Ñ4Ô4ˆGØˆØ$(Ô$:×$>Ò$>¸zÈ2Ñ$NÔ$NÐ!Ý&Ø)Ø&7ðñ ô �ð .5�”˜zÑ*ð	5ð 	5ð 	5ñ 	5ô 	5ð 	5ð 	5ð 	5ð 	5ð 	5ð 	5øøøð 	5ð 	5ð 	5ð 	5ð Œ\ð "	*ð "	*ØŒð Øð"	*ð "	*ð "	*ñ "	*ô "	*ð "	*ð "	*ð "	*ð Œ~Ñ%Ø $�ð"Ø�~ 2ð"å&Õ(>Ý(¨$¬/ð"ð "�ð
 Ô,ð 	IØÔ,ð Vð VØ(,Ô(E×(IÒ(IÈ*Ñ(UÔ(U˜ðVð Vð Vñ Vô Vð Vð Vð Vð Vð Vð Vøøøð Vð Vð Vð Và$Ð,Ø!%×!4Ò!4Ø(¨'Ô*Cð6ñ "ô "˜ð "Ð-Ø,2¬M˜MØ>H�NÐ#:Ñ;Ý%Ô-Ñ/Ô/�ðØ%,§[¢[Øœ
Ô(Ô-Ý%Øœ
Ô,Ô2Ø,Ø!Ø Ø!/ð &1ñ &ô &�G”N�Nøõ !ð ð ð Ø&*�G”OØðøøøð #*�”ðE"	*ð "	*ð "	*ñ "	*ô "	*ð "	*ð "	*ð "	*ð "	*ð "	*ð "	*øøøð "	*ð "	*ð "	*ð "	*ðF ˆsh   ›AA:Á:A>ÂA>Â	F:Â"8F:ÃDÃ5F:ÄD	ÄF:ÄD	Ä	AF:ÅAFÆF:ÆF$Æ$
F:Æ:F>ÇF>©rM   c               ó4  — t          |                     d¦  «        pd¦  «        }t          |                     d¦  «        pd¦  «        }|r|r||k    rdS |                      d|i¦  «        }|€dn|j        }t	          |¦  «        }|�D|j        s=|j        �6|j        j        | u r(|j        j        �|j        j        j	        |k    r|j        }| j
        5  || j        |<   |�
|| j        |<   ddd¦  «         n# 1 swxY w Y   |                      d|i|¬¦  «        S )z@Open a child Agent scope under its spawning turn when available.r   r   Úchild_session_idNr   ri   )r   rW   r[   r   Úactive_turnÚclosedÚleaseÚhostre   r   r2   r4   r5   )r=   rN   rM   r   rk   rh   rf   Úturns           r"   Úregister_subagentzRelayRuntime.register_subagentƒ   s¦  € õ   §	¢	Ð*=Ñ >Ô >Ð DÀ"ÑEÔEÐÝ˜uŸyšyÐ);Ñ<Ô<ÐBÀÑCÔCÐà!ð	à#ð	ð !Ð$4Ò4Ð4à�4Ø×$Ò$ lÐ4EÐ%FÑGÔGˆØ & ˜˜°F´MˆÝÐ,Ñ-Ô-ˆàÐØ”Kð à”Ð'Ø”
” 4Ð'Ð'Ø”
Ô"Ð.Ø”
Ô"Ô-Ð1BÒBÐBà œKˆMØÔ ð 	Pð 	PØ7HˆDÔ"Ð#3Ñ4ØÐ(ØBO�Ô-Ð.>Ñ?ð	Pð 	Pð 	Pñ 	Pô 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pøøøð 	Pð 	Pð 	Pð 	Pð ×"Ò"ØÐ+Ð,Øð #ñ 
ô 
ð 	
s   ÃC6Ã6C:Ã=C:c                ó0  — t          |                     d¦  «        pd¦  «        }|sdS |                      d|i¦  «         | j        5  | j                             |d¦  «         | j                             |d¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z=Close a delegated session and forget its parent relationship.rk   r   Nr   )r   rW   Úclose_sessionr2   r4   Úpopr5   )r=   rN   rk   s      r"   Úunregister_subagentz RelayRuntime.unregister_subagent§   sþ   € å˜uŸyšyÐ);Ñ<Ô<ÐBÀÑCÔCÐØð 	ØˆFØ×Ò˜LÐ*:Ð;Ñ<Ô<Ð<ØÔ ð 	Fð 	FØÔ"×&Ò&Ð'7¸Ñ>Ô>Ð>ØÔ)×-Ò-Ð.>ÀÑEÔEÐEð	Fð 	Fð 	Fñ 	Fô 	Fð 	Fð 	Fð 	Fð 	Fð 	Fð 	Fð 	Føøøð 	Fð 	Fð 	Fð 	Fð 	Fð 	Fs   Á7BÂBÂBr   c                óò   — | j         5  | j                             t          |pd¦  «        ¦  «        }ddd¦  «         n# 1 swxY w Y   |€dS |j        5  |j        rdn|cddd¦  «         S # 1 swxY w Y   dS )z;Return an active Hermes Relay session without creating one.r   N)r2   r3   rW   r   r   r   ©r=   r   re   s      r"   Úget_sessionzRelayRuntime.get_session±   s  € àÔ ð 	@ð 	@Ø”n×(Ò(­¨ZÐ-=¸2Ñ)>Ô)>Ñ?Ô?ˆGð	@ð 	@ð 	@ñ 	@ô 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@øøøð 	@ð 	@ð 	@ð 	@àˆ?Ø�4ØŒ\ð 	8ð 	8Ø"œ?Ð7�4�4°ð	8ð 	8ð 	8ð 	8ñ 	8ô 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8øøøð 	8ð 	8ð 	8ð 	8ð 	8ð 	8s!   ˆ*>¾AÁAÁA,Á,A0Á3A0c                óB   — |                       |¦  «        }|€dn|j        S )z?Return the Relay parent handle for a Hermes session, if active.N)rx   r   rw   s      r"   Úget_session_handlezRelayRuntime.get_session_handleº   s%   € à×"Ò" :Ñ.Ô.ˆØ�ˆtˆt¨G¬NÐ:r!   F)Úallow_closingre   r   ÚcallbackúCallable[..., Any]Úargsr{   Úkwargsc               ó°  ‡ ‡‡‡— |j         5  |j        r|st          d¦  «        ‚|j        �|j        €t          d¦  «        ‚|j                             ¦   «         }ddd¦  «         n# 1 swxY w Y   t          j        ¦   «         }|                     ¦   «         D ] \  }}	| 	                    |j
        |	¦  «         Œ!dˆˆˆˆ fd„}
| 	                    |
¦  «        S )z?Run a Relay operation against a session's isolated scope stack.úHermes Relay session is closingNú+Hermes Relay session context is unavailabler)   r   c                 óF   •— ‰j                              ¦   «           ‰‰ i ‰¤ŽS ©N)r'   Úget_scope_stack)r~   r|   r   r=   s   €€€€r"   Úinvokez+RelayRuntime.run_in_session.<locals>.invokeÓ   s,   ø€ ØŒJ×&Ò&Ñ(Ô(Ð(Ø�8˜TÐ, VÐ,Ð,Ð,r!   ©r)   r   )r   r   ÚRuntimeErrorr   r   Úcopyr\   Úcopy_contextÚitemsr^   r7   )r=   re   r|   r{   r~   r   Úrelay_contextr   ÚvariableÚvaluer†   s   ` ` ``     r"   Úrun_in_sessionzRelayRuntime.run_in_session¿   sA  øøøø€ ð Œ\ð 	3ð 	3ØŒð F }ð FÝ"Ð#DÑEÔEÐEØŒÐ&¨'¬.Ð*@Ý"Ð#PÑQÔQÐQØ#œO×0Ò0Ñ2Ô2ˆMð	3ð 	3ð 	3ñ 	3ô 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3øøøð 	3ð 	3ð 	3ð 	3õ Ô*Ñ,Ô,ˆØ,×2Ò2Ñ4Ô4ð 	-ð 	-‰OˆH�eØ�KŠK˜œ eÑ,Ô,Ð,Ð,ð	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð �{Š{˜6Ñ"Ô"Ð"s   ŒAA'Á'A+Á.A+c             �  óê  ‡ ‡‡‡K  — |j         5  |j        r|st          d¦  «        ‚|j        �|j        €t          d¦  «        ‚|j                             ¦   «         }ddd¦  «         n# 1 swxY w Y   t          j        ¦   «         }|                     ¦   «         D ] \  }}	| 	                    |j
        |	¦  «         Œ!dˆˆˆˆ fd„}
| 	                    t          j         |
¦   «         ¦  «        }|ƒ d{V —†S )zACreate and await an operation inside the session's saved context.r�   Nr‚   r)   r   c               “  ó†   •K  — ‰j                              ¦   «           ‰‰i ‰¤Ž} t          j        | ¦  «        r| ƒ d {V —†S | S r„   )r'   r…   ÚinspectÚisawaitable)Úresultr~   r|   r   r=   s    €€€€r"   r†   z1RelayRuntime.run_in_session_async.<locals>.invokeï   sY   øè è € ØŒJ×&Ò&Ñ(Ô(Ð(Ø�X˜tÐ. vÐ.Ð.ˆFÝÔ" 6Ñ*Ô*ð $Ø#�|�|�|�|�|�|Ð#ØˆMr!   r‡   )r   r   rˆ   r   r   r‰   r\   rŠ   r‹   r^   r7   ÚasyncioÚcreate_task)r=   re   r|   r{   r~   r   rŒ   r   r�   rŽ   r†   Útasks   ` ` ``      r"   Úrun_in_session_asyncz!RelayRuntime.run_in_session_asyncÛ   sa  øøøøè è € ð Œ\ð 	3ð 	3ØŒð F }ð FÝ"Ð#DÑEÔEÐEØŒÐ&¨'¬.Ð*@Ý"Ð#PÑQÔQÐQØ#œO×0Ò0Ñ2Ô2ˆMð	3ð 	3ð 	3ñ 	3ô 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3øøøð 	3ð 	3ð 	3ð 	3õ Ô*Ñ,Ô,ˆØ,×2Ò2Ñ4Ô4ð 	-ð 	-‰OˆH�eØ�KŠK˜œ eÑ,Ô,Ð,Ð,ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð �{Š{�7Ô.°°±´Ñ9Ô9ˆØˆzˆzˆzˆzˆzˆzÐs   ŽAA)Á)A-Á0A-Únamec               ó–   — |                       |¦  «        }|€dS |                      || j        j        j        ||j        ||¬¦  «         dS )zCEmit a mark parented to the Hermes session identified by ``event``.NF)r   rL   rM   T)r[   r�   r'   r_   rN   r   )r=   r™   rN   rL   rM   re   s         r"   Ú	emit_markzRelayRuntime.emit_markù   sa   € ð ×%Ò% eÑ,Ô,ˆØˆ?Ø�5Ø×ÒØØŒJÔÔ"ØØ”>ØØð 	ñ 	
ô 	
ð 	
ð ˆtr!   Ú	tool_namec               ó2  — |                       ¦   «         s|S t          t          | j        dd¦  «        dd¦  «        }t          |¦  «        s|S |                      d|i¦  «        }|€|S |                      ||||¦  «        }t          |t          ¦  «        r|n|S )zCApply Relay request rewriting before Hermes authorizes a tool call.ÚtoolsNÚrequest_interceptsr   )rJ   Úgetattrr'   Úcallabler[   r�   Ú
isinstanceÚdict)r=   r   rœ   r~   rŸ   re   r”   s          r"   Úapply_tool_request_interceptsz*RelayRuntime.apply_tool_request_intercepts  sº   € ð ×-Ò-Ñ/Ô/ð 	ØˆKÝ$Ý�D”J ¨Ñ.Ô.Ø Øñ
ô 
Ðõ
 Ð*Ñ+Ô+ð 	ØˆKØ×%Ò% |°ZÐ&@ÑAÔAˆØˆ?ØˆKØ×$Ò$ØØØØñ	
ô 
ˆõ $ F­DÑ1Ô1Ð;ˆvˆv°tÐ;r!   c                óÜ  — t          |¦  «        }| j        5  | j                             |¦  «        }ddd¦  «         n# 1 swxY w Y   |€W| j        5  | j                             |d¦  «         | j                             |d¦  «         ddd¦  «         n# 1 swxY w Y   dS g }|j        5  |j        r	 ddd¦  «         dS d|_        |j	        �x	 |  
                    || j        j        j        |j	        i t          t          t          | j        id¬¦  «         n/# t"          $ r"}|                     d|› �¦  «         Y d}~nd}~ww xY w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                             |¦  «        |u r| j                             |d¦  «         | j                             |d¦  «         | j                             |d¦  «         ddd¦  «         n# 1 swxY w Y   |r1t*                               d|d                     |¦  «        ¦  «         dS dS )z=Close one session scope and remove it from the core registry.NT)ÚoutputrM   r{   zsession scope close failed: zsubscriber flush failed: z.Hermes Relay session %s closed with errors: %sz; )rV   r2   r3   rW   r4   rt   r5   r   r   r   r�   r'   r_   rX   rY   rZ   r1   rd   ÚappendÚsubscribersÚflushÚloggerÚwarningÚjoin)r=   rN   r   re   ÚfailuresÚexcs         r"   rs   zRelayRuntime.close_session+  s  € å  Ñ'Ô'ˆ
ØÔ ð 	5ð 	5Ø”n×(Ò(¨Ñ4Ô4ˆGð	5ð 	5ð 	5ñ 	5ô 	5ð 	5ð 	5ð 	5ð 	5ð 	5ð 	5øøøð 	5ð 	5ð 	5ð 	5àˆ?ØÔ$ð Dð DØÔ&×*Ò*¨:°tÑ<Ô<Ð<ØÔ-×1Ò1°*¸dÑCÔCÐCðDð Dð Dñ Dô Dð Dð Dð Dð Dð Dð Døøøð Dð Dð Dð Dð ˆFØ ˆØŒ\ð 	Jð 	JØŒð Øð	Jð 	Jð 	Jñ 	Jô 	Jð 	Jð 	Jð 	Jð #ˆGŒOØŒ~Ð)ðJØ×'Ò'ØØœ
Ô(Ô,ØœØ!å.Õ0FÝ0°$´/ð"ð '+ð (ñ 
ô 
ð 
ð 
øõ !ð Jð Jð JØ—O’OÐ$HÀ3Ð$HÐ$HÑIÔIÐIÐIÐIÐIÐIÐIøøøøðJøøøð#	Jð 	Jð 	Jñ 	Jô 	Jð 	Jð 	Jð 	Jð 	Jð 	Jð 	Jøøøð 	Jð 	Jð 	Jð 	Jð&	?ØŒJÔ"×(Ò(Ñ*Ô*Ð*Ð*øÝð 	?ð 	?ð 	?Ø�OŠOÐ=¸Ð=Ð=Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>øøøøð	?øøøàÔ ð 	@ð 	@ØŒ~×!Ò! *Ñ-Ô-°Ð8Ð8Ø”×"Ò" :¨tÑ4Ô4Ð4ØÔ"×&Ò& z°4Ñ8Ô8Ð8ØÔ)×-Ò-¨j¸$Ñ?Ô?Ð?ð		@ð 	@ð 	@ñ 	@ô 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@øøøð 	@ð 	@ð 	@ð 	@ð
 ð 	Ý�NŠNØ@ØØ—	’	˜(Ñ#Ô#ñô ð ð ð ð	ð 	s�   —>¾AÁAÁ7BÂBÂBÂ+	EÃEÃADÄEÄ
EÄ"D?Ä:EÄ?EÅEÅEÅEÅE> Å>
F*ÆF%Æ%F*Æ4A.H.È.H2È5H2c                ó&  — | j         5  t          | j        ¦  «        }ddd¦  «         n# 1 swxY w Y   |D ]}|                      | j        d|i¦  «         Œ | j        r4	 t          j        | j        ¦  «         n# t          $ r Y nw xY wd| _        dS dS )z*Close all core-owned Relay session scopes.Nr   F)
r2   Úlistr3   Ú_safers   r9   r:   Ú
unregisterr<   rd   )r=   Úsession_idsr   s      r"   r<   zRelayRuntime.shutdownY  sý   € àÔ ð 	/ð 	/Ý˜tœ~Ñ.Ô.ˆKð	/ð 	/ð 	/ñ 	/ô 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/øøøð 	/ð 	/ð 	/ð 	/à%ð 	Gð 	GˆJØ�JŠJ�tÔ)¨L¸*Ð+EÑFÔFÐFÐFØÔ$ð 	.ðÝÔ! $¤-Ñ0Ô0Ð0Ð0øÝð ð ð Ø�ðøøøà(-ˆDÔ%Ð%Ð%ð	.ð 	.s   ˆ)©-°-ÁA8 Á8
BÂBc                ón   — 	  | |i |¤ŽS # t           $ r  t                               dd¬¦  «         Y d S w xY w)Nz%Hermes Relay runtime operation failedT©Úexc_info)rd   rª   r«   )r|   r~   r   s      r"   r±   zRelayRuntime._safef  sU   € ð	Ø�8˜TÐ, VÐ,Ð,Ð,øÝð 	ð 	ð 	Ý�NŠNÐBÈTˆNÑRÔRÐRØ�4�4ð	øøøs   ‚
 Š&4³4r„   )r'   r   r&   r(   r)   r*   ©r?   r   r)   r*   ©r)   r   )rN   rO   rL   r   rM   rP   r)   rQ   )rN   rO   rM   rP   r)   rQ   )rN   rO   r)   r*   )r   r   r)   rQ   ©r   r   r)   r   )re   r   r|   r}   r~   r   r{   r   r   r   r)   r   )
r™   r   rN   rO   rL   r   rM   r   r)   r   ©r   r   rœ   r   r~   rO   r)   rO   ©r)   r*   )r|   r}   r~   r   r   r   r)   r   )r   r   r   r   r>   rD   rG   rJ   r[   rq   ru   rx   rz   r�   r˜   r›   r¤   rs   r<   Ústaticmethodr±   r    r!   r"   r$   r$   )   sÑ  € € € € € ØKÐKð'Àtð 'ð 'ð 'ð 'ð 'ð 'ð4ð 4ð 4ð 4ð8ð 8ð 8ð 8ð
3ð 3ð 3ð 3ð Ø*.ð7ð 7ð 7ð 7ð 7ð 7ðz +/ð	"
ð "
ð "
ð "
ð "
ð "
ðHFð Fð Fð Fð8ð 8ð 8ð 8ð;ð ;ð ;ð ;ð $ð#ð #ð #ð #ð #ð #ðB $ðð ð ð ð ð ðF Øðð ð ð ð ð ð,<ð <ð <ð <ð8,ð ,ð ,ð ,ð\.ð .ð .ð .ð ðð ð ñ „\ðð ð r!   r$   T)Úfrozenc                  ó˜   — e Zd ZU dZded<   ded<   edd„¦   «         Zdd„Zedd„¦   «         Z	edd„¦   «         Z
edd„¦   «         Zdd„ZdS )ÚNoopRelayRuntimezDExplicit reduced-capability host for platforms without Relay wheels.r   r&   Úreasonr)   r   c                ó   — dS ©NFr    rI   s    r"   Ú	availablezNoopRelayRuntime.availablev  ó   € àˆur!   r   rœ   r~   rO   c               ó
   — ~~|S r„   r    )r=   r   rœ   r~   s       r"   r¤   z.NoopRelayRuntime.apply_tool_request_interceptsz  s   € ð ˜	Øˆr!   r?   r*   c                ó   — ~ d S r„   r    ©r?   s    r"   rD   z)NoopRelayRuntime.retain_managed_execution„  ó	   € àˆHˆHr!   c                ó   — ~ d S r„   r    rÇ   s    r"   rG   z*NoopRelayRuntime.release_managed_executionˆ  rÈ   r!   c                 ó   — dS rÂ   r    r    r!   r"   rJ   z*NoopRelayRuntime.managed_execution_enabledŒ  rÄ   r!   c                ó   — dS )z4No resources are allocated on unsupported platforms.Nr    rI   s    r"   r<   zNoopRelayRuntime.shutdown�  s   € € € r!   Nr¸   rº   r·   r»   )r   r   r   r   r   ÚpropertyrÃ   r¤   r¼   rD   rG   rJ   r<   r    r!   r"   r¿   r¿   o  sÝ   € € € € € € àNÐNàÐÐÑØ€K€K�Kàðð ð ñ „Xððð ð ð ð ðð ð ñ „\ðð ðð ð ñ „\ðð ðð ð ñ „\ððCð Cð Cð Cð Cð Cr!   r¿   c                  ó<   — e Zd ZdZdd„Z	 dddœdd„Zdd„Zdd„ZdS )ÚRelayHostRegistryz=Own exactly one Relay host for each canonical Hermes profile.r)   r*   c                óD   — t          j        ¦   «         | _        i | _        d S r„   )r   r   Ú_lockÚ_hostsrI   s    r"   r>   zRelayHostRegistry.__init__š  s   € Ý”_Ñ&Ô&ˆŒ
Ø,.ˆŒˆˆr!   NT©Úcreater&   r(   rÓ   r   úRelayHost | Nonec               óÚ  — |pt          ¦   «         }| j                             |¦  «        }|€|s|S | j        5  | j                             |¦  «        }|€|s|cd d d ¦  «         S 	 t	          |¬¦  «        }nQ# t
          $ rD}t                               dd¬¦  «         t          |t          |¦  «        ¬¦  «        }Y d }~nd }~ww xY w|| j        |<   |cd d d ¦  «         S # 1 swxY w Y   d S )Nr%   z*Hermes Relay runtime initialization failedTrµ   )r&   rÀ   )
r-   rÑ   rW   rÐ   r$   rd   rª   r«   r¿   r   )r=   r&   rÓ   Úkeyro   r®   s         r"   Úfor_profilezRelayHostRegistry.for_profilež  s}  € ð Ð2Õ0Ñ2Ô2ˆØŒ{�Š˜sÑ#Ô#ˆØÐ 6ÐØˆKØŒZð 	ð 	Ø”;—?’? 3Ñ'Ô'ˆDØÐ vÐØð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ðJÝ#°Ð4Ñ4Ô4��øÝð Jð Jð JÝ—’Ø@È4ð ñ ô ð õ (°CÅÀCÁÄÐIÑIÔI������øøøøð	Jøøøð
  $ˆDŒK˜ÑØð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s;   ¸ C Á&A7Á6C Á7
CÂ:C Â;C Ã CÃC Ã C$Ã'C$r   c                óª   — | j         5  | j                             |d ¦  «        }d d d ¦  «         n# 1 swxY w Y   |�|                     ¦   «          d S d S r„   )rÐ   rÑ   rt   r<   )r=   r&   ro   s      r"   Úshutdown_profilez"RelayHostRegistry.shutdown_profile¶  s“   € ØŒZð 	6ð 	6Ø”;—?’? ;°Ñ5Ô5ˆDð	6ð 	6ð 	6ñ 	6ô 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6øøøð 	6ð 	6ð 	6ð 	6àÐØ�MŠM‰OŒOˆOˆOˆOð Ðs   ˆ0°4·4c                óô   — | j         5  t          | j                             ¦   «         ¦  «        }| j                             ¦   «          d d d ¦  «         n# 1 swxY w Y   |D ]}|                     ¦   «          Œd S r„   )rÐ   r°   rÑ   ÚvaluesÚclearr<   )r=   Úhostsro   s      r"   Úshutdown_allzRelayHostRegistry.shutdown_all¼  s¸   € ØŒZð 	 ð 	 Ý˜œ×+Ò+Ñ-Ô-Ñ.Ô.ˆEØŒK×ÒÑÔÐð	 ð 	 ð 	 ñ 	 ô 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 øøøð 	 ð 	 ð 	 ð 	 ð ð 	ð 	ˆDØ�MŠM‰OŒOˆOˆOð	ð 	s   ˆA AÁAÁAr»   r„   )r&   r(   rÓ   r   r)   rÔ   ©r&   r   r)   r*   )r   r   r   r   r>   r×   rÙ   rÞ   r    r!   r"   rÎ   rÎ   —  sƒ   € € € € € ØGÐGð/ð /ð /ð /ð #'ðð ð	ð ð ð ð ð ð0ð ð ð ðð ð ð ð ð r!   rÎ   c                  ób   — e Zd ZU dZded<   ded<   ded<   ded<   ded	<   d
Zded<   dZded<   dS )ÚConversationLeasez?A resumable reference to one profile-scoped conversation scope.r   r&   r   ÚplatformÚ	RelayHostro   rQ   re   r   r   Fr   ÚreleasedN)r   r   r   r   r   r   rä   r    r!   r"   rá   rá   Ç  sn   € € € € € € àIÐIàÐÐÑØ€O€O�OØ€M€M�MØ€O€O�OØ Ð Ð Ñ ØÐÐÐÐÑØ€HÐÐÐÑÐÐr!   rá   c                  ó$  — e Zd ZU dZded<   ded<   ded<   dZded	<    eed
¬¦  «        Zded<    ee	j
        d
¬¦  «        Zded<    ee	j
        d
¬¦  «        Zded<    edd
¬¦  «        Zded<    ed
d
¬¦  «        Zded<   dZded<   d
Zded<   dS )ÚRelayTurnContextz;Runtime-only context for one Hermes turn or top-level task.rá   rn   r   Úturn_idÚtask_idNr   r   Fr   rO   Úlogical_llm_callsr   Úlogical_llm_lockÚfinalize_lock)Údefaultr   úRelayTurnContext | NoneÚ_previous_turnr   Ú_active_registeredTÚrelay_enabledrm   )r   r   r   r   r   r   r   r£   ré   r   r   rê   rë   rî   rï   rð   rm   r    r!   r"   ræ   ræ   Ô  s4  € € € € € € àEÐEàÐÐÑØ€L€L�LØ€L€L�LØ€FÐÐÐÑØ(-¨¸dÈÐ(OÑ(OÔ(OÐÐOÐOÐOÑOØ(-¨Ø!œØð)ñ )ô )Ðð ð ð ñ ð &+ UØ!œØð&ñ &ô &€Mð ð ð ñ ð /4¨e¸DÀuÐ.MÑ.MÔ.M€NÐMÐMÐMÑMØ$˜u¨U¸Ð?Ñ?Ô?ÐÐ?Ð?Ð?Ñ?Ø€MÐÐÐÑØ€FÐÐÐÑÐÐr!   ræ   Úhermes_relay_turn)rì   z/contextvars.ContextVar[RelayTurnContext | None]Ú_CURRENT_TURNÚ#hermes_relay_managed_callback_depthzcontextvars.ContextVar[int]Ú_MANAGED_CALLBACK_DEPTHc                  ó"   — e Zd ZdZd
d„Zdd„Zd	S )Úmanaged_callback_guardan  Mark the current context as inside a managed Relay callback.

    Synchronous context manager used by the relay adapters around the
    ``invoke()`` callbacks they hand to the native pipeline. Everything the
    callback transitively calls (including work it forwards to worker threads
    via ``contextvars.copy_context()``) sees the marker and runs unmanaged.
    r)   ú'managed_callback_guard'c                óx   — t                                t                                ¦   «         dz   ¦  «        | _        | S )Né   )rô   r7   rW   Ú_tokenrI   s    r"   Ú	__enter__z managed_callback_guard.__enter__  s/   € Ý-×1Ò1Õ2I×2MÒ2MÑ2OÔ2OÐRSÑ2SÑTÔTˆŒØˆr!   r¶   r   r*   c                óD   — t                                | j        ¦  «         d S r„   )rô   Úresetrú   )r=   r¶   s     r"   Ú__exit__zmanaged_callback_guard.__exit__  s   € Ý×%Ò% d¤kÑ2Ô2Ð2Ð2Ð2r!   N)r)   r÷   )r¶   r   r)   r*   )r   r   r   r   rû   rþ   r    r!   r"   rö   rö   û  sF   € € € € € ðð ðð ð ð ð3ð 3ð 3ð 3ð 3ð 3r!   rö   c                  óÎ   — e Zd ZdZefd.d„Zd/d„Zd0d„Zd1d„Zdddœd2d„Z	d3d„Z
d4d"„Zd5d$„Zd6d%„Zd7d&„Zd4d'„Zed4d(„¦   «         Zed6d)„¦   «         Zed8d*„¦   «         Zd9d+„Zd:d,„Zd-S );ÚRelaySessionCoordinatorz=Own semantic conversation and turn lifetimes for Hermes core.ÚregistryrÎ   r)   r*   c                ó�   — || _         t          j        ¦   «         | _        i | _        t          j        ¦   «         | _        i | _        d S r„   )r  r   r   Ú_initializer_lockÚ_session_initializersÚ_active_turns_lockÚ_active_turns)r=   r  s     r"   r>   z RelaySessionCoordinator.__init__  sF   € Ø ˆŒÝ!*¤Ñ!2Ô!2ˆÔð ð 	Ô"õ #,¤/Ñ"3Ô"3ˆÔØ>@ˆÔÐÐr!   r™   r   r|   ú.Callable[[RelayRuntime, dict[str, Any]], None]c                óZ   — | j         5  || j        |<   ddd¦  «         dS # 1 swxY w Y   dS )zFRegister idempotent profile/session preparation before scope creation.N)r  r  )r=   r™   r|   s      r"   Úregister_session_initializerz4RelaySessionCoordinator.register_session_initializer  s~   € ð Ô#ð 	8ð 	8Ø/7ˆDÔ& tÑ,ð	8ð 	8ð 	8ñ 	8ô 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8øøøð 	8ð 	8ð 	8ð 	8ð 	8ð 	8s   ˆ  $§$c                ó|   — | j         5  | j                             |d¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z3Remove a previously registered session initializer.N)r  r  rt   )r=   r™   s     r"   Úunregister_session_initializerz6RelaySessionCoordinator.unregister_session_initializer"  sˆ   € àÔ#ð 	7ð 	7ØÔ&×*Ò*¨4°Ñ6Ô6Ð6ð	7ð 	7ð 	7ñ 	7ô 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7øøøð 	7ð 	7ð 	7ð 	7ð 	7ð 	7s   ˆ1±5¸5ro   r$   r   rO   c                ó  — | j         5  t          | j                             ¦   «         ¦  «        }d d d ¦  «         n# 1 swxY w Y   |D ]?\  }}	  |||¦  «         Œ# t          $ r  t
                               d|d¬¦  «         Y Œ<w xY wd S )Nz+Hermes Relay session initializer failed: %sTrµ   )r  r°   r  r‹   rd   rª   r«   )r=   ro   r   Úinitializersr™   r|   s         r"   Ú_prepare_sessionz(RelaySessionCoordinator._prepare_session'  s  € ð
 Ô#ð 	Dð 	DÝ Ô :× @Ò @Ñ BÔ BÑCÔCˆLð	Dð 	Dð 	Dñ 	Dô 	Dð 	Dð 	Dð 	Dð 	Dð 	Dð 	Døøøð 	Dð 	Dð 	Dð 	Dà*ð 	ð 	‰NˆD�(ðØ�˜˜wÑ'Ô'Ð'Ð'øÝð ð ð Ý—’ØAØØ!ð ñ ô ð ð ð ðøøøð	ð 	s   ˆ';»?Á?ÁAÁ'BÂBr   )r   Úmodelr&   r   râ   r   r  rá   c               óÎ  — | j                              |¦  «        }|€t          |d¦  «        }d }t          |t          ¦  «        rŽ	 |||||dœ}|                      ||¦  «         d|pdi}	|r!||k    r|                     ||dœ|	¬¦  «        }n|                     d|i|	¬¦  «        }n,# t          $ r t           
                    dd	¬
¦  «         Y nw xY wt          ||||||¬¦  «        S )Nz Relay host creation was disabled)r&   r   râ   r   r  úhermes.execution_surfaceÚunknown)r   rk   ri   r   z/Hermes Relay conversation initialization failedTrµ   )r&   r   râ   ro   re   r   )r  r×   r¿   r¢   r$   r  rq   r[   rd   rª   r«   rá   )
r=   r&   r   râ   r   r  ro   re   Úsession_contextrM   s
             r"   Úacquire_conversationz,RelaySessionCoordinator.acquire_conversation8  sk  € ð Œ}×(Ò(¨Ñ5Ô5ˆØˆ<Ý# KÐ1SÑTÔTˆDØˆÝ�d�LÑ)Ô)ð 	ðà#.Ø",Ø (Ø):Ø"ð#ð #�ð ×%Ò% d¨OÑ<Ô<Ð<Ø6¸Ð8MÀIÐN�Ø$ð Ð):¸jÒ)HÐ)HØ"×4Ò4à1BØ0:ðð ð "*ð 5ñ ô �G�Gð #×1Ò1Ø% zÐ2Ø!)ð 2ñ ô �Gøøõ ð ð ð Ý—’ØEØ!ð ñ ô ð ð ð ðøøøõ
 !Ø#Ø!ØØØØ/ð
ñ 
ô 
ð 	
s   ÁA B& Â&&CÃCrn   rç   rè   ræ   c               ó¤  — |j         rt          d¦  «        ‚t          |||¬¦  «        }|j        |j        f}| j        5  | j                             |¦  «        }|r)d|_        t           
                    d||j        ¦  «         nt          |¦  «        h| j        |<   d|_        d d d ¦  «         n# 1 swxY w Y   |j        r×t          |j        t          ¦  «        r½|j        �¶	 |j                             |j        |j        j        j        j        t*          |j        j        j        j        |j        j        i t2          t4          t6          |j        j        d|j        pdi¬¦  «        |_        n,# t<          $ r t           
                    d	d¬
¦  «         Y nw xY wt>                               ¦   «         |_         t>           !                    |¦  «         |S )Nz+Hermes Relay conversation lease is released)rn   rç   rè   FzJSkipping Relay instrumentation for concurrent Hermes turn %s in session %sTr  r  )r   rU   rM   z'Hermes Relay turn initialization failedrµ   )"rä   rˆ   ræ   r&   r   r  r  rW   rð   rª   r«   Úidrï   r¢   ro   r$   re   r�   r'   r_   r`   Ú
TURN_SCOPErb   ÚFunctionr   rX   rY   rZ   r1   râ   rd   rò   rî   r7   )r=   rn   rç   rè   rp   rÖ   Úactives          r"   Ú
begin_turnz"RelaySessionCoordinator.begin_turnk  s  € ð Œ>ð 	NÝÐLÑMÔMÐMÝ e°WÀgÐNÑNÔNˆØÔ  %Ô"2Ð3ˆØÔ$ð 	/ð 	/ØÔ'×+Ò+¨CÑ0Ô0ˆFØð /ð &+�Ô"Ý—’ð'àØÔ$ñ	ô ð ð õ ,.¨d©8¬8¨*�Ô" 3Ñ'Ø*.�Ô'ð	/ð 	/ð 	/ñ 	/ô 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/øøøð 	/ð 	/ð 	/ð 	/ð" Ôð	Yå˜5œ:¥|Ñ4Ô4ð	Yð ”Ð)ðYØ#œj×7Ò7Ø”MØ”JÔ$Ô*Ô/ÝØ”JÔ$Ô.Ô7Ø œ=Ô/Øå*Õ,BÝ,¨e¬jÔ.CØ2°E´NÐ4OÀiðð 8ñ ô �”�øõ ð Yð Yð YÝ—’ÐHÐSW�ÑXÔXÐXÐXÐXðYøøøå+×/Ò/Ñ1Ô1ˆÔÝ×Ò˜$ÑÔÐØˆs%   ¾A%B/Â/B3Â6B3Ã#BE, Å,&FÆFrp   Úoutcomec               ó|  — |j         5  |j        r#|                      |¦  «         	 d d d ¦  «         d S d|_        |j        }	 t	          |j        t          ¦  «        r¯|j        �¨|                      ||¬¦  «         |j	        �Š	 |j         
                    |j        |j        j        j        j        |j	        d|it          t          t           |j        j        i¬¦  «         n,# t$          $ r t&                               dd¬¦  «         Y nw xY w	 |j        r;t	          |j        t          ¦  «        r!|j                             d|j        i¦  «         n,# t$          $ r t&                               dd¬¦  «         Y nw xY w|                      |¦  «         |                      |¦  «         ný# |                      |¦  «         |                      |¦  «         w xY w# 	 |j        r;t	          |j        t          ¦  «        r!|j                             d|j        i¦  «         n,# t$          $ r t&                               dd¬¦  «         Y nw xY w|                      |¦  «         |                      |¦  «         w # |                      |¦  «         |                      |¦  «         w xY wxY w	 d d d ¦  «         d S # 1 swxY w Y   d S )	NT©r  r  ©r¦   rM   z%Hermes Relay turn finalization failedrµ   rk   z3Hermes Relay child conversation finalization failed)rë   rm   Ú_reset_turn_contextrn   r¢   ro   r$   re   Ú_finish_logical_callsr   r�   r'   r_   rt   rX   rY   rZ   r1   rd   rª   r«   r   ru   r   Ú_unregister_active_turn)r=   rp   r  rn   s       r"   Úend_turnz RelaySessionCoordinator.end_turnŸ  s¥  € ð Ôð ,	3ð ,	3ØŒ{ð Ø×(Ò(¨Ñ.Ô.Ð.Øð,	3ð ,	3ð ,	3ñ ,	3ô ,	3ð ,	3ð ,	3ð ,	3ð ˆDŒKØ”JˆEð&3Ý˜eœj­,Ñ7Ô7ð ¸E¼MÐ<UØ×.Ò.¨t¸WÐ.ÑEÔEÐEØ”{Ð.ðØ!œJ×5Ò5Ø %¤Ø %¤
Ô 0Ô 6Ô :Ø $¤Ø(1°7Ð';å$6Õ8NÝ$8¸%¼*Ô:Oð*"ð 6ñ 	ô 	ð 	ð 	øõ  )ð ð ð Ý"ŸNšNØ GÐRVð +ñ ô ð ð ð ðøøøð
3ð
 Ô/ðå& u¤zµ<Ñ@Ô@ðð œ
×6Ò6Ø.°Ô0@ð8ñ ô ð øøõ !ð ð ð Ý—N’NØMØ!%ð #ñ ô ð ð ð ðøøøð ×0Ò0°Ñ6Ô6Ð6Ø×,Ò,¨TÑ2Ô2Ð2Ð2øð ×0Ò0°Ñ6Ô6Ð6Ø×,Ò,¨TÑ2Ô2Ð2Ð2øøøøð%3ð
 Ô/ðå& u¤zµ<Ñ@Ô@ðð œ
×6Ò6Ø.°Ô0@ð8ñ ô ð øøõ !ð ð ð Ý—N’NØMØ!%ð #ñ ô ð ð ð ðøøøð ×0Ò0°Ñ6Ô6Ð6Ø×,Ò,¨TÑ2Ô2Ð2Ð2øð ×0Ò0°Ñ6Ô6Ð6Ø×,Ò,¨TÑ2Ô2Ð2Ð2øøøøøøÐ2ðY,	3ð ,	3ð ,	3ñ ,	3ô ,	3ð ,	3ð ,	3ð ,	3ð ,	3ð ,	3ð ,	3ð ,	3øøøð ,	3ð ,	3ð ,	3ð ,	3ð ,	3ð ,	3s»   ˆJ1³J1Á?GÂACÃGÃ&DÄGÄDÄGÄAEÅF&Å&E8Å5F&Å7E8Å8F&Å;+J1Æ&,GÇJ1ÇJ ÇAHÈI1È&I	É I1ÉI	ÉI1É+J É1,J	ÊJ Ê J1Ê1J5Ê8J5r   c               óš   — ||f}| j         5  t          | j                             |¦  «        ¦  «        cddd¦  «         S # 1 swxY w Y   dS )z?Return whether a turn is still running for one profile/session.N)r  r   r  rW   )r=   r&   r   rÖ   s       r"   Úhas_active_turnz'RelaySessionCoordinator.has_active_turnÓ  s•   € à˜JÐ'ˆØÔ$ð 	5ð 	5Ý˜Ô*×.Ò.¨sÑ3Ô3Ñ4Ô4ð	5ð 	5ð 	5ð 	5ñ 	5ô 	5ð 	5ð 	5ð 	5ð 	5ð 	5ð 	5øøøð 	5ð 	5ð 	5ð 	5ð 	5ð 	5s   Œ'A Á AÁAc                óL  — |j         sd S |j        j        |j        j        f}| j        5  | j                             |¦  «        }|�?|                     t          |¦  «        ¦  «         |s| j         	                    |d ¦  «         d|_         d d d ¦  «         d S # 1 swxY w Y   d S rÂ   )
rï   rn   r&   r   r  r  rW   rF   r  rt   )r=   rp   rÖ   r  s       r"   r!  z/RelaySessionCoordinator._unregister_active_turnÙ  sð   € ØÔ&ð 	ØˆFØŒzÔ% t¤zÔ'<Ð=ˆØÔ$ð 	,ð 	,ØÔ'×+Ò+¨CÑ0Ô0ˆFØÐ!Ø—’�r $™xœxÑ(Ô(Ð(Øð 6ØÔ&×*Ò*¨3°Ñ5Ô5Ð5Ø&+ˆDÔ#ð	,ð 	,ð 	,ñ 	,ô 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,øøøð 	,ð 	,ð 	,ð 	,ð 	,ð 	,s   ©A#BÂBÂ Bc                óx   — | j         5  | j                             ¦   «          d d d ¦  «         d S # 1 swxY w Y   d S r„   )r  r  rÜ   rI   s    r"   Ú_reset_active_turns_for_testsz5RelaySessionCoordinator._reset_active_turns_for_testså  s„   € ØÔ$ð 	'ð 	'ØÔ×$Ò$Ñ&Ô&Ð&ð	'ð 	'ð 	'ñ 	'ô 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'øøøð 	'ð 	'ð 	'ð 	'ð 	'ð 	's   ˆ/¯3¶3c               óž   — |j         5  |j        r	 ddd¦  «         dS |                      ||¬¦  «         ddd¦  «         dS # 1 swxY w Y   dS )zBClose logical LLM children before sibling task aggregation scopes.Nr  )rë   rm   r   )r=   rp   r  s      r"   Úfinish_logical_callsz,RelaySessionCoordinator.finish_logical_callsé  sÁ   € ð Ôð 	>ð 	>ØŒ{ð Øð	>ð 	>ð 	>ñ 	>ô 	>ð 	>ð 	>ð 	>ð ×&Ò& t°WÐ&Ñ=Ô=Ð=ð	>ð 	>ð 	>ñ 	>ô 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>øøøð 	>ð 	>ð 	>ð 	>ð 	>ð 	>s   ˆ	AžAÁAÁ	Ac               ó  — | j         }t          |j        t          ¦  «        r|j        €d S | j        5  t          | j                             ¦   «         ¦  «        }| j         	                    ¦   «          d d d ¦  «         n# 1 swxY w Y   t          t          |¦  «        dz
  dd¦  «        D ]á}||         \  }}	 |j                             |j        |j        j        j        j        |d|it           t"          t$          |j        j        i¬¦  «         Œf# t(          $ ro | j        5  |d |dz   …         D ] \  }}| j                             ||¦  «         Œ!	 d d d ¦  «         n# 1 swxY w Y   t,                               dd¬¦  «         Y  d S w xY wd S )Nrù   éÿÿÿÿr  r  z,Hermes Relay logical LLM finalization failedTrµ   )rn   r¢   ro   r$   re   rê   r°   ré   r‹   rÜ   ÚrangeÚlenr�   r'   r_   rt   rX   rY   rZ   r1   rd   Ú
setdefaultrª   r«   )	rp   r  rn   Úlogical_callsÚindexÚ
request_idÚlogical_handleÚpending_request_idÚpending_handles	            r"   r   z-RelaySessionCoordinator._finish_logical_callsõ  sW  € ð ”
ˆÝ˜%œ*¥lÑ3Ô3ð 	°u´}Ð7LØˆFØÔ"ð 	+ð 	+Ý  Ô!7×!=Ò!=Ñ!?Ô!?Ñ@Ô@ˆMØÔ"×(Ò(Ñ*Ô*Ð*ð	+ð 	+ð 	+ñ 	+ô 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+øøøð 	+ð 	+ð 	+ð 	+õ �3˜}Ñ-Ô-°Ñ1°2°rÑ:Ô:ð 	ð 	ˆEØ)6°uÔ)=Ñ&ˆJ˜ðØ”
×)Ò)Ø”MØ”JÔ$Ô*Ô.Ø"Ø% wÐ/å*Õ,BÝ,¨e¬jÔ.Cðð *ñ 	ô 	ð 	ð 	øõ ð ð ð ØÔ*ð 
ð 
ð ?LØ#˜% !™)˜ô?ð ð Ñ:Ð*¨Nð Ô.×9Ò9Ø.Ø*ñô ð ð ðð	
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
õ —’ØBØ!ð ñ ô ð ð ���ð!øøøð	ð 	sI   ²A A>Á>BÂBÂ8ADÄF	Ä!/EÅF	ÅE!Å!F	Å$E!Å%F	ÆF	c                ó@  — t                                ¦   «         | urdS | j        }t          | ¦  «        h}|�M|j        rFt          |¦  «        |v rd}n2|                     t          |¦  «        ¦  «         |j        }|�|j        °Ft                                |¦  «         dS )z>Unwind ``turn`` without disturbing a newer context-local turn.N)rò   rW   rî   r  rm   rB   r7   )rp   ÚpreviousÚseens      r"   r  z+RelaySessionCoordinator._reset_turn_context   s¦   € õ ×ÒÑÔ dÐ*Ð*ØˆFØÔ&ˆÝ�4‘”ˆzˆØÐ" x¤Ð"Ý�(‰|Œ|˜tÐ#Ð#Ø�ØØ�HŠH•R˜‘\”\Ñ"Ô"Ð"ØÔ.ˆHð Ð" x¤Ð"õ 	×Ò˜(Ñ#Ô#Ð#Ð#Ð#r!   c                ó   — d| _         dS )z@Release a caller lease without closing a resumable conversation.TN)rä   )rn   s    r"   Úrelease_conversationz,RelaySessionCoordinator.release_conversation/  s   € ð ˆŒˆˆr!   c               óš   — | j                              |d¬¦  «        }t          |t          ¦  «        r|                     d|i¦  «         d S d S )NFrÒ   r   )r  r×   r¢   r$   rs   )r=   r&   r   ro   s       r"   Úfinalize_conversationz-RelaySessionCoordinator.finalize_conversation4  sY   € ð Œ}×(Ò(¨¸UÐ(ÑCÔCˆÝ�d�LÑ)Ô)ð 	;Ø×Ò ¨jÐ9Ñ:Ô:Ð:Ð:Ð:ð	;ð 	;r!   c                ó:   — | j                              |¦  «         d S r„   )r  rÙ   )r=   r&   s     r"   rÙ   z(RelaySessionCoordinator.shutdown_profile>  s   € ØŒ×&Ò& {Ñ3Ô3Ð3Ð3Ð3r!   N)r  rÎ   r)   r*   )r™   r   r|   r  r)   r*   )r™   r   r)   r*   )ro   r$   r   rO   r)   r*   )r&   r   r   r   râ   r   r   r   r  r   r)   rá   )rn   rá   rç   r   rè   r   r)   ræ   )rp   ræ   r  r   r)   r*   )r&   r   r   r   r)   r   )rp   ræ   r)   r*   r»   )rn   rá   r)   r*   )r&   r   r   r   r)   r*   rß   )r   r   r   r   ÚHOST_REGISTRYr>   r	  r  r  r  r  r"  r$  r!  r'  r)  r¼   r   r  r9  r;  rÙ   r    r!   r"   r   r     s¡  € € € € € ØGÐGà5Bð Að Að Að Að Að8ð 8ð 8ð 8ð7ð 7ð 7ð 7ð
ð ð ð ð. "$Øð1
ð 1
ð 1
ð 1
ð 1
ð 1
ðf2ð 2ð 2ð 2ðh23ð 23ð 23ð 23ðh5ð 5ð 5ð 5ð
,ð 
,ð 
,ð 
,ð'ð 'ð 'ð 'ð
>ð 
>ð 
>ð 
>ð ð(ð (ð (ñ „\ð(ðT ð$ð $ð $ñ „\ð$ð ðð ð ñ „\ðð;ð ;ð ;ð ;ð4ð 4ð 4ð 4ð 4ð 4r!   r   r)   rí   c                 ó4   — t                                ¦   «         S )zCReturn the turn context inherited by current async and thread work.)rò   rW   r    r!   r"   Úcurrent_turnr?  E  s   € å×ÒÑÔÐr!   r   c                 óD   — t          ¦   «         } | du p| j        o| j         S )zDReturn whether this inherited turn may create Relay instrumentation.N)r?  rð   rm   )rp   s    r"   Úrelay_instrumentation_enabledrA  J  s&   € å‰>Œ>€DØ�4ˆ<ÐC˜DÔ.ÐB°t´{°?ÐCr!   r   r(   c                óŠ  — t          ¦   «         }|�|j        r|j        s|j        j        rdS |j        j        t          ¦   «         k    rdS | �|j        j        | k    rdS t          |j        j	        t          ¦  «        rE|j        j        €dS |j        j	                             |j        j        ¦  «        |j        j        urdS |S )zFReturn a live turn only when it belongs to the active profile/session.N)r?  rð   rm   rn   rä   r&   r-   r   r¢   ro   r$   re   rx   )r   rp   s     r"   rl   rl   P  sÈ   € å‰>Œ>€DàˆØÔ!ð 	àŒ;ð 	ð Œ:Ôð 	ð
 ˆtØ„zÔÕ!4Ñ!6Ô!6Ò6Ð6ØˆtØÐ $¤*Ô"7¸:Ò"EÐ"EØˆtÝ�$”*”/¥<Ñ0Ô0ð ØŒ:ÔÐ%Ø�4ØŒ:Œ?×&Ò& t¤zÔ'<Ñ=Ô=ÀTÄZÔEWÐWÐWØ�4Ø€Kr!   r   ú4tuple[RelayRuntime | None, RelaySession | None, Any]c                ó  — t                                ¦   «         dk    rdS t          ¦   «         }|�|j        r|j        rdS t          | ¦  «        }|�Rt          |j        j        t          ¦  «        r3|j        j
        �'|j        j
        }|j        j        ||j        p|j        fS t          d¬¦  «        }|€dS |                     ¦   «         sdS |                     | ¦  «        }|€|                     d| i¦  «        }|||€dn|j        fS )zCResolve one active turn/session parent for managed Relay execution.r   )NNNNFrÒ   r   )rô   rW   r?  rð   rm   rl   r¢   rn   ro   r$   re   r   Úget_runtimerJ   rx   r[   )r   Úinherited_turnrp   re   Úruntimes        r"   Úresolve_execution_contextrH  f  s&  € õ ×"Ò"Ñ$Ô$ qÒ(Ð(ð  ÐÝ!‘^”^€NØÐ!ØÔ(ð "Ø,:Ô,Að "ð  ÐÝ�zÑ"Ô"€DàÐÝ�t”z”­Ñ5Ô5ð 	àŒJÔÐ*à”*Ô$ˆØŒzŒ ¨¬Ð)F¸¼ÐFÐFõ  Ð'Ñ'Ô'€GØ€ØÐØ×,Ò,Ñ.Ô.ð  ØÐØ×!Ò! *Ñ-Ô-€GØ€Ø×(Ò(¨,¸
Ð)CÑDÔDˆØ�G W _˜T˜T¸'¼.ÐHÐHr!   rK   r™   rL   r   rM   c               ó¾   — t          d¬¦  «        }|€dS 	 |                     | d|i||¬¦  «        S # t          $ r! t                               d| d¬¦  «         Y dS w xY w)	z3Emit a fail-open Relay mark under a Hermes session.FrÒ   Nr   rK   zHermes Relay mark failed: %sTrµ   )rE  r›   rd   rª   r«   )r™   r   rL   rM   rG  s        r"   r›   r›   “  sŽ   € õ  Ð'Ñ'Ô'€GØ€Øˆuð	Ø× Ò ØØ˜:Ð&ØØð	 !ñ 
ô 
ð 	
øõ ð ð ð Ý�ŠÐ5°tÀdˆÑKÔKÐKØˆuˆuðøøøs   –1 ±'AÁArœ   r~   rO   c                ób   — | s|S t          d¬¦  «        }|€|S |                     | ||¬¦  «        S )zDReturn Relay-rewritten arguments at Hermes's authorization boundary.FrÒ   N)r   rœ   r~   )rE  r¤   )r   rœ   r~   rG  s       r"   r¤   r¤   ª  sQ   € ð ð ØˆÝ Ð'Ñ'Ô'€GØ€ØˆØ×0Ò0ØØØð 1ñ ô ð r!   r   rQ   c                ó´   — t          ¦   «         }|€dS 	 |                     d| i|¥¦  «        S # t          $ r  t                               dd¬¦  «         Y dS w xY w)z>Create or return the shared Relay session used by Hermes core.Nr   z*Hermes Relay session initialization failedTrµ   )rE  r[   rd   rª   r«   )r   r   rG  s      r"   r[   r[   ½  sq   € å‰mŒm€GØ€ØˆtðØ×%Ò% |°ZÐ&KÀ7Ð&KÑLÔLÐLøÝð ð ð Ý�ŠÐCÈdˆÑSÔSÐSØˆtˆtðøøøs   ”- ­&AÁAr|   r}   r   c                óâ   — t          ¦   «         }|€t          d¦  «        ‚|                     | ¦  «        }|€|                     d| i¦  «        }|€t          d¦  «        ‚ |j        ||g|¢R i |¤ŽS )z>Run a scope, LLM, or tool API against a shared Hermes session.Nú#Hermes Relay runtime is unavailabler   ú#Hermes Relay session is unavailable)rE  rˆ   rx   r[   r�   ©r   r|   r~   r   rG  re   s         r"   r�   r�   É  sŠ   € õ ‰mŒm€GØ€ÝÐ@ÑAÔAÐAØ×!Ò! *Ñ-Ô-€GØ€Ø×(Ò(¨,¸
Ð)CÑDÔDˆØ€ÝÐ@ÑAÔAÐAØ!ˆ7Ô! '¨8ÐE°dÐEÐEÐE¸fÐEÐEÐEr!   c              �  óò   K  — t          ¦   «         }|€t          d¦  «        ‚|                     | ¦  «        }|€|                     d| i¦  «        }|€t          d¦  «        ‚ |j        ||g|¢R i |¤Žƒ d{V —†S )z?Await a Relay operation inside a shared Hermes session context.NrM  r   rN  )rE  rˆ   rx   r[   r˜   rO  s         r"   r˜   r˜   Û  s    è è € õ ‰mŒm€GØ€ÝÐ@ÑAÔAÐAØ×!Ò! *Ñ-Ô-€GØ€Ø×(Ò(¨,¸
Ð)CÑDÔDˆØ€ÝÐ@ÑAÔAÐAØ-�Ô-¨g°xÐQÀ$ÐQÐQÐQÈ&ÐQÐQÐQÐQÐQÐQÐQÐQÐQr!   c                óT   — t          d¬¦  «        }|€dn|                     | ¦  «        S )z?Return the shared Relay handle for direct core instrumentation.FrÒ   N)rE  rz   )r   rG  s     r"   rz   rz   í  s.   € å Ð'Ñ'Ô'€GØ�?ˆ4ˆ4¨×(BÒ(BÀ:Ñ(NÔ(NÐNr!   Úrelay_errorÚBaseExceptionÚcallback_errorc                óà   ‡‡— | ‰u rdS t          | t          ¦  «        sdS ‰j        }|j        |j        |j        › d|j        › �h}t          | ¦  «        Št          ˆˆfd„|D ¦   «         ¦  «        S )zDMatch Relay's native callback wrapper without masking policy errors.TFú.c              3  óN   •K  — | ]}‰                      d |› d‰› �¦  «        V — Œ dS )zinternal error: z: N)Ú
startswith)Ú.0Ú	type_namerT  Úmessages     €€r"   ú	<genexpr>z3_is_relay_wrapped_callback_error.<locals>.<genexpr>  sV   øè è € ð ð àð 	×ÒÐK¨iÐKÐK¸>ÐKÐKÑLÔLðð ð ð ð ð r!   )r¢   rˆ   Ú	__class__r   r   r   r   Úany)rR  rT  Úcallback_typeÚ
type_namesr[  s    `  @r"   Ú _is_relay_wrapped_callback_errorra  ó  s«   øø€ ð
 �nÐ$Ð$ØˆtÝ�k¥<Ñ0Ô0ð ØˆuØ"Ô,€MàÔØÔ"ØÔ#ÐBÐB mÔ&@ÐBÐBð€Jõ
 �+ÑÔ€GÝð ð ð ð ð à#ðñ ô ñ ô ð r!   ©rÓ   r&   rÓ   r&   úRelayRuntime | Nonec                ól   — t                                || ¬¦  «        }t          |t          ¦  «        r|ndS )z4Return the Relay host for the active Hermes profile.rÒ   N)r=  r×   r¢   r$   )rÓ   r&   ro   s      r"   rE  rE  	  s5   € õ ×$Ò$ [¸Ð$Ñ@Ô@€DÝ˜d¥LÑ1Ô1Ð;ˆ4ˆ4°tÐ;r!   rÔ   c                ó:   — t                                || ¬¦  «        S )zBReturn the explicit real or reduced-capability host for a profile.rÒ   )r=  r×   rb  s     r"   Úget_hostrf    s   € õ ×$Ò$ [¸Ð$Ñ@Ô@Ð@r!   c                 ó~  — t          ¦   «                              ¦   «         } |                      ¦   «         s!t          |                      ¦   «         ¦  «        S t          | ¦  «        }t
                               |¦  «        }|�|S t          |                      ¦   «         ¦  «        }t
                               ||¦  «        S )zAReturn the canonical profile identity used for runtime isolation.)r   Ú
expanduserÚis_absoluter   Úresolver	   rW   r.  )ÚhomeÚrawÚcachedÚresolveds       r"   r-   r-     s—   € åÑÔ×'Ò'Ñ)Ô)€DØ×ÒÑÔð #Ý�4—<’<‘>”>Ñ"Ô"Ð"Ý
ˆd‰)Œ)€CÝ×#Ò# CÑ(Ô(€FØÐØˆÝ�4—<’<‘>”>Ñ"Ô"€HÝ×(Ò(¨¨hÑ7Ô7Ð7r!   c                 ó*   — t          j        d¦  «        S )z>Load the binding only when a producer or consumer needs Relay.Ú
nemo_relay)Ú	importlibÚimport_moduler    r!   r"   r,   r,   )  s   € åÔ" <Ñ0Ô0Ð0r!   rN   c                óJ   — t          |                      d¦  «        pd¦  «        S )Nr   r   )r   rW   )rN   s    r"   rV   rV   .  s!   € Ýˆu�yŠy˜Ñ&Ô&Ð,¨"Ñ-Ô-Ð-r!   r*   c                 óœ   — t                                ¦   «          t                               ¦   «          t                               ¦   «          dS )z8Reset all profile-scoped Relay hosts for isolated tests.N)ÚSESSION_COORDINATORr'  r=  rÞ   r	   rÜ   r    r!   r"   Ú_reset_for_testsrv  2  s>   € å×5Ò5Ñ7Ô7Ð7Ý×ÒÑ Ô Ð Ý×ÒÑÔÐÐÐr!   )r)   rí   r¸   r„   )r   r(   r)   rí   )r   r   r)   rC  )
r™   r   r   r   rL   r   rM   r   r)   r   rº   )r   r   r   r   r)   rQ   )
r   r   r|   r}   r~   r   r   r   r)   r   r¹   )rR  rS  rT  rS  r)   r   )rÓ   r   r&   r(   r)   rc  )rÓ   r   r&   r(   r)   rÔ   )r)   r   r‡   )rN   rO   r)   r   r»   )=r   Ú
__future__r   r:   r•   r\   rq  r’   Úloggingr   r.   Údataclassesr   r   Útypingr   r   Úhermes_constantsr   Ú	getLoggerr   rª   ra   r  ÚLOGICAL_LLM_SCOPErX   rY   rZ   r	   r   r   r$   r¿   rã   rÎ   r=  rá   ræ   Ú
ContextVarrò   rô   rö   r   ru  r?  rA  rl   rH  r›   r¤   r[   r�   r˜   rz   ra  rE  rf  r-   r,   rV   rv  r    r!   r"   ú<module>r     sä  ðØ HÐ HÐ Hà "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø €€€Ø Ð Ð Ð Ø €€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø  Ð  Ð  Ð  Ð  Ð  Ð  Ð  à ,Ð ,Ð ,Ð ,Ð ,Ð ,à	ˆÔ	˜8Ñ	$Ô	$€à €Ø€
Ø-Ð Ø2Ð Ø2Ð Ø6Ð Ø%'Ð Ð 'Ð 'Ð 'Ñ 'ð ð/ð /ð /ð /ð /ñ /ô /ñ „ð/ðCð Cð Cð Cð Cñ Cô Cð CðL
 €�$ÐÑÔð!Cð !Cð !Cð !Cð !Cñ !Cô !Cñ Ôð!CðH Ð+Ñ+€	ð*ð *ð *ð *ð *ñ *ô *ð *ðZ "Ð!Ñ#Ô#€ð ð	ð 	ð 	ð 	ð 	ñ 	ô 	ñ „ð	ð ðð ð ð ð ñ ô ñ „ðð, BXÀÔAWØ ðBñ Bô B€ð ð ð ñ ð 8N°{Ô7MØ)°1ð8ñ 8ô 8Ð ð ð ð ñ ð
3ð 3ð 3ð 3ð 3ñ 3ô 3ð 3ð"s4ð s4ð s4ð s4ð s4ñ s4ô s4ð s4ðl	 .Ð-Ñ/Ô/Ð ðð ð ð ð
Dð Dð Dð Dðð ð ð ð ð,*Ið *Ið *Ið *Iðb Øðð ð ð ð ð ð.ð ð ð ð&	ð 	ð 	ð 	ðFð Fð Fð Fð$Rð Rð Rð Rð$Oð Oð Oð Oðð ð ð ð0 Ø"ð<ð <ð <ð <ð <ð <ð Ø"ðAð Að Að Að Að Að
8ð 
8ð 
8ð 
8ð1ð 1ð 1ð 1ð
.ð .ð .ð .ðð ð ð ð ð r!   