+
    Q(iG@                       R t ^ RIHt ^ RIt^ RIHt ^ RIHtHtH	t	H
t
Ht ^ RIt]'       d   ^ RIHt ^ RIHt ^ RIHt ^ RIt^ RIt^ RIHtHt ^ R	IHt ^ R
IHtHtHtHtHtHt ^ RI H!t! ^ RI"H#t# ^ RI$H%t% ^ RI&H't'H(t( ^ RI)H*t*  ! R R]PV                  4      t, ! R R]PV                  4      t- ! R R]*4      t. ROt.R R lt/R# )z2Base classes and interfaces for FastMCP resources.)annotationsN)Callable)TYPE_CHECKING	AnnotatedAnyClassVaroverload)Docket)	ExecutionFunctionResource)AnnotationsIcon)Resource)AnyUrl
ConfigDictFieldUrlConstraintsfield_validatormodel_validator)SkipJsonSchema)Self)	AuthCheck)
TaskConfigTaskMeta)FastMCPComponentc                  j   a  ] tR t^%t$ RtR]R&   RtR]R&   RtR]R&   RR	 V 3R
 llltR R lt	Rt
V ;t# )ResourceContenta.  Wrapper for resource content with optional MIME type and metadata.

Accepts any value for content - strings and bytes pass through directly,
other types (dict, list, BaseModel, etc.) are automatically JSON-serialized.

Example:
    ```python
    from fastmcp.resources import ResourceContent

    # String content
    ResourceContent("plain text")

    # Binary content
    ResourceContent(b"binary data", mime_type="application/octet-stream")

    # Auto-serialized to JSON
    ResourceContent({"key": "value"})
    ResourceContent(["a", "b", "c"])
    ```
zstr | bytescontentN
str | None	mime_typedict[str, Any] | Nonemetac               $    V ^8  d   QhRRRRRR/# )   r   r   r    r   r"   r!    )formats   "`/Users/agent/.openclaw/workspace/venv/lib/python3.14/site-packages/fastmcp/resources/resource.py__annotate__ResourceContent.__annotate__?   s-     U UU U $	U    c                *  < \        V\        4      '       d   TpT;'       g    RpM[\        V\        4      '       d   TpT;'       g    RpM6\        P                  ! V\        R7      P                  4       pT;'       g    Rp\        SV `  WBVR7       R# )u  Create ResourceContent with automatic serialization.

Args:
    content: The content value. str and bytes pass through directly.
             Other types (dict, list, BaseModel) are JSON-serialized.
    mime_type: Optional MIME type. Defaults based on content type:
               str → "text/plain", bytes → "application/octet-stream",
               other → "application/json"
    meta: Optional metadata dictionary.

text/plainapplication/octet-stream)fallbackzapplication/json)r   r    r"   N)
isinstancestrbytespydantic_coreto_jsondecodesuper__init__)selfr   r    r"   normalized_content	__class__s   &&&& r'   r6   ResourceContent.__init__?   s      gs##.5!11\I''!(!??%?I "/!6!6w!M!T!T!V!77%7I!3tTr*   c                    V ^8  d   QhRRRR/# )r$   uriAnyUrl | strreturnz?mcp.types.TextResourceContents | mcp.types.BlobResourceContentsr%   )r&   s   "r'   r(   r)   \   s      	Hr*   c                6   \        V P                  \        4      '       dm   \        P                  P                  \        V\        4      '       d   \        V4      MTV P                  V P                  ;'       g    RV P                  R7      # \        P                  P                  \        V\        4      '       d   \        V4      MT\        P                  ! V P                  4      P                  4       V P                  ;'       g    RV P                  R7      # )zConvert to MCP resource contents type.

Args:
    uri: The URI of the resource (required by MCP types)

Returns:
    TextResourceContents for str content, BlobResourceContents for bytes
r,   )r<   textmimeType_metar-   )r<   blobrA   rB   )r/   r   r0   mcptypesTextResourceContentsr   r    r"   BlobResourceContentsbase64	b64encoder4   )r7   r<   s   &&r'   to_mcp_resource_contents(ResourceContent.to_mcp_resource_contents\   s     dllC((9911#-c3#7#7F3KS\\77<ii	 2   9911#-c3#7#7F3KS%%dll3::<EE+Eii	 2  r*   r%   )NN)__name__
__module____qualname____firstlineno____doc____annotations__r    r"   r6   rJ   __static_attributes____classcell__r9   s   @r'   r   r   %   s;    *  Iz "&D
&U U: r*   r   c                  r   a  ] tR t^wt$ RtR]R&   RtR]R&   RR V 3R lllt]R	 R
 l4       t	R R lt
RtV ;t# )ResourceResulta*  Canonical result type for resource reads.

Provides explicit control over resource responses: multiple content items,
per-item MIME types, and metadata at both the item and result level.

Accepts:
    - str: Wrapped as single ResourceContent (text/plain)
    - bytes: Wrapped as single ResourceContent (application/octet-stream)
    - list[ResourceContent]: Used directly for multiple items or custom MIME types

Example:
    ```python
    from fastmcp import FastMCP
    from fastmcp.resources import ResourceResult, ResourceContent

    mcp = FastMCP()

    # Simple string content
    @mcp.resource("data://simple")
    def get_simple() -> ResourceResult:
        return ResourceResult("hello world")

    # Multiple items with custom MIME types
    @mcp.resource("data://items")
    def get_items() -> ResourceResult:
        return ResourceResult(
            contents=[
                ResourceContent({"key": "value"}),  # auto-serialized to JSON
                ResourceContent(b"binary data"),
            ],
            meta={"count": 2}
        )
    ```
list[ResourceContent]contentsNr!   r"   c                    V ^8  d   QhRRRR/# )r$   rX   #str | bytes | list[ResourceContent]r"   r!   r%   )r&   s   "r'   r(   ResourceResult.__annotate__   s     9 959 $9r*   c                J   < V P                  V4      p\        SV `	  W2R7       R# )zCreate ResourceResult.

Args:
    contents: String, bytes, or list of ResourceContent objects.
    meta: Optional metadata about the resource result.
)rX   r"   N)_normalize_contentsr5   r6   )r7   rX   r"   
normalizedr9   s   &&& r'   r6   ResourceResult.__init__   s%     --h7
*8r*   c                    V ^8  d   QhRRRR/# )r$   rX   rZ   r>   rW   r%   )r&   s   "r'   r(   r[      s     
 
5
	
r*   c           
        \        V \        4      '       d   \        V 4      .# \        V \        4      '       d   \        V 4      .# \        V \        4      '       dV   \        V 4       FD  w  r\        V\        4      '       d   K  \        RV R\        V4      P                   RV: R24      h	  V # \        R\        V 4      P                   24      h)z)Normalize input to list[ResourceContent].z	contents[z] must be ResourceContent, got z. Use ResourceContent(z) to wrap the value.z;contents must be str, bytes, or list[ResourceContent], got )	r/   r0   r   r1   list	enumerate	TypeErrortyperL   )rX   iitems   &  r'   r]   "ResourceResult._normalize_contents   s    
 h$$#H-..h&&#H-..h%%$X.!$88##A3&Ed4jFYFYEZ [//3h6JL  / OI$x.JaJaIbc
 	
r*   c                    V ^8  d   QhRRRR/# )r$   r<   r=   r>   zmcp.types.ReadResourceResultr%   )r&   s   "r'   r(   r[      s     
 
 
2N 
r*   c                    V P                    Uu. uF  q"P                  V4      NK  	  pp\        P                  P	                  VV P
                  R7      # u upi )zConvert to MCP ReadResourceResult.

Args:
    uri: The URI of the resource (required by MCP types)

Returns:
    MCP ReadResourceResult with converted contents
)rX   rB   )rX   rJ   rD   rE   ReadResourceResultr"   )r7   r<   rg   mcp_contentss   &&  r'   to_mcp_resultResourceResult.to_mcp_result   sS     HL}}U}t55c:}Uyy++!)) , 
 	
 Vs   Ar%   N)rL   rM   rN   rO   rP   rQ   r"   r6   staticmethodr]   rm   rR   rS   rT   s   @r'   rV   rV   w   sD    !F $#"&D
&9 9 
 
*
 
r*   rV   c                    a  ] tR t^t$ RtRtR]R&   ]! RR7      t]	! RRR	7      t
R
]R&   ]	! RRR	7      tR]R&   ]	! RRR	7      tR]R&   RtR]R&   Rt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  ll4       t]! RR!R"7      ]R# R$ l4       4       t]! R%R"7      R& R' l4       tR( R) ltR* R+ lt]RAR, R- ll4       t]R. R/ l4       tRAR0 R1 lltR2 R3 ltR4 R5 lt]R6 R7 l4       tR8 R9 ltR:RR;R/R< R= lltR> V 3R? lltR@t V ;t!# )Br   zBase class for all resources.resourcezClassVar[str]
KEY_PREFIXT)validate_default.zURI of the resource)defaultdescriptionz6Annotated[AnyUrl, UrlConstraints(host_required=False)]r<    zName of the resourcer0   namer,   z!MIME type of the resource contentr    NzfAnnotated[Annotations | None, Field(description="Optional annotations about the resource's behavior")]r   zAnnotated[SkipJsonSchema[AuthCheck | list[AuthCheck] | None], Field(description='Authorization checks for this resource', exclude=True)]authversiontitlerv   iconstagsr"   taskc               P    V ^8  d   Qh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/# )r$   fnzCallable[..., Any]r<   zstr | AnyUrlrx   r   rz   zstr | int | Noner{   rv   r|   zlist[Icon] | Noner    r}   zset[str] | Noner   zAnnotations | Noner"   r!   r~   zbool | TaskConfig | Nonery   z"AuthCheck | list[AuthCheck] | Noner>   r   r%   )r&   s   "r'   r(   Resource.__annotate__   s     #
 #
#
 #

 #
 "#
 #
  #
 !#
 #
 #
 (#
 $#
 '#
 1#
  
!#
r*   c               	L    ^ RI Hp VP                  ! VVVVVVVVV	V
VVVR7      # )    r   )r   r<   rx   rz   r{   rv   r|   r    r}   r   r"   r~   ry   )#fastmcp.resources.function_resourcer   from_function)clsr   r<   rx   rz   r{   rv   r|   r    r}   r   r"   r~   ry   r   s   &&&$$$$$$$$$$$ r'   r   Resource.from_function   sC    $	
  --##
 	
r*   before)modec                    V ^8  d   QhRRRR/# )r$   r    r   r>   r0   r%   )r&   s   "r'   r(   r     s      j S r*   c                    V'       d   V# R# )z&Set default MIME type if not provided.r,   r%   )r   r    s   &&r'   set_default_mime_typeResource.set_default_mime_type  s     r*   afterc                   V ^8  d   QhRR/# )r$   r>   r   r%   )r&   s   "r'   r(   r     s      $ r*   c                    V P                   '       d    V # V P                  '       d   \        V P                  4      V n         V # \        R4      h)z*Set default name from URI if not provided.z#Either name or uri must be provided)rx   r<   r0   
ValueErrorr7   s   &r'   set_default_nameResource.set_default_name  sF     999
 	 XXXDHHDI  BCCr*   c                   V ^8  d   QhRR/# )r$   r>   zstr | bytes | ResourceResultr%   )r&   s   "r'   r(   r   #  s     
F 
F	%
Fr*   c                    "   \        R4      h5i)zRead the resource content.

Subclasses implement this to return resource data. Supported return types:
    - str: Text content
    - bytes: Binary content
    - ResourceResult: Full control over contents and result-level meta
z Subclasses must implement read())NotImplementedErrorr   s   &r'   readResource.read#  s      ""DEEs   c                    V ^8  d   QhRRRR/# )r$   	raw_valuer   r>   rV   r%   )r&   s   "r'   r(   r   /  s     ) ) ) )r*   c                    \        V\        4      '       d   V# \        V\        \        34      '       d,   \        \	        WP
                  V P                  R7      .4      # \        V4      # )a  Convert a raw result to ResourceResult.

This is used in two contexts:
1. In _read() to convert user function return values to ResourceResult
2. In tasks_result_handler() to convert Docket task results to ResourceResult

Handles ResourceResult passthrough and converts raw values using
ResourceResult's normalization.  When the raw value is a plain
string or bytes, the resource's own ``mime_type`` is forwarded so
that ``ui://`` resources (and others with non-default MIME types)
don't fall back to ``text/plain``.

The resource's component-level ``meta`` (e.g. ``ui`` metadata for
MCP Apps CSP/permissions) is propagated to each content item so
that hosts can read it from the ``resources/read`` response.
)r    r"   )r/   rV   r0   r1   r   r    r"   )r7   r   s   &&r'   convert_resultResource.convert_result/  sY    " i00
 i#u..! nn499UV 
 i((r*   c                    V ^8  d   QhRRRR/# )r$   	task_metaNoner>   rV   r%   )r&   s   "r'   r(   r   O  s    HHTH^Hr*   c                	   "   R # 5iro   r%   r7   r   s   &&r'   _readResource._readN  s     EH   c                    V ^8  d   QhRRRR/# )r$   r   r   r>   zmcp.types.CreateTaskResultr%   )r&   s   "r'   r(   r   R  s    QQXQ2LQr*   c                	   "   R # 5iro   r%   r   s   &&r'   r   r   Q  s     NQr   c                    V ^8  d   QhRRRR/# )r$   r   zTaskMeta | Noner>   z+ResourceResult | mcp.types.CreateTaskResultr%   )r&   s   "r'   r(   r   T  s      +  +( +	4 +r*   c                   "   ^ RI Hp V! V RRVR7      G Rj  xL
 pV'       d   V# V P                  4       G Rj  xL
 pV P                  V4      #  L7 L5i)a  Server entry point that handles task routing.

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

Args:
    task_meta: If provided, execute as a background task and return
        CreateTaskResult. If None (default), execute synchronously and
        return ResourceResult.

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

Subclasses can override this to customize task routing behavior.
For example, FastMCPProviderResource overrides to delegate to child
middleware without submitting to Docket.
)check_background_taskrr   N)	component	task_type	argumentsr   )fastmcp.server.tasks.routingr   r   r   )r7   r   r   task_resultresults   &&   r'   r   r   T  sY     , 	G1jDI
 
  yy{"""6**
 #s$   AAAAAAAc                    V ^8  d   QhRRRR/# )r$   	overridesr   r>   SDKResourcer%   )r&   s   "r'   r(   r   v  s     
 

 

r*   c                   \        VP                  RV P                  4      VP                  RV P                  4      VP                  RV P                  4      VP                  RV P
                  4      VP                  RV P                  4      VP                  RV P                  4      VP                  RV P                  4      VP                  RV P                  4       4      R	7      # )
z'Convert the resource to an SDKResource.rx   r<   rv   rA   r{   r|   r   rB   )rx   r<   rv   rA   r{   r|   r   rB   )
r   getrx   r<   rv   r    r{   r|   r   get_meta)r7   r   s   &,r'   to_mcp_resourceResource.to_mcp_resourcev  s     vtyy1eTXX.!mT5E5EF]]:t~~>--4--4!mT5E5EF--
 	
r*   c                   V ^8  d   QhRR/# r$   r>   r0   r%   )r&   s   "r'   r(   r     s     F F# Fr*   c           
     	    V P                   P                   R V P                  : RV P                  : RV P                  : RV P
                   R2
# )z(uri=z, name=z, description=z, tags=))r9   rL   r<   rx   rv   r}   r   s   &r'   __repr__Resource.__repr__  sb    ..))*%|7499-~^b^n^n]qqxy}  zC  zC  yD  DE  F  	Fr*   c                   V ^8  d   QhRR/# r   r%   )r&   s   "r'   r(   r     s     2 2S 2r*   c                    V P                  \        V P                  4      4      pT RV P                  ;'       g    R 2# )z1The globally unique lookup key for this resource.@rw   )make_keyr0   r<   rz   )r7   base_keys   & r'   keyResource.key  s8     ==TXX/1T\\//R011r*   c                    V ^8  d   QhRRRR/# )r$   docketr	   r>   r   r%   )r&   s   "r'   r(   r     s     5 56 5d 5r*   c                    V P                   P                  4       '       g   R# VP                  V P                  V P                  .R7       R# )z<Register this resource with docket for background execution.N)names)task_configsupports_tasksregisterr   r   )r7   r   s   &&r'   register_with_docketResource.register_with_docket  s4    ..00		$((4r*   fn_keytask_keyc          
     ,    V ^8  d   QhRRRRRRRRRR	/# )
r$   r   r	   r   r   r   kwargsr   r>   r
   r%   )r&   s   "r'   r(   r     s<     8 88 	8
 8 8 
8r*   c                  "   T;'       g    V P                   pV'       d   W4R&   VP                  ! V3/ VB ! 4       G Rj  xL
 #  L5i)a  Schedule this resource for background execution via docket.

Args:
    docket: The Docket instance
    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)r7   r   r   r   r   
lookup_keys   &&$$, r'   add_to_docketResource.add_to_docket  s?       ''txx
$5MZZ
5f57777s   AA AAc                   V ^8  d   QhRR/# )r$   r>   zdict[str, Any]r%   )r&   s   "r'   r(   r     s     
 
^ 
r*   c                	6   < \         SV `  4       R RRR/,          # )zfastmcp.component.typerr   zfastmcp.provider.typeLocalProvider)r5   get_span_attributes)r7   r9   s   &r'   r   Resource.get_span_attributes  s'    w*,$j#_0
 
 	
r*   )rx   ro   )"rL   rM   rN   rO   rP   rs   rQ   r   model_configr   r<   rx   r    r   ry   classmethodr   r   r   r   r   r   r   r   r   r   r   propertyr   r   r   r   rR   rS   rT   s   @r'   r   r      s   ' *J*t4LBG!6CC	?  b.DED#E7Is  	    	 	  
 #

  #
 %)#
 !#
 #'#
 $(#
 !%#
 !%#
 +/#
 '+#
 *.#
 48#
 #
J [x0  1 '" #
F)> H HQ Q +D
&F 2 2
58 "	8
  $8*
 
r*   r   c                    V ^8  d   QhRRRR/# )r$   rx   r0   r>   r   r%   )r&   s   "r'   r(   r(     s     K Kc Kc Kr*   c                    RRRR/pW9   dR   ^ RI p^ RIpVP                  P                  '       d   VP	                  RV  R2\
        ^R7       ^ RIHp \        W@4      # \        R\        : R	V : 24      h)
z2Deprecated re-exports for backwards compatibility.r   rr   Nz
Importing zh from fastmcp.resources.resource is deprecated. Import from fastmcp.resources.function_resource instead.)
stacklevel)function_resourcezmodule z has no attribute )warningsfastmcpsettingsdeprecation_warningswarnDeprecationWarningfastmcp.resourcesr   getattrAttributeErrorrL   )rx   deprecated_exportsr   r   r   s   &    r'   __getattr__r     s     	.J
 !000MMTF #K L"	   	8(//
78,.@I
JJr*   )r   r   rV   )0rP   
__future__r   rH   collections.abcr   typingr   r   r   r   r   	mcp.typesrD   r   r	   docket.executionr
   r   r   pydanticr2   r   r   r   r   r   r   r   r   r   r   pydantic.json_schemar   typing_extensionsr   !fastmcp.server.auth.authorizationr   fastmcp.server.tasks.configr   r   fastmcp.utilities.componentsr   	BaseModelr   rV   __all__r   r%   r*   r'   <module>r      s    8 "  $ D D *D   ' -  0 " 7 < 9Oh(( OdX
X'' X
v_
 _
DKr*   