
    :j&                     @   d Z ddl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 dd
lmZ  ed      Z G d de	      ZddZdefdZdefdZdee   fdZdee   fdZddedeeef   fdZdefdZdefdZddZdee   dee   ddfdZdee   ddfdZ y) a  
Resource Manager - Thread-safe Resource Management with Dependency Injection

This module provides a centralized resource manager that eliminates global state
and implements dependency injection pattern for better testability and maintainability.

Key Features:
- Thread-safe resource management without global variables
- Dependency injection pattern for better testability
- Singleton pattern for resource sharing
- Automatic initialization from configuration
- Resource lifecycle management
    N)Optional)
get_config)Config)IAuthProvider   )Agents)Credentials)
get_loggermanagerc                       e Zd ZU dZdZed    ed<    ej                         Z	ddee
   fdZeddee
   dd fd       Zedd       Zdd	Zdefd
ZdefdZdee   fdZdee   fdZddedeeef   fdZdefdZy)ResourceManagerz4Thread-safe resource manager using singleton patternN	_instanceconfigc                     |
t               }|| _        d| _        d| _        d| _        t        j                         | _        y)zInitialize resource manager with configuration

        Args:
            config: Configuration object, loads from global config if None
        NF)r   _config_credentials_agents_initialized	threadingLock_lock)selfr   s     8/root/.openclaw/workspace/harvester/tools/coordinator.py__init__zResourceManager.__init__%   s<     >\F37)-!^^%
    returnc                     | j                   :| j                  5  | j                    | |      | _         ddd       | j                   S | j                   S # 1 sw Y   | j                   S xY w)zGet singleton instance of resource manager

        Args:
            config: Configuration object for initialization

        Returns:
            ResourceManager: Singleton instance
        N)r   r   )clsr   s     r   get_instancezResourceManager.get_instance4   s[     ==  0==($'KCM0 }}s}}0 }}s   AA'c                 T    | j                   5  d| _        ddd       y# 1 sw Y   yxY w)z-Reset singleton instance for testing purposesN)r   r   )r   s    r   reset_instancezResourceManager.reset_instanceD   s'     YY 	! CM	! 	! 	!s   'c           	         | j                   5  | j                  r
	 ddd       y	 | j                  j                  j                  }t        |j                  |j                  |j                  j                        | _
        t        j                  dt        |j                         dt        |j                         d       | j                  j                  j                  }t        |      | _        t        j                  dt        |       d       d| _        	 ddd       y# t"        $ r}t        j%                  d	|         d}~ww xY w# 1 sw Y   yxY w)
/Initialize resource managers from configurationN)sessionstokensstrategyz%Initialized credentials manager with z sessions and  tokensz$Initialized User-Agent manager with  agentsTz(Failed to initialize resource managers: )r   r   r   global_configgithub_credentialsr	   r$   r%   r&   valuer   loggerinfolenuser_agentsr   r   	Exceptionerror)r   github_credsr/   es       r   
initializezResourceManager.initializeJ   s0   ZZ 	  	 	#||99LL$/)22<;N;NYeYnYnYtYt%! ;C@U@U<V;W X|2234G= #ll88DD%k2B3{CSBTT[\]$(!)	 	,  GsKL-	 	s)   EC6D%%	E.EEEEc                 `    | j                   r| j                  t        d      | j                  S )zGet credentials manager instance

        Returns:
            Credentials: Credentials manager instance

        Raises:
            RuntimeError: If not initialized
        :Resource manager not initialized. Call initialize() first.)r   r   RuntimeErrorr   s    r   get_credentialszResourceManager.get_credentialsf   s0       D$5$5$=[\\   r   c                 `    | j                   r| j                  t        d      | j                  S )zGet agents manager instance

        Returns:
            Agents: Agents manager instance

        Raises:
            RuntimeError: If not initialized
        r6   )r   r   r7   r8   s    r   
get_agentszResourceManager.get_agentss   s,       DLL$8[\\||r   c                     	 | j                         j                         S # t        $ r"}t        j	                  d|        Y d}~yd}~ww xY w)zzGet next GitHub session token

        Returns:
            Optional[str]: Session token or None if not available
        zFailed to get session: N)r9   get_sessionr0   r,   r1   r   r3   s     r   r=   zResourceManager.get_session   sF    	'')5577 	LL21#67	     	AAAc                     	 | j                         j                         S # t        $ r"}t        j	                  d|        Y d}~yd}~ww xY w)zrGet next GitHub API token

        Returns:
            Optional[str]: API token or None if not available
        zFailed to get token: N)r9   	get_tokenr0   r,   r1   r>   s     r   rA   zResourceManager.get_token   sF    	'')3355 	LL045	r?   prefer_tokenc                 @    | j                         j                  |      S )a  Get next credential with type preference

        Args:
            prefer_token: Whether to prefer API tokens over sessions

        Returns:
            tuple[str, str]: (credential_value, credential_type)

        Raises:
            RuntimeError: If no credentials available
        )r9   get_credential)r   rB   s     r   rD   zResourceManager.get_credential   s     ##%44\BBr   c                     	 | j                         j                         S # t        $ r"}t        j	                  d|        Y d}~yd}~ww xY w)zaGet random User-Agent string

        Returns:
            str: Random User-Agent string
        zFailed to get User-Agent: NzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36)r;   getr0   r,   r1   r>   s     r   get_user_agentzResourceManager.get_user_agent   sJ    	E??$((** 	ELL5aS9: E	Er?   )Nr   NT)__name__
__module____qualname____doc__r   r   __annotations__r   r   r   r   r   classmethodr   r!   r4   r	   r9   r   r;   strr=   rA   booltuplerD   rG    r   r   r   r      s    >-1Ix)*1INNE&x/ & (6"2 >O   ! !
8! !F 
Xc] 

8C= 
C4 C5c? CE Er   r   r   c                  L    t         j                         } | j                          y)r#   N)r   r   r4   )r   s    r   init_managersrU      s    **,Gr   c                  F    t         j                         j                         S )zGet credentials manager instance

    Returns:
        Credentials: Credentials manager instance

    Raises:
        RuntimeError: If not initialized
    )r   r   r9   rS   r   r   get_credentials_managerrW      s     '')99;;r   c                  F    t         j                         j                         S )zGet agents manager instance

    Returns:
        Agents: Agents manager instance

    Raises:
        RuntimeError: If not initialized
    )r   r   r;   rS   r   r   get_agents_managerrY      s     '')4466r   c                  F    t         j                         j                         S )znGet next GitHub session token

    Returns:
        Optional[str]: Session token or None if not available
    )r   r   r=   rS   r   r   r=   r=      s     '')5577r   c                  F    t         j                         j                         S )zfGet next GitHub API token

    Returns:
        Optional[str]: API token or None if not available
    )r   r   rA   rS   r   r   rA   rA      s     '')3355r   rB   c                 H    t         j                         j                  |       S )a  Get next credential with type preference

    Args:
        prefer_token: Whether to prefer API tokens over sessions

    Returns:
        tuple[str, str]: (credential_value, credential_type)

    Raises:
        RuntimeError: If no credentials available
    )r   r   rD   )rB   s    r   rD   rD      s     '')88FFr   c                  F    t         j                         j                         S )zUGet random User-Agent string

    Returns:
        str: Random User-Agent string
    )r   r   rG   rS   r   r   rG   rG      s     '')88::r   c                  j   i } 	 t         j                         }|j                  rR|j                  r|j                  j	                         | d<   |j
                  r|j
                  j	                         | d<   | S # t        $ r1}t        j                  d|        t        |      | d<   Y d}~| S d}~ww xY w)zpGet statistics from all resource managers

    Returns:
        dict: Combined statistics from all managers
    credentialsagentszFailed to get managers stats: r1   N)
r   r   r   r   	get_statsr   r0   r,   r1   rP   )statsr   r3   s      r   get_managers_statsrc      s     E	 !..0##'.';';'E'E'Gm$")//";";"=h
 L	   5aS9:QgL	 s   A2A8 8	B2&B--B2c                  f   	 t         j                         } | j                  rb| j                  r| j                  j	                          | j
                  r| j
                  j	                          t        j                  d        yy# t        $ r"}t        j                  d|        Y d}~yd}~ww xY w)z*Reset statistics for all resource managersz Failed to reset managers stats: N)
r   r   r   r   reset_statsr   r,   r-   r0   r1   )r   r3   s     r   reset_managers_statsrf     s    	=!..0##$$002++-KKDE    =7s;<<=s   BB 	B0B++B0r$   r%   c                    	 t         j                         }|j                  rr|j                  re|j                  j	                  |        |j                  j                  |       t        j                  dt        |        dt        |       d       yyy# t        $ r"}t        j                  d|        Y d}~yd}~ww xY w)zUpdate credentials in the resource manager

    Args:
        sessions: New list of session tokens
        tokens: New list of API tokens
    zUpdated credentials: z sessions, r'   zFailed to update credentials: N)r   r   r   r   update_sessionsupdate_tokensr,   r-   r.   r0   r1   )r$   r%   r   r3   s       r   update_credentialsrj   !  s    ;!..0G$8$8  00:  ..v6KK/Hk#f+V]^_ %9  ;5aS9::;s   BB 	C B;;C r/   c                 8   	 t         j                         }|j                  rK|j                  r>|j                  j	                  |        t
        j                  dt        |        d       yyy# t        $ r"}t
        j                  d|        Y d}~yd}~ww xY w)zuUpdate User-Agent strings in the resource manager

    Args:
        user_agents: New list of User-Agent strings
    zUpdated User-Agents: r(   zFailed to update User-Agents: N)
r   r   r   r   update_agentsr,   r-   r.   r0   r1   )r/   r   r3   s      r   update_user_agentsrm   2  s    ;!..0GOOOO))+6KK/K0@/AIJ %4  ;5aS9::;s   A)A. .	B7BBrH   rI   )!rM   r   typingr   r   r   config.schemasr   
core.typesr   agentr   
credentialr	   r,   r
   r   rU   rW   rY   rP   r=   rA   rQ   rR   rD   rG   dictrc   rf   listrj   rm   rS   r   r   <module>ru      s       ! $  # 	I	REm REl	< 	<	7F 	78Xc] 868C= 6G GsCx G; ;D ,=;c ;DI ;$ ;";DI ;$ ;r   