
    $jQ                    R   U d dl mZ d dlZd dlmZ d dlmZmZmZm	Z	m
Z
mZ d dlZd dl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mZmZ d d	lmZ d d
lm Z  d dl!m"Z" d dl#m$Z$m%Z% d dl&m'Z' d dl(m)Z) d dl*m+Z+m,Z,m-Z-m.Z.m/Z/ 	 d dl0m1Z2 d dl3m4Z5 dZ6n# e7$ r dZ6Y nw xY werd dl8m9Z9 d dl:m;Z; d dl<m=Z= d dl>m?Z?m@Z@  e)eA          ZBeegeCf         ZDdeEd<   d:dZF G d d e          ZG G d! d"e'          Z	 d;d<d&ZH	 d;d=d)ZId*ZJd;d>d.ZKd;d?d2ZLd@d4ZMd;dAd5ZN	 d;dBd7ZOd"d gZPdCd9ZQdS )D    )annotationsN)Callable)TYPE_CHECKING	AnnotatedAnyClassVar	TypeAliasoverload)validate_and_warn_tool_name)CallToolResultContentBlockIconTextContentToolAnnotationsToolExecution)Tool)	BaseModelFieldmodel_validator)SkipJsonSchema)FastMCPDeprecationWarning)	AuthCheck)
TaskConfigTaskMeta)FastMCPComponent)
get_logger)AudioFileImageNotSetNotSetT)	PrefabApp)	ComponentTF)Docket)	ExecutionFunctionTool)ArgTransformTransformedToolr	   ToolResultSerializerTypedatar   returnstrc                \    t          j        | t                                                    S )N)fallback)pydantic_coreto_jsonr-   decode)r+   s    Z/home/rurouni/.hermes/hermes-agent/venv/lib/python3.11/site-packages/fastmcp/tools/base.pydefault_serializerr4   A   s$     444;;===    c                       e Zd ZU  ed          Zded<    edd          Zded	<    edd
          Zded<   	 	 	 dd fdZddZ	 xZ
S )
ToolResultz*List of content blocks for the tool result)descriptionlist[ContentBlock]contentNz4Structured content matching the tool's output schema)defaultr8   dict[str, Any] | Nonestructured_contentz)Runtime metadata about the tool executionmetalist[ContentBlock] | Any | Nonedict[str, Any] | Any | Nonec                p   ||t          d          ||}t          |          }|t          rWt          |t                    rt          |          }n2t          |t                    rt          t	          |                    }	 t          j        |          }n5# t          j	        $ r#}t                              d|             d }~ww xY wt          |t                    s(t          dt          |          j         d|d          t                                          |||	           d S )
Nz5Either content or structured_content must be provided)resultview)valuezCould not serialize structured content. If this is unexpected, set your tool's output_schema to None to disable automatic serialization: z/structured_content must be a dict or None. Got z: zA. Tools should wrap non-dict values based on their output_schema.r:   r=   r>   )
ValueError_convert_to_content_HAS_PREFAB
isinstance
_PrefabApp_prefab_to_json_PrefabComponentr0   to_jsonable_pythonPydanticSerializationErrorloggererrordicttype__name__super__init__)selfr:   r=   r>   converted_contente	__class__s         r3   rV   zToolResult.__init__P   s    ?19TUUU_(G0C70S0S0S)  0*== )89K)L)L&& 24DEE )8"(:;;;* *&%2%E,& & &"" !;    d  ab  d  d   	
 0$77  V 233<V V@RV V V   	%:LSW 	 	
 	
 	
 	
 	
s   
B   C/CCr,   Olist[ContentBlock] | tuple[list[ContentBlock], dict[str, Any]] | CallToolResultc                    | j         !t          | j        | j        | j                   S | j        | j        S | j        | j        fS )N)structuredContentr:   _meta)r>   r   r=   r:   rW   s    r3   to_mcp_resultzToolResult.to_mcp_result|   sV    
 9 !"&"9i   
 "*<|T444r5   )NNN)r:   r?   r=   r@   r>   r<   )r,   r[   )rT   
__module____qualname__r   r:   __annotations__r=   r>   rV   r`   __classcell__rZ   s   @r3   r7   r7   E   s         "'%@# # #G     16"X1 1 1     #(%"M# # #D     48:>&*	*
 *
 *
 *
 *
 *
 *
X5 5 5 5 5 5 5 5r5   r7   c                      e Zd ZU dZdZded<   ded<   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<   dZded<    ed          dZd            Zd[dZeddddddddeddddddd\d5            Zd]d9Zd^d;Ze	 d_d`d>            ZedadA            Z	 d_dbdDZdcdGZdddHdddMZedeedeededddN
dedW            ZedfdX            Zdg fdYZ xZS )hr   z Internal tool registration info.toolzClassVar[str]
KEY_PREFIXzOAnnotated[dict[str, Any], Field(description='JSON schema for tool parameters')]
parametersNzRAnnotated[dict[str, Any] | None, Field(description='JSON schema for tool output')]output_schemaz]Annotated[ToolAnnotations | None, Field(description='Additional annotations about the tool')]r   z]Annotated[ToolExecution | None, Field(description='Task execution configuration (SEP-1686)')]	executionzAnnotated[SkipJsonSchema[ToolResultSerializerType | None], Field(description='Deprecated. Return ToolResult from your tools for full control over serialization.')]
serializerzAnnotated[SkipJsonSchema[AuthCheck | list[AuthCheck] | None], Field(description='Authorization checks for this tool', exclude=True)]authzkAnnotated[float | None, Field(description='Execution timeout in seconds. If None, no timeout is applied.')]timeoutafter)moder,   c                .    t          | j                   | S )z<Validate tool name according to MCP specification (SEP-986).)r   namer_   s    r3   _validate_tool_namezTool._validate_tool_name   s     	$DI...r5   	overridesr   MCPToolc                   d}| j         r| j         }n| j        r| j        j         r| j        j         }t          |                    d| j                  |                    d|          |                    d| j                  |                    d| j                  |                    d| j                  |                    d| j                  |                    d| j                  |                    d	| j	                  |                    d
| 
                                          	  	        }| j                                        r*d	|vr&| j	        st          | j        j                  |_	        |S )z(Convert the FastMCP tool to an MCP tool.Nrr   titler8   inputSchemaoutputSchemaiconsr   rk   r^   )	rr   rw   r8   rx   ry   rz   r   rk   r^   )taskSupport)rw   r   ru   getrr   r8   ri   rj   rz   rk   get_metatask_configsupports_tasksr   rp   )rW   rt   rw   mcp_tools       r3   to_mcp_toolzTool.to_mcp_tool   sY   
 : 	+JEE 	+$"2"8 	+$*Evty11--//!mT5EFF!mT_EE"~t7IJJ--44!mT5EFFmmK@@-- 
 
 
 ++--	R9,,N - "/4;K;P!Q!Q!QHr5   )rr   versionrw   r8   rz   tagsr   exclude_argsrj   rl   r>   taskrn   rm   fnCallable[..., Any]rr   
str | Noner   str | int | Nonerw   r8   rz   list[Icon] | Noner   set[str] | NoneToolAnnotations | Noner   list[str] | Nonedict[str, Any] | NotSetT | NoneToolResultSerializerType | Noner>   r<   r   bool | TaskConfig | Nonefloat | None"AuthCheck | list[AuthCheck] | Noner'   c               L    ddl m}  |j        |||||||||	|
|||||          S )zCreate a Tool from a function.r   r&   )r   rr   r   rw   r8   rz   r   r   r   rj   rl   r>   r   rn   rm   )fastmcp.tools.function_toolr'   from_function)clsr   rr   r   rw   r8   rz   r   r   r   rj   rl   r>   r   rn   rm   r'   s                    r3   r   zTool.from_function   s_    * 	=<<<<<)|)##%'!
 
 
 	
r5   	argumentsdict[str, Any]r7   c                $   K   t          d          )a"  
        Run the tool with arguments.

        This method is not implemented in the base Tool class and must be
        implemented by subclasses.

        `run()` can EITHER return a list of ContentBlocks, or a tuple of
        (list of ContentBlocks, dict of structured output).
        zSubclasses must implement run())NotImplementedError)rW   r   s     r3   runzTool.run  s       ""CDDDr5   	raw_valuec                   t          |t                    r|S t          rtt          |t                    rt	          |t          |                     S t          |t                    r,t	          t          |          t          |                     S t          || j                  }t          |t                    rt          |          S | j
        st          |t          t          z  t          z  t          z            s6t          |t          t           z            r)t#          d |D                       rt          |          S 	 t%          j        |          }n,# t$          j        t*          f$ r t          |          cY S w xY w| j
        6t          |t,                    rt          ||          S t          |          S | j
                            d          }t          ||rd	|in||rd
ddiind          S )zConvert a raw result to ToolResult.

        Handles ToolResult passthrough and converts raw values using the tool's
        attributes (serializer, output_schema) for proper conversion.
        fastmcp_app_namerC   )rl   )r:   Nc              3  @   K   | ]}t          |t                    V  d S NrJ   r   .0items     r3   	<genexpr>z&Tool.convert_result.<locals>.<genexpr>/  s,      MM4
466MMMMMMr5   r:   r=   zx-fastmcp-wrap-resultrB   fastmcpwrap_resultTrF   )rJ   r7   rI   rK   _prefab_to_tool_result_get_fastmcp_app_namerM   rH   rl   bytesrj   r   r   r   r   listtupleanyr0   rN   rO   UnicodeDecodeErrorrR   r|   )rW   r   r:   
structuredr   s        r3   convert_resultzTool.convert_result  sC    i,, 	 
	)Z00 -%:4%@%@    )%566 -I...%:4%@%@   
 &iDOLLL i'' 	/g.... %y,"6">"EFF & 9dUl33 & MM9MMMMM	 & g....	/&9)DDJJ8:LM 	/ 	/ 	/g......	/ %*d++ R!'jQQQQg.... (,,-DEE9DT*55*7BL)mT233
 
 
 	
s   	E &FF	task_metaNonec                
   K   d S r    rW   r   r   s      r3   _runz	Tool._runG  s      
 Sr5   r   mcp.types.CreateTaskResultc                
   K   d S r   r   r   s      r3   r   z	Tool._runN  s      
 &)Sr5   TaskMeta | None'ToolResult | mcp.types.CreateTaskResultc                z   K   ddl m}  || d||           d{V }|r|S |                     |           d{V S )a-  Server entry point that handles task routing.

        This allows ANY Tool subclass to support background execution by setting
        task_config.mode to "supported" or "required". The server calls this
        method instead of run() directly.

        Args:
            arguments: Tool arguments
            task_meta: If provided, execute as background task and return
                CreateTaskResult. If None (default), execute synchronously and
                return ToolResult.

        Returns:
            ToolResult when task_meta is None.
            CreateTaskResult when task_meta is provided.

        Subclasses can override this to customize task routing behavior.
        For example, FastMCPProviderTool overrides to delegate to child
        middleware without submitting to Docket.
        r   )check_background_taskrg   )	component	task_typer   r   N)fastmcp.server.tasks.routingr   r   )rW   r   r   r   task_results        r3   r   z	Tool._runU  s      2 	GFFFFF11	
 
 
 
 
 
 
 
 
  	XXi(((((((((r5   docketr$   c                    | j                                         sdS |                    | j        | j        g           dS )z8Register this tool with docket for background execution.N)names)r~   r   registerr   key)rW   r   s     r3   register_with_docketzTool.register_with_docket{  s@    ..00 	F
33333r5   )fn_keytask_keyr   r   kwargsr%   c               `   K   |p| j         }|r||d<     |j        |fi ||           d{V S )ae  Schedule this tool for background execution via docket.

        Args:
            docket: The Docket instance
            arguments: Tool arguments
            fn_key: Function lookup key in Docket registry (defaults to self.key)
            task_key: Redis storage key for the result
            **kwargs: Additional kwargs passed to docket.add()
        r   N)r   add)rW   r   r   r   r   r   
lookup_keys          r3   add_to_docketzTool.add_to_docket  s[      $ 'tx
 	%$F5M5ZVZ
55f55i@@@@@@@@@r5   )
rr   rw   r8   r   r   rj   rl   r>   transform_argstransform_fnTool | Callable[..., Any]str | NotSetT | None ToolAnnotations | NotSetT | Noner   dict[str, ArgTransform] | Noner   Callable[..., Any] | Noner)   c       
        n    ddl m} |                     |          } |j        |||||
||||||	          S )Nr   )r)   )rg   r   rr   rw   r   r8   r   r   rj   rl   r>   )fastmcp.tools.tool_transformr)   _ensure_tool	from_tool)r   rg   rr   rw   r8   r   r   rj   rl   r>   r   r   r)   s                r3   r   zTool.from_tool  sg      	A@@@@@%%((%)##'!
 
 
 	
r5   c                    t          |t                    r|S ddlm} ddlm}m}  ||          }t          ||          r |j        ||          S |                     |          S )zCCoerce a callable into a Tool, respecting @tool decorator metadata.r   )get_fastmcp_meta)r'   ToolMeta)metadata)rJ   r   fastmcp.decoratorsr   r   r'   r   r   )r   rg   r   r'   r   fmetas         r3   r   zTool._ensure_tool  s     dD!! 	K777777FFFFFFFF  &&eX&& 	D-<-dUCCCC  &&&r5   c                P    t                                                      dddz  S )Nrg   LocalProvider)zfastmcp.component.typezfastmcp.provider.type)rU   get_span_attributes)rW   rZ   s    r3   r   zTool.get_span_attributes  s0    ww**,,&,%40
 0
 
 	
r5   )r,   r   )rt   r   r,   ru   ) r   r   rr   r   r   r   rw   r   r8   r   rz   r   r   r   r   r   r   r   rj   r   rl   r   r>   r<   r   r   rn   r   rm   r   r,   r'   )r   r   r,   r7   )r   r   r,   r7   r   )r   r   r   r   r,   r7   )r   r   r   r   r,   r   )r   r   r   r   r,   r   )r   r$   r,   r   )r   r$   r   r   r   r   r   r   r   r   r,   r%   )rg   r   rr   r   rw   r   r8   r   r   r   r   r   rj   r   rl   r   r>   r   r   r   r   r   r,   r)   )rg   r   r,   r   )r,   r   )rT   ra   rb   __doc__rh   rc   rj   r   rk   rl   rm   rn   r   rs   r   classmethodr    r   r   r   r
   r   r   r   r   r   r   rd   re   s   @r3   r   r      s        ** &J&&&&   
 	      	      	      	      	 	     	      _'"""   #"
! ! ! !F 
  $( "&#' $.2)-9?6:&*)- $37#&
 &
 &
 &
 &
 [&
P
E 
E 
E 
E7
 7
 7
 7
r      X ) ) ) X) &*$) $) $) $) $)L4 4 4 4 "#A A A A A A. 
  &,,2 $8>9?6:069=26
 
 
 
 
 [
B ' ' ' ['
 
 
 
 
 
 
 
 
 
r5   r   rB   rl   r   c                    |@	  ||           S # t           $ r'}t                              d|d           Y d }~nd }~ww xY wt          |           S )Nz!Error serializing tool result: %sT)exc_info)	ExceptionrP   warningr4   )rB   rl   rY   s      r3   _serialize_with_fallbackr     s     	:f%%% 	 	 	NN3         	 f%%%s   
 
A ;A r   r   c                   t          | t                    r| S t          | t                    r|                                 S t          | t                    r|                                 S t          | t                    r|                                 S t          | t                    rt          d|           S t          | t                    rp	 t          d|                     d                    S # t          $ r> dd l}t          d|                    |                               d                    cY S w xY wt          dt          | |                    S )NtextrS   r   zutf-8r   ascii)rJ   r   r   to_image_contentr   to_audio_contentr   to_resource_contentr-   r   r   r2   r   base64	b64encoder   )r   rl   r   s      r3    _convert_to_single_content_blockr     sa    $%% $ '$$&&&$ '$$&&&$ *'')))$ 3T2222$ Y	YFW1E1EFFFF! 	Y 	Y 	YMMMF1A1A$1G1G1N1Nw1W1WXXXXXX	Y
 F)A$
)S)STTTTs   #C3 3AD;:D;z[Rendered Prefab UI]app_namer   Callable[..., str] | Nonec                H    	 ddl m}  ||           S # t          $ r Y dS w xY w)z<Get the Prefab peer-reference resolver bound to an app name.r   )_make_resolverN)fastmcp.apps.appr   ImportError)r   r   s     r3   _get_tool_resolverr     sK    333333~h'''   tts    
!!appr   r   c                L    |                      t          |                    }|S )u`  Call PrefabApp.to_json() with the hash-based resolver.

    The resolver prefixes peer-tool references with a deterministic hash
    derived from the app name + tool name. The dispatcher recognizes that
    format and routes calls via ``get_tool_by_hash`` which walks the
    provider tree recursively — same pattern as the old ``get_app_tool``.
    )tool_resolver)r1   r   )r   r   r+   s      r3   rL   rL     s&     ;;%78H%I%I;JJDKr5   rg   c                    | j         }|sdS |                    d          }t          |t                    r,|                    d          }t          |t                    r|S dS )z<Read the FastMCPApp name from a tool's metadata, if present.Nr   r   )r>   r|   rJ   rR   r-   )rg   r>   fastmcp_metar   s       r3   r   r     sh    9D t88I&&L,%% u%%c3 	J4r5   c                l    t          t          dt                    gt          | |                    S )z,Convert a PrefabApp to a FastMCP ToolResult.r   r   r   r   )r7   r   _PREFAB_TEXT_FALLBACKrL   )r   r   s     r3   r   r   $  s>    &/DEEEF*3AQRRR   r5   r9   c                ,   | g S t          | t          t          z            st          |           gS t	          d | D                       r| S t          d | D                       rfd| D             S t          dt          |                     gS )z2Convert a result to a sequence of content objects.Nc              3  @   K   | ]}t          |t                    V  d S r   r   r   s     r3   r   z&_convert_to_content.<locals>.<genexpr>9  s,      
=
=d:dL))
=
=
=
=
=
=r5   c              3  p   K   | ]1}t          |t          t          z  t          z  t          z            V  2d S r   )rJ   r   r   r   r   r   s     r3   r   z&_convert_to_content.<locals>.<genexpr>>  s;      
T
TT:dL50584?@@
T
T
T
T
T
Tr5   c                ^    g | ])}t          |t                    st          |          n|*S r   )rJ   r   r   )r   r   rl   s     r3   
<listcomp>z'_convert_to_content.<locals>.<listcomp>?  sM     
 
 
  dL11,T:>>>
 
 
r5   r   r   )rJ   r   r   r   allr   r   r   )rB   rl   s    `r3   rH   rH   ,  s     ~	fte|-- F0DDEE 
=
=f
=
=
===  
T
TV
T
T
TTT 

 
 
 
 	
 
 
 	
 V*B6:*V*VWWWXXr5   rr   c                    dddd}| |v rFddl }|j        j        r t          j        d|  dt
          d	
           ddlm} t          ||           S t          dt          d|           )z2Deprecated re-exports for backwards compatibility.r'   ParsedFunctionrg   )r'   r
  rg   r   Nz
Importing zX from fastmcp.tools.tool is deprecated. Import from fastmcp.tools.function_tool instead.   )
stacklevel)function_toolzmodule z has no attribute )r   settingsdeprecation_warningswarningswarnr   fastmcp.toolsr  getattrAttributeErrorrT   )rr   deprecated_exportsr   r  s       r3   __getattr__r  L  s     '*  !!!0 	MDT D D D)	    	0/////}d+++
I8IIII
J
JJr5   )r+   r   r,   r-   r   )rB   r   rl   r   r,   r-   )r   r   rl   r   r,   r   )r   r   r,   r   )r   r   r   r   r,   r   )rg   r   r,   r   )r   r   r   r   r,   r7   )rB   r   rl   r   r,   r9   )rr   r-   r,   r   )R
__future__r   r  collections.abcr   typingr   r   r   r   r	   r
   	mcp.typesmcpr0   mcp.shared.tool_name_validationr   r   r   r   r   r   r   r   ru   pydanticr   r   r   pydantic.json_schemar   fastmcp.exceptionsr   !fastmcp.server.auth.authorizationr   fastmcp.server.tasks.configr   r   fastmcp.utilities.componentsr   fastmcp.utilities.loggingr   fastmcp.utilities.typesr   r   r   r    r!   prefab_ui.appr"   rK   prefab_ui.components.baser#   rM   rI   r   r   r$   docket.executionr%   r   r'   r   r(   r)   rT   rP   r-   r*   rc   r4   r7   r   r   r  r   rL   r   r   rH   __all__r  r   r5   r3   <module>r)     s@   " " " " " " "  $ $ $ $ $ $                        G G G G G G                & % % % % % 6 6 6 6 6 6 6 6 6 6 / / / / / / 8 8 8 8 8 8 7 7 7 7 7 7 < < < < < < < < 9 9 9 9 9 9 0 0 0 0 0 0             555555GGGGGGKK   KKK  K******888888JJJJJJJJ 
H		 '/ucz&:  : : : :> > > >D5 D5 D5 D5 D5 D5 D5 D5NA
 A
 A
 A
 A
 A
 A
 A
J
 @D& & & & &$ 37U U U U U< /     	 	 	 	 	
 
 
 
     37Y Y Y Y Y: <
 K K K K K Ks   B BB