+
    Ӄi                        R t ^ RIt^ RIt^ RIt^ RIHt ^ RIHtHt ^ RI	H
t
HtHtHt ^ RIHt ^ RIHt ^ RIHt ]P(                  ! ]4      tRR R	 lltRR
 R llt ! R R]4      t] ! R R4      4       t] ! R R4      4       t] ! R R4      4       t] ! R R4      4       t] ! R R4      4       tR R ltR R lt R# )z
Gateway configuration management.

Handles loading and validating configuration for:
- Connected platforms (Telegram, Discord, WhatsApp)
- Home channels for each platform
- Session reset policies
- Delivery preferences
N)Path)	dataclassfield)DictListOptionalAny)Enumget_hermes_home)is_truthy_valuec                <    V ^8  d   QhR\         R\        R\        /#    valuedefaultreturn)r   bool)formats   "+/home/ubuntu/hermes-agent/gateway/config.py__annotate__r      s!     3 3 3d 3d 3    c                    V f   V# \        V \        4      '       d3   V P                  4       P                  4       pVR9   d   R# VR9   d   R# V# \	        WR7      # )zDCoerce bool-ish config values, preserving a caller-provided default.TF)r   )true1yeson)false0nooff)
isinstancestrstriplowerr   )r   r   lowereds   && r   _coerce_boolr&      sU    }%++-%%'0011522r   c                <    V ^8  d   QhR\         R\        R\        /# r   )r   r"   )r   s   "r   r   r   '   s!      s S c r   c                    \        V \        4      '       d(   V P                  4       P                  4       pVR9   d   V# V# )z8Normalize unauthorized DM behavior to a supported value.>   pairignore)r!   r"   r#   r$   )r   r   
normalizeds   && r   #_normalize_unauthorized_dm_behaviorr,   '   s7    %[[]((*
++Nr   c                   Z    ] tR t^0tRtRtRtRtRtRt	Rt
RtR	tR
tRtRtRtRtRtRtRtRtR# )PlatformzSupported messaging platforms.localtelegramdiscordwhatsappslacksignal
mattermostmatrixhomeassistantemailsmsdingtalk
api_serverwebhookfeishuwecom N)__name__
__module____qualname____firstlineno____doc__LOCALTELEGRAMDISCORDWHATSAPPSLACKSIGNAL
MATTERMOSTMATRIXHOMEASSISTANTEMAILSMSDINGTALK
API_SERVERWEBHOOKFEISHUWECOM__static_attributes__r?   r   r   r.   r.   0   sU    (EHGHEFJF#ME
CHJGFEr   r.   c                   ^   a  ] tR t^Dt o RtV 3R lR lt]V 3R lR l4       tV 3R ltRt	V t
R# )	HomeChannelz
Default destination for a platform.

When a cron job specifies deliver="telegram" without a specific chat ID,
messages are sent to this home channel.
c                6   < V ^8  d   QhRS[ S[S[3,          /# r   r   r   r"   r   )r   __classdict__s   "r   r   HomeChannel.__annotate__P   s     
 
c3h 
r   c                b    R V P                   P                  RV P                  RV P                  /# platformchat_idname)r_   r   r`   ra   selfs   &r   to_dictHomeChannel.to_dictP   s-    ++t||DII
 	
r   c                :   < V ^8  d   QhRS[ S[S[3,          RR/# )r   datar   rW   rZ   )r   r[   s   "r   r   r\   X   s#     
 
T#s(^ 
 
r   c                x    V ! \        VR ,          4      \        VR,          4      VP                  RR4      R7      # )r_   r`   ra   Homer^   )r.   r"   getclsrg   s   &&r   	from_dictHomeChannel.from_dictW   s6    d:./Y(&&)
 	
r   c                >   < V ^8  d   Qh/ S[ ;R&   S[;R&   S[;R&   # )r   r_   r`   ra   )r.   r"   )r   r[   s   "r   r   r\   D   s*        L  I r   r?   N)r@   rA   rB   rC   rD   rd   classmethodrm   __annotate_func__rU   __classdictcell__r[   s   @r   rW   rW   D   s/     
 
 
 
)  r   rW   c                   r   a  ] tR t^`t o RtRt^tRtRtRt	V 3R lR lt
]V 3R lR l4       tV 3R	 ltR
tV tR# )SessionResetPolicya  
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  Tc                6   < V ^8  d   QhRS[ S[S[3,          /# rY   rZ   )r   r[   s   "r   r   SessionResetPolicy.__annotate__q        
 
c3h 
r   c                    R V P                   RV P                  RV P                  RV P                  R\	        V P
                  4      /# modeat_houridle_minutesnotifynotify_exclude_platforms)r}   r~   r   r   listr   rb   s   &r   rd   SessionResetPolicy.to_dictq   sB    DIIt||D--dkk&T-J-J(K
 	
r   c                :   < V ^8  d   QhRS[ S[S[3,          RR/# )r   rg   r   ru   rZ   )r   r[   s   "r   r   ry   {   s$     
 
T#s(^ 
0D 
r   c           	        VP                  R 4      pVP                  R4      pVP                  R4      pVP                  R4      pVP                  R4      pT ! Ve   TMRVe   TM^Ve   TMRVe   TMRVe   \        V4      R7      # R	R7      # )
r}   r~   r   r   r   rv   rw   Tr|   r;   r<   )rj   tuple)rl   rg   r}   r~   r   r   excludes   &&     r   rm   SessionResetPolicy.from_dictz   s     xx((9%xx/(#((56)v&2G)5)At#/6T7>7JU7^
 	

 Qj
 	
r   c                V   < V ^8  d   Qh/ S[ ;R&   S[;R&   S[;R&   S[;R&   S[;R&   # )r   r}   r~   r   r   r   )r"   intr   r   )r   r[   s   "r   r   ry   `   sF              $? r   r?   Nr   )r@   rA   rB   rC   rD   r}   r~   r   r   r   rd   rp   rm   rq   rU   rr   rs   s   @r   ru   ru   `   sK      DGLF&?
 
 
 
7  r   ru   c                      a  ] tR t^t o RtRtRtRtRtRt	]
! ]R7      tV 3R lR lt]V 3R lR	 l4       tV 3R
 ltRtV tR# )PlatformConfigz.Configuration for a single messaging platform.FNfirstdefault_factoryc                6   < V ^8  d   QhRS[ S[S[3,          /# rY   rZ   )r   r[   s   "r   r   PlatformConfig.__annotate__   s      c3h r   c                4   R V P                   RV P                  RV P                  /pV P                  '       d   V P                  VR&   V P                  '       d   V P                  VR&   V P
                  '       d   V P
                  P                  4       VR&   V# )enabledextrareply_to_modetokenapi_keyhome_channel)r   r   r   r   r   r   rd   )rc   results   & r   rd   PlatformConfig.to_dict   s    t||TZZT//

 :::"jjF7O<<< $F9%)%6%6%>%>%@F>"r   c                :   < V ^8  d   QhRS[ S[S[3,          RR/# )r   rg   r   r   rZ   )r   r[   s   "r   r   r      s$     
 
T#s(^ 
0@ 
r   c                   R pRV9   d   \         P                  VR,          4      pV ! VP                  RR4      VP                  R4      VP                  R4      VVP                  RR4      VP                  R/ 4      R	7      # )
Nr   r   Fr   r   r   r   r   )r   r   r   r   r   r   )rW   rm   rj   )rl   rg   r   s   && r   rm   PlatformConfig.from_dict   sv    T!&00n1EFLHHY.((7#HHY'%((?G<((7B'
 	
r   c                   < V ^8  d   Qh/ S[ ;R&   S[S[,          ;R&   S[S[,          ;R&   S[S[,          ;R&   S[;R&   S[S[S[3,          ;R&   # )r   r   r   r   r   r   r   )r   r   r"   rW   r   r   )r   r[   s   "r   r   r      sh        C=	 
 c]!  ;'.     S>7 r   r?   )r@   rA   rB   rC   rD   r   r   r   r   r   r   dictr   rd   rp   rm   rq   rU   rr   rs   s   @r   r   r      sU     8GE!G*.L !M "$7E  
 
A  r   r   c                   r   a  ] tR t^t o RtRtRtRt^(tRt	V 3R lR lt
]V 3R lR	 l4       tV 3R
 ltRtV tR# )StreamingConfigzCConfiguration for real-time token streaming to messaging platforms.Fedit333333?    ▉c                6   < V ^8  d   QhRS[ S[S[3,          /# rY   rZ   )r   r[   s   "r   r   StreamingConfig.__annotate__   rz   r   c           
     ~    R V P                   RV P                  RV P                  RV P                  RV P                  /# r   	transportedit_intervalbuffer_thresholdcursorr   rb   s   &r   rd   StreamingConfig.to_dict   s=    t||T// 5 5dkk
 	
r   c                :   < V ^8  d   QhRS[ S[S[3,          RR/# )r   rg   r   r   rZ   )r   r[   s   "r   r   r      s$     	
 	
T#s(^ 	
0A 	
r   c                    V'       g   V ! 4       # V ! VP                  R R4      VP                  RR4      \        VP                  RR4      4      \        VP                  R^(4      4      VP                  RR4      R	7      # )
r   Fr   r   r   r   r   r   r   r   )rj   floatr   rk   s   &&r   rm   StreamingConfig.from_dict   sj    5LHHY.hh{F3# >? *<b!AB88Hf-
 	
r   c                V   < V ^8  d   Qh/ S[ ;R&   S[;R&   S[;R&   S[;R&   S[;R&   # )r   r   r   r   r   r   )r   r"   r   r   )r   r[   s   "r   r   r      sF        	 
      r   r?   N)r@   rA   rB   rC   rD   r   r   r   r   r   rd   rp   rm   rq   rU   rr   rs   s   @r   r   r      sG     MGIMF
 
 	
 	
'  r   r   c                   V  a  ] tR t^t o Rt]! ]R7      t]! ]R7      t	]! ]R7      t
]! ]R7      t]! R R7      t]! ]R7      t]! R R7      tRtRtRtRtRt]! ]R7      tV 3R lR	 ltV 3R
 lR ltRV 3R lR lltV 3R lR lt]V 3R lR l4       tRV 3R lR lltV 3R ltRtV tR# )GatewayConfigzi
Main gateway configuration.

Manages all platform connections, session policies, and delivery settings.
r   c                 
    R R.# )/new/resetr?   r?   r   r   <lambda>GatewayConfig.<lambda>   s	    vx>Pr   c                 $    \        4       R ,          # )sessionsr
   r?   r   r   r   r      s    7H:7Ur   TFr)   c                0   < V ^8  d   QhRS[ S[,          /# rY   )r   r.   )r   r[   s   "r   r   GatewayConfig.__annotate__  s     ! !h !r   c                   . pV P                   P                  4        EF:  w  r#VP                  '       g   K  VP                  '       g   VP                  '       d   VP                  V4       KQ  V\        P                  8X  d   VP                  V4       Ky  V\        P                  8X  d5   VP                  P                  R4      '       d   VP                  V4       K  V\        P                  8X  d6   VP                  P                  R4      '       d   VP                  V4       EK  V\        P                  8X  d1   \        P                  ! R4      '       d   VP                  V4       EKQ  V\        P                  8X  d   VP                  V4       EKz  V\        P                   8X  d   VP                  V4       EK  V\        P"                  8X  d6   VP                  P                  R4      '       d   VP                  V4       EK  V\        P$                  8X  g   EK  VP                  P                  R4      '       g   EK)  VP                  V4       EK=  	  V# )z9Return list of platforms that are enabled and configured.http_urladdressTWILIO_ACCOUNT_SIDapp_idbot_id)	platformsitemsr   r   r   appendr.   rH   rJ   r   rj   rN   rO   osgetenvrQ   rR   rS   rT   )rc   	connectedr_   configs   &   r   get_connected_platforms%GatewayConfig.get_connected_platforms  s   	 $ 4 4 6H>>>|||v~~~  *X...  *X__,1A1A*1M1M  *X^^+0@0@0K0K  *X\\)bii8L.M.M  *X000  *X---  *X__,1A1A(1K1K  *X^^+0@0@0J0J  *; !7< r   c                6   < V ^8  d   QhRS[ RS[S[,          /# r   r_   r   )r.   r   rW   )r   r[   s   "r   r   r   $  s        h{6K r   c                d    V P                   P                  V4      pV'       d   VP                  # R# )z$Get the home channel for a platform.N)r   rj   r   )rc   r_   r   s   && r   get_home_channelGatewayConfig.get_home_channel$  s(    ##H-&&&r   Nc                L   < V ^8  d   QhRS[ S[,          RS[ S[,          RS[/# )r   r_   session_typer   )r   r.   r"   ru   )r   r[   s   "r   r   r   +  s2     ) )8$) sm) 
	)r   c                    V'       d$   WP                   9   d   V P                   V,          # V'       d$   W P                  9   d   V P                  V,          # V P                  # )zh
Get the appropriate reset policy for a session.

Priority: platform override > type override > default
)reset_by_platformreset_by_typedefault_reset_policy)rc   r_   r   s   &&&r   get_reset_policyGatewayConfig.get_reset_policy+  sP     $:$::))(33 L,>,>>%%l33(((r   c                6   < V ^8  d   QhRS[ S[S[3,          /# rY   rZ   )r   r[   s   "r   r   r   ?  s     
 
c3h 
r   c                   R V P                   P                  4        UUu/ uF   w  rVP                  VP                  4       bK"  	  uppRV P                  P                  4       RV P
                  P                  4        UUu/ uF  w  r4W4P                  4       bK  	  uppRV P                  P                  4        UUu/ uF   w  rVP                  VP                  4       bK"  	  uppRV P                  RV P                  R\        V P                  4      RV P                  RV P                  R	V P                  R
V P                  RV P                  RV P                   P                  4       /# u uppi u uppi u uppi r   r   r   r   reset_triggersquick_commandssessions_diralways_log_localstt_enabledgroup_sessions_per_userthread_sessions_per_userunauthorized_dm_behavior	streaming)r   r   r   rd   r   r   r   r   r   r"   r   r   r   r   r   r   r   )rc   pckvs   &    r   rd   GatewayConfig.to_dict?  sL   151E1E1G1G$1G #D$=$=$E$E$G+/+=+=+C+C+E+E4199;+E  151G1G1M1M1O"1O$1O" d11d11C 1 12 5 54++%t'C'C&(E(E&(E(E//1'
 	
"s   &E* E0<&E6c                :   < V ^8  d   QhRS[ S[S[3,          RR/# )r   rg   r   r   rZ   )r   r[   s   "r   r   r   W  s#     :
 :
T#s(^ :
 :
r   c                0   / pVP                  R / 4      P                  4        F(  w  r4 \        V4      p\        P	                  V4      W%&   K*  	  / pVP                  R/ 4      P                  4        F  w  rx\        P	                  V4      Wg&   K  	  / p	VP                  R/ 4      P                  4        F(  w  r8 \        V4      p\        P	                  V4      W&   K*  	  \        4       p
RV9   d   \        P	                  VR,          4      p
\        4       R,          pRV9   d   \        VR,          4      pVP                  R/ 4      p\        V\        4      '       g   / pVP                  R4      pVfI   \        VP                  R	4      \        4      '       d"   VP                  R	/ 4      P                  R
4      MRpVP                  R4      pVP                  R4      p\        VP                  R4      R4      pV ! VV
VV	VP                  RRR.4      VVVP                  RR4      \        VR4      \        VR4      \        VR4      V\        P	                  VP                  R/ 4      4      R7      #   \
         d     EK^  i ; i  \
         d     EK  i ; i)r   r   r   r   r   r   r   r   Nsttr   r   r   r   r)   r   r   r   r   TFr   r   )rj   r   r.   r   rm   
ValueErrorru   r   r   r!   r   r,   r&   r   )rl   rg   r   platform_nameplatform_datar_   r   	type_namepolicy_datar   default_policyr   r   r   r   r   r   s   &&               r   rm   GatewayConfig.from_dictV  so   	,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@a$((5"-11)<gkK"&((+D"E#'88,F#G #FHH/0$
 
 !/'/88$4vx6HI)%!XX&8$?$[$7$01H$$O%12JE%R%=%//b0IJ
 	
M    s#   "I29"J2JJJJc                6   < V ^8  d   QhRS[ S[,          RS[/# r   )r   r.   r"   )r   r[   s   "r   r   r     s!     	- 	-Xh5G 	-SV 	-r   c                    V'       dd   V P                   P                  V4      pV'       dA   RVP                  9   d0   \        VP                  P                  R4      V P                  4      # V P                  # )z=Return the effective unauthorized-DM behavior for a platform.r   )r   rj   r   r,   r   )rc   r_   platform_cfgs   && r   get_unauthorized_dm_behavior*GatewayConfig.get_unauthorized_dm_behavior  sc    >>--h7L :l>P>P P: &&**+EF11  ,,,r   c                  < V ^8  d   Qh/ S[ S[S[3,          ;R&   S[;R&   S[ S[S[3,          ;R&   S[ S[S[3,          ;R&   S[S[,          ;R&   S[ S[S[3,          ;R&   S[;R&   S[;R&   S[;R	&   S[;R
&   S[;R&   S[;R&   S[	;R&   # )r   r   r   r   r   r   r   r   r   r   r   r   r   r   )
r   r.   r   ru   r"   r   r   r   r   r   )r   r[   s   "r   r   r      s      Hn,-K  -X  //0N  H&889W   IQ! & cN@' , V- 2 !3 8 9 > "(? @ #*A F "*G L GM r   r?   )NNN) r@   rA   rB   rC   rD   r   r   r   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rd   rp   rm   r   rq   rU   rr   rs   s   @r   r   r      s      16d0KI 05EW/X383NM<ARV<W !&6P QN &+4%@N /UVL " K %)%* %+ "'!GI! !F ) )(
 
. :
 :
x	- 	-u  r   r   c                $    V ^8  d   QhR\         /# rY   r   )r   s   "r   r   r     s     i i] ir   c            
     f   \        4       p / pV R,          pVP                  4       '       dW    \        VRRR7      ;_uu_ 4       p\        P                  ! V4      ;'       g    / pRRR4       \
        P                  RV4        ^ RI	pV R,          pVP                  4       '       E	dQ   \        VRR7      ;_uu_ 4       pVP                  V4      ;'       g    / pRRR4       XP                  R	4      pV'       d   \        V\        4      '       d   WR
&   VP                  R4      p	V	eE   \        V	\        4      '       d   WR&   M)\
        P                  R\        V	4      P                  4       VP                  R4      p
\        V
\        4      '       d   WR&   RV9   d   VR,          VR&   RV9   d   VR,          VR&   VP                  R4      p\        V\        4      '       d   WR&   RV9   d   VR,          VR&   RV9   d   VR,          VR&   RV9   d   \!        VP                  R4      R4      VR&   VP                  R4      pVP#                  R/ 4      p\        V\        4      '       g   / pWR&   \        V\        4      '       d   VP%                  4        F  w  r\        V\        4      '       g   K  VP                  V/ 4      p\        V\        4      '       g   / p/ VP                  R/ 4      CVP                  R/ 4      Cp/ VCVCpV'       d   VVR&   VW&   K  	  WR&   \&         EFK  pV\&        P(                  8X  d   K  VP                  VP*                  4      p\        V\        4      '       g   KN  / pRV9   d/   \!        VP                  R4      VP                  RR4      4      VR&   RV9   d   VR,          VR&   RV9   d   VR,          VR&   RV9   d   VR,          VR&   V'       g   K  VP#                  VP*                  / 4      p\        V\        4      '       g   / pVVVP*                  &   VP#                  R/ 4      p\        V\        4      '       g   / pVVR&   VP-                  V4       EKN  	  VP                  R/ 4      p\        V\        4      '       Edx   RV9   dN   \.        P0                  ! R4      '       g2   \3        VR,          4      P5                  4       \.        P6                  R&   VP                  R4      pVeg   \.        P0                  ! R4      '       gK   \        V\8        4      '       d   RP;                  R V 4       4      p\3        V4      \.        P6                  R&   R V9   dN   \.        P0                  ! R!4      '       g2   \3        VR ,          4      P5                  4       \.        P6                  R!&   R"V9   dN   \.        P0                  ! R#4      '       g2   \3        VR",          4      P5                  4       \.        P6                  R#&   VP                  R$/ 4      p\        V\        4      '       Ed    RV9   dN   \.        P0                  ! R%4      '       g2   \3        VR,          4      P5                  4       \.        P6                  R%&   RV9   dJ   \.        P0                  ! R&4      '       g.   ^ RIpVP=                  VR,          4      \.        P6                  R&&   VP                  R'4      pVeg   \.        P0                  ! R(4      '       gK   \        V\8        4      '       d   RP;                  R) V 4       4      p\3        V4      \.        P6                  R(&   VP                  R*/ 4      p\        V\        4      '       Ed!   RV9   dN   \.        P0                  ! R+4      '       g2   \3        VR,          4      P5                  4       \.        P6                  R+&   RV9   dK   \.        P0                  ! R,4      '       g/   \        P<                  ! VR,          4      \.        P6                  R,&   VP                  R'4      pVeg   \.        P0                  ! R-4      '       gK   \        V\8        4      '       d   RP;                  R. V 4       4      p\3        V4      \.        P6                  R-&   VP                  R// 4      p\        V\        4      '       Ed$   RV9   dN   \.        P0                  ! R04      '       g2   \3        VR,          4      P5                  4       \.        P6                  R0&   VP                  R14      pVeg   \.        P0                  ! R24      '       gK   \        V\8        4      '       d   RP;                  R3 V 4       4      p\3        V4      \.        P6                  R2&   R V9   dN   \.        P0                  ! R44      '       g2   \3        VR ,          4      P5                  4       \.        P6                  R4&   \>        PA                  T4      p\C        T4       TPD                  p^ TPF                  u;8:  d   ^8:  g*   M \
        P                  R6TPF                  4       ^Tn#        TPH                  e   TPH                  ^ 8:  d(   \
        P                  R7TPH                  4       R8Tn$        \&        PJ                  R9\&        PL                  R:\&        PN                  R;\&        PP                  R<\&        PR                  R=/p TPT                  P%                  4        F  w  p!p"T"PV                  '       g   K  T P                  T!4      p#T#'       g   K5  T"PX                  f   KE  T"PX                  P[                  4       '       d   Kg  \
        P                  R>T!P*                  T#4       K  	  T#   + '       g   i     ELJ; i  \         d"   p\
        P                  RY$4        Rp?EL^Rp?ii ; i  + '       g   i     EL; i  \         d*   p\
        P                  R5T R,          T4        Rp?EL4Rp?ii ; i)?u  
Load gateway configuration from multiple sources.

Priority (highest to lowest):
1. Environment variables
2. ~/.hermes/config.yaml (primary user-facing config)
3. ~/.hermes/gateway.json (legacy — provides defaults under config.yaml)
4. Built-in defaults
zgateway.jsonrzutf-8)encodingNu<   Loaded legacy %s — consider moving settings to config.yamlzFailed to load %s: %szconfig.yamlsession_resetr   r   zIIgnoring invalid quick_commands in config.yaml (expected mapping, got %s)r   r   r   r   r   r   r   r)   r   r   reply_prefixrequire_mentionmention_patternsr1   DISCORD_REQUIRE_MENTIONfree_response_channelsDISCORD_FREE_RESPONSE_CHANNELS,c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r"   .0r   s   & r   	<genexpr>&load_gateway_config.<locals>.<genexpr>)       &;s!s1vvs   auto_threadDISCORD_AUTO_THREAD	reactionsDISCORD_REACTIONSr0   TELEGRAM_REQUIRE_MENTIONTELEGRAM_MENTION_PATTERNSfree_response_chatsTELEGRAM_FREE_RESPONSE_CHATSc              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r  r  s   & r   r  r  ;  r  r  r2   WHATSAPP_REQUIRE_MENTIONWHATSAPP_MENTION_PATTERNSWHATSAPP_FREE_RESPONSE_CHATSc              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r  r  s   & r   r  r  G  r  r  r6   MATRIX_REQUIRE_MENTIONfree_response_roomsMATRIX_FREE_RESPONSE_ROOMSc              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r  r  s   & r   r  r  R  r  r  MATRIX_AUTO_THREADus   Failed to process config.yaml — falling back to .env / gateway.json values. Check %s for syntax errors. Error: %sz3Invalid at_hour=%s (must be 0-23). Using default 4.z?Invalid idle_minutes=%s (must be positive). Using default 1440.rw   TELEGRAM_BOT_TOKENDISCORD_BOT_TOKENSLACK_BOT_TOKENMATTERMOST_TOKENMATRIX_ACCESS_TOKENzG%s is enabled but %s is empty. The adapter will likely fail to connect.).r   existsopenjsonloadloggerinfo	Exceptionwarningyaml	safe_loadrj   r!   r   typer@   r,   
setdefaultr   r.   rE   r   updater   r   r"   r$   environr   joindumpsr   rm   _apply_env_overridesr   r~   r   rF   rG   rI   rK   rL   r   r   r   r#   )$_homegw_datagateway_json_pathfer1  config_yaml_pathyaml_cfgsrqcstt_cfgstreaming_cfgyaml_platformsplatforms_data	plat_name
plat_blockexistingmerged_extramergedplatr   bridged	plat_datar   discord_cfgfrctelegram_cfg_jsonwhatsapp_cfg
matrix_cfgr   policy_token_env_namesr_   pconfigenv_names$                                       r   load_gateway_configrY    s	    EG .!!	J'w??1))A,,," @KKN!b
 =0""$$&99Q>>!,22 :
 o.BjT**24././B~b$''02,-NN5R)) ll5)G'4((!((H45=>W5X12)X56>?Y6Z23$LL5M-..'4$8+,45E,F()!X-.67I.J*+)X56YLL!;<723 &\\+6N$//R@Nnd33!#'5$.$//-;-A-A-C)I%j$77 -11)R@H%h55#%#_hll7B&?#_:>>RY[]C^#_L77J7F#*6w06N- .D (6$ 8>>)'||DJJ7!,55-=:]$(()CD$>G;G67 "\1.:>.JGN+$41=>O1PG-.%52>?Q2RG./*55djj"E	!)T22 "I1:N4::.!,,Wb9!%..E).Ig&W%; !@ #,,y"5K+t,,$3BIIF_<`<`<?L]@^<_<e<e<gBJJ89!oo&>??2995U+V+V!#t,,!hh&;s&;;CFs8BJJ?@ K/		BW8X8X8;K<V8W8]8]8_BJJ45+-bii@S6T6T69+k:R6S6Y6Y6[BJJ23 $<<
B7L,--$4RYYGa=b=b=@N_A`=a=g=g=iBJJ9:%5biiHc>d>d(>Ckk,WiJj>kBJJ:;"&&'<=?2995S+T+T!#t,,!hh&;s&;;ADSBJJ=>#<<
B7L,--$4RYYGa=b=b=@N_A`=a=g=g=iBJJ9:%5biiHc>d>d>BjjVhIi>jBJJ:;"&&'<=?2995S+T+T!#t,,!hh&;s&;;ADSBJJ=> "h3J*d++$
2299E];^;^;>zJ[?\;];c;c;eBJJ78 nn%:;?2995Q+R+R!#t,,!hh&;s&;;?B3xBJJ;< J.ryyAU7V7V7::m;T7U7[7[7]BJJ34 $$W-F   ((F%2%A6>>	
 "f&9&9Q&>M	
 #
 	/-)/. $--335'#''181'--:M:M:O:ONN; 6 Mo @??  	JNN24EII	J :99p  
4M!		
 	

s   n9 !n%$n9 #o< 'o< <o( o< 9Ho< Co< 0Co< A!o< (A,o< Ao< )A<o< &Ao< :Ao< Bo< .Ao< Ao< !Bo< 7A!o< A,o< 1o< %n6	0	n9 9o%o  o%(o9	3	o< <p0p++p0c                (    V ^8  d   QhR\         RR/# )r   r   r   Nr   )r   s   "r   r   r     s     d d d4 dr   c                /   \         P                  ! R4      pV'       d   \        P                  V P                  9  d&   \        4       V P                  \        P                  &   RV P                  \        P                  ,          n        WP                  \        P                  ,          n        \         P                  ! RR4      P                  4       pVRf9   dj   \        P                  V P                  9  d&   \        4       V P                  \        P                  &   W P                  \        P                  ,          n	        \         P                  ! RR4      pV'       d   \        P                  V P                  9  d&   \        4       V P                  \        P                  &   VP                  R4       Uu. uF*  qDP                  4       '       g   K  VP                  4       NK,  	  upV P                  \        P                  ,          P                  R&   \         P                  ! R4      pV'       du   \        P                  V P                  9   dV   \        \        P                  V\         P                  ! R	R
4      R7      V P                  \        P                  ,          n        \         P                  ! R4      pV'       d   \        P                  V P                  9  d&   \        4       V P                  \        P                  &   RV P                  \        P                  ,          n        W`P                  \        P                  ,          n        \         P                  ! R4      pV'       du   \        P                  V P                  9   dV   \        \        P                  V\         P                  ! RR
4      R7      V P                  \        P                  ,          n        \         P                  ! RR4      P                  4       Rg9   pV'       dk   \        P                   V P                  9  d&   \        4       V P                  \        P                   &   RV P                  \        P                   ,          n        \         P                  ! R4      p	V	'       d   \        P"                  V P                  9  d&   \        4       V P                  \        P"                  &   RV P                  \        P"                  ,          n        WP                  \        P"                  ,          n        \         P                  ! R4      p
V
'       du   \        P"                  V P                  9   dV   \        \        P"                  V
\         P                  ! RR4      R7      V P                  \        P"                  ,          n        \         P                  ! R4      p\         P                  ! R4      pV'       d   V'       d   \        P$                  V P                  9  d&   \        4       V P                  \        P$                  &   RV P                  \        P$                  ,          n        V P                  \        P$                  ,          P                  P'                  RVRVR\         P                  ! RR4      P                  4       Rg9   /4       \         P                  ! R4      pV'       du   \        P$                  V P                  9   dV   \        \        P$                  V\         P                  ! RR
4      R7      V P                  \        P$                  ,          n        \         P                  ! R4      pV'       d   \         P                  ! RR4      pV'       g   \(        P+                  R4       \        P,                  V P                  9  d&   \        4       V P                  \        P,                  &   RV P                  \        P,                  ,          n        WP                  \        P,                  ,          n        WP                  \        P,                  ,          P                  R&   \         P                  ! R 4      pV'       du   \        P,                  V P                  9   dV   \        \        P,                  V\         P                  ! R!R
4      R7      V P                  \        P,                  ,          n        \         P                  ! R"4      p\         P                  ! R#R4      pV'       g   \         P                  ! R$4      '       Ed!   V'       g   \(        P+                  R%4       \        P.                  V P                  9  d&   \        4       V P                  \        P.                  &   RV P                  \        P.                  ,          n        V'       d'   VV P                  \        P.                  ,          n        VV P                  \        P.                  ,          P                  R&&   \         P                  ! R'R4      pV'       d/   VV P                  \        P.                  ,          P                  R(&   \         P                  ! R$R4      pV'       d/   VV P                  \        P.                  ,          P                  R)&   \         P                  ! R*R4      P                  4       Rg9   pVV P                  \        P.                  ,          P                  R+&   \         P                  ! R,R4      pV'       d/   VV P                  \        P.                  ,          P                  R-&   \         P                  ! R.4      pV'       du   \        P.                  V P                  9   dV   \        \        P.                  V\         P                  ! R/R
4      R7      V P                  \        P.                  ,          n        \         P                  ! R04      pV'       d   \        P0                  V P                  9  d&   \        4       V P                  \        P0                  &   RV P                  \        P0                  ,          n        VV P                  \        P0                  ,          n        \         P                  ! R14      pV'       d/   VV P                  \        P0                  ,          P                  R&   \         P                  ! R24      p\         P                  ! R34      p\         P                  ! R44      p\         P                  ! R54      p\3        VVVV.4      '       d   \        P4                  V P                  9  d&   \        4       V P                  \        P4                  &   RV P                  \        P4                  ,          n        V P                  \        P4                  ,          P                  P'                  R6VR7VR8V/4       \         P                  ! R94      pV'       du   \        P4                  V P                  9   dV   \        \        P4                  V\         P                  ! R:R
4      R7      V P                  \        P4                  ,          n        \         P                  ! R;4      pV'       d   \        P6                  V P                  9  d&   \        4       V P                  \        P6                  &   RV P                  \        P6                  ,          n        \         P                  ! R<R4      V P                  \        P6                  ,          n        \         P                  ! R=4      p V '       du   \        P6                  V P                  9   dV   \        \        P6                  V \         P                  ! R>R
4      R7      V P                  \        P6                  ,          n        \         P                  ! R?R4      P                  4       Rg9   p!\         P                  ! R@R4      p"\         P                  ! RAR4      p#\         P                  ! RB4      p$\         P                  ! RC4      p%V!'       g
   V"'       Ed   \        P:                  V P                  9  d&   \        4       V P                  \        P:                  &   RV P                  \        P:                  ,          n        V"'       d/   V"V P                  \        P:                  ,          P                  RD&   V#'       d}   V#P                  R4       U&u. uF+  p&V&P                  4       '       g   K  V&P                  4       NK-  	  p'p&V''       d/   V'V P                  \        P:                  ,          P                  RE&   V$'       d9    \=        V$4      V P                  \        P:                  ,          P                  RF&   V%'       d/   V%V P                  \        P:                  ,          P                  RG&   \         P                  ! RHR4      P                  4       Rg9   p(\         P                  ! RI4      p)\         P                  ! RJR4      p*V('       d   \        P@                  V P                  9  d&   \        4       V P                  \        P@                  &   RV P                  \        P@                  ,          n        V)'       d9    \=        V)4      V P                  \        P@                  ,          P                  RF&   V*'       d/   V*V P                  \        P@                  ,          P                  RK&   \         P                  ! RL4      p+\         P                  ! RM4      p,V+'       Ed   V,'       Ed   \        PB                  V P                  9  d&   \        4       V P                  \        PB                  &   RV P                  \        PB                  ,          n        V P                  \        PB                  ,          P                  P'                  RNV+ROV,RP\         P                  ! RQRR4      RS\         P                  ! RTRU4      /4       \         P                  ! RVR4      p-V-'       d/   V-V P                  \        PB                  ,          P                  RW&   \         P                  ! RXR4      p.V.'       d/   V.V P                  \        PB                  ,          P                  RY&   \         P                  ! RZ4      p/V/'       dV   \        \        PB                  V/\         P                  ! R[R
4      R7      V P                  \        PB                  ,          n        \         P                  ! R\4      p0\         P                  ! R]4      p1V0'       Edr   V1'       Edi   \        PD                  V P                  9  d&   \        4       V P                  \        PD                  &   RV P                  \        PD                  ,          n        V P                  \        PD                  ,          P                  P'                  R^V0RKV1/4       \         P                  ! R_R4      p2V2'       d/   V2V P                  \        PD                  ,          P                  R`&   \         P                  ! Ra4      p3V3'       dV   \        \        PD                  V3\         P                  ! RbR
4      R7      V P                  \        PD                  ,          n        \         P                  ! Rc4      p4V4'       d    \=        V44      V PF                  n$        \         P                  ! Rd4      p5V5'       d    \=        V54      V PF                  n%        Re# Re# u upi u up&i   \>         d     ELi ; i  \>         d     ELi ; i  \>         d     Lxi ; i  \>         d     Re# i ; i)hz/Apply environment variable overrides to config.r$  TTELEGRAM_REPLY_TO_MODE TELEGRAM_FALLBACK_IPSr	  fallback_ipsTELEGRAM_HOME_CHANNELTELEGRAM_HOME_CHANNEL_NAMEri   r^   r%  DISCORD_HOME_CHANNELDISCORD_HOME_CHANNEL_NAMEWHATSAPP_ENABLEDr   r&  SLACK_HOME_CHANNELSLACK_HOME_CHANNEL_NAMESIGNAL_HTTP_URLSIGNAL_ACCOUNTr   accountignore_storiesSIGNAL_IGNORE_STORIESSIGNAL_HOME_CHANNELSIGNAL_HOME_CHANNEL_NAMEr'  MATTERMOST_URLz2MATTERMOST_TOKEN set but MATTERMOST_URL is missingurlMATTERMOST_HOME_CHANNELMATTERMOST_HOME_CHANNEL_NAMEr(  MATRIX_HOMESERVERMATRIX_PASSWORDzHMATRIX_ACCESS_TOKEN/MATRIX_PASSWORD set but MATRIX_HOMESERVER is missing
homeserverMATRIX_USER_IDuser_idpasswordMATRIX_ENCRYPTION
encryptionMATRIX_DEVICE_ID	device_idMATRIX_HOME_ROOMMATRIX_HOME_ROOM_NAME
HASS_TOKENHASS_URLEMAIL_ADDRESSEMAIL_PASSWORDEMAIL_IMAP_HOSTEMAIL_SMTP_HOSTr   	imap_host	smtp_hostEMAIL_HOME_ADDRESSEMAIL_HOME_ADDRESS_NAMEr   TWILIO_AUTH_TOKENSMS_HOME_CHANNELSMS_HOME_CHANNEL_NAMEAPI_SERVER_ENABLEDAPI_SERVER_KEYAPI_SERVER_CORS_ORIGINSAPI_SERVER_PORTAPI_SERVER_HOSTkeycors_originsporthostWEBHOOK_ENABLEDWEBHOOK_PORTWEBHOOK_SECRETsecretFEISHU_APP_IDFEISHU_APP_SECRETr   
app_secretdomainFEISHU_DOMAINr=   connection_modeFEISHU_CONNECTION_MODE	websocketFEISHU_ENCRYPT_KEYencrypt_keyFEISHU_VERIFICATION_TOKENverification_tokenFEISHU_HOME_CHANNELFEISHU_HOME_CHANNEL_NAMEWECOM_BOT_IDWECOM_SECRETr   WECOM_WEBSOCKET_URLwebsocket_urlWECOM_HOME_CHANNELWECOM_HOME_CHANNEL_NAMESESSION_IDLE_MINUTESSESSION_RESET_HOURN)r    r   all)r   r   r   )&r   r   r.   rF   r   r   r   r   r$   r   splitr#   r   rW   r   rG   rH   rI   rJ   r5  r-  r0  rK   rL   rM   r  rN   rO   r   rQ   r   r   rR   rS   rT   r   r   r~   )6r   telegram_tokentelegram_reply_modetelegram_fallback_ipsiptelegram_homediscord_tokendiscord_homewhatsapp_enabledslack_token
slack_home
signal_urlsignal_accountsignal_homemattermost_tokenmattermost_urlmattermost_homematrix_tokenmatrix_homeservermatrix_usermatrix_passwordmatrix_e2eematrix_device_idmatrix_home
hass_tokenhass_url
email_addr	email_pwd
email_imap
email_smtp
email_home
twilio_sidsms_homeapi_server_enabledapi_server_keyapi_server_cors_originsapi_server_portapi_server_hostoriginoriginswebhook_enabledwebhook_portwebhook_secretfeishu_app_idfeishu_app_secretfeishu_encrypt_keyfeishu_verification_tokenfeishu_homewecom_bot_idwecom_secretwecom_ws_url
wecom_homer   
reset_hours6   &                                                     r   r9  r9    s    YY34NF$4$442@2BFX../6:**+34B**+1 ))$<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
!A2XXZJBHHJ!AE
**+11.A II56M**f.>.>>;F&&!7@<
**+8 II12M6#3#331?1AFX--.59))*23@))*09934L((F,<,<<:E%% 6?;
))*7 yy!3R8>>@DXXF$4$442@2BFX../6:**+3 ))-.K>>!1!11/=/?FX^^,37(01<(./0Jhnn(8(888C^^4b99
(5 ,-JYY/0Nn??&"2"220>0@FX__-48)1)//66
~bii(?HNNPThh8
 	
 ))12Kx&*:*::9D__5v>:
)6 yy!34#3R8NNOPf&6&664B4DFX0018<,,-56F,,-3=K,,-33E:ii 9:O8..&2B2BB=H((#96B>
,,-: 9923L		"5r:ryy!233 NNef??&"2"220>0@FX__-48)16BFX__-3@Q)//=ii 0"5ALFX__-33I>))$5r:BQFX__-33J?ii 3R8>>@DXX@K)//=99%7<CSFX__-33K@))./Kx&*:*::9D__2F;:
)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z7
 	
 /0Jhnn(8(888C^^4f=9
(5 /0J<<v///-;-=FX\\*15&.13;NPR1S&.yy+,HHLLF$4$446A\\2F;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`ZfZfZh~v||~4VGiNU  !4!45;;NKFI/FZ  !4!45;;FC BQFX00177? 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> IIo.M		"56}**??&"2"220>0@FX__-48)1)//66m+bii:ryy)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>FX__-: 99^,L99^,L|>>!1!11/=/?FX^^,37(0(..55ll7
 	 yy!6;FRFX^^,22?CYY34
<G!"YY8&A=FX^^,9 9934L	7:<7HF''4 /0J	25j/F''/ UE
j j     v  		  		s~   9A^#A^#E
A^(E'A^(F<7A^- K97A^? ]A_ ^A_" ^-A^<^;A^<^?A__A__A__A__"A_1_0A_1)T)r)   )!rD   loggingr   r+  pathlibr   dataclassesr   r   typingr   r   r   r   enumr	   hermes_cli.configr   utilsr   	getLoggerr@   r-  r&   r,   r.   rW   ru   r   r   r   rY  r9  r?   r   r   <module>r     s     	   ( , ,  - !			8	$3t ( 
 
 
6 '
 '
 '
T +
 +
 +
\ 
 
 
< B- B- B-JiXdr   