§
    øžyj;)  ã                  óD  — 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ZeZeeeehZded<   e G d„ d¦  «        ¦   «         Zd3d„Zd3d„Zd4d„Zd5d„Zd6d„Z d5d „Z!d7d#„Z"d8d$„Z#d7d%„Z$d9d(„Z%d:d*„Z&d;d,„Z'd<d0„Z(d=d2„Z)dS )>a  Hermes middleware contract helpers.

Observer hooks report what happened. Middleware can change what happens by
rewriting a request or wrapping the actual execution callback. Keep the small
contract helpers here so agent-loop call sites and plugins share one 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                  óX   — e Zd ZU dZded<   ded<   dZded<    ee¬¦  «        Zd	ed
<   dS )ÚRequestMiddlewareResultz;Result of applying request middleware to a mutable payload.r   ÚpayloadÚoriginal_payloadFÚboolÚchanged)Údefault_factoryzList[Dict[str, Any]]ÚtraceN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r   Úlistr   © ó    ú;/home/ragecks/.hermes/hermes-agent/hermes_cli/middleware.pyr   r   %   s\   € € € € € € àEÐEà€L€L�LØÐÐÑØ€GÐÐÐÑØ"' %¸Ð"=Ñ"=Ô"=€EÐ=Ð=Ð=Ñ=Ð=Ð=r   r   Úkwargsr   ÚreturnúDict[str, Any]c                 ó<   — |                       dt          ¦  «         | S )NÚtelemetry_schema_version)Ú
setdefaultÚOBSERVER_SCHEMA_VERSION©r!   s    r    Úobserver_payloadr)   /   s   € Ø
×ÒÐ0Õ2IÑJÔJÐJØ€Mr   c                 ór   — |                       dt          ¦  «         |                       dt          ¦  «         | S )Nr%   Úmiddleware_schema_version)r&   r'   ÚMIDDLEWARE_SCHEMA_VERSIONr(   s    r    Úmiddleware_payloadr-   4   s7   € Ø
×ÒÐ0Õ2IÑJÔJÐJØ
×ÒÐ1Õ3LÑMÔMÐMØ€Mr   r   c                óÜ   — 	 t          | ¦  «        S # t          $ rP}t                               d|¦  «         t	          | t
          ¦  «        rt          | ¦  «        cY d}~S | cY d}~S d}~ww xY w)a÷  Deep-copy a request payload, tolerating non-deepcopyable members.

    Request payloads are normally plain JSON-shaped dicts, but an LLM request
    can occasionally carry non-deepcopyable objects (clients, callbacks, file
    handles). A hard ``deepcopy`` failure there would otherwise abort the whole
    request-middleware pass. Fall back to a shallow ``dict`` copy so middleware
    still runs and the original nested objects are shared by reference rather
    than corrupting the live payload.
    z<deepcopy failed for request payload (%s); using shallow copyN)r   Ú	ExceptionÚloggerÚdebugÚ
isinstanceÚdict)r   Úexcs     r    Ú
_safe_copyr5   :   s†   € ðÝ˜Ñ Ô Ð øÝð ð ð Ý�ŠÐSÐUXÑYÔYÐYÝ�g�tÑ$Ô$ð 	!Ý˜‘=”=Ð Ð Ð Ð Ð Ð Øˆˆˆˆˆˆøøøøð	øøøs&   ‚ ‘
A+›>A&ÁA+ÁA&Á A+Á&A+ÚrequestÚcontextc                óä  — t          t          ¦  «        st          | | dg ¬¦  «        S t          | ¦  «        }t          |¦  «        }g }t	          t          f||dœ|¤ŽD ]t}t          |t          ¦  «        sŒ|                     d¦  «        }t          |t          ¦  «        sŒCt          |¦  «        }|                     t          |¦  «        ¦  «         Œut          ||t          |¦  «        |¬¦  «        S )z¦Apply registered LLM request middleware.

    Middleware may return ``{"request": {...}}`` to replace the effective
    provider kwargs before Hermes sends them.
    F©r   r   r   r   ©r6   Úoriginal_requestr6   )Ú_has_middlewareÚLLM_REQUEST_MIDDLEWAREr   r5   Ú_invoke_middlewarer2   r3   ÚgetÚappendÚ_trace_entryr   )r6   r7   r;   Úcurrent_requestr   ÚresultÚnext_requests          r    Úapply_llm_request_middlewarerE   M   s!  € õ Õ1Ñ2Ô2ð 
Ý&ØØ$ØØð	
ñ 
ô 
ð 	
õ " 'Ñ*Ô*ÐÝ Ð!1Ñ2Ô2€OØ"$€Eå$ÝðàØ)ðð ð ð	ð ð +ð +ˆõ ˜&¥$Ñ'Ô'ð 	ØØ—z’z )Ñ,Ô,ˆÝ˜,­Ñ-Ô-ð 	ØÝ$ \Ñ2Ô2ˆØ�Š•\ &Ñ)Ô)Ñ*Ô*Ð*Ð*å"ØØ)Ý�U‘”Øð	ñ ô ð r   Ú	tool_nameÚstrÚargsc                ó2  — t          |¦  «        }t          |¦  «        }g }t          |                     d¦  «        pd¦  «        }t          |                     dd¦  «        ¦  «        }|rL|sJddlm} |                     || |¬¦  «        }	|	|k    r&t          |	¦  «        }|                     dd	i¦  «         t          t          ¦  «        s$t          |s|n||t          |¦  «        |¬
¦  «        S t          t          f| ||dœ|¤ŽD ]t}
t          |
t          ¦  «        sŒ|
                     d¦  «        }t          |t          ¦  «        sŒCt          |¦  «        }|                     t          |
¦  «        ¦  «         Œut          ||t          |¦  «        |¬
¦  «        S )zÆApply registered tool request middleware.

    Middleware may return ``{"args": {...}}`` to replace the effective tool
    arguments before hooks, guardrails, approvals, and execution see them.
    Ú
session_idÚ Ú
skip_relayFr   )Úrelay_runtime)rJ   rF   rH   ÚsourceÚ
nemo_relayr9   ©rF   rH   Úoriginal_argsrH   )r5   rG   r?   r   ÚpopÚagentrM   Úapply_tool_request_interceptsr@   r<   ÚTOOL_REQUEST_MIDDLEWAREr   r>   r2   r3   rA   )rF   rH   r7   rQ   Úcurrent_argsr   rJ   rL   rM   Ú
relay_argsrC   Ú	next_argss               r    Úapply_tool_request_middlewarerY   x   sà  € õ ˜tÑ$Ô$€MÝ˜mÑ,Ô,€LØ"$€Eå�W—[’[ Ñ.Ô.Ð4°"Ñ5Ô5€JÝ�g—k’k ,°Ñ6Ô6Ñ7Ô7€JØð 
3˜*ð 
3Ø'Ð'Ð'Ð'Ð'Ð'à"×@Ò@Ø!ØØð Añ 
ô 
ˆ
ð
 ˜Ò%Ð%Ý% jÑ1Ô1ˆLØ�LŠL˜( LÐ1Ñ2Ô2Ð2åÕ2Ñ3Ô3ð 
Ý&Ø %Ð7�D�D¨<Ø!Ý˜‘K”KØð	
ñ 
ô 
ð 	
õ %ÝðàØØ#ð	ð ð
 ðð ð +ð +ˆõ ˜&¥$Ñ'Ô'ð 	ØØ—J’J˜vÑ&Ô&ˆ	Ý˜)¥TÑ*Ô*ð 	ØÝ! )Ñ,Ô,ˆØ�Š•\ &Ñ)Ô)Ñ*Ô*Ð*Ð*å"ØØ&Ý�U‘”Øð	ñ ô ð r   c                ó   — t          | fi |¤ŽS )z7Compatibility wrapper for older ``api_request`` naming.)rE   )r6   r7   s     r    Úapply_api_request_middlewarer[   ³   s   € õ
 (¨Ð;Ð;°7Ð;Ð;Ð;r   Ú	next_callúCallable[[Dict[str, Any]], Any]c                óš   — t          t          ¦  «        }|s || ¦  «        S t          t          ||f| |                     d| ¦  «        dœ|¤ŽS )zCRun provider execution through registered LLM execution middleware.r;   r:   )Ú_get_middleware_callbacksÚLLM_EXECUTION_MIDDLEWAREÚ_run_execution_chainrR   )r6   r\   r7   Ú	callbackss       r    Úrun_llm_execution_middlewarerc   »   sp   € õ *Õ*BÑCÔC€IØð "Øˆy˜Ñ!Ô!Ð!ÝÝ ØØðð Ø ŸšÐ%7¸ÑAÔAðð ð ðð ð r   c           	     óœ   — t          t          ¦  «        }|s ||¦  «        S t          t          ||f| ||                     d|¦  «        dœ|¤ŽS )z@Run tool execution through registered tool execution middleware.rQ   rP   )r_   ÚTOOL_EXECUTION_MIDDLEWAREra   rR   )rF   rH   r\   r7   rb   s        r    Úrun_tool_execution_middlewarerf   Î   sp   € õ *Õ*CÑDÔD€IØð Øˆy˜‰ŒÐÝÝ!ØØðð ØØ—k’k /°4Ñ8Ô8ðð ð ðð ð r   c                ó   — t          | |fi |¤ŽS )z9Compatibility wrapper for older ``api_execution`` naming.)rc   )r6   r\   r7   s      r    Úrun_api_execution_middlewarerh   ã   s   € õ (¨°ÐFÐF¸gÐFÐFÐFr   Úkindú	List[Any]c           	     ó4   — ddl m}  || fi t          di |¤Ž¤ŽS )Nr   )Úinvoke_middlewarer   )Úhermes_cli.pluginsrl   r-   )ri   r!   rl   s      r    r>   r>   ì   s<   € Ø4Ð4Ð4Ð4Ð4Ð4àÐ˜TÐBÐBÕ%7Ð%AÐ%A¸&Ð%AÐ%AÐBÐBÐBr   r   c                ó$   — ddl m}  || ¦  «        S )Nr   )Úhas_middleware)rm   ro   )ri   ro   s     r    r<   r<   ò   s$   € Ø1Ð1Ð1Ð1Ð1Ð1àˆ>˜$ÑÔÐr   úList[Callable]c                ón   — ddl m} t           |¦   «         j                             | g ¦  «        ¦  «        S )Nr   )Úget_plugin_manager)rm   rr   r   Ú_middlewarer?   )ri   rr   s     r    r_   r_   ø   s?   € Ø5Ð5Ð5Ð5Ð5Ð5åÐ"Ð"Ñ$Ô$Ô0×4Ò4°T¸2Ñ>Ô>Ñ?Ô?Ð?r   rb   Úterminal_callúCallable[[Any], Any]c                ó‚   ‡ ‡‡‡‡‡‡— d‰v rdndŠ G d„ dt           ¦  «        Šdˆˆˆˆ ˆˆˆfd
„Š ‰d‰‰         ¦  «        S )Nr6   rH   c                  ó    ‡ — e Zd Zdˆ fd„Zˆ xZS )ú7_run_execution_chain.<locals>._DownstreamExecutionErrorÚoriginalÚBaseExceptionr"   ÚNonec                ór   •— t          ¦   «                              t          |¦  «        ¦  «         || _        d S ©N)ÚsuperÚ__init__rG   ry   )Úselfry   Ú	__class__s     €r    r   z@_run_execution_chain.<locals>._DownstreamExecutionError.__init__  s,   ø€ Ý‰GŒG×Ò�S ™]œ]Ñ+Ô+Ð+Ø$ˆDŒMˆMˆMr   )ry   rz   r"   r{   )r   r   r   r   Ú__classcell__)r�   s   @r    Ú_DownstreamExecutionErrorrx     s=   ø€ € € € € ð	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%r   rƒ   ÚindexÚintr   r   r"   c                ó¸  •‡ ‡‡‡‡‡— ‰ t          ‰¦  «        k    r ‰‰¦  «        S ‰‰          ŠdŠdŠd Šd
dˆ	ˆ
ˆˆ ˆˆˆˆˆf	d„}t          di ‰¤Ž}‰|‰<   ||d<   	  ‰di |¤ŽS # ‰	$ r}|j        ‚d }~wt          $ r^}t                               d‰t          ‰dt          ‰¦  «        ¦  «        |¦  «         ‰r‰cY d }~S ‰r‚  ‰
‰ d	z   ‰¦  «        cY d }~S d }~ww xY w)NFÚnext_payloadr   r"   c                óÜ   •	— ‰r2t          d‰› dt          ‰dt          ‰¦  «        ¦  «        › d�¦  «        ‚dŠ	  ‰‰dz   | €‰
n| ¦  «        ŠdŠ	‰S # t          $ r} ‰|¦  «        |‚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/   )r‡   r4   rƒ   Úcall_atÚcallbackr„   ri   Únext_calledÚnext_resultÚnext_succeededr   s     €€€€€€€€€r    r\   z8_run_execution_chain.<locals>.call_at.<locals>.next_call  sÂ   ø€ ð ð Ý"ðU 4ð Uð UÝ˜x¨µT¸(±^´^ÑDÔDðUð Uð Uñô ð ð
 ˆKð>Ø%˜g e¨a¡i¸LÐ<P°°ÐVbÑcÔc�Ø!%�Ø"Ð"øÝð >ð >ð >Ø/Ð/°Ñ4Ô4¸#Ð=øøøøð>øøøs   ¹A Á
A+ÁA&Á&A+r\   z&Middleware '%s' callback %s raised: %sr   r‰   r}   )r‡   r   r"   r   r   )Úlenr-   ry   r/   r0   Úwarningr‹   rŒ   )r„   r   r\   Úcall_kwargsr4   rŽ   r�   r�   r‘   rƒ   r�   rb   ri   r!   Úpayload_keyrt   s   ``   @@@@€€€€€€€r    r�   z%_run_execution_chain.<locals>.call_at  s’  øøøøøøø€ Ø•C˜	‘N”NÒ"Ð"Ø �= Ñ)Ô)Ð)à˜UÔ#ˆØˆØˆØˆð	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>õ( )Ð2Ð2¨6Ð2Ð2ˆØ#*ˆ�KÑ Ø#,ˆ�KÑ ð	/Ø�8Ð*Ð*˜kÐ*Ð*Ð*øØ(ð 	ð 	ð 	Ø”,ÐøøøøÝð 	/ð 	/ð 	/Ý�NŠNØ8ØÝ˜ *­d°8©n¬nÑ=Ô=Øñ	ô ð ð ð #Ø"Ð"Ð"Ð"Ð"Ð"Ð"Øð ØØ�7˜5 1™9 gÑ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.øøøøð	/øøøs6   ÁA" Á"CÁ'A.Á.CÁ;<CÂ7CÂ=CÃCÃCr   )r„   r…   r   r   r"   r   )r/   )ri   rb   rt   r!   rƒ   r�   r•   s   ````@@@r    ra   ra   þ   sž   øøøøøøø€ ð  )¨FÐ2Ð2�)�)¸€Kð%ð %ð %ð %ð %¥Iñ %ô %ð %ð
//ð //ð //ð //ð //ð //ð //ð //ð //ð //ð //ð //ðb ˆ7�1�f˜[Ô)Ñ*Ô*Ð*r   rC   c                ó„   — i }dD ]3}|                       |¦  «        }t          |t          ¦  «        r|r|||<   Œ4|sd|d<   |S )N)rN   ÚreasonÚnameÚpluginrN   )r?   r2   rG   )rC   ÚentryÚkeyÚvalues       r    rA   rA   ?  s^   € Ø€EØ+ð ð ˆØ—
’
˜3‘”ˆÝ�e�SÑ!Ô!ð 	 eð 	ØˆE�#‰JøØð #Ø"ˆˆh‰Ø€Lr   )r!   r   r"   r#   )r   r   r"   r   )r6   r#   r7   r   r"   r   )rF   rG   rH   r#   r7   r   r"   r   )r6   r#   r\   r]   r7   r   r"   r   )
rF   rG   rH   r#   r\   r]   r7   r   r"   r   )ri   rG   r!   r   r"   rj   )ri   rG   r"   r   )ri   rG   r"   rp   )
ri   rG   rb   rp   rt   ru   r!   r   r"   r   )rC   r#   r"   r#   )*r   Ú
__future__r   ÚloggingÚcopyr   Údataclassesr   r   Útypingr   r   r	   r
   Ú	getLoggerr   r0   r'   r,   rU   re   r=   r`   ÚAPI_REQUEST_MIDDLEWAREÚAPI_EXECUTION_MIDDLEWAREr   r   r   r)   r-   r5   rE   rY   r[   rc   rf   rh   r>   r<   r_   ra   rA   r   r   r    ú<module>r¥      sR  ððð ð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,à	ˆÔ	˜8Ñ	$Ô	$€à.Ð Ø2Ð à(Ð Ø,Ð Ø&Ð Ø*Ð ð 0Ð Ø3Ð ð ØØØð	Ð ð ð ð ñ ð ð>ð >ð >ð >ð >ñ >ô >ñ „ð>ðð ð ð ð
ð ð ð ðð ð ð ð&(ð (ð (ð (ðV8ð 8ð 8ð 8ðv<ð <ð <ð <ðð ð ð ð&ð ð ð ð*Gð Gð Gð GðCð Cð Cð Cð ð  ð  ð  ð@ð @ð @ð @ð>+ð >+ð >+ð >+ðBð ð ð ð ð r   