
    :j5                         d Z ddlZddlmZmZ ddlZddlmZmZm	Z	m
Z
 ddlmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZ  G d	 d
      Zy)a8  
Configuration Loader

This module provides unified YAML configuration loading functionality.
It replaces the scattered configuration loading logic throughout the application.

Key Features:
- Single YAML file loading
- Default configuration generation
- Type-safe configuration parsing
- Validation integration
    N)AnyDict)	ConditionPatternsRateLimitConfiginherit_patterns   )get_default_config)	ApiConfigConfigCredentialsConfigDisplayConfigDisplayContextConfigGlobalConfigLoadBalanceStrategyMonitoringConfigPersistenceConfigPipelineConfigStageConfigStorageConfig
TaskConfigWorkerManagerConfig)ConfigValidatorc                   @   e Zd ZdZddefdZdefdZdeee	f   defdZ
deee	f   defdZed	edefd
       Zdeee	f   defdZdeee	f   defdZdeee	f   defdZdeee	f   defdZdeee	f   defdZdeee	f   deeef   fdZdeee	f   defdZddZy)ConfigLoaderz+Unified configuration loader for YAML filesconfig_filec                 0    || _         t               | _        y)zkInitialize configuration loader

        Args:
            config_file: Path to configuration file
        N)r   r   	validator)selfr   s     4/root/.openclaw/workspace/harvester/config/loader.py__init__zConfigLoader.__init__.   s     '(*    returnc                    t         j                  j                  | j                        s| j	                          	 t        | j                  d      5 }t        j                  |      xs i }ddd       | j                        }| j                  j                  |       |S # 1 sw Y   7xY w# t        $ r }t        d| j                   d|       d}~ww xY w)zzLoad configuration from YAML file

        Returns:
            Config: Loaded and validated configuration object
        utf-8encodingNzFailed to load config file z: )ospathexistsr   _create_default_configopenyaml	safe_load_parse_configr   validate	ExceptionRuntimeError)r   fdataconfiges        r    loadzConfigLoader.load7   s     ww~~d../'')		Vd&&9 /Q~~a(.B/ ''-FNN##F+M/ /  	V!<T=M=M<NbQRPSTUU	Vs/   B. B",5B. "B+'B. .	C7CCr4   c                    t               }d|v r| j                  |d         |_        d|v r| j                  |d         |_        d|v r| j                  |d         |_        d|v r| j                  |d         |_        d|v r| j                  |d         |_
        d|v r| j                  |d         |_        d|v r| j                  |d         |_        d|v r'|d   D cg c]  }| j                  |       c}|_        |S c c}w )	zParse YAML data into Config object

        Args:
            data: Raw YAML data

        Returns:
            Config: Parsed configuration object
        globalpipeline
monitoringdisplaypersistenceworker
ratelimitstasks)r   _parse_global_configglobal_config_parse_pipeline_configr:   _parse_monitoring_configr;   _parse_display_configr<   _parse_persistence_configr=   _parse_worker_manager_configr>   _parse_rate_limitsr?   _parse_task_configr@   )r   r4   r5   	task_datas       r    r/   zConfigLoader._parse_configK   s*     t#'#<#<T(^#LF  "99$z:JKFO 4 $ = =d<>P QF !77YHFN D !%!?!?]@S!TF t ==d8nMFM 4 $ 7 7\8J KF d?PTU\P]^9D33I>^FL _s   !Dc           
         |j                  di       }|j                  d      xs g }|j                  d      xs g }|D cg c]  }|s|j                  d      r| }}|D cg c]  }|s|j                  d      r| }}|s|st        j                  d      }	|	r=|	j	                  d      D cg c]#  }|j                         s|j                         % }}t        j                  d      }
|
r=|
j	                  d      D cg c]#  }|j                         s|j                         % }}t        ||t        |j                  dd	            
      }|j                  d      xs | j                  dd      }t        t        j                  j                  |j                  dd            |j                  dd      |||j                  dg             S c c}w c c}w c c}w c c}w )zParse global configuration section

        Args:
            data: Global configuration data

        Returns:
            GlobalConfig: Parsed global configuration
        github_credentialssessionstokensyour_GITHUB_SESSIONS,GITHUB_TOKENSstrategyround_robin)rM   rN   rS   proxyhttps_proxy
http_proxy	workspacez./datamax_retries_requeued   user_agents)rX   rY   rU   rL   r[   )get
startswithr(   getenvsplitstripr   r   _get_env_ignore_caser   r)   abspath)r   r4   credentials_datarM   rN   svalid_sessionstvalid_tokensgithub_sessionsgithub_tokenscredentialsrU   s                r    rA   z!ConfigLoader._parse_global_configx   s     88$8"= $''
39r!%%h/52 &.Q1<<;P!QQ#)MaQq||G7LMM l ii(9:O5D5J5J35O!]STSZSZS\!'')!]!] IIo6M3@3F3Fs3KYaqwwy	YY'#()9)=)=j-)XY
 ![T%>%>}l%[ggoodhh{H&EF!%*@!!D*3
 	
/ RM "^
  Zs<   G	GG%G-G?G3G$	G$G)G)namesc                  B   t         j                  j                         D ci c]  \  }}|j                         | }}}| D ]U  }|j	                  |j                         d      }t        |t              s4|j                         sE|j                         c S  yc c}}w )zERead the first non-empty environment variable by name, ignoring case. )r(   environitemslowerr\   
isinstancestrr`   )rk   keyvalueenvnames        r    ra   z!ConfigLoader._get_env_ignore_case   s     57JJ4D4D4FGjc5syy{E!GG 	%DGGDJJL"-E%%%++-{{}$	%  Hs   Bc                 \    t        |j                  di       |j                  di             S )zParse pipeline configuration section

        Args:
            data: Pipeline configuration data

        Returns:
            PipelineConfig: Parsed pipeline configuration
        threadsqueue_sizes)rx   ry   )r   r\   r   r4   s     r    rC   z#ConfigLoader._parse_pipeline_config   s)     dhhy"&=488TaceKfggr"   c           
          t        |j                  dd      |j                  dd      |j                  dd      |j                  dd      |j                  d	d
            S )zParse system monitoring configuration section

        Args:
            data: Monitoring configuration data

        Returns:
            MonitoringConfig: Parsed monitoring configuration
        update_interval       @error_threshold皙?queue_thresholdi  memory_thresholdi   @response_threshold      @)r|   r~   r   r   r   )r   r\   rz   s     r    rD   z%ConfigLoader._parse_monitoring_config   s\       HH%6< HH%6< HH%6=!XX&8*E#xx(<cB
 	
r"   c                    i }|j                  di       }|j                         D ]  \  }}i ||<   |j                         D ]  \  }}t        |j                  dd      |j                  dd      |j                  dd      |j                  dd      |j                  d	d      |j                  d
d      |j                  dd            ||   |<     t        |      S )zParse display configuration section

        Args:
            data: Display configuration data

        Returns:
            DisplayConfig: Parsed display configuration
        contextstitlerm   show_workersTshow_alertsshow_performanceFshow_newline_prefixwidthP   max_alerts_per_levelrZ   )r   r   r   r   r   r   r   )r   )r\   ro   r   r   )r   r4   r   contexts_datacontext_name
modes_data	mode_name	mode_datas           r    rE   z"ConfigLoader._parse_display_config   s     R0(5(;(;(= 	$L*%'H\"(2(8(8(: 	$	94H#--4!*~t!D )mT B%.]]3Eu%M(16KU(S#--4)27Mq)Q5&y1		 h//r"   c                 "   t        |j                  dd      |j                  dd      |j                  dd      |j                  dd      |j                  d	d      |j                  d
d      j                         j                         dk(        S )zParse persistence configuration section

        Args:
            data: Persistence configuration data

        Returns:
            PersistenceConfig: Parsed persistence configuration
        
batch_size2   save_interval   queue_interval<   auto_restoreTshutdown_timeoutformattxt)r   r   r   r   r   simple)r   r\   r`   rp   rz   s     r    rF   z&ConfigLoader._parse_persistence_config   s~     !xxb1((?B788$4b9.$7!XX&8"=88He,224::<E
 	
r"   c                 (   t        |j                  dd      |j                  dd      |j                  dd      |j                  dd      |j                  d	d
      |j                  dd      |j                  dd      |j                  dd            S )zParse worker manager configuration section

        Args:
            data: Worker manager configuration data

        Returns:
            WorkerManagerConfig: Parsed worker manager configuration
        enabledFmin_workersr	   max_workers
   target_queue_sized   adjustment_intervalr   scale_up_thresholdg?scale_down_thresholdg?log_recommendationsT)r   r   r   r   r   r   r   r   )r   r\   rz   s     r    rG   z)ConfigLoader._parse_worker_manager_config   s     #HHY.23"hh':C@ $)> D#xx(<cB!%*@#!F $)> E	
 		
r"   c                 D   i }|j                         D ]  \  }}t        |j                  dd      |j                  dd      |j                  dd      |j                  dd      |j                  d	d
      |j                  dd      |j                  dd            ||<    |S )zParse rate limits configuration section

        Args:
            data: Rate limits configuration data

        Returns:
            Dict[str, RateLimitConfig]: Parsed rate limits
        	base_rate      ?burst_limit   adaptiveTbackoff_factorg      ?recovery_factorg?max_rate_multiplierr}   min_rate_multiplierr   )r   r   r   r   r   r   r   )ro   r   r\   )r   r4   rate_limitsrv   
limit_datas        r    rH   zConfigLoader._parse_rate_limits  s      $

 		D* /$..c:&NN=!<#
D9)~~.>D */@# F$.NN3H#$N$.NN3H#$N!K		 r"   c                 v   |j                  di       }t        |j                  dd      |j                  dd      |j                  dd      |j                  dd            }|j                  di       }t        |j                  d	d
      |j                  dd      |j                  dd      |j                  dd
      |j                  dd      |j                  di       |j                  dd
      |j                  dd      |j                  dd      	      }|j                  di       }t        |j                  dd
      |j                  dd
      |j                  dd
      |j                  dd
            }|j                  dg       }g }	|D ]4  }
t	        j
                  |
      }t        ||       |	j                  |       6 |j                  d i       }t        |j                  d!d"      |j                  d#d$      |j                  d%d      &      }|j                  d'i       }t        |j                  d(d
      |j                  d)d
      *      }t        |j                  d+d
      |j                  d,d      |j                  d-d
      |j                  d.d/      |||j                  d0i       |||	|1      S )2zParse task configuration

        Args:
            data: Task configuration data

        Returns:
            TaskConfig: Parsed task configuration
        stagessearchTgathercheckinspect)r   r   r   r   apibase_urlrm   completion_pathz/v1/chat/completions
model_pathz
/v1/modelsdefault_modelauth_keyAuthorizationextra_headersapi_versiontimeoutr   retriesrZ   )	r   r   r   r   r   r   r   r   r   patternskey_patternaddress_patternendpoint_patternmodel_pattern)r   r   r   r   
conditions
rate_limitr   r   r   r   r   )r   r   r   storage	directoryplan)r   r   rv   r   provider_typeuse_apiFextras)rv   r   r   r   r   r   r   r   r   r   r   )r\   r   r   r   r   	from_dictr   appendr   r   r   )r   r4   stages_datar   api_datar   patterns_datar   conditions_datar   condition_data	conditionrate_limit_datar   storage_datar   s                   r    rI   zConfigLoader._parse_task_config$  s    hhx,??8T2??8T2//'40OOIt4	
 88E2&\\*b1$LL):<RS||L,?",,;\\*o>",,; ]B7LLB/LLA.

 R0%))-<)--.?D*../A2F'++OR@	
 ((<4
- 	)N!++N;IXy1i(		) ((<4$%))+s;'++M1=$((T:

 xx	2."&&{B7!!&"-

 &"%HHY-((?B7HHY.88Hb)!!
 	
r"   Nc                     t               }t        | j                  dd      5 }t        j                  ||ddd       ddd       t        d	| j                          t        d
       y# 1 sw Y   -xY w)z!Create default configuration filewr%   r&   FT   )default_flow_styleallow_unicodeindentNz$Created default configuration file: zUPlease edit the configuration file and set your GitHub credentials and other settings)r
   r,   r   r-   dumpprint)r   default_configr3   s      r    r+   z#ConfigLoader._create_default_configr  so    +-$""C': 	aaIInaEQU^_`	a 	4T5E5E4FGHef		a 	as   A**A3)zconfig.yaml)r#   N)__name__
__module____qualname____doc__rr   r!   r   r7   r   r   r/   r   rA   staticmethodra   r   rC   r   rD   r   rE   r   rF   r   rG   r   rH   r   rI   r+    r"   r    r   r   +   sP   5+C +Vf V(+$sCx. +V +Z-
c3h -
L -
^ S S  	h4S> 	hn 	h
T#s(^ 
@P 
"0$sCx. 0] 06
d38n 
AR 
$
c3h 
DW 
(tCH~ $sO?S:T ,L
tCH~ L
* L
\gr"   r   )r   r(   typingr   r   r-   core.modelsr   r   r   r   defaultsr
   schemasr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r"   r    <module>r      sE    
   N N (     'Og Ogr"   