
    i                        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 ddlmZ ddlmZ ddlmZ  ej        e          Zd d
ededefdZd!d
ededefdZ G d de          Ze G d d                      Ze G d d                      Ze G d d                      Ze G d d                      Ze G d d                      Z de fdZ!d"dZ"de ddfdZ#dS )#z
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)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      6/home/agentuser/.hermes/hermes-agent/gateway/config.py_coerce_boolr       sq    }% ++--%%''000411155'2222    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_behaviorr&   '   sD    % [[]]((**
+++Nr!   c                   b    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S )PlatformzSupported messaging platforms.localtelegramdiscordwhatsappslacksignal
mattermostmatrixhomeassistantemailsmsdingtalk
api_serverwebhookfeishuwecomwecom_callbackweixinbluebubblesqqbotN)__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 r!   r   r(   r(   0   sx        ((EHGHEFJF#ME
CHJGFE%NFKEEEr!   r(   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_idnamer   c                 6    | j         j        | j        | j        dS )NrX   rY   rZ   )rX   r   rY   rZ   selfs    r   to_dictzHomeChannel.to_dictT   s#    +|I
 
 	
r!   datac                      | t          |d                   t          |d                   |                    dd                    S )NrX   rY   rZ   Homer\   )r(   r   getclsr`   s     r   	from_dictzHomeChannel.from_dict[   sK    sd:.//Y((&&))
 
 
 	
r!   N)r=   r>   r?   r@   r(   __annotations__r   r   r	   r_   classmethodrf   rU   r!   r   rW   rW   H   s           LLL
III
c3h 
 
 
 
 
T#s(^ 
 
 
 
 [
 
 
r!   rW   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r5   r6   notify_exclude_platformsr   c                 ^    | j         | j        | j        | j        t	          | j                  dS )Nrl   rn   rp   rq   rs   )rl   rn   rp   rq   listrs   r]   s    r   r_   zSessionResetPolicy.to_dictu   s4    I| -k(,T-J(K(K
 
 	
r!   r`   c           	      6   |                     d          }|                     d          }|                     d          }|                     d          }|                     d          } | ||nd||nd||nd||nd	|t          |          nd
          S )Nrl   rn   rp   rq   rs   rk   rm   ro   Trr   ru   )rc   tuple)re   r`   rl   rn   rp   rq   excludes          r   rf   zSessionResetPolicy.from_dict~   s     xx((9%%xx//(##((566s)v&2GG)5)At#/66T7>7JU7^^^Pi
 
 
 	
r!   N)r=   r>   r?   r@   rl   r   rg   rn   intrp   rq   boolrs   rx   r   r	   r_   rh   rf   rU   r!   r   rj   rj   d   s           D#GSL#FD&?e???
c3h 
 
 
 
 
T#s(^ 
0D 
 
 
 [
 
 
r!   rj   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                 4   d }d|v r t                               |d                   } | |                    dd          |                    d          |                    d          ||                    dd          |                    di           	          S )
Nr   r~   Fr   r   r   r   r   )r~   r   r   r   r   r   )rW   rf   rc   )re   r`   r   s      r   rf   zPlatformConfig.from_dict   s    T!!&00n1EFFLsHHY..((7##HHY''%((?G<<((7B''
 
 
 	
r!   )r=   r>   r?   r@   r~   r{   rg   r   r   r   r   r   rW   r   r   dictr   r   r	   r_   rh   rf   rU   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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    ▉cursorr   c                 D    | j         | j        | j        | j        | j        dS )Nr~   r   r   r   r   r   r]   s    r   r_   zStreamingConfig.to_dict   s,    |!/ $ 5k
 
 	
r!   r`   c                 6   |s
 |             S  | |                     dd          |                     dd          t          |                     dd                    t          |                     dd                    |                     d	d
                    S )Nr~   Fr   r   r   r   r   r   r   r   r   )rc   floatrz   rd   s     r   rf   zStreamingConfig.from_dict   s     	355LsHHY..hh{F33# > >?? *<b!A!ABB88Hf--
 
 
 	
r!   N)r=   r>   r?   r@   r~   r{   rg   r   r   r   r   r   rz   r   r   r	   r_   rh   rf   rU   r!   r   r   r      s         MMGTIsM5cFC
c3h 
 
 
 
 	
T#s(^ 	
0A 	
 	
 	
 [	
 	
 	
r!   r   c                      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e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S )"GatewayConfigzy
    Main gateway configuration.
    
    Manages all platform connections, session policies, and delivery settings.
    r   	platformsdefault_reset_policyreset_by_typereset_by_platformc                  
    ddgS )N/new/resetrU   rU   r!   r   <lambda>zGatewayConfig.<lambda>   s    vx>P r!   reset_triggersquick_commandsc                  $    t                      dz  S )Nsessionsr   rU   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	streamingr   c                    g }| j                                         D ]T\  }}|j        s|t          j        k    rQ|j                            d          r6|j        s|j                            d          r|                    |           o|j        s|j	        r|                    |           |t          j
        k    r|                    |           |t          j        k    r0|j                            d          r|                    |           |t          j        k    r1|j                            d          r|                    |           :|t          j        k    r+t          j        d          r|                    |           u|t          j        k    r|                    |           |t          j        k    r|                    |           |t          j        k    r1|j                            d          r|                    |           |t          j        k    r1|j                            d          r|                    |           E|t          j        k    rK|j                            d          s|j                            d	          r|                    |           |t          j        k    rK|j                            d
          r1|j                            d          r|                    |           |t          j        k    rI|j                            d          r/|j                            d          r|                    |           V|S )z9Return list of platforms that are enabled and configured.
account_idr   http_urladdressTWILIO_ACCOUNT_SIDapp_idbot_idcorp_idapps
server_urlpasswordclient_secret)r   itemsr~   r(   rR   r   rc   r   appendr   rD   rF   rJ   rK   osgetenvrM   rN   rO   rP   rQ   rS   rT   )r^   	connectedrX   configs       r   get_connected_platformsz%GatewayConfig.get_connected_platforms  s@   	 $ 4 4 6 6 -	+ -	+Hf> 8?**<##L11 /v| /v|GWGWX_G`G` /$$X...| $+v~ $+  ****X...  ****X_,,1A1A*1M1M,  ****X^++0@0@0K0K+  ****X\))bi8L.M.M)  ****X000  ****X---  ****X_,,1A1A(1K1K,  ****X^++0@0@0J0J+  ****X444  ++ 5/5|/?/?/G/G 5   ****X111fl6F6F|6T6T1Y_YeYiYijtYuYu1  ****X^++0@0@0J0J+v|O_O_`oOpOp+  ***r!   rX   c                 L    | j                             |          }|r|j        S dS )z$Get the home channel for a platform.N)r   rc   r   )r^   rX   r   s      r   get_home_channelzGatewayConfig.get_home_channel8  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^   rX   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                                        dS )Nc                 H    i | ]\  }}|j         |                                 S rU   r   r_   ).0pcs      r   
<dictcomp>z)GatewayConfig.to_dict.<locals>.<dictcomp>U  s5       )-A  r!   c                 >    i | ]\  }}||                                 S rU   )r_   r   kvs      r   r   z)GatewayConfig.to_dict.<locals>.<dictcomp>Y  s3       #'1a199;;  r!   c                 H    i | ]\  }}|j         |                                 S rU   r   )r   r   r   s      r   r   z)GatewayConfig.to_dict.<locals>.<dictcomp>\  s5     " " ")-A" " "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]   s    r   r_   zGatewayConfig.to_dictS  s     151E1E1G1G   %)$=$E$E$G$G +/+=+C+C+E+E  " "151G1M1M1O1O" " " #1"1 122 $ 5+'+'C(,(E(,(E//11'
 
 	
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          } | ||
||	|                     dddg          |||                     dd          t          |d          t          |d          t          |d          |t                              |                     di                               S )Nr   r   r   r   r   r   r   r   sttr~   r   r   r   r"   r   r   r   r   TFr   r   )rc   r   r(   r}   rf   
ValueErrorrj   r   r   r   r   r&   r    r   )re   r`   r   platform_nameplatform_datarX   r   	type_namepolicy_datar   default_policyr   r   r   r   r   r   s                    r   rf   zGatewayConfig.from_dictj  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$
 $
 
 s!/'/88$4vx6HII)%!XX&8$??$[$77$01H$$O$O%12JE%R%R%=%//b0I0IJJ
 
 
 	
s#   ,A
A+*A++,D
D%$D%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   )r   rc   r   r&   r   )r^   rX   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!   )NNN)'r=   r>   r?   r@   r   r   r   r   r(   r}   rg   rj   r   r   r   r   r   r   r   r	   r   r   r   r{   r   r   r   r   r   r   r   r   rW   r   r   r_   rh   rf   r   rU   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1h 1 1 1 1f h{6K     (,&*) )8$) sm) 
	) ) ) )(
c3h 
 
 
 
. :
T#s(^ :
 :
 :
 :
 [:
x	- 	-Xh5G 	-SV 	- 	- 	- 	- 	- 	-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           }i ||}|r||d<   |||<   ||d<   t&          D ]}|t&          j        k    r|                    |j                  }t          |t                    sDi }d|v r:t!          |                    d          |                    dd                    |d<   d|v r|d         |d<   d|v r|d         |d<   d|v r|d         |d<   d|v r|d         |d<   |t&          j        k    rd|v r|d         |d<   d|v rD|d         }t          |t                    r"d |                                D             |d<   n||d<   |s+|                    |j        i           }t          |t                    si }|||j        <   |                    di           }t          |t                    si }||d<   |                    |           |                    di           }t          |t                    rd|v rHt1          j        d           s4t5          |d                                                   t0          j        d <   d!|v rHt1          j        d"          s4t5          |d!                                                   t0          j        d"<   |                    d          }|dt1          j        d#          sPt          |t:                    rd$                    d% |D                       }t5          |          t0          j        d#<   |                    d&i           }t          |t                    rd|v rHt1          j        d'          s4t5          |d                                                   t0          j        d'<   |                    d          }|dt1          j        d(          sPt          |t:                    rd$                    d) |D                       }t5          |          t0          j        d(<   d*|v rHt1          j        d+          s4t5          |d*                                                   t0          j        d+<   d,|v rHt1          j        d-          s4t5          |d,                                                   t0          j        d-<   |                    d.          }|dt1          j        d/          sPt          |t:                    rd$                    d0 |D                       }t5          |          t0          j        d/<   |                    d1          }|dt1          j        d2          sPt          |t:                    rd$                    d3 |D                       }t5          |          t0          j        d2<   |                    d4          }|dt1          j        d5          sPt          |t:                    rd$                    d6 |D                       }t5          |          t0          j        d5<   |                    d7i           }t          |t                    rd|v rHt1          j        d8          s4t5          |d                                                   t0          j        d8<   d|v r@t1          j        d9          s,ddl} |                     |d                   t0          j        d9<   |                    d:          }|dt1          j        d;          sPt          |t:                    rd$                    d< |D                       }t5          |          t0          j        d;<   |                    d=          }!|!dt1          j        d>          sPt          |!t:                    rd$                    d? |!D                       }!t5          |!          t0          j        d><   d,|v rHt1          j        d@          s4t5          |d,                                                   t0          j        d@<   dA|v rHt1          j        dB          s4t5          |dA                                                    t0          j        dB<   dC|v r|                    t&          j!        j        i           }t          |t                    si }||t&          j!        j        <   |                    di           }t          |t                    si }||d<   |dC         |dC<   |                    dDi           }"t          |"t                    rd|"v rHt1          j        dE          s4t5          |"d                                                   t0          j        dE<   d|"v r;t1          j        dF          s't          j        |"d                   t0          j        dF<   |"                    d:          }|dt1          j        dG          sPt          |t:                    rd$                    dH |D                       }t5          |          t0          j        dG<   |                    dIi           }#t          |#t                    r_d|#v rHt1          j        dJ          s4t5          |#d                                                   t0          j        dJ<   |#                    dK          }|dt1          j        dL          sPt          |t:                    rd$                    dM |D                       }t5          |          t0          j        dL<   d*|#v rHt1          j        dN          s4t5          |#d*                                                   t0          j        dN<   dO|#v rHt1          j        dP          s4t5          |#dO                                                   t0          j        dP<   n6# t          $ r)}t
                              dQ| d	z  |           Y d}~nd}~ww xY wtD          #                    |          }$tI          |$           tK          |$           |$S )Ru  
    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"   r   r   reply_prefixrequire_mentionfree_response_channelsmention_patternschannel_skill_bindingschannel_promptsc                 4    i | ]\  }}t          |          |S rU   r   r   s      r   r   z'load_gateway_config.<locals>.<dictcomp>0  s$    5d5d5dDAqc!ffa5d5d5dr!   r-   SLACK_REQUIRE_MENTION
allow_botsSLACK_ALLOW_BOTSSLACK_FREE_RESPONSE_CHANNELS,c              3   4   K   | ]}t          |          V  d S r   r   r   r   s     r   	<genexpr>z&load_gateway_config.<locals>.<genexpr>I  (      &;&;!s1vv&;&;&;&;&;&;r!   r+   DISCORD_REQUIRE_MENTIONDISCORD_FREE_RESPONSE_CHANNELSc              3   4   K   | ]}t          |          V  d S r   r   r   s     r   r   z&load_gateway_config.<locals>.<genexpr>T  r   r!   auto_threadDISCORD_AUTO_THREAD	reactionsDISCORD_REACTIONSignored_channelsDISCORD_IGNORED_CHANNELSc              3   4   K   | ]}t          |          V  d S r   r   r   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   r   r   s     r   r   z&load_gateway_config.<locals>.<genexpr>d  r   r!   no_thread_channelsDISCORD_NO_THREAD_CHANNELSc              3   4   K   | ]}t          |          V  d S r   r   r   s     r   r   z&load_gateway_config.<locals>.<genexpr>j  r   r!   r*   TELEGRAM_REQUIRE_MENTIONTELEGRAM_MENTION_PATTERNSfree_response_chatsTELEGRAM_FREE_RESPONSE_CHATSc              3   4   K   | ]}t          |          V  d S r   r   r   s     r   r   z&load_gateway_config.<locals>.<genexpr>x  r   r!   ignored_threadsTELEGRAM_IGNORED_THREADSc              3   4   K   | ]}t          |          V  d S r   r   r   s     r   r   z&load_gateway_config.<locals>.<genexpr>}  s(      2S2Sa3q662S2S2S2S2S2Sr!   TELEGRAM_REACTIONS	proxy_urlTELEGRAM_PROXYdisable_link_previewsr,   WHATSAPP_REQUIRE_MENTIONWHATSAPP_MENTION_PATTERNSWHATSAPP_FREE_RESPONSE_CHATSc              3   4   K   | ]}t          |          V  d S r   r   r   s     r   r   z&load_gateway_config.<locals>.<genexpr>  r   r!   r0   MATRIX_REQUIRE_MENTIONfree_response_roomsMATRIX_FREE_RESPONSE_ROOMSc              3   4   K   | ]}t          |          V  d S r   r   r   s     r   r   z&load_gateway_config.<locals>.<genexpr>  r   r!   MATRIX_AUTO_THREADdm_mention_threadsMATRIX_DM_MENTION_THREADSus   Failed to process config.yaml — falling back to .env / gateway.json values. Check %s for syntax errors. Error: %s)&r   existsopenjsonloadloggerinfo	Exceptionwarningyaml	safe_loadrc   r   r   typer=   r&   
setdefaultr   r(   rA   r   rC   updater   r   r   r   environrv   joindumpsr   rB   r   rf   _apply_env_overrides_validate_gateway_config)%_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platr   bridgedr   	plat_datar   	slack_cfgfrcdiscord_cfgicacntctelegram_cfg_jsonr
  whatsapp_cfg
matrix_cfgr   s%                                        r   load_gateway_configrM    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""$$ U	l&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77J7F# 7*6w06N9--'5$  '& '&8>))'||DJ77!,55 -==:]$(()CDD$>GG; ;G67 "\11.:>.JGN+$441=>O1PG-.+|;;8DE]8^G45%552>?Q2RG./8+++0HL0X0X8DE]8^G45$44&23D&EO!/488 E5d5dOLaLaLcLc5d5d5d 1225D 12 *55dj"EE	!)T22 ; "I1:N4:.!,,Wb99!%.. /E).Ig&W%%%% !Wb11I)T** 	J$	11")D[:\:\1:=iHY>Z:[:[:a:a:c:cBJ679,,RY?Q5R5R,58<9P5Q5Q5W5W5Y5YBJ12mm$<==?295S+T+T?!#t,, <!hh&;&;s&;&;&;;;ADSBJ=> #,,y"55K+t,, H$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;< $<<
B77L,-- [$44RYGa=b=b4=@N_A`=a=a=g=g=i=iBJ9:%55biHc>d>d5((((>Ckk,WiJj>k>kBJ:;"&&'<==?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*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=> "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:; 
 
 
4M!		
 	
 	
 	
 	
 	
 	
 	

 $$W--F     V$$$Msw   B A B  A$$B 'A$(B 
B7B22B7;/{6 *D{6 D{6 Dw{6 6
|) |$$|)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.rm   Nz?Invalid idle_minutes=%s (must be positive). Using default 1440.ro   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   rn   r   r#  rp   r(   rB   rC   rE   rG   rH   rR   r   r   r~   rc   r   r   r   hermes_cli.authrV  ImportErrorerror)r   policy_token_env_namesrX   pconfigenv_namerV  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                 3   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          }	|	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          }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        d,d                                          dv }|| j        t          j                 j        d-<   t          j        d.d          }|r|| j        t          j                 j        d/<   t          j        d0          }|r\t          j        | j        v rIt          t          j        |t          j        d1d                    | j        t          j                 _        t          j        d2          }|rt          j        | j        vr t                      | j        t          j        <   d| j        t          j                 _        || j        t          j                 _        t          j        d3          }|r|| j        t          j                 j        d!<   t          j        d4          }t          j        d5          }t          j        d6          }t          j        d7          }t1          ||||g          rt          j        | j        vr t                      | j        t          j        <   d| j        t          j                 _        | j        t          j                 j                            |||d8           t          j        d9          }|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        d=          } | r\t          j        | j        v rIt          t          j        | t          j        d>d                    | j        t          j                 _        t          j        d?d                                          dv }!t          j        d@d          }"t          j        dAd          }#t          j        dB          }$t          j        dC          }%|!s|"rIt          j        | j        vr t                      | j        t          j        <   d| j        t          j                 _        |"r|"| j        t          j                 j        dD<   |#r@dE |#
                    d          D             }&|&r|&| j        t          j                 j        dF<   |$r>	 t;          |$          | j        t          j                 j        dG<   n# t<          $ r Y nw xY w|%r|%| j        t          j                 j        dH<   t          j        dId          }'|'r|'| j        t          j                 j        dJ<   t          j        dKd                                          dv }(t          j        dL          })t          j        dMd          }*|(rt          j        | j        vr t                      | j        t          j        <   d| j        t          j                 _        |)r>	 t;          |)          | j        t          j                 j        dG<   n# t<          $ r Y nw xY w|*r|*| j        t          j                 j        dN<   t          j        dO          }+t          j        dP          },|+rw|,rtt          j         | j        vr t                      | j        t          j         <   d| j        t          j                  _        | j        t          j                  j                            |+|,t          j        dQdR          t          j        dSdT          dU           t          j        dVd          }-|-r|-| j        t          j                  j        dW<   t          j        dXd          }.|.r|.| j        t          j                  j        dY<   t          j        dZ          }/|/rIt          t          j         |/t          j        d[d                    | j        t          j                  _        t          j        d\          }0t          j        d]          }1|0r|1rt          j!        | j        vr t                      | j        t          j!        <   d| j        t          j!                 _        | j        t          j!                 j                            |0|1d^           t          j        d_d          }2|2r|2| j        t          j!                 j        d`<   t          j        da          }3|3rIt          t          j!        |3t          j        dbd                    | j        t          j!                 _        t          j        dc          }4t          j        dd          }5|4r|5rt          j"        | j        vr t                      | j        t          j"        <   d| j        t          j"                 _        | j        t          j"                 j                            |4|5t          j        ded          t          j        dfd          t          j        dgd          t          j        dhdi          t;          t          j        djdk                    dl           t          j        dm          }6t          j        dn          }7|6s|7rt          j#        | j        vr t                      | j        t          j#        <   d| j        t          j#                 _        |6r|6| j        t          j#                 _        | j        t          j#                 j        }8|7r|7|8do<   t          j        dpd          $                                }9|9r|9%                    dq          |8dr<   t          j        dsd          $                                }:|:r|:%                    dq          |8dt<   t          j        dud          $                                                                };|;r|;|8dv<   t          j        dwd          $                                                                }<|<r|<|8dx<   t          j        dyd          $                                }=|=r|=|8dz<   t          j        d{d          $                                }>|>r|>|8d|<   t          j        d}d          $                                }?|?r|?|8d~<   t          j        dd          $                                }@|@rIt          t          j#        |@t          j        dd                    | j        t          j#                 _        t          j        d          }At          j        d          }B|Ar|Brt          j&        | j        vr t                      | j        t          j&        <   d| j        t          j&                 _        | j        t          j&                 j                            |A%                    dq          |Bt          j        dd          t;          t          j        ddk                    t          j        dd          t          j        dd                                          dv d           t          j        d          }C|Cr\t          j&        | j        v rIt          t          j&        |Ct          j        dd                    | j        t          j&                 _        t          j        d          }Dt          j        d          }E|Ds|ErGt          j'        | j        vr t                      | j        t          j'        <   d| j        t          j'                 _        | j        t          j'                 j        }8|Dr|D|8d<   |Er|E|8d<   t          j        dd          $                                }F|Fr|F|8dz<   t          j        dd          $                                }G|Gr|G|8d|<   t          j        dd          $                                }H|HrIt          t          j'        |Ht          j        dd                    | j        t          j'                 _        t          j        d          }I|Ir+	 t;          |I          | j(        _)        n# t<          $ r Y nw xY wt          j        d          }J|Jr-	 t;          |J          | j(        _*        dS # t<          $ r Y dS w xY wdS )z/Apply environment variable overrides to config.rP  TTELEGRAM_REPLY_TO_MODE )r   r   allTELEGRAM_FALLBACK_IPSc                 ^    g | ]*}|                                 |                                 +S rU   r   )r   ips     r   
<listcomp>z(_apply_env_overrides.<locals>.<listcomp>  sD     E
 E
 E
RXXZZE
HHJJE
 E
 E
r!   r   fallback_ipsTELEGRAM_HOME_CHANNELTELEGRAM_HOME_CHANNEL_NAMErb   r\   rQ  DISCORD_HOME_CHANNELDISCORD_HOME_CHANNEL_NAMEDISCORD_REPLY_TO_MODEWHATSAPP_ENABLED)r   r   r   rR  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_NAMErS  MATTERMOST_URLz2MATTERMOST_TOKEN set but MATTERMOST_URL is missingurlMATTERMOST_HOME_CHANNELMATTERMOST_HOME_CHANNEL_NAMErT  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 rU   rf  )r   origins     r   rh  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FEISHU_APP_IDFEISHU_APP_SECRETFEISHU_DOMAINr7   FEISHU_CONNECTION_MODE	websocket)r   
app_secret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  rU  WEIXIN_ACCOUNT_IDr   WEIXIN_BASE_URL/base_urlWEIXIN_CDN_BASE_URLcdn_base_urlWEIXIN_DM_POLICY	dm_policyWEIXIN_GROUP_POLICYgroup_policyWEIXIN_ALLOWED_USERS
allow_fromWEIXIN_GROUP_ALLOWED_USERSgroup_allow_from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QQ_HOME_CHANNELQQ_HOME_CHANNEL_NAMESESSION_IDLE_MINUTESSESSION_RESET_HOURN)+r   r   r(   rB   r   r}   r~   r   r   r   splitr   rW   r   rC   rD   rE   rF   r(  r   r#  rG   rH   rI   rc  rJ   rK   r   rM   rz   r   rN   rO   rP   rQ   rR   r   rstriprS   rT   r   rp   rn   )Kr   telegram_tokentelegram_reply_modetelegram_fallback_ipstelegram_homediscord_tokendiscord_homediscord_reply_modewhatsapp_enabledslack_token
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_enabledr  webhook_secret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_homerp   
reset_hoursK                                                                              r   r,  r,    sS    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 )-..K =>!111/=/?/?FX^,37(01<(./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> 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$%)-r2288:: 	<G!Y5v>>= = =FX^,9 9344L 	7:<7H7HF'44 	 	 	D	 /00J 	25j//F'/// 	 	 	DD	 sT   $,x 
xx,} 
}}e+Af f
AffAff,Ag g
AggAg)T)r"   )r   r   r   N)$r@   loggingr   r  pathlibr   dataclassesr   r   typingr   r   r   r	   enumr
   hermes_cli.configr   utilsr   	getLoggerr=   r   r{   r    r   r&   r(   rW   rj   r}   r   r   rM  r-  r,  rU   r!   r   <module>r<     s     				        ( ( ( ( ( ( ( ( , , , , , , , , , , , ,       - - - - - - ! ! ! ! ! !		8	$	$3 3 3d 3d 3 3 3 3 s S c        t   0 
 
 
 
 
 
 
 
6 '
 '
 '
 '
 '
 '
 '
 '
T +
 +
 +
 +
 +
 +
 +
 +
\ 
 
 
 
 
 
 
 
< R- R- R- R- R- R- R- R-jF] F F F FRB( B( B( B(JY Y4 Y Y Y Y Y Yr!   