
    $j                       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j(        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          Z0dS )!    )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dS )r   contextMiddlewareContext[T]returnAwaitable[R]c                    d S N )selfr#   s     l/home/rurouni/.hermes/hermes-agent/venv/lib/python3.11/site-packages/fastmcp/server/middleware/middleware.py__call__zCallNext.__call__+   s          N)r#   r$   r%   r&   )__name__
__module____qualname__r,   r)   r-   r+   r   r   )   s        JJJJJJr-   r   )kw_onlyfrozenc                      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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                 >    t          j        t          j                  S r(   )r	   nowr
   utcr)   r-   r+   <lambda>zMiddlewareContext.<lambda><   s    X\8R8R r-   )default_factoryr	   	timestampkwargsr   r%   r$   c                    t          | fi |S r(   )r   )r*   rA   s     r+   copyzMiddlewareContext.copy>   s    t&&v&&&r-   )rA   r   r%   r$   )r.   r/   r0   __doc____annotations__r5   r7   r9   r:   r   r@   rC   r)   r-   r+   r   r   .   s           JJJ&*O**** +3F2222/8D8888F%0R0RSSSISSSS' ' ' ' ' 'r-   r   
middlewarer   	call_nextCallNext[T, 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.r#   r$   r%   r    c                ,   K    |            d {V S r(   r)   )r#   rG   rF   s    r+   wrapperz(make_middleware_wrapper.<locals>.wrapperI   s+      Z333333333r-   )r#   r$   r%   r    r)   )rF   rG   rK   s   `` r+   make_middleware_wrapperrL   B   s.    4 4 4 4 4 4 4 Nr-   c                  z    e Zd ZdZd4dZd5dZd6dZd7dZd8dZd9dZ	d:dZ
d;dZd<d"Zd=d&Zd>d*Zd?d.Zd@d2Zd3S )Ar   z9Base class for FastMCP middleware with dispatching hooks.r#   r$   rG   CallNext[T, Any]r%   r   c                b   K   |                      ||           d{V } ||           d{V S )z0Main entry point that orchestrates the pipeline.rG   N)_dispatch_handler)r*   r#   rG   handler_chains       r+   r,   zMiddleware.__call__R   sj       #44 5 
 
 
 
 
 
 
 
 #]7+++++++++r-   MiddlewareContext[Any]CallNext[Any, Any]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 )z/Builds a chain of handlers for a given message.
initializerP   z
tools/callzresources/readzprompts/getz
tools/listzresources/listzresources/templates/listzprompts/listr8   notification)r:   r   on_initializeon_call_toolon_read_resourceon_get_prompton_list_toolson_list_resourceson_list_resource_templateson_list_promptsr9   
on_requeston_notification
on_message)r*   r#   rG   handlers       r+   rQ   zMiddleware._dispatch_handler^   s      n!$"4HHH!$"3wGGG!!!!!!$"77KKK!$"4HHH!$"4HHH!!!!!!$"8GLLL+++++!$"AWUUU!$"6'JJJl!$/WEEE!$"6'JJJ$/W===r-   c                (   K    ||           d {V S r(   r)   r*   r#   rG   s      r+   rb   zMiddleware.on_message   *      
 Yw'''''''''r-   'MiddlewareContext[mt.Request[Any, Any]]#CallNext[mt.Request[Any, Any], Any]c                (   K    ||           d {V S r(   r)   re   s      r+   r`   zMiddleware.on_request   rf   r-   ,MiddlewareContext[mt.Notification[Any, Any]](CallNext[mt.Notification[Any, Any], Any]c                (   K    ||           d {V S r(   r)   re   s      r+   ra   zMiddleware.on_notification   rf   r-   'MiddlewareContext[mt.InitializeRequest]:CallNext[mt.InitializeRequest, mt.InitializeResult | None]mt.InitializeResult | Nonec                (   K    ||           d {V S r(   r)   re   s      r+   rX   zMiddleware.on_initialize   rf   r-   +MiddlewareContext[mt.CallToolRequestParams].CallNext[mt.CallToolRequestParams, ToolResult]r   c                (   K    ||           d {V S r(   r)   re   s      r+   rY   zMiddleware.on_call_tool   rf   r-   /MiddlewareContext[mt.ReadResourceRequestParams]6CallNext[mt.ReadResourceRequestParams, ResourceResult]r   c                (   K    ||           d {V S r(   r)   re   s      r+   rZ   zMiddleware.on_read_resource   rf   r-   ,MiddlewareContext[mt.GetPromptRequestParams]1CallNext[mt.GetPromptRequestParams, PromptResult]r   c                (   K    ||           d {V S r(   r)   re   s      r+   r[   zMiddleware.on_get_prompt   rf   r-   &MiddlewareContext[mt.ListToolsRequest]-CallNext[mt.ListToolsRequest, Sequence[Tool]]Sequence[Tool]c                (   K    ||           d {V S r(   r)   re   s      r+   r\   zMiddleware.on_list_tools   rf   r-   *MiddlewareContext[mt.ListResourcesRequest]5CallNext[mt.ListResourcesRequest, Sequence[Resource]]Sequence[Resource]c                (   K    ||           d {V S r(   r)   re   s      r+   r]   zMiddleware.on_list_resources   rf   r-   2MiddlewareContext[mt.ListResourceTemplatesRequest]ECallNext[mt.ListResourceTemplatesRequest, Sequence[ResourceTemplate]]Sequence[ResourceTemplate]c                (   K    ||           d {V S r(   r)   re   s      r+   r^   z%Middleware.on_list_resource_templates   s*       Yw'''''''''r-   (MiddlewareContext[mt.ListPromptsRequest]1CallNext[mt.ListPromptsRequest, Sequence[Prompt]]Sequence[Prompt]c                (   K    ||           d {V S r(   r)   re   s      r+   r_   zMiddleware.on_list_prompts   rf   r-   N)r#   r$   rG   rN   r%   r   )r#   rS   rG   rT   r%   rT   )r#   rS   rG   rT   r%   r   )r#   rg   rG   rh   r%   r   )r#   rj   rG   rk   r%   r   )r#   rm   rG   rn   r%   ro   )r#   rq   rG   rr   r%   r   )r#   rt   rG   ru   r%   r   )r#   rw   rG   rx   r%   r   )r#   rz   rG   r{   r%   r|   )r#   r~   rG   r   r%   r   )r#   r   rG   r   r%   r   )r#   r   rG   r   r%   r   )r.   r/   r0   rD   r,   rQ   rb   r`   ra   rX   rY   rZ   r[   r\   r]   r^   r_   r)   r-   r+   r   r   O   s       CC
, 
, 
, 
,       D( ( ( (( ( ( (( ( ( (( ( ( (( ( ( (( ( ( (( ( ( (( ( ( (( ( ( (( ( ( (( ( ( ( ( (r-   )rF   r   rG   rH   r%   rH   )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.baser   r   fastmcp.resources.baser   r   fastmcp.resources.templater   fastmcp.tools.baser   r   fastmcp.server.contextr   __all__	getLoggerr.   loggerr   r    r   r   rL   r   r)   r-   r+   <module>r      s   " " " " " "  / / / / / / / / 1 1 1 1 1 1 1 1 1 1 ' ' ' ' ' ' ' '                            % % % % % % 5 5 5 5 5 5 5 5 ; ; ; ; ; ; ; ; 7 7 7 7 7 7 / / / / / / / / /......   
	8	$	$ GCGC4--- K K K K Kx1~ K K K 4%%%' ' ' ' '
 ' ' &%'&
 
 
 
~( ~( ~( ~( ~( ~( ~( ~( ~( ~(r-   