+
    lHàjÕI  ã                   ó(  € R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIH	t	H
t
HtHt ^ RIHt ^ RIHtHtHtHtHtHt ^ RIHt ]P0                  ! R4      tR tR	 R
 ltR R ltR R ltR R ltR R lt ! R R4      t R R lt! ! R R4      t"R# )z…MCP client-side handlers for server-initiated requests: sampling
(sampling/createMessage, text and tool-use results) and elicitation.N)ÚContext)ÚTYPE_CHECKINGÚCallableÚListÚOptional)Úis_truthy_value)Ú_MISSINGÚ_exc_strÚ_safe_numericÚ_sanitize_errorÚ	mcp_fieldÚ_core)Ú_normalize_mcp_input_schemaztools.mcp_toolc                ó&   € \        V RR\        4      # )u£   Tool-use id (marks a tool *result* block) under both SDK spellings â€” on mcp 2.x a bare
``hasattr(b, "toolUseId")`` is False and would silently drop tool results.Útool_use_idÚ	toolUseId)r   r   )Úblocks   &Ú</home/ubuntu/.hermes/hermes-agent/tools/mcp_tool_sampling.pyÚ_tool_use_idr      s   € ô �U˜M¨;¼ÓAÐAó    c                ó$   € V ^8„  d   QhR\         /# ©é   Úreturn©Ústr)Úformats   "r   Ú__annotate__r      s   € ÷ Kñ K¤ñ Kr   c                óŽ   € \        V RR4      pVf   R# \        V\        4      '       d   TMV.pRP                  R V 4       4      # )zBText of a ToolResultContent block ("" when it carries no content).ÚcontentNÚ Ú
c              3   ób   "  € T F%  p\        VR 4      '       g   K  VP                  x € K'  	  R# 5i)ÚtextN)Úhasattrr#   )Ú.0Úitems   & r   Ú	<genexpr>Ú$_tool_result_text.<locals>.<genexpr>   s   é € ÐJ©5 4´G¸DÀ&×4I”Y�T—Y–Y«5ùs   ‚/›/)ÚgetattrÚ
isinstanceÚlistÚjoin)r   r   Úitemss   &  r   Ú_tool_result_textr.      sB   € ä�e˜Y¨Ó-€GØ‚ÙÜ! '¬4×0Ò0‰G°w°i€EØ�9‰9ÑJ©5ÓJÓJÐJr   c                ó:   € V ^8„  d   QhR\         \        ,          /# r   )r   Údict)r   s   "r   r   r   "   s   € ÷ ñ œH¤T�Nñ r   c                ó(  € \        V R4      '       d   RRRV P                  /# \        V RR\        4      p\        V R4      '       d#   V\        Jd   RRRRRV R	V P                   2//# \
        P                  R
\        V 4      P                  4       R# )zFOne OpenAI content part for a text/image block; None when unsupported.r#   ÚtypeÚ	mime_typeÚmimeTypeÚdataÚ	image_urlÚurlzdata:z;base64,z5Unsupported sampling content block type: %s (skipped)N)	r$   r#   r   r   r5   ÚloggerÚwarningr2   Ú__name__)r   Úmimes   & r   Ú_content_partr<   "   s‹   € äˆu�f×ÒØ˜ ¨¯
©
Ð3Ð3Ü�U˜K¨´XÓ>€DÜˆu�f×Ò $¬hÓ"6Ø˜ [°5¸EÀ$ÀÀxÐPU×PZÑPZÈ|Ð:\Ð2]Ð^Ð^Ü
‡N�NÐJÌDÐQVËK×L`ÑL`ÔaÙr   c                ó0   € V ^8„  d   QhR\         R\        /# )r   Úindexr   )Úintr0   )r   s   "r   r   r   -   s   € ÷ vñ vœsð v¤tñ vr   c                 óÔ   € V P                   pR \        V R RV 24      RRRRV P                  R\        V\        4      '       d   \
        P                  ! VRR7      //# \        V4      //# )ÚidÚcall_r2   ÚfunctionÚnameÚ	argumentsF)Úensure_ascii)Úinputr)   rD   r*   r0   ÚjsonÚdumpsr   )Útur>   Úargss   && r   Ú_tool_call_dictrL   -   sz   € Ø�8‰8€DØ”'˜"˜d e¨E¨7 OÓ4°f¸jÈ*Ø�—‘˜ÌjÐY]Ô_c×NdÒNd¤d§j¢j°ÀEÔ&JðWuð vð vÜjmÐnrÓjsðWuð vð vr   c                ó:   € V ^8„  d   QhR\         \        ,          /# r   ©r+   r0   )r   s   "r   r   r   3   s   € ÷ ñ ¤d¬4¥jñ r   c                ód  € \        V R4      '       d   V P                  M8\        V P                  \        4      '       d   V P                  MV P                  .pV Uu. uF  p\        V4      \        Jg   K  VNK  	  ppV Uu. uF  p\        V4      \        J g   K  VNK  	  ppV Uu. uF-  p\        VR4      '       g   K  \        VR4      '       g   K+  VNK/  	  ppV Uu. uF+  p\        VR4      '       d   \        VR4      '       d   K)  VNK-  	  ppV Uu. uF  pRRR\        V4      R\        V4      /NK  	  ppV'       d•   RV P                  R\        V4       U	U
u. uF  w  rš\        W©4      NK  	  up
p	/pV Uu. uF#  p\        VR	4      '       g   K  VP                  NK%  	  ppV'       d   R
P                  V4      VR&   VP                  V4       V# \        V4      ^8X  dL   \        V^ ,          R	4      '       d3   VP                  RV P                  RV^ ,          P                  /4       V# V'       dL   \        \         V4       Uu. uF
  qÝf   K  VNK  	  ppV'       d    VP                  RV P                  RV/4       V# u upi u upi u upi u upi u upi u up
p	i u upi u upi )z}One MCP SamplingMessage -> OpenAI messages: tool results first, then either an assistant
tool_calls message or plain content.Úcontent_as_listrD   rG   ÚroleÚtoolÚtool_call_idr   Ú
tool_callsr#   r!   )r$   rP   r*   r   r+   r   r   r.   rQ   Ú	enumeraterL   r#   r,   ÚappendÚlenÚmapr<   )ÚmsgÚblocksÚbÚtool_resultsÚothersÚ	tool_usesÚcontent_blocksÚtrÚoutÚirJ   Úmsg_dictÚ
text_partsÚpÚpartss   &              r   Ú_convert_sampling_messagerg   3   s6  € ô %,¨CÐ1B×$CÒ$CˆS× Ò Ü! #§+¡+¬t×4Ò4ˆ�Š¸3¿;¹;¸-ð á%ÓI™v˜!¬°a«ÄÐ)H—A�A™v€LÐIÙÓ?™�A¤<°£?´hÐ#>�aˆa™€FÐ?Ù"ÓQ™F�q¤g¨a°×&8”¼WÀQÈ×=P—�™F€IÐQÙ!'Ó\¡˜A´¸¸6×0BÒ0BÄwÈqÐRY×GZ—a�a¡€NÐ\ÙjvÓ
wÑjvÐdfˆF�F˜N¬L¸Ó,<¸iÔIZÐ[]ÓI^Ó_Ñjv€CÐ
wßØ  #§(¡(¨LÔ_hÐirÔ_sÔ:tÑ_sÑV[ÐVW¼?È2Ö;QÑ_sÒ:tÐuˆÙ&4ÓK¡n ¼ÀÀ6×8J”f�a—f”f¡nˆ
ÐKßØ"&§)¡)¨JÓ"7ˆH�YÑØ�
‰
�8Ôð €Jô 
ˆ^Ó	 Ô	!¤g¨n¸QÕ.?À×&HÒ&HØ�
‰
�F˜CŸH™H i°ÀÕ1B×1GÑ1GÐHÔIð
 €J÷	 
Ü¤¨~Ô>ÓPÑ>�q—�Ñ>ˆÐPßØ�J‰J˜ §¡¨)°UÐ;Ô<Ø€Jùò# JùÚ?ùÚQùÚ\ùÚ
wùã:tùÚKùò QsZ   ÁJ	Á6J	ÂJÂJÂ(JÃJÃJÃ!&JÄJÄ#JÅ J"Å?J(ÆJ(ÉJ-ÉJ-c                ó0   € V ^8„  d   QhR\         R\        /# )r   Úserver_namer   ©r   r0   )r   s   "r   r   r   L   s   € ÷ 	Cñ 	C¬Cð 	C¼$ñ 	Cr   c                ó  € \        V\        4      '       d    \        P                  ! V4      # \        V\        4      '       d   V# R\        V4      /#   \        P                  \
        3 d    \        P                  RY4       RT/u # i ; i)zcLLM tool_calls arguments -> dict; malformed JSON / non-dicts become ``{"_raw": ...}``, not dropped.zRMCP server '%s': malformed tool_calls arguments from LLM (wrapping as raw): %.100sÚ_raw)	r*   r   rH   ÚloadsÚJSONDecodeErrorÚ
ValueErrorr8   r9   r0   )ri   rK   s   &&r   Ú_parse_tool_call_argumentsrp   L   s}   € ä�$œ×Òð	"Ü—:’:˜dÓ#Ð#ô
 ˜d¤D×)Ò)ˆ4ÐB°¼¸D»	Ð/BÐBøô	 ×$Ñ$¤jÐ1ô 	"Ü�N‰NÐoØ&ô.à˜D�>Ò!ð	"ús   ˜A Á5BÂ
Bc                   óL  a € ] tR t^Xt o RtRRRRRR/tR]P                  R	]P                  R
]P                  /t
V 3R lR ltV 3R lR ltV 3R lR ltV 3R lR lt]R#V 3R lR ll4       tV 3R lR ltR$V 3R lR lltR tR tV 3R lR ltR tV 3R lR ltR  tR!tV tR"# )%ÚSamplingHandlerul  ``sampling_callback`` for one MCP server (per-instance rate-limit, metrics, tool-loop state).
Runs on the MCP loop; the sync LLM call is offloaded via ``asyncio.to_thread``. Deprecated
upstream (MCP 2026-07-28, SEP-2577): stays functional for handshake-era servers, but do NOT grow
new capability here â€” modern servers use MRTR, handled by the SDK session layer.ÚstopÚendTurnÚlengthÚ	maxTokensrT   ÚtoolUseÚdebugÚinfor9   c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   ri   Úconfigrj   )r   Ú__classdict__s   "€r   r   ÚSamplingHandler.__annotate__a   s   ø€ ÷ [ñ [¡Cð [±ñ [r   c                óÈ  € Wn         \        VP                  R ^
4      ^
\        4      V n        \        VP                  R^4      ^\
        4      V n        \        VP                  RR4      R\        4      V n        \        VP                  R^4      ^\        ^ R7      V n        \        VP                  R4      RR7      V n
        VP                  R	4      V n        VP                  R
. 4      V n        V P                  P                  \        VP                  RR4      4      P                  4       \         P"                  4      V n        . V n        ^ V n        R^ R^ R^ R^ /V n        R# )Úmax_rpmÚtimeoutÚmax_tokens_capi   Úmax_tool_rounds)ÚminimumÚexpose_client_toolsF)ÚdefaultÚmodelÚallowed_modelsÚ	log_levelry   ÚrequestsÚerrorsÚtokens_usedÚtool_use_countN)ri   r
   Úgetr?   r   Úfloatr€   r�   r‚   r   r„   Úmodel_overrider‡   Ú_LOG_LEVELSr   ÚlowerÚloggingÚINFOÚaudit_levelÚ_rate_timestampsÚ_tool_loop_countÚmetrics)Úselfri   r{   s   &&&r   Ú__init__ÚSamplingHandler.__init__a   s$  € Ø&ÔÜ$ V§Z¡Z°	¸2Ó%>ÀÄCÓHˆŒÜ$ V§Z¡Z°	¸2Ó%>ÀÄEÓJˆŒÜ+¨F¯J©JÐ7GÈÓ,NÐPTÔVYÓZˆÔÜ,¨V¯Z©ZÐ8IÈ1Ó-MÈqÔRUÐ_`ÔaˆÔô $3°6·:±:Ð>SÓ3TÐ^cÔ#dˆÔ Ø$Ÿj™j¨Ó1ˆÔØ$Ÿj™jÐ)9¸2Ó>ˆÔØ×+Ñ+×/Ñ/´°F·J±J¸{ÈFÓ4SÓ0T×0ZÑ0ZÓ0\Ô^e×^jÑ^jÓkˆÔØ-/ˆÔØ !ˆÔØ" A x°°MÀ1ÐFVÐXYÐZˆŽr   c                ó    <€ V ^8„  d   QhRS[ /# r   )Úbool)r   r|   s   "€r   r   r}   q   s   ø€ ÷ ñ ¡4ñ r   c                ó,  € \         P                   ! 4       pV P                   Uu. uF  q"V^<,
          8”  g   K  VNK  	  upV P                  R&   \        V P                  4      V P                  8¼  d   R# V P                  P	                  V4       R# u upi )z=Sliding-window (60s) limiter; True if the request is allowed.:NNNFT)Útimer•   rW   r   rV   )r˜   ÚnowÚts   &  r   Ú_check_rate_limitÚ!SamplingHandler._check_rate_limitq   sv   € ä�iŠi‹kˆØ/3×/DÒ/DÓ#UÑ/D¨!ÈCÐRTÍHÉ§A AÑ/DÑ#Uˆ×Ñ˜aÑ Üˆt×$Ñ$Ó%¨¯©Ô5ÙØ×Ñ×$Ñ$ SÔ)Ùùò	 $Vs
   ¤B¸Bc                ó0   <€ V ^8„  d   QhRS[ S[,          /# r   )r   r   )r   r|   s   "€r   r   r}   z   s   ø€ ÷ Xñ X©X±c­]ñ Xr   c                ó’   € V P                   '       d   V P                   # \        VRR4      ;'       g    . p\        R V 4       R4      # )z3Config override > server hint > None (use default).ÚhintsNc              3   ód   "  € T F&  p\        VR R4      '       g   K  VP                  x € K(  	  R# 5i)rD   N)r)   rD   )r%   Úhints   & r   r'   Ú1SamplingHandler._resolve_model.<locals>.<genexpr>   s!   é € ÐP©5 4´G¸DÀ&È$×4O”Y�T—Y–Y«5ùs   ‚0œ0)r�   r)   Únext)r˜   Úpreferencesr¥   s   && r   Ú_resolve_modelÚSamplingHandler._resolve_modelz   sD   € à××ÐØ×&Ñ&Ð&Ü˜ W¨dÓ3×9Ð9°rˆÜÑP©5ÓPÐRVÓWÐWr   c                ó0   <€ V ^8„  d   QhRS[ S[,          /# r   rN   )r   r|   s   "€r   r   r}   �   s   ø€ ÷ Vñ V©4±­:ñ Vr   c                ól   € VP                    UUu. uF  p\        V4       F  q3NK  	  K  	  upp# u uppi )zFMCP SamplingMessages -> OpenAI format (per-block duck-typed dispatch).)Úmessagesrg   )r˜   ÚparamsrY   Úms   &&  r   Ú_convert_messagesÚ!SamplingHandler._convert_messages�   s.   € à#Ÿ_š_ÔU™_�cÔ6OÐPSÖ6T°’Ñ6T‘™_ÒUÐUùÓUs   �0c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   ÚmessageÚcode)r   r?   )r   r|   s   "€r   r   r}   †   s   ø€ ÷ ;ñ ;™ð ;¡3ñ ;r   c                ór   € \         P                  '       g   \        V 4      h\         P                  ! WR7      # )z1Return ErrorData (MCP spec) or raise as fallback.)r¶   rµ   )r   Ú_MCP_SAMPLING_TYPESÚ	ExceptionÚ	ErrorData)rµ   r¶   s   &&r   Ú_errorÚSamplingHandler._error…   s*   € ô ×(×(Ð(Ü˜GÓ$Ð$Ü�Š DÔ:Ð:r   c                ó    <€ V ^8„  d   QhRS[ /# )r   rµ   r   )r   r|   s   "€r   r   r}   Œ   s   ø€ ÷ $ñ $™Sñ $r   c                ób   € V P                   R;;,          ^,          uu&   V P                  V4      # )z/Count an error and return the ErrorData for it.rŠ   )r—   r»   )r˜   rµ   s   &&r   Ú_failÚSamplingHandler._failŒ   s%   € à�‰�X× !Õ#ÓØ�{‰{˜7Ó#Ð#r   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   Úsuffixr   Nr   )r   r|   s   "€r   r   r}   ‘   s   ø€ ÷ |ñ |©cð |À$ñ |r   c                ó´   € \         P                  ! V P                  R V,           V P                  VP                  \        \        VRR4      RR4      .VO5!   R# )z6MCP server '%s' sampling response: model=%s, tokens=%sÚusageNÚtotal_tokensÚ?)r8   Úlogr”   ri   r†   r)   )r˜   ÚresponserÂ   rK   s   &&&*r   Ú_log_responseÚSamplingHandler._log_response‘   sO   € Ü�
Š
�4×#Ñ#Ð%]Ð`fÕ%fØ×#Ñ# X§^¡^´W¼WÀXÈwÐX\Ó=]Ð_mÐorÓ5sð	|Øvzö	|r   c                ó  € V P                   R;;,          ^,          uu&   V ;P                  ^,          un        V P                  ^ 8X  g   V P                  V P                  8”  dY   ^ V n        T P                  V P                  ^ 8X  d   RV P                   R24      # RV P                   RV P                   R24      # VP
                  P                   Uu. uFc  p\        P                  ! RVP                  VP                  P                  \        V P                  VP                  P                  4      R7      NKe  	  ppV P                  VR	\        V4      4       \        P                   ! R
WBP"                  RR7      # u upi )z`CreateMessageResultWithTools from a tool_calls response, under ``max_tool_rounds`` (0 disables).rŒ   z Tool loops disabled for server 'z' (max_tool_rounds=0)z%Tool loop limit exceeded for server 'z' (max z rounds)Útool_use)r2   rA   rD   rG   z, tool_calls=%dÚ	assistantrw   )rQ   r   r†   Ú
stopReason)r—   r–   r‚   r»   ri   rµ   rT   r   ÚToolUseContentrA   rC   rD   rp   rE   rÉ   rW   ÚCreateMessageResultWithToolsr†   )r˜   ÚchoicerÈ   Útcr_   s   &&&  r   Ú_build_tool_use_resultÚ&SamplingHandler._build_tool_use_result•   s_  € à�‰Ð%×&¨!Õ+Ó&Ø×Ò Õ"ÕØ×Ñ 1Ô$¨×(=Ñ(=À×@TÑ@TÔ(TØ$%ˆDÔ!Ø—;‘;Ø^b×^rÑ^rÐvwÔ^wÐ2°4×3CÑ3CÐ2DÐDYÐZóvð và<¸T×=MÑ=MÐ<NÈgÐVZ×VjÑVjÐUkÐksÐtóvð vð
 %+§N¡N×$=Ò$=ó?á$=˜bô  ×.Ò.°JÀ2Ç5Á5ÈrÏ{É{×O_ÑO_Ü5OÐPT×P`ÑP`Ðbd×bmÑbm×bwÑbwÓ5x÷zá$=ð 	ð ?ð 	×Ñ˜8Ð%6¼¸NÓ8KÔLÜ×1Ò1Ø n¿N¹NÐW`ôbð 	bùò	?s   ÃA)E?c                ó<  € ^ V n         V P                  V4       \        P                  ! RVP                  \        P
                  ! R\        VP                  P                  ;'       g    R4      R7      V P                  P                  VP                  R4      R7      # )zGCreateMessageResult from a normal text response (resets the tool loop).rÍ   r#   r    )r2   r#   rt   )rQ   r†   r   rÎ   )r–   rÉ   r   ÚCreateMessageResultr†   ÚTextContentr   rµ   r   Ú_STOP_REASON_MAPr�   Úfinish_reason)r˜   rÑ   rÈ   s   &&&r   Ú_build_text_resultÚ"SamplingHandler._build_text_result¥   sz   € à !ˆÔØ×Ñ˜8Ô$Ü×(Ò(Ø H§N¡NÜ×%Ò%¨6¼ÈÏÉ×H^ÑH^×HdÐHdÐbdÓ8eÔfØ×,Ñ,×0Ñ0°×1EÑ1EÀyÓQôSð 	Sr   c                ó    <€ V ^8„  d   QhRS[ /# r   ©r0   )r   r|   s   "€r   r   r}   ®   s   ø€ ÷ @ñ @¡ñ @r   c                ó°   € V P                   '       d+   \        P                  ! \        P                  ! 4       R7      M\        P                  ! 4       pRV RV/# )z5Kwargs to pass to ClientSession for sampling support.)ÚtoolsÚsampling_callbackÚsampling_capabilities)r„   r   ÚSamplingCapabilityÚSamplingToolsCapability)r˜   rá   s   & r   Úsession_kwargsÚSamplingHandler.session_kwargs®   sS   € ð ×'×'Ð'ô ×$Ò$¬5×+HÒ+HÓ+JÕKä×)Ò)Ó+ð 	ð
 $ TØ'Ð)>ð@ð 	@r   c                óH  € V P                  4       '       gZ   \        P                  RV P                  V P                  4       RV P                  RV P                   RV P                   R24      3# V P                  \        VRR4      4      ;'       g    RpV P                  '       dy   V'       dq   W P                  9  da   \        P                  R	V P                  V4       RV P                  R
V RV P                   RRP                  V P                  4       24      3# VR3# )z^Rate-limit + allowed_models gate. Returns ``(resolved_model, None)`` or ``(None, ErrorData)``.z5MCP server '%s' sampling rate limit exceeded (%d/min)Nz)Sampling rate limit exceeded for server 'z' (z requests/minute)Úmodel_preferencesÚmodelPreferencesr    z:MCP server '%s' requested model '%s' not in allowed_modelszModel 'z' not allowed for server 'z'. Allowed: z, )
r¡   r8   r9   ri   r   r¿   r«   r   r‡   r,   )r˜   r°   Úresolved_models   && r   Ú_admitÚSamplingHandler._admit¸   s  € à×%Ñ%×'Ò'Ü�N‰NÐRÐTX×TdÑTdÐfj×frÑfrÔsØ˜Ÿ™Ø;¸D×<LÑ<LÐ;MÈSÐQU×Q]ÑQ]ÐP^Ð^oÐpórð rð rà×,Ñ,¬Y°vÐ?RÐTfÓ-gÓh×nÐnÐlnˆØ××Ð§>°n×L_ÑL_Ô6_Ü�N‰NÐWØ×+Ñ+¨^ô=à˜Ÿ™ g¨nÐ-=ð >(Ø(,×(8Ñ(8Ð'9¸ÀdÇiÁiÐPT×PcÑPcÓFdÐEeð%gó hð hð hà˜tÐ#Ð#r   c                ó:   <€ V ^8„  d   QhRS[ RS[. S[3,          /# )r   ré   r   )r   r   Úobject)r   r|   s   "€r   r   r}   Æ   s(   ø€ ÷ uñ u±cð u¹hÀrÉ6ÀzÕ>Rñ ur   c                óJ  a aaaaaa	€ ^ RI Ho S P                  S4      o\        SRR4      pV'       d   SP	                  ^ RRRV/4       \        \        SRRS P                  4      S P                  4      o\        SR	R
4      pV'       dQ   V Uu. uFC  pRRRR\        VRR4      R\        VRR4      ;'       g    RR\        \        VRR4      4      //NKE  	  upMR
o	\        P                  S P                  RS P                  SS\        S4      4       VVVVVV V	3R l# u upi )z_Sampling params -> zero-arg sync ``call_llm`` thunk (run off-loop); server tools are forwarded.)Úcall_llmÚsystem_promptÚsystemPromptrQ   Úsystemr   Ú
max_tokensrv   rß   Nr2   rC   rD   r    ÚdescriptionÚ
parametersÚinput_schemaÚinputSchemazFMCP server '%s' sampling request: model=%s, max_tokens=%d, messages=%dc                  ó`   <€ S ! R S;'       g    RSS\        SRR4      SSP                  R7      # )ÚmcpNÚtemperature)Útaskr†   r¯   ró   rú   rß   r€   )r)   r€   )rï   ró   r¯   r°   ré   r˜   rß   s   €€€€€€€r   Ú<lambda>Ú1SamplingHandler._build_llm_call.<locals>.<lambda>Ö   s5   ø€ ‘x U°.×2HÐ2HÀDÐS[ÐhrÜ,3°F¸MÈ4Ó,PÐX]Ðgk×gsÑgsõur   )Úagent.auxiliary_clientrï   r²   r   ÚinsertÚminr�   r)   r   r8   rÇ   r”   ri   rW   )
r˜   r°   ré   rð   Úserver_toolsr    rï   ró   r¯   rß   s
   fff   @@@@r   Ú_build_llm_callÚSamplingHandler._build_llm_callÆ   s+  þ€ å3à×)Ñ)¨&Ó1ˆÜ! &¨/¸>ÓJˆßØ�O‰O˜A ¨°)¸]ÐKÔLÜœ 6¨<¸Àd×FYÑFYÓZÐ\`×\oÑ\oÓpˆ
Ü˜v w°Ó5ˆ÷ '3‘\ó#ñ "�ð ˜* jØ”G˜A˜v rÓ*¨M¼7À1ÀmÐUWÓ;X×;^Ð;^Ð\^ØÔ5´iÀÀ>ÐS`Ó6aÓbð3dó eñ "ò#ð 9=ð 	ô 	�
‰
�4×#Ñ#Ð%mØ×#Ñ# ^°ZÄÀXÃô	P÷uò uð 	uùò#s   Â)D Â9D c           	   ƒ  óÔ  "  € V P                  V4      w  r4Ve   V# V P                  W#4      p \        P                  ! \        P                  ! V4      V P
                  R7      G Rj  x€L
 p\        TRR4      '       g    T P                  RT P                   R24      # TP                  ^ ,          pT P                  R	;;,          ^,          uu&   \        \        TR
R4      R^ 4      p	T P                  R;;,          \        T	\         4      '       d   T	M^ ,          uu&   TP"                  R8X  d/   \        TP$                  RR4      '       d   T P'                  Y†4      # T P)                  Y†4      #  EL  \         d0    T P                  RT P
                   RT P                   R24      u # \         d1   pT P                  R\        \        T4      4       24      u Rp?# Rp?ii ; i5i)zUSDK ``SamplingFnT``: CreateMessageResult, CreateMessageResultWithTools, or ErrorData.N©r€   z"Sampling LLM call timed out after zs for server 'Ú'zSampling LLM call failed: Úchoicesz5LLM returned empty response (no choices) for server 'r‰   rÄ   rÅ   r‹   rT   )rê   r  ÚasyncioÚwait_forÚ	to_threadr€   ÚTimeoutErrorr¿   ri   r¹   r   r	   r)   r  r—   r*   r?   rÙ   rµ   rÓ   rÚ   )
r˜   Úcontextr°   ré   ÚerrÚ	sync_callrÈ   ÚexcrÑ   rÅ   s
   &&&       r   Ú__call__ÚSamplingHandler.__call__Ù   s¢  é € à"Ÿk™k¨&Ó1ÑˆØŠ?ØˆJØ×(Ñ(¨Ó@ˆ	ð	]Ü$×-Ò-¬g×.?Ò.?À	Ó.JÐTX×T`ÑT`Ôa×aˆHô �x ¨D×1Ò1Ø—:‘:Ð UÐVZ×VfÑVfÐUgÐghÐiÓjÐjØ×!Ñ! !Õ$ˆØ�‰�Z×  AÕ%Ó Üœw x°¸$Ó?ÀÐQRÓSˆØ�‰�]×#´zÀ,ÔPS×7TÒ7T¡|ÐZ[Õ[Ó#Ø×Ñ <Ô/´G¸F¿N¹NÈLÐZ^×4_Ò4_Ø×.Ñ.¨vÓ@Ð@Ø×&Ñ& vÓ8Ð8ò bøÜô 	tØ—:‘:Ð BÀ4Ç<Á<À.ÐP^Ð_c×_oÑ_oÐ^pÐpqÐrÓsÒsÜô 	]Ø—:‘:Ð :¼?Ì8ÐTWË=Ó;YÐ:ZÐ[Ó\Õ\ûð	]üsY   ‚+G(®9E2 Á'E/Á(E2 Á,DG(Å/E2 Å27G%Æ)G(Æ+G%Æ4G%Æ5%G ÇG%ÇG(Ç G%Ç%G()r•   r–   r‡   r”   r„   r   r�   r‚   r—   r�   ri   r€   N)éÿÿÿÿ)r    )r:   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rØ   r’   ÚDEBUGr“   ÚWARNINGr�   r™   r¡   r«   r²   Ústaticmethodr»   r¿   rÉ   rÓ   rÚ   rä   rê   r  r  Ú__static_attributes__Ú__classdictcell__©r|   s   @r   rr   rr   X   sÏ   ø‡ € ñZð
  	¨8°[À,ÐPYÐZÐØ˜GŸM™M¨6°7·<±<ÀÈGÏOÉOÐ\€K÷[ð [÷ ð ÷Xð X÷Vð Vð ÷;ñ ;ó ð;÷$ð $÷
|ò |òbò S÷@ð @ò$÷uð u÷&9ð 9r   rr   c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r   Úschemari   r   )r0   r   )r   s   "r   r   r   ñ   s!   € ÷ 
ñ 
¬tð 
Ä#ð 
Ì#ñ 
r   c                ó>  € \        V \        4      '       d   V P                  R4      MRp\        V\        4      '       d	   V'       g   RV R2# RV R2.pVP                  4        F¥  w  rE\        V\        4      '       d   TM/ p\	        VP                  RR4      ;'       g    R4      \	        VP                  R	R4      ;'       g    R4      r‡TP                  R
V 2V'       d   RV R2MR,           V'       d   RV 2MR,           4       K§  	  RP                  V4      # )z]Flat-object requested_schema -> readable field list so the user knows what they're approving.Ú
propertiesNz"Approval requested by MCP server 'z'.z Fields requested by MCP server 'z':r2   r    rô   z  - z (Ú)z: r!   )r*   r0   r�   r-   r   rV   r,   )	r  ri   ÚpropsÚlinesÚ
field_nameÚ
field_specÚspecÚ
field_typeÚ
field_descs	   &&       r   Ú"_format_elicitation_schema_summaryr)  ñ   s  € ä(2°6¼4×(@Ò(@ˆF�J‰J�|Ô$Àd€EÜ�eœT×"Ò"¯%Ø3°K°=ÀÐCÐCØ/°¨}¸BÐ?Ð@€EØ"'§+¡+¦-Ñˆ
Ü'¨
´D×9Ò9‰z¸rˆÜ!$ T§X¡X¨f°bÓ%9×%?Ð%?¸RÓ!@Ä#ÀdÇhÁhÈ}Ð^`ÓFa×FgÐFgÐegÓBh�JØ�‰�t˜J˜<Ð(Ç*¨b°°¸AÑ,>ÐRTÕU×nxÐ[]Ð^hÐ]iÑYjð  Aõ  Bö  	Cñ #0ð �9‰9�UÓÐr   c                   óŠ   a € ] tR t^þt o Rt^tRRRR/tR 3V 3R lR lltV 3R lR ltV 3R	 lR
 lt	V 3R lR lt
R tRtV tR# )ÚElicitationHandlerzõ``elicitation_callback`` for one MCP server. Form-mode routes through Hermes' approval system
(CLI, TUI, Telegram, ...); URL-mode is declined. Fail-closed: any timeout, exception or unexpected
state returns decline/cancel, never a silent accept.ÚacceptÚcancelc                 ó   € R # ©N© r0  r   r   rü   ÚElicitationHandler.<lambda>
  s   € Ér   c          	      óP   <€ V ^8„  d   QhRS[ RS[RS[. S[S[,          3,          /# )r   ri   r{   Úcall_context)r   r0   r   r   r   )r   r|   s   "€r   r   ÚElicitationHandler.__annotate__	  s7   ø€ ÷ 	Rñ 	R¡Cð 	R±ð 	RÙ'¨©H±WÕ,=Ð(=Õ>ñ	Rr   c                óˆ   € Wn         \        VP                  R R4      R\        4      V n        W0n        R^ R^ R^ R^ /V n        R# )r€   i,  r‰   ÚacceptedÚdeclinedrŠ   N)ri   r
   r�   rŽ   r€   Ú_call_contextr—   )r˜   ri   r{   r3  s   &&&&r   r™   ÚElicitationHandler.__init__	  sC   € à&Ôä$ V§Z¡Z°	¸3Ó%?ÀÄeÓLˆŒð *ÔØ" A z°1°jÀ!ÀXÈqÐQˆŽr   c                ó    <€ V ^8„  d   QhRS[ /# r   rÝ   )r   r|   s   "€r   r   r4    s   ø€ ÷ .ñ .¡ñ .r   c                ó
   € RV /# )z8Kwargs to pass to ClientSession for elicitation support.Úelicitation_callbackr0  )r˜   s   &r   rä   Ú!ElicitationHandler.session_kwargs  s   € à&¨Ð-Ð-r   c                ó&   <€ V ^8„  d   QhRS[ RS[ /# )r   ÚactionÚmetricr   )r   r|   s   "€r   r   r4    s   ø€ ÷ dñ d™cð d©3ñ dr   c                óŠ   € V P                   V;;,          ^,          uu&   \        P                  ! RRV/VR8X  d   R/ /B # / B # )zRCount *metric* and return ``ElicitResult(action)`` (accept carries empty content).r?  r,  r   r0  )r—   r   ÚElicitResult)r˜   r?  r@  s   &&&r   Ú_resultÚElicitationHandler._result  sD   € à�‰�V× Õ!ÓÜ×!Ò!Ñc¨ÐcÀvÐQYÔGY°YÀ°OÑcÐcÐ_aÑcÐcr   c                ó@   <€ V ^8„  d   QhRS[ RS[ RS[. S[ 3,          /# )r   rµ   rô   r   )r   r   )r   r|   s   "€r   r   r4    s0   ø€ ÷ 	Wñ 	W¡cð 	W¹ð 	WÁÈÉSÈÕ@Qñ 	Wr   c                óÀ   aa€ ^ RI Hp \        P                  ! W1V\	        V P
                  4      RV P                   2R7      oV P                  4       oSf   S# VV3R l# )z÷Sync consent call replaying the agent's contextvars snapshot when the owning task captured one
(the recv-loop task does NOT inherit them; gateway-platform detection needs them).
``Context.run`` runs a context once, so it is copied per elicitation.)Úrequest_elicitation_consentzmcp-elicitation/)Útimeout_secondsÚsurfacec                  óB   <€ S P                  4       P                  S4      # r/  )ÚcopyÚrun)ÚcapturedÚconsents   €€r   rü   Ú3ElicitationHandler._consent_thunk.<locals>.<lambda>&  s   ø€ ¸¿¹»×9LÑ9LÈWÔ9Ur   )Útools.approval_promptrG  Ú	functoolsÚpartialr?   r€   ri   r8  )r˜   rµ   rô   rG  rM  rN  s   &&& @@r   Ú_consent_thunkÚ!ElicitationHandler._consent_thunk  s\   ù€ õ 	Fä×#Ò#Ð$?È+Ü47¸¿¹Ó4EÐQaÐbf×brÑbrÐasÐOtôvˆà×%Ñ%Ó'ˆØ"Ò*ˆwÐVÕ1UÐVr   c              ƒ  óì  "  € V P                   R;;,          ^,          uu&   \        VRR4      R8X  d3   \        P                  RV P                  4       V P                  RR4      # \        VRR	4      ;'       g    R
V P                   R2p\        VRR4      ;'       g    \        VRR4      ;'       g    / p\        P                  RV P                  \        V4      R,          4        V P                  V\        W@P                  4      4      p \        P                  ! \        P                  ! T4      T P                  T P                  ,           R7      G Rj  x€L
 pT P
                  ! T P&                  P)                  TR4      !  #   \         d>   p\        P                  RT P                  T4       T P                  RR4      u Rp?# Rp?ii ; i Ly  \          dJ    \        P#                  RT P                  \%        T P                  4      4       T P                  RR4      u # \         d@   p\        P                  RT P                  TRR7       T P                  RR4      u Rp?# Rp?ii ; i5i)zQSDK elicitation callback (``ElicitationFnT``). Returns ElicitResult or ErrorData.r‰   ÚmodeÚformr7   z`MCP server '%s' requested URL-mode elicitation; declining (URL-mode elicitation not implemented)Údecliner7  rµ   r    zMCP server 'z' is requesting your approvalÚrequestedSchemaNÚrequested_schemaz'MCP server '%s' elicitation request: %s:NéÈ   Nz<MCP server '%s' elicitation: approval system unavailable: %srŠ   r  z/MCP server '%s' elicitation timed out after %dsr-  z&MCP server '%s' elicitation failed: %sT)Úexc_info)rX  r7  )r—   r)   r8   ry   ri   rC  r   rS  r)  r¹   Úerrorr  r	  r
  r€   Ú_OUTER_TIMEOUT_GRACE_SECONDSr  r9   r?   Ú_ANSWER_RESULTSr�   )r˜   r  r°   rµ   r  Úinvoke_consentr  Úanswers   &&&     r   r  ÚElicitationHandler.__call__(  s  é € à�‰�Z×  AÕ%Ó Ü�6˜6 6Ó*¨eÔ3Ü�K‰Kð AØBF×BRÑBRôTà—<‘< 	¨:Ó6Ð6ä˜& )¨RÓ0×rÐr°lÀ4×CSÑCSÐBTÐTqÐ4rˆô ˜Ð!2°DÓ9×lÐl¼WÀVÐM_ÐaeÓ=f×lÐlÐjlˆÜ�‰Ð=¸t×?OÑ?OÔQ`ÐahÓQiÐjnÕQoÔpð	5Ø!×0Ñ0°Ô:\Ð]c×euÑeuÓ:vÓwˆNð	5Ü"×+Ò+Ü×!Ò! .Ó1¸4¿<¹<È$×JkÑJkÕ;kôm÷ mˆFð �|Š|˜T×1Ñ1×5Ñ5°fÐ>UÓVÑWÐWøô ô 	5Ü�L‰LÐWÐY]×YiÑYiÐknÔoØ—<‘< 	¨8Ó4Õ4ûð	5úñmøäô 	4Ü�N‰NÐLÈd×N^ÑN^Ô`cÐdh×dpÑdpÓ`qÔrØ—<‘< ¨(Ó3Ò3Üô 	5Ü�L‰LÐAÀ4×CSÑCSÐUXÐcgˆLÔhØ—<‘< 	¨8Ó4Õ4ûð	5üs˜   ‚A7I4Á:$I4ÂI4Â44I4Ã)%F ÄA
G ÅGÅG Å*I4ÆGÆ2GÇGÇI4ÇGÇI4ÇG ÇAI1È&I4È(I1È1I1È24I,É&I1É'I4É,I1É1I4)r8  r—   ri   r€   N)r,  r6  )r-  rŠ   )r:   r  r  r  r  r^  r_  r™   rä   rC  rS  r  r  r  r  s   @r   r+  r+  þ   sc   ø‡ € ñ<ð $%Ð àÐ!7¸ÐCWÐX€Oñ BN÷	Rò 	R÷.ð .÷dð d÷
	Wð 	W÷Xð Xr   r+  )#r  r  rQ  rH   r’   rž   Úcontextvarsr   Útypingr   r   r   r   Úutilsr   Útools.mcp_tool_commonr   r	   r
   r   r   r   Útools.mcp_tool_schemar   Ú	getLoggerr8   r   r.   r<   rL   rg   rp   rr   r)  r+  r0  r   r   Ú<module>ri     s†   ðñHó Û Û Û Û Ý ß :Ó :Ý !ß f× fÝ =ð 
×	Ò	Ð+Ó	,€òBõKõõvõõ2	C÷V9ñ V9õr
÷EXó EXr   