
    j&                       U d Z ddlZddlZddl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mZ ddlmZ ddlZddlmZ ddlmZ dd	lmZmZ  ej:                  e      ZdSdede de fdZ!dede"de"fdZ#dede$de$fdZ%dede&dee$   fdZ'dTdede&de&fdZ(dUdede&de&fdZ)de*de&de+e*e*f   fdZ,da-ee.   e/d<    G d de      Z0 e1d e0jd                  jg                         D              Z4e
 G d d             Z5e
 G d d             Z6e
 G d  d!             Z7d"Z8e"e/d#<   d$Z9e$e/d%<   d&Z:e&e/d'<   e
 G d( d)             Z;i e0jx                  d* e0jz                  d+ e0j|                  d, e0j~                  d- e0j                  d. e0j                  d/ e0j                  d0 e0j                  d1 e0j                  d2 e0j                  d3 e0j                  d4 e0j                  d5 e0j                  d6 e0j                  d7 e0j                  d8 e0j                  d9 e0j                  d: ZMe*e0ee7ge f   f   e/d;<   e
 G d< d=             ZN G d> d?eO      ZP e
d
@       G dA dB             ZQ e
d
@       G dC dD             ZRdEedFe deSdz  fdGZTdHee&ef   dIee&ef   de*e&ef   fdJZUddKdLe&ej                  e&   z  dMee&e&f   dz  deRfdNZWdeNfdOZXdVdQZYdPeNddfdRZZy)Wz
Gateway configuration management.

Handles loading and validating configuration for:
- Connected platforms (Telegram, Discord, WhatsApp, Weixin, and more)
- Home channels for each platform
- Session reset policies
- Delivery preferences
    N)Path)	dataclassfield)DictListOptionalAnyCallableMapping)Enum)dotenv_valuesget_hermes_home)env_intis_truthy_valueTvaluedefaultreturnc                     | |S t        | t              r*| j                         j                         }|dv ry|dv ry|S t	        | |      S )zDCoerce bool-ish config values, preserving a caller-provided default.>   1onyestrueT>   0noofffalseF)r   )
isinstancestrstriplowerr   )r   r   lowereds      M/home/cube/projects/richard/.worktrees/nutricoach-v140-impl/gateway/config.py_coerce_boolr$      sT    }%++-%%'00115'22    c                 P    | |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+   -   s4    }U|z"    
 %%c                 P    | |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/   7   s4    }5zz" r,   keyc                    | yt        | t              rt        j                  d||        y	 t        | t              r'| j                         st        |       t        |       }n6t        | t              rt        | j                         d      }nt        |       }|dk  ry|S # t        t        f$ r t        j                  d||        Y yw xY w)zCoerce an optional positive integer config value.

    ``None``/0/negative disable the setting. Malformed values are ignored with
    a warning so a typo never prevents the gateway from starting.
    NzEIgnoring invalid %s=%r (expected a positive integer; 0/null disables)
   r   )r   boolloggerwarningr'   
is_integerr)   r.   r   r    r(   )r   r0   parseds      r#   _coerce_optional_positive_intr8   A   s     }%S	

 eU###% ''ZFs#+FZF {M z" S	

 s   A-B" "&C
Cc                 n    t        | t              r$| j                         j                         }|dv r|S |S )z8Normalize unauthorized DM behavior to a supported value.>   pairignorer   r   r    r!   r   r   
normalizeds      r#   #_normalize_unauthorized_dm_behaviorr?   e   s4    %[[]((*
++Nr%   c                 n    t        | t              r$| j                         j                         }|dv r|S |S )z4Normalize notice delivery mode to a supported value.>   publicprivater<   r=   s      r#   _normalize_notice_deliveryrC   n   s4    %[[]((*
..Nr%   platforms_datanamec                     | j                  |i       }t        |t              si }|| |<   |j                  di       }t        |t              si }||d<   ||fS )a  Get-or-create ``platforms_data[name]`` and its nested ``extra`` dict.

    Both slots are coerced to ``{}`` if a non-dict value is encountered, so
    callers can safely write keys without type-checking.  Returns
    ``(plat_data, extra)`` for in-place mutation.
    extra)
setdefaultr   dict)rD   rE   	plat_datarG   s       r#   _ensure_platform_extra_dictrK   w   se     ))$3Ii&	(t  "-EeT""	'er%   _Platform__bundled_plugin_namesc                       e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZed        Zedefd       Zy)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whatsapp_cloudslacksignal
mattermostmatrixhomeassistantemailsmsdingtalk
api_serverwebhookmsgraph_webhookfeishuwecomwecom_callbackweixinbluebubblesqqbotyuanbaorelayc                 4   t        |t              r|j                         sy|j                         j                         }|| j                  v r| j                  |   S t
        | j                         a|t
        v r{t        j                  |       }||_	        |j                         j                  dd      j                  dd      |_        || j                  |<   || j                  |j                  <   |S 	 ddlm} |j!                  |      r{t        j                  |       }||_	        |j                         j                  dd      j                  dd      |_        || j                  |<   || j                  |j                  <   |S 	 y# t"        $ r Y yw xY w)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_rL   _scan_bundled_plugin_platformsobject__new___value_upperreplace_name__member_map_gateway.platform_registryrl   is_registered	Exception)clsr   pseudorl   s       r#   	_missing_zPlatform._missing_   sm    %%U[[]##%C***))%00
 +2.1.P.P.R+33^^C(F"FN!KKM11#s;CCCMFM,2C""5).4CV]]+M
	C ..u5,!& % 5 5c3 ? G GS Q06&&u-28  / 6   		s   7BF 	FFr   c                    t               }	 t        t              j                  j                  dz  dz  }|j	                         r|j                         D ]w  }|j	                         s|dz  j                         s(|dz  j                         s|dz  j                         sO|j                  |j                  j                                y |S # t        $ r Y |S w xY w)zFReturn names of bundled platform plugins under ``plugins/platforms/``.plugins	platformsz__init__.pyzplugin.yamlz
plugin.yml)setr   __file__parentis_diriterdirexistsaddrE   r!   rx   )ry   namesplatforms_dirchilds       r#   rn   z'Platform._scan_bundled_plugin_platforms   s     U	 N11889D{RM##%*224E"]2::<"]2::< % 4<<> 		%**"2"2"45 5   		s$   AC )C =&C $+C 	CCN) __name__
__module____qualname____doc__LOCALTELEGRAMDISCORDWHATSAPPWHATSAPP_CLOUDSLACKSIGNAL
MATTERMOSTMATRIXHOMEASSISTANTEMAILSMSDINGTALK
API_SERVERWEBHOOKMSGRAPH_WEBHOOKFEISHUWECOMWECOM_CALLBACKWEIXINBLUEBUBBLESQQBOTYUANBAORELAYclassmethodr{   r   rn    r%   r#   rN   rN      s     EHGH%NEFJF#ME
CHJG'OFE%NFKEGE* *X s  r%   rN   c              #   4   K   | ]  }|j                     y wN)r   ).0ms     r#   	<genexpr>r      s     $T6SQWW6Ss   c                   ~    e Zd ZU dZeed<   eed<   eed<   dZee   ed<   de	ee
f   fdZed	e	ee
f   dd fd
       Zy)HomeChannela@  
    Default destination for a platform.
    
    When a cron job specifies deliver="telegram" without a specific chat ID,
    messages are sent to this home channel. Thread-aware platforms may also
    store a thread/topic ID so the bare platform target routes to the exact
    conversation where /sethome was run.
    platformchat_idrE   N	thread_idr   c                     | j                   j                  | j                  | j                  d}| j                  r| j                  |d<   |S )N)r   r   rE   r   )r   r   r   rE   r   selfresults     r#   to_dictzHomeChannel.to_dict  s@    ++||II

 >>"&..F;r%   datac           	           | t        |d         t        |d         |j                  dd      |j                  d      rt        |d               S d       S )Nr   r   rE   Homer   r   r   rE   r   )rN   r   getry   r   s     r#   	from_dictzHomeChannel.from_dict  s_    d:./Y(&&)040Ec${+,	
 	
 LP	
 	
r%   )r   r   r   r   rN   __annotations__r   r   r   r   r	   r   r   r   r   r%   r#   r   r      se     L
I#Ix}#c3h  
T#s(^ 
 
 
r%   r   c                       e Zd ZU dZdZeed<   dZeed<   dZ	eed<   dZ
eed	<   d
Zeed<   deeef   fdZedeeef   dd fd       Zy)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r\   r]   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*  s8    II|| --kk(,T-J-J(K
 	
r%   r   c           	         |j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  d      } | ||nd||nd||ndt        |d	      |t        |            S d
      S )Nr   r   r   r   r   r   r   r   Tr   r   )r   r$   tuple)ry   r   r   r   r   r   excludes          r#   r   zSessionResetPolicy.from_dict3  s     xx((9%xx/(#((56)v&2G)5)At-7>7JU7^
 	

 Qj
 	
r%   N)r   r   r   r   r   r   r   r   r.   r   r   r3   r   r   r   r	   r   r   r   r   r%   r#   r   r     s{     D#GSL#FD&?e?
c3h 
 
T#s(^ 
0D 
 
r%   r   c                       e Zd ZU dZdZeed<   dZee	   ed<   dZ
ee	   ed<   dZee   ed<   dZe	ed	<   d
Zeed<    ee      Zee	ef   ed<   dee	ef   fdZedee	ef   dd fd       Zy)PlatformConfigz.Configuration for a single messaging platform.FenabledNtokenapi_keyhome_channelfirstreply_to_modeTgateway_restart_notificationdefault_factoryrG   r   c                 "   | j                   | j                  | j                  | j                  d}| j                  r| j                  |d<   | j
                  r| j
                  |d<   | j                  r| j                  j                         |d<   |S )N)r   rG   r   r   r   r   r   )r   rG   r   r   r   r   r   r   r   s     r#   r   zPlatformConfig.to_dict\  s{    ||ZZ!//,0,M,M	
 ::"jjF7O<< $F9%)%6%6%>%>%@F>"r%   r   c                    d }d|v rt         j                  |d         }|j                  d      }|!|j                  di       j                  d      } | t        |j                  d      d      |j                  d      |j                  d      ||j                  dd	      t        |d
      |j                  di             S )Nr   r   rG   r   Fr   r   r   r   T)r   r   r   r   r   r   rG   )r   r   r   r$   )ry   r   r   _grns       r#   r   zPlatformConfig.from_dictk  s    T!&00n1EFL xx67<88GR(,,-KLD )!4e<((7#HHY'%((?G<)5dD)A((7B'
 	
r%   )r   r   r   r   r   r3   r   r   r   r   r   r   r   r   r   r   rI   rG   r   r	   r   r   r   r   r%   r#   r   r   D  s    8GTE8C=!GXc]!*.L(;'. !M3  *. $- "$7E4S>7c3h  
T#s(^ 
0@ 
 
r%   r   g?DEFAULT_STREAMING_EDIT_INTERVAL   "DEFAULT_STREAMING_BUFFER_THRESHOLDu    ▉DEFAULT_STREAMING_CURSORc                       e Zd ZU dZdZeed<   dZeed<   e	Z
eed<   eZeed<   eZeed<   d	Zeed
<   deeef   fdZedeeef   dd fd       Zy)StreamingConfigzCConfiguration for real-time token streaming to messaging platforms.Fr   auto	transportedit_intervalbuffer_thresholdcursor        fresh_final_after_secondsr   c                     | j                   | j                  | j                  | j                  | j                  | j
                  dS )Nr   r   r   r   r   r   r   r   s    r#   r   zStreamingConfig.to_dict  s<    ||!// $ 5 5kk)-)G)G
 	
r%   r   c                 P   |s |        S  | t        |j                  d      d      |j                  dd      t        |j                  d      t              t	        |j                  d      t
              |j                  dt              t        |j                  d      d	      
      S )Nr   Fr   r   r   r   r   r   r   r   )r$   r   r+   r   r/   r   r   r   s     r#   r   zStreamingConfig.from_dict  s    5L )!4e<hh{F3')+J )+,.P 88H&>?&345s'
 	
r%   N)r   r   r   r   r   r3   r   r   r   r   r   r'   r   r   r.   r   r   r   r   r	   r   r   r   r   r%   r#   r   r     s    MGT" Is:M5:>c>*FC* (+u*
c3h 
 
T#s(^ 
0A 
 
r%   r   c                     t        | j                  j                  d      xr) | j                  xs | j                  j                  d            S )N
account_idr   )r3   rG   r   r   cfgs    r#   <lambda>r     s4    		l#M)LciimmG6L"r%   c                      yNTr   r   s    r#   r   r     s    4r%   c                     t        | j                  j                  d      xr | j                  j                  d            S )Nphone_number_idaccess_tokenr3   rG   r   r   s    r#   r   r     s,    		'(JSYY]]>-J*r%   c                 J    t        | j                  j                  d            S )Nhttp_urlr   r   s    r#   r   r     s    ciimmJ&?!@r%   c                 J    t        | j                  j                  d            S )Naddressr   r   s    r#   r   r     s    SYY]]9%= >r%   c                 >    t        t        j                  d            S )NTWILIO_ACCOUNT_SID)r3   osgetenvr   s    r#   r   r     s    d299-A#BCr%   c                      yr   r   r   s    r#   r   r     s    Tr%   c                      yr   r   r   s    r#   r   r     s    $r%   c                     t        t        | j                  j                  d      xs d      j	                               S )Nclient_state )r3   r   rG   r   r    r   s    r#   r   r     s,    $CIIMM.)/R0668+r%   c                 J    t        | j                  j                  d            S )Napp_idr   r   s    r#   r   r     s    ciimmH&=!>r%   c                 J    t        | j                  j                  d            S )Nbot_idr   r   s    r#   r   r     s    SYY]]8%< =r%   c                     t        | j                  j                  d      xs | j                  j                  d            S )Ncorp_idappsr   r   s    r#   r   r     s+    		i 9CIIMM&$9*r%   c                     t        | j                  j                  d      xr | j                  j                  d            S )N
server_urlpasswordr   r   s    r#   r   r     s+    d		l#A		j(A'r%   c                     t        | j                  j                  d      xr | j                  j                  d            S )Nr  client_secretr   r   s    r#   r   r     s+    		hBCIIMM/$B!r%   c                     t        | j                  j                  d      xr | j                  j                  d            S )Nr  
app_secretr   r   s    r#   r   r     s+    $		h?CIIMM,$?#r%   c                     t        | j                  j                  d      xs t        j                  d      xr2 | j                  j                  d      xs t        j                  d            S )N	client_idDINGTALK_CLIENT_IDr  DINGTALK_CLIENT_SECRET)r3   rG   r   r   r   r   s    r#   r   r     sM    4	{	#	Fryy1E'F 	TYY]]?+Rryy9Q/R$r%   c                     t        | j                  j                  d      xs | j                  j                  d            S )N	relay_urlurlr   r   s    r#   r   r     s+    		k":ciimmE&:!r%   _PLATFORM_CONNECTED_CHECKERSc                   t   e Zd ZU dZ ee      Zeee	f   e
d<    ee      Zee
d<    ee      Zeeef   e
d<    ee      Zeeef   e
d<    ed       Zee   e
d<    ee      Zeeef   e
d	<    ed
       Zee
d<   dZee
d<   dZee
d<   dZee
d<   dZee
d<   dZee
d<   dZee   e
d<   dZee
d<   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-y)*GatewayConfigzy
    Main gateway configuration.
    
    Manages all platform connections, session policies, and delivery settings.
    r   r~   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>Pr%   reset_triggersquick_commandsc                      t               dz  S )Nsessionsr   r   r%   r#   r   zGatewayConfig.<lambda>  s    7H:7Ur%   sessions_dirTalways_log_localfilter_silence_narrationstt_enabledgroup_sessions_per_userFthread_sessions_per_userNmax_concurrent_sessionsmultiplex_profilesr:   unauthorized_dm_behavior	streamingZ   session_store_max_age_daysr   c                     g }| j                   j                         D ]6  \  }}|j                  s| j                  ||      s&|j	                  |       8 |S )z9Return list of platforms that are enabled and configured.)r~   itemsr   _is_platform_connectedappend)r   	connectedr   configs       r#   get_connected_platformsz%GatewayConfig.get_connected_platforms>  sS    	 $ 4 4 6Hf>>**8V<  *	 !7
 r%   r   r9  c                    |t         j                  k(  rOt        |j                  j	                  d      xr) |j
                  xs |j                  j	                  d            S |j
                  s|j                  ryt        j	                  |      }| ||      S 	 ddlm	} |j	                  |j                        }|r;|j                  |j                  |      S |j                  |j                  |      S y	 y# t        $ r Y yw xY w)z;Check whether a single platform is sufficiently configured.r   r   Tr   rk   F)rN   r   r3   rG   r   r   r   r  rv   rl   r   is_connectedvalidate_configrx   )r   r   r9  checkerrl   entrys         r#   r6  z$GatewayConfig._is_platform_connectedH  s    x&  . @\\>V\\%5%5g%>  <<6>> /228<6?"
	C%))(..9E%%1 --f55((4 0088    		s   ?C< C< <	DDc                 V    | j                   j                  |      }|r|j                  S y)z$Get the home channel for a platform.N)r~   r   r   )r   r   r9  s      r#   get_home_channelzGatewayConfig.get_home_channelj  s(    ##H-&&&r%   session_typec                     |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   rB  s      r#   get_reset_policyzGatewayConfig.get_reset_policyq  sT     D$:$::))(33 LD,>,>>%%l33(((r%   c           	      v   i d| j                   j                         D ci c]   \  }}|j                  |j                         " c}}d| j                  j                         d| j
                  j                         D ci c]  \  }}||j                          c}}d| j                  j                         D ci c]   \  }}|j                  |j                         " c}}d| j                  d| j                  dt        | j                        d| j                  d	| j                  d
| j                  d| j                  d| j                  d| j                   d| j"                  d| j$                  d| j&                  j                         d| j(                  S c c}}w c c}}w c c}}w )Nr~   r  r  r   r$  r%  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r3  )r~   r5  r   r   r  r  r   r$  r%  r   r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r3  )r   pckvs        r#   r   zGatewayConfig.to_dict  s   
151E1E1G1GA$1G
 #D$=$=$E$E$G	

 +/+=+=+C+C+E+E41a199;+E
  151G1G1M1M1O"1OA$1O"
 d11
 d11
 C 1 12
  5 5
 '(E(E
  4++!
" &t'C'C#
$ '(E(E%
& &t'C'C'
( !$"9"9)
* '(E(E+
, //1-
. )$*I*I/
 	
"s   %F)
F/
?%F5
r   c                 <   i }|j                  di       j                         D ])  \  }}	 t        |      }t        j	                  |      ||<   + i }|j                  di       j                         D ]  \  }}t        j	                  |      ||<    i }	|j                  di       j                         D ])  \  }}	 t        |      }t        j	                  |      |	|<   + t               }
d|v rt        j	                  |d         }
t               dz  }d|v rt        |d         }|j                  di       }t        |t              si }|j                  d      }|Bt        |j                  d	      t              r!|j                  d	i       j                  d
      nd }|j                  d      }|j                  d      }|j                  d      }t        |j                  d      t              r|j                  d      ni }|!t        |t              r|j                  d      }d|v r|j                  d      }d}n|j                  d      }d}t        ||      }t        |j                  d      d      }	 t        |j                  dd            }t        |d      } | di d|d|
d|d|	d|j                  dddg      d|d|dt!        |j                  d      d      dt!        |j                  d      d      dt!        |d      dt!        |d      dt!        |d      dt!        |d      d|d|dt"        j	                  |j                  di             d|S # t
        $ r Y Pw xY w# t
        $ r Y w xY w# t        t
        f$ r d}Y w xY w)Nr~   r  r   r  r'  r(  r%  r+  sttr   r,  r-  r/  gatewayr.  zgateway.max_concurrent_sessionsr0  r:   r3  r2  r   r$  r"  r#  r)  Tr*  Fr1  r   )r   r5  rN   r   r   r)   r   r   r   r   rI   r8   r?   r.   maxr(   r$   r   )ry   r   r~   platform_nameplatform_datar   r  	type_namepolicy_datar   default_policyr(  r%  r+  r,  r-  r/  nested_gatewaymax_concurrent_rawmax_concurrent_keyr.  r0  r3  s                          r#   r   zGatewayConfig.from_dict  s   	,0HH[",E,K,K,M(M=#M2&4&>&>}&M	(# -N &*hh&C&I&I&K"I{'9'C'CK'PM)$ 'L *.((3F*K*Q*Q*S&M;#M2.@.J.J;.W!(+ +T ,-!T)/99$?U:VWN&(:5T!^ 45L"2B7.$/Nhh}-@J488TY?\`@a$((5"-11)<gkK"&((+D"E#'88,F#G !XX&:;0:488I;NPT0U),[]%*^T*J "0!3!34H!I$,!%*C!D!:!/!3!34M!N!B"?#
 $GHH/0$
 
	,),TXX6RTV-W)X&),-G)K&  

!/
 (
 0	

  88$4vx6HI
 *
 &
 *$((3E*FM
 &234d&
 %[$7
 %11H$$O
 &22JE%R
  ,,>F
  %<!
" &>#
$ &//b0IJ%
& (B'
 	
y    Z :& 	,)+&	,s5   #M':#M78'N '	M43M47	NNNNc                     |rZ| j                   j                  |      }|r=d|j                  v r/t        |j                  j                  d      | j                        S | j                  S )z=Return the effective unauthorized-DM behavior for a platform.r0  )r~   r   rG   r?   r0  r   r   platform_cfgs      r#   get_unauthorized_dm_behaviorz*GatewayConfig.get_unauthorized_dm_behavior  sc    >>--h7L :l>P>P P: &&**+EF11  ,,,r%   c                     |rP| j                   j                  |      }|r3d|j                  v r%t        |j                  j                  d      d      S y)z9Return the effective notice-delivery mode for a platform.notice_deliveryrA   )r~   r   rG   rC   rW  s      r#   get_notice_deliveryz!GatewayConfig.get_notice_delivery  sT    >>--h7L 1\5G5G G1 &&**+<=  r%   )NNr   ).r   r   r   r   r   rI   r~   r   rN   r   r   r   r  r  r   r   r$  r   r%  r	   r(  r   r)  r3   r*  r+  r,  r-  r.  r   r.   r/  r0  r   r1  r3  r:  r6  r   rA  rD  r   r   r   rY  r\  r   r%   r#   r  r     s    16d0KItHn,-K 05EW/X,X383NM4//0N<ARV<WtH&889W !&6P QNDIQ &+4%@NDcN@ /UVL$V "d! &*d) K %)T(%*d*-1Xc]1  %$ %+c* "'!GIG ')(h  x    TX  D h{6K  (,&*)8$) sm) 
	)(
c3h 
6 V
T#s(^ V
 V
 V
p	-Xh5G 	-SV 	-	HX,> 	# 	r%   r  c                       e Zd ZdZy)GatewayPreflightErrorz6A fail-closed read-only gateway preflight input error.N)r   r   r   r   r   r%   r#   r^  r^    s    @r%   r^  )frozenc                   R    e Zd ZU dZeed<   eed<   edz  ed<    ed      Zeed<   y)	GatewayPreflightCredentialz;One profile-scoped credential with a safe, stable identity.env_nameidentity_sha256Nsource_pathF)reprsecret)	r   r   r   r   r   r   r   r   rf  r   r%   r#   ra  ra    s)    EMU#FC#r%   ra  c                   Z    e Zd ZU dZeed<   eed<   eed<   eed<   e	de
eef   fd       Zy)	GatewayPreflightInputsz@The narrow config and Telegram credential needed before startup.profiler9  config_sha256rP   r   c                     t        | j                        | j                  | j                  j                  | j                  j
                  !t        | j                  j
                        dS ddS )Nexplicit_environment)ri  rj  telegram_credential_sha256telegram_credential_source)r   ri  rj  rP   rc  rd  r   s    r#   redacted_identityz(GatewayPreflightInputs.redacted_identity(  se     4<<(!//*.--*G*G ==,,8 DMM--.	
 		
 ,	
 		
r%   N)r   r   r   r   r   r   r  r   ra  propertyrI   ro  r   r%   r#   rh  rh    s=    JM((

4S> 

 

r%   rh  pathrequiredc                ^   t         j                  t        t         dd      z  t        t         dd      z  }	 t        j                  | |      }	 t        j                  |      }t        j                  |j                        rC|j                  t        j                         k7  s"t        j                  |j                        dz  rt        d| j                         g }t        j                  |d      x}r*|j!                  |       t        j                  |d      x}r*d	j#                  |      t        j$                  |       S # t        $ r |sY yt        d| j                         dt        $ r}t        d| j                         |d}~ww xY w# t        j$                  |       w xY w)
z?Read one owned private regular file without following symlinks.	O_CLOEXECr   
O_NOFOLLOWNz#required profile input is missing: zuntrusted profile input: ?   i   r%   )r   O_RDONLYgetattropenFileNotFoundErrorr^  rE   OSErrorfstatstatS_ISREGst_modest_uidgetuidS_IMODEreadr7  joinclose)rq  rr  flagsfderrorinfochunkschunks           r#   _read_trusted_preflight_filer  6  sY   KK'"k155LRS8TTEXWWT5!xx|T\\*{{biik)||DLL)E1'*CDII;(OPP wwr9--e-MM%  wwr9--e-xx
'  a#&I$))$UV\`` X#&?		{$KLRWWX 	s0   E CF  F F!F4FFF,yaml_configlegacy_configc                    i }|j                  d      }t        |t              r2|j                  d      }t        |t              r|j                  |       | j                  d      }t        |t              r|j                  d      nd}| j                  d      }t        |t              r|j                  d      ndt        |t              r|j                  d      nd| j                  d      f}t        |j                  d      t              rt	        |j                  di             ni }	|D ]W  }
t        |
t              s|
j                  d      }|j                  |
       t        |t              sG|	j                  |       Y | j                  d      }t        |t              rdD ]  }||v s||   |	|<    d| v rd|	vr| d   |	d<   |	r|	|d<   |S )zFResolve the Telegram subset using gateway startup's source precedence.r~   rP   rL  NrG   )
allow_fromallowed_chatsallowed_topicschannel_promptsdisable_topic_auto_rename	dm_policyexclusive_bot_mentionsfree_response_channelsr   group_allow_admin_fromgroup_allow_fromgroup_allowed_chatsgroup_policygroup_user_allowed_commands
guest_modemention_patternsr[  "observe_unmentioned_group_messagesreply_prefixrequire_mentionr0  user_allowed_commandsr  )r   r   r   updaterI   )r  r  r   legacy_platformslegacy_telegramrL  nested_platformstop_platformssourcesrG   sourcesource_extrarP   r0   s                 r#    _merge_preflight_telegram_configr  Q  s     F$((5"G,*..z:ow/MM/*ooi(G3=gw3Ow{{;/UYOOK0M,67G,QZ(W[)3M7)K*%QU
#G
 >H

SZH[]d=eDGR!89kmE&'*zz'*flG,LL&  z*H(G$	
C h%c]c
	
 K',=U,J#./@#A wMr%   )environmentri  r  c                   t        |       }|j                         st        d      	 |j                         }|j                         sbt        j                  |j                        rC|j                  t        j                         k7  s"t        j                  |j                        dz  rt        d      t        |dz  d      }|J 	 t        j                  |j!                  d	            xs i }t'        |t(              st        d
      t        |dz  d      }i }|F	 t+        j,                  |j!                  d	            xs i }	t'        |	t(              st        d      |	}t1        ||      }
t3        |xs i       }t        |dz  d      }d}||	 t5        t7        j8                  |j!                  d            d      }|j;                  |j=                         D ci c]  \  }}|	|| c}}       |j?                  d      r|dz  }|j?                  d      }|s*|
j?                  d      }t'        |t@              r	|r|}|dz  }|st        d      |
jC                  dd       |
jE                  dd       tF        jI                  dd|
ii      }|dz  |_%        tM        dtO        jP                  |jS                  d	            jU                         ||      }tW        ||tO        jP                  |      jU                         |      S # t        $ r}t        d      |d}~ww xY w# t"        t        j$                  f$ r}t        d
      |d}~ww xY w# t"        t*        j.                  f$ r}t        d      |d}~ww xY w# t"        $ r3 t5        t7        j8                  |j!                  d            d      }Y w xY wc c}}w )a  Read profile Telegram startup inputs without bootstrapping authority.

    The profile path is explicit and never inferred from ``HERMES_HOME``.
    ``environment`` is copied, profile ``.env`` values take startup-equivalent
    precedence over it, and neither mapping nor ``os.environ`` is mutated.
    External secret managers are intentionally excluded because preflight must
    not perform network calls or update their process-global caches.
    zprofile path must be absolutezprofile path is unavailableNrv  zuntrusted profile pathconfig.yamlT)rr  utf-8zconfig.yaml is malformedgateway.jsonFzgateway.json is malformedz.envz	utf-8-sig)streaminterpolatezlatin-1TELEGRAM_BOT_TOKENr   ztelegram credential is missingr   r~   rP   r'  )rb  rc  rd  rf  )ri  r9  rj  rP   ),r   is_absoluter^  lstatr{  
is_symlinkr}  S_ISDIRr  r  r   r  r  r  yaml	safe_loaddecodeUnicodeDecodeError	YAMLErrorr   r   jsonloadsJSONDecodeErrorr  rI   r   ioStringIOr  r5  r   r   rH   popr  r   r(  ra  hashlibsha256encode	hexdigestrh  )ri  r  profile_pathprofile_infor  config_bytesloaded_yamllegacy_byteslegacyloaded_legacytelegram_dataeffective_environment	env_bytesrd  valuesr0   r   secret_valueconfigured_secretr9  
credentials                        r#   load_gateway_preflight_inputsr    s    =L##%#$CDDN#))+ 	!||L001"))+-<<,,-5#$<==/}$tL ###Knn\%8%8%ABHb k7+#$>??/~%L !#F	P JJ|':':7'CDJM -1'(CDD4[&IM !23,\F-BUSI#K		"{{9#3#3K#@A!F 	$$*0,,.N.JCE<MS%Z.N	
 ::*+&/K(,,-ABL)--g6'-2C,L&6K#$DEE Y-gt$$$kJ3N%OPF&3F+%|':':7'CDNNP	J "nn\2<<>	 [  N#$ABMN  / K#$>?UJK #D$8$89 	P'(CD%O	P  " 	"{{9#3#3I#>?!F	 Ose   L 
(L/ "(M /N	 $
O
/O
	L,L''L,/MMMN5NN	8OOc                  5  E t               } i }| dz  }|j                         rG	 t        |dd      5 }t        j                  |      xs i }ddd       t
        j                  d|       	 ddl	}| d	z  }|j                         rt        |d      5 } |j                  |      xs i }ddd       dd
lm} |j                        }|j                  d      }	|	rt        |	t               r|	|d<   |j                  d      }
|
?t        |
t               r|
|d<   n)t
        j                  dt#        |
      j$                         |j                  d      }t        |t               r||d<   d|v r|d   |d<   d|v r|d   |d<   d|v r|d   |d<   |j                  d      }t        |t               rd|v r|d   |d<   d|v r|d   |d<   |j                  d      }t        |t               s!|j                  di       j                  d      }t        |t               r||d<   d|v r|d   |d<   d|v r|d   |d<   d|v r|d   |d<   d|v rt'        |j                  d      d      |d<   |j                  d      }t        |t               r|j                  d      nd}|j)                  di       Et        Et               si EE|d<   dt*        ddfEfd} ||        ||j                  d             ErE|d<   	 ddlm}  |        dd lm} t7        t8              }|A|j;                         D ].  }	 t9        |j<                        }||vs|jC                  |       0 |D ]  }|t8        jD                  k(  r|j                  |jF                        }t        |t               }|sX||j                  d      fD ]B  }t        |t               s|j                  |jF                        }t        |t               s@|} n t        |t               si }d|v r.t'        |j                  d      |j                  dd            |d<   d"|v rtI        |j                  d"      d#      |d"<   d$|v r|d$   |d$<   d%|v r|d%   |d%<   d&|v r|d&   |d&<   |t8        jJ                  k(  rd'|v r|d'   |d'<   |t8        jJ                  k(  rd(|v r|d(   |d(<   |t8        jJ                  k(  rd)|v r|d)   |d)<   d*|v r|d*   |d*<   d+|v r|d+   |d+<   d,|v r|d,   |d,<   |t8        jJ                  k(  rd-|v r|d-   |d-<   d.|v r|d.   |d.<   d/|v r|d/   |d/<   d0|v r|d0   |d0<   d1|v r|d1   |d1<   d2|v r|d2   |d2<   d3|v r|d3   |d3<   d4|v r|d4   |d4<   d5|v r|d5   |d5<   |t8        jL                  t8        jN                  hv rd6|v r|d6   |d6<   d7|v rK|d7   }t        |t               r1|jQ                         D ci c]  \  }}tS        |      | c}}|d7<   n||d7<   d8|v r|d8   |d8<   |xr d9|v }|s|stU        E|jF                        \  } }!|r|d9   | d9<   |t8        jN                  k(  r|rd:|!d;<   |!jW                  |        ||jY                         D ]  }"|"jZ                  |j                  |"j<                        }t        |t               sX||j                  d      fD ]B  }t        |t               s|j                  |"j<                        }t        |t               s@|} n t        |t               s	 |"j[                  ||      }#t        |#t               r|#stU        E|"j<                        \  }$}!|!jW                  |#        |j                  d=i       }%t        |%t               rd&|%v rBt]        j^                  d>      s-tS        |%d&         ja                         t\        jb                  d><   d?|%v rBt]        j^                  d@      s-tS        |%d?         ja                         t\        jb                  d@<   dA|%v rBt]        j^                  dB      s-tS        |%dA         ja                         t\        jb                  dB<   |%j                  d*      }&|&Yt]        j^                  dC      sDt        |&t6              rdDje                  dE |&D              }&tS        |&      t\        jb                  dC<   dF|%v rBt]        j^                  dG      s-tS        |%dF         ja                         t\        jb                  dG<   |%j                  dH      }'|'Yt]        j^                  dI      sDt        |'t6              rdDje                  dJ |'D              }'tS        |'      t\        jb                  dI<   |j                  d&      }(|(g|j                  dK      xs i })d&|)vrNEj)                  t8        jJ                  jF                  i       }*|*j)                  dLi       }+|+j)                  d&|(       |j                  dKi       },t        |,t               rdM|,v rQEj)                  t8        jJ                  jF                  i       }*|*j)                  dLi       }+|+j)                  dM|,dM          |,j                  d&|j                  d&            }-|-?t]        j^                  dN      s*tS        |-      ja                         t\        jb                  dN<   d+|,v r>t]        j^                  dO      s)t        jf                  |,d+         t\        jb                  dO<   d,|,v rBt]        j^                  dP      s-tS        |,d,         ja                         t\        jb                  dP<   dQ|,v rBt]        j^                  dR      s-tS        |,dQ         ja                         t\        jb                  dR<   d-|,v rBt]        j^                  dS      s-tS        |,d-         ja                         t\        jb                  dS<   |,j                  dT      }&|&Yt]        j^                  dU      sDt        |&t6              rdDje                  dV |&D              }&tS        |&      t\        jb                  dU<   |,j                  d'      }'|'Yt]        j^                  dW      sDt        |'t6              rdDje                  dX |'D              }'tS        |'      t\        jb                  dW<   |,j                  d)      }.|.Yt]        j^                  dY      sDt        |.t6              rdDje                  dZ |.D              }.tS        |.      t\        jb                  dY<   |,j                  d[      }/|/Yt]        j^                  d\      sDt        |/t6              rdDje                  d] |/D              }/tS        |/      t\        jb                  d\<   dF|,v rBt]        j^                  d^      s-tS        |,dF         ja                         t\        jb                  d^<   d_|,v rBt]        j^                  d`      s-tS        |,d_         ji                         t\        jb                  d`<   t        |,j                  dL      t               r|,j                  dL      ni }0da|,v r|,da   n|0j                  da      }1|1Gt]        j^                  db      s2|1dcu rddntS        |1      ja                         }2|2t\        jb                  db<   |,j                  d/      }3|3Yt]        j^                  de      sDt        |3t6              rdDje                  df |3D              }3tS        |3      t\        jb                  de<   |,j                  d3      }4|4Yt]        j^                  dg      sDt        |4t6              rdDje                  dh |4D              }4tS        |4      t\        jb                  dg<   |,j                  d(      }5|5Yt]        j^                  di      sDt        |5t6              rdDje                  dj |5D              }5tS        |5      t\        jb                  di<   dkD ]  }6|6|,v sEj)                  t8        jJ                  jF                  i       } t        | t               si } | Et8        jJ                  jF                  <   | j)                  dLi       }!t        |!t               si }!|!| dL<   |,|6   |!|6<    |0rQtU        Et8        jJ                  jF                        \  }7}8|0jQ                         D ]  \  }6}9|8j)                  |6|9        |j                  dli       }:t        |:t               rXd&|:v rBt]        j^                  dm      s-tS        |:d&         ja                         t\        jb                  dm<   d+|:v r>t]        j^                  dn      s)t        jf                  |:d+         t\        jb                  dn<   |:j                  dT      }&|&Yt]        j^                  do      sDt        |&t6              rdDje                  dp |&D              }&tS        |&      t\        jb                  do<   d.|:v rBt]        j^                  dq      s-tS        |:d.         ja                         t\        jb                  dq<   |:j                  d/      };|;Yt]        j^                  dr      sDt        |;t6              rdDje                  ds |;D              };tS        |;      t\        jb                  dr<   d2|:v rBt]        j^                  dt      s-tS        |:d2         ja                         t\        jb                  dt<   |:j                  d3      }<|<Yt]        j^                  du      sDt        |<t6              rdDje                  dv |<D              }<tS        |<      t\        jb                  du<   |j                  dwi       }=t        |=t               rFd&|=v rBt]        j^                  dx      s-tS        |=d&         ja                         t\        jb                  dx<   |j                  dyi       }>t        |>t               rd&|>v rBt]        j^                  dz      s-tS        |>d&         ja                         t\        jb                  dz<   d+|>v r>t]        j^                  d{      s)t        jf                  |>d+         t\        jb                  d{<   |>j                  dT      }&|&Yt]        j^                  d|      sDt        |&t6              rdDje                  d} |&D              }&tS        |&      t\        jb                  d|<   |>j                  d'      }'|'Yt]        j^                  d~      sDt        |'t6              rdDje                  d |'D              }'tS        |'      t\        jb                  d~<   |>j                  d      }?|?Yt]        j^                  d      sDt        |?t6              rdDje                  d |?D              }?tS        |?      t\        jb                  d<   |j                  di       }@t        |@t               rd&@v rBt]        j^                  d      s-tS        @d&         ja                         t\        jb                  d<   @j                  d      }3|3Yt]        j^                  d      sDt        |3t6              rdDje                  d |3D              }3tS        |3      t\        jb                  d<   @j                  d      }A|AYt]        j^                  d      sDt        At6              rdDje                  d AD              }AtS        A      t\        jb                  d<   @j                  d      }&|&Yt]        j^                  d      sDt        |&t6              rdDje                  d |&D              }&tS        |&      t\        jb                  d<   @j                  d      }B|BYt]        j^                  d      sDt        Bt6              rdDje                  d BD              }BtS        B      t\        jb                  d<   d@v rBt]        j^                  d      s-tS        @d         ja                         t\        jb                  d<   d@v rBt]        j^                  d      s-tS        @d         ja                         t\        jb                  d<   d@v rBt]        j^                  d      s-tS        @d         ja                         t\        jb                  d<   d@v rBt]        j^                  d      s-tS        @d         ja                         t\        jb                  d<   |j                  di       }Ct        |Ct               rFdACv rBt]        j^                  d      s-tS        CdA         ja                         t\        jb                  d<   tj        jm                  |      }Dto        |D       tq        |D       |DS # 1 sw Y   ;xY w# t        $ r"}t
        j                  d||       Y d}~Nd}~ww xY w# 1 sw Y   xY w# t        $ r#}t
        j5                  d!|       d}Y d}~d}~ww xY w# t>        t@        f$ r Y w xY wc c}}w # t        $ r,}t
        j5                  d<|"j<                  |       Y d}~d}~ww xY w# t        $ r%}t
        j                  d| d	z  |       Y d}~!d}~ww xY w)u  
    Load gateway configuration from multiple sources.

    Priority (highest to lowest):
    1. Environment variables
    2. ~/.hermes/config.yaml (primary user-facing config)
    3. ~/.hermes/gateway.json (legacy — provides defaults under config.yaml)
    4. Built-in defaults
    r  rr  )encodingNu<   Loaded legacy %s — consider moving settings to config.yamlzFailed to load %s: %sr   r  )managed_scopesession_resetr  r%  zIIgnoring invalid quick_commands in config.yaml (expected mapping, got %s)rK  r,  r-  r/  rL  r.  r1  r$  r)  r*  r0  r:   r~   source_platformsr   c                 D   t        | t              sy | j                         D ]{  \  }}t        |t              sj                  |i       }t        |t              si }i |j                  di       |j                  di       }d|v rd|d<   i ||}|r||d<   ||<   } y )NrG   r   T_enabled_explicit)r   rI   r5  r   )r  	plat_name
plat_blockexistingmerged_extramergedrD   s         r#   _merge_platform_mapz0load_gateway_config.<locals>._merge_platform_map`  s    !"2D9-=-C-C-E)Iz%j$7 -11)R@H%h5#%#_hll7B&?#_:>>RY[]C^#_L J.<@%8977J7F#*6w06N9- .Fr%   discover_pluginsrk   zplugin discovery skipped: %sr[  rA   r  reply_in_threadr  r  r  r  r  r  r  r  r  r  allow_admin_fromr  r  r  r  r  channel_skill_bindingsr  r   r   Tr  z&apply_yaml_config_fn for %s raised: %srT   SLACK_REQUIRE_MENTIONstrict_mentionSLACK_STRICT_MENTION
allow_botsSLACK_ALLOW_BOTSSLACK_FREE_RESPONSE_CHANNELS,c              3   2   K   | ]  }t        |        y wr   r   r   rI  s     r#   r   z&load_gateway_config.<locals>.<genexpr>       &;s!s1vs   	reactionsSLACK_REACTIONSallowed_channelsSLACK_ALLOWED_CHANNELSc              3   2   K   | ]  }t        |        y wr   r  r  s     r#   r   z&load_gateway_config.<locals>.<genexpr>        %9bc!fbr  rP   rG   r  TELEGRAM_REQUIRE_MENTIONTELEGRAM_MENTION_PATTERNSTELEGRAM_EXCLUSIVE_BOT_MENTIONSr  TELEGRAM_GUEST_MODE+TELEGRAM_OBSERVE_UNMENTIONED_GROUP_MESSAGESfree_response_chatsTELEGRAM_FREE_RESPONSE_CHATSc              3   2   K   | ]  }t        |        y wr   r  r  s     r#   r   z&load_gateway_config.<locals>.<genexpr>K  r  r  TELEGRAM_ALLOWED_CHATSc              3   2   K   | ]  }t        |        y wr   r  r  s     r#   r   z&load_gateway_config.<locals>.<genexpr>Q  r  r  TELEGRAM_ALLOWED_TOPICSc              3   2   K   | ]  }t        |        y wr   r  r  s     r#   r   z&load_gateway_config.<locals>.<genexpr>V  s     1Q.Q#a&.r  ignored_threadsTELEGRAM_IGNORED_THREADSc              3   2   K   | ]  }t        |        y wr   r  r  s     r#   r   z&load_gateway_config.<locals>.<genexpr>[       2S?a3q6?r  TELEGRAM_REACTIONS	proxy_urlTELEGRAM_PROXYr   TELEGRAM_REPLY_TO_MODEFr   TELEGRAM_ALLOWED_USERSc              3   2   K   | ]  }t        |        y wr   r  r  s     r#   r   z&load_gateway_config.<locals>.<genexpr>n       0OAQr  TELEGRAM_GROUP_ALLOWED_USERSc              3   2   K   | ]  }t        |        y wr   r  r  s     r#   r   z&load_gateway_config.<locals>.<genexpr>s       6[GZ!s1vGZr  TELEGRAM_GROUP_ALLOWED_CHATSc              3   2   K   | ]  }t        |        y wr   r  r  s     r#   r   z&load_gateway_config.<locals>.<genexpr>x  r  r  )r  disable_link_previewsr  rR   WHATSAPP_REQUIRE_MENTIONWHATSAPP_MENTION_PATTERNSWHATSAPP_FREE_RESPONSE_CHATSc              3   2   K   | ]  }t        |        y wr   r  r  s     r#   r   z&load_gateway_config.<locals>.<genexpr>  r  r  WHATSAPP_DM_POLICYWHATSAPP_ALLOWED_USERSc              3   2   K   | ]  }t        |        y wr   r  r  s     r#   r   z&load_gateway_config.<locals>.<genexpr>  r  r  WHATSAPP_GROUP_POLICYWHATSAPP_GROUP_ALLOWED_USERSc              3   2   K   | ]  }t        |        y wr   r  r  s     r#   r   z&load_gateway_config.<locals>.<genexpr>  r  r  rU   SIGNAL_REQUIRE_MENTIONr[   DINGTALK_REQUIRE_MENTIONDINGTALK_MENTION_PATTERNSDINGTALK_FREE_RESPONSE_CHATSc              3   2   K   | ]  }t        |        y wr   r  r  s     r#   r   z&load_gateway_config.<locals>.<genexpr>  r  r  DINGTALK_ALLOWED_CHATSc              3   2   K   | ]  }t        |        y wr   r  r  s     r#   r   z&load_gateway_config.<locals>.<genexpr>  r  r  allowed_usersDINGTALK_ALLOWED_USERSc              3   2   K   | ]  }t        |        y wr   r  r  s     r#   r   z&load_gateway_config.<locals>.<genexpr>  s     *C7a3q67r  rW   MATRIX_REQUIRE_MENTIONMATRIX_ALLOWED_USERSc              3   2   K   | ]  }t        |        y wr   r  r  s     r#   r   z&load_gateway_config.<locals>.<genexpr>  r  r  allowed_roomsMATRIX_ALLOWED_ROOMSc              3   2   K   | ]  }t        |        y wr   r  r  s     r#   r   z&load_gateway_config.<locals>.<genexpr>  r  r  free_response_roomsMATRIX_FREE_RESPONSE_ROOMSc              3   2   K   | ]  }t        |        y wr   r  r  s     r#   r   z&load_gateway_config.<locals>.<genexpr>  r  r  ignore_user_patternsMATRIX_IGNORE_USER_PATTERNSc              3   2   K   | ]  }t        |        y wr   r  r  s     r#   r   z&load_gateway_config.<locals>.<genexpr>  r
  r  process_noticesMATRIX_PROCESS_NOTICESsession_scopeMATRIX_SESSION_SCOPEauto_threadMATRIX_AUTO_THREADdm_mention_threadsMATRIX_DM_MENTION_THREADSr_   FEISHU_ALLOW_BOTSus   Failed to process config.yaml — falling back to .env / gateway.json values. Check %s for syntax errors. Error: %s)9r   r   ry  r  loadr4   r  rx   r5   r  r  
hermes_clir  apply_managed_overlayr   r   rI   typer   r?   rH   r	   hermes_cli.pluginsr  rv   rl   debugr   rN   plugin_entriesrE   r)   KeyErrorr7  r   r   rC   r   r   r   r5  r   rK   r  all_entriesapply_yaml_config_fnr   r   r!   environr  dumpsr    r  r   _apply_env_overrides_validate_gateway_config)F_homegw_datagateway_json_pathfer  config_yaml_pathyaml_cfgr  srqcstt_cfggateway_sectionstreaming_cfggateway_cfggateway_platformsr  r  _pr_shared_loop_targets_entry_platplatrX  _cfg_toplevel_src
_candidatebridgedr  rH  rI  enabled_was_explicitrJ   rG   r?  seededri   	slack_cfgfrcac_tl_require_mention_tg_section_tg_plat	_tg_extratelegram_cfg_effective_rmr  r  _telegram_extra_telegram_rtm_rtm_strr)  group_allowed_usersr  _telegram_extra_key
_plat_data_plat_extra_telegram_extra_valuewhatsapp_cfgafgaf
signal_cfgdingtalk_cfgallowed
matrix_cfgr/  ignore_patterns
feishu_cfgr9  rD   sF                                                                        @r#   load_gateway_configr    s    EG .!	J'w?1))A,," @KKN!q
 =0""$&9Q)4>>!,2 : 1$::8DH o.BjT*24././B~b$'02G,-NN5R)) ll5)G'4(!((H45=>W5X12)X56>?Y6Z23 $x/089M0N,-&ll95O/405NRa5a5DE^5_12(H45=>W5X12$LL5MmT2 !)Y ; ? ? L-.'4$8+,45E,F()!X-.67I.J*+)X56>.723 *X56YLL!;<723 #,,y1K@J;X\@] <cg$//R@Nnd3!#'5$7c 7d 7$   12[ 9:'5$? "N
 *.h !002F! ( 5 $88,33E: 3 -8>>)'||DJJ7 *< > %!2HLL4M N%dD1)-$**)=J)*d;/9 % !O ",5-=:]$(()CD$>G;G67 %41K$(():; 2G-. "\1.:>.JGN+$41=>O1PG-.$41=>O1PG-.8,,,L1P/;O/LGO,8,,,1F,1V5ABW5XG128,,,1A\1Q0<=M0NG,-+|;8DE]8^G45%52>?Q2RG./+|;8DE]8^G458,,,1UYe1eDPQuDvG@A,.+7+DGK(</,8,FGL)%52>?Q2RG./*l:7CD[7\G34!\1.:>.JGN+%52>?Q2RG./+|;8DE]8^G450L@=IJg=hG9:H,,hnn==BZ^jBj8DE]8^G45$4&23D&EO!/48L[LaLaLc5dLcDAqc!faiLc5d 125D 121\A>JKi>jG:;'4'Rl9R$';#>~tzz#Z 	5'+7	+BIi(8>>).B15E-.W%w -D  __.E119 #+<<

#;L &lD9%6[8Q$RD)$5-1XXejj-A
#-j$#?3=L$) %S &lD9 !!&!;!;Hl!S &fd36 :>5::VHAuLL(; /@ !Wb1I)T*$	1"))D[:\:=iHY>Z:[:a:a:cBJJ67#y0CY9Z9<YGW=X9Y9_9_9aBJJ569,RYY?Q5R58<9P5Q5W5W5YBJJ12mm$<=?2995S+T!#t,!hh&;s&;;ADSBJJ=>)+BII>O4P47	+8N4O4U4U4WBJJ01]]#56>"))4L*M!"d+ XX%9b%99;>r7BJJ78 #+,,/@"A".&ll:6<"$K7-889J9J9P9PRTUH ( 3 3GR @I(():<OP $<<
B7L,- /,>-889J9J9P9PRTUH ( 3 3GR @I((3$%@A
 !- 0 01BHLLQbDc d ,RYY?Y5Z=@=O=U=U=WBJJ9:%5biiHc>d>BjjVhIi>jBJJ:;+|;BIINoDpDGUmHnDoDuDuDwBJJ@A</		BW8X8;L<V8W8]8]8_BJJ457<GPRPYPY  [H  QIPST`  bF  UG  QH  QN  QN  QPBJJLM"&&'<=?2995S+T!#t,!hh&;s&;;ADSBJJ=>!%%o6>"))4L*M!"d+ XX%9b%99;>r7BJJ78!-!1!12B!C!-bii@Y6Z!.$7),1Q.1Q)Q<?<OBJJ89"."2"23D"E".ryyA[7\!/48*-((2S?2S*S=@=QBJJ9:,.ryyAU7V7:<;T7U7[7[7]BJJ34,.ryyAQ7R36|K7P3Q3W3W3YBJJ/0 @J,JZJZ[bJcei?j,"2"27";pr5D5TL1(,,_=  !,RYY?W5X(5(>uCDVD\D\D^H;CBJJ78 , 0 0 > ,RYY?W5X!-6(+0O0O(O;>};MBJJ78&2&6&67I&J#&2299Ec;d!"5t<.1hh6[GZ6[.[+ADEXAYBJJ=>&2&6&67L&M#&2299Ec;d!"5t<.1hh6[GZ6[.[+ADEXAYBJJ=>+x'*l:$2$=$=h>O>O>U>UWY$Z	))T:(*IFON8+<+<+B+BC ) 4 4Wb A)%6$&E16Ig.5ABU5V12 ,y #.I&(9(9(?(?/+J GVF[F[F]B+-B#../BDYZ G^ $<<
B7L,-$4RYYGa=b=@N_A`=a=g=g=iBJJ9:%5biiHc>d>BjjVhIi>jBJJ:;"&&'<=?2995S+T!#t,!hh&;s&;;ADSBJJ=>,.ryyAU7V7:<;T7U7[7[7]BJJ34!%%l3>"))4L*M!"d+ XX%9b%99;>r7BJJ78!\1"))D[:\:=l>>Z:[:a:a:cBJJ67"&&'9:?2995S+T!#t,!hh&;s&;;ADSBJJ=> "h3J*d+$
2299E];^;>zJ[?\;];c;c;eBJJ78 $<<
B7L,-$4RYYGa=b=@N_A`=a=g=g=iBJJ9:%5biiHc>d>BjjVhIi>jBJJ:;"&&'<=?2995S+T!#t,!hh&;s&;;ADSBJJ=>!%%o6>"))4L*M!"d+ XX%9b%99;>r7BJJ78&**?;&ryy9Q/R!'40"%((*C7*C"C;>w<BJJ78 "h3J*d+$
2299E];^;>zJ[?\;];c;c;eBJJ78 * ? ,RYY?U5V!-6(+0O0O(O9<]9KBJJ56 * ? ,RYY?U5V!-6(+0O0O(O9<]9KBJJ56 nn%:;?2995Q+R!#t,!hh&;s&;;?B3xBJJ;<",..1G"H".ryyA^7_!/48*-((2S?2S*S@CO@TBJJ<=$
2299E];^;>zJ[?\;];c;c;eBJJ78"j0CY9Z9<Z=X9Y9_9_9aBJJ56 J.ryyAU7V7::m;T7U7[7[7]BJJ34':5biiHc>d>A*MaBb>c>i>i>kBJJ:; "h3J*d+:-bii@S6T69*\:R6S6Y6Y6[BJJ23 $$W-F   V$MK @?  	JNN24EqII	J :9h  ;Q? '1 ! !f 6eR % !D!JJ !!\  
4M!		
 	

sQ  Af AfAf +'Ai Ag )I
Ai 4Ag $Ai ,Ag<Ai B Ai +Ai 3G*Ai Ah3C,Ai  +Ai Ai #Ah5cAi @e
Ai fAff
Af f	Af=fAf8f8Af=g Ag
gAi g	Ag9gAg4g.Ai g4Ag9g9Ai g<AhhAi hAhh	Ai h	Aih!!AiiAi iAiiAi i	Ai>iAi9i9Ai>r9  c                    | j                   }d|j                  cxk  rdk  s)n t        j                  d|j                         d|_        |j                  |j                  dk  r't        j                  d|j                         d|_        t
        j                  dt
        j                  d	t
        j                  d
t
        j                  dt
        j                  dt
        j                  di}| j                  j                         D ]o  \  }}|j                  s|j                  |      }|s'|j                   4|j                   j#                         rOt        j                  d|j$                  |       q 	 ddlm} || j                  j                         D ]  \  }}|j                  s|j                  |      }|s'|j                   }|s6|j#                         sG ||d      rRt        j-                  d|j$                  ||j#                         dd dz          d|_         yy# t*        $ r d}Y w xY w)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   r  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   r4   r5   r   rN   r   r   r   r   r   r   r~   r5  r   r   r   r    r   hermes_cli.authr  ImportErrorr  )r9  policy_token_env_namesr   pconfigrb  r  r   s           r#   rN  rN    s    ((F%2%A6>>	
 "f&9&9Q&>M	
 #
 	/-)/. $--335'#''11'--:M:M:ONN; 6!5 $!'!1!1!7!7!9Hg??'++H5HMME/@ST/U7 NNHekkmBQ.?%.G	 #( ": %  ! !s   <H1 1H?>H?c                 0Z    dt         dt        f fd}t        j                  d      }|r |t         j                        }||_        t        j                  dd      j                         }|dv rct         j                   j                  vr%t                j                  t         j                  <   | j                  t         j                     _        t        j                  dd      }|rt         j                   j                  vr%t                j                  t         j                  <   |j                  d	      D cg c]#  }|j                         s|j                         % c} j                  t         j                     j                  d
<   t        j                  d      }|rt         j                   j                  v rht        t         j                  |t        j                  dd      t        j                  d      xs d       j                  t         j                     _        t        j                  d      }|r |t         j                        }	||	_        t        j                  d      }
|
rt         j                   j                  v rht        t         j                  |
t        j                  dd      t        j                  d      xs d       j                  t         j                     _        t        j                  dd      j                         }|dv rct         j                   j                  vr%t                j                  t         j                  <   | j                  t         j                     _        t        j                  dd      j                         dv }t        j                  dd      j                         dv }t         j                   j                  v r1 j                  t         j                     }|rd|_        n3|r1d|_        n)|r't        d       j                  t         j                  <   t        j                  d      }|rt         j                   j                  v rht        t         j                  |t        j                  dd      t        j                  d      xs 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                  j%                  ||d!       t        j                  d"      }|r*| j                  t         j"                     j                  d#<   t        j                  d$      }|r*| j                  t         j"                     j                  d%<   t        j                  d&      }|r*| j                  t         j"                     j                  d'<   t        j                  d(      }|r*| j                  t         j"                     j                  d)<   t        j                  d*      }|r*| j                  t         j"                     j                  d+<   t        j                  d,      }|r4	 t'        |       j                  t         j"                     j                  d-<   t        j                  d.      }|r*| j                  t         j"                     j                  d/<   t        j                  d0      }|r*| j                  t         j"                     j                  d1<   t        j                  d2      }|rt         j"                   j                  v rht        t         j"                  |t        j                  d3d      t        j                  d4      xs d       j                  t         j"                     _        t        j                  d5      }|rt         j*                   j                  vrHt                j                  t         j*                  <   d j                  t         j*                     _        nW j                  t         j*                     }t-        |j                  j/                  d6d            }|j                   s	|sd|_        | j                  t         j*                     _        t        j                  d7      }|rt         j*                   j                  v rht        t         j*                  |t        j                  d8d      t        j                  d9      xs d       j                  t         j*                     _        t        j                  d:      }t        j                  d;      } |r[| rY |t         j0                        }!|!j                  j%                  || t        j                  d<d=      j                         dv d>       t        j                  d?      }"|"rt         j0                   j                  v rht        t         j0                  |"t        j                  d@d      t        j                  dA      xs d       j                  t         j0                     _        t        j                  dB      }#|#rYt        j                  dCd      }$|$st2        j5                  dD        |t         j6                        }%|#|%_        |$|%j                  dE<   t        j                  dF      }&|&rt         j6                   j                  v rht        t         j6                  |&t        j                  dGd      t        j                  dH      xs d       j                  t         j6                     _        t        j                  dI      }'t        j                  dJd      }(|'st        j                  dK      r8|(st2        j5                  dL        |t         j8                        })|'r|'|)_        |(|)j                  dM<   t        j                  dNd      }*|*r|*|)j                  dO<   t        j                  dKd      }+|+r|+|)j                  dP<   t        j                  dQd      j                         j                         },|,dRv xs& t        j                  dSd      j                         dTv }-|-|)j                  dU<   |,r|,|)j                  dV<   t        j                  dWd      }.|.r|.|)j                  dX<   t        j                  dY      }/|/rt         j8                   j                  v rht        t         j8                  |/t        j                  dZd      t        j                  d[      xs d       j                  t         j8                     _        t        j                  d\      }0|0rt         j:                   j                  vr%t                j                  t         j:                  <   d j                  t         j:                     _        |0 j                  t         j:                     _        t        j                  d]      }1|1r*|1 j                  t         j:                     j                  dE<   t        j                  d^      }2t        j                  d_      }3t        j                  d`      }4t        j                  da      }5t=        |2|3|4|5g      rt         j>                   j                  vr%t                j                  t         j>                  <   d j                  t         j>                     _         j                  t         j>                     j                  j%                  |2|4|5db       t        j                  dc      }6|6rt         j>                   j                  v rht        t         j>                  |6t        j                  ddd      t        j                  de      xs d       j                  t         j>                     _        t        j                  df      }7|7rt         j@                   j                  vr%t                j                  t         j@                  <   d j                  t         j@                     _        t        j                  dgd       j                  t         j@                     _!        t        j                  dh      }8|8rt         j@                   j                  v rht        t         j@                  |8t        j                  did      t        j                  dj      xs d       j                  t         j@                     _        t        j                  dkd      j                         dv }9t        j                  dld      }:t        j                  dmd      };t        j                  dn      }<t        j                  do      }=|9s|:rt         jD                   j                  vr%t                j                  t         jD                  <   d j                  t         jD                     _        |:r*|: j                  t         jD                     j                  dp<   |;ri|;j                  d	      D >cg c]#  }>|>j                         s|>j                         % }?}>|?r*|? j                  t         jD                     j                  dq<   |<r4	 t'        |<       j                  t         jD                     j                  dr<   |=r*|= j                  t         jD                     j                  ds<   t        j                  dtd      }@|@r*@ j                  t         jD                     j                  du<   t        j                  dvd      j                         dv }At        j                  dw      }Bt        j                  dxd      }C|Art         jF                   j                  vr%t                j                  t         jF                  <   d j                  t         jF                     _        Br4	 t'        B       j                  t         jF                     j                  dr<   Cr*C j                  t         jF                     j                  dy<   t        j                  dzd      j                         dv }Dt        j                  d{      }Et        j                  d|d      }Ft        j                  d}d      }Gt        j                  d~d      }H|Ds%t         jH                   j                  v s	EsFsGsHrt         jH                   j                  vr%t                j                  t         jH                  <   Dr"d j                  t         jH                     _        Er4	 t'        E       j                  t         jH                     j                  dr<   Fr*F j                  t         jH                     j                  d<   GrhGj                  d	      D Icg c]"  }I|Ij                         rIj                         $ }J}I|Jr*J j                  t         jH                     j                  d<   HrhHj                  d	      D Kcg c]"  }K|Kj                         rKj                         $ }L}K|Lr*L j                  t         jH                     j                  d<   t        j                  d      }Mt        j                  d      }N|MrNrt         jJ                   j                  vr%t                j                  t         jJ                  <   d j                  t         jJ                     _         j                  t         jJ                     j                  j%                  MNd       t        j                  d      }O|Orht        t         jJ                  Ot        j                  dd      t        j                  d      xs d       j                  t         jJ                     _        t        j                  d      }Pt        j                  d      }Q|PrQrt         jL                   j                  vr%t                j                  t         jL                  <   d j                  t         jL                     _         j                  t         jL                     j                  j%                  PQt        j                  dd      t        j                  dd      d       t        j                  dd      }R|Rr*R j                  t         jL                     j                  d<   t        j                  dd      }S|Sr*S j                  t         jL                     j                  d<   t        j                  d      }T|Trht        t         jL                  Tt        j                  dd      t        j                  d      xs d       j                  t         jL                     _        t        j                  d      }Ut        j                  d      }V|Ur`Vr]t         jN                   j                  vr%t                j                  t         jN                  <   d j                  t         jN                     _         j                  t         jN                     j                  j%                  UVd       t        j                  dd      }W|Wr*W j                  t         jN                     j                  d<   t        j                  d      }X|Xrht        t         jN                  Xt        j                  dd      t        j                  d      xs d       j                  t         jN                     _        t        j                  d      }Yt        j                  d      }Z|YrZrt         jP                   j                  vr%t                j                  t         jP                  <   d j                  t         jP                     _         j                  t         jP                     j                  j%                  YZt        j                  dd      t        j                  dd      t        j                  dd      t        j                  dd      tS        dd      d       t        j                  d      }[t        j                  d      }\|[s\rt         jT                   j                  vr%t                j                  t         jT                  <   d j                  t         jT                     _        [r"[ j                  t         jT                     _         j                  t         jT                     j                  }]\r\]d<   t        j                  dd      j                         }^|^r^jW                  d      ]d<   t        j                  dd      j                         }_|_r_jW                  d      ]d<   t        j                  dd      j                         j                         }`|`r`]d<   t        j                  dd      j                         j                         }a|ara]d<   t        j                  dd      j                         }b|brb]d<   t        j                  dd      j                         }c|crc]d<   t        j                  dd      j                         }d|drd]d<   t        j                  dd      j                         }e|erht        t         jT                  et        j                  dd      t        j                  d      xs d       j                  t         jT                     _        t        j                  d      }ft        j                  d      }g|frgrt         jX                   j                  vr%t                j                  t         jX                  <   d j                  t         jX                     _         j                  t         jX                     j                  j%                  fjW                  d      gt        j                  dd      tS        dd      t        j                  ddë      t        j                  dd=      j                         dv dŜ       t        j                  dƫ      }h|h:hj                         dv  j                  t         jX                     j                  d<   t        j                  dɫ      }i|ir@	 t[        j\                  i      }jj j                  t         jX                     j                  d<   t        j                  d̫      }l|lrt         jX                   j                  v rht        t         jX                  lt        j                  dd      t        j                  dΫ      xs d       j                  t         jX                     _        t        j                  dϫ      }mt        j                  dЫ      }n|msnr t         jb                   j                  vr%t                j                  t         jb                  <   d j                  t         jb                     _         j                  t         jb                     j                  }]mrm]d#<   nrn]d<   t        j                  dd      j                         }o|oro]d<   t        j                  dd      j                         }p|prp]d<   t        j                  dd      j                         }qd}r|qsRt        j                  dd      j                         }s|sr,s}qd}rte        jf                  th              j5                  dث       qrt        t         jb                  qt        j                  dի      xs t        j                  rd      t        j                  d٫      xs t        j                  dګ      xs d       j                  t         jb                     _        t        j                  d۫      xs t        j                  dܫ      }tt        j                  dݫ      }u|tr.ur+t         jj                   j                  vr%t                j                  t         jj                  <   d j                  t         jj                     _         j                  t         jj                     j                  }]t|]d#<   u|]d%<   t        j                  dޫ      }v|vrv]d<   t        j                  d      }w|wrw]d<   t        j                  d      }x|xrx]d<   t        j                  d      }y|yry]d<   t        j                  d      }z|zrht        t         jj                  zt        j                  dd      t        j                  d      xs d       j                  t         jj                     _        t        j                  d      }{|{r!{j                         j                         ]d<   t        j                  d      }|||r|]d<   t        j                  d      }}|}r!}j                         j                         ]d<   t        j                  d      }~|~r~]d<   t        j                  d      }|r	 t'               jl                  _7        t        j                  d      }|r	 t'               jl                  _8        	 ddl9m:}  |        ddl;m<} |j{                         D ]  }	 j}                         s	 t        j                        } j                  j                  |      }d}|j                  	 j                         }j                   sj                  	 3}|j                   s1t        dt        j                  xs i             }nt        d      }t        t              rYrWt        t        di       xs i       }j                         D ]  \  }}|dk(  rj                          t        d      }t-        j                              }s"t2        j                  dj                         i j                  vrt                j                  <   d j                     _        t        t              sst              }|j/                  dd      } j                     j                  j%                  |       t        |t              sj                  d      s"t        t        d         t        |j                  d      xs d      j                  d      rt        d         nd       j                     _         	 t        j                  dd      j                         }d} j                  j                  t         j                        }|6t        j                  j                  d      xs d      j                         }xs }|r4 |t         j                        }jW                  d      |j                  d<    j                  j                         D ]  }|j                  j/                  d6d         yc c}w # t(        $ r Y $:w xY wc c}>w # t(        $ r Y w xY w# t(        $ r Y w xY w# t(        $ r Y Gw xY wc c}Iw c c}Kw # t^        $ rV ija                  dd	      j                  d	      D kcg c]"  }k|kj                         rkj                         $ nc c}kw }j}kY 
-w xY w# t(        $ r Y w xY w# t(        $ r Y w xY w# t^        $ r,}t2        j                  dj                         Y d}~d}~ww xY w# t^        $ r.}t2        j                  dj                         d}Y d}~gd}~ww xY w# t^        $ r.}t2        j                  dj                         d}Y d}~d}~ww xY w# t^        $ r!}t2        j                  d       Y d}~d}~ww xY w(   z/Apply environment variable overrides to config.r   r   c                    | j                   vr(t        d      j                   | <   j                   |    S j                   |    }t        |j                  j	                  dd            }|j
                  s	|sd|_        |S )NTr   r  F)r~   r   r3   rG   r  r   )r   platform_configrf  r9  s      r#   _enable_from_envz._apply_env_overrides.<locals>._enable_from_envJ  s    6+++)7)EFX&##H-- **84#O$9$9$=$=>QSX$YZ&&/C&*O#r%   r  r  r  >   allr   r   TELEGRAM_FALLBACK_IPSr  fallback_ipsTELEGRAM_HOME_CHANNELTELEGRAM_HOME_CHANNEL_NAMEr   TELEGRAM_HOME_CHANNEL_THREAD_IDNr   r  DISCORD_HOME_CHANNELDISCORD_HOME_CHANNEL_NAMEDISCORD_HOME_CHANNEL_THREAD_IDDISCORD_REPLY_TO_MODEWHATSAPP_ENABLED>   r   r   r   >   r   r   r   FTr  WHATSAPP_HOME_CHANNELWHATSAPP_HOME_CHANNEL_NAMEWHATSAPP_HOME_CHANNEL_THREAD_IDWHATSAPP_CLOUD_PHONE_NUMBER_IDWHATSAPP_CLOUD_ACCESS_TOKEN)r   r   WHATSAPP_CLOUD_APP_IDr  WHATSAPP_CLOUD_APP_SECRETr  WHATSAPP_CLOUD_WABA_IDwaba_idWHATSAPP_CLOUD_VERIFY_TOKENverify_tokenWHATSAPP_CLOUD_WEBHOOK_HOSTwebhook_hostWHATSAPP_CLOUD_WEBHOOK_PORTwebhook_portWHATSAPP_CLOUD_WEBHOOK_PATHwebhook_pathWHATSAPP_CLOUD_API_VERSIONapi_versionWHATSAPP_CLOUD_HOME_CHANNEL WHATSAPP_CLOUD_HOME_CHANNEL_NAME%WHATSAPP_CLOUD_HOME_CHANNEL_THREAD_IDr  r  SLACK_HOME_CHANNELSLACK_HOME_CHANNEL_NAMESLACK_HOME_CHANNEL_THREAD_IDSIGNAL_HTTP_URLSIGNAL_ACCOUNTSIGNAL_IGNORE_STORIESr   )r   accountignore_storiesSIGNAL_HOME_CHANNELSIGNAL_HOME_CHANNEL_NAMESIGNAL_HOME_CHANNEL_THREAD_IDr  MATTERMOST_URLz2MATTERMOST_TOKEN set but MATTERMOST_URL is missingr  MATTERMOST_HOME_CHANNELMATTERMOST_HOME_CHANNEL_NAME!MATTERMOST_HOME_CHANNEL_THREAD_IDr  MATRIX_HOMESERVERMATRIX_PASSWORDzHMATRIX_ACCESS_TOKEN/MATRIX_PASSWORD set but MATRIX_HOMESERVER is missing
homeserverMATRIX_USER_IDuser_idr  MATRIX_E2EE_MODE)rr  requireoptionalprefer	preferredMATRIX_ENCRYPTION)r   r   r   
encryption	e2ee_modeMATRIX_DEVICE_ID	device_idMATRIX_HOME_ROOMMATRIX_HOME_ROOM_NAMEMATRIX_HOME_ROOM_THREAD_ID
HASS_TOKENHASS_URLEMAIL_ADDRESSEMAIL_PASSWORDEMAIL_IMAP_HOSTEMAIL_SMTP_HOST)r   	imap_host	smtp_hostEMAIL_HOME_ADDRESSEMAIL_HOME_ADDRESS_NAMEEMAIL_HOME_ADDRESS_THREAD_IDr   TWILIO_AUTH_TOKENSMS_HOME_CHANNELSMS_HOME_CHANNEL_NAMESMS_HOME_CHANNEL_THREAD_IDAPI_SERVER_ENABLEDAPI_SERVER_KEYAPI_SERVER_CORS_ORIGINSAPI_SERVER_PORTAPI_SERVER_HOSTr0   cors_originsporthostAPI_SERVER_MODEL_NAME
model_nameWEBHOOK_ENABLEDWEBHOOK_PORTWEBHOOK_SECRETrf  MSGRAPH_WEBHOOK_ENABLEDMSGRAPH_WEBHOOK_PORTMSGRAPH_WEBHOOK_CLIENT_STATE"MSGRAPH_WEBHOOK_ACCEPTED_RESOURCES$MSGRAPH_WEBHOOK_ALLOWED_SOURCE_CIDRSr  accepted_resourcesallowed_source_cidrsr  r  )r  r  DINGTALK_HOME_CHANNELDINGTALK_HOME_CHANNEL_NAMEDINGTALK_HOME_CHANNEL_THREAD_IDFEISHU_APP_IDFEISHU_APP_SECRETFEISHU_DOMAINr_   FEISHU_CONNECTION_MODE	websocket)r  r  domainconnection_modeFEISHU_ENCRYPT_KEYencrypt_keyFEISHU_VERIFICATION_TOKENverification_tokenFEISHU_HOME_CHANNELFEISHU_HOME_CHANNEL_NAMEFEISHU_HOME_CHANNEL_THREAD_IDWECOM_BOT_IDWECOM_SECRET)r	  rf  WECOM_WEBSOCKET_URLwebsocket_urlWECOM_HOME_CHANNELWECOM_HOME_CHANNEL_NAMEWECOM_HOME_CHANNEL_THREAD_IDWECOM_CALLBACK_CORP_IDWECOM_CALLBACK_CORP_SECRETWECOM_CALLBACK_AGENT_IDWECOM_CALLBACK_TOKENWECOM_CALLBACK_ENCODING_AES_KEYWECOM_CALLBACK_HOSTz0.0.0.0WECOM_CALLBACK_PORTi!  )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_POLICYr  WEIXIN_GROUP_POLICYr  WEIXIN_ALLOWED_USERSr  WEIXIN_GROUP_ALLOWED_USERSr  WEIXIN_SPLIT_MULTILINE_MESSAGESsplit_multiline_messagesWEIXIN_HOME_CHANNELWEIXIN_HOME_CHANNEL_NAMEWEIXIN_HOME_CHANNEL_THREAD_IDBLUEBUBBLES_SERVER_URLBLUEBUBBLES_PASSWORDBLUEBUBBLES_WEBHOOK_HOSTz	127.0.0.1BLUEBUBBLES_WEBHOOK_PORTBLUEBUBBLES_WEBHOOK_PATHz/bluebubbles-webhookBLUEBUBBLES_SEND_READ_RECEIPTS)r  r  r  r  r  send_read_receiptsBLUEBUBBLES_REQUIRE_MENTION>   r   r   r   r   r  BLUEBUBBLES_MENTION_PATTERNS
r  BLUEBUBBLES_HOME_CHANNELBLUEBUBBLES_HOME_CHANNEL_NAME"BLUEBUBBLES_HOME_CHANNEL_THREAD_ID	QQ_APP_IDQQ_CLIENT_SECRETr  QQ_ALLOWED_USERSQQ_GROUP_ALLOWED_USERSQQBOT_HOME_CHANNELQQBOT_HOME_CHANNEL_NAMEQQ_HOME_CHANNELQQ_HOME_CHANNEL_NAMEzoQQ_HOME_CHANNEL is deprecated; rename to QQBOT_HOME_CHANNEL in your .env for consistency with the platform key.QQBOT_HOME_CHANNEL_THREAD_IDQQ_HOME_CHANNEL_THREAD_IDYUANBAO_APP_IDYUANBAO_APP_KEYYUANBAO_APP_SECRETYUANBAO_BOT_IDr	  YUANBAO_WS_URLws_urlYUANBAO_API_DOMAIN
api_domainYUANBAO_ROUTE_ENV	route_envYUANBAO_HOME_CHANNELYUANBAO_HOME_CHANNEL_NAMEYUANBAO_HOME_CHANNEL_THREAD_IDYUANBAO_DM_POLICYYUANBAO_DM_ALLOW_FROMdm_allow_fromYUANBAO_GROUP_POLICYYUANBAO_GROUP_ALLOW_FROMSESSION_IDLE_MINUTESSESSION_RESET_HOURr   r  rk   zcheck_fn for %s raised: %sz#env_enablement_fn for %s raised: %s)r   rG   rG   r   u6   is_connected for %s raised: %s — skipping enablementuc   Plugin platform '%s' available but not configured (is_connected returned False) — skipping enabler   rE   r   z&Plugin platform enable pass failed: %sGATEWAY_RELAY_URLr  )LrN   r   r   r   r   r   r!   r~   r   splitr    rG   r   r   r   r   r   r   r  r.   r)   r   r3   r  r   r4   r5   r   r   r   r  r   r   r   r   r   r   r   r   r   r   r   r   rstripr   r  r  rx   rs   r   logging	getLoggerr   r   r  r   r   rE  r  rv   rl   rG  check_fnrF  rE   r   env_enablement_fnr<  rI   r   rx  r5  rH   r   r   r  )r9  r  telegram_tokentelegram_configtelegram_reply_modetelegram_fallback_ipsiptelegram_homediscord_tokendiscord_configdiscord_homediscord_reply_modewhatsapp_enabledwhatsapp_disabled_explicitlywa_cfgwhatsapp_homewhatsapp_cloud_phone_idwhatsapp_cloud_tokenwa_cloud_app_idwa_cloud_app_secretwa_cloud_waba_idwa_cloud_verify_tokenwa_cloud_hostwa_cloud_portwa_cloud_pathwa_cloud_api_versionwhatsapp_cloud_homeslack_tokenslack_configrf  
slack_home
signal_urlsignal_accountsignal_configsignal_homemattermost_tokenmattermost_urlmattermost_configmattermost_homematrix_tokenmatrix_homeservermatrix_configmatrix_usermatrix_passwordmatrix_e2ee_mode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originoriginsapi_server_model_namewebhook_enabledr  webhook_secretmsgraph_webhook_enabledmsgraph_webhook_portmsgraph_webhook_client_statemsgraph_webhook_resourcesmsgraph_webhook_allowed_cidrsresource	resourcescidrcidrsdingtalk_client_iddingtalk_client_secretdingtalk_homefeishu_app_idfeishu_app_secretfeishu_encrypt_keyfeishu_verification_tokenfeishu_homewecom_bot_idwecom_secretwecom_ws_url
wecom_homewecom_callback_corp_idwecom_callback_corp_secretweixin_tokenweixin_account_idrG   weixin_base_urlweixin_cdn_base_urlweixin_dm_policyweixin_group_policyweixin_allowed_usersweixin_group_allowed_usersweixin_split_multilineweixin_homebluebubbles_server_urlbluebubbles_passwordbluebubbles_require_mentionbluebubbles_mention_patternsparsed_patternspart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  rl   r?  rS  r   existing_cfgseed_for_probe	probe_cfgprobe_extrarH  rI  
configuredexcseedhomerelay_url_envrelay_url_yamlexisting_relayrelay_url_valrelay_configr  s   `                                                                                                                                                     r#   rM  rM  G  sO$   	8 	 	 YY34N*8+<+<= . ))$<bAGGI55F$4$442@2BFX../<O**+9II&=rBF$4$442@2BFX../!6!<!<S!AE
!A2RXXZBHHJ!AE
**+11.A II56M**f.>.>>;F&&!7@ii ABJd	<
**+8 II12M)(*:*:;,9934L((F,<,<<:E%% 6?ii @AIT	;
))*7 #:B?EEG446#3#331?1AFX--.;M))*8 yy!3R8>>@DXX#%99-?#D#J#J#LPd#d F,,,!!("3"34'"FN!FN	.<T.J**+II56M**f.>.>>;F&&!7@ii ABJd	<
**+8 !ii(HI99%BC#7""&*:*::8F8HFX445<@001900177>>60@
 	
 ))$;<HWFX445;;HE ii(CDL_FX445;;LI99%=>IYFX445;;IF "		*G H NcFX445;;NK		"?@N[FX445;;NK		"?@RUVcRd  !8!89??O 		"?@N[FX445;;NK!yy)EFMaFX445;;MJ))$ABx66&:J:JJAL,,'=vFii GHPD	B
001> ))-.K>>!1!11/=/?FX^^,7;FX^^,4!++HNN;L#'(:(:(>(>?RTY(Z#[ ''0D (,$ 2=(./0Jhnn(8(888C^^4b9ii >?G4	9
(5 ,-JYY/0Nn(9"""% ii(?HNNPThh$
 	
 ))12Kx&*:*::9D__5v>ii ?@HD	:
)6 yy!34#3R8NNOP,X-@-@A"2)7&ii 9:O8..&2B2BB=H((#96Bii CDL	>
,,-: 9923L		"5r:ryy!23 NNef(9".M,=L)ii 0"5-8M	*))$5r:.=M
+99%7<BBDJJL ZZ Ryy,b1779=QQ 	 -8L)/?M,99%7</?M,))./Kx&*:*::9D__2F;ii <=E	:
)6 <(J!!)9)997E7GFX334;?//089C//0699Z(DLFX334::5A ?+J		*+I,-J,-J
J	:z:;>>!1!11/=/?FX^^,37(0(..55!##7
 	
 /0Jhnn(8(888C^^4f=ii >?G4	9
(5 /0J<<v///-;-=FX\\*15&.13;NPR1S&.yy+,HHLLF$4$446A\\2F;ii <=E	7
&3 #7<BBDH\\YY/4N ii(A2Fii 12Oii 12O^f&6&664B4DFX0018<,,-5AOFX00177>"4K4Q4QRU4Vi4V&Z`ZfZfZhv||~4VGiNU  !4!45;;NKFI/FZ  !4!45;;FC BQFX00177? "		*A2 F H]FX00177E ii 126<<>BVVO99^,LYY/4N6#3#331?1AFX--.59))*2CF|CT  !1!1288@ AOFX--.44X> !ii(A2FLLN S 
 99%;<#%99-KR#P  "		*NPR S$&II.%! 	 ##v'7'77'$(##6+;+;;9G9IFX556"AEFX556>KN(L  !9!9:@@H
 (, X556<<^L % !: ? ? D DH>>#   D  
     !9!9:@@( ) :??DDD::< 

D  
     !9!9:@@*
 #78YY'?@4F$4$442@2BFX../6:**+3**+1188+3:
 	 		"9:?J!**%YY;VD))$EFN$	@FX../< IIo.M		"56*??&"2"220>0@FX__-48)1)//66#+ii:!yy)A;O	8
 	  YY';R@EWFX__-33MB$&II.I2$N!$LeFX__-334HIii 56=H!#YY96B))$CDL	>FX__-: 99^,L99^,L>>!1!11/=/?FX^^,37(0(..55""7
 	 yy!6;FRFX^^,22?CYY34
<G!"YY8&A))$BCKt	=FX^^,9  YY'?@!#+G!H"<""&*:*::8F8HFX445<@001900177>>-5		";R@YY5r: "		*KR PII3Y?148@
 	 99^,L		"56(??&"2"220>0@FX__-48)16BFX__-3  177"3E,))$5r:@@B / 6 6s ;E* ii(=rBHHJ$7$>$>s$CE.!99%7<BBDJJL!1E+ ii(=rBHHJPPR$7E.!!yy)?DJJL"6E,%'YY/KR%P%V%V%X"%(BE$%!#+Lb!Q!W!W!Y!0FE,-ii 5r:@@B=H!#YY96B))$CDL	>FX__-:  YY'?@99%;<"6v'7'775C5EFX1129=--.6--.44;;077<,II&@+N#$>EII&@BXY"$)),Lf"U"["["]au"u=
 	 ')ii0M&N#&2+1137QQ X112889JK (*yy1O'P$'"&**-I"J P_FX112889KLyy!;<H00F4D4DD>I))$:FCii DEM	?
--.; 		+&Iyy!34$>>!1!11/=/?FX^^,37(0  066'E(O%5E/"99%7<BBD"2E,99%=rBHHJ(8E$%))0"5;;=4))$5r:@@BK%#9 !!(+33J <G!YY89`RYYGWY_=`II<= yy!<=	=FX^^,9 YY/0PBII>O4PN#78,6#3#331?1AFX--.59))*2  !1!1288(h0l#34,E(O#34,E(OYY';<"4E,II&9:!2E+yy!78>I!))$YY:FC))$DEM	?FX--.; II&9:!2!8!8!:!@!@!BE+ "		*A B %:E/"!yy)?@$8$>$>$@$F$F$HE.!#%99-G#H #(@E$% 9934L	7:<7HF''4 /0J	25j/F''/,kB7?&557E~~' (
  

+H!++//9L "N&&2*%*%<%<%>N #<+?+?%%1$+ (3(4I#,#4#4,:,0*.y/D"*E-"	
 )7t(DI%nd; +/wy'2/N/TRT*UK(6(<(<(>1#$#6$, + 6 6q! < )? )7(,&1)I &*%*<*<Y*G%H
 &P!JJ
 !v///-;-=  *15FX&. .$/NN+ xx5  *0077=dD)dhhy.A>I!) #DO 4 &!1!;V<  $xx4  [ 12!%	?F$$X.;y 8d II126<<>MN%%))(..9N!^1155kBHbIOOQ!3^M'7*7*>*>s*C;'!++224!!"5t< 5UE
|  l j  &  D  H   != D DT3 O U UVY Z# Zzz| JJL Z# #T  		  		:  95::qI$ ! *LL=uzz1 &*N	*V % +T!JJ &+
+J  B=qAABs  ?Bm)Bm)3Bm. LBm>L-Bm>M03Bn S
3Bn X53Bn# Z)'Bn3\'Bn8GBn= ],Bp ^Bp/ ^9'Bs+ _!Bp?_1A Bs+ `2Bq7aBs+ aCBr1d!A-Bs+ fBs+ fABs+ g+Bs+ g>A+Bs+ m.	Bm;m:Bm;n	BnnBnn	Bn nBn n#	Bn0n/Bn0n=,Bpo)'BppBppBpp	Bp,p+Bp,p/	Bp<p;Bp<p?	Bq4q!Bq/q)Bs+ q/Bq4q4Bs+ q7	Br.r #Br)r#Bs+ r)Br.r.Bs+ r1	Bs(r:#Bs#sBs+ s#Bs(s(Bs+ s+	Bts4BttBt)T)r:   )rA   )r9  r  r   N)[r   r  r  r[  r   r  r}  pathlibr   dataclassesr   r   typingr   r   r   r	   r
   r   enumr   r  dotenvr   hermes_cli.configr   utilsr   r   r\  r   r4   r3   r$   r'   r+   r.   r/   r   r8   r?   rC   rI   r   rK   rL   r   r   rN   	frozenset__members__r  _BUILTIN_PLATFORM_VALUESr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r)   r^  ra  rh  bytesr  r  PathLiker  r  rN  rM  r   r%   r#   <module>r     s    	  	    ( ? ?     - *			8	$3 3d 3d 3 u  s S S ! !3 !8C= !Hs S c c C s  C E$PT*DU ( 26 # 5`t `J %$Th6J6J6Q6Q6S$TT  
 
 
D '
 '
 '
T <
 <
 <
H *-  ,*, "C , & # & ;
 ;
 ;
J)ROO )R '	)R
  )R OO@)R NN>)R LLC)R ))R &)R  )R  OO>!)R" NN=#)R$  %)R*  +)R0 NN 1)R6  7)R<  =)RL NN M)R d8X~6F6L-M#MN )X L L L`AJ A $$ $ $ $
 
 
,t $ 54< 6.c".3:383D.	#s(^.h -1d2;;s##d c"T)d 	dLW] WtB(Jj= j=4 j=r%   