
    $j,                         d 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mZ ddlmZ dd	lmZ  G d
 de          ZdedefdZdedefdZdeeef         defdZdS )zLMiddleware that dereferences $ref in JSON schemas before sending to clients.    )Sequence)AnyN)override)ResourceTemplate)CallNext
MiddlewareMiddlewareContext)Tool)dereference_refsc                       e Zd ZdZedeej                 deej        e	e
         f         de	e
         fd            Zedeej                 deej        e	e         f         de	e         fd            ZdS )DereferenceRefsMiddlewarea.  Dereferences $ref in component schemas before sending to clients.

    Some MCP clients (e.g., VS Code Copilot) don't handle JSON Schema $ref
    properly. This middleware inlines all $ref definitions so schemas are
    self-contained. Enabled by default via ``FastMCP(dereference_schemas=True)``.
    context	call_nextreturnc                 @   K    ||           d {V }d |D             S )Nc                 ,    g | ]}t          |          S  )_dereference_tool).0tools     m/home/rurouni/.hermes/hermes-agent/venv/lib/python3.11/site-packages/fastmcp/server/middleware/dereference.py
<listcomp>z;DereferenceRefsMiddleware.on_list_tools.<locals>.<listcomp>   s!    :::D!$'':::    r   )selfr   r   toolss       r   on_list_toolsz'DereferenceRefsMiddleware.on_list_tools   s=        i((((((((::E::::r   c                 @   K    ||           d {V }d |D             S )Nc                 ,    g | ]}t          |          S r   )_dereference_resource_template)r   ts     r   r   zHDereferenceRefsMiddleware.on_list_resource_templates.<locals>.<listcomp>)   s!    EEEa.q11EEEr   r   )r   r   r   	templatess       r   on_list_resource_templatesz4DereferenceRefsMiddleware.on_list_resource_templates    s=       $)G,,,,,,,,	EE9EEEEr   N)__name__
__module____qualname____doc__r   r	   mtListToolsRequestr   r   r
   r   ListResourceTemplatesRequestr   r"   r   r   r   r   r      s          ;"2#67; B/$?@; 
$	; ; ; X; F"2#BCF +X6F-GG
F 
"	#F F F XF F Fr   r   r   r   c                    i }d| j         v st          | j                   rt          | j                   |d<   | j        4d| j        v st          | j                  rt          | j                  |d<   |r|                     |          S | S )z4Return a copy of the tool with dereferenced schemas.$defs
parametersNoutput_schemaupdate)r,   _has_refr   r-   
model_copy)r   updatess     r   r   r   ,   s    !#G$/!!Xdo%>%>! 0 A A%4%%%$2D)E)E%#3D4F#G#G  /g...Kr   templatec                     d| j         v st          | j                   r*|                     dt          | j                   i          S | S )z8Return a copy of the template with dereferenced schemas.r+   r,   r.   )r,   r0   r1   r   )r3   s    r   r   r   :   sX    (%%%(2E)F)F%"" "283F"G"GH # 
 
 	
 Or   schemac                    d| v rdS |                                  D ]k}t          |t                    rt          |          r dS t          |t                    r-|D ]*}t          |t                    rt          |          r  dS +ldS )z$Check if a schema contains any $ref.z$refTF)values
isinstancedictr0   list)r5   valueitems      r   r0   r0   C   s    t    eT"" 	x 	44eT"" 	     dD))  htnn  4445r   )r&   collections.abcr   typingr   	mcp.typestypesr'   typing_extensionsr   fastmcp.resources.templater   $fastmcp.server.middleware.middlewarer   r   r	   fastmcp.tools.baser
   fastmcp.utilities.json_schemar   r   r   r   r9   strboolr0   r   r   r   <module>rH      sS   R R $ $ $ $ $ $             & & & & & & 7 7 7 7 7 7 X X X X X X X X X X # # # # # # : : : : : :F F F F F
 F F F:D T    -= BR    T#s(^       r   