
    )j                       U d Z ddlZddlZddlZddl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 ddlmZ ddlmZ  ej        e          ZdAd
ededefdZd
ededefdZd
ededefdZd
ededee         fdZdBd
ededefdZ dCd
ededefdZ!de"dede#e"e"f         fdZ$da%ee&         e'd<    G d de          Z( e)d e(j*        +                                D                       Z,e G d d                      Z-e G d d                       Z.e G d! d"                      Z/d#Z0ee'd$<   d%Z1ee'd&<   d'Z2ee'd(<   e G d) d*                      Z3e(j4        d+ e(j5        d, e(j6        d- e(j7        d. e(j8        d/ e(j9        d0 e(j:        d1 e(j;        d2 e(j<        d3 e(j=        d4 e(j>        d5 e(j?        d6 e(j@        d7 e(jA        d8 e(jB        d9 iZCe"e(ee/gef         f         e'd:<   e G d; d<                      ZDdeDfd=ZEdDd?ZFd>eDddfd@ZGdS )Ez
Gateway configuration management.

Handles loading and validating configuration for:
- Connected platforms (Telegram, Discord, WhatsApp, Weixin, and more)
- Home channels for each platform
- Session reset policies
- Delivery preferences
    N)Path)	dataclassfield)DictListOptionalAnyCallable)Enumget_hermes_home)is_truthy_valueTvaluedefaultreturnc                     | |S t          | t                    r4|                                                                 }|dv rdS |dv rdS |S t	          | |          S )zDCoerce bool-ish config values, preserving a caller-provided default.N>   1onyestrueT>   0noofffalseF)r   )
isinstancestrstriplowerr   )r   r   lowereds      5/home/wildlama/.hermes/hermes-agent/gateway/config.py_coerce_boolr!      sq    }% ++--%%''000411155'2222    c                 \    | |S 	 t          |           S # t          t          f$ r |cY S w xY w)z>Coerce numeric config values, falling back on malformed input.)float	TypeError
ValueErrorr   r   s     r    _coerce_floatr(   '   sF    }U||z"       ++c                 \    | |S 	 t          |           S # t          t          f$ r |cY S w xY w)z>Coerce integer config values, falling back on malformed input.)intr%   r&   r'   s     r    _coerce_intr,   1   sF    }5zzz"   r)   keyc                    | dS t          | t                    rt                              d||            dS 	 t          | t                    r3|                                 st          |           t          |           }nGt          | t                    r#t          | 	                                d          }nt          |           }n4# t          t          f$ r  t                              d||            Y dS w xY w|dk    rdS |S )zCoerce an optional positive integer config value.

    ``None``/0/negative disable the setting. Malformed values are ignored with
    a warning so a typo never prevents the gateway from starting.
    NzEIgnoring invalid %s=%r (expected a positive integer; 0/null disables)
   r   )r   boolloggerwarningr$   
is_integerr&   r+   r   r   r%   )r   r-   parseds      r    _coerce_optional_positive_intr5   ;   s     }t% S	
 	
 	

 teU## 	 ##%% ( '''ZZFFs## 	 ++FFZZFz"   S	
 	
 	

 tt {{tMs   BC	 	-C:9C:pairc                     t          | t                    r,|                                                                 }|dv r|S |S )z8Normalize unauthorized DM behavior to a supported value.>   r6   ignorer   r   r   r   r   r   
normalizeds      r    #_normalize_unauthorized_dm_behaviorr<   _   sD    % [[]]((**
+++Nr"   publicc                     t          | t                    r,|                                                                 }|dv r|S |S )z4Normalize notice delivery mode to a supported value.>   r=   privater9   r:   s      r    _normalize_notice_deliveryr@   h   sD    % [[]]((**
...Nr"   platforms_datanamec                     |                      |i           }t          |t                    si }|| |<   |                     di           }t          |t                    si }||d<   ||fS )a  Get-or-create ``platforms_data[name]`` and its nested ``extra`` dict.

    Both slots are coerced to ``{}`` if a non-dict value is encountered, so
    callers can safely write keys without type-checking.  Returns
    ``(plat_data, extra)`` for in-place mutation.
    extra)
setdefaultr   dict)rA   rB   	plat_datarD   s       r    _ensure_platform_extra_dictrH   q   s{     ))$33Ii&& )	(t  "--EeT"" #"	'er"   _Platform__bundled_plugin_namesc                       e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZed             Zedefd            ZdS )Platforma?  Supported messaging platforms.

    Built-in platforms have explicit members.  Plugin platforms use dynamic
    members created on-demand by ``_missing_()`` so that
    ``Platform("irc")`` works without modifying this enum.  Dynamic members
    are cached in ``_value2member_map_`` for identity-stable comparisons.
    localtelegramdiscordwhatsappslacksignal
mattermostmatrixhomeassistantemailsmsdingtalk
api_serverwebhookmsgraph_webhookfeishuwecomwecom_callbackweixinbluebubblesqqbotyuanbaoc                 j   t          |t                    r|                                sdS |                                                                }|| j        v r| j        |         S t
          |                                 a|t
          v r}t                              |           }||_	        |
                                                    dd                              dd          |_        || j        |<   || j        |j        <   |S 	 ddlm} |                    |          r}t                              |           }||_	        |
                                                    dd                              dd          |_        || j        |<   || j        |j        <   |S n# t"          $ r Y nw xY wdS )a  Accept unknown platform names only for known plugin adapters.

        Creates a pseudo-member cached in ``_value2member_map_`` so that
        ``Platform("irc") is Platform("irc")`` holds True (identity-stable).
        Arbitrary strings are rejected to prevent enum pollution.
        N-_ r   platform_registry)r   r   r   r   _value2member_map_rI   _scan_bundled_plugin_platformsobject__new___value_upperreplace_name__member_map_gateway.platform_registryrg   is_registered	Exception)clsr   pseudorg   s       r    	_missing_zPlatform._missing_   s    %%% 	U[[]] 	4##%%C***)%00
 +2.1.P.P.R.R+333^^C((F"FN!KKMM11#s;;CCCMMFM,2C"5).4CV]+M
	CCCCCC ..u55 ,,!& % 5 5c3 ? ? G GS Q Q06&u-28 /  	 	 	D	 ts   
BF# #
F0/F0r   c                    t                      }	 t          t                    j        j        dz  dz  }|                                r|                                D ]}|                                rq|dz                                  rZ|dz                                  s|dz                                  r,|                    |j        	                                           n# t          $ r Y nw xY w|S )zFReturn names of bundled platform plugins under ``plugins/platforms/``.plugins	platformsz__init__.pyzplugin.yamlz
plugin.yml)setr   __file__parentis_diriterdirexistsaddrB   r   rs   )rt   namesplatforms_dirchilds       r    ri   z'Platform._scan_bundled_plugin_platforms   s    UU	 NN189D{RM##%% 
6*2244 	6 	6E6"]2::<<6 #]2::<<	6
 !& 4<<>>6 		%*"2"2"4"4555 	 	 	D	s   CC% %
C21C2N)__name__
__module____qualname____doc__LOCALTELEGRAMDISCORDWHATSAPPSLACKSIGNAL
MATTERMOSTMATRIXHOMEASSISTANTEMAILSMSDINGTALK
API_SERVERWEBHOOKMSGRAPH_WEBHOOKFEISHUWECOMWECOM_CALLBACKWEIXINBLUEBUBBLESQQBOTYUANBAOclassmethodrv   rz   ri    r"   r    rK   rK      s          EHGHEFJF#ME
CHJG'OFE%NFKEG* * [*X s    [  r"   rK   c              #   $   K   | ]}|j         V  d S N)r   ).0ms     r    	<genexpr>r      s$      $T$TQW$T$T$T$T$T$Tr"   c                       e Zd ZU dZeed<   eed<   eed<   dZee         ed<   de	ee
f         fdZed	e	ee
f         dd fd
            ZdS )HomeChannela@  
    Default destination for a platform.
    
    When a cron job specifies deliver="telegram" without a specific chat ID,
    messages are sent to this home channel. Thread-aware platforms may also
    store a thread/topic ID so the bare platform target routes to the exact
    conversation where /sethome was run.
    platformchat_idrB   N	thread_idr   c                 \    | j         j        | j        | j        d}| j        r
| j        |d<   |S )N)r   r   rB   r   )r   r   r   rB   r   selfresults     r    to_dictzHomeChannel.to_dict   s=    +|I
 

 > 	1"&.F;r"   datac           	           | t          |d                   t          |d                   |                    dd          |                    d          rt          |d                   nd           S )Nr   r   rB   Homer   r   r   rB   r   )rK   r   getrt   r   s     r    	from_dictzHomeChannel.from_dict  sq    sd:.//Y((&&))040E0EOc${+,,,4	
 
 
 	
r"   )r   r   r   r   rK   __annotations__r   r   r   r   r	   r   r   r   r   r"   r    r   r      s           LLL
III#Ix}###c3h     
T#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
Zeed<   deeef         fdZedeeef         dd fd            ZdS )SessionResetPolicya6  
    Controls when sessions reset (lose context).
    
    Modes:
    - "daily": Reset at a specific hour each day
    - "idle": Reset after N minutes of inactivity
    - "both": Whichever triggers first (daily boundary OR idle timeout)
    - "none": Never auto-reset (context managed only by compression)
    bothmode   at_hour  idle_minutesTnotifyrX   rY   notify_exclude_platformsr   c                 ^    | j         | j        | j        | j        t	          | j                  dS )Nr   r   r   r   r   )r   r   r   r   listr   r   s    r    r   zSessionResetPolicy.to_dict"  s4    I| -k(,T-J(K(K
 
 	
r"   r   c           	      J   |                     d          }|                     d          }|                     d          }|                     d          }|                     d          } | ||nd||nd||ndt          |d	          |t          |          nd
          S )Nr   r   r   r   r   r   r   r   Tr   r   )r   r!   tuple)rt   r   r   r   r   r   excludes          r    r   zSessionResetPolicy.from_dict+  s     xx((9%%xx//(##((566s)v&2GG)5)At--7>7JU7^^^Pi
 
 
 	
r"   N)r   r   r   r   r   r   r   r   r+   r   r   r0   r   r   r   r	   r   r   r   r   r"   r    r   r     s           D#GSL#FD&?e???
c3h 
 
 
 
 
T#s(^ 
0D 
 
 
 [
 
 
r"   r   c                   
   e Zd ZU dZdZeed<   dZee	         ed<   dZ
ee	         ed<   dZee         ed<   dZe	ed	<   d
Zeed<    ee          Zee	ef         ed<   dee	ef         fdZedee	ef         dd fd            ZdS )PlatformConfigz.Configuration for a single messaging platform.FenabledNtokenapi_keyhome_channelfirstreply_to_modeTgateway_restart_notificationdefault_factoryrD   r   c                     | j         | j        | j        | j        d}| j        r
| j        |d<   | j        r
| j        |d<   | j        r| j                                        |d<   |S )N)r   rD   r   r   r   r   r   )r   rD   r   r   r   r   r   r   r   s     r    r   zPlatformConfig.to_dictT  s{    |Z!/,0,M	
 
 : 	)"jF7O< 	- $F9 	A%)%6%>%>%@%@F>"r"   r   c                    d }d|v r t                               |d                   }|                    d          }|)|                    di                               d          } | t          |                    d          d          |                    d          |                    d          ||                    dd	          t          |d
          |                    di                     S )Nr   r   rD   r   Fr   r   r   r   T)r   r   r   r   r   r   rD   )r   r   r   r!   )rt   r   r   _grns       r    r   zPlatformConfig.from_dictc  s    T!!&00n1EFFL xx677<88GR((,,-KLLDs )!4!4e<<((7##HHY''%((?G<<)5dD)A)A((7B''
 
 
 	
r"   )r   r   r   r   r   r0   r   r   r   r   r   r   r   r   r   r   rF   rD   r   r	   r   r   r   r   r"   r    r   r   <  s        88GTE8C=!GXc]!!!*.L(;'... !M3    *. $--- "E$777E4S>777c3h     
T#s(^ 
0@ 
 
 
 [
 
 
r"   r   g?DEFAULT_STREAMING_EDIT_INTERVAL   "DEFAULT_STREAMING_BUFFER_THRESHOLDu    ▉DEFAULT_STREAMING_CURSORc                       e Zd ZU dZdZeed<   dZeed<   e	Z
eed<   eZeed<   e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dS )StreamingConfigzCConfiguration for real-time token streaming to messaging platforms.Fr   auto	transportedit_intervalbuffer_thresholdcursor      N@fresh_final_after_secondsr   c                 P    | j         | j        | j        | j        | j        | j        dS )Nr   r   r   r   r   r   r   r   s    r    r   zStreamingConfig.to_dict  s2    |!/ $ 5k)-)G
 
 	
r"   r   c                    |s
 |             S  | t          |                    d          d          |                    dd          t          |                    d          t                    t	          |                    d          t
                    |                    dt                    t          |                    d          d	          
          S )Nr   Fr   r   r   r   r   r   r   r   )r!   r   r(   r   r,   r   r   r   s     r    r   zStreamingConfig.from_dict  s     	355Ls )!4!4e<<hh{F33'))+J  )+,,.P  88H&>??&3455t' '
 
 
 	
r"   N)r   r   r   r   r   r0   r   r   r   r   r   r$   r   r   r+   r   r   r   r   r	   r   r   r   r   r"   r    r   r     s         MMGT" Is:M5:::>c>>>*FC*** (,u+++
c3h 
 
 
 
 
T#s(^ 
0A 
 
 
 [
 
 
r"   r   c                     t          | j                            d          o | j        p| j                            d                    S )N
account_idr   )r0   rD   r   r   cfgs    r    <lambda>r     s;    	l##M)LcimmG6L6L" " r"   c                     dS NTr   r   s    r    r   r     s    4 r"   c                 P    t          | j                            d                    S )Nhttp_urlr0   rD   r   r   s    r    r   r     s    cimmJ&?&?!@!@ r"   c                 P    t          | j                            d                    S )Naddressr   r   s    r    r   r     s    SY]]9%=%= > > r"   c                 D    t          t          j        d                    S )NTWILIO_ACCOUNT_SID)r0   osgetenvr   s    r    r   r     s    d29-A#B#BCC r"   c                     dS r   r   r   s    r    r   r     s    T r"   c                     dS r   r   r   s    r    r   r     s    $ r"   c                     t          t          | j                            d          pd                                                    S )Nclient_state )r0   r   rD   r   r   r   s    r    r   r     s:    $CIMM.))/R006688+ + r"   c                 P    t          | j                            d                    S )Napp_idr   r   s    r    r   r     s    cimmH&=&=!>!> r"   c                 P    t          | j                            d                    S )Nbot_idr   r   s    r    r   r     s    SY]]8%<%< = = r"   c                     t          | j                            d          p| j                            d                    S )Ncorp_idappsr   r   s    r    r   r     s4    	i  9CIMM&$9$9* * r"   c                     t          | j                            d          o| j                            d                    S )N
server_urlpasswordr   r   s    r    r   r     s4    d	l##A	j(A(A' ' r"   c                     t          | j                            d          o| j                            d                    S )Nr   client_secretr   r   s    r    r   r     s4    	hBCIMM/$B$B! ! r"   c                     t          | j                            d          o| j                            d                    S )Nr   
app_secretr   r   s    r    r   r     s4    $	h?CIMM,$?$?# # r"   c                     t          | j                            d          st          j        d          o-| j                            d          pt          j        d                    S )N	client_idDINGTALK_CLIENT_IDr  DINGTALK_CLIENT_SECRET)r0   rD   r   r   r   r   s    r    r   r     sX    4	{	#	#	Fry1E'F'F 	TY]]?++Rry9Q/R/R$ $ r"   _PLATFORM_CONNECTED_CHECKERSc                      e Zd ZU dZ ee          Zeee	f         e
d<    ee          Zee
d<    ee          Zeeef         e
d<    ee          Zeeef         e
d<    ed           Zee         e
d<    ee          Zeeef         e
d	<    e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         e
d<   dZee
d<    ee           Z!e e
d<   dZ"ee
d<   dee         fdZ#dede	defdZ$dedee%         fdZ&	 	 d'dee         d e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*d(dee         defd%Z+d(dee         defd&Z,dS ))GatewayConfigzy
    Main gateway configuration.
    
    Manages all platform connections, session policies, and delivery settings.
    r   ry   default_reset_policyreset_by_typereset_by_platformc                  
    ddgS )N/new/resetr   r   r"   r    r   zGatewayConfig.<lambda>  s    vx>P r"   reset_triggersquick_commandsc                  $    t                      dz  S )Nsessionsr   r   r"   r    r   zGatewayConfig.<lambda>  s    7H7H:7U r"   sessions_dirTalways_log_localfilter_silence_narrationstt_enabledgroup_sessions_per_userFthread_sessions_per_userNmax_concurrent_sessionsr6   unauthorized_dm_behavior	streamingZ   session_store_max_age_daysr   c                     g }| j                                         D ]8\  }}|j        s|                     ||          r|                    |           9|S )z9Return list of platforms that are enabled and configured.)ry   itemsr   _is_platform_connectedappend)r   	connectedr   configs       r    get_connected_platformsz%GatewayConfig.get_connected_platforms%  si    	 $ 4 4 6 6 	+ 	+Hf> **8V<< +  ***r"   r   r+  c                     |t           j        k    rHt          |j                            d          o |j        p|j                            d                    S |j        s|j        rdS t                              |          }| ||          S 	 ddlm	} |                    |j
                  }|r:|j        |                    |          S |j        |                    |          S dS n# t          $ r Y nw xY wdS )z;Check whether a single platform is sufficiently configured.r   r   TNr   rf   F)rK   r   r0   rD   r   r   r   r  rq   rg   r   is_connectedvalidate_configrs   )r   r   r+  checkerrg   entrys         r    r(  z$GatewayConfig._is_platform_connected/  s:    x&&  .. @\>V\%5%5g%>%>   < 	6> 	4 /228<<76??"
	CCCCCC%))(.99E %1 --f555(4 00888t  	 	 	D	 us   =C. C. .
C;:C;c                 L    | j                             |          }|r|j        S dS )z$Get the home channel for a platform.N)ry   r   r   )r   r   r+  s      r    get_home_channelzGatewayConfig.get_home_channelQ  s-    ##H-- 	'&&tr"   session_typec                 p    |r|| j         v r| j         |         S |r|| j        v r| j        |         S | j        S )z
        Get the appropriate reset policy for a session.
        
        Priority: platform override > type override > default
        )r  r  r  )r   r   r4  s      r    get_reset_policyzGatewayConfig.get_reset_policyX  sU      	4D$:::)(33  	4LD,>>>%l33((r"   c                    i dd | j                                         D             d| j                                        dd | j                                        D             dd | j                                        D             d| j        d	| j        d
t          | j	                  d| j
        d| j        d| j        d| j        d| j        d| j        d| j        d| j                                        d| j        S )Nry   c                 H    i | ]\  }}|j         |                                 S r   r   r   )r   pcs      r    
<dictcomp>z)GatewayConfig.to_dict.<locals>.<dictcomp>n  s5       )-A  r"   r  r  c                 >    i | ]\  }}||                                 S r   )r   r   kvs      r    r<  z)GatewayConfig.to_dict.<locals>.<dictcomp>r  s3       #'1a199;;  r"   r  c                 H    i | ]\  }}|j         |                                 S r   r9  )r   r:  r@  s      r    r<  z)GatewayConfig.to_dict.<locals>.<dictcomp>u  s5     " " ")-A" " "r"   r  r  r  r  r  r  r  r   r!  r"  r#  r%  )ry   r'  r  r   r  r  r  r  r   r  r  r  r  r  r   r!  r"  r#  r%  r   s    r    r   zGatewayConfig.to_dictl  s   
  151E1E1G1G  
 #D$=$E$E$G$G	

   +/+=+C+C+E+E  
   " "151G1M1M1O1O" " "
 d1
 d1
 C 122
  5
 '(E
  4+!
" &t'C#
$ '(E%
& &t'C'
( '(E)
* //11+
, )$*I-
 	
r"   r   c                 8   i }|                     di                                           D ]B\  }}	 t          |          }t                              |          ||<   3# t
          $ r Y ?w xY wi }|                     di                                           D ]"\  }}t                              |          ||<   #i }	|                     di                                           D ]B\  }}	 t          |          }t                              |          |	|<   3# t
          $ r Y ?w xY wt                      }
d|v r t                              |d                   }
t                      dz  }d|v rt          |d                   }|                     di           }t          |t                    si }|                     d          }|St          |                     d	          t                    r)|                     d	i                                d
          nd }|                     d          }|                     d          }t          |                     d          t                    r|                     d          ni }d|v r|                     d          }d}n|                     d          }d}t          ||          }t          |                     d          d          }	 t          |                     dd                    }t          |d          }n# t          t
          f$ r d}Y nw xY w | di d|d|
d|d|	d|                     dddg          d|d|dt!          |                     d          d          dt!          |                     d          d          dt!          |d          dt!          |d          dt!          |d          d|d|dt"                              |                     di                     d|S )Nry   r  r  r  r  r  r  r  sttr   r  r   gatewayr!  zgateway.max_concurrent_sessionsr"  r6   r%  r$  r   r  r  r  r  Tr  Fr#  r   )r   r'  rK   r   r   r&   r   r   r   r   rF   r5   r<   r+   maxr%   r!   r   )rt   r   ry   platform_nameplatform_datar   r  	type_namepolicy_datar  default_policyr  r  r  r  r   nested_gatewaymax_concurrent_rawmax_concurrent_keyr!  r"  r%  s                         r    r   zGatewayConfig.from_dict  s   	,0HH[",E,E,K,K,M,M 	 	(M=#M22&4&>&>}&M&M	(##    &*hh&C&C&I&I&K&K 	Q 	Q"I{'9'C'CK'P'PM)$$*.((3F*K*K*Q*Q*S*S 	 	&M;#M22.@.J.J;.W.W!(++    ,--!T))/99$?U:VWWN&((:5T!!^ 455L"2B77.$// 	 Nhh}--@J488TY??\`@a@ak$((5"--11)<<<gkK"&((+D"E"E#'88,F#G#G 0:488I;N;NPT0U0U]),,,[]$,,!%*C!D!D!:!/!3!34M!N!N!B"?#
 #
 $GHH/00$
 $
 
	,),TXX6RTV-W-W)X)X&),-G)K)K&&:& 	, 	, 	,)+&&&	, s 
 
 
i
!/
 (-
 0/	

  88$4vx6HIII
 *>
 &
 *$((3E*F*FMMM
 &2344d& & &
 %[$777
 %11H$$O$O$O
 &22JE%R%R%R
 %<$;
  &>%=!
" &//b0I0IJJJ#
$ (B'A%
 	
s5   ,A
A+*A++,D
D%$D%+3L L54L5c                     |rR| j                             |          }|r6d|j        v r-t          |j                            d          | j                  S | j        S )z=Return the effective unauthorized-DM behavior for a platform.r"  )ry   r   rD   r<   r"  r   r   platform_cfgs      r    get_unauthorized_dm_behaviorz*GatewayConfig.get_unauthorized_dm_behavior  sm     	>--h77L  :l>P P P: &**+EFF1   ,,r"   c                     |rM| j                             |          }|r1d|j        v r(t          |j                            d          d          S dS )z9Return the effective notice-delivery mode for a platform.notice_deliveryr=   )ry   r   rD   r@   rO  s      r    get_notice_deliveryz!GatewayConfig.get_notice_delivery  sf     	>--h77L  1\5G G G1 &**+<==   xr"   )NNr   )-r   r   r   r   r   rF   ry   r   rK   r   r   r   r  r  r   r  r  r   r  r	   r  r   r  r0   r  r  r  r   r!  r   r+   r"  r   r#  r%  r,  r(  r   r3  r6  r   r   r   rQ  rT  r   r"   r    r  r    sT          16d0K0K0KItHn,-KKK 05uEW/X/X/X,XXX3853N3N3NM4//0NNN<AERV<W<W<WtH&889WWW !&6P6P Q Q QNDIQQQ &+U4%@%@%@NDcN@@@ /U/UVVVL$VVV "d!!! &*d))) K %)T(((%*d***-1Xc]111 %+c*** "'!G!G!GIGGG ')(((h     x    TX        D h{6K     (,&*) )8$) sm) 
	) ) ) )(
c3h 
 
 
 
4 P
T#s(^ P
 P
 P
 P
 [P
d	- 	-Xh5G 	-SV 	- 	- 	- 	-	 	HX,> 	# 	 	 	 	 	 	r"   r  c                  7  A t                      } i }| dz  }|                                r	 t          |dd          5 }t          j        |          pi }ddd           n# 1 swxY w Y   t
                              d|           n3# t          $ r&}t
                              d||           Y d}~nd}~ww xY w	 ddl	}| d	z  }|                                rt          |d          5 }|
                    |          pi }ddd           n# 1 swxY w Y   |                    d
          }|rt          |t                    r||d<   |                    d          }	|	Ht          |	t                    r|	|d<   n-t
                              dt          |	          j                   |                    d          }
t          |
t                    r|
|d<   d|v r|d         |d<   d|v r|d         |d<   |                    d          }t          |t                    rd|v r|d         |d<   d|v r|d         |d<   |                    d          }t          |t                    s)|                    di                               d          }t          |t                    r||d<   d|v r|d         |d<   d|v r|d         |d<   d|v r|d         |d<   d|v r&t!          |                    d          d          |d<   |                    d          }t          |t                    r|                    d          nd}|                    di           At          At                    si AA|d<   dt$          ddfAfd} ||            ||                    d                     ArA|d<   	 ddlm}  |             ddlm} n4# t          $ r'}t
                              d|           d}Y d}~nd}~ww xY wt1          t2                    }|]|                                D ]H}	 t3          |j                  }n# t8          t:          f$ r Y +w xY w||vr|                    |           I|D ]R}|t2          j        k    r|                    |j                   }t          |t                    }|sb||                    d          fD ]J}t          |t                    r3|                    |j                   }t          |t                    r|} nKt          |t                    si }d|v r:t!          |                    d          |                    dd                    |d<   d |v r&tC          |                    d           d!          |d <   d"|v r|d"         |d"<   d#|v r|d#         |d#<   d$|v r|d$         |d$<   |t2          j"        k    rd%|v r|d%         |d%<   |t2          j"        k    rd&|v r|d&         |d&<   |t2          j"        k    rd'|v r|d'         |d'<   d(|v r|d(         |d(<   d)|v r|d)         |d)<   d*|v r|d*         |d*<   |t2          j"        k    rd+|v r|d+         |d+<   d,|v r|d,         |d,<   d-|v r|d-         |d-<   d.|v r|d.         |d.<   d/|v r|d/         |d/<   d0|v r|d0         |d0<   d1|v r|d1         |d1<   d2|v r|d2         |d2<   d3|v r|d3         |d3<   |t2          j#        t2          j$        hv rd4|v r|d4         |d4<   d5|v rD|d5         }t          |t                    r"d6 |%                                D             |d5<   n||d5<   d7|v r|d7         |d7<   |od8|v }|s|stM          A|j                   \  }}|r|d8         |d8<   |t2          j$        k    r|rd9|d:<   |'                    |           T|^|(                                D ]H}|j)        |                    |j                  }t          |t                    sb||                    d          fD ]J}t          |t                    r3|                    |j                  }t          |t                    r|} nKt          |t                    s	 |)                    ||          } n8# t          $ r+}t
                              d;|j        |           Y d}~d}~ww xY wt          | t                    r| stM          A|j                  \  }!}|'                    |            J|                    d<i           }"t          |"t                    r&d$|"v rHtU          j+        d=          s4tY          |"d$                   -                                tT          j.        d=<   d>|"v rHtU          j+        d?          s4tY          |"d>                   -                                tT          j.        d?<   d@|"v rHtU          j+        dA          s4tY          |"d@                   -                                tT          j.        dA<   |"                    d(          }#|#dtU          j+        dB          sPt          |#t0                    rdC/                    dD |#D                       }#tY          |#          tT          j.        dB<   dE|"v rHtU          j+        dF          s4tY          |"dE                   -                                tT          j.        dF<   |"                    dG          }$|$dtU          j+        dH          sPt          |$t0                    rdC/                    dI |$D                       }$tY          |$          tT          j.        dH<   |                    d$          }%|%l|                    dJ          pi }&d$|&vrQA                    t2          j"        j         i           }'|'                    dKi           }(|(                    d$|%           |                    dJi           })t          |)t                    rvdL|)v rWA                    t2          j"        j         i           }'|'                    dKi           }(|(                    dL|)dL                    |)                    d$|                    d$                    }*|*BtU          j+        dM          s.tY          |*          -                                tT          j.        dM<   d)|)v r;tU          j+        dN          s't          j0        |)d)                   tT          j.        dN<   d*|)v rHtU          j+        dO          s4tY          |)d*                   -                                tT          j.        dO<   dP|)v rHtU          j+        dQ          s4tY          |)dP                   -                                tT          j.        dQ<   d+|)v rHtU          j+        dR          s4tY          |)d+                   -                                tT          j.        dR<   |)                    dS          }#|#dtU          j+        dT          sPt          |#t0                    rdC/                    dU |#D                       }#tY          |#          tT          j.        dT<   |)                    d%          }$|$dtU          j+        dV          sPt          |$t0                    rdC/                    dW |$D                       }$tY          |$          tT          j.        dV<   |)                    d'          }+|+dtU          j+        dX          sPt          |+t0                    rdC/                    dY |+D                       }+tY          |+          tT          j.        dX<   |)                    dZ          },|,dtU          j+        d[          sPt          |,t0                    rdC/                    d\ |,D                       },tY          |,          tT          j.        d[<   dE|)v rHtU          j+        d]          s4tY          |)dE                   -                                tT          j.        d]<   d^|)v rHtU          j+        d_          s4tY          |)d^                   1                                tT          j.        d_<   t          |)                    dK          t                    r|)                    dK          ni }-d`|)v r|)d`         n|-                    d`          }.|.JtU          j+        da          s6|.dbu rdcn tY          |.          -                                }/|/tT          j.        da<   |)                    d-          }0|0dtU          j+        dd          sPt          |0t0                    rdC/                    de |0D                       }0tY          |0          tT          j.        dd<   |)                    d1          }1|1dtU          j+        df          sPt          |1t0                    rdC/                    dg |1D                       }1tY          |1          tT          j.        df<   |)                    d&          }2|2dtU          j+        dh          sPt          |2t0                    rdC/                    di |2D                       }2tY          |2          tT          j.        dh<   djD ]}3|3|)v rA                    t2          j"        j         i           }t          |t                    si }|At2          j"        j         <   |                    dKi           }t          |t                    si }||dK<   |)|3         ||3<   |-rRtM          At2          j"        j                   \  }4}5|-%                                D ]\  }3}6|5                    |3|6           |                    dki           }7t          |7t                    rd$|7v rHtU          j+        dl          s4tY          |7d$                   -                                tT          j.        dl<   d)|7v r;tU          j+        dm          s't          j0        |7d)                   tT          j.        dm<   |7                    dS          }#|#dtU          j+        dn          sPt          |#t0                    rdC/                    do |#D                       }#tY          |#          tT          j.        dn<   d,|7v rHtU          j+        dp          s4tY          |7d,                   -                                tT          j.        dp<   |7                    d-          }8|8dtU          j+        dq          sPt          |8t0                    rdC/                    dr |8D                       }8tY          |8          tT          j.        dq<   d0|7v rHtU          j+        ds          s4tY          |7d0                   -                                tT          j.        ds<   |7                    d1          }9|9dtU          j+        dt          sPt          |9t0                    rdC/                    du |9D                       }9tY          |9          tT          j.        dt<   |                    dvi           }:t          |:t                    rLd$|:v rHtU          j+        dw          s4tY          |:d$                   -                                tT          j.        dw<   |                    dxi           };t          |;t                    rd$|;v rHtU          j+        dy          s4tY          |;d$                   -                                tT          j.        dy<   d)|;v r;tU          j+        dz          s't          j0        |;d)                   tT          j.        dz<   |;                    dS          }#|#dtU          j+        d{          sPt          |#t0                    rdC/                    d| |#D                       }#tY          |#          tT          j.        d{<   |;                    d%          }$|$dtU          j+        d}          sPt          |$t0                    rdC/                    d~ |$D                       }$tY          |$          tT          j.        d}<   |;                    d          }<|<dtU          j+        d          sPt          |<t0                    rdC/                    d |<D                       }<tY          |<          tT          j.        d<   |                    di           }=t          |=t                    rd$|=v rHtU          j+        d          s4tY          |=d$                   -                                tT          j.        d<   |=                    d          }#|#dtU          j+        d          sPt          |#t0                    rdC/                    d |#D                       }#tY          |#          tT          j.        d<   |=                    d          }>|>dtU          j+        d          sPt          |>t0                    rdC/                    d |>D                       }>tY          |>          tT          j.        d<   d|=v rHtU          j+        d          s4tY          |=d                   -                                tT          j.        d<   d|=v rHtU          j+        d          s4tY          |=d                   -                                tT          j.        d<   |                    di           }?t          |?t                    rLd@|?v rHtU          j+        d          s4tY          |?d@                   -                                tT          j.        d<   n6# t          $ r)}t
                              d| d	z  |           Y d}~nd}~ww xY wtd          3                    |          }@ti          |@           tk          |@           |@S )u  
    Load gateway configuration from multiple sources.

    Priority (highest to lowest):
    1. Environment variables
    2. ~/.hermes/config.yaml (primary user-facing config)
    3. ~/.hermes/gateway.json (legacy — provides defaults under config.yaml)
    4. Built-in defaults
    zgateway.jsonrzutf-8)encodingNu<   Loaded legacy %s — consider moving settings to config.yamlzFailed to load %s: %sr   zconfig.yamlsession_resetr  r  zIIgnoring invalid quick_commands in config.yaml (expected mapping, got %s)rC  r  r   rD  r!  r#  r  r  r  r"  r6   ry   source_platformsr   c                    t          | t                    sd S |                                 D ]\  }}t          |t                    s                    |i           }t          |t                    si }i |                    di           |                    di           }d|v rd|d<   i ||}|r||d<   ||<   d S )NrD   r   T_enabled_explicit)r   rF   r'  r   )rY  	plat_name
plat_blockexistingmerged_extramergedrA   s         r    _merge_platform_mapz0load_gateway_config.<locals>._merge_platform_mapY  s    !"2D99 F-=-C-C-E-E 7 7)Iz%j$77 ! -11)R@@H%h55 &#%#_hll7B&?&?#_:>>RY[]C^C^#_L J..<@%8977J7F# 7*6w06N9--7 7r"   discover_pluginsrf   zplugin discovery skipped: %srS  r=   reply_prefixreply_in_threadrequire_mentionallowed_chatsgroup_allowed_chatsallowed_topicsfree_response_channelsmention_patternsexclusive_bot_mentions"observe_unmentioned_group_messages	dm_policy
allow_fromallow_admin_fromuser_allowed_commandsgroup_policygroup_allow_fromgroup_allow_admin_fromgroup_user_allowed_commandschannel_skill_bindingschannel_promptsc                 4    i | ]\  }}t          |          |S r   r   r>  s      r    r<  z'load_gateway_config.<locals>.<dictcomp>  s$    5d5d5dDAqc!ffa5d5d5dr"   r   r   Tr[  z&apply_yaml_config_fn for %s raised: %srP   SLACK_REQUIRE_MENTIONstrict_mentionSLACK_STRICT_MENTION
allow_botsSLACK_ALLOW_BOTSSLACK_FREE_RESPONSE_CHANNELS,c              3   4   K   | ]}t          |          V  d S r   ry  r   r@  s     r    r   z&load_gateway_config.<locals>.<genexpr>  (      &;&;!s1vv&;&;&;&;&;&;r"   	reactionsSLACK_REACTIONSallowed_channelsSLACK_ALLOWED_CHANNELSc              3   4   K   | ]}t          |          V  d S r   ry  r  s     r    r   z&load_gateway_config.<locals>.<genexpr>  (      %9%9c!ff%9%9%9%9%9%9r"   rM   rD   disable_topic_auto_renameTELEGRAM_REQUIRE_MENTIONTELEGRAM_MENTION_PATTERNSTELEGRAM_EXCLUSIVE_BOT_MENTIONS
guest_modeTELEGRAM_GUEST_MODE+TELEGRAM_OBSERVE_UNMENTIONED_GROUP_MESSAGESfree_response_chatsTELEGRAM_FREE_RESPONSE_CHATSc              3   4   K   | ]}t          |          V  d S r   ry  r  s     r    r   z&load_gateway_config.<locals>.<genexpr>D  r  r"   TELEGRAM_ALLOWED_CHATSc              3   4   K   | ]}t          |          V  d S r   ry  r  s     r    r   z&load_gateway_config.<locals>.<genexpr>J  r  r"   TELEGRAM_ALLOWED_TOPICSc              3   4   K   | ]}t          |          V  d S r   ry  r  s     r    r   z&load_gateway_config.<locals>.<genexpr>O  s(      1Q1QQ#a&&1Q1Q1Q1Q1Q1Qr"   ignored_threadsTELEGRAM_IGNORED_THREADSc              3   4   K   | ]}t          |          V  d S r   ry  r  s     r    r   z&load_gateway_config.<locals>.<genexpr>T  s(      2S2Sa3q662S2S2S2S2S2Sr"   TELEGRAM_REACTIONS	proxy_urlTELEGRAM_PROXYr   TELEGRAM_REPLY_TO_MODEFr   TELEGRAM_ALLOWED_USERSc              3   4   K   | ]}t          |          V  d S r   ry  r  s     r    r   z&load_gateway_config.<locals>.<genexpr>g  s(      0O0OAQ0O0O0O0O0O0Or"   TELEGRAM_GROUP_ALLOWED_USERSc              3   4   K   | ]}t          |          V  d S r   ry  r  s     r    r   z&load_gateway_config.<locals>.<genexpr>l  (      6[6[!s1vv6[6[6[6[6[6[r"   TELEGRAM_GROUP_ALLOWED_CHATSc              3   4   K   | ]}t          |          V  d S r   ry  r  s     r    r   z&load_gateway_config.<locals>.<genexpr>q  r  r"   )r  disable_link_previewsrm  rO   WHATSAPP_REQUIRE_MENTIONWHATSAPP_MENTION_PATTERNSWHATSAPP_FREE_RESPONSE_CHATSc              3   4   K   | ]}t          |          V  d S r   ry  r  s     r    r   z&load_gateway_config.<locals>.<genexpr>  r  r"   WHATSAPP_DM_POLICYWHATSAPP_ALLOWED_USERSc              3   4   K   | ]}t          |          V  d S r   ry  r  s     r    r   z&load_gateway_config.<locals>.<genexpr>  r  r"   WHATSAPP_GROUP_POLICYWHATSAPP_GROUP_ALLOWED_USERSc              3   4   K   | ]}t          |          V  d S r   ry  r  s     r    r   z&load_gateway_config.<locals>.<genexpr>  r  r"   rQ   SIGNAL_REQUIRE_MENTIONrW   DINGTALK_REQUIRE_MENTIONDINGTALK_MENTION_PATTERNSDINGTALK_FREE_RESPONSE_CHATSc              3   4   K   | ]}t          |          V  d S r   ry  r  s     r    r   z&load_gateway_config.<locals>.<genexpr>  r  r"   DINGTALK_ALLOWED_CHATSc              3   4   K   | ]}t          |          V  d S r   ry  r  s     r    r   z&load_gateway_config.<locals>.<genexpr>  r  r"   allowed_usersDINGTALK_ALLOWED_USERSc              3   4   K   | ]}t          |          V  d S r   ry  r  s     r    r   z&load_gateway_config.<locals>.<genexpr>  s(      *C*Ca3q66*C*C*C*C*C*Cr"   rS   MATRIX_REQUIRE_MENTIONfree_response_roomsMATRIX_FREE_RESPONSE_ROOMSc              3   4   K   | ]}t          |          V  d S r   ry  r  s     r    r   z&load_gateway_config.<locals>.<genexpr>  r  r"   allowed_roomsMATRIX_ALLOWED_ROOMSc              3   4   K   | ]}t          |          V  d S r   ry  r  s     r    r   z&load_gateway_config.<locals>.<genexpr>  r  r"   auto_threadMATRIX_AUTO_THREADdm_mention_threadsMATRIX_DM_MENTION_THREADSr[   FEISHU_ALLOW_BOTSus   Failed to process config.yaml — falling back to .env / gateway.json values. Check %s for syntax errors. Error: %s)6r   r   openjsonloadr1   infors   r2   yaml	safe_loadr   r   rF   typer   r<   rE   r	   hermes_cli.pluginsrc  rq   rg   debugr   rK   plugin_entriesrB   r&   KeyErrorr)  r   r   r@   r   r   r   r'  rH   updateall_entriesapply_yaml_config_fnr   r   r   r   environjoindumpsr   r  r   _apply_env_overrides_validate_gateway_config)B_homegw_datagateway_json_pathfer  config_yaml_pathyaml_cfgsrqcstt_cfggateway_sectionstreaming_cfggateway_cfggateway_platformsra  rc  _pr_shared_loop_targets_entry_platplatrP  _cfg_toplevel_src
_candidatebridgedrw  enabled_was_explicitrG   rD   r1  seededrd   	slack_cfgfrcac_tl_require_mention_tg_section_tg_plat	_tg_extratelegram_cfg_effective_rmri  r  _telegram_extra_telegram_rtm_rtm_strr  group_allowed_usersrh  _telegram_extra_key
_plat_data_plat_extra_telegram_extra_valuewhatsapp_cfgafgaf
signal_cfgdingtalk_cfgallowed
matrix_cfgar
feishu_cfgr+  rA   sB                                                                    @r    load_gateway_configr    s    EG .!! 	J	J'w??? -1)A,,,"- - - - - - - - - - - - - - -KKN!     	J 	J 	JNN24EqIIIIIIII	JU
 =0""$$ J	\&999 3Q>>!,,23 3 3 3 3 3 3 3 3 3 3 3 3 3 3
 o..B 5jT** 524././/B~b$'' 02G,--NN5R)   ll5))G'4(( )!((H445=>W5X12)X556>?Y6Z23&ll955O/400 `5NRa5a5a5DE^5_12(H445=>W5X12$LL55MmT22 M !)Y ; ; ? ? L L-.. 5'4$8++,45E,F()!X--.67I.J*+)X556>.723 *X556YLL!;<<7 723 #,,y11K@J;X\@]@] g < < <cg$//R@@Nnd33 6!#'5$7c 7d 7 7 7 7 7 7$   1222[ 9 9::: 6'5$??????  """NNNNNNN   ;Q??? *.h !0022 ; ;F! ( 5 5&1 ! ! ! !$888,33E:::, [& [&8>))'||DJ77 *< > > % &!2HLL4M4M N & &%dD11 &)-$*)=)=J)*d;; &/9 %!,55 -==:]$(()CDD$>GG; ;G67 %441K$(():;; 2 2G-. "\11.:>.JGN+$441=>O1PG-.$441=>O1PG-.8,,,L1P1P/;O/LGO,8,,,1F,1V1V5ABW5XG128,,,1A\1Q1Q0<=M0NG,-+|;;8DE]8^G45%552>?Q2RG./+|;;8DE]8^G458,,,1UYe1e1eDPQuDvG@A,..+7+DGK(<//,8,FGL)%552>?Q2RG./*l::7CD[7\G34!\11.:>.JGN+%552>?Q2RG./+|;;8DE]8^G450L@@=IJg=hG9:H,hn===BZ^jBjBj8DE]8^G45$44&23D&EO!/488 E5d5dOLaLaLcLc5d5d5d 1225D 121\AA>JKi>jG:;'4'Rl9R$ '; #>~tz#Z#Z 	5' C+7	+BIi(8>)).B)15E-.W%%%%  __.. ) )E19 #+<<
#;#;L &lD99 *%6[8Q8Q$R * *D)$55 *-1XXej-A-A
#-j$#?#? !*3=L$)E%lD99 ! !!&!;!;Hl!S!S$ ! ! !D!J   !! &fd33 !6 ! :>5:VVHAuLL(((( !Wb11I)T** C$	11")D[:\:\1:=iHY>Z:[:[:a:a:c:cBJ67#y00CY9Z9Z09<YGW=X9Y9Y9_9_9a9aBJ569,,RY?Q5R5R,58<9P5Q5Q5W5W5Y5YBJ12mm$<==?295S+T+T?!#t,, <!hh&;&;s&;&;&;;;ADSBJ=>)++BI>O4P4P+47	+8N4O4O4U4U4W4WBJ01]]#566>")4L*M*M>!"d++ : XX%9%9b%9%9%999;>r77BJ78 #+,,/@"A"A".&ll:66<"$K77-889J9PRTUUH ( 3 3GR @ @I(():<OPPP $<<
B77L,-- Y[ /,>>-889J9PRTUUH ( 3 3GR @ @I((3$%@A  
 !- 0 01BHLLQbDcDc d d ,RY?Y5Z5Z,=@=O=O=U=U=W=WBJ9:%55biHc>d>d5>BjVhIi>j>jBJ:;+|;;BINoDpDp;DGUmHnDoDoDuDuDwDwBJ@A<//	BW8X8X/8;L<V8W8W8]8]8_8_BJ457<GGPRPY  [H  QI  QIGPST`  bF  UG  QH  QH  QN  QN  QP  QPBJLM"&&'<==?295S+T+T?!#t,, <!hh&;&;s&;&;&;;;ADSBJ=>!%%o66>")4L*M*M>!"d++ : XX%9%9b%9%9%999;>r77BJ78!-!1!12B!C!C!-bi@Y6Z6Z-!.$77 R),1Q1Q.1Q1Q1Q)Q)Q<?<O<OBJ89"."2"23D"E"E".ryA[7\7\.!/488 T*-((2S2S?2S2S2S*S*S=@=Q=QBJ9:,..ryAU7V7V.7:<;T7U7U7[7[7]7]BJ34,..ryAQ7R7R.36|K7P3Q3Q3W3W3Y3YBJ/0 @J,JZJZ[bJcJcei?j?j"r,"2"27";";";pr5D5T5TL11(,,_==  !,RY?W5X5X,(5(>(>uuCDVDVD\D\D^D^H;CBJ78 , 0 0 > > ,RY?W5X5X,!-66 P(+0O0O0O0O0O(O(O;>};M;MBJ78&2&6&67I&J&J#&229Ec;d;d2!"5t<< \.1hh6[6[GZ6[6[6[.[.[+ADEXAYAYBJ=>&2&6&67L&M&M#&229Ec;d;d2!"5t<< \.1hh6[6[GZ6[6[6[.[.[+ADEXAYAYBJ=>+x 
W 
W'*l::$2$=$=h>O>UWY$Z$Z	))T:: P(*IFON8+<+BC ) 4 4Wb A A)%66 7$&E16Ig.5ABU5V12" [.I&(9(?/ /+J GVF[F[F]F] [ [B+-B#../BDYZZZZ#<<
B77L,-- J$44RYGa=b=b4=@N_A`=a=a=g=g=i=iBJ9:%55biHc>d>d5>BjVhIi>j>jBJ:;"&&'<==?295S+T+T?!#t,, <!hh&;&;s&;&;&;;;ADSBJ=>,..ryAU7V7V.7:<;T7U7U7[7[7]7]BJ34!%%l33>")4L*M*M>!"d++ : XX%9%9b%9%9%999;>r77BJ78!\11")D[:\:\1:=l>>Z:[:[:a:a:c:cBJ67"&&'9::?295S+T+T?!#t,, <!hh&;&;s&;&;&;;;ADSBJ=> "h33J*d++ f$
2229E];^;^2;>zJ[?\;];];c;c;e;eBJ78 $<<
B77L,-- H$44RYGa=b=b4=@N_A`=a=a=g=g=i=iBJ9:%55biHc>d>d5>BjVhIi>j>jBJ:;"&&'<==?295S+T+T?!#t,, <!hh&;&;s&;&;&;;;ADSBJ=>!%%o66>")4L*M*M>!"d++ : XX%9%9b%9%9%999;>r77BJ78&**?;;&ry9Q/R/R&!'400 D"%((*C*C7*C*C*C"C"C;>w<<BJ78 "h33J*d++ l$
2229E];^;^2;>zJ[?\;];];c;c;e;eBJ78 nn%:;;?295Q+R+R?!#t,, <!hh&;&;s&;&;&;;;?B3xxBJ;<^^O44>")4J*K*K>!"d++ : XX%9%9b%9%9%9999<RBJ56 J..ryAU7V7V.7::m;T7U7U7[7[7]7]BJ34':55biHc>d>d5>A*MaBb>c>c>i>i>k>kBJ:; "h33J*d++ \:--bi@S6T6T-69*\:R6S6S6Y6Y6[6[BJ23 
 
 
4M!		
 	
 	
 	
 	
 	
 	
 	

 $$W--F     V$$$Ms  B A!B !A%%B (A%)B 
B8B33B8</Am? +DAm? DAm? DJAm? 6O Am? 
O>O94Am? 9O>>/Am? .QAm? QAm? QP<Am? b+*Am? +
c 5!cAm? c  AJAm? m?
An2n	An-n-An2r+  c                 (   | j         }d|j        cxk    rdk    s)n t                              d|j                   d|_        |j        |j        dk    r't                              d|j                   d|_        t
          j        dt
          j        d	t
          j        d
t
          j	        dt
          j
        dt
          j        di}| j                                        D ]e\  }}|j        s|                    |          }|rA|j        :|j                                        s!t                              d|j        |           f	 ddlm} n# t*          $ r d}Y nw xY w|| j                                        D ]\  }}|j        s|                    |          }|s%|j        }|rg|                                rS ||d          sFt                              d|j        ||                                dd         dz              d|_        dS dS )zValidate and sanitize a loaded GatewayConfig in place.

    Called by ``load_gateway_config()`` after all config sources are merged.
    Extracted as a separate function for testability.
    r      z3Invalid at_hour=%s (must be 0-23). Using default 4.r   Nz?Invalid idle_minutes=%s (must be positive). Using default 1440.r   TELEGRAM_BOT_TOKENDISCORD_BOT_TOKENSLACK_BOT_TOKENMATTERMOST_TOKENMATRIX_ACCESS_TOKENWEIXIN_TOKENzG%s is enabled but %s is empty. The adapter will likely fail to connect.)has_usable_secret)
min_lengthz%s is enabled but %s is set to a placeholder value ('%s'). Set a real bot token before starting the gateway. The adapter will NOT be started.   z...F)r  r   r1   r2   r   rK   r   r   r   r   r   r   ry   r'  r   r   r   r   r   hermes_cli.authr  ImportErrorerror)r+  policy_token_env_namesr   pconfigenv_namer  r   s           r    r  r    s~    (F%%%%2%%%%A6>	
 	
 	
 "f&9Q&>&>M	
 	
 	
 #
 	/-)/. $-3355 	 	' 	#''11 	1'-:M:M:O:O1NN;  !5555555 ! ! ! ! $!'!1!7!7!9!9 	( 	(Hg? '++H55H ME ( (/@/@ST/U/U/U (7 NHekkmmBQB.?%.G	   #( %$	( 	(s   E EEc                 >I    dt           dt          f fd}t          j        d          }|r |t           j                  }||_        t          j        dd                                          }|dv rOt           j         j        vr t                       j        t           j        <   | j        t           j                 _        t          j        dd          }|rot           j         j        vr t                       j        t           j        <   d	 |	                    d
          D              j        t           j                 j
        d<   t          j        d          }|rqt           j         j        v r^t          t           j        |t          j        dd          t          j        d          pd           j        t           j                 _        t          j        d          }|r |t           j                  }||_        t          j        d          }	|	rqt           j         j        v r^t          t           j        |	t          j        dd          t          j        d          pd           j        t           j                 _        t          j        dd                                          }
|
dv rOt           j         j        vr t                       j        t           j        <   |
 j        t           j                 _        t          j        dd                                          dv }t          j        dd                                          dv }t           j         j        v r+ j        t           j                 }|rd|_        n.|rd|_        n$|r"t          d           j        t           j        <   t          j        d          }|rqt           j         j        v r^t          t           j        |t          j        dd          t          j        d          pd           j        t           j                 _        t          j        d           }|rt           j         j        vr=t                       j        t           j        <   d j        t           j                 _        nO j        t           j                 }t#          |j
                            d!d                    }|j        s	|sd|_        | j        t           j                 _        t          j        d"          }|rqt           j         j        v r^t          t           j        |t          j        d#d          t          j        d$          pd           j        t           j                 _        t          j        d%          }t          j        d&          }|r\|rZ |t           j                  }|j
                            ||t          j        d'd(                                          dv d)           t          j        d*          }|rqt           j         j        v r^t          t           j        |t          j        d+d          t          j        d,          pd           j        t           j                 _        t          j        d-          }|rWt          j        d.d          }|st*                              d/            |t           j                  }||_        ||j
        d0<   t          j        d1          }|rqt           j         j        v r^t          t           j        |t          j        d2d          t          j        d3          pd           j        t           j                 _        t          j        d4          }t          j        d5d          }|st          j        d6          r|st*                              d7            |t           j                  }|r||_        ||j
        d8<   t          j        d9d          }|r
||j
        d:<   t          j        d6d          }|r
||j
        d;<   t          j        d<d                                          dv } | |j
        d=<   t          j        d>d          }!|!r
|!|j
        d?<   t          j        d@          }"|"rqt           j         j        v r^t          t           j        |"t          j        dAd          t          j        dB          pd           j        t           j                 _        t          j        dC          }#|#rt           j         j        vr t                       j        t           j        <   d j        t           j                 _        |# j        t           j                 _        t          j        dD          }$|$r|$ j        t           j                 j
        d0<   t          j        dE          }%t          j        dF          }&t          j        dG          }'t          j        dH          }(t5          |%|&|'|(g          rt           j         j        vr t                       j        t           j        <   d j        t           j                 _         j        t           j                 j
                            |%|'|(dI           t          j        dJ          })|)rqt           j         j        v r^t          t           j        |)t          j        dKd          t          j        dL          pd           j        t           j                 _        t          j        dM          }*|*r~t           j         j        vr t                       j        t           j        <   d j        t           j                 _        t          j        dNd           j        t           j                 _        t          j        dO          }+|+rqt           j         j        v r^t          t           j        |+t          j        dPd          t          j        dQ          pd           j        t           j                 _        t          j        dRd                                          dv },t          j        dSd          }-t          j        dTd          }.t          j        dU          }/t          j        dV          }0|,s|-rIt           j         j        vr t                       j        t           j        <   d j        t           j                 _        |-r|- j        t           j                 j
        dW<   |.r@dX |.	                    d
          D             }1|1r|1 j        t           j                 j
        dY<   |/r>	 t?          |/           j        t           j                 j
        dZ<   n# t@          $ r Y nw xY w|0r|0 j        t           j                 j
        d[<   t          j        d\d          }2|2r|2 j        t           j                 j
        d]<   t          j        d^d                                          dv }3t          j        d_          }4t          j        d`d          }5|3rt           j!         j        vr t                       j        t           j!        <   d j        t           j!                 _        |4r>	 t?          |4           j        t           j!                 j
        dZ<   n# t@          $ r Y nw xY w|5r|5 j        t           j!                 j
        da<   t          j        dbd                                          dv }6t          j        dc          }7t          j        ddd          }8t          j        ded          }9t          j        dfd          }:|6st           j"         j        v s	|7s|8s|9s|:r6t           j"         j        vr t                       j        t           j"        <   |6rd j        t           j"                 _        |7r>	 t?          |7           j        t           j"                 j
        dZ<   n# t@          $ r Y nw xY w|8r|8 j        t           j"                 j
        dg<   |9r@dh |9	                    d
          D             };|;r|; j        t           j"                 j
        di<   |:r@dj |:	                    d
          D             }<|<r|< j        t           j"                 j
        dk<   t          j        dl          }=t          j        dm          }>|=r|>rt           j#         j        vr t                       j        t           j#        <   d j        t           j#                 _         j        t           j#                 j
                            |=|>dn           t          j        do          }?|?r^t          t           j#        |?t          j        dpd          t          j        dq          pd           j        t           j#                 _        t          j        dr          }@t          j        ds          }A|@r|Art           j$         j        vr t                       j        t           j$        <   d j        t           j$                 _         j        t           j$                 j
                            |@|At          j        dtdu          t          j        dvdw          dx           t          j        dyd          }B|Br|B j        t           j$                 j
        dz<   t          j        d{d          }C|Cr|C j        t           j$                 j
        d|<   t          j        d}          }D|Dr^t          t           j$        |Dt          j        d~d          t          j        d          pd           j        t           j$                 _        t          j        d          }Et          j        d          }F|Er.|Fr+t           j%         j        vr t                       j        t           j%        <   d j        t           j%                 _         j        t           j%                 j
                            |E|Fd           t          j        dd          }G|Gr|G j        t           j%                 j
        d<   t          j        d          }H|Hr^t          t           j%        |Ht          j        dd          t          j        d          pd           j        t           j%                 _        t          j        d          }It          j        d          }J|Ir|Jrt           j&         j        vr t                       j        t           j&        <   d j        t           j&                 _         j        t           j&                 j
                            |I|Jt          j        dd          t          j        dd          t          j        dd          t          j        dd          t?          t          j        dd                    d           t          j        d          }Kt          j        d          }L|Ks|Lrt           j'         j        vr t                       j        t           j'        <   d j        t           j'                 _        |Kr|K j        t           j'                 _         j        t           j'                 j
        }M|Lr|L|Md<   t          j        dd          (                                }N|Nr|N)                    d          |Md<   t          j        dd          (                                }O|Or|O)                    d          |Md<   t          j        dd          (                                                                }P|Pr|P|Md<   t          j        dd          (                                                                }Q|Qr|Q|Md<   t          j        dd          (                                }R|Rr|R|Md<   t          j        dd          (                                }S|Sr|S|Md<   t          j        dd          (                                }T|Tr|T|Md<   t          j        dd          (                                }U|Ur^t          t           j'        |Ut          j        dd          t          j        d          pd           j        t           j'                 _        t          j        d          }Vt          j        d          }W|Vr|Wrt           j*         j        vr t                       j        t           j*        <   d j        t           j*                 _         j        t           j*                 j
                            |V)                    d          |Wt          j        dd          t?          t          j        dd                    t          j        dd          t          j        dd(                                          dv d           t          j        d          }X|X3|X                                dv  j        t           j*                 j
        d<   t          j        d          }Y|Yrx	 tW          j,        |Y          }ZnC# tZ          $ r6 d |Y.                    dd
          	                    d
          D             }ZY nw xY w|Z j        t           j*                 j
        d<   t          j        d          }[|[rqt           j*         j        v r^t          t           j*        |[t          j        dd          t          j        d          pd           j        t           j*                 _        t          j        d          }\t          j        d          }]|\s|]rt           j/         j        vr t                       j        t           j/        <   d j        t           j/                 _         j        t           j/                 j
        }M|\r|\|Md<   |]r|]|Md<   t          j        dd          (                                }^|^r|^|Md<   t          j        dd          (                                }_|_r|_|Md<   t          j        dd          (                                }`d}a|`sYt          j        dd          (                                }b|br0|b}`d}ata          j1        td                                        dĦ           |`rt          t           j/        |`t          j        d          pt          j        |ad          t          j        dŦ          pt          j        dƦ          pd           j        t           j/                 _        t          j        dǦ          pt          j        dȦ          }ct          j        dɦ          }d|cr|dr	t           j3         j        vr t                       j        t           j3        <   d j        t           j3                 _         j        t           j3                 j
        }M|c|Md<   |d|Md<   t          j        d˦          }e|er|e|Md<   t          j        dͦ          }f|fr|f|Md<   t          j        dϦ          }g|gr|g|Md<   t          j        dѦ          }h|hr|h|Md<   t          j        dӦ          }i|ir^t          t           j3        |it          j        dd          t          j        dզ          pd           j        t           j3                 _        t          j        d֦          }j|jr)|j(                                                                |Md<   t          j        dצ          }k|kr|k|Md<   t          j        d٦          }l|lr)|l(                                                                |Md<   t          j        dڦ          }m|mr|m|Md<   t          j        dۦ          }n|nr+	 t?          |n           j4        _5        n# t@          $ r Y nw xY wt          j        dܦ          }o|or+	 t?          |o           j4        _6        n# t@          $ r Y nw xY w	 ddl7m8}p  |p             ddl9m:}q |q;                                D ]k}r	 |r<                                sn8# tZ          $ r+}st*          =                    d|rj>        |s           Y d}s~sJd}s~sww xY wt          |rj>                  }t j        ?                    |t          }ud}v|rj@        P	 |r@                                }vn:# tZ          $ r-}st*          =                    d|rj>        |s           d}vY d}s~snd}s~sww xY w|u|uj        sJ|rjA        B	 |u/|u}w|wj        s%t          dt          |wj
        pi                     }wnt          d          }wt          |vt                    rj|vrht          t          |wdi           pi           }x|vE                                D ]"\  }y}z|ydk    r|xF                    |y|z           #t          d|x          }wt#          |rA                    |w                    }{n:# tZ          $ r-}|t*          =                    d|rj>        ||           d}{Y d}|~|nd}|~|ww xY w|{s"t*          =                    d|rj>                   -|t j        vrt                       j        |t<   d j        |t         _        t          |vt                    r|vrt          |v          }}|}                    dd          }~ j        |t         j
                            |}           t          |~t                    r|~?                    d          rt          |tt          |~d                   t          |~?                    d          pd          |~?                    d          rt          |~d                   nd           j        |t         _        mn2# tZ          $ r%}st*          =                    d|s           Y d}s~snd}s~sww xY w j        H                                D ]}|j
                            d!d           dS )z/Apply environment variable overrides to config.r   r   c                     | j         vr%t          d          j         | <   j         |          S j         |          }t          |j                            dd                    }|j        s	|sd|_        |S )NTr   r[  F)ry   r   r0   rD   popr   )r   platform_configr  r+  s      r    _enable_from_envz._apply_env_overrides.<locals>._enable_from_env6  s    6+++)7)E)E)EFX&#H-- *84#O$9$=$=>QSX$Y$YZZ& 	+/C 	+&*O#r"   r  r  r   >   allr   r   TELEGRAM_FALLBACK_IPSc                 ^    g | ]*}|                                 |                                 +S r   r   )r   ips     r    
<listcomp>z(_apply_env_overrides.<locals>.<listcomp>R  sD     E
 E
 E
RXXZZE
HHJJE
 E
 E
r"   r  fallback_ipsTELEGRAM_HOME_CHANNELTELEGRAM_HOME_CHANNEL_NAMEr   TELEGRAM_HOME_CHANNEL_THREAD_IDNr   r  DISCORD_HOME_CHANNELDISCORD_HOME_CHANNEL_NAMEDISCORD_HOME_CHANNEL_THREAD_IDDISCORD_REPLY_TO_MODEWHATSAPP_ENABLED>   r   r   r   >   r   r   r   FTr"  WHATSAPP_HOME_CHANNELWHATSAPP_HOME_CHANNEL_NAMEWHATSAPP_HOME_CHANNEL_THREAD_IDr  r[  SLACK_HOME_CHANNELSLACK_HOME_CHANNEL_NAMESLACK_HOME_CHANNEL_THREAD_IDSIGNAL_HTTP_URLSIGNAL_ACCOUNTSIGNAL_IGNORE_STORIESr   )r   accountignore_storiesSIGNAL_HOME_CHANNELSIGNAL_HOME_CHANNEL_NAMESIGNAL_HOME_CHANNEL_THREAD_IDr  MATTERMOST_URLz2MATTERMOST_TOKEN set but MATTERMOST_URL is missingurlMATTERMOST_HOME_CHANNELMATTERMOST_HOME_CHANNEL_NAME!MATTERMOST_HOME_CHANNEL_THREAD_IDr  MATRIX_HOMESERVERMATRIX_PASSWORDzHMATRIX_ACCESS_TOKEN/MATRIX_PASSWORD set but MATRIX_HOMESERVER is missing
homeserverMATRIX_USER_IDuser_idr  MATRIX_ENCRYPTION
encryptionMATRIX_DEVICE_ID	device_idMATRIX_HOME_ROOMMATRIX_HOME_ROOM_NAMEMATRIX_HOME_ROOM_THREAD_ID
HASS_TOKENHASS_URLEMAIL_ADDRESSEMAIL_PASSWORDEMAIL_IMAP_HOSTEMAIL_SMTP_HOST)r   	imap_host	smtp_hostEMAIL_HOME_ADDRESSEMAIL_HOME_ADDRESS_NAMEEMAIL_HOME_ADDRESS_THREAD_IDr   TWILIO_AUTH_TOKENSMS_HOME_CHANNELSMS_HOME_CHANNEL_NAMESMS_HOME_CHANNEL_THREAD_IDAPI_SERVER_ENABLEDAPI_SERVER_KEYAPI_SERVER_CORS_ORIGINSAPI_SERVER_PORTAPI_SERVER_HOSTr-   c                 ^    g | ]*}|                                 |                                 +S r   r)  )r   origins     r    r+  z(_apply_env_overrides.<locals>.<listcomp>)  s2    iii&Z`ZfZfZhZhiv||~~iiir"   cors_originsporthostAPI_SERVER_MODEL_NAME
model_nameWEBHOOK_ENABLEDWEBHOOK_PORTWEBHOOK_SECRETsecretMSGRAPH_WEBHOOK_ENABLEDMSGRAPH_WEBHOOK_PORTMSGRAPH_WEBHOOK_CLIENT_STATE"MSGRAPH_WEBHOOK_ACCEPTED_RESOURCES$MSGRAPH_WEBHOOK_ALLOWED_SOURCE_CIDRSr   c                 ^    g | ]*}|                                 |                                 +S r   r)  )r   resources     r    r+  z(_apply_env_overrides.<locals>.<listcomp>k  sB       >>##    r"   accepted_resourcesc                 ^    g | ]*}|                                 |                                 +S r   r)  )r   cidrs     r    r+  z(_apply_env_overrides.<locals>.<listcomp>u  s>       ::<<

  r"   allowed_source_cidrsr  r  )r  r  DINGTALK_HOME_CHANNELDINGTALK_HOME_CHANNEL_NAMEDINGTALK_HOME_CHANNEL_THREAD_IDFEISHU_APP_IDFEISHU_APP_SECRETFEISHU_DOMAINr[   FEISHU_CONNECTION_MODE	websocket)r   r	  domainconnection_modeFEISHU_ENCRYPT_KEYencrypt_keyFEISHU_VERIFICATION_TOKENverification_tokenFEISHU_HOME_CHANNELFEISHU_HOME_CHANNEL_NAMEFEISHU_HOME_CHANNEL_THREAD_IDWECOM_BOT_IDWECOM_SECRET)r   rr  WECOM_WEBSOCKET_URLwebsocket_urlWECOM_HOME_CHANNELWECOM_HOME_CHANNEL_NAMEWECOM_HOME_CHANNEL_THREAD_IDWECOM_CALLBACK_CORP_IDWECOM_CALLBACK_CORP_SECRETWECOM_CALLBACK_AGENT_IDWECOM_CALLBACK_TOKENWECOM_CALLBACK_ENCODING_AES_KEYWECOM_CALLBACK_HOSTz0.0.0.0WECOM_CALLBACK_PORT8645)r  corp_secretagent_idr   encoding_aes_keyrl  rk  r  WEIXIN_ACCOUNT_IDr   WEIXIN_BASE_URL/base_urlWEIXIN_CDN_BASE_URLcdn_base_urlWEIXIN_DM_POLICYrn  WEIXIN_GROUP_POLICYrr  WEIXIN_ALLOWED_USERSro  WEIXIN_GROUP_ALLOWED_USERSrs  WEIXIN_SPLIT_MULTILINE_MESSAGESsplit_multiline_messagesWEIXIN_HOME_CHANNELWEIXIN_HOME_CHANNEL_NAMEWEIXIN_HOME_CHANNEL_THREAD_IDBLUEBUBBLES_SERVER_URLBLUEBUBBLES_PASSWORDBLUEBUBBLES_WEBHOOK_HOSTz	127.0.0.1BLUEBUBBLES_WEBHOOK_PORTBLUEBUBBLES_WEBHOOK_PATHz/bluebubbles-webhookBLUEBUBBLES_SEND_READ_RECEIPTS)r  r  webhook_hostwebhook_portwebhook_pathsend_read_receiptsBLUEBUBBLES_REQUIRE_MENTION>   r   r   r   r   rf  BLUEBUBBLES_MENTION_PATTERNSc                 ^    g | ]*}|                                 |                                 +S r   r)  )r   parts     r    r+  z(_apply_env_overrides.<locals>.<listcomp>  s>     # # #zz||#JJLL# # #r"   
rk  BLUEBUBBLES_HOME_CHANNELBLUEBUBBLES_HOME_CHANNEL_NAME"BLUEBUBBLES_HOME_CHANNEL_THREAD_ID	QQ_APP_IDQQ_CLIENT_SECRETr   r  QQ_ALLOWED_USERSQQ_GROUP_ALLOWED_USERSQQBOT_HOME_CHANNELQQBOT_HOME_CHANNEL_NAMEQQ_HOME_CHANNELQQ_HOME_CHANNEL_NAMEzoQQ_HOME_CHANNEL is deprecated; rename to QQBOT_HOME_CHANNEL in your .env for consistency with the platform key.QQBOT_HOME_CHANNEL_THREAD_IDQQ_HOME_CHANNEL_THREAD_IDYUANBAO_APP_IDYUANBAO_APP_KEYYUANBAO_APP_SECRETr	  YUANBAO_BOT_IDr   YUANBAO_WS_URLws_urlYUANBAO_API_DOMAIN
api_domainYUANBAO_ROUTE_ENV	route_envYUANBAO_HOME_CHANNELYUANBAO_HOME_CHANNEL_NAMEYUANBAO_HOME_CHANNEL_THREAD_IDYUANBAO_DM_POLICYYUANBAO_DM_ALLOW_FROMdm_allow_fromYUANBAO_GROUP_POLICYYUANBAO_GROUP_ALLOW_FROMSESSION_IDLE_MINUTESSESSION_RESET_HOURr   rb  rf   zcheck_fn for %s raised: %sz#env_enablement_fn for %s raised: %s)r   rD   rD   r   u6   is_connected for %s raised: %s — skipping enablementuc   Plugin platform '%s' available but not configured (is_connected returned False) — skipping enabler   rB   r   z&Plugin platform enable pass failed: %s)IrK   r   r   r   r   r   r   ry   r   splitrD   r   r   r   r   r   r   r0   r#  r   r  r1   r2   r   r   r   r&  r   r   r   r   r+   r&   r   r   r   r   r   r   r   r   rstripr   r  loadsrs   rn   r   logging	getLoggerr   r   r  r   r   r  rc  rq   rg   r  check_fnr  rB   r   env_enablement_fnr.  rF   r   getattrr'  rE   r   values)r+  r%  telegram_tokentelegram_configtelegram_reply_modetelegram_fallback_ipstelegram_homediscord_tokendiscord_configdiscord_homediscord_reply_modewhatsapp_enabledwhatsapp_disabled_explicitlywa_cfgwhatsapp_homeslack_tokenslack_configr  
slack_home
signal_urlsignal_accountsignal_configsignal_homemattermost_tokenmattermost_urlmattermost_configmattermost_homematrix_tokenmatrix_homeservermatrix_configmatrix_usermatrix_passwordmatrix_e2eematrix_device_idmatrix_home
hass_tokenhass_url
email_addr	email_pwd
email_imap
email_smtp
email_home
twilio_sidsms_homeapi_server_enabledapi_server_keyapi_server_cors_originsapi_server_portapi_server_hostoriginsapi_server_model_namewebhook_enabledr  webhook_secretmsgraph_webhook_enabledmsgraph_webhook_portmsgraph_webhook_client_statemsgraph_webhook_resourcesmsgraph_webhook_allowed_cidrs	resourcescidrsdingtalk_client_iddingtalk_client_secretdingtalk_homefeishu_app_idfeishu_app_secretfeishu_encrypt_keyfeishu_verification_tokenfeishu_homewecom_bot_idwecom_secretwecom_ws_url
wecom_homewecom_callback_corp_idwecom_callback_corp_secretweixin_tokenweixin_account_idrD   weixin_base_urlweixin_cdn_base_urlweixin_dm_policyweixin_group_policyweixin_allowed_usersweixin_group_allowed_usersweixin_split_multilineweixin_homebluebubbles_server_urlbluebubbles_passwordbluebubbles_require_mentionbluebubbles_mention_patternsparsed_patternsbluebubbles_home	qq_app_idqq_client_secretqq_allowed_usersqq_group_allowedqq_homeqq_home_name_envlegacy_homeyuanbao_app_idyuanbao_app_secretyuanbao_bot_idyuanbao_ws_urlyuanbao_api_domainyuanbao_route_envyuanbao_homeyuanbao_dm_policyyuanbao_dm_allow_fromyuanbao_group_policyyuanbao_group_allow_fromr   
reset_hourrc  rg   r1  r  r   existing_cfgseed_for_probe	probe_cfgprobe_extrar?  r@  
configuredexcseedhomer$  s   `                                                                                                                               r    r  r  3  s1$   	8 	 	 	 	 	 	 	 Y344N /**8+<== . )$<bAAGGII555F$4442@2B2BFX./<O*+9I&=rBB 
F$4442@2B2BFX./E
 E
!6!<!<S!A!AE
 E
 E
*+1.A I566M 
*f.>>>;F&!7@@i ABBJd	<
 <
 <
*+8 I122M -))(*:;;,9344L 
(F,<<<:E% 6??i @AAIT	;
 ;
 ;
)*7 #:B??EEGG4446#3331?1A1AFX-.;M)*8 y!3R88>>@@DXX#%9-?#D#D#J#J#L#LPd#d F,,,!("34' 	""FNN 	"!FN	 K.<T.J.J.J*+I566M 
*f.>>>;F&!7@@i ABBJd	<
 <
 <
*+8 )-..K =>!111/=/?/?FX^,7;FX^,44!+HN;L#'(:(>(>?RTY(Z(Z#[#[ ' ,0D , (,$ 2=(./00J 
hn(8888C^4b99i >??G4	9
 9
 9
(5 ,--JY/00N n ((99"""% i(?HHNNPPThh$
 $
 	 	 	
 )122K 
x&*:::9D_5v>>i ?@@HD	:
 :
 :
)6 y!344 8#3R88 	QNNOPPP,,X-@AA"2)7&i 9::O 
8.&2BBB=H(#96BBi CDDL	>
 >
 >
,-: 9233L	"5r:: @ry!233 @  	gNNefff((99 	/".M,=L)i 0"55 	9-8M	*)$5r:: 	>.=M
+i 3R88>>@@DXX,7L)9%7<< 	@/?M,).//K 
x&*:::9D_2F;;i <==E	:
 :
 :
)6 <((J M!)9997E7G7GFX34;?/089C/069Z(( 	MDLFX34:5A ?++J	*++I,--J,--J
J	:z:;; >!111/=/?/?FX^,37(0(.55!##7
 7
 	 	 	
 /00J 
hn(8888C^4f==i >??G4	9
 9
 9
(5 /00J T<v///-;-=-=FX\*15&.13;NPR1S1S&.y+,,H 
HLF$4446A\2F;;i <==E	7
 7
 7
&3 #7<<BBDDH\\Y/44N i(A2FFi 122Oi 122O ^^ ^f&6664B4D4DFX018<,-5 	PAOFX017>" 	Vii4K4Q4QRU4V4ViiiG VNU !45;NK 	FI/FZFZ !45;FCC    	RBQFX017? "	*A2 F F  	^H]FX017E i 1266<<>>BVVO9^,,LY/44N 
P6#3331?1A1AFX-.59)*2 	CF|CTCT !128@@    	PAOFX-.4X> !i(A2FFLLNN S 
 9%;<<#%9-KR#P#P  "	*NPR S S$&I.% %! 	 *#v'777 8' 8 % 8 )	 8 #6+;;;9G9I9IFX56" 	FAEFX56> 	KN(L L !9:@HH    ' 	, X56<^L % 		  9 ? ? D D  I
     !9:@( ) 		 9??DD  E
     !9:@*
 #788Y'?@@ 4 F$4442@2B2BFX./6:*+3*+188+3:
 :
 	 	 	 	"9:: 	?J!*%Y;VDD)$EFFN$	@ @ @FX./< Io..M	"566 * ?&"2220>0@0@FX_-48)1)/66#+i::!y)A;OO	8
 8
 	 	 	  Y';R@@ 	XEWFX_-3MB$&I.I2$N$N!$ 	fLeFX_-34HIi 566 	=H!#Y96BB)$CDDL	> > >FX_-: 9^,,L9^,,L  >!111/=/?/?FX^,37(0(.55""7
 7
 	 	 	 y!6;; 	SFRFX^,2?CY344
 	<G!"Y8&AA)$BCCKt	= = =FX^,9  Y'?@@!#+G!H!H "< "&*:::8F8H8HFX45<@019017>>-5	";R@@Y5r:: "	*KR P PI3Y??	"7@@AA@
 @
 	 	 	 9^,,L	"566 %( %?&"2220>0@0@FX_-48)1 	C6BFX_-3 17 	4"3E,)$5r::@@BB 	< / 6 6s ; ;E* i(=rBBHHJJ 	D$7$>$>s$C$CE.!9%7<<BBDDJJLL 	2!1E+ i(=rBBHHJJPPRR 	8$7E.!!y)?DDJJLL 	7"6E,%'Y/KR%P%P%V%V%X%X"% 	C(BE$%!#+Lb!Q!Q!W!W!Y!Y! 	G0FE,-i 5r::@@BB 	=H!#Y96BB)$CDDL	> > >FX_-:  Y'?@@9%;<< _"6 _v'7775C5E5EFX129=-.6-.4;;077<<,I&@+NN	*Df M MNNI&@BXYY"$),Lf"U"U"["["]"]au"u=
 =
 	 	 	 ')i0M&N&N#&2+11337QQ X1289JK (*y1O'P'P$' 		_"&*-I"J"J   # # < D DT3 O O U UVY Z Z# # # P_FX1289KLy!;<< 
H0F4DDD>I)$:FCCi DEEM	?
 ?
 ?
-.; 	+&&Iy!344 %$ %>!111/=/?/?FX^,37(0 06 	('E(O 	6%5E/"9%7<<BBDD 	3"2E,9%=rBBHHJJ 	9(8E$%)0"55;;==4 		)$5r::@@BBK %#9 !(++33J    
	<G!Y899`RYGWY_=`=`I<== y!<==	= 	= 	=FX^,9 Y/00PBI>O4P4PN#788 &A, &A6#3331?1A1AFX-.59)*2 !128(h0l#344 	-,E(O#344 	-,E(OY';<< 	5"4E,I&9:: 	3!2E+y!788 	>I!)$Y:FCC)$DEEM	? ? ?FX-.; I&9:: 	C!2!8!8!:!:!@!@!B!BE+ "	*A B B  	;%:E/"!y)?@@ 	I$8$>$>$@$@$F$F$H$HE.!#%9-G#H#H # 	A(@E$% 9344L 	7:<7H7HF'44 	 	 	D	 /00J 	25j//F'// 	 	 	D	*kB777777??????&5577 e	 e	E~~''    95:qIII  
++H!+//99L "N&2*%*%<%<%>%>NN  * * *LL=uz1   &*NNNNNN	* #<+?#%1$+ (3(4I#,#4 ",:,0*.y/D"*E*E-" -" -"	
 )7t(D(D(DI%nd;;   +/wy'2/N/N/TRT*U*UK(6(<(<(>(> = =1#$#6#6$, + 6 6q! < < < <(6(,&1) ) )I &*%*<*<Y*G*G%H%H

$ + + +T!J   &+





+ & !P!J  
 !v///-;-=-= *15FX&. .$// N N++ xx55 *077===dD)) 
dhhy.A.A 
>I!) #DO 4 4 &!1!1!;V<<  $xx44&C[ 1222!%	? 	? 	?F$X.;ye	L  B B B=qAAAAAAAAB "+2244 = =!!"5t<<<<= =sN  (,w 
w"!w"",| 
||@.,AA A
AA(A'AA(kAk k=AllAl@0BA
 A

BAABAA1BB B
BBBBBB-BP4 C
BC CBP4 C 
BDC*!BDDBP4 DBDD:BP4 EBE%E$BP4 E%
BFE/#BFFBP4 FBFFBP4 F2C"BJJBP4 J
BKJ#BKKBP4 KBKKE'BP4 P4
BQ#P>BQQBQ#)T)r6   )r=   )r+  r  r   N)Hr   r  r   r  pathlibr   dataclassesr   r   typingr   r   r   r	   r
   enumr   hermes_cli.configr   utilsr   r  r   r1   r0   r!   r$   r(   r+   r,   r   r5   r<   r@   rF   r   rH   rI   rz   r   rK   	frozenset__members__r  _BUILTIN_PLATFORM_VALUESr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r   r"   r    <module>rd     sA      				        ( ( ( ( ( ( ( ( 6 6 6 6 6 6 6 6 6 6 6 6 6 6       - - - - - - ! ! ! ! ! !		8	$	$3 3 3d 3d 3 3 3 3 u     s S S    ! !3 !8C= ! ! ! !H s S c     c C s     C E$PT*DU    ( 26 # 5 5 5^ ^ ^ ^ ^t ^ ^ ^F %9$T$Th6J6Q6Q6S6S$T$T$TTT  
 
 
 
 
 
 
 
D '
 '
 '
 '
 '
 '
 '
 '
T <
 <
 <
 <
 <
 <
 <
 <
H *-  , , ,*, "C , , , & # & & & ;
 ;
 ;
 ;
 ;
 ;
 ;
 ;
L O   ''O@@N>>LCC))&&   O>>N==      N        7R d8X~6F6L-M#MN   D ~ ~ ~ ~ ~ ~ ~ ~B{] { { { {|B( B( B( B(JZ= Z=4 Z= Z= Z= Z= Z= Z=r"   