Ë
    âß²jÀ$  ã                  ó   — U d Z ddlmZ ddlZddlmZ ddlmZmZ ddl	m
Z
mZmZmZ  ej                  e«      ZdZdZd	Zd
ZdZdZeeeehZded<   e G d„ d«      «       Zdd„Zdd„Zdd„Z	 	 	 	 	 	 	 	 	 	 	 	 d d„Zd!d„Z	 	 	 	 	 	 	 	 d"d„Z	 	 	 	 	 	 	 	 d#d„Z 	 	 	 	 	 	 	 	 	 	 d$d„Z! G d„ de"«      Z#d%d„Z$eZ%eZ&	 	 	 	 	 	 d!d„Z'	 	 	 	 	 	 	 	 d#d„Z(y)&zèHermes middleware contract helpers.

Observer hooks report what happened. Middleware can change what happens by rewriting a request or
wrapping the actual execution callback. Agent-loop call sites and plugins share this vocabulary.
é    )ÚannotationsN)Údeepcopy)Ú	dataclassÚfield)ÚAnyÚCallableÚDictÚListzhermes.observer.v1zhermes.middleware.v1Útool_requestÚtool_executionÚllm_requestÚllm_executionzset[str]ÚVALID_MIDDLEWAREc                  óP   — e Zd ZU dZded<   ded<   dZded<    ee¬«      Zd	ed
<   y)ÚRequestMiddlewareResultz;Result of applying request middleware to a mutable payload.r   ÚpayloadÚoriginal_payloadFÚboolÚchanged)Údefault_factoryúList[Dict[str, Any]]ÚtraceN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r   Úlistr   © ó    ú:/home/ubuntu/.hermes/hermes-agent/hermes_cli/middleware.pyr   r      s*   … áEàƒLØÓØ€GˆTÓÙ"'¸Ô"=€EÐÔ=r    r   c                 ó2   — | j                  dt        «       | S )NÚtelemetry_schema_version)Ú
setdefaultÚOBSERVER_SCHEMA_VERSION©Úkwargss    r!   Úobserver_payloadr(   '   s   € Ø
×ÑÐ0Ô2IÔJØ€Mr    c                 ó^   — | j                  dt        «       | j                  dt        «       | S )Nr#   Úmiddleware_schema_version)r$   r%   ÚMIDDLEWARE_SCHEMA_VERSIONr&   s    r!   Úmiddleware_payloadr,   ,   s+   € Ø
×ÑÐ0Ô2IÔJØ
×ÑÐ1Ô3LÔMØ€Mr    c                ó¬   — 	 t        | «      S # t        $ r=}t        j                  d|«       t	        | t
        «      rt        | «      n| cY d}~S d}~ww xY w)zÝDeep-copy a request payload, tolerating non-deepcopyable members.

    An LLM request can carry clients/callbacks/file handles; a hard ``deepcopy`` failure would
    otherwise abort the whole request-middleware pass.
    z<deepcopy failed for request payload (%s); using shallow copyN)r   Ú	ExceptionÚloggerÚdebugÚ
isinstanceÚdict)r   Úexcs     r!   Ú
_safe_copyr4   2   sJ   € ðGÜ˜Ó Ð øÜò GÜ�‰ÐSÐUXÔYÜ *¨7´DÔ 9Œt�GŒ}¸wÕFûðGús   ‚
 �	A–2AÁAÁAc           	     ó�  — ddl m} ||   } || fi t        di |¤Ž¤ŽD ]Š  }t        |t        «      sŒ|j                  |«      }t        |t        «      sŒ6t        |«      }dD �	ci c](  }	t        |j                  |	«      x}
t        «      r|
r|	|
“Œ* }}	|j                  |xs ddi«       ŒŒ t        ||t        |«      |¬«      S c c}	w )ziFeed ``kwargs[payload_key]`` through every ``kind`` middleware; each may return ``{payload_key: {...}}``.r   )Úinvoke_middleware)ÚsourceÚreasonÚnamer7   Úplugin©r   r   r   r   r   )Úhermes_cli.pluginsr6   r,   r1   r2   Úgetr4   ÚstrÚappendr   r   )ÚkindÚpayload_keyr   Úoriginalr'   r6   ÚcurrentÚresultÚnext_payloadÚkeyÚvalueÚentrys               r!   Ú_apply_request_chainrI   ?   sÚ   € õ 5à�[Ñ!€GÙ# DÑIÔ,>Ñ,HÀÑ,HÑIò 4ˆÜ˜&¤$Ô'ØØ—z‘z +Ó.ˆÜ˜,¬Ô-ØÜ˜\Ó*ˆð 4ö
àÜ 6§:¡:¨c£?Ð2˜%´CÔ8¹Uð �‰Jð
ˆð 
ð
 	�‰�UÒ2˜x¨Ð2Õ3ð4ô #Ø¨(¼DÀ»KÈuôð ùò
s   Á#-Cc                ó”   — ddl m}  |t        «      st        | | ¬«      S t	        | «      }t        t        dg |ft	        |«      |dœ|¤ŽS )z]Apply registered LLM request middleware; ``{"request": {...}}`` replaces the provider kwargs.r   ©Úhas_middleware)r   r   Úrequest©rM   Úoriginal_request)r<   rL   ÚLLM_REQUEST_MIDDLEWAREr   r4   rI   )rM   ÚcontextrL   rO   s       r!   Úapply_llm_request_middlewarerR   X   sV   € å1áÔ0Ô1Ü&¨wÈÔQÐQä! 'Ó*ÐÜÜ 	¨2Ð/?ðäÐ+Ó,Ð?OñàSZñð r    c                ó°  — t        |«      }t        |«      }g }t        |j                  d«      xs d«      }t        |j	                  dd«      «      }|r?|s=ddlm} |j                  || |¬«      }	|	|k7  rt        |	«      }|j                  dd	i«       dd
l	m
}
  |
t        «      st        |s|n||t        |«      |¬«      S t        t        d||f| ||dœ|¤ŽS )z¤Apply registered tool request middleware; ``{"args": {...}}`` replaces the effective tool
    arguments before hooks, guardrails, approvals, and execution see them.Ú
session_idÚ Ú
skip_relayFr   )Úrelay_runtime)rT   Ú	tool_nameÚargsr7   Ú
nemo_relayrK   r;   rY   ©rX   rY   Úoriginal_args)r4   r>   r=   r   ÚpopÚagentrW   Úapply_tool_request_interceptsr?   r<   rL   ÚTOOL_REQUEST_MIDDLEWAREr   rI   )rX   rY   rQ   r\   Úcurrent_argsr   rT   rV   rW   Ú
relay_argsrL   s              r!   Úapply_tool_request_middlewarerc   f   sê   € ô
 ˜tÓ$€MÜ˜mÓ,€LØ"$€Eä�W—[‘[ Ó.Ò4°"Ó5€JÜ�g—k‘k ,°Ó6Ó7€JÙ™*Ý'à"×@Ñ@Ø!¨Y¸\ð Aó Kˆ
à˜Ò%Ü% jÓ1ˆLØ�L‰L˜( LÐ1Ô2å1áÔ1Ô2Ü&Ù %‘D¨<È$Ü˜“K uô
ð 	
ô  Ü ¨°ðà ,¸mñàOVñð r    c                óJ   — t        t        |f| |j                  d| «      dœ|¤ŽS )zCRun provider execution through registered LLM execution middleware.rO   rN   )Ú_run_execution_chainÚLLM_EXECUTION_MIDDLEWAREr]   ©rM   Ú	next_callrQ   s      r!   Úrun_llm_execution_middlewareri   ‡   s8   € ô  Ü  )ð_à¨'¯+©+Ð6HÈ'Ó*Rñ_àV]ñ_ð _r    c           	     óL   — t        t        |f| ||j                  d|«      dœ|¤ŽS )z@Run tool execution through registered tool execution middleware.r\   r[   )re   ÚTOOL_EXECUTION_MIDDLEWAREr]   )rX   rY   rh   rQ   s       r!   Úrun_tool_execution_middlewarerl   �   s:   € ô  Ü! 9ðeà $°g·k±kÀ/ÐSWÓ6Xñeà\cñeð er    c                  ó$   ‡ — e Zd ZdZdˆ fd„Zˆ xZS )Ú_DownstreamExecutionErrorz‚Marks an exception raised BELOW a middleware frame so the frame's own failure handling
    (skip-and-continue) doesn't swallow it.c                óD   •— t         ‰| �  t        |«      «       || _        y ©N)ÚsuperÚ__init__r>   rB   )ÚselfrB   Ú	__class__s     €r!   rr   z"_DownstreamExecutionError.__init__œ   s   ø€ Ü‰Ñœ˜X›Ô'Ø ˆ�r    )rB   ÚBaseExceptionÚreturnÚNone)r   r   r   r   rr   Ú__classcell__)rt   s   @r!   rn   rn   ˜   s   ø„ ñ/÷!ñ !r    rn   c                óÎ   ‡ ‡‡‡‡‡‡— ddl m} d‰v rdndŠ |«       Št        ‰j                  j	                  ‰ g «      «      Š‰s ‰‰‰   «      S dˆˆˆ ˆˆˆˆfd„Š ‰d‰‰   «      S )Nr   )Ú_delivery_managerrM   rY   c           
     ób  •‡ ‡‡‡‡‡— ‰ t        ‰
«      k\  r ‰‰«      S ‰
‰    ŠdŠdŠd Šddˆ	ˆˆ ˆˆˆˆˆfd„}t        d	i ‰¤Ž}‰|‰<   ||d<   	  ‰d	i |¤ŽS # t        $ r}|j                  ‚d }~wt        $ r8}‰j                  ‰‰||d¬«       ‰r‰cY d }~S ‰r‚  ‰	‰ dz   ‰«      cY d }~S d }~ww xY w)
NFc                ó¼   •— ‰r&t        d‰› dt        ‰dt        ‰«      «      › d�«      ‚dŠ	  ‰‰dz   | €‰	n| «      ŠdŠ‰S # t        $ r}t	        |«      |‚d }~ww xY w)NzMiddleware 'z' callback r   zF called next_call() more than once; downstream execution is single-useTé   )ÚRuntimeErrorÚgetattrÚreprr.   rn   )
rE   r3   Úcall_atÚcallbackÚindexr@   Únext_calledÚnext_resultÚnext_succeededr   s
     €€€€€€€€r!   rh   z8_run_execution_chain.<locals>.call_at.<locals>.next_call³   sŠ   ø€ ñ Ü"Ø" 4 &¨Ü˜x¨´T¸(³^ÓDÐEð FUðUóð ð
 ˆKð>Ù% e¨a¡i¸LÐ<P±ÐVbÓc�Ø!%�Ø"Ð"øÜò >Ü/°Ó4¸#Ð=ûð>ús   ­A Á	AÁ
AÁArh   Ú
Middleware)Úsurfacer}   rp   )rE   r   rv   r   r   )Úlenr,   rn   rB   r.   Ú_report_hook_failure)rƒ   r   rh   Úcall_kwargsr3   r‚   r„   r…   r†   r�   Ú	callbacksr@   r'   ÚmanagerrA   Úterminal_calls   ``   @@@@€€€€€€€r!   r�   z%_run_execution_chain.<locals>.call_atª   sÒ   þ€ Ø”C˜	“NÒ"Ù  Ó)Ð)à˜UÑ#ˆØˆØˆØˆ÷	>õ 	>ô$ )Ñ2¨6Ñ2ˆØ#*ˆ�KÑ Ø#,ˆ�KÑ ð	/ÙÑ*˜kÑ*Ð*øÜ(ò 	Ø—,‘,ÐûÜò 	/ð ×(Ñ(¨¨x¸ÀcÐS_Ð(Ô`ÙØ"Õ"ÙØÙ˜5 1™9 gÓ.Õ.ûð	/ús6   ÁA Á	B.ÁA*Á*B.Á6B)ÂB.ÂB)Â#B.Â)B.)rƒ   Úintr   r   rv   r   )r<   rz   r   Ú_middlewarer=   )r@   rŽ   r'   rz   r�   rŒ   r�   rA   s   ``` @@@@r!   re   re   ¡   sk   þ€ Ý4à(¨FÑ2‘)¸€KÙÓ!€GÜ�W×(Ñ(×,Ñ,¨T°2Ó6Ó7€IÙÙ˜V KÑ0Ó1Ð1÷*/ó */ñX �1�f˜[Ñ)Ó*Ð*r    c                ó   — t        | fi |¤ŽS )z7Compatibility wrapper for older ``api_request`` naming.)rR   )rM   rQ   s     r!   Úapply_api_request_middlewarer’   â   s   € ô
 (¨Ñ;°7Ñ;Ð;r    c                ó   — t        | |fi |¤ŽS )z9Compatibility wrapper for older ``api_execution`` naming.)ri   rg   s      r!   Úrun_api_execution_middlewarer”   é   s   € ô (¨°ÑF¸gÑFÐFr    )r'   r   rv   úDict[str, Any])r   r   rv   r   )r@   r>   rA   r>   r   r   rB   r   r'   r   rv   r   )rM   r•   rQ   r   rv   r   )rX   r>   rY   r•   rQ   r   rv   r   )rM   r•   rh   úCallable[[Dict[str, Any]], Any]rQ   r   rv   r   )
rX   r>   rY   r•   rh   r–   rQ   r   rv   r   )r@   r>   rŽ   zCallable[[Any], Any]r'   r   rv   r   ))r   Ú
__future__r   ÚloggingÚcopyr   Údataclassesr   r   Útypingr   r   r	   r
   Ú	getLoggerr   r/   r%   r+   r`   rk   rP   rf   r   r   r   r(   r,   r4   rI   rR   rc   ri   rl   r.   rn   re   ÚAPI_EXECUTION_MIDDLEWAREÚAPI_REQUEST_MIDDLEWAREr’   r”   r   r    r!   ú<module>rŸ      sÄ  ðòõ #ã Ý ß (ß ,Ó ,à	ˆ×	Ñ	˜8Ó	$€à.Ð Ø2Ð à(Ð Ø,Ð Ø&Ð Ø*Ð ð Ð6Ð8NÐPhðÐ �(ó ð
 ÷>ð >ó ð>óó
ó
GðØ
ðØðØ(<ðØHKðØWZðàóó2ðØðØ(ðØ58ðàóðB_Øð_Ø(Gð_ØTWð_Ø\_ó_ðeØðeØ(ðeØ5TðeØadðeàóeô! 	ô !ó5+ðz 4Ð à/Ð ð<Øð<àð<ð ó<ðGØðGà.ðGð ðGð 	ô	Gr    