
    iX                     d   U d Z ddlZddl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Zdedej                  fd	Z	 	 	 dd
ed   ez  dej                  dz  dedz  deddf
dZej(                  	 	 dd
edz  dej                  dz  dedz  defd       Zej,                  ej.                  ej0                  ej2                  ej4                  ddZeed   dz  edz  f   ed<    G d dej<                        Z	 	 ddej                  ded   dz  ded   dz  ddfdZ dej                  ddfdZ!y)zLogging utilities for FastMCP.    N)AnyLiteralcast)Console)RichHandler)overridenamereturnc                     | j                  d      rt        j                  |       S t        j                  d|        S )zGet a logger nested under FastMCP namespace.

    Args:
        name: the name of the logger, which will be prefixed with 'FastMCP.'

    Returns:
        a configured logger instance
    zfastmcp.r	   )
startswithlogging	getLoggerr   s    i/Users/bowang/.openclaw/workspace/ChatDev/.venv/lib/python3.12/site-packages/fastmcp/utilities/logging.py
get_loggerr      s9     z"  d++HTF"344    levelDEBUGINFOWARNINGERRORCRITICALloggerenable_rich_tracebacksrich_kwargsc                    t         j                  j                  sy|t         j                  j                  }|t	        j
                  d      }t	        j                  d      }d|_        |j                  |        |j                  dd D ]  }|j                  |        t         j                  j                  sJt	        j                         }|j                  t	        j                  d             |j                  |       yt        ddt!        d      i|}|j                  |       |j#                  d	        d
dl}d
dl}t!        d      dd|dt         ||gd}	|	j)                  |       t        di |	}
|
j                  |       |
j#                  d        |j                  |       |j                  |
       y)z
    Configure logging for FastMCP.

    Args:
        logger: the logger to configure
        level: the log level to use
        rich_kwargs: the parameters to use for creating RichHandler
    Nfastmcpz%(message)sFz%(levelname)s: %(message)sconsoleT)stderrc                     | j                   d u S Nexc_inforecords    r   <lambda>z#configure_logging.<locals>.<lambda>P   s    V__%<r   r      )r   	show_path
show_levelrich_tracebackstracebacks_max_framestracebacks_suppressc                     | j                   d uS r"   r#   r%   s    r   r'   z#configure_logging.<locals>.<lambda>h   s    vd/Jr    )r   settingslog_enabledr   r   r   	Formatter	propagatesetLevelhandlersremoveHandlerenable_rich_loggingStreamHandlersetFormatter
addHandlerr   r   	addFiltermcppydanticupdate)r   r   r   r   	formatterhdlrhandlerr<   r=   traceback_kwargstraceback_handlers              r   configure_loggingrD      s    '' %!(!1!1!H!H~""9-!!-0I F
OOE "T" # //'')W../KLM'"  t$
G # <=  $'1!" 'h7 K(#7&67""9- JK
g
'(r   c           	   +      K   | r_t         j                  j                  }t        t        d   | j                               }t        d|||d| 	 d t        d|||d| yd y# t        d|||d| w xY ww)a  Context manager to temporarily set log level and restore it afterwards.

    Args:
        level: The temporary log level to set (e.g., "DEBUG", "INFO")
        logger: Optional logger to configure (defaults to FastMCP logger)
        enable_rich_tracebacks: Whether to enable rich tracebacks
        **rich_kwargs: Additional parameters for RichHandler

    Usage:
        with temporary_log_level("DEBUG"):
            # Code that runs with DEBUG logging
            pass
        # Original log level is restored here
    r   )r   r   r   Nr/   )r   r0   	log_levelr   r   upperrD   )r   r   r   r   original_levellog_level_literals         r   temporary_log_levelrJ   n   s     *  ))33 !CDKKM
 	 	
##9	
 		

	  $'= 	 	  $'= 	s   AA=A) A=)A::A=)r   r   r   r   r   N_level_to_noc                        e Zd ZU eeef   dz  ed<   eeef   dz  ed<   	 	 d	ded   dz  ded   dz  f fdZe	de
j                  defd       Z xZS )
_ClampedLogFilterN	min_level	max_levelr   c                     d | _         d | _        t        j                  |      x}r|t	        |      f| _         t        j                  |      x}r|t	        |      f| _        t
        |           y r"   )rN   rO   rK   getstrsuper__init__)selfrN   rO   min_level_nomax_level_no	__class__s        r   rT   z_ClampedLogFilter.__init__   sj     '++I66<6*C	N;DN'++I66<6*C	N;DNr   r&   r
   c                     | j                   r-| j                   \  }}|j                  |kD  r||_        ||_        y| j                  r-| j                  \  }}|j                  |k  r||_        ||_        yy)NT)rO   levelno	levelnamerN   )rU   r&   rW   max_level_namerV   min_level_names         r   filterz_ClampedLogFilter.filter   sk    >>+/>>(L.~~,!-#1 >>+/>>(L.~~,!-#1 r   NN)__name__
__module____qualname__tupleintrR   __annotations__r   rT   r   r   	LogRecordboolr^   __classcell__)rX   s   @r   rM   rM      s    S#X%%S#X%%
 JK
 JK
	" W.. 4  r   rM   rN   rO   c                 V    t        |        | j                  t        ||             y)a  Clamp the logger to a minimum and maximum level.

    If min_level is provided, messages logged at a lower level than `min_level` will have their level increased to `min_level`.
    If max_level is provided, messages logged at a higher level than `max_level` will have their level decreased to `max_level`.

    Args:
        min_level: The lower bound of the clamp
        max_level: The upper bound of the clamp
    )r   )rN   rO   )r^   N)_unclamp_loggerr;   rM   )r   rN   rO   s      r   _clamp_loggerrk      s%     6"
-	YWXr   c                 p    | j                   dd D ]$  }t        |t              s| j                  |       & y)z/Remove all clamped log filters from the logger.N)filters
isinstancerM   removeFilter)r   r^   s     r   rj   rj      s.    ..#f/0' $r   )r   NNr_   )"__doc__
contextlibr   typingr   r   r   rich.consoler   rich.loggingr   typing_extensionsr   r   rR   Loggerr   rd   rg   rD   contextmanagerrJ   r   r   r   r   r   rK   dictre   FilterrM   rk   rj   r/   r   r   <module>rz      s   $   % %   $ & 5S 5W^^ 5  MS$(*.N)BCcIN)NNT!N) !4KN) 	N)
 
N)b  %)*.0:0NNT!0 !4K0 	0 0l ]]LL]]  
 d;<tCS4ZO 	& &V RVQUYNNYFG$NY FG$NY 
	Y&(GNN (t (r   