
    :jg                     N   d Z ddlZddlZddlZddlZddlmZmZ ddlm	Z	m
Z
 ddlmZmZmZmZmZ ddlmZ  e	d	       G d
 d             Ze	 G d de             Ze	 G d de             Ze	 G d de             Ze	 G d de             Ze	 G d de             Ze	 G d d             Ze	 G d d             Ze	 G d d             Ze	 G d d             Ze	 G d d             Ze	 G d  d!             Ze	 G d" d#             Ze	 G d$ d%             Z e	 G d& d'             Z!e	 G d( d)             Z"e	 G d* d+             Z#e	 G d, d-             Z$e	 G d. d/             Z%d0e!d1e"d2dfd3Z&e	 G d4 d5             Z'e	 G d6 d7             Z(e	 G d8 d9             Z)e	 G d: d;             Z*y)<z
Core Models - Fundamental Data Models

This module defines the core data models used throughout the application.
These models represent the fundamental entities and data structures that
form the foundation of the system.
    N)ABCabstractmethod)	dataclassfield)AnyDictListOptionalSet   )ErrorReasonT)frozenc                   B    e Zd ZU dZeed<    ee      Ze	eef   ed<   y)ResultStoragez)Result persistence layout for a provider.folderdefault_factory	filenamesN)
__name__
__module____qualname____doc__str__annotations__r   dictr   r        2/root/.openclaw/workspace/harvester/core/models.pyr   r      s!    3K %d ;ItCH~;r   r   c                      e Zd ZU dZ ed       Zeed<   dZeed<    ee	j                        Z
eed<   dZeed	<   d
eeef   fdZedeeef   d
d fd       Zed
eeef   fd       Zedeeef   d
dfd       ZddZd
efdZded
efdZy)ProviderTaskzBase class for all provider-specific tasks

    Abstract base class that defines the common interface and behavior
    for all tasks in the pipeline system. Each task carries provider
    identification for proper routing and result isolation.
    c                  <    t        t        j                               S N)r   uuiduuid4r   r   r   <lambda>zProviderTask.<lambda>'   s    TZZ\1B r   r   task_id provider
created_atr   attemptsreturnc                     | j                   j                  | j                  | j                  | j                  | j
                  | j                         dS )z,Serialize task to dictionary for persistence)typer&   r(   r)   r*   data)	__class__r   r&   r(   r)   r*   _serialize_dataselfs    r   to_dictzProviderTask.to_dict,   sC     NN++||//((*
 	
r   r.   c                     | j                  |       }|d   |_        |d   |_        |d   |_        |d   |_        |j                  |d          |S )z Deserialize task from dictionaryr&   r(   r)   r*   r.   )__new__r&   r(   r)   r*   _deserialize_data)clsr.   instances      r   	from_dictzProviderTask.from_dict7   s\     ;;s#	? ,"<0 ,""4<0r   c                      y)zSerialize task-specific dataNr   r1   s    r   r0   zProviderTask._serialize_dataB        	r   Nc                      y)zDeserialize task-specific dataNr   r2   r.   s     r   r6   zProviderTask._deserialize_dataG   r;   r   c                 .    | xj                   dz  c_         y)zIncrement attempt counterr   N)r*   r1   s    r   increment_attemptszProviderTask.increment_attemptsL   s    r   c                 D    t        j                          | j                  z
  S )zGet task age in seconds)timer)   r1   s    r   get_age_secondszProviderTask.get_age_secondsP   s    yy{T__,,r   max_age_secondsc                 (    | j                         |kD  S )z&Check if task has exceeded maximum age)rB   )r2   rC   s     r   
is_expiredzProviderTask.is_expiredT   s    ##%77r   r+   N)r   r   r   r   r   r&   r   r   r(   rA   r)   floatr*   intr   r   r3   classmethodr9   r   r0   r6   r?   rB   boolrE   r   r   r   r    r       s     )BCGSCHcdii8J8Hc	
c3h 	
 T#s(^    c3h   d38n   - -8% 8D 8r   r    c                       e Zd ZU dZdZeed<   dZeed<   dZe	ed<   dZ
eed<   dZeed	<   dZeed
<   dZeed<   deeef   fdZdeeef   ddfdZdefdZy)
SearchTaskz0Task for searching GitHub for potential API keysr'   queryregexr   pageFuse_apiaddress_patternendpoint_patternmodel_patternr+   c                     | j                   | j                  | j                  | j                  | j                  | j
                  | j                  dS )NrM   rN   rO   rP   rQ   rR   rS   rU   r1   s    r   r0   zSearchTask._serialize_datae   sC    ZZZZII||#33 $ 5 5!//
 	
r   r.   Nc                    |d   | _         |j                  dd      | _        |d   | _        |j                  dd      | _        |j                  dd      | _        |j                  dd      | _        |j                  d	d      | _        y )
NrM   rN   r'   rO   rP   FrQ   rR   rS   )rM   getrN   rO   rP   rQ   rR   rS   r=   s     r   r6   zSearchTask._deserialize_datap   sw    ']
XXgr*
L	xx	51#xx(92> $);R @!XXor:r   c                 6    | j                   xs | j                  S )Get the primary search term)rM   rN   r1   s    r   get_search_termzSearchTask.get_search_termy   s    zz'TZZ'r   )r   r   r   r   rM   r   r   rN   rO   rH   rP   rJ   rQ   rR   rS   r   r   r0   r6   rZ   r   r   r   rL   rL   Y   s    :E3OE3OD#MGTOScM3	
c3h 	
;d38n ; ;( (r   rL   c                       e Zd ZU dZdZeed<   dZeed<   dZe	ed<   dZ
eed<   dZeed<   dZeed	<   d
eeef   fdZdeeef   d
dfdZy)AcquisitionTaskz0Task for acquiring API keys from discovered URLsr'   urlkey_pattern   retriesrQ   rR   rS   r+   c                     | j                   | j                  | j                  | j                  | j                  | j
                  dS )Nr]   r^   r`   rQ   rR   rS   rb   r1   s    r   r0   zAcquisitionTask._serialize_data   s>    88++||#33 $ 5 5!//
 	
r   r.   Nc                     |d   | _         |d   | _        |j                  dd      | _        |j                  dd      | _        |j                  dd      | _        |j                  dd      | _        y )	Nr]   r^   r`   r_   rQ   r'   rR   rS   )r]   r^   rW   r`   rQ   rR   rS   r=   s     r   r6   z!AcquisitionTask._deserialize_data   sg    ;.xx	1-#xx(92> $);R @!XXor:r   )r   r   r   r   r]   r   r   r^   r`   rH   rQ   rR   rS   r   r   r0   r6   r   r   r   r\   r\   ~   sp    :CMKGSOScM3
c3h 
;d38n ; ;r   r\   c                   |    e Zd ZU dZ ed       Zded<   dZeed<   dZ	e
ed	<   d
eeef   fdZdeeef   d
dfdZy)	CheckTaskzTask for validating API keysc                      t               S r"   Servicer   r   r   r%   zCheckTask.<lambda>       wy r   r   rh   servicer'   
custom_urlr_   r`   r+   c                 f    | j                   j                         | j                  | j                  dS N)rj   rk   r`   rj   r3   rk   r`   r1   s    r   r0   zCheckTask._serialize_data   *    ||++-//||
 	
r   r.   Nc                     t         j                  |d         | _        |j                  dd      | _        |j                  dd      | _        y Nrj   rk   r'   r`   r_   rh   r9   rj   rW   rk   r`   r=   s     r   r6   zCheckTask._deserialize_data   <    ((i9((<4xx	1-r   r   r   r   r   r   rj   r   rk   r   r`   rH   r   r   r0   r6   r   r   r   re   re      sX    &/@AGYAJGS
c3h 
.d38n . .r   re   c                   |    e Zd ZU dZ ed       Zded<   dZeed<   dZ	e
ed	<   d
eeef   fdZdeeef   d
dfdZy)InspectTaskz$Task for inspecting API capabilitiesc                      t               S r"   rg   r   r   r   r%   zInspectTask.<lambda>   ri   r   r   rh   rj   r'   rk   r_   r`   r+   c                 f    | j                   j                         | j                  | j                  dS rm   rn   r1   s    r   r0   zInspectTask._serialize_data   ro   r   r.   Nc                     t         j                  |d         | _        |j                  dd      | _        |j                  dd      | _        y rq   rr   r=   s     r   r6   zInspectTask._deserialize_data   rs   r   rt   r   r   r   rv   rv      sX    ./@AGYAJGS
c3h 
.d38n . .r   rv   c                       e Zd ZU dZdZeed<   dZeed<   dZ	e
ed<   dZeed	<   d
Zeed<   dZeed<   dZeed<   d ZdedefdZy)RateLimitConfigz#Unified rate limiting configuration      ?	base_rate   burst_limitTadaptive      ?backoff_factor皙?recovery_factorg       @max_rate_multiplier皙?min_rate_multiplierc                     | j                   dk  rt        d      | j                  dk  rt        d      d| j                  cxk  rdk  st        d       t        d      | j                  dk  rt        d      y)z!Validate rate limit configurationr   zbase_rate must be positivezburst_limit must be positiver   z&backoff_factor must be between 0 and 1zrecovery_factor must be > 1N)r}   
ValueErrorr   r   r   r1   s    r   __post_init__zRateLimitConfig.__post_init__   s    >>Q9::q ;<<D''+!+EFF ,EFF1$:;; %r   success_ratior+   c                     | j                   s| j                  S |dkD  r!t        | j                  | j                        }n(|dk  r!t        | j                  | j                        }nd}| j                  |z  S )z.Calculate adjusted rate based on success ratiog?r   r|   )r   r}   minr   r   maxr   r   )r2   r   
multipliers      r   calculate_adjusted_ratez'RateLimitConfig.calculate_adjusted_rate   sg    }}>>!3T55t7K7KLJS T55t7J7JKJJ~~
**r   N)r   r   r   r   r}   rG   r   r   rH   r   rJ   r   r   r   r   r   r   r   r   r   r{   r{      se    -IuKHdNE OU !$$!$$	<+U +u +r   r{   c                   N    e Zd ZU dZeed<   eed<   eed<   eed<   dZee   ed<   y)LogFileInfozInformation about a log filefilenamesizemodifiedpathNerror)r   r   r   r   r   r   r   r
   r   r   r   r   r      s'    &M
IM
IE8C=r   r   c                   V    e Zd ZU dZeed<    ee      Ze	e
ef   ed<   dZee
   ed<   y)LoggingStatszLogging system statisticsactive_loggersr   	log_filesNlogs_directory)r   r   r   r   rH   r   r   r   r   r   r   r   r   r
   r   r   r   r   r      s2    #(-d(CItC$%C$(NHSM(r   r   c                       e Zd ZU dZ ee      Zed   ed<    ee      Z	ee
   ed<    ee      Zed   ed<   defdZdefd	Zdefd
ZdefdZded   fdZde
fdZy)RecoveredTasksz#Recovery data for a single providerr   rh   checkacquisitioninvalidr+   c                 d    t        | j                  xs | j                  xs | j                        S )z Check if any tasks need recovery)rJ   r   r   r   r1   s    r   	has_taskszRecoveredTasks.has_tasks	  s%    DJJB$"2"2BdllCCr   c                 ,    t        | j                        S )zGet number of check tasks)lenr   r1   s    r   check_countzRecoveredTasks.check_count  s    4::r   c                 ,    t        | j                        S )zGet number of acquisition tasks)r   r   r1   s    r   acquisition_countz RecoveredTasks.acquisition_count  s    4##$$r   c                 ,    t        | j                        S )zGet number of invalid keys)r   r   r1   s    r   invalid_countzRecoveredTasks.invalid_count  s    4<<  r   c                 ^    | j                   D cg c]  }|| j                  vs| c}S c c}w )z(Get check tasks filtered by invalid keys)r   r   )r2   tasks     r   valid_check_tasksz RecoveredTasks.valid_check_tasks  s%    !%Ht4<</GHHHs   **c                 l    d| j                          d| j                          d| j                          S )zGet task summary stringzcheck: z, acquisition: z, invalid: )r   r   r   r1   s    r   summaryzRecoveredTasks.summary  s;    ))+,OD<R<R<T;UU`aeasasau`vwwr   N)r   r   r   r   r   listr   r	   r   r   r   setr   r   rJ   r   rH   r   r   r   r   r   r   r   r   r   r     s    -"48E4	?8"48Kc8#C8GS^8D4 DS %3 %!s !I4	? Ix xr   r   c                       e Zd ZU dZ ee      Zeee	f   e
d<   dede	ddfdZdede	fd	Zdefd
ZdefdZdefdZdefdZdefdZdefdZy)AllRecoveredTaskszRecovery data for all providersr   	providersnametasksr+   Nc                 D    |j                         r|| j                  |<   yy)zAdd provider tasks if any existN)r   r   )r2   r   r   s      r   add_providerzAllRecoveredTasks.add_provider(  s    ??#(DNN4  r   c                 J    | j                   j                  |t                     S )zGet provider tasks safely)r   rW   r   )r2   r   s     r   get_providerzAllRecoveredTasks.get_provider-  s    ~~!!$(899r   c                 ,    t        | j                        S )z!Check if any providers have tasks)rJ   r   r1   s    r   has_providerszAllRecoveredTasks.has_providers1  s    DNN##r   c                 ,    t        | j                        S )z"Get number of providers with tasks)r   r   r1   s    r   provider_countz AllRecoveredTasks.provider_count5  s    4>>""r   c                 V    t        d | j                  j                         D              S )z*Get total check tasks across all providersc              3   <   K   | ]  }|j                           y wr"   )r   .0r   s     r   	<genexpr>z6AllRecoveredTasks.total_check_tasks.<locals>.<genexpr>;  s     L55$$&L   sumr   valuesr1   s    r   total_check_tasksz#AllRecoveredTasks.total_check_tasks9  s     LDNN4I4I4KLLLr   c                 V    t        d | j                  j                         D              S )z0Get total acquisition tasks across all providersc              3   <   K   | ]  }|j                           y wr"   )r   r   s     r   r   z<AllRecoveredTasks.total_acquisition_tasks.<locals>.<genexpr>?  s     R5**,Rr   r   r1   s    r   total_acquisition_tasksz)AllRecoveredTasks.total_acquisition_tasks=  s     R$..:O:O:QRRRr   c                 V    t        d | j                  j                         D              S )z+Get total invalid keys across all providersc              3   <   K   | ]  }|j                           y wr"   )r   r   s     r   r   z7AllRecoveredTasks.total_invalid_keys.<locals>.<genexpr>C  s     NU5&&(Nr   r   r1   s    r   total_invalid_keysz$AllRecoveredTasks.total_invalid_keysA  s     Ndnn6K6K6MNNNr   c           	          | j                         syd| j                          d| j                          d| j                          d| j	                          S )z"Get summary of all recovered taskszNo tasks recoveredzProviders: z	, Check: z, Acquisition: z, Invalid: )r   r   r   r   r   r1   s    r   r   zAllRecoveredTasks.summaryE  sj    !!#' $--/0 1,,./ 0 88:; <//124	
r   )r   r   r   r   r   r   r   r   r   r   r   r   r   rJ   r   rH   r   r   r   r   r   r   r   r   r   r   "  s    )+0+FItC'(F) )^ ) )
: : :$t $# #M3 MS SOC O

 

r   r   c                   n    e Zd ZU dZ ee      Zeee	e
   f   ed<   dZee   ed<   dZeed<   dZeed<   y)	TaskRecoveryInfozInformation for task recoveryr   queue_tasksNresult_tasksr   total_queue_taskstotal_result_tasks)r   r   r   r   r   r   r   r   r   r	   r    r   r   r
   r   r   rH   r   r   r   r   r   r   R  sI    '16t1LKc4--.L04L(,-4sr   r   c                       e Zd ZU dZdZeed<   dZeed<   dZeed<   dZ	eed<   de
fdZd	edefd
ZdefdZdefdZdeeef   fdZedeeef   dd fd       ZdefdZededed    fd       Zy)rh   zCore service data model representing an API service endpoint

    This is the fundamental data structure representing a discovered
    API service with its authentication and endpoint information.
    r'   addressendpointkeymodelr+   c                 p    t        | j                  | j                  | j                  | j                  f      S )z2Hash based on all fields for use in sets and dicts)hashr   r   r   r   r1   s    r   __hash__zService.__hash__p  s&    T\\4==$((DJJGHHr   otherc                     t        |t              sy| j                  |j                  k(  xrO | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j
                  |j
                  k(  S )z'Equality comparison based on all fieldsF)
isinstancerh   r   r   r   r   r2   r   s     r   __eq__zService.__eq__t  sg    %) LLEMM) */*EII%* 

ekk)		
r   c                 d    t        | j                  xr | j                  xs | j                        S )z1Check if service has minimum required information)rJ   r   r   r   r1   s    r   is_validzService.is_valid  s#    DHH@$,,"?$--AAr   c                 Z    | j                    d| j                   d| j                  dd  dS )z&Get unique identifier for this service:N   z...)r   r   r   r1   s    r   get_identifierzService.get_identifier  s-    ,,qq"1cBBr   c                 `    | j                   | j                  | j                  | j                  dS )'Convert to dictionary for serializationr   r   r   r   r   r1   s    r   r3   zService.to_dict  s*     ||88ZZ	
 	
r   r.   c           	           | |j                  dd      |j                  dd      |j                  dd      |j                  dd            S )zCreate Service from dictionaryr   r'   r   r   r   r   )rW   )r7   r.   s     r   r9   zService.from_dict  sI     HHY+XXj"-#((7B'	
 	
r   c                 p   | j                   s$| j                  s| j                  s| j                  S i }| j                   r| j                   |d<   | j                  r| j                  |d<   | j                  r| j                  |d<   | j                  r| j                  |d<   |sdS t	        j
                  |      S )Nr   r   r   r   r'   )r   r   r   r   jsondumpsr=   s     r   	serializezService.serialize  s    ||DMM$**88O<<"llDO==#}}D88((DK:: JJDMr34::d#33r   textc           	          |sy 	 t        j                  |      } | |j                  dd      |j                  dd      |j                  dd      |j                  dd            S # t        $ r  | |      cY S w xY w)Nr   r'   r   r   r   r   )r   )r   loadsrW   	Exception)r7   r   items      r   deserializezService.deserialize  s{    		!::d#DB/*b1HHUB'hhw+	   	!4= 	!s   A A& &A;:A;N)r   r   r   r   r   r   r   r   r   r   rH   r   objectrJ   r   r   r   r   r3   rI   r9   r   r
   r   r   r   r   rh   rh   \  s     GS Hc CM E3OI# I

F 

t 

B$ BC C
c3h 
 
T#s(^ 
	 
 
43 4  !s !x	': ! !r   rh   c                      e Zd ZU dZdZeed<   ej                  Z	eed<   dZ
eed<   dZeed<   d	Zee   ed
<   edefd       Zedefd       Zeddededd fd       Ze	 ddededed
ee   dd f
d       ZdefdZdeeef   fdZy	)CheckResultzResult of API token validation check

    Represents the outcome of validating an API token against a service,
    including success status, error information, and additional metadata.
    F	availableerror_reasonr'   message        response_timeNstatus_coder+   c                     | j                   S )z.Alias for available for backward compatibility)r   r1   s    r   okzCheckResult.ok  s     ~~r   c                     | j                   S )z1Alias for error_reason for backward compatibility)r   r1   s    r   reasonzCheckResult.reason  s        r   c                 6     | dt         j                  ||      S )z Create a successful check resultT)r   r   r   r   )r   UNKNOWN)r7   r   r   s      r   successzCheckResult.success  s#     $,,'	
 	
r   r  c                 8     | d||xs |j                   ||      S )zCreate a failed check resultFr   r   r   r   r   )value)r7   r  r   r   r   s        r   failzCheckResult.fail  s)    
 +v||'#
 	
r   c                 6    | j                   j                         S )zCheck if the error is retryable)r   is_retryabler1   s    r   r  zCheckResult.is_retryable  s      --//r   c                     | j                   | j                  j                  | j                  | j                  | j
                  dS )r   r  )r   r   r	  r   r   r   r1   s    r   r3   zCheckResult.to_dict  s=      --33||!//++
 	
r   )zToken is validr   )r'   r   N)r   r   r   r   r   rJ   r   r   r  r   r   r   r   rG   r   r
   rH   propertyr  r  rI   r  r
  r  r   r   r3   r   r   r   r   r     s    It + 3 3L+3GSM5!%K#%D   ! ! ! 
c 
U 
Ub 
 
 nr

 

+.

DI

^fgj^k

	

 

0d 0
c3h 
r   r   c                   `    e Zd ZU dZdZeed<   dZeed<   dZeed<   dZ	eed<   de
eef   fdZy	)
Patternsz)Extraction patterns for keys and metadatar'   r^   rQ   rR   rS   r+   c                 `    | j                   | j                  | j                  | j                  dS )zConvert to dictionaryr^   rQ   rR   rS   r  r1   s    r   r3   zPatterns.to_dict  s2      ++#33 $ 5 5!//	
 	
r   N)r   r   r   r   r^   r   r   rQ   rR   rS   r   r3   r   r   r   r  r    sB    3KOScM3
c3h 
r   r  c                       e Zd ZU dZdZee   ed<    ee	      Z
e	ed<   dZeed<   dZeed	<   d
 ZdefdZdefdZdefdZdedefdZdeeef   fdZedeeef   dd fd       Zy)	ConditionzSearch condition with complete pattern configuration

    Defines search parameters and extraction patterns used to discover
    API keys and services for a specific provider.
    NrM   r   patternsr'   descriptionTenabledc                 `    | j                   s"| j                  j                  st        d      yy)z'Validate condition after initializationz/Condition must have either query or key_patternN)rM   r  r^   r   r1   s    r   r   zCondition.__post_init__  s(    zz$--";";NOO #<zr   r+   c                 R    | j                   xs | j                  j                  xs dS )rY   r'   )rM   r  r^   r1   s    r   rZ   zCondition.get_search_term  s     zz<T]]66<"<r   c                 P    | j                   xr t        | j                               S )z'Check if condition is valid and enabled)r  rJ   rZ   r1   s    r   r   zCondition.is_valid#  s    ||<T%9%9%; <<r   c                 X    t        | j                  | j                  j                  f      S )z:Hash based on query and patterns for use in sets and dicts)r   rM   r  r^   r1   s    r   r   zCondition.__hash__'  s     TZZ!:!:;<<r   r   c                     t        |t              sy| j                  |j                  k(  xr | j                  |j                  k(  S )z/Equality comparison based on query and patternsF)r   r  rM   r  r   s     r   r   zCondition.__eq__+  s4    %+zzU[[(LT]]enn-LLr   c                 |    | j                   | j                  j                         | j                  | j                  dS )r   rM   r  r  r  )rM   r  r3   r  r  r1   s    r   r3   zCondition.to_dict1  s5     ZZ--/++||	
 	
r   r.   c           	          |j                  di       }|rt        di |n	t               } | |j                  d      ||j                  dd      |j                  dd            S )	z Create Condition from dictionaryr  rM   r  r'   r  Tr  r   )rW   r  )r7   r.   paramsr  s       r   r9   zCondition.from_dict:  s_     *b))/8%f%XZ((7#3HHY-	
 	
r   )r   r   r   r   rM   r
   r   r   r   r  r  r  r  rJ   r   rZ   r   rH   r   r   r   r   r   r3   rI   r9   r   r   r   r  r    s      E8C=x8Hh8KGTP
= ==$ ==# =MF Mt M
c3h 
 

T#s(^ 

 

 

r   r  c                   x    e Zd ZdZddededefdZddedefdZddedefd	Z	d
eddfdZ
ddZdeeef   fdZy)TokenBucketzToken bucket for rate limiting with burst support

    Implements the token bucket algorithm for rate limiting with
    adaptive rate adjustment based on success/failure feedback.
    rateburstr   c                    || _         || _        || _        t        |      | _        t        j
                         | _        t        j                         | _	        || _
        d| _        d| _        t        j
                         | _        y)zInitialize token bucket

        Args:
            rate: Tokens per second
            burst: Maximum tokens (bucket capacity)
            adaptive: Enable adaptive rate adjustment
        r   N)r#  r$  r   rG   tokensrA   last_update	threadingLocklockoriginal_rateconsecutive_successconsecutive_failureslast_adjustment)r2   r#  r$  r   s       r   __init__zTokenBucket.__init__P  sh     	
 El99;NN$	 "#$ $%!#yy{r   r&  r+   c                 b   | j                   5  t        j                         }|| j                  z
  }t        | j                  | j
                  || j                  z  z         | _        || _        | j
                  |k\  r| xj
                  |z  c_        	 ddd       y	 ddd       y# 1 sw Y   yxY w)zAcquire tokens from bucket

        Args:
            tokens: Number of tokens to acquire

        Returns:
            bool: True if tokens were acquired, False if rate limited
        NTF)r*  rA   r'  r   r$  r&  r#  )r2   r&  nowelapseds       r   acquirezTokenBucket.acquiree  s     YY 	))+C D,,,Gdjj$++$))8K*KLDK"D {{f$v%	 	 	 	 	s   BB%B%%B.c                     | j                   5  | j                  |k\  r
	 ddd       y|| j                  z
  }|| j                  z  cddd       S # 1 sw Y   yxY w)zCalculate wait time needed to acquire tokens

        Args:
            tokens: Number of tokens needed

        Returns:
            float: Wait time in seconds
        Nr   )r*  r&  r#  )r2   r&  neededs      r   	wait_timezTokenBucket.wait_time}  sU     YY 	&{{f$	& 	& dkk)FDII%	& 	& 	&s   AAAr  Nc                    | j                   sy| j                  5  |rd| xj                  dz  c_        d| _        | j                  dk\  r| j                  | j
                  dz  k  rz| xj                  dz  c_        d| _        n]| xj                  dz  c_        d| _        | j                  dk\  r2t        | j
                  dz  | j                  d	z        | _        d| _        ddd       y# 1 sw Y   yxY w)
zAdjust rate based on success/failure feedback

        Args:
            success: Whether the operation was successful
        Nr   r   
      r   r_   r   r   )r   r*  r,  r-  r#  r+  r   )r2   r  s     r   adjust_ratezTokenBucket.adjust_rate  s     }}YY 	2((A-(,-) ++r1dii$BTBTWXBX6XII$I/0D,))Q.)+,( ,,1 #D$6$6$<dii#o NDI01D-!	2 	2 	2s   CC''C0c                    | j                   5  t        | j                        | _        | j                  | _        d| _        d| _        t        j                         | _	        t        j                         | _
        ddd       y# 1 sw Y   yxY w)zReset bucket to initial stater   N)r*  rG   r$  r&  r+  r#  r,  r-  rA   r'  r.  r1   s    r   resetzTokenBucket.reset  sg    YY 	/

+DK**DI'(D$()D%#yy{D#'99;D 	/ 	/ 	/s   A,BBc           
         | j                   5  t        j                         }|| j                  z
  }t        | j                  | j
                  || j                  z  z         }| j                  t        | j                        || j                  dkD  r| j                  |z
  | j                  z  ndt        | j                        t        | j                        | j                  rdnd| j                  dcddd       S # 1 sw Y   yxY w)zGet current bucket statistics

        Returns:
            Dict[str, float]: Statistics including rate, tokens, burst, utilization
        r   r   r|   )r#  r$  r&  utilizationr,  r-  r   r+  N)r*  rA   r'  r   r$  r&  r#  rG   r,  r-  r   r+  )r2   r1  r2  current_tokenss       r   	get_statszTokenBucket.get_stats  s     YY 	))+CD,,,G T[[7TYY;N-NON 		tzz*(MQZZZ[^

^ ;tzzIad',T-E-E'F(-d.G.G(H#'==Cc!%!3!3		 	 	s   C$C;;D)T)r   rF   )r   r   r   r   rG   rH   rJ   r/  r3  r6  r:  r<  r   r   r@  r   r   r   r"  r"  H  st    +U +3 +$ +*c $ 0& &E & 24 2D 26/4U
+ r   r"  c                   f    e Zd ZU dZdZeed<   dZeed<   dZeed<   dZ	eed<   dZ
eed<   d	 ZddZy
)ResourceUsagez Type-safe resource usage metricsr   cpu_percent	memory_mbdisk_mb
network_kbr   active_connectionsc                 $    | j                          y)z,Validate resource usage after initializationN)validater1   s    r   r   zResourceUsage.__post_init__  s    r   Nc                    | j                   dk  rt        d      | j                  dk  rt        d      | j                  dk  rt        d      | j                  dk  rt        d      | j
                  dk  rt        d      y)zValidate resource usage metricsr   zcpu_percent cannot be negativezmemory_mb cannot be negativezdisk_mb cannot be negativeznetwork_kb cannot be negativez%active_connections cannot be negativeN)rC  r   rD  rE  rF  rG  r1   s    r   rI  zResourceUsage.validate  s    a=>>>>A;<<<<!9::??Q<==""Q&DEE 'r   rF   )r   r   r   r   rC  rG   r   rD  rE  rF  rG  rH   r   rI  r   r   r   rB  rB    sC    *KIuGUJFr   rB  c                       e Zd ZU dZeed<   eed<   dZeed<   dZe	ed<   dZ
eed	<   dZeed
<   ede	fd       Zdde	defdZy)HealthStatuszType-safe health statushealthy	componentr'   r   r   
last_checkr   r   error_countr+   c                 T    | j                   dk(  ry| j                  | j                   z  S )zCalculate error rater   r   )r   rP  r1   s    r   
error_ratezHealthStatus.error_rate  s,     q $"2"222r   max_error_ratec                      | j                   |kD  S )z'Check if component is in degraded state)rR  )r2   rS  s     r   is_degradedzHealthStatus.is_degraded  s    //r   N)r   )r   r   r   r   rJ   r   r   r   rO  rG   r   rH   rP  r  rR  rU  r   r   r   rL  rL    sc    !MNGSJKK3E 3 30% 0$ 0r   rL  parent	conditionr+   c                    | r"t        | t              r|rt        |t              sy|j                  j                  s| j                  |j                  _        |j                  j
                  s| j
                  |j                  _        |j                  j                  s| j                  |j                  _        |j                  j                  s| j                  |j                  _        yy)z8Inherit global patterns to condition if fields are emptyN)r   r  r  r  r^   rQ   rR   rS   )rV  rW  s     r   inherit_patternsrY    s    FH5YjYbdmNn)))/););	&---3-C-C	*...4.E.E	++++1+?+?	( ,r   c                   `    e Zd ZU dZ ee      Zee   e	d<   dZ
ee   e	d<   defdZdefdZy)	SearchTaskResultz!Result from search task executionr   linksNtotalr+   c                 2    t        | j                        dkD  S )zCheck if search was successfulr   )r   r\  r1   s    r   is_successfulzSearchTaskResult.is_successful  s    4::""r   c                 t    dt        | j                         d| j                  rd| j                   z   S dz   S )Get result summaryFound z linksz out of r'   )r   r\  r]  r1   s    r   get_summaryzSearchTaskResult.get_summary  s9    DJJ(/djjXdjj\3Jaa^`aar   )r   r   r   r   r   r   r\  r	   r   r   r]  r
   rH   rJ   r_  rc  r   r   r   r[  r[    s@    +T2E492E8C=#t #bS br   r[  c                   L    e Zd ZU dZ ee      Zed   ed<   de	fdZ
defdZy)	AcquisitionTaskResultz&Result from acquisition task executionr   rh   servicesr+   c                 2    t        | j                        dkD  S )z"Check if collection was successfulr   r   rf  r1   s    r   r_  z#AcquisitionTaskResult.is_successful#  s    4==!A%%r   c                 4    dt        | j                         dS )ra  z
Collected z	 servicesrh  r1   s    r   rc  z!AcquisitionTaskResult.get_summary'  s    C./y99r   N)r   r   r   r   r   r   rf  r	   r   rJ   r_  r   rc  r   r   r   re  re    s0    0 %d ;Hd9o;&t &:S :r   re  c                       e Zd ZU dZ ee      Zed   ed<    ee      Z	ed   ed<    ee      Z
ed   ed<    ee      Zed   ed<   defd	Zdefd
ZdefdZy)CheckTaskResultz Result from check task executionr   rh   validr   no_quota
wait_checkr+   c                     t        | j                        t        | j                        z   t        | j                        z   t        | j                        z   S )z"Get total number of keys processed)r   rl  r   rm  rn  r1   s    r   countzCheckTaskResult.count5  s:    4::T\\!22S5GG#dooJ^^^r   c                 `    | j                         }|dkD  rt        | j                        |z  S dS )z"Get success rate of key validationr   r   )rp  r   rl  )r2   r]  s     r   get_success_ratez CheckTaskResult.get_success_rate9  s+    

*/!)s4::&<<r   c                     d| j                          dt        | j                         dt        | j                         dS )ra  zChecked z keys: z valid, z invalid)rp  r   rl  r   r1   s    r   rc  zCheckTaskResult.get_summary>  s7    $**,ws4::.?xDLLHYGZZbccr   N)r   r   r   r   r   r   rl  r	   r   r   rm  rn  rH   rp  rG   rr  r   rc  r   r   r   rk  rk  ,  sy    *"48E4	?8$T:GT)_: %d ;Hd9o;"'"=JY=_s _=% =
dS dr   rk  c                   L    e Zd ZU dZ ee      Zee   e	d<   de
fdZdefdZy)InspectTaskResultz"Result from inspect task executionr   modelsr+   c                 2    t        | j                        dkD  S )z&Check if models listing was successfulr   r   rv  r1   s    r   r_  zInspectTaskResult.is_successfulI  s    4;;!##r   c                 4    dt        | j                         dS )ra  rb  z modelsrx  r1   s    r   rc  zInspectTaskResult.get_summaryM  s    DKK()11r   N)r   r   r   r   r   r   rv  r	   r   r   rJ   r_  rc  r   r   r   ru  ru  C  s0    ,d3FDI3$t $2S 2r   ru  )+r   r   r(  rA   r#   abcr   r   dataclassesr   r   typingr   r   r	   r
   r   enumsr   r   r    rL   r\   re   rv   r{   r   r   r   r   r   rh   r   r  r  r"  rB  rL  rY  r[  re  rk  ru  r   r   r   <module>r~     s       # ( 1 1  $< < < 783 78 78t !( !( !(H ;l ; ;: . . .( ., . .( "+ "+ "+L       ) ) ) x x x@ ,
 ,
 ,
^       \! \! \!~ :
 :
 :
z 
 
 
$ 7
 7
 7
t ~ ~ ~B F F F6 0 0 0,@X @) @ @  b b b : : : d d d, 2 2 2r   