o
    i                     @  s`  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 d d
lmZ d dlmZ d dl m!Z! d dl"m#Z#m$Z$ ernd dl%m&Z& g dZ'e(e)Z*ededZ+eddedZ,eG dd dee+e,f Z-edddG dd dee+ Z.d"dd Z/G d!d dZ0dS )#    )annotationsN)	AwaitableSequence)	dataclassfieldreplace)datetimetimezone)partial)TYPE_CHECKINGAnyGenericLiteralProtocolruntime_checkable)ReadResourceContents)TypeVar)Prompt)Resource)ResourceTemplate)Tool
ToolResult)Context)CallNext
MiddlewareMiddlewareContextT)defaultRT)	covariantr   c                   @  s   e Zd ZdddZdS )	r   contextMiddlewareContext[T]returnAwaitable[R]c                 C  s   d S N )selfr    r%   r%   j/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/fastmcp/server/middleware/middleware.py__call__,   s    zCallNext.__call__N)r    r!   r"   r#   )__name__
__module____qualname__r(   r%   r%   r%   r'   r   *   s    r   )kw_onlyfrozenc                   @  sj   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d dZ
ded< dddZdS )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                   C  s   t tjS r$   )r   nowr	   utcr%   r%   r%   r'   <lambda>=   s    zMiddlewareContext.<lambda>)default_factoryr   	timestampkwargsr   r"   r!   c                 K  s   t | fi |S r$   )r   )r&   r:   r%   r%   r'   copy?   s   zMiddlewareContext.copy)r:   r   r"   r!   )r)   r*   r+   __doc____annotations__r/   r1   r3   r4   r   r9   r;   r%   r%   r%   r'   r   /   s   
 r   
middlewarer   	call_nextCallNext[T, R]r"   c                   s   d fd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.r    r!   r"   r   c                   s   |  I d H S r$   r%   )r    r?   r>   r%   r'   wrapperJ   s   z(make_middleware_wrapper.<locals>.wrapperN)r    r!   r"   r   r%   )r>   r?   rB   r%   rA   r'   make_middleware_wrapperC   s   rC   c                   @  s   e Zd ZdZdAdd	ZdBddZdCddZdDddZdEddZdFddZ	dGd d!Z
dHd%d&ZdId*d+ZdJd/d0ZdKd4d5ZdLd9d:ZdMd>d?Zd@S )Nr   z9Base class for FastMCP middleware with dispatching hooks.r    r!   r?   CallNext[T, Any]r"   r   c                   s$   | j ||dI dH }||I dH S )z0Main entry point that orchestrates the pipeline.r?   N)_dispatch_handler)r&   r    r?   handler_chainr%   r%   r'   r(   S   s   zMiddleware.__call__MiddlewareContext[Any]CallNext[Any, Any]c                   s  |}|j  dkr t| j|d}nX dkr t| j|d}nK dkr, t| j|d}n> dkr9 t| j|d}n1 dkrF t| j|d}n$ dkrS t| j|d}n dkr` t| j|d}n
d	krjt| j	|d}|j
 d
kry t| j|d}n
dkrt| j|d}t| j|d}|S )z/Builds a chain of handlers for a given message.
initializerE   z
tools/callzresources/readzprompts/getz
tools/listzresources/listzresources/templates/listzprompts/listr2   notification)r4   r
   on_initializeon_call_toolon_read_resourceon_get_prompton_list_toolson_list_resourceson_list_resource_templateson_list_promptsr3   
on_requeston_notification
on_message)r&   r    r?   handlerr%   r%   r'   rF   _   s4   







zMiddleware._dispatch_handlerc                      ||I d H S r$   r%   r&   r    r?   r%   r%   r'   rV         zMiddleware.on_message'MiddlewareContext[mt.Request[Any, Any]]#CallNext[mt.Request[Any, Any], Any]c                   rX   r$   r%   rY   r%   r%   r'   rT      rZ   zMiddleware.on_request,MiddlewareContext[mt.Notification[Any, Any]](CallNext[mt.Notification[Any, Any], Any]c                   rX   r$   r%   rY   r%   r%   r'   rU      rZ   zMiddleware.on_notification'MiddlewareContext[mt.InitializeRequest]$CallNext[mt.InitializeRequest, None]Nonec                   rX   r$   r%   rY   r%   r%   r'   rL      rZ   zMiddleware.on_initialize+MiddlewareContext[mt.CallToolRequestParams].CallNext[mt.CallToolRequestParams, ToolResult]r   c                   rX   r$   r%   rY   r%   r%   r'   rM      rZ   zMiddleware.on_call_tool/MiddlewareContext[mt.ReadResourceRequestParams]FCallNext[mt.ReadResourceRequestParams, Sequence[ReadResourceContents]]Sequence[ReadResourceContents]c                   rX   r$   r%   rY   r%   r%   r'   rN         zMiddleware.on_read_resource,MiddlewareContext[mt.GetPromptRequestParams]7CallNext[mt.GetPromptRequestParams, mt.GetPromptResult]mt.GetPromptResultc                   rX   r$   r%   rY   r%   r%   r'   rO      rZ   zMiddleware.on_get_prompt&MiddlewareContext[mt.ListToolsRequest]-CallNext[mt.ListToolsRequest, Sequence[Tool]]Sequence[Tool]c                   rX   r$   r%   rY   r%   r%   r'   rP      rZ   zMiddleware.on_list_tools*MiddlewareContext[mt.ListResourcesRequest]5CallNext[mt.ListResourcesRequest, Sequence[Resource]]Sequence[Resource]c                   rX   r$   r%   rY   r%   r%   r'   rQ      rZ   zMiddleware.on_list_resources2MiddlewareContext[mt.ListResourceTemplatesRequest]ECallNext[mt.ListResourceTemplatesRequest, Sequence[ResourceTemplate]]Sequence[ResourceTemplate]c                   rX   r$   r%   rY   r%   r%   r'   rR      rg   z%Middleware.on_list_resource_templates(MiddlewareContext[mt.ListPromptsRequest]1CallNext[mt.ListPromptsRequest, Sequence[Prompt]]Sequence[Prompt]c                   rX   r$   r%   rY   r%   r%   r'   rS      rZ   zMiddleware.on_list_promptsN)r    r!   r?   rD   r"   r   )r    rH   r?   rI   r"   rI   )r    rH   r?   rI   r"   r   )r    r[   r?   r\   r"   r   )r    r]   r?   r^   r"   r   )r    r_   r?   r`   r"   ra   )r    rb   r?   rc   r"   r   )r    rd   r?   re   r"   rf   )r    rh   r?   ri   r"   rj   )r    rk   r?   rl   r"   rm   )r    rn   r?   ro   r"   rp   )r    rq   r?   rr   r"   rs   )r    rt   r?   ru   r"   rv   )r)   r*   r+   r<   r(   rF   rV   rT   rU   rL   rM   rN   rO   rP   rQ   rR   rS   r%   r%   r%   r'   r   P   s    


"





	


	)r>   r   r?   r@   r"   r@   )1
__future__r   loggingcollections.abcr   r   dataclassesr   r   r   r   r	   	functoolsr
   typingr   r   r   r   r   r   	mcp.typestypesmt mcp.server.lowlevel.helper_typesr   typing_extensionsr   fastmcp.prompts.promptr   fastmcp.resources.resourcer   fastmcp.resources.templater   fastmcp.tools.toolr   r   fastmcp.server.contextr   __all__	getLoggerr)   loggerr   r   r   r   rC   r   r%   r%   r%   r'   <module>   s4     	


