
    ChHP              
          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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.  \" S\"\-5      r/\" S\#\.5      r0\" S\!\,5      r1\" S\"\-5      r2\" S\S9r3\" S\!\,5      r4\5\6-  r7 " S S\5      r8 " S S\\2\04   5      r9 " S S\\/\1\0\2\44   5      r:g)    N)Callable)AsyncExitStack)	timedelta)TracebackType)AnyGenericProtocolTypeVar)MemoryObjectReceiveStreamMemoryObjectSendStream)	BaseModel)Self)McpError)MessageMetadataServerMessageMetadataSessionMessage)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.   r/   r0   s       L/home/james-whalen/.local/lib/python3.13/site-packages/mcp/shared/session.py__call__ProgressFnT.__call__1   s     ad   r4   )	__name__
__module____qualname____firstlineno____doc__floatstrr7   __static_attributes__r4       r6   r,   r,   .   s&    7dudUT\dCRVJd[_drB   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)RequestResponder4   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_metadatar1   c                     Xl         X l        X0l        X`l        X@l        SU l        [        R                  " 5       U l        XPl	        SU l
        g )NF)rF   rG   rH   rL   _session
_completedanyioCancelScope_cancel_scope_on_complete_entered)r5   rF   rG   rH   rI   rJ   rL   s          r6   __init__RequestResponder.__init__D   sD     %( 0"..0'rB   c                 |    SU l         [        R                  " 5       U l        U R                  R	                  5         U $ )zBEnter the context manager, enabling request cancellation tracking.T)rT   rP   rQ   rR   	__enter__r5   s    r6   rX   RequestResponder.__enter__]   s1    "..0$$&rB   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)rO   rS   rT   rR   RuntimeError__exit__r5   r[   r\   r]   s       r6   ra   RequestResponder.__exit__d   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rF   rd   N)rT   r`   rO   	cancelledrN   _send_responserF   )r5   rd   s     r6   respondRequestResponder.respondt   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.rf   r_   Tr   zRequest cancelledNcoder0   datarg   )	rT   r`   rR   cancelrO   rN   ri   rF   r   rY   s    r6   rp   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                  (       + $ r3   )rO   rh   rY   s    r6   	in_flightRequestResponder.in_flight   s    ??"94>>'99rB   c                 .    U R                   R                  $ r3   )rR   cancel_calledrY   s    r6   rh   RequestResponder.cancelled   s    !!///rB   )	rR   rO   rT   rS   rN   rL   rH   rF   rG   r3   )r1   rK   r1   N)r:   r;   r<   r=   r>   	RequestIdr    Metar'   r   r   r   rU   rX   typeBaseExceptionr   ra   r%   r   rj   rp   propertyboolrs   rh   rA   r4   rB   r6   rD   rD   4   s   8 -1 $((4/ !	
 OPRUUV * 
2C}%,C %C $	C
 
C kI&= $ &
 :4 : : 04 0 0rB   rD   c                      \ rS rSr% Sr\\\\\	-     4   \
S'   \\
S'   \\\\\4   4   \
S'   \\\4   \
S'    S,S\\\-     S	\\   S
\\   S\\   S\S-  SS4S jjrS\4S jrS\\   S-  S\S-  S\S-  S\S-  4S jr   S-S\S\\   S\S-  S\S\S-  S\4S jjr  S,S\!S\S-  SS4S jjr"S\S\\#-  SS4S jr$S.S  jr%S!\\\4   SS4S" jr&S\SS4S# jr'  S/S$\(\-  S%\)S&\)S-  S'\(S-  SS4
S( jjr*S)\\\4   \-  \-  SS4S* jr+S+r,g)0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_callbacksNread_streamwrite_streamreceive_request_typereceive_notification_typeread_timeout_secondsr1   c                     Xl         X l        0 U l        SU l        X0l        X@l        XPl        0 U l        0 U l        [        5       U l
        g )Nr   )_read_stream_write_streamr   r   _receive_request_type_receive_notification_type_session_read_timeout_secondsr   r   r   _exit_stack)r5   r   r   r   r   r   s         r6   rU   BaseSession.__init__   sL     ()!#%9"*C'-A*#% )+rB   c                    #    [         R                  " 5       U l        U R                  R                  5       I S h  vN   U R                  R	                  U R
                  5        U $  N+7fr3   )rP   create_task_group_task_group
__aenter__
start_soon_receive_looprY   s    r6   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r3   )r   acloser   cancel_scoperp   	__aexit__rb   s       r6   r   BaseSession.__aexit__   s`      %%''' 	%%,,.%%//6JJJ 	(
 Ks"   A1A-AA1(A/)A1/A1rH   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r0   r   z(Timed out while waiting for response to z	. Waited z	 seconds.rn   r0   r4   )r   rP   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   )r5   rH   r   r   r   r   rF   response_streamresponse_stream_readerrequest_datajsonrpc_requesttimeoutresponse_or_errors                r6   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   r4   )r   r   r   r   r   r   r   )r5   r   r   jsonrpc_notificationsession_messages        r6   send_notificationBaseSession.send_notification(  st       3  
 
%%t&t%T 
 )"#78Ug*>PQmq
   %%o666s   AA( A&!A(rF   rd   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   r0   Tr   r   )r   r   r   )	r   r   r   r   r   r   r   r   r   )r5   rF   rd   jsonrpc_errorr   jsonrpc_responses         r6   ri   BaseSession._send_response=  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 RR                  RU                  UR
                  R                  R                  S 5      nU(       a0  UR9                  UR
                  R                  5      I S h  vN   GM  T R	                  [W        SU 35      5      I S h  vN   GM   GN GN
 GN GN 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M  S nAff = f GN GN! [         a"  n[(        RN                  " SU5         S nAGNS nAff = f GN GN! [         a<  n[(        R*                  " SU SUR
                  R                   35         S nAGMN  S nAff = f GN GNl
 O[! [X        RZ                   a    [(        R,                  " S5         O/[         a#  n[(        R\                  " SU 35         S nAOS nAff = fT RR                  R_                  5        H`  u  p[1        [`        SS9n UR9                  [/        SXS95      I S h  vN    URc                  5       I S h  vN    MQ  ! [         a     M^  f = f   T RR                  Re                  5         O! T RR                  R_                  5        H`  u  p[1        [`        SS9n UR9                  [/        SXS95      I S h  vN    URc                  5       I S h  vN    MQ  ! [         a     M^  f = f   T RR                  Re                  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      $ r3   )r   r   rF   )rr5   s    r6   <lambda>+BaseSession._receive_loop.<locals>.<lambda>`  s    doo6I6I!,,X\6]rB   )rF   rG   rH   rI   rJ   rL   zFailed to validate request: z Message that failed validation: r   zInvalid request parameters rm   r   r   z)Progress callback raised an exception: %sz!Failed to validate notification: z. Message was: z.Received response with an unknown request ID: zRead stream closed by clientz%Unhandled exception in receive loop: zConnection closedr   )3r   r   r   	Exception_handle_incomingr0   rootr   r   r   r   rD   r   r   metar   r   rF   _received_requestrO   loggingwarningdebugr   r   r   r   r   r   r   r   r   	requestIdrp   r   r   r   r.   r/   r   _received_notificationr   r   r`   rP   ClosedResourceError	exceptionitemsr   r   clear)r5   r0   validated_request	respondereerror_responser   r   cancelled_idprogress_tokencallbackstreamr   r   s   `             r6   r   BaseSession._receive_loopK  s    j/%)%6%6 S'!'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 "&!7!7!;!;GOO<P<P<S<SUY!Z!"(++goo.B.B"CCC"&"7"7 ,/]^e]f-g h#  k S<" 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  Dc &7j ,, > <= 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 &&,,.Y  s  ^P0^](P3](\<VVP6
 V*V-P9
.0VC Q?P<
 )Q)P?
*Q.0VB-UT
UVAU6A'TT
T"U6U
7UU
UA,V V
'V(V
)V0^3](6V9V<Q?Q
T
	B,T	8S;9T	>VT
	
VUT
T?	T:	4U:T?	?UU
V	0V		V	V	VVVZ*W1Z	W1W,'Z,W11Z4-\<"Y>Y
?YY
Y\<
Y-	)\<,Y-	- \<.\'<[9
[[9
1[42[9
7\'9
\\'\ \''\<*](5\86](<]	]]	](^!]$"^(]?.]1/]?;^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.
Nr4   )r5   r   s     r6   r   BaseSession._received_request       r9   c                    #    g7f)zk
Can be overridden by subclasses to handle a notification without needing
to listen on the message stream.
Nr4   )r5   r   s     r6   r   "BaseSession._received_notification  r   r9   r   r.   r/   r0   c                    #    g7f)zP
Sends a progress notification for a request that is currently being
processed.
Nr4   )r5   r   r.   r/   r0   s        r6   send_progress_notification&BaseSession.send_progress_notification  r   r9   reqc                    #    g7f)zCA generic handler for incoming messages. Overwritten by subclasses.Nr4   )r5   r   s     r6   r   BaseSession._handle_incoming  s
     
 	r9   )r   r   r   r   r   r   r   r   r   r   r   r3   )NNNrx   )NN)-r:   r;   r<   r=   r>   dictry   r   r   r   __annotations__intrD   r'   r%   r,   r   r   r   r{   r*   r   rU   r   r   r|   r   r~   r   r$   r(   r   r   r&   r   r   ri   r   r   r   r@   r?   r   r   rA   r4   rB   r6   r   r      sl    I'=oP\>\']]^^Y 0+1M NNOOi455 26,.~	/IJ, -^<, #?3	,
 $((<#=, ($., 
,($ 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 ;o/b1A/S^B^1_ dh 9M RV  #"
c	
 
 t|	

 t
 

o{:;>RRU^^ 
rB   r   );r   collections.abcr   
contextlibr   datetimer   typesr   typingr   r   r	   r
   rP   r   anyio.streams.memoryr   r   pydanticr   typing_extensionsr   mcp.shared.exceptionsr   mcp.shared.messager   r   r   	mcp.typesr   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r*   r@   r  ry   r,   rD   r   r4   rB   r6   <module>r     s    $ %   2 2   R  " * U U    ( ~}mDm\<@/1CEWX +]MJ);57IK]^ #I	e( eh0w;< h0V}		}rB   