
    i                       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d5d
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d6d
ededefdZd7d
edede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+e G d d                      Z,e$j-        d  e$j.        d! e$j/        d" e$j0        d# e$j1        d$ e$j2        d% e$j3        d& e$j4        d' e$j5        d( e$j6        d) e$j7        d* e$j8        d+ e$j9        d, e$j:        d- iZ;e<e$ee+gef         f         e#d.<   e G d/ d0                      Z=de=fd1Z>d8d3Z?d2e=ddfd4Z@dS )9z
Gateway configuration management.

Handles loading and validating configuration for:
- Connected platforms (Telegram, Discord, WhatsApp)
- 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)true1yesonT)false0nooffF)r   )
isinstancestrstriplowerr   )r   r   lowereds      3/home/ubuntu/.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)   pairc                     t          | t                    r,|                                                                 }|dv r|S |S )z8Normalize unauthorized DM behavior to a supported value.>   r-   ignorer   r   r   r   r   r   
normalizeds      r    #_normalize_unauthorized_dm_behaviorr3   ;   sD    % [[]]((**
+++Nr"   publicc                     t          | t                    r,|                                                                 }|dv r|S |S )z4Normalize notice delivery mode to a supported value.>   r4   privater0   r1   s      r    _normalize_notice_deliveryr7   D   sD    % [[]]((**
...Nr"   _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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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_r8   _scan_bundled_plugin_platformsobject__new___value_upperreplace_name__member_map_gateway.platform_registryrU   is_registered	Exception)clsr   pseudorU   s       r    	_missing_zPlatform._missing_o   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addnamer   ra   )rb   namesplatforms_dirchilds       r    rW   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FEISHUWECOMWECOM_CALLBACKWEIXINBLUEBUBBLESQQBOTYUANBAOclassmethodrd   rh   rW    r"   r    r:   r:   R   s          EHGHEFJF#ME
CHJGFE%NFKEG* * [*X s    [  r"   r:   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eeef         fdZ	e
deeef         dd fd            Zd	S )
HomeChannelz
    Default destination for a platform.
    
    When a cron job specifies deliver="telegram" without a specific chat ID,
    messages are sent to this home channel.
    platformchat_idro   r   c                 6    | j         j        | j        | j        dS )Nr   r   ro   )r   r   r   ro   selfs    r    to_dictzHomeChannel.to_dict   s#    +|I
 
 	
r"   datac                      | t          |d                   t          |d                   |                    dd                    S )Nr   r   ro   Homer   )r:   r   getrb   r   s     r    	from_dictzHomeChannel.from_dict   sK    sd:.//Y((&&))
 
 
 	
r"   N)rs   rt   ru   rv   r:   __annotations__r   r   r	   r   r   r   r   r"   r    r   r      s           LLL
III
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rG   rH   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)rb   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)rs   rt   ru   rv   r   r   r   r   r+   r   r   boolr   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	<    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_modedefault_factoryextrar   c                     | j         | j        | j        d}| j        r
| j        |d<   | j        r
| j        |d<   | j        r| j                                        |d<   |S )N)r   r   r   r   r   r   )r   r   r   r   r   r   r   )r   results     r    r   zPlatformConfig.to_dict  su    |Z!/
 

 : 	)"jF7O< 	- $F9 	A%)%6%>%>%@%@F>"r"   r   c                 N   d }d|v r t                               |d                   } | t          |                    d          d          |                    d          |                    d          ||                    dd          |                    di           	          S )
Nr   r   Fr   r   r   r   r   )r   r   r   r   r   r   )r   r   r!   r   )rb   r   r   s      r    r   zPlatformConfig.from_dict  s    T!!&00n1EFFLs )!4!4e<<((7##HHY''%((?G<<((7B''
 
 
 	
r"   )rs   rt   ru   rv   r   r   r   r   r   r   r   r   r   r   r   dictr   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   c                       e Zd ZU dZdZeed<   dZeed<   dZ	e
ed<   dZeed	<   d
Zeed<   dZe
ed<   deeef         fdZedeeef         dd fd            ZdS )StreamingConfigzCConfiguration for real-time token streaming to messaging platforms.Fr   edit	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          d          t          |                    d          d          |                    d	d
          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_dictH  s     	355Ls )!4!4e<<hh{F33'(A(A3GG(2D)E)ErJJ88Hf--&3455t' '	
 	
 	
 		
r"   N)rs   rt   ru   rv   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   )r   r   r   r   cfgs    r    <lambda>r   `  s;    	l##M)LcimmG6L6L" " r"   c                     dS NTr   r   s    r    r   r   c  s    4 r"   c                 P    t          | j                            d                    S )Nhttp_urlr   r   r   r   s    r    r   r   d  s    cimmJ&?&?!@!@ r"   c                 P    t          | j                            d                    S )Naddressr   r   s    r    r   r   e  s    SY]]9%=%= > > r"   c                 D    t          t          j        d                    S )NTWILIO_ACCOUNT_SID)r   osgetenvr   s    r    r   r   f  s    d29-A#B#BCC r"   c                     dS r   r   r   s    r    r   r   g  s    T r"   c                     dS r   r   r   s    r    r   r   h  s    $ r"   c                 P    t          | j                            d                    S )Napp_idr   r   s    r    r   r   i  s    cimmH&=&=!>!> r"   c                 P    t          | j                            d                    S )Nbot_idr   r   s    r    r   r   j  s    SY]]8%<%< = = r"   c                     t          | j                            d          p| j                            d                    S )Ncorp_idappsr   r   s    r    r   r   k  s4    	i  9CIMM&$9$9* * r"   c                     t          | j                            d          o| j                            d                    S )N
server_urlpasswordr   r   s    r    r   r   n  s4    d	l##A	j(A(A' ' r"   c                     t          | j                            d          o| j                            d                    S )Nr   client_secretr   r   s    r    r   r   q  s4    	hBCIMM/$B$B! ! r"   c                     t          | j                            d          o| j                            d                    S )Nr   
app_secretr   r   s    r    r   r   t  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)r   r   r   r   r   r   s    r    r   r   w  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<    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   rg   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stt_enabledgroup_sessions_per_userFthread_sessions_per_userr-   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.)rg   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   rT   F)r:   r   r   r   r   r   r   r   r_   rU   r   is_connectedvalidate_configra   )r   r   r  checkerrU   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)rg   r   r   )r   r   r  s      r    get_home_channelzGatewayConfig.get_home_channel  s-    ##H-- 	'&&tr"   N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   r  s      r    get_reset_policyzGatewayConfig.get_reset_policy  sU      	4D$:::)(33  	4LD,>>>%l33((r"   c                    d | j                                         D             | j                                        d | j                                        D             d | j                                        D             | j        | j        t          | j	                  | j
        | j        | j        | j        | j        | j                                        | j        dS )Nc                 H    i | ]\  }}|j         |                                 S r   r   r   )r   pcs      r    
<dictcomp>z)GatewayConfig.to_dict.<locals>.<dictcomp>  s5       )-A  r"   c                 >    i | ]\  }}||                                 S r   )r   r   kvs      r    r#  z)GatewayConfig.to_dict.<locals>.<dictcomp>  s3       #'1a199;;  r"   c                 H    i | ]\  }}|j         |                                 S r   r   )r   r!  r'  s      r    r#  z)GatewayConfig.to_dict.<locals>.<dictcomp>  s5     " " ")-A" " "r"   rg   r   r   r   r   r  r  r  r  r  r  r	  r
  r  )rg   r  r   r   r   r   r   r  r   r  r  r  r  r  r	  r
  r  r   s    r    r   zGatewayConfig.to_dict  s     151E1E1G1G   %)$=$E$E$G$G +/+=+C+C+E+E  " "151G1M1M1O1O" " " #1"1 122 $ 5+'+'C(,(E(,(E//11*.*I)
 
 	
r"   r   c                    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          d          }	 t          |                     dd                    }|dk     rd}n# t          t
          f$ r d}Y nw xY w | ||
||	|                     dddg          ||t          |                     d          d          t          |d          t          |d          t          |d          |t                              |                     di                     |          S )Nrg   r   r   r   r  r  r  r  sttr   r  r  r	  r-   r  r  r   r   r   r   r  TFr
  r)  )r   r  r:   r   r   r&   r   r   r   r   r   r3   r+   r%   r!   r   )rb   r   rg   platform_nameplatform_datar   r   	type_namepolicy_datar   default_policyr  r  r  r  r  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 #FHH/00$
 $
 
	,),TXX6RTV-W-W)X)X&)A---.*:& 	, 	, 	,)+&&&	, s!/'/88$4vx6HII)%)$((3E*F*FMM$[$77$01H$$O$O%12JE%R%R%=%//b0I0IJJ'A
 
 
 	
s5   ,A
A+*A++,D
D%$D%)+J J+*J+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	  )rg   r   r   r3   r	  r   r   platform_cfgs      r    get_unauthorized_dm_behaviorz*GatewayConfig.get_unauthorized_dm_behaviorQ  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_deliveryr4   )rg   r   r   r7   r2  s      r    get_notice_deliveryz!GatewayConfig.get_notice_delivery\  sf     	>--h77L  1\5G G G1 &**+<==   xr"   )NNr   )+rs   rt   ru   rv   r   r   rg   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   r  r  r   r   r   r4  r7  r   r"   r    r   r   ~  s,          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!!! K %)T(((%*d*** %+c*** "'!G!G!GIGGG ')(((h     x    TX        D h{6K     (,&*) )8$) sm) 
	) ) ) )(
c3h 
 
 
 
0 B
T#s(^ B
 B
 B
 B
 [B
H	- 	-Xh5G 	-SV 	- 	- 	- 	-	 	HX,> 	# 	 	 	 	 	 	r"   r   c                  ,   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  }|                                rt          |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<   d|v r|d         |d<   d|v r|d         |d<   d|v r&t!          |                    d          d          |d<   |                    d          }|                    di           }t          |t                    si }||d<   t          |t                    r|                                D ]\  }}t          |t                    s|                    |i           }t          |t                    si }i |                    di           |                    di           }|t&          j        j        k    r	d|v rd|d<   i ||}|r||d<   |||<   ||d<   t&          D ]W}|t&          j        k    r|                    |j                  }t          |t                    sDi }d|v r:t!          |                    d          |                    dd                    |d<   d|v r&t/          |                    d          d          |d<   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!<   d"|v r|d"         |d"<   d#|v r|d#         |d#<   d$|v r|d$         |d$<   d%|v r|d%         |d%<   |t&          j        t&          j        fv rd&|v r|d&         |d&<   d'|v rD|d'         }t          |t                    r"d( |                                D             |d'<   n||d'<   d|v }|s|s|                    |j        i           }t          |t                    si }|||j        <   |r|d         |d<   |                    di           }t          |t                    si }||d<   |t&          j        k    r|rd|d<   |                    |           Y|                    d)i           }t          |t                    rd|v rHt5          j        d*          s4t9          |d                                                   t4          j        d*<   d+|v rHt5          j        d,          s4t9          |d+                                                   t4          j        d,<   d-|v rHt5          j        d.          s4t9          |d-                                                   t4          j        d.<   |                    d           }|dt5          j        d/          sPt          |t>                    rd0                     d1 |D                       }t9          |          t4          j        d/<   d2|v rHt5          j        d3          s4t9          |d2                                                   t4          j        d3<   |                    d4i           }t          |t                    rNd|v rHt5          j        d5          s4t9          |d                                                   t4          j        d5<   |                    d           }|dt5          j        d6          sPt          |t>                    rd0                     d7 |D                       }t9          |          t4          j        d6<   d8|v rHt5          j        d9          s4t9          |d8                                                   t4          j        d9<   d2|v rHt5          j        d:          s4t9          |d2                                                   t4          j        d:<   |                    d;          }|dt5          j        d<          sPt          |t>                    rd0                     d= |D                       }t9          |          t4          j        d<<   |                    d>          }|dt5          j        d?          sPt          |t>                    rd0                     d@ |D                       }t9          |          t4          j        d?<   |                    dA          }|dt5          j        dB          sPt          |t>                    rd0                     dC |D                       }t9          |          t4          j        dB<   |                    dD          } t          | t                    rTdED ]Q\  }!}"|!| v rHt5          j        |"          s4t9          | |!                                                   t4          j        |"<   R|                    dFi           }#t          |#t                    rd|#v rHt5          j        dG          s4t9          |#d                                                   t4          j        dG<   d!|#v r;t5          j        dH          s't          j!        |#d!                   t4          j        dH<   |#                    dI          }|dt5          j        dJ          sPt          |t>                    rd0                     dK |D                       }t9          |          t4          j        dJ<   |#                    dL          }$|$dt5          j        dM          sPt          |$t>                    rd0                     dN |$D                       }$t9          |$          t4          j        dM<   d2|#v rHt5          j        dO          s4t9          |#d2                                                   t4          j        dO<   dP|#v rHt5          j        dQ          s4t9          |#dP                   "                                t4          j        dQ<   |#                    d#          }%|%dt5          j        dR          sPt          |%t>                    rd0                     dS |%D                       }%t9          |%          t4          j        dR<   |#                    d%          }&|&dt5          j        dT          sPt          |&t>                    rd0                     dU |&D                       }&t9          |&          t4          j        dT<   |#                    dV          }'|'dt5          j        dW          sPt          |'t>                    rd0                     dX |'D                       }'t9          |'          t4          j        dW<   dY|#v r|                    t&          j#        j        i           }t          |t                    si }||t&          j#        j        <   |                    di           }t          |t                    si }||d<   |#dY         |dY<   |                    dZi           }(t          |(t                    rd|(v rHt5          j        d[          s4t9          |(d                                                   t4          j        d[<   d!|(v r;t5          j        d\          s't          j!        |(d!                   t4          j        d\<   |(                    dI          }|dt5          j        d]          sPt          |t>                    rd0                     d^ |D                       }t9          |          t4          j        d]<   d"|(v rHt5          j        d_          s4t9          |(d"                                                   t4          j        d_<   |(                    d#          })|)dt5          j        d`          sPt          |)t>                    rd0                     da |)D                       })t9          |)          t4          j        d`<   d$|(v rHt5          j        db          s4t9          |(d$                                                   t4          j        db<   |(                    d%          }*|*dt5          j        dc          sPt          |*t>                    rd0                     dd |*D                       }*t9          |*          t4          j        dc<   |                    dei           }+t          |+t                    rd|+v rHt5          j        df          s4t9          |+d                                                   t4          j        df<   d!|+v r;t5          j        dg          s't          j!        |+d!                   t4          j        dg<   |+                    dI          }|dt5          j        dh          sPt          |t>                    rd0                     di |D                       }t9          |          t4          j        dh<   |+                    dj          },|,dt5          j        dk          sPt          |,t>                    rd0                     dl |,D                       },t9          |,          t4          j        dk<   |                    dmi           }-t          |-t                    r_d|-v rHt5          j        dn          s4t9          |-d                                                   t4          j        dn<   |-                    do          }|dt5          j        dp          sPt          |t>                    rd0                     dq |D                       }t9          |          t4          j        dp<   d8|-v rHt5          j        dr          s4t9          |-d8                                                   t4          j        dr<   ds|-v rHt5          j        dt          s4t9          |-ds                                                   t4          j        dt<   |                    dui           }.t          |.t                    rLd-|.v rHt5          j        dv          s4t9          |.d-                                                   t4          j        dv<   n6# t          $ r)}t
                              dw| d	z  |           Y d}~nd}~ww xY wtH          %                    |          }/tM          |/           tO          |/           |/S )xu  
    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)r+  r  r  r
  r   r  r	  r-   rg   r   r   T_enabled_explicitr6  r4   reply_prefixreply_in_threadrequire_mentionfree_response_channelsmention_patterns	dm_policy
allow_fromgroup_policygroup_allow_from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?   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   rI  r   r'  s     r    r   z&load_gateway_config.<locals>.<genexpr>  (      &;&;!s1vv&;&;&;&;&;&;r"   	reactionsSLACK_REACTIONSr=   DISCORD_REQUIRE_MENTIONDISCORD_FREE_RESPONSE_CHANNELSc              3   4   K   | ]}t          |          V  d S r   rI  rR  s     r    r   z&load_gateway_config.<locals>.<genexpr>#  rS  r"   auto_threadDISCORD_AUTO_THREADDISCORD_REACTIONSignored_channelsDISCORD_IGNORED_CHANNELSc              3   4   K   | ]}t          |          V  d S r   rI  rR  s     r    r   z&load_gateway_config.<locals>.<genexpr>-  (      %9%9c!ff%9%9%9%9%9%9r"   allowed_channelsDISCORD_ALLOWED_CHANNELSc              3   4   K   | ]}t          |          V  d S r   rI  rR  s     r    r   z&load_gateway_config.<locals>.<genexpr>3  r_  r"   no_thread_channelsDISCORD_NO_THREAD_CHANNELSc              3   4   K   | ]}t          |          V  d S r   rI  rR  s     r    r   z&load_gateway_config.<locals>.<genexpr>9  rS  r"   allow_mentions))everyoneDISCORD_ALLOW_MENTION_EVERYONE)rolesDISCORD_ALLOW_MENTION_ROLES)usersDISCORD_ALLOW_MENTION_USERS)replied_user"DISCORD_ALLOW_MENTION_REPLIED_USERr<   TELEGRAM_REQUIRE_MENTIONTELEGRAM_MENTION_PATTERNSfree_response_chatsTELEGRAM_FREE_RESPONSE_CHATSc              3   4   K   | ]}t          |          V  d S r   rI  rR  s     r    r   z&load_gateway_config.<locals>.<genexpr>T  rS  r"   ignored_threadsTELEGRAM_IGNORED_THREADSc              3   4   K   | ]}t          |          V  d S r   rI  rR  s     r    r   z&load_gateway_config.<locals>.<genexpr>Y  s(      2S2Sa3q662S2S2S2S2S2Sr"   TELEGRAM_REACTIONS	proxy_urlTELEGRAM_PROXYTELEGRAM_ALLOWED_USERSc              3   4   K   | ]}t          |          V  d S r   rI  rR  s     r    r   z&load_gateway_config.<locals>.<genexpr>b  s(      0O0OAQ0O0O0O0O0O0Or"   TELEGRAM_GROUP_ALLOWED_USERSc              3   4   K   | ]}t          |          V  d S r   rI  rR  s     r    r   z&load_gateway_config.<locals>.<genexpr>g  (      6[6[!s1vv6[6[6[6[6[6[r"   group_allowed_chatsTELEGRAM_GROUP_ALLOWED_CHATSc              3   4   K   | ]}t          |          V  d S r   rI  rR  s     r    r   z&load_gateway_config.<locals>.<genexpr>l  r~  r"   disable_link_previewsr>   WHATSAPP_REQUIRE_MENTIONWHATSAPP_MENTION_PATTERNSWHATSAPP_FREE_RESPONSE_CHATSc              3   4   K   | ]}t          |          V  d S r   rI  rR  s     r    r   z&load_gateway_config.<locals>.<genexpr>  rS  r"   WHATSAPP_DM_POLICYWHATSAPP_ALLOWED_USERSc              3   4   K   | ]}t          |          V  d S r   rI  rR  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   rI  rR  s     r    r   z&load_gateway_config.<locals>.<genexpr>  rS  r"   rF   DINGTALK_REQUIRE_MENTIONDINGTALK_MENTION_PATTERNSDINGTALK_FREE_RESPONSE_CHATSc              3   4   K   | ]}t          |          V  d S r   rI  rR  s     r    r   z&load_gateway_config.<locals>.<genexpr>  rS  r"   allowed_usersDINGTALK_ALLOWED_USERSc              3   4   K   | ]}t          |          V  d S r   rI  rR  s     r    r   z&load_gateway_config.<locals>.<genexpr>  s(      *C*Ca3q66*C*C*C*C*C*Cr"   rB   MATRIX_REQUIRE_MENTIONfree_response_roomsMATRIX_FREE_RESPONSE_ROOMSc              3   4   K   | ]}t          |          V  d S r   rI  rR  s     r    r   z&load_gateway_config.<locals>.<genexpr>  rS  r"   MATRIX_AUTO_THREADdm_mention_threadsMATRIX_DM_MENTION_THREADSrI   FEISHU_ALLOW_BOTSus   Failed to process config.yaml — falling back to .env / gateway.json values. Check %s for syntax errors. Error: %s)(r   rm   openjsonloadloggerinfora   warningyaml	safe_loadr   r   r   typers   r3   
setdefaultr  r:   r{   r   rw   r7   ry   updater   r   r   r   environr   joindumpsr   rx   r   r   _apply_env_overrides_validate_gateway_config)0_homegw_datagateway_json_pathfer  config_yaml_pathyaml_cfgsrqcstt_cfgstreaming_cfgyaml_platformsplatforms_data	plat_name
plat_blockexistingmerged_extramergedplatr3  bridgedrG  enabled_was_explicit	plat_datar   	slack_cfgfrcdiscord_cfgicacntcallow_mentions_cfgyaml_keyenv_keytelegram_cfgrt  r  group_allowed_usersr  whatsapp_cfgafgafdingtalk_cfgallowed
matrix_cfg
feishu_cfgr  s0                                                   r    load_gateway_configr  h  s    EG .!! 	J	J'w??? -1)A,,,"- - - - - - - - - - - - - - -KKN!     	J 	J 	JNN24EqIIIIIIII	J|
 =0""$$ q	\&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$LL55M-.. 5'4$8++,45E,F()!X--.67I.J*+)X556YLL!;<<7 723 &\\+66N$//R@@Nnd33 6!#'5$.$// 6-;-A-A-C-C 7 7)Iz%j$77 ! -11)R@@H%h55 &#%#_hll7B&?&?#_:>>RY[]C^C^#_L HN$888Y*=T=T<@%8977J7F# 7*6w06N9--'5$  ;& ;&8>))'||DJ77!,55 -==:]$(()CDD$>GG; ;G67 %441K$(():;; 2 2G-. "\11.:>.JGN+$441=>O1PG-.$441=>O1PG-.+|;;8DE]8^G45%552>?Q2RG./,..+7+DGK(<//,8,FGL)!\11.:>.JGN+%552>?Q2RG./H,hn===BZ^jBjBj8DE]8^G45$44&23D&EO!/488 E5d5dOLaLaLcLc5d5d5d 1225D 12'0L'@$ '; *55dj"EE	!)T22 ; "I1:N4:.' C+7	+BIi(!,,Wb99!%.. /E).Ig&8>)).B)15E-.W%%%% !Wb11I)T** X$	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 #,,y"55K+t,, +\$33BIF_<`<`3<?L]@^<_<_<e<e<g<gBJ89!oo&>???295U+V+V?!#t,, <!hh&;&;s&;&;&;;;CFs88BJ?@ K//	BW8X8X/8;K<V8W8W8]8]8_8_BJ45+--bi@S6T6T-69+k:R6S6S6Y6Y6[6[BJ23 __%788>")4N*O*O>!"d++ : XX%9%9b%9%9%999=@WWBJ9: __%788>")4N*O*O>!"d++ : XX%9%9b%9%9%999=@WWBJ9:!oo&:;;?295Q+R+R?!#t,, <!hh&;&;s&;&;&;;;?B3xxBJ;<
 &1__5E%F%F"0$77 \. \ \)' $'999")GBTBT9256H6R2S2S2Y2Y2[2[BJw/ $<<
B77L,-- +[$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=>"."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 , 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=>*l:: . 9 9(:K:QSU V VI%i66 L$&	BKx'8'>?%00"==E%eT22 3 "-2	'*5ABY5ZE12#<<
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=> $<<
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=>&**?;;&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;< 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 
B7B22B7;/AW1 *DAW1 DAW1 DASAW1 W1
AX$W;AXXAX$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   r  r  r   r:   rx   ry   r{   r}   r~   r   rg   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                 >   t          j        d          }|rkt          j        | j        vr t                      | j        t          j        <   d| j        t          j                 _        || 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          }|rot          j        | j        vr t                      | j        t          j        <   d |
                    d          D             | j        t          j                 j        d	<   t          j        d
          }|r\t          j        | j        v rIt          t          j        |t          j        dd                    | j        t          j                 _        t          j        d          }|rkt          j        | j        vr t                      | j        t          j        <   d| j        t          j                 _        || j        t          j                 _        t          j        d          }|r\t          j        | j        v rIt          t          j        |t          j        d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 }|rOt          j        | j        vr t                      | j        t          j        <   d| j        t          j                 _        t          j        d          }	|	r\t          j        | j        v rIt          t          j        |	t          j        d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          }|r\t          j        | j        v rIt          t          j        |t          j        dd                    | j        t          j                 _        t          j        d          }t          j        d          }|r|rt          j        | j        vr t                      | j        t          j        <   d| j        t          j                 _        | j        t          j                 j                            ||t          j        dd                                          dv d           t          j        d           }|r\t          j        | j        v rIt          t          j        |t          j        d!d                    | j        t          j                 _        t          j        d"          }|rt          j        d#d          }|st*                              d$           t          j        | j        vr t                      | j        t          j        <   d| j        t          j                 _        || j        t          j                 _        || j        t          j                 j        d%<   t          j        d&          }|r\t          j        | j        v rIt          t          j        |t          j        d'd                    | j        t          j                 _        t          j        d(          }t          j        d)d          }|st          j        d*          r|st*                              d+           t          j        | j        vr t                      | j        t          j        <   d| j        t          j                 _        |r|| j        t          j                 _        || j        t          j                 j        d,<   t          j        d-d          }|r|| j        t          j                 j        d.<   t          j        d*d          }|r|| j        t          j                 j        d/<   t          j        d0d                                          dv }|| j        t          j                 j        d1<   t          j        d2d          }|r|| j        t          j                 j        d3<   t          j        d4          }|r\t          j        | j        v rIt          t          j        |t          j        d5d                    | j        t          j                 _        t          j        d6          }|rt          j        | j        vr t                      | j        t          j        <   d| j        t          j                 _        || j        t          j                 _        t          j        d7          }|r|| j        t          j                 j        d%<   t          j        d8          }t          j        d9          }t          j        d:          }t          j        d;          } t5          |||| g          rt          j        | j        vr t                      | j        t          j        <   d| j        t          j                 _        | j        t          j                 j                            ||| d<           t          j        d=          }!|!r\t          j        | j        v rIt          t          j        |!t          j        d>d                    | j        t          j                 _        t          j        d?          }"|"r~t          j        | j        vr t                      | j        t          j        <   d| j        t          j                 _        t          j        d@d          | j        t          j                 _        t          j        dA          }#|#r\t          j        | j        v rIt          t          j        |#t          j        dBd                    | j        t          j                 _        t          j        dCd                                          dv }$t          j        dDd          }%t          j        dEd          }&t          j        dF          }'t          j        dG          }(|$s|%rIt          j        | j        vr t                      | j        t          j        <   d| j        t          j                 _        |%r|%| j        t          j                 j        dH<   |&r@dI |&
                    d          D             })|)r|)| j        t          j                 j        dJ<   |'r>	 t?          |'          | j        t          j                 j        dK<   n# t@          $ r Y nw xY w|(r|(| j        t          j                 j        dL<   t          j        dMd          }*|*r|*| j        t          j                 j        dN<   t          j        dOd                                          dv }+t          j        dP          },t          j        dQd          }-|+rt          j!        | j        vr t                      | j        t          j!        <   d| j        t          j!                 _        |,r>	 t?          |,          | j        t          j!                 j        dK<   n# t@          $ r Y nw xY w|-r|-| j        t          j!                 j        dR<   t          j        dS          }.t          j        dT          }/|.r|/rt          j"        | j        vr t                      | j        t          j"        <   d| j        t          j"                 _        | j        t          j"                 j                            |.|/dU           t          j        dV          }0|0rIt          t          j"        |0t          j        dWd                    | j        t          j"                 _        t          j        dX          }1t          j        dY          }2|1rw|2rtt          j#        | j        vr t                      | j        t          j#        <   d| j        t          j#                 _        | j        t          j#                 j                            |1|2t          j        dZd[          t          j        d\d]          d^           t          j        d_d          }3|3r|3| j        t          j#                 j        d`<   t          j        dad          }4|4r|4| j        t          j#                 j        db<   t          j        dc          }5|5rIt          t          j#        |5t          j        ddd                    | j        t          j#                 _        t          j        de          }6t          j        df          }7|6r|7rt          j$        | j        vr t                      | j        t          j$        <   d| j        t          j$                 _        | j        t          j$                 j                            |6|7dg           t          j        dhd          }8|8r|8| j        t          j$                 j        di<   t          j        dj          }9|9rIt          t          j$        |9t          j        dkd                    | j        t          j$                 _        t          j        dl          }:t          j        dm          };|:r|;rt          j%        | j        vr t                      | j        t          j%        <   d| j        t          j%                 _        | j        t          j%                 j                            |:|;t          j        dnd          t          j        dod          t          j        dpd          t          j        dqdr          t?          t          j        dsdt                    du           t          j        dv          }<t          j        dw          }=|<s|=rt          j&        | j        vr t                      | j        t          j&        <   d| j        t          j&                 _        |<r|<| j        t          j&                 _        | j        t          j&                 j        }>|=r|=|>dx<   t          j        dyd          '                                }?|?r|?(                    dz          |>d{<   t          j        d|d          '                                }@|@r|@(                    dz          |>d}<   t          j        d~d          '                                                                }A|Ar|A|>d<   t          j        dd          '                                                                }B|Br|B|>d<   t          j        dd          '                                }C|Cr|C|>d<   t          j        dd          '                                }D|Dr|D|>d<   t          j        dd          '                                }E|Er|E|>d<   t          j        dd          '                                }F|FrIt          t          j&        |Ft          j        dd                    | j        t          j&                 _        t          j        d          }Gt          j        d          }H|Gr|Hrt          j)        | j        vr t                      | j        t          j)        <   d| j        t          j)                 _        | j        t          j)                 j                            |G(                    dz          |Ht          j        dd          t?          t          j        ddt                    t          j        dd          t          j        dd                                          dv d           t          j        d          }I|Ir\t          j)        | j        v rIt          t          j)        |It          j        dd                    | j        t          j)                 _        t          j        d          }Jt          j        d          }K|Js|Krt          j*        | j        vr t                      | j        t          j*        <   d| j        t          j*                 _        | j        t          j*                 j        }>|Jr|J|>d<   |Kr|K|>d<   t          j        dd          '                                }L|Lr|L|>d<   t          j        dd          '                                }M|Mr|M|>d<   t          j        dd          '                                }Nd}O|NsYt          j        dd          '                                }P|Pr0|P}Nd}OtW          j,        tZ                                        d           |Nr]t          t          j*        |Nt          j        d          pt          j        |Od                    | j        t          j*                 _        t          j        d          pt          j        d          }Qt          j        d          }R|Qr|Rrt          j.        | j        vr t                      | j        t          j.        <   d| j        t          j.                 _        | j        t          j.                 j        }>|Q|>d<   |R|>d<   t          j        d          }S|Sr|S|>d<   t          j        d          }T|Tr|T|>d<   t          j        d          }U|Ur|U|>d<   t          j        d          }V|Vr|V|>d<   t          j        d          }W|WrIt          t          j.        |Wt          j        dd                    | j        t          j.                 _        t          j        d          }X|Xr)|X'                                                                |>d<   t          j        d          }Y|Yr|Y|>d<   t          j        d          }Z|Zr)|Z'                                                                |>d<   t          j        d          }[|[r|[|>d<   t          j        d          }\|\r+	 t?          |\          | j/        _0        n# t@          $ r Y nw xY wt          j        d          }]|]r+	 t?          |]          | j/        _1        n# t@          $ r Y nw xY w	 ddl2m3}^  |^             ddl4m5}_ |_6                                D ]}`	 |`7                                sn8# tp          $ r+}at*          9                    d|`j:        |a           Y d}a~aId}a~aww xY wt          |`j:                  }b|b| j        vrt                      | j        |b<   d| j        |b         _        dS # tp          $ r&}at*          9                    d|a           Y d}a~adS d}a~aww xY w)z/Apply environment variable overrides to config.r  TTELEGRAM_REPLY_TO_MODE )r   r   allTELEGRAM_FALLBACK_IPSc                 ^    g | ]*}|                                 |                                 +S r   r   )r   ips     r    
<listcomp>z(_apply_env_overrides.<locals>.<listcomp>(  sD     E
 E
 E
RXXZZE
HHJJE
 E
 E
r"   rP  fallback_ipsTELEGRAM_HOME_CHANNELTELEGRAM_HOME_CHANNEL_NAMEr   r   r  DISCORD_HOME_CHANNELDISCORD_HOME_CHANNEL_NAMEDISCORD_REPLY_TO_MODEWHATSAPP_ENABLED)r   r   r   WHATSAPP_HOME_CHANNELWHATSAPP_HOME_CHANNEL_NAMEr  r<  FSLACK_HOME_CHANNELSLACK_HOME_CHANNEL_NAMESIGNAL_HTTP_URLSIGNAL_ACCOUNTSIGNAL_IGNORE_STORIESr   )r   accountignore_storiesSIGNAL_HOME_CHANNELSIGNAL_HOME_CHANNEL_NAMEr  MATTERMOST_URLz2MATTERMOST_TOKEN set but MATTERMOST_URL is missingurlMATTERMOST_HOME_CHANNELMATTERMOST_HOME_CHANNEL_NAMEr  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
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_NAMEr   TWILIO_AUTH_TOKENSMS_HOME_CHANNELSMS_HOME_CHANNEL_NAMEAPI_SERVER_ENABLEDAPI_SERVER_KEYAPI_SERVER_CORS_ORIGINSAPI_SERVER_PORTAPI_SERVER_HOSTkeyc                 ^    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secretr   r   )r   r   DINGTALK_HOME_CHANNELDINGTALK_HOME_CHANNEL_NAMEFEISHU_APP_IDFEISHU_APP_SECRETFEISHU_DOMAINrI   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WECOM_BOT_IDWECOM_SECRET)r   r.  WECOM_WEBSOCKET_URLwebsocket_urlWECOM_HOME_CHANNELWECOM_HOME_CHANNEL_NAME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_keyr(  r'  r  WEIXIN_ACCOUNT_IDr   WEIXIN_BASE_URL/base_urlWEIXIN_CDN_BASE_URLcdn_base_urlWEIXIN_DM_POLICYrB  WEIXIN_GROUP_POLICYrD  WEIXIN_ALLOWED_USERSrC  WEIXIN_GROUP_ALLOWED_USERSrE  WEIXIN_SPLIT_MULTILINE_MESSAGESsplit_multiline_messagesWEIXIN_HOME_CHANNELWEIXIN_HOME_CHANNEL_NAME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_HOME_CHANNELBLUEBUBBLES_HOME_CHANNEL_NAME	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.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_DM_POLICYYUANBAO_DM_ALLOW_FROMdm_allow_fromYUANBAO_GROUP_POLICYYUANBAO_GROUP_ALLOW_FROMSESSION_IDLE_MINUTESSESSION_RESET_HOURr   )discover_pluginsrT   zcheck_fn for %s raised: %sNz&Plugin platform enable pass failed: %s);r   r   r:   rx   rg   r   r   r   r   r   splitr   r   r   ry   rz   r{   r   popr|   r  r  r  r}   r~   r   r  r   r   r   r   r+   r&   r   r   r   r   r   r   r   rstripr   r   logging	getLoggerrs   r   r   r   r   hermes_cli.pluginsr  r_   rU   plugin_entriescheck_fnra   debugro   )cr  telegram_tokentelegram_reply_modetelegram_fallback_ipstelegram_homediscord_tokendiscord_homediscord_reply_modewhatsapp_enabledwhatsapp_homeslack_tokenslack_configr  
slack_home
signal_urlsignal_accountsignal_homemattermost_tokenmattermost_urlmattermost_homematrix_tokenmatrix_homeserver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_enabledrd  webhook_secret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_idr   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_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_hourr  rU   r  r  r   sc                                                                                                      r    r  r    s    Y344N CF$4442@2B2BFX./6:*+34B*+1 )$<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@@<
 <
 <
*+8 I122M A6#3331?1A1AFX-.59)*23@)*09344L 
(F,<<<:E% 6??;
 ;
 ;
)*7 #:B??EEGG4446#3331?1A1AFX-.;M)*8 y!3R88>>@@DXX ;F$4442@2B2BFX./6:*+3I566M 
*f.>>>;F&!7@@<
 <
 <
*+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9
 9
 9
(5 ,--JY/00N n ?&"2220>0@0@FX_-48)1)/66"% i(?HHNNPPThh8
 8
 	 	 	
 )122K 
x&*:::9D_5v>>:
 :
 :
)6 y!344 L#3R88 	QNNOPPPf&6664B4D4DFX018<,-56F,-3=K,-3E:i 9::O 
8.&2BBB=H(#96BB>
 >
 >
,-: 9233L	"5r:: Try!233 T  	gNNefff?&"2220>0@0@FX_-48)1 	C6BFX_-3@Q)/=i 0"55 	MALFX_-3I>)$5r:: 	RBQFX_-3J?i 3R88>>@@DXX@K)/=9%7<< 	TCSFX_-3K@).//K 
x&*:::9D_2F;;:
 :
 :
)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==9
 9
 9
(5 /00J T<v///-;-=-=FX\*15&.13;NPR1S1S&.y+,,H 
HLF$4446A\2F;;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> #788Y'?@@ 4 F$4442@2B2BFX./6:*+3*+188+3:
 :
 	 	 	 	"9:: 	?J!*%Y;VDD@ @ @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> > >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= = =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> > >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=
 =
 	 	 	 y!;<< 
H0F4DDD>I)$:FCC?
 ?
 ?
-.; 	+&&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_=`=`= = =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? ? ?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	B777777??????&5577 
	6 
	6E~~''    95:qIII  
++Hv///-;-=-= *15FX&..
	6 
	6  B B B=qAAAAAAAAABs   &,{ 
{ {  ,A@ @
A@@A@w Aw: w:
AxxAxx!Ax; x;
AyyAyy,A| y9AzzA| z
A{z!Az?z:A| z?A{{A	A| |
A|?|A|:|:A|?)T)r-   )r4   )r  r   r   N)Arv   r  r   r  pathlibr   dataclassesr   r   typingr   r   r   r	   r
   enumr   hermes_cli.configr   utilsr   r  rs   r  r   r!   r$   r(   r+   r,   r   r3   r7   r8   rh   r   r:   	frozenset__members__values_BUILTIN_PLATFORM_VALUESr   r   r   r   r   rz   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   r"   r    <module>r     s      				        ( ( ( ( ( ( ( ( 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     s S c     c C s     26 # 5 5 5] ] ] ] ]t ] ] ]D %9$T$Th6J6Q6Q6S6S$T$T$TTT  
 
 
 
 
 
 
 
6 '
 '
 '
 '
 '
 '
 '
 '
T +
 +
 +
 +
 +
 +
 +
 +
\ '
 '
 '
 '
 '
 '
 '
 '
d O   ''O@@N>>LCC))&&O>>N==      N        1R d8X~6F6L-M#MN   > f f f f f f f fRb] b b b bJB( B( B( B(JJB JB4 JB JB JB JB JB JBr"   