+
    lHàj6�  ã                   óR  a€ R@ t‰0 t R t^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIt^ RIHtHtHtHtHtHt ]P&                  ! ]4      t^ RIHtHt ^ RIHtHtHt ^ RIHtHt ^ RI H!t! ^ RI"H#t# ^ RI$H%t% R	t&R
 R lt'R;s(;s);s*s+R;s,;s-s.R;s/s0Rs1Rt2]2s3 ]Ph                  Pk                  R4      RJs(\P        '       g   ]Po                  R4       Rt8] ^ k Rs9]
Pt                  ! 4       t;RAt<]=! 0 RBm]< U UUUu0 uF  w  rq! F  q3kK  	  K  	  upppp ,          4      t>R R lt?RCR R llt@R R ltARsBR tCR R ltDR]PŠ                  R]PŒ                  R]PŒ                  R]PŽ                  R]P�                  R]P�                  R]P�                  R ]P�                  /tI^<tJ^tK^tL^<tMR!tNR"tOR!tP^´^utQtRR#tSRDsT^2tURCR$ R% lltV ! R& R']#]!]%4      tW/ tX] ^k / tY] ^k / tZ] ^k ][! 4       t\] ^k / t]] ^k / t^] ^k / t_] ^k / t`] ^k / ta] ^	k ]PÄ                  ! R(RR)7      tc] ^
k / td] ^k / te] ^k R*R+utftg/ th] ^k / ti] ^k / tj] ^k ^R,utktl/ tm] ^k / tn] ^k / to] ^k R-R.utptqR/R/R0 R1 lltrR2 R3 lts][! 4       tt] ^k / tu] ^k Rtv] ^k Rtw] ^k ]
Pt                  ! 4       txRsy]
Pt                  ! 4       tz][! 4       t{] ^k R4 t|R5 R6 lt}R7 R8 lt~R9 R: ltR; R< lt€R= R> lt�]‚! 4       tƒ] ^k Rt„] ^k R"t…R?t†]‡! ]…]†,          4      ^,           tˆR#   ]6 d    Rs( EL`i ; iu upppp i )EaÍ  MCP (Model Context Protocol) client: connects to the ``mcp_servers`` configured in
~/.hermes/config.yaml (stdio, Streamable HTTP or SSE), discovers their tools and registers them
into the hermes tool registry. The ``mcp`` package is optional (no-op without it).

One background event loop (``_mcp_loop``) in a daemon thread runs each server as a long-lived
Task (``MCPServerTask``) so the transport's anyio cancel scopes enter and exit in one Task; every
``_servers``/loop mutation holds ``_lock``. This module keeps the SDK loader, ``MCPServerTask`` and
all shared state; the ``mcp_tool_*`` siblings read that state back through ``tools.mcp_tool`` at
call time (``_core``) and are imported directly by their callers.N)ÚAnyÚCallableÚDictÚListÚOptionalÚSet)Ú_DEFAULT_TOOL_TIMEOUTÚ	mcp_field)Ú_get_mcp_stderr_logÚ_npx_cached_binÚ_packaged_npx_entry)ÚElicitationHandlerÚSamplingHandler)ÚMCPServerTransportMixin)ÚMCPServerRunMixin)ÚMCPServerHealthMixing      (@c          
      ój   € V ^8„  d   QhR\         R\         R\        R\        \         \        3,          /# )é   Úserver_nameÚcommandÚargsÚreturn)ÚstrÚlistÚtuple)Úformats   "Ú3/home/ubuntu/.hermes/hermes-agent/tools/mcp_tool.pyÚ__annotate__r   '   s5   € ÷  ñ  ´ð  ¼cð  Ìð  ÔRWÔX[Ô]aÐXaÕRbñ  ó    c              ƒ  ó¬  "  € ^ RI Hp  \        P                  ! \        P                  ! W1V4      \
        R7      G Rj  x€L
 pV'       d   \        RV  RV 24      h\        P                  P                  V4      P                  4       P                  R4      '       d�   \        P                  ! \        W4      G Rj  x€L
 pV'       d'   \        P!                  RW^,          ^ ,          4       V# \#        V4      pV'       d   Vw  rx\        P!                  R	W4       Yxr!W3#  Lâ  \         d"    \        P                  RT \
        4       Rp ELi ; i L•5i)
am  OSV malware preflight (off-loop, wall-clock bound, fail-open on timeout), THEN the
cached-npx swap. The preflight must see the REAL command/args: anything that rewrites argv to a
wrapper or resolved binary has to happen after it, or the check silently inspects the wrapper
and becomes a no-op (``_infer_ecosystem`` keys off the command basename being npx/uvx/pipx).)Úcheck_package_for_malware©ÚtimeoutNuy   MCP server '%s': OSV malware preflight timed out after %.0fs (network slow/unreachable) â€” proceeding without the check.zMCP server 'z': Únpxz0MCP server '%s': running %s on the packaged nodezUMCP server '%s': using cached npx binary %s (skipping the resident `npm exec` parent))Útools.osv_checkr    ÚasyncioÚwait_forÚ	to_threadÚ_OSV_MALWARE_CHECK_TIMEOUT_SÚTimeoutErrorÚloggerÚwarningÚ
ValueErrorÚosÚpathÚbasenameÚlowerÚ
startswithr   Údebugr   )	r   r   r   r    Úmalware_errorÚpackagedÚcachedÚdirect_commandÚdirect_argss	   &&&      r   Ú_preflight_stdio_commandr8   '   s-  é € õ
 :ðÜ%×.Ò.Ü×ÒÐ7À$ÓGÔQmôo÷ oˆ÷ Ü˜<¨ }°C¸°ÐGÓHÐHô
 
‡w�w×Ñ˜Ó ×&Ñ&Ó(×3Ñ3°E×:Ò:ä ×*Ò*Ô+>ÀÓN×NˆßÜ�L‰LÐKÈ[ÐcdÕZeÐfgÕZhÔiØˆOÜ  Ó&ˆßØ*0Ñ'ˆNÜ�L‰Lð 7Ø8CôUà*�TØˆ=Ðñ3oøäô Ü�‰ð Và"Ô$@ô	Bð ‹ð	úñ OùsX   ‚EŠ4D# ¾D!¿D# ÁEÁAEÂEÂ<EÂ=EÃ	AEÄ!D# Ä#(EÅEÅEÅEFz
2025-03-26Úmcpú6mcp package not installed -- MCP tool support disabledc                ó$   € V ^8„  d   QhR\         /# ©r   Úname©r   )r   s   "r   r   r   x   s   € ÷ Kñ K”cñ Kr   c                 ó    € V \         9   d   \        4         \        4       V ,          # \	        R \
        : RV : 24      h  \         d     L$i ; i)zmodule z has no attribute )Ú_MCP_SDK_LAZY_SYMBOLSÚ_ensure_mcp_sdkÚglobalsÚKeyErrorÚAttributeErrorÚ__name__)r=   s   &r   Ú__getattr__rF   x   sQ   € ØÔ$Ô$ÜÔð	Ü“9˜T•?Ð"ô ˜7¤8¡,Ð.@ÀÁÐIÓ
JÐJøô ô 	Ùð	ús   —? ¿AÁAc                ó^   € V ^8„  d   QhR\         R\        R\        \         ,          R\        /# )r   ÚmoduleÚnamesÚmissing_msgr   )r   r   r   Úbool)r   s   "r   r   r   ‚   s-   € ÷ ñ œcð ¬%ð ¼hÄs½mð ÔW[ñ r   c                ó  €  \         P                  ! V 4      pV Uu/ uF  qD\        W44      bK  	  pp\        4       P                  T4       R# u upi   \        \        3 d"    T'       d   \
        P                  T4        R# i ; i)z£Bind ``names`` from SDK ``module`` into this module's globals; False (nothing bound,
optional debug line) when this SDK build lacks the module or any of the names.FT)	Ú	importlibÚimport_moduleÚgetattrÚImportErrorrD   r*   r2   rB   Úupdate)rH   rI   rJ   ÚmodÚnÚvaluess   &&&   r   Ú_import_sdk_namesrU   ‚   sr   € ðÜ×%Ò% fÓ-ˆÙ.3Ó4©e¨”W˜S“_Ò$©eˆÐ4ô
 ƒI×Ñ�VÔÙùò 5øÜœÐ(ô ßÜ�L‰L˜Ô%Úðús'   ‚A œA°A ÁA ÁBÁ+BÂBc                ó$   € V ^8„  d   QhR\         /# ©r   r   )rK   )r   s   "r   r   r   �   s   € ÷ -ñ -œñ -r   c            	     ó–  € \         '       g   R# \        '       g	   \        e   \         # \        ;_uu_ 4        \        '       g	   \        e   \         uuRRR4       # \	        RR4      '       d�   \	        RR4      '       d‹   Rs \	        RR4      s\	        RR4      s\
        ;'       g    \        s\	        RRR4       \	        R	R4      '       g   \        s	\	        R
RR4      '       g   Rs
\         U u. uF  p \	        V !  NK  	  up w  sssM\        P!                  R4       \         '       d"    \"        P$                  ! R4      P&                  s\-        R4      s\         '       d"   \.        '       g   \        P!                  R4       \-        R4      sRs\         uuRRR4       # u up i   \*         d     Lgi ; i  + '       g   i     R# ; i)zåImport the optional ``mcp`` SDK on first use; return availability. Idempotent and
thread-safe; honors a test-patched ``_MCP_AVAILABLE=False`` (no import) and pre-installed
mocks (``ClientSession`` already set means no re-import).FNr9   zmcp.client.stdioTzmcp.client.streamable_httpú	mcp.typeszRmcp.types.LATEST_PROTOCOL_VERSION not available -- using fallback protocol versionzmcp.client.sessionzmcp.client.ssezAmcp.client.sse.sse_client not available -- SSE transport disabledr:   Úmessage_handlerzKMCP SDK does not support message_handler -- dynamic tool discovery disabledÚlogging_callback)ÚClientSessionÚStdioServerParameters)Ústdio_client)Ústreamable_http_client)Ústreamablehttp_client)ÚLATEST_PROTOCOL_VERSION)ÚLATEST_HANDSHAKE_VERSION)Ú
sse_client)Ú_MCP_AVAILABLEÚ_MCP_SDK_IMPORT_ATTEMPTEDr\   Ú_MCP_SDK_IMPORT_LOCKrU   Ú_MCP_NEW_HTTPÚ_MCP_LEGACY_HTTPÚ_MCP_HTTP_AVAILABLEra   rb   rc   Ú_OPTIONAL_TYPE_FAMILIESÚ_MCP_SAMPLING_TYPESÚ_MCP_ELICITATION_TYPESÚ_MCP_NOTIFICATION_TYPESr*   r2   rM   rN   ÚMETHOD_NOT_FOUNDÚ_JSONRPC_METHOD_NOT_FOUNDÚ	ExceptionÚ_client_session_acceptsÚ_MCP_MESSAGE_HANDLER_SUPPORTEDÚ_MCP_LOGGING_CALLBACK_SUPPORTED)Úfamilys    r   rA   rA   �   s—  € ÷ ‹>Ùß Ó ¤MÒ$=ÜÐß	Ö	ß$Ó$¬Ò(AÜ!÷ 
Ò	ô ˜eÐ%O×PÒPÜ%Ð&8Ð:K×LÒLØ!ˆNô .Ð.JÐLgÓhˆMÜ0Ð1MÐOiÓjÐÜ"/×"CÐ"CÔ3CÐÜ˜kÐ+GØrôtä$Ð%9Ð;X×YÒYä+BÐ(Ü$Ð%5°Ø%h÷jò jà!�
å9PóTRÙ9P¨vÔ! 6Ô*Ñ9PñTRÑPÐÐ!7Ñ9Pô �L‰LÐQÔRß‹>ðÜ,5×,CÒ,CÀKÓ,P×,aÑ,aÐ)ô *AÐARÓ)SÐ&ß‹>×"@Ó"@Ü�L‰LÐfÔgÜ*AÐBTÓ*UÐ'Ø$(Ð!Ü÷C 
Ò	ùò&TRøô ô Ùðú÷5 
×	Ð	úsN   ·F7ÁBF7Ã0F!Ä(F7Ä, F&Å"F7Å/'F7Æ!F7Æ&F4Æ1F7Æ3F4Æ4F7Æ7G	c                 ó$  € \         e   \         #  ^ RIHp  \        V RR4      ;'       g    \        V RR4      s R F)  p\         e    \         #  \
        P                  ! V4      s K+  	  \         #   \         d    Rs  LDi ; i  \         d     KT  i ; i)ad  The httpx module the *installed* MCP SDK is built against (mcp 2.0 moved to ``httpx2``).
Every object crossing the SDK boundary (AsyncClient, OAuth Request, exception classes) must
come from the module the SDK itself imports or it fails at the transport layer. Resolved
from the SDK's transport module, else the newest present; ``None`` if neither imports.N)Ústreamable_httpÚhttpx2Úhttpx)rw   rx   )Ú_SDK_HTTPX_MODÚ
mcp.clientrv   rO   rP   rM   rN   )Ú
_transportÚfallbacks     r   Ú	sdk_httpxr}   Ã   sœ   € ô Ò!ÜÐðÝ<Ü  ¨X°tÓ<×bÐbÄÈ
ÐT[Ð]aÓ@bˆó (ˆÜÒ%Øô
 Ðð		Ü&×4Ò4°XÓ>ŠNñ	 (ô Ðøô ô ØŠðûô ô 	Úð	ús(   �A- ªA- ÁB Á-A=Á<A=Â BÂBc                ó0   € V ^8„  d   QhR\         R\        /# )r   Úkwargr   ©r   rK   )r   s   "r   r   r   Ú   s   € ÷ ñ ¤3ð ¬4ñ r   c                óž   € \         '       g   R#  V \        P                  ! \        4      P                  9   #   \
        \        3 d     R# i ; i)z}Whether this SDK's ``ClientSession.__init__`` takes ``kwarg`` (older SDKs lack
``message_handler`` and ``logging_callback``).F)rd   ÚinspectÚ	signaturer\   Ú
parametersÚ	TypeErrorr,   )r   s   &r   rq   rq   Ú   sD   € ÷ ‹>ÙðØœ×)Ò)¬-Ó8×CÑCÑCÐCøÜ”zÐ"ô Úðús   �&7 ·AÁAr2   ÚinfoÚnoticer+   ÚerrorÚcriticalÚalertÚ	emergencyg      .@i,  g      @c                óR   € V ^8„  d   QhR\         R\         R\        \        ,          /# )r   Ú
items_attrr   Úcache_meta_out)r   r   Údict)r   s   "r   r   r     s&   € ÷ .ñ .´sð .Ìð .Ü.6´t­nñ.r   c           	   ƒ  óÂ  a"  € . pRp\        \        4       EFy  pV'       g   V ! 4       G Rj  x€L
 pMÜ^ RIo SP                  ! V 4      p\        ;QJ d7    V3R lVP
                  P                  4        4       F  '       g   K   RM,	  RM(! V3R lVP
                  P                  4        4       4      p	V	'       dC   ^ RI	H
p
 \        V
RR4      pVe   V ! V! VR7      R7      G Rj  x€L
 pM#V ! VR7      G Rj  x€L
 pMV ! VR7      G Rj  x€L
 pVe+   V'       g#   R F  w  rÍp\        W}V4      pVf   K  WóV&   K  	  TP                  \        WqR4      ;'       g    . 4       \        VRR	4      p\        V\        4      '       d   V'       d   EKy   V# 	  \         P#                  R
W!\        \%        V4      4       V#  EL�  \        \        3 d    Rp	 EL!i ; i Lò Lâ LÒ5i)z¥Drain a paginated ``list_*`` call by following ``nextCursor``; ``cache_meta_out`` gets the
first page's SEP-2549 hints. Callers must hold the server's ``_rpc_lock``.Nc              3   óî   <"  € T Fj  pVP                   SP                  P                  8H  ;'       g;    VP                  R 8H  ;'       d$    VP                   SP                  P                  8g  x € Kl  	  R# 5i)ÚparamsN)ÚkindÚ	ParameterÚVAR_KEYWORDr=   ÚPOSITIONAL_ONLY)Ú.0Úpr‚   s   & €r   Ú	<genexpr>Ú&_paginate_full_list.<locals>.<genexpr>  sj   øé € ð %ñ ;˜ð —F‘F˜g×/Ñ/×;Ñ;Ñ;÷ \ð \ØŸ™ (Ñ*×ZÐZ¨q¯v©v¸×9JÑ9J×9ZÑ9ZÑ/Zô\ã:ùs   ƒ.A5²A5Á	,A5TFÚPaginatedRequestParams)Úcursor)r’   Únext_cursorÚ
nextCursorzHMCP server '%s': %s pagination exceeded %d pages; truncating at %d items))Úttl_msrŸ   ÚttlMs)Úcache_scoper¡   Ú
cacheScope)ÚrangeÚ_MCP_LIST_MAX_PAGESr‚   rƒ   Úanyr„   rT   r…   r,   Ú	mcp.typesÚtypesrO   r	   ÚextendÚ
isinstancer   r*   r+   Úlen)Úlist_methodr�   r   rŽ   Úitemsrœ   Ú_Úresultrƒ   Úaccepts_paramsÚ_typesÚ_params_clsÚkeyÚsnakeÚcamelÚhintr‚   s   &&&&            @r   Ú_paginate_full_listr¶     s¬  øé € ð €EØ€FÜÔ&×'ˆßÙ&›=×(‰Fó ð	Ø#×-Ò-¨kÓ:�	÷ "%£ô %ð '×1Ñ1×8Ñ8Ô:ó%§§¢ô %ð '×1Ñ1×8Ñ8Ô:ó%ó "�÷
 Ý*Ü% fÐ.FÈÓM�ØÒ*Ù#.±kÈÔ6PÔ#Q×Q‘Fá#.°fÔ#=×=‘Fá*°&Ô9×9�ØÒ%¯eÛ%rÑ!�˜EÜ  °Ó6�ØÔ#Ø*. 3Ó'ñ &sð 	�‰”W˜V°Ó6×<Ð<¸"Ô=Ü˜6 =°,Ó?ˆä˜&¤#×&Ò&¯fªfØð €LñQ (ôL 	�‰ÐaØ"Ô0CÄSÈÃZô	Qà€LòM )øô œzÐ*ô &Ø!%“ð&úñ Rá=á9ùs†   ƒ*G­F<®	G¸F?Á
7GÂ7GÂ<*GÃ&GÃ'GÃ8GÃ9GÄ
GÄGÄGÄ5%GÅ/GÆ-GÆ?GÇGÇGÇGÇGÇGc                   ó>   a € ] tR tRt o RtRtV 3R lR ltRtRtV t	R# )	ÚMCPServerTaski8  z×One MCP server connection in one long-lived asyncio Task (the transport's anyio cancel
scopes must enter/exit in the same Task). Run state machine, transport bring-up and
keepalive/liveness live in the three mixins.c                ó    <€ V ^8„  d   QhRS[ /# r<   r>   )r   Ú__classdict__s   "€r   r   ÚMCPServerTask.__annotate__i  s   ø€ ÷ U-ñ U-™Sñ U-r   c                ól  € Wn         R V n        \        V n        R V n        \
        P                  ! 4       V n        \
        P                  ! 4       V n        \
        P                  ! 4       V n	        . V n
        . V n        / V n        R V n        R V n        R V n        ^ V n        RV n        RV n        RV n        / V n        RV n        R V n        R V n        R V n        R V n        \5        4       V n        RV n        R V n        RV n        RV n        \5        4       V n         RV n!        \
        PD                  ! 4       V n#        \
        PD                  ! 4       V n$        \5        4       V n%        R V n&        \N        PP                  ! 4       ;V n)        V n*        R ;V n+        ;V n,        V n-        R V n.        / V n/        RV n0        R # )NFÚ )1r=   Úsessionr   Útool_timeoutÚ_taskr%   ÚEventÚ_readyÚ_shutdown_eventÚ_reconnect_eventÚ_toolsÚ_registered_tool_namesÚ_configÚ_errorÚ	_samplingÚ_elicitationÚ_reconnect_retriesÚ_session_provenÚ_ever_connectedÚ_sse_fallbackÚ_http_rejectionÚ_was_parkedÚ_park_reasonÚ_last_park_lineÚ
_auth_parkÚ_resolved_identityÚsetÚ_inflight_tasksÚ_reconnectingÚ_suspect_reasonÚ_teardown_raceÚ_permanent_grace_usedÚ_stdio_child_pidsÚ
_auth_typeÚLockÚ_refresh_lockÚ	_rpc_lockÚ_pending_refresh_tasksÚ_pending_call_contextÚtimeÚ	monotonicÚ_lifecycle_started_atÚ_last_tool_call_atÚ_idle_timeout_secondsÚ_max_lifetime_secondsÚ_recycled_reasonÚinitialize_resultÚ_list_cache_metaÚ_ping_unsupported)Úselfr=   s   &&r   Ú__init__ÚMCPServerTask.__init__i  sŠ  € ØŒ	Ø&*ˆŒÜ#8ˆÔØ-1ˆŒ
Ü—m’m“oˆŒÜ&Ÿ}š}›ˆÔä '§¢£ˆÔØˆŒØ13ˆÔ#ØˆŒØ+/ˆŒØ48ˆŒØ:>ˆÔØ'(ˆÔð &+ˆÔà%*ˆÔà#(ˆÔð &(ˆÔà!&ˆÔð ,0ˆÔØ.2ˆÔà+/ˆŒð 26ˆÔô
 %(£EˆÔØ#(ˆÔð /3ˆÔð %*ˆÔð ,1ˆÔ"ô
 ,/«5ˆÔØ!ˆŒÜ$Ÿ\š\›^ˆÔô !Ÿš›ˆŒÜ9<»ˆÔ#ð EIˆÔ"Ü?C¿~º~Ó?OÐOˆÔ" TÔ%<ØZ^Ð^ˆÔ"Ð^ TÔ%?À$ÔBWð 15ˆÔà&(ˆÔà',ˆÖ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è   rÞ   rÆ   rÔ   rß   rÉ   rÌ   rÃ   rÎ   rÛ   rØ   rÀ   rÙ   rÅ   rÐ   ré   r=   r¾   r¿   N))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Æ   rÔ   rß   rÉ   rÌ   rÃ   rÎ   rÛ   rØ   rÀ   rÙ   rÅ   rÐ   ré   r=   r¾   r¿   )zapplication/jsonztext/event-stream)
rE   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú	__slots__rí   Ú_MCP_CONTENT_TYPESÚ__static_attributes__Ú__classdictcell__)rº   s   @r   r¸   r¸   8  s(   ø‡ € ñ4ð*€I÷XU-ð U-ðr CÖr   r¸   Úmcp_connect_server_claim)Údefaultg      >@g     À‚@g      N@ÚfullÚ	untrustedÚapplicationc                ó4   € V ^8„  d   QhR\         R\        RR/# )r   r   rû   r   Nr€   )r   s   "r   r   r     s!   € ÷ 
:ñ 
:¤Cð 
:¼ð 
:È$ñ 
:r   c               ó(  € ^ RI Hp V! V 4      p\        P                  V^ 4      ^,           pV\        V&   T;'       d$    V^8H  ;'       g    \        P                  VR4      \        V&   V\
        8¼  d   \        P                  ! 4       \        V&   R# R# )a  Count a failure; at the threshold (re)stamp the breaker-open time. Keyed by the calling
scope's connection so one profile's failing server never opens another profile's breaker.
*application*: the call completed and the payload was an error (transport is fine).©Ú_resolve_server_keyFN)	Útools.mcp_tool_scoperÿ   Ú_server_error_countsÚgetÚ_server_errors_all_applicationÚ_CIRCUIT_BREAKER_THRESHOLDrâ   rã   Ú_server_breaker_opened_at)r   rû   rÿ   r²   rS   s   &$   r   Ú_bump_server_errorr    s‚   € õ 9Ù
˜kÓ
*€CÜ× Ñ   aÓ(¨1Õ,€AØ !Ô˜ÑØ*5×*tÐ*t¸1À¹6×;sÐ;sÔEc×EgÑEgÐhkÐmrÓEsÔ" 3Ñ'ØÔ&Ô&Ü)-¯ªÓ)9Ô! #Ó&ñ 'r   c                ó(   € V ^8„  d   QhR\         RR/# )r   r   r   Nr>   )r   s   "r   r   r   %  s   € ÷ 2ñ 2¤Sð 2¨Tñ 2r   c                óŒ   € ^ RI Hp V! V 4      p^ \        V&   \        P	                  VR4       \
        P	                  VR4       R# )z4Close the breaker on any unambiguous success signal.rþ   N)r   rÿ   r  r  Úpopr  )r   rÿ   r²   s   &  r   Ú_reset_server_errorr
  %  s:   € å8Ù
˜kÓ
*€CØ !Ô˜ÑÜ×!Ñ! # tÔ,Ü"×&Ñ& s¨DÖ1r   c            
     óà  € ^ RI p \        P                  P                  \        P                  P	                  \        P                  P                  \        4      4      R4      p V P                  \        P                  VR\        \        P                  ! ^ 4      4      .V P                  V P                  \        4       RRRR7      #   \         d    \         P#                  RRR7        R# i ; i)z=Start the shared supervisor, or None if it cannot be started.Nzmcp_death_supervisor.pyz--parent-pgidT)ÚstdinÚstdoutÚstderrÚstart_new_sessionÚ	close_fdsÚtextz/Could not start the MCP parent-death supervisor)Úexc_info)Ú
subprocessr-   r.   ÚjoinÚdirnameÚabspathÚ__file__ÚPopenÚsysÚ
executabler   ÚgetpgidÚPIPEÚDEVNULLr
   rp   r*   r2   )r  Ú
supervisors     r   Ú_spawn_death_supervisorr  K  s´   € ãÜ—‘—‘œbŸg™gŸo™o¬b¯g©g¯o©o¼hÓ.GÓHÐJcÓd€Jðð ×ÑÜ�^‰^˜Z¨¼#¼b¿jºjÈ»mÓ:LÐMØ—/‘/¨*×*<Ñ*<ÔEXÓEZØ"¨d¸ð  ó ?ð 	?øô ô ô 	�‰ÐFÐQUˆÔVÚð	ús   Á$A"C Ã"C-Ã,C-c                ó$   € V ^8„  d   QhR\         /# rW   )rÕ   )r   s   "r   r   r   ]  s   € ÷ ñ ¤cñ r   c                 ó.  € \        \        RR4      p V f   \        4       # \        4       p\        \        4       F  p V ! V^ 4       K  	  \        P                  V4       V#   \
         d    TP                  T4        KG  \        \        3 d     KZ  i ; i)aD  Forget supervised groups with no members left; return what went. Caller holds
``_death_supervisor_lock``. Signal 0 is a pure existence probe (cannot terminate anything).
It narrows, but cannot close, the window where a dead group's pgid is recycled before we
notice (residual-risk note in ``tools/mcp_death_supervisor.py``).ÚkillpgN)
rO   r-   rÕ   r   Ú_supervised_pgidsÚProcessLookupErrorÚaddÚPermissionErrorÚOSErrorÚdifference_update)r"  ÚstaleÚpgids      r   Ú_prune_dead_supervised_pgidsr+  ]  s†   € ô
 ”R˜ 4Ó(€FØ‚~Ü‹uˆÜ‹E€EÜÔ&Ö'ˆð	Ù�4˜ŽOñ (ô ×'Ñ'¨Ô.Ø€Løô "ô 	Ø�I‰I�d�OÜ¤Ð)ô 	ò ð	ús   ½	A!Á!BÂ BÂBÂBc                ó(   € V ^8„  d   QhR\         RR/# )r   Úverbr   Nr>   )r   s   "r   r   r   s  s   € ÷ A%ñ A%¤3ð A%°$ñ A%r   c                ó,  a € \         P                  R8w  d   R# V Uu0 uF  p\        V4      kK  	  ppV'       g   R# \        ;_uu_ 4        S R8X  d   \        P                  V4       M\        P                  V4       \        4       p\        pVe   VP                  4       eP   \        '       g    RRR4       R# \        4       pVsVf    RRR4       R# RP                  R \         4       4      pM:RP                  V 3R lV 4       4      pVRP                  R V 4       4      ,          p VP                  P                  V4       VP                  P                  4        \        '       g1    TP                  P%                  4         TP'                  ^R7       RsRRR4       R# u upi   \        \         \"        3 d    Rs RRR4       R# i ; i  \        \         \"        3 d     Lci ; i  \(         d     Lai ; i  + '       g   i     R# ; i)	zÁRegister or unregister process groups (``verb`` is ``"register"``/``"unregister"``) with
the shared supervisor. Failures are swallowed: losing the safety net must never fail a live
MCP session.ÚposixNÚregisterr½   c              3   ó.   "  € T F  pR V R2x € K  	  R# 5i)z	register Ú
N© ©r—   r*  s   & r   r™   Ú+_update_death_supervisor.<locals>.<genexpr>™  s   é € ÐQÑ?P°t 	¨$¨¨rÕ2Ó?Pùó   ‚c              3   ó4   <"  € T F  pS R V R2x € K  	  R# 5i)Ú r2  Nr3  )r—   r*  r-  s   & €r   r™   r5  ›  s   øé € ÐD¹V°T   a¨ v¨RÕ0»Vùs   ƒc              3   ó.   "  € T F  pR V R2x € K  	  R# 5i)zunregister r2  Nr3  r4  s   & r   r™   r5  œ  s   é € ÐHÁ%¸$ ¨T¨F°"Õ5Ã%ùr6  r!   )r-   r=   ÚintÚ_death_supervisor_lockr#  rQ   r(  r+  Ú_death_supervisorÚpollr  r  r  ÚwriteÚflushÚBrokenPipeErrorr,   r'  ÚcloseÚwaitrp   )r-  Úpgidsr*  Úwantedr)  ÚprocÚpayloads   f&     r   Ú_update_death_supervisorrG  s  sÉ  ø€ ô 
‡w�w�'ÔÙÙ$)Ó*¡E˜DŒc�$Ži¡E€FÐ*ßÙ÷ 
 Ö	Ø�:ÔÜ×$Ñ$ VÕ,ä×/Ñ/°Ô7ô -Ó.ˆä ˆØŠ<˜4Ÿ9™9›;Ò2ß$Ó$ð
 ÷' 
 Ñ	ô* +Ó,ˆDØ $ÐØŠ|Ø÷1 
 Ñ	ð6 —g‘gÑQÕ?PÓQÓQ‰Gà—g‘gÔD¹VÓDÓDˆGØ�r—w‘wÑHÁ%ÓHÓHÕHˆGð	Ø�J‰J×Ñ˜WÔ%Ø�J‰J×ÑÔ÷ !Ó ðØ—
‘
× Ñ Ô"ðØ—	‘	 !�	Ô$ð !%Ð÷m 
 Ñ	ùò +øôP  ¤¬WÐ5ô 	ð !%ÐØ÷O 
 Ñ	ðF	ûô $¤Z´Ð9ô Ùðûô
 ô Ùðú÷i 
 ×	Ð	ús‹   �F)ÁA$HÂ0HÂ;HÃAHÄ.5F.Å#HÅ0GÆG1ÆHÆ.GÇHÇGÇHÇG.Ç+HÇ-G.Ç.HÇ1G?Ç<HÇ>G?Ç?HÈH	c                ó:   € V ^8„  d   QhR\         \        ,          /# rW   ©r   r   )r   s   "r   r   r   ·  s   € ÷ (ñ (œX¤c�]ñ (r   c                 ó~   € ^ RI Hp  V ! 4       pVe   V# ^ RIHp V! 4       '       g   R# ^ RI Hp VP                  4       # )ue  Registry scope for MCP registrations: the session's own tool scope when one is bound, else a
profile overlay when this process serves profiles, else None. Under ``gateway.multiplex_profiles``
every turn runs scoped; a process that serves a routed profile through the HERMES_HOME override
(dashboard/desktop backend, per-profile cron ticker) is a multiplexer too, even with the flag
off â€” keying its connections by the bare name would hand one profile's credentialed connection
to every other served profile (#111151). Single-profile processes (no override, or an override
naming their own home) keep bare names.)Úcurrent_session_tool_scopeN)Úserves_routed_profile)Úregistry)Útools.registryrK  Úagent.secret_scoperL  rM  Úcurrent_scope_key)rK  Úsession_scoperL  rM  s       r   Ú_mcp_registry_scoperR  ·  s<   € õ :Ù.Ó0€MØÒ ØÐÝ8Ù ×"Ò"ÙÝ'Ø×%Ñ%Ó'Ð'r   c                ó:   € V ^8„  d   QhR\         \        ,          /# rW   rI  )r   s   "r   r   r   Ê  s   € ÷ 4ñ 4¤8¬C¥=ñ 4r   c                ór   € V \         9   d   \         V ,          # ^ RIHp V! V 4      ;'       g    \        4       # )z®Scope owning the connection under *key*'s tools: the one captured at adoption (teardown
runs on the MCP loop without the discovering profile's context), else the current one.)Ú
_key_scope)Ú_server_scope_keysr   rU  rR  )r²   rU  s   & r   Ú_server_registry_scoperW  Ê  s1   € ð Ô Ô Ü! #Õ&Ð&Ý/Ù�c‹?×3Ð3Ô1Ó3Ð3r   c                óF   € V ^8„  d   QhR\         \        ,          R\        /# )r   Úscoper   )r   r   rK   )r   s   "r   r   r   Ó  s   € ÷ :ñ :¬´#­ð :¼4ñ :r   c                ó€   € Vf   R# \         P                  V 4      V8H  ;'       g    V\        P                  V R4      9   # )zfWhether the live connection under *key* is visible from ``scope`` without changing its
teardown owner.Tr3  )rV  r  Ú_server_tool_scopes)r²   rY  s   &&r   Ú_server_visible_in_scoper\  Ó  sD   € ð ‚}ÙÜ×"Ñ" 3Ó'¨5Ñ0÷ 9ð 9ØÔ+×/Ñ/°°RÓ8Ñ8ð:r   g      à?c                ó~  € V ^8„  d   Qh/ ^ \         9   d
   \        ;R&   ^\         9   d   \        \        \        3,          ;R&   ^\         9   d&   \        \        \        \
        ,          3,          ;R&   ^\         9   d   \        \        \        3,          ;R&   ^\         9   d
   \        ;R&   ^\         9   d   \        \        \
        3,          ;R&   ^\         9   d   \        \
        \        3,          ;R&   ^\         9   d   \        \        \        3,          ;R&   ^\         9   d   \        \        \
        3,          ;R	&   ^	\         9   d&   \        \        \        \
        ,          3,          ;R
&   ^
\         9   d8   \        P                  \        \        \        .R3,          ,          ,          ;R&   ^\         9   d   \        \        \        3,          ;R&   ^\         9   d   \        \        \        3,          ;R&   ^\         9   d   \        \        \        3,          ;R&   ^\         9   d   \        \        \        3,          ;R&   ^\         9   d   \        \        \        3,          ;R&   ^\         9   d   \        \        \
        3,          ;R&   ^\         9   d,   \        \        \        \
        \        3,          3,          ;R&   ^\         9   d   \        \        \        3,          ;R&   ^\         9   d
   \        ;R&   ^\         9   d   \        \
        \
        3,          ;R&   ^\         9   d   \        \        P                  ,          ;R&   ^\         9   d   \        \         P"                  ,          ;R&   ^\         9   d
   \        ;R&   ^\         9   d
   \        ;R&   ^\         9   d   \        \
        ,          ;R&   # )r   r\   Ú_serversrV  r[  Ú_server_connectingÚ_server_connect_errorsÚ_orphaned_adoptersÚ_lazy_server_configsÚ_lazy_server_fingerprintsÚ_lazy_server_tool_namesNÚ_connect_server_claimÚ_server_connect_retry_afterÚ_server_connect_failuresr  r  r  Ú_server_trust_levelsÚ_tool_read_only_hintsÚ_server_cost_policiesÚ_parallel_safe_serversÚ_mcp_tool_server_namesÚ	_mcp_loopÚ_mcp_threadr#  Ú_LOCK_UNAVAILABLEÚ_MCP_DISCOVERY_LOCK_PATH)Ú__conditional_annotations__r   r�   r¸   r   r   rÕ   r   ÚcontextvarsÚ
ContextVarr   Úfloatr:  rK   r%   ÚAbstractEventLoopÚ	threadingÚThread)r   s   "r   r   r      s  € ÷ Eñ E÷| Ò ŒsÑ ñ}E÷T (Ò 'Œ$Œs”MÐ!Õ
"Ñ 'ñUE÷Z 2Ò 1”Dœœh¤s�mÐ+Õ,Ñ 1ñ[E÷` )Ò (”Tœ#œs˜(•^Ñ (ñaE÷b  Ò ”CÑ ñcE÷d ,Ò +œœS¤#˜X�Ñ +ñeE÷j (Ò '”Dœœc˜•NÑ 'ñkE÷r +Ò *”dœ3¤˜9•oÑ *ñsE÷t /Ò .œ4¤¤S �>Ñ .ñuE÷v 3Ò 2œœc¤4¬¥9˜nÕ-Ñ 2ñwE÷|Fò F”{×-Ñ-¬h´xÄÀÐQUÐ@UÕ7VÕ.WÕXñ Fñ}E÷` 3Ò 2œT¤#¤u *Õ-Ñ 2ñaE÷b .Ò -œ$œs¤C˜x�.Ñ -ñcE÷| *Ò )”dœ3¤˜8•nÑ )ñ}E÷~ 1Ò 0œ4¤¤U 
Õ+Ñ 0ñE÷D 5Ò 4¤¤S¬$ Y¥Ñ 4ñEE÷Z *Ò )”dœ3¤˜8•nÑ )ñ[E÷\ 7Ò 6”tœC¤¤c¬4 i¥Ð0Õ1Ñ 6ñ]E÷b +Ò *”tœC¤˜H•~Ñ *ñcE÷\ $Ò #œÑ #ñ]E÷` ,Ò +œœS¤#˜X�Ñ +ñaE÷h 6Ò 5Œ8”G×-Ñ-Õ.Ñ 5ñiE÷j /Ò .ŒX”i×&Ñ&Õ'Ñ .ñkE÷L Ò ”3Ñ ñME÷x "Ò !”3Ñ !ñyE÷z /Ò .œ(¤3�-Ñ .ò{Er   ))rY   )ÚCreateMessageResultÚCreateMessageResultWithToolsÚ	ErrorDataÚSamplingCapabilityÚSamplingToolsCapabilityÚTextContentÚToolUseContentz5MCP sampling types not available -- sampling disabled)rY   )ÚElicitRequestParamsÚElicitResultz;MCP elicitation types not available -- elicitation disabled)rY   )ÚServerNotificationÚToolListChangedNotificationÚPromptListChangedNotificationÚResourceListChangedNotificationzGMCP notification types not available -- dynamic tool discovery disabled>   r^   r]   r`   r_   )Ni§€ÿÿ)Šrq  rò   r%   rr  rM   Úimportlib.utilr‚   Úloggingr-   r  rv  râ   Útypingr   r   r   r   r   r   Ú	getLoggerrE   r*   Útools.mcp_tool_commonr   r	   Útools.mcp_tool_configr
   r   r   Útools.mcp_tool_samplingr   r   Útools.mcp_tool_transportr   Útools.mcp_tool_server_runr   Útools.mcp_tool_healthr   r(   r8   rd   ri   rg   rh   rk   rm   rl   rr   rs   rc   ra   rb   ÚutilÚ	find_specrp   r2   r\   re   rÝ   rf   rj   Ú	frozensetr@   rF   rU   rA   ry   r}   rq   ÚDEBUGÚINFOÚWARNINGÚERRORÚ_MCP_LOG_LEVEL_MAPÚ_DEFAULT_CONNECT_TIMEOUTÚ_MAX_RECONNECT_RETRIESÚ_MAX_INITIAL_CONNECT_RETRIESÚ_MAX_BACKOFF_SECONDSÚ_RECYCLED_RECONNECT_TIMEOUTÚ_PARKED_RETRY_INTERVALÚ_STDIO_RESPAWN_WAIT_SECÚ_DEFAULT_KEEPALIVE_INTERVALÚ_MIN_KEEPALIVE_INTERVALÚ_MCP_LOOP_DRAIN_TIMEOUTro   r¤   r¶   r¸   r^  rV  r[  rÕ   r_  r`  ra  rb  rc  rd  rs  re  rf  rg  Ú_CONNECT_RETRY_BASE_BACKOFF_SECÚ_CONNECT_RETRY_MAX_BACKOFF_SECr  r  r  r  Ú_CIRCUIT_BREAKER_COOLDOWN_SECrh  ri  rj  Ú_TRUST_FULLÚ_TRUST_UNTRUSTEDr  r
  rk  rl  rm  rn  Ú_lockr<  r;  r#  r  r+  rG  rR  rW  r\  Úobjectro  rp  Ú_MCP_DISCOVERY_PASS_MAX_SECÚ!_MCP_DISCOVERY_LOCK_RETRY_DELAY_Sr:  Ú_MCP_DISCOVERY_LOCK_MAX_RETRIESr   )Ú_modrI   Ú_msgrS   rq  s   0000@r   Ú<module>r­     sö  øðöEó Û Û Û Û Û Û 	Û 
Û Û ß ;× ;à	×	Ò	˜8Ó	$€ç Bß [Ñ [ß GÝ <Ý 7Ý 6ð
  $Ð õ ðJ KPÐ O€Ð OÐ$Ð O }Ð7GØINÐ NÐ Ð NÐ-Ð0FØCHÐ HÐ Ð!@Ø€
à&Ð ð 3Ð ðØ—^‘^×-Ñ-¨eÓ4¸DÐ@€N÷ ƒ~Ø
‡L�LÐIÔJà€Ó Ø!Ð Ø —~’~Ó'Ð ð
	Ð ñ "Ú`Ù"9ÖIÑ"9ÑˆT˜$Â5¸a‚qÁ5�qÑ"9ÔIõJóKÐ õ
K÷õ-ð` €òõ.ð ˆW�]‰]˜F G§L¡L°(¸G¿L¹LØˆw�‰ ¨¯©¸
ÀGÇMÁMØˆW�]‰]˜K¨¯©ð8Ð ð Ð ØÐ Ø Ð ØÐ Ø"Ð àÐ ð Ð ð 8;¸AÐ 4Ð Ð4àÐ ð #Ð àÐ ÷.ôfJCÐ%Ð'>Ð@Tô JCðh &(€Ó 'ð 02Ð Ó 1ð ')Ð Ó (Ù›%Ð Ó Ø)+Ð Ó +ð &(Ð Ó 'ð )+Ð Ó *Ø,.Ð Ó .Ø02Ð Ó 2ð ×ÒÐ5¸tÔDð ó Fð$ 13Ð Ó 2Ø+-Ð Ó -ØBFÈÐ ?Ð Ð!?ð (*Ð Ó )Ø.0Ð Ó 0ð 35Ð Ó 4Ø<=¸tÐ 9Ð Ð9ð (*Ð Ó )Ø46Ð Ó 6ð )+Ð Ó *à &¨Ð €Ðð
:À÷ 
:õ2ñ "›eÐ Ó #à)+Ð Ó +ð 26€	Ó 5Ø*.€Ó .Ø�ŠÓ€ð Ð Ø"ŸšÓ)Ð ñ ›Ð Ó òõ$õ,A%õH(õ&4õ:ñ  ›Ð Ó !Ø*.Ð Ó .ð "Ð Ø$'Ð !á"%ØÐ"CÕCó#EØGIõ#JÒ øð[ ô ØƒNðüõ4 Js   Â L ÄL!Ì	LÌL