
    i                       d dl mZ d dlZd dlmZmZ d dlmZmZm	Z	 d dl
m
Z
mZ d dlmZ d dlmZmZmZmZmZmZ d dlmZ d dlmZ d d	lmZmZ d d
lmZmZ d dl m!Z! d dl"m#Z#m$Z$ erd dl%m&Z& g dZ' ejP                  e)      Z* ede      Z+ edde      Z,e G d dee+e,f                Z- edd       G d dee+                Z.	 	 	 	 	 	 ddZ/ G d d      Z0y)    )annotationsN)	AwaitableSequence)	dataclassfieldreplace)datetimetimezone)partial)TYPE_CHECKINGAnyGenericLiteralProtocolruntime_checkable)TypeVar)PromptPromptResult)ResourceResourceResult)ResourceTemplate)Tool
ToolResult)Context)CallNext
MiddlewareMiddlewareContextT)defaultRT)	covariantr   c                      e Zd ZddZy)r   c                     y N )selfcontexts     t/Users/bowang/.openclaw/workspace/ChatDev/.venv/lib/python3.12/site-packages/fastmcp/server/middleware/middleware.py__call__zCallNext.__call__+   s    s    N)r'   MiddlewareContext[T]returnzAwaitable[R])__name__
__module____qualname__r)   r%   r*   r(   r   r   )   s    Jr*   r   )kw_onlyfrozenc                  z    e Zd ZU dZded<   dZded<   dZded	<   d
Zded<   dZded<    e	d       Z
ded<   ddZy)r   z8
    Unified context for all middleware operations.
    r   messageNzContext | Nonefastmcp_contextclientzLiteral['client', 'server']sourcerequestz"Literal['request', 'notification']typez
str | Nonemethodc                 H    t        j                  t        j                        S r$   )r	   nowr
   utcr%   r*   r(   <lambda>zMiddlewareContext.<lambda><   s    X\\8Rr*   )default_factoryr	   	timestampc                    t        | fi |S r$   )r   )r&   kwargss     r(   copyzMiddlewareContext.copy>   s    t&v&&r*   )rA   r   r,   r+   )r-   r.   r/   __doc____annotations__r4   r6   r8   r9   r   r?   rB   r%   r*   r(   r   r   .   sO     J&*O^* +3F'2/8D
,8FJ0RSIxS'r*   r   r   c                     d fd}|S )zCreate a wrapper that applies a single middleware to a context. The
    closure bakes in the middleware and call_next function, so it can be
    passed to other functions that expect a call_next function.c                2   K    |        d {   S 7 wr$   r%   )r'   	call_next
middlewares    r(   wrapperz(make_middleware_wrapper.<locals>.wrapperI   s     3333s   )r'   r+   r,   r    r%   )rH   rG   rI   s   `` r(   make_middleware_wrapperrJ   B   s    4 Nr*   c                     e Zd ZdZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ		 	 	 	 	 	 ddZ
	 	 	 	 	 	 dd	Z	 	 	 	 	 	 dd
Z	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZy)r   z9Base class for FastMCP middleware with dispatching hooks.c                h   K   | j                  ||       d{   } ||       d{   S 7 7 w)z0Main entry point that orchestrates the pipeline.rG   N)_dispatch_handler)r&   r'   rG   handler_chains       r(   r)   zMiddleware.__call__R   sC      #44 5 
 
 #7+++	
 ,s   2.2022c                  K   |}|j                   xdk(  r t        | j                  |      }nxdk(  r t        | j                  |      }nxdk(  r t        | j                  |      }nxdk(  r t        | j
                  |      }nuxdk(  r t        | j                  |      }nWxdk(  r t        | j                  |      }n9xdk(  r t        | j                  |      }nd	k(  rt        | j                  |      }|j                  xd
k(  r t        | j                  |      }ndk(  rt        | j                  |      }t        | j                  |      }|S w)z/Builds a chain of handlers for a given message.
initializerM   z
tools/callzresources/readzprompts/getz
tools/listzresources/listzresources/templates/listzprompts/listr7   notification)r9   r   on_initializeon_call_toolon_read_resourceon_get_prompton_list_toolson_list_resourceson_list_resource_templateson_list_promptsr8   
on_requeston_notification
on_message)r&   r'   rG   handlers       r(   rN   zMiddleware._dispatch_handler^   s      nn!$"4"4H!$"3"3wG!!$"7"77K!$"4"4H!$"4"4H!!$"8"8GL+!$"A"AWU!$"6"6'Jll!$//WE!$"6"6'J$//W=s   EEc                .   K    ||       d {   S 7 wr$   r%   r&   r'   rG   s      r(   r]   zMiddleware.on_message        
 w''''   c                .   K    ||       d {   S 7 wr$   r%   r`   s      r(   r[   zMiddleware.on_request   ra   rb   c                .   K    ||       d {   S 7 wr$   r%   r`   s      r(   r\   zMiddleware.on_notification   ra   rb   c                .   K    ||       d {   S 7 wr$   r%   r`   s      r(   rS   zMiddleware.on_initialize   ra   rb   c                .   K    ||       d {   S 7 wr$   r%   r`   s      r(   rT   zMiddleware.on_call_tool   ra   rb   c                .   K    ||       d {   S 7 wr$   r%   r`   s      r(   rU   zMiddleware.on_read_resource   ra   rb   c                .   K    ||       d {   S 7 wr$   r%   r`   s      r(   rV   zMiddleware.on_get_prompt   ra   rb   c                .   K    ||       d {   S 7 wr$   r%   r`   s      r(   rW   zMiddleware.on_list_tools   ra   rb   c                .   K    ||       d {   S 7 wr$   r%   r`   s      r(   rX   zMiddleware.on_list_resources   ra   rb   c                .   K    ||       d {   S 7 wr$   r%   r`   s      r(   rY   z%Middleware.on_list_resource_templates   s      w''''rb   c                .   K    ||       d {   S 7 wr$   r%   r`   s      r(   rZ   zMiddleware.on_list_prompts   ra   rb   N)r'   r+   rG   zCallNext[T, Any]r,   r   )r'   MiddlewareContext[Any]rG   CallNext[Any, Any]r,   rn   )r'   rm   rG   rn   r,   r   )r'   z'MiddlewareContext[mt.Request[Any, Any]]rG   z#CallNext[mt.Request[Any, Any], Any]r,   r   )r'   z,MiddlewareContext[mt.Notification[Any, Any]]rG   z(CallNext[mt.Notification[Any, Any], Any]r,   r   )r'   z'MiddlewareContext[mt.InitializeRequest]rG   z:CallNext[mt.InitializeRequest, mt.InitializeResult | None]r,   zmt.InitializeResult | None)r'   z+MiddlewareContext[mt.CallToolRequestParams]rG   z.CallNext[mt.CallToolRequestParams, ToolResult]r,   r   )r'   z/MiddlewareContext[mt.ReadResourceRequestParams]rG   z6CallNext[mt.ReadResourceRequestParams, ResourceResult]r,   r   )r'   z,MiddlewareContext[mt.GetPromptRequestParams]rG   z1CallNext[mt.GetPromptRequestParams, PromptResult]r,   r   )r'   z&MiddlewareContext[mt.ListToolsRequest]rG   z-CallNext[mt.ListToolsRequest, Sequence[Tool]]r,   zSequence[Tool])r'   z*MiddlewareContext[mt.ListResourcesRequest]rG   z5CallNext[mt.ListResourcesRequest, Sequence[Resource]]r,   zSequence[Resource])r'   z2MiddlewareContext[mt.ListResourceTemplatesRequest]rG   zECallNext[mt.ListResourceTemplatesRequest, Sequence[ResourceTemplate]]r,   zSequence[ResourceTemplate])r'   z(MiddlewareContext[mt.ListPromptsRequest]rG   z1CallNext[mt.ListPromptsRequest, Sequence[Prompt]]r,   zSequence[Prompt])r-   r.   r/   rC   r)   rN   r]   r[   r\   rS   rT   rU   rV   rW   rX   rY   rZ   r%   r*   r(   r   r   O   s   C
,%
, $
, 
	
, - :L 	 D('( &( 
	((8( 7( 
	((=( <( 
	((8( N( 
$	((<( B( 
	((@( J( 
	((=( E( 
	((7( A( 
	((;( I( 
	((C(
( 
$((9( E( 
	(r*   )rH   r   rG   CallNext[T, R]r,   ro   )1
__future__r   loggingcollections.abcr   r   dataclassesr   r   r   r	   r
   	functoolsr   typingr   r   r   r   r   r   	mcp.typestypesmttyping_extensionsr   fastmcp.prompts.promptr   r   fastmcp.resources.resourcer   r   fastmcp.resources.templater   fastmcp.tools.toolr   r   fastmcp.server.contextr   __all__	getLoggerr-   loggerr   r    r   r   rJ   r   r%   r*   r(   <module>r      s    "  / 1 1 '    % 7 ? 7 /. 
		8	$ CC4- Kx1~ K K 4%'
 ' &'&

'5

~( ~(r*   