
    Vi5Z              
          S SK r S SKJr  S SKJr  S SKJr  S SKJr  S SK	J
r
JrJrJr  S SKrS SKrS SKJrJr  S SKJr  S S	KJr  S S
KJr  S SKJrJrJr  S SKJr  S SKJ r J!r!J"r"J#r#J$r$J%r%J&r&J'r'J(r(J)r)J*r*J+r+J,r,J-r-J.r.J/r/J0r0  \" S\$\/5      r1\" S\%\05      r2\" S\#\.5      r3\" S\$\/5      r4\" S\S9r5\" S\#\.5      r6\7\8-  r9 " S S\5      r: " S S\\4\24   5      r; " S S\\1\3\2\4\64   5      r<g)    N)Callable)AsyncExitStack)	timedelta)TracebackType)AnyGenericProtocolTypeVar)MemoryObjectReceiveStreamMemoryObjectSendStream)	BaseModel)Self)McpError)MessageMetadataServerMessageMetadataSessionMessage)ResponseRouter)CONNECTION_CLOSEDINVALID_PARAMSCancelledNotificationClientNotificationClientRequestClientResult	ErrorDataJSONRPCErrorJSONRPCMessageJSONRPCNotificationJSONRPCRequestJSONRPCResponseProgressNotificationRequestParamsServerNotificationServerRequestServerResultSendRequestTSendResultTSendNotificationTReceiveRequestTReceiveResultT)boundReceiveNotificationTc                   >    \ rS rSrSrS\S\S-  S\S-  SS4S jrS	rg)
ProgressFnT/   z-Protocol for progress notification callbacks.progresstotalNmessagereturnc                    #    g 7fN )selfr/   r0   r1   s       e/home/james-whalen/.local/share/pipx/venvs/semgrep/lib/python3.13/site-packages/mcp/shared/session.py__call__ProgressFnT.__call__2   s        r5   )	__name__
__module____qualname____firstlineno____doc__floatstrr8   __static_attributes__r5       r7   r-   r-   /   s2    7&+dl=@4Z	rC   r-   c                       \ rS rSrSr SS\S\R                  S-  S\SSS	\	S
/\
4   S\SS4S jjrSS jrS\\   S-  S\S-  S\S-  SS4S jrS\\-  SS4S jrSS jr\S\4S j5       r\S\4S j5       rSrg)RequestResponder7   a  Handles responding to MCP requests and manages request lifecycle.

This class MUST be used as a context manager to ensure proper cleanup and
cancellation handling:

Example:
    with request_responder as resp:
        await resp.respond(result)

The context manager ensures:
1. Proper cancellation scope setup and cleanup
2. Request completion tracking
3. Cleanup of in-flight requests
N
request_idrequest_metarequestsessionzBaseSession[
            SendRequestT,
            SendNotificationT,
            SendResultT,
            ReceiveRequestT,
            ReceiveNotificationT
        ]on_complete.RequestResponder[ReceiveRequestT, SendResultT]message_metadatar2   c                     Xl         X l        X0l        X`l        X@l        SU l        [        R                  " 5       U l        XPl	        SU l
        g )NF)rG   rH   rI   rM   _session
_completedanyioCancelScope_cancel_scope_on_complete_entered)r6   rG   rH   rI   rJ   rK   rM   s          r7   __init__RequestResponder.__init__G   sD     %( 0"..0'rC   c                 |    SU l         [        R                  " 5       U l        U R                  R	                  5         U $ )zBEnter the context manager, enabling request cancellation tracking.T)rU   rQ   rR   rS   	__enter__r6   s    r7   rY   RequestResponder.__enter__`   s1    "..0$$&rC   exc_typeexc_valexc_tbc                 P    U R                   (       a  U R                  U 5        SU l        U R                  (       d  [	        S5      eU R                  R                  XU5        g! SU l        U R                  (       d  [	        S5      eU R                  R                  XU5        f = f)zFExit the context manager, performing cleanup and notifying completion.FNo active cancel scopeN)rP   rT   rU   rS   RuntimeError__exit__r6   r\   r]   r^   s       r7   rb   RequestResponder.__exit__g   s    	C!!$'!DM%%"#;<<''6B "DM%%"#;<<''6Bs   "A$ $AB%responsec                   #    U R                   (       d  [        S5      eU R                  (       a   S5       eU R                  (       d4  SU l        U R                  R                  U R                  US9I Sh  vN   gg N7f)zSend a response for this request.

Must be called within a context manager block.
Raises:
    RuntimeError: If not used within a context manager
    AssertionError: If request was already responded to
2RequestResponder must be used as a context managerzRequest already responded toTrG   re   N)rU   ra   rP   	cancelledrO   _send_responserG   )r6   re   s     r7   respondRequestResponder.respondw   so      }}STT??B$BB"~~"DO--..??X /    s   A4A?6A=7A?c           	      ,  #    U R                   (       d  [        S5      eU R                  (       d  [        S5      eU R                  R                  5         SU l        U R
                  R                  U R                  [        SSSS9S9I Sh  vN   g N7f)	z-Cancel this request and mark it as completed.rg   r`   Tr   zRequest cancelledNcoder1   datarh   )	rU   ra   rS   cancelrP   rO   rj   rG   r   rZ   s    r7   rq   RequestResponder.cancel   s{     }}STT!!788!!#mm**A/BN + 
 	
 	
s   B
BBBc                 T    U R                   (       + =(       a    U R                  (       + $ r4   )rP   ri   rZ   s    r7   	in_flightRequestResponder.in_flight   s    ??"94>>'99rC   c                 .    U R                   R                  $ r4   )rS   cancel_calledrZ   s    r7   ri   RequestResponder.cancelled   s    !!///rC   )	rS   rP   rU   rT   rO   rM   rI   rG   rH   r4   )r2   rL   r2   N)r;   r<   r=   r>   r?   	RequestIdr!   Metar(   r   r   r   rV   rY   typeBaseExceptionr   rb   r&   r   rk   rq   propertyboolrt   ri   rB   r5   rC   r7   rE   rE   7   s   8 -1 $((4/ !	
 OPRUUV * 
2C}%,C %C $	C
 
C kI&= $ &
 :4 : : 04 0 0rC   rE   c                   P   \ rS rSr% Sr\\\\\	-     4   \
S'   \\
S'   \\\\\4   4   \
S'   \\\4   \
S'   \S   \
S'    S1S
\\\-     S\\   S\\   S\\   S\S	-  SS	4S jjrS\SS	4S jrS\4S jrS\\   S	-  S\S	-  S\S	-  S\S	-  4S jr   S2S\ S\\!   S\S	-  S\"S\S	-  S\!4S jjr# S1S\$S\S	-  SS	4S  jjr%S!\S"\\&-  SS	4S# jr'S3S$ jr(S%\SS	4S& jr)S'\\\4   SS	4S( jr*S\SS	4S) jr+  S4S*\,\-  S+\-S,\-S	-  S%\,S	-  SS	4
S- jjr.S.\\\4   \-  \-  SS	4S/ jr/S0r0g	)5BaseSession   z
Implements an MCP "session" on top of read/write streams, including features
like request/response linking, notifications, and progress.

This class is an async context manager that automatically starts processing
messages when entered.
_response_streams_request_id
_in_flight_progress_callbacksr   _response_routersNread_streamwrite_streamreceive_request_typereceive_notification_typeread_timeout_secondsr2   c                     Xl         X l        0 U l        SU l        X0l        X@l        XPl        0 U l        0 U l        / U l	        [        5       U l        g )Nr   )_read_stream_write_streamr   r   _receive_request_type_receive_notification_type_session_read_timeout_secondsr   r   r   r   _exit_stack)r6   r   r   r   r   r   s         r7   rV   BaseSession.__init__   sT     ()!#%9"*C'-A*#% !#)+rC   routerc                 :    U R                   R                  U5        g)a  
Register a response router to handle responses for non-standard requests.

Response routers are checked in order before falling back to the default
response stream mechanism. This is used by TaskResultHandler to route
responses for queued task requests back to their resolvers.

WARNING: This is an experimental API that may change without notice.

Args:
    router: A ResponseRouter implementation
N)r   append)r6   r   s     r7   add_response_routerBaseSession.add_response_router   s     	%%f-rC   c                    #    [         R                  " 5       U l        U R                  R                  5       I S h  vN   U R                  R	                  U R
                  5        U $  N+7fr4   )rQ   create_task_group_task_group
__aenter__
start_soon_receive_looprZ   s    r7   r   BaseSession.__aenter__   sR      224))+++##D$6$67 	,s   8A(A&,A(r\   r]   r^   c                    #    U R                   R                  5       I S h  vN   U R                  R                  R	                  5         U R                  R                  XU5      I S h  vN $  NL N7fr4   )r   acloser   cancel_scoperq   	__aexit__rc   s       r7   r   BaseSession.__aexit__   s`      %%''' 	%%,,.%%//6JJJ 	(
 Ks"   A1A-AA1(A/)A1/A1rI   result_typerequest_read_timeout_secondsmetadataprogress_callbackc                   #    U R                   nUS-   U l         [        R                  [        [        -     " S5      u  pxXpR
                  U'   UR                  SSSS9n	Ub4  SU	;  a  0 U	S'   SU	S   ;  a  0 U	S   S'   XiS   S   S'   XPR                  U'    [        SS	US
.U	D6n
U R                  R                  [        [        U
5      US95      I Sh  vN   SnUb  UR                  5       nO'U R                  b  U R                  R                  5       n [        R                  " U5         UR!                  5       I Sh  vN nSSS5        [3        W[        5      (       a  [%        UR4                  5      eUR7                  UR8                  5      U R
                  R;                  US5        U R                  R;                  US5        UR=                  5       I Sh  vN   UR=                  5       I Sh  vN   $  GN' N! , (       d  f       N= f! ["         aG    [%        ['        [(        R*                  R,                  SUR.                  R0                   SU S3S95      ef = f N Nq! U R
                  R;                  US5        U R                  R;                  US5        UR=                  5       I Sh  vN    UR=                  5       I Sh  vN    f = f7f)a  
Sends a request and wait for a response. Raises an McpError if the
response contains an error. If a request read timeout is provided, it
will take precedence over the session read timeout.

Do not use this method to emit notifications! Use send_notification()
instead.
   Tjsonby_aliasmodeexclude_noneNparams_metaprogressToken2.0)jsonrpcidr1   r   z(Timed out while waiting for response to z	. Waited z	 seconds.ro   r1   r5   )r   rQ   create_memory_object_streamr   r   r   
model_dumpr   r   r   sendr   r   total_secondsr   
fail_afterreceiveTimeoutErrorr   r   httpxcodesREQUEST_TIMEOUT	__class__r;   
isinstanceerrormodel_validateresultpopr   )r6   rI   r   r   r   r   rG   response_streamresponse_stream_readerrequest_datajsonrpc_requesttimeoutresponse_or_errors                r7   send_requestBaseSession.send_request   s      %%
%>272S2STcfrTr2stu2v/-<z* ))4fSW)X(|+)+X&l84424X&w/?I"7+O<3D$$Z0(	2,  O $$)).P_A`ks*tuuu G+76DDF33?<<JJL%%g..D.L.L.N(N% / +\::06677"112C2J2JK ""&&z48$$((T:!((***(//111C v )O /. 
"[[88F&0099:)&iy2	 	
( +1 ""&&z48$$((T:!((***(//111s   BK=I( G:AI( H ,G? G=G?H AI( AKI$K4I&5K:I( =G??
H	H I( H AI!!I( $K&K(AK4J75KKKKnotificationrelated_request_idc           
         #    [        S	SS0UR                  SSSS9D6n[        [        U5      U(       a	  [	        US9OSS9nU R
                  R                  U5      I Sh  vN   g N7f)
zS
Emits a notification, which is a one-way message that does not expect
a response.
r   r   Tr   r   )r   Nr   r5   )r   r   r   r   r   r   r   )r6   r   r   jsonrpc_notificationsession_messages        r7   send_notificationBaseSession.send_notification<  st       3  
 
%%t&t%T 
 )"#78Ug*>PQmq
   %%o666s   AA( A&!A(rG   re   c           
      \  #    [        U[        5      (       a@  [        SXS9n[        [	        U5      S9nU R
                  R                  U5      I S h  vN   g [        SUUR                  SSSS9S9n[        [	        U5      S9nU R
                  R                  U5      I S h  vN   g  NU N7f)Nr   r   r   r   r1   Tr   r   )r   r   r   )	r   r   r   r   r   r   r   r   r   )r6   rG   re   jsonrpc_errorr   jsonrpc_responses         r7   rj   BaseSession._send_responseQ  s     h	**(:VM,^M5RSO$$))/:::.**DvTX*Y 
 -^DT5UVO$$))/::: ; ;s%   AB,B(AB,"B*#B,*B,c                   ^ #    T R                    IS h  vN   T R                   IS h  vN    T R                     S h  vN n[        U[        5      (       a  T R	                  U5      I S h  vN   M9  [        UR
                  R                  [        5      (       Ga   T R                  R                  UR
                  R                  R                  SSSS95      n[        UR
                  R                  R                  UR                  R                  (       a   UR                  R                  R                  OS UT U 4S jUR                  S9nUT R                   UR"                  '   T R%                  U5      I S h  vN   UR&                  (       d  T R	                  U5      I S h  vN   GMv  GMy  [        UR
                  R                  [:        5      (       Ga   T R<                  R                  UR
                  R                  R                  SSSS95      n[        UR                  [>        5      (       a[  UR                  R                  R@                  nUT R                   ;   a(  T R                   U   RC                  5       I S h  vN   GMY  GM\  [        UR                  [D        5      (       a  UR                  R                  RF                  n	U	T RH                  ;   a|  T RH                  U	   n
 U
" UR                  R                  RJ                  UR                  R                  RL                  UR                  R                  R
                  5      I S h  vN   T RQ                  U5      I S h  vN   T R	                  U5      I S h  vN   GM\  T RS                  U5      I S h  vN   GMx   GN GN GNz GNO GN@ GN! [         a  n[(        R*                  " SU 35        [(        R,                  " SUR
                  R                   35        [/        SUR
                  R                  R                  [1        [2        S	S
S9S9n[5        [7        U5      S9nT R                  R9                  U5      I S h  vN     S nAGMM  S nAff = f GN GN6! [         a"  n[(        RN                  " SU5         S nAGN[S nAff = f GNO GN9! [         a<  n[(        R*                  " SU SUR
                  R                   35         S nAGM  S nAff = f GNi
 O[! [T        RV                   a    [(        R,                  " S5         O/[         a#  n[(        RX                  " SU 35         S nAOS nAff = fT RZ                  R]                  5        H`  u  p[1        [^        SS9n UR9                  [/        SXS95      I S h  vN    URa                  5       I S h  vN    MQ  ! [         a     M^  f = f   T RZ                  Rc                  5         O! T RZ                  R]                  5        H`  u  p[1        [^        SS9n UR9                  [/        SXS95      I S h  vN    URa                  5       I S h  vN    MQ  ! [         a     M^  f = f   T RZ                  Rc                  5         f = fS S S 5      IS h  vN    O! , IS h  vN  (       d  f       O= fS S S 5      IS h  vN    g ! , IS h  vN  (       d  f       g = f7f)NTr   r   c                 P   > TR                   R                  U R                  S 5      $ r4   )r   r   rG   )rr6   s    r7   <lambda>+BaseSession._receive_loop.<locals>.<lambda>t  s    doo6I6I!,,X\6]rC   )rG   rH   rI   rJ   rK   rM   zFailed to validate request: z Message that failed validation: r   zInvalid request parameters rn   r   r   z)Progress callback raised an exception: %sz!Failed to validate notification: z. Message was: zRead stream closed by clientz%Unhandled exception in receive loop: zConnection closedr   )2r   r   r   	Exception_handle_incomingr1   rootr   r   r   r   rE   r   r   metar   r   rG   _received_requestrP   loggingwarningdebugr   r   r   r   r   r   r   r   r   	requestIdrq   r    r   r   r/   r0   r   _received_notification_handle_responserQ   ClosedResourceError	exceptionr   itemsr   r   clear)r6   r1   validated_request	respondereerror_responser   r   cancelled_idprogress_tokencallbackr   streamr   s   `             r7   r   BaseSession._receive_loop_  s    d/%)%6%6 M='!'955"33G<<<#GOO$8$8.II"K040J0J0Y0Y ' 4 4 ? ?TZim ? n1- )9+2??+?+?+B+B#4#9#9#@#@ .?-C-C-J-J-O-O%)(9(,,]181A1A	)I ENDOOI,@,@A"&"8"8"CCC#,#7#7&*&;&;I&F F F $8& $GOO$8$8:MNN"+/+J+J+Y+Y ' 4 4 ? ?TZim ? n,L  *,*;*;=RSS/;/@/@/G/G/Q/Q#/4??#B*.//,*G*N*N*P$P$P $C $.l.?.?AU#V#V5A5F5F5M5M5[5[N (69Q9Q'Q373K3KN3[
).2:0<0A0A0H0H0Q0Q0<0A0A0H0H0N0N0<0A0A0H0H0P0P3. -. -. '+&A&A,&O O O&*&;&;L&I I I #33G<<<c M=<" D !G( K $OO.J1#,NO#MM,LW__MaMaLb*cd-9(-#*??#7#7#:#:&/)7,H)+'".N /=^TbEc.dO"&"4"4"9"9/"JJJJK4 %Q-.
 09 ).,3MM0[01-. -.).
 !P I( #OO"CA3oV]VeVeVjVjUk l  =[ &7^ ,, > <= O !!$I!"MNNO #'"8"8">">"@JB%+<FYZE$kk,u*YZZZ$mmo--$  #A &&,,. #'"8"8">">"@JB%+<FYZE$kk,u*YZZZ$mmo--$  #A &&,,.M  s  \N3\[(N6[(Z<TTN9
 T*T-N<
.0TC O?N?
 )O)O
*O.0TB-SR
STAS6A'RR
R"S6S
7SS
ST+T
,T3\6[(9T<T?OO
R	B,R	;Q><R	TR	TSR
S	 R=	7S=S	SS
T	0T	TT	TTX*U1X	U1U,'X,U11X4-Z<"W>W
?WW
WZ<
W-	)Z<,W-	- Z<.Z'<Y9
YY9
1Y42Y9
7Z'9
ZZ'Z Z''Z<*[(5Z86[(<[	[[	[(\![$"\([?.[1/[?;\r1   c                 l  #    UR                   R                  n[        U[        [        -  5      (       d  gUR
                  n[        U[        5      (       a6  U R                   H%  nUR                  X2R                  5      (       d  M%    g   O@UR                  =(       d    0 nU R                   H  nUR                  X55      (       d  M    g   U R                  R                  US5      nU(       a  UR                  U5      I Sh  vN   gU R                  [        SU 35      5      I Sh  vN   g N+ N7f)z
Handle an incoming response or error message.

Checks response routers first (e.g., for task-related responses),
then falls back to the normal response stream mechanism.
Nz.Received response with an unknown request ID: )r1   r   r   r   r   r   r   route_errorr   r   route_responser   r   r   r   ra   )r6   r1   r   response_idr   response_datar   s          r7   r   BaseSession._handle_response  s      ## $, >??!% dL))00%%k::>> 1
 -1KK,=2M00((DD 1
 ''++K>++d###''7efmen5o(pqqq $qs0   BD4=D4	;D4D0%D4*D2+D42D4r   c                    #    g7f)z
Can be overridden by subclasses to handle a request without needing to
listen on the message stream.

If the request is responded to within this method, it will not be
forwarded on to the message stream.
Nr5   )r6   r   s     r7   r   BaseSession._received_request       r:   c                    #    g7f)zk
Can be overridden by subclasses to handle a notification without needing
to listen on the message stream.
Nr5   )r6   r   s     r7   r   "BaseSession._received_notification  r  r:   r   r/   r0   c                    #    g7f)zP
Sends a progress notification for a request that is currently being
processed.
Nr5   )r6   r   r/   r0   r1   s        r7   send_progress_notification&BaseSession.send_progress_notification  r  r:   reqc                    #    g7f)zCA generic handler for incoming messages. Overwritten by subclasses.Nr5   )r6   r
  s     r7   r   BaseSession._handle_incoming  s
     
 	r:   )r   r   r   r   r   r   r   r   r   r   r   r   r4   )NNNry   )NN)1r;   r<   r=   r>   r?   dictrz   r   r   r   __annotations__intrE   r(   r&   r-   listr   r   r   r|   r+   r   rV   r   r   r   r   r}   r   r   r   r%   r)   r   r   r'   r   r   rj   r   r   r   r   rA   r@   r  r   rB   r5   rC   r7   r   r      s    I'=oP\>\']]^^Y 0+1M NNOOi455,-- 26,.~	/IJ, -^<, #?3	,
 $((<#=, ($., 
,*.. .T .$ K}%,K %K $	K
 
K" :>$(04J2J2 .)J2 '0$&6	J2
 "J2 '-J2 
J2^ 047'7 &,7 
	7*;y ;KR[D[ ;`d ;i/V$rn $r $rL1A/S^B^1_ dh 9M RV  #"
c	
 
 t|	

 t
 

o{:;>RRU^^ 
rC   r   )=r   collections.abcr   
contextlibr   datetimer   typesr   typingr   r   r	   r
   rQ   r   anyio.streams.memoryr   r   pydanticr   typing_extensionsr   mcp.shared.exceptionsr   mcp.shared.messager   r   r   mcp.shared.response_routerr   	mcp.typesr   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r+   rA   r  rz   r-   rE   r   r5   rC   r7   <module>r     s    $ %   2 2   R  " * U U 5    ( ~}mDm\<@/1CEWX +]MJ);57IK]^ #I	( h0w;< h0Vn		nrC   