+
    Q(i'                    $   R t ^ RIHt ^ RIt^ RIHtHt ^ RIHtH	t	 ^ RI
HtHt ^ RIHt ^ RIHt ^ RIHt ^ R	IHt ^ R
IHt ^ RIHtHt ]'       d   ^ RIHt ^ RIHt ^ RIHt ^ RI H!t! ]PD                  ! ]#4      t$]! R4      t% ! R R]4      t&R# )ay  AggregateProvider for combining multiple providers into one.

This module provides `AggregateProvider`, a utility class that presents
multiple providers as a single unified provider. Useful when you want to
combine custom providers without creating a full FastMCP server.

Example:
    ```python
    from fastmcp.server.providers import AggregateProvider

    # Combine multiple providers into one
    combined = AggregateProvider()
    combined.add_provider(provider1)
    combined.add_provider(provider2, namespace="api")  # Tools become "api_foo"

    # Use like any other provider
    tools = await combined.list_tools()
    ```
)annotationsN)AsyncIteratorSequence)AsyncExitStackasynccontextmanager)TYPE_CHECKINGTypeVar)NotFoundError)Provider)	Namespace)gather)FastMCPComponent)VersionSpecversion_sort_key)Prompt)Resource)ResourceTemplate)ToolTc                     a  ] tR t^.tRtR#R V 3R llltRR/R R lltR R	 ltR
 R ltR R lt	R R lt
R#R R lltR R ltR#R R lltR R ltR#R R lltR R ltR#R R lltR R lt]R  R! l4       tR"tV ;t# )$AggregateProvidera  Utility provider that combines multiple providers into one.

Components are aggregated from all providers. For get_* operations,
providers are queried in parallel and the highest version is returned.

When adding providers with a namespace, wrap_transform() is used to apply
the Namespace transform. This means namespace transformation is handled
by the wrapped provider, not by AggregateProvider.

Errors from individual providers are logged and skipped (graceful degradation).

Example:
    ```python
    combined = AggregateProvider()
    combined.add_provider(db_provider)
    combined.add_provider(api_provider, namespace="api")
    # db_provider's tools keep original names
    # api_provider's tools become "api_foo", "api_bar", etc.
    ```
c                    V ^8  d   QhRRRR/# )   	providerszSequence[Provider] | NonereturnNone )formats   "h/Users/agent/.openclaw/workspace/venv/lib/python3.14/site-packages/fastmcp/server/providers/aggregate.py__annotate__AggregateProvider.__annotate__D   s     ? ?"; ?t ?    c                X   < \         SV `  4        \        T;'       g    . 4      V n        R# )zInitialize with an optional sequence of providers.

Args:
    providers: Optional initial providers (without namespacing).
        For namespaced providers, use add_provider() instead.
N)super__init__listr   )selfr   	__class__s   &&r   r$   AggregateProvider.__init__D   s"     	)-ioo2)>r!   	namespace c               $    V ^8  d   QhRRRRRR/# )r   providerr
   r)   strr   r   r   )r   s   "r   r   r    N   s!     ( (X (S ($ (r!   c                   ^ RI Hp \        W4      '       d   ^ RIHp V! V4      pV'       d   VP                  \        V4      4      pV P                  P                  V4       R# )a  Add a provider with optional namespace.

If the provider is a FastMCP server, it's automatically wrapped in
FastMCPProvider to ensure middleware is invoked correctly.

Args:
    provider: The provider to add.
    namespace: Optional namespace prefix. When set:
        - Tools become "namespace_toolname"
        - Resources become "protocol://namespace/path"
        - Prompts become "namespace_promptname"
)FastMCP)FastMCPProviderN)	fastmcp.server.serverr/   
isinstance)fastmcp.server.providers.fastmcp_providerr0   wrap_transformr   r   append)r&   r,   r)   r/   r0   s   &&$  r   add_providerAggregateProvider.add_providerN   sM     	2 h((Q&x0H ..y/CDHh'r!   c               $    V ^8  d   QhRRRRRR/# )r   resultsz!list[Sequence[T] | BaseException]	operationr-   r   zlist[T]r   )r   s   "r   r   r    j   s$      8EH	r!   c           	         . p\        V4       F]  w  rE\        V\        4      '       d2   \        P	                  RV RV P
                  V,           RV 24       KL  VP                  V4       K_  	  V# )z8Collect successful list results, logging any exceptions.Error during  from provider : )	enumerater2   BaseExceptionloggerdebugr   extend)r&   r9   r:   	collectediresults   &&&   r   _collect_list_results'AggregateProvider._collect_list_resultsj   sq      	"7+IA&-00#I;o~~a()F85 V$ , r!   c               $    V ^8  d   QhRRRRRR/# )r   r9   z-list[FastMCPComponent | None | BaseException]r:   r-   r   zFastMCPComponent | Noner   )r   s   "r   r   r    y   s(     0 0>0 0 
!	0r!   c           	     L   . p\        V4       Fy  w  rE\        V\        4      '       dH   \        V\        4      '       g0   \        P                  RV RV P                  V,           RV 24       Kb  Vf   Kh  VP                  V4       K{  	  V'       g   R# \        V\        R7      # )zGet the highest version from successful non-None results.

Used for versioned components where we want the highest version
across all providers rather than the first match.
r<   r=   r>   N)key)
r?   r2   r@   r	   rA   rB   r   r5   maxr   )r&   r9   r:   validrE   rF   s   &&&   r   _get_highest_version_result-AggregateProvider._get_highest_version_resulty   s     )+"7+IA&-00!&-88LL'	{/>>!,-Rx9 !V$ , 5.//r!   c                   V ^8  d   QhRR/# )r   r   r-   r   )r   s   "r   r   r       s     B B# Br!   c                	$    R V P                   : R2# )zAggregateProvider(providers=)r   )r&   s   &r   __repr__AggregateProvider.__repr__   s    -dnn-?qAAr!   c                   V ^8  d   QhRR/# )r   r   zSequence[Tool]r   )r   s   "r   r   r       s     A A> Ar!   c                   "   \        V P                   Uu. uF  qP                  4       NK  	  upRR/ G Rj  xL
 pV P                  VR4      # u upi  L5i)z"List all tools from all providers.return_exceptionsTN
list_tools)r   r   rY   rG   r&   pr9   s   &  r   _list_toolsAggregateProvider._list_tools   sU     &*nn5nllnn5
"
 
 ))'<@@ 6
   AA
AAAc               $    V ^8  d   QhRRRRRR/# )r   namer-   versionVersionSpec | Noner   zTool | Noner   )r   s   "r   r   r       s)     P PP"4P	Pr!   c           	        "   \        V P                   Uu. uF  q3P                  W4      NK  	  upRR/ G Rj  xL
 pV P                  VRV: R24      # u upi  L 5i)z Get tool by name from providers.rX   TNz	get_tool(rR   )r   r   get_toolrN   r&   r`   ra   r[   r9   s   &&&  r   	_get_toolAggregateProvider._get_tool   sd      15@Ajj'@
"
 
 //9THA9NOO A
   AA
AA!Ac                   V ^8  d   QhRR/# )r   r   zSequence[Resource]r   )r   s   "r   r   r       s     E E'9 Er!   c                   "   \        V P                   Uu. uF  qP                  4       NK  	  upRR/ G Rj  xL
 pV P                  VR4      # u upi  L5i)z&List all resources from all providers.rX   TNlist_resources)r   r   rk   rG   rZ   s   &  r   _list_resources!AggregateProvider._list_resources   sY     *...9.Q .9
"
 
 ))'3CDD :
r^   c               $    V ^8  d   QhRRRRRR/# )r   urir-   ra   rb   r   zResource | Noner   )r   s   "r   r   r       s)     S SS!3S	Sr!   c           	        "   \        V P                   Uu. uF  q3P                  W4      NK  	  upRR/ G Rj  xL
 pV P                  VRV: R24      # u upi  L 5i)z#Get resource by URI from providers.rX   TNzget_resource(rR   )r   r   get_resourcerN   r&   ro   ra   r[   r9   s   &&&  r   _get_resourceAggregateProvider._get_resource   sd      48NNCNqnnS*NC
"
 
 //=q9QRR D
rh   c                   V ^8  d   QhRR/# )r   r   zSequence[ResourceTemplate]r   )r   s   "r   r   r       s     N N0J Nr!   c                   "   \        V P                   Uu. uF  qP                  4       NK  	  upRR/ G Rj  xL
 pV P                  VR4      # u upi  L5i)z/List all resource templates from all providers.rX   TNlist_resource_templates)r   r   rw   rG   rZ   s   &  r   _list_resource_templates*AggregateProvider._list_resource_templates   sZ     37>>B>a'')>B
"
 
 ))'3LMM C
r^   c               $    V ^8  d   QhRRRRRR/# )r   ro   r-   ra   rb   r   zResourceTemplate | Noner   )r   s   "r   r   r       s$     

 



!3

	 

r!   c           	        "   \        V P                   Uu. uF  q3P                  W4      NK  	  upRR/ G Rj  xL
 pV P                  VRV: R24      # u upi  L 5i)z,Get resource template by URI from providers.rX   TNzget_resource_template(rR   )r   r   get_resource_templaterN   rr   s   &&&  r   _get_resource_template(AggregateProvider._get_resource_template   sl      =A^^L^%%c3^L
"
 
 //-cWA6
 	
 M
rh   c                   V ^8  d   QhRR/# )r   r   zSequence[Prompt]r   )r   s   "r   r   r       s     C C%5 Cr!   c                   "   \        V P                   Uu. uF  qP                  4       NK  	  upRR/ G Rj  xL
 pV P                  VR4      # u upi  L5i)z$List all prompts from all providers.rX   TNlist_prompts)r   r   r   rG   rZ   s   &  r   _list_promptsAggregateProvider._list_prompts   sV     (,71nn7
"
 
 ))'>BB 8
r^   c               $    V ^8  d   QhRRRRRR/# )r   r`   r-   ra   rb   r   zPrompt | Noner   )r   s   "r   r   r       s)     R RR"4R	Rr!   c           	        "   \        V P                   Uu. uF  q3P                  W4      NK  	  upRR/ G Rj  xL
 pV P                  VRV: R24      # u upi  L 5i)z"Get prompt by name from providers.rX   TNzget_prompt(rR   )r   r   
get_promptrN   re   s   &&&  r   _get_promptAggregateProvider._get_prompt   sd      37>>B>all4)>B
"
 
 //;tha9PQQ C
rh   c                   V ^8  d   QhRR/# )r   r   zSequence[FastMCPComponent]r   )r   s   "r   r   r       s     @ @!; @r!   c                   "   \        V P                   Uu. uF  qP                  4       NK  	  upRR/ G Rj  xL
 pV P                  VR4      # u upi  L5i)z4Get all task-eligible components from all providers.rX   TN	get_tasks)r   r   r   rG   rZ   s   &  r   r   AggregateProvider.get_tasks   sU     %)^^4^kkm^4
"
 
 ))';?? 5
r^   c                   V ^8  d   QhRR/# )r   r   zAsyncIterator[None]r   )r   s   "r   r   r       s       3 r!   c               (  "   \        4       ;_uu_4       GRj  xL
 pV P                   F*  pVP                  VP                  4       4      G Rj  xL
  K,  	  R5x  RRR4      GRj  xL
  R#  LU L! L
  + GRj  xL 
 '       g   i     R# ; i5i)z#Combine lifespans of all providers.N)r   r   enter_async_contextlifespan)r&   stackr[   s   &  r   r   AggregateProvider.lifespan   s\      "###u^^//

=== $ $##= $###s\   BA/B2A5A1
A5B(A3)B1A53B5B	;A><
B	B			BrS   )N)__name__
__module____qualname____firstlineno____doc__r$   r6   rG   rN   rT   r\   rf   rl   rs   rx   r}   r   r   r   r   r   __static_attributes____classcell__)r'   s   @r   r   r   .   sw    *? ?(2 (802BAPESN

 CR@  r!   r   )'r   
__future__r   loggingcollections.abcr   r   
contextlibr   r   typingr   r   fastmcp.exceptionsr	   fastmcp.server.providers.baser
   fastmcp.server.transformsr   fastmcp.utilities.async_utilsr   fastmcp.utilities.componentsr   fastmcp.utilities.versionsr   r   fastmcp.prompts.promptr   fastmcp.resources.resourcer   fastmcp.resources.templater   fastmcp.tools.toolr   	getLoggerr   rA   r   r   r   r!   r   <module>r      sc   ( #  3 : ) , 2 / 0 9 D-3;'			8	$CLW Wr!   