
    .cjG                       U d Z ddlZddlZddlZddlmZ ddlmZmZm	Z	m
Z
 ddlmZmZmZmZmZ ddlmZ ddlmZ ddlmZmZ dd	lmZ  ej        e          Zd[dededefdZ e h d          Z! e h d          Z"d\dZ#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*dZ+	 d]dede$de(fdZ,dedee$ef         fdZ-d^dede$de$fdZ.d_dede$de$fdZ/d e0d!e$de1e0e0f         fd"Z2d`d!e$dee$         dee$         fd#Z3dad!e$de$de$fd%Z4d!e$de(de(fd&Z5da6ee7         e8d'<    G d( d)e          Z9 e d* e9j:        ;                                D                       Z< e h d+          Z=d,d-iZ>e0e$e$f         e8d.<   d`d/e$d0ee0         defd1Z?e G d2 d3                      Z@e G d4 d5                      ZAe G d6 d7                      ZBe9jC        d8e9jD        d9e9jE        d:e9jF        d;e9jG        d<e9jH        d=iZIe0d)e$f         e8d><   e G d? d@                      ZJdAZKe&e8dB<   dCZLe(e8dD<   dEZMe$e8dF<   e G dG dH                      ZNdeOdefdIZPe9jH        dJ e9jQ        dK e9jR        dL e9jS        dM e9jT        dN e9jU        dO e9jV        dP e9jW        dQ e9jX        dR e9jY        dS i
ZZe0e9eeJgef         f         e8dT<   e G dU dV                      Z[de[fdWZ\dbdYZ]dXe[ddfdZZ^dS )cz
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)asdict	dataclassfieldis_dataclass)DictListOptionalAnyCallable)Enumget_hermes_home)current_secret_scope
get_secret)is_truthy_valueTvaluedefaultreturnc                     | |S t          | t                    r4|                                                                 }|dv rdS |dv rdS |S t	          | |          S )zDCoerce bool-ish config values, preserving a caller-provided default.N>   1onyestrueT>   0noofffalseF)r   )
isinstancestrstriplowerr   )r   r   lowereds      0/home/ice/.hermes/hermes-agent/gateway/config.py_coerce_boolr%      sq    }% ++--%%''000411155'2222    >   r   r   r   r   >   r   r   r   r   bool | Nonec                  8   t          j        d          } | dS |                                                                 }|sdS |t          v rdS |t
          v rdS t                              d| t          t                    t          t
                               dS )u  Resolve the GATEWAY_MULTIPLEX_PROFILES operator override.

    Returns ``True``/``False`` when the env var is set to a recognized truthy/
    falsy token, or ``None`` when it is unset, blank, or unrecognized — in which
    case the caller keeps the config.yaml value (env > config > default). Blank
    is deliberately ``None``, not ``False``: a provisioned-but-unpopulated Fly
    secret arrives as ``""`` and must NOT shadow a config.yaml opt-in.
    GATEWAY_MULTIPLEX_PROFILESNTFzlIgnoring unrecognized GATEWAY_MULTIPLEX_PROFILES=%r (expected one of %s or %s); falling back to config.yaml.)	osgetenvr!   r"   _MULTIPLEX_TRUTHY_STRINGS_MULTIPLEX_FALSY_STRINGSloggerwarningsorted)rawtokens     r$    _env_multiplex_profiles_overrider3   0   s     )0
1
1C
{tIIKKE t)))t(((u
NN	C())'((   4r&   c                     | dS t          | t                    r| rdndS t          |                                                                           pdS )a  Normalize a streaming transport/mode value to a canonical token.

    Handles the YAML 1.1 boolean quirk where bare ``on`` / ``off`` parse to
    Python ``True`` / ``False`` (see ``gateway/display_config.py`` ``_normalise``).
    Without this, ``mode: off`` arrives as boolean ``False`` and stringifying it
    yields ``"false"`` instead of the advertised ``"off"``, so streaming would be
    enabled instead of disabled. Booleans map to ``"auto"`` (True) / ``"off"``
    (False); anything else is lower-cased, defaulting to ``"auto"``.
    Nautor   )r   boolr    r!   r"   r   s    r$   _normalize_transport_tokenr8   M   sX     }v% *)vvE)u::##%%//r&   c                 \    | |S 	 t          |           S # t          t          f$ r |cY S w xY w)z>Coerce numeric config values, falling back on malformed input.)float	TypeError
ValueErrorr   r   s     r$   _coerce_floatr>   ^   sF    }U||z"       ++c                 \    | |S 	 t          |           S # t          t          f$ r |cY S w xY w)z>Coerce integer config values, falling back on malformed input.)intr;   r<   r=   s     r$   _coerce_intrB   h   sF    }5zzz"   r?   keyc                    | dS t          | t                    rt                              d||            dS 	 t          | t                    r3|                                 st          |           t          |           }nGt          | t                    r#t          | 	                                d          }nt          |           }n4# t          t          f$ r  t                              d||            Y dS w xY w|dk    rdS |S )zCoerce an optional positive integer config value.

    ``None``/0/negative disable the setting. Malformed values are ignored with
    a warning so a typo never prevents the gateway from starting.
    NzEIgnoring invalid %s=%r (expected a positive integer; 0/null disables)
   r   )r   r6   r.   r/   r:   
is_integerr<   rA   r    r!   r;   )r   rC   parseds      r$   _coerce_optional_positive_intrH   r   s     }t% S	
 	
 	

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

 tt {{tMs   BC	 	-C:9C:i gateway.systemd_watchdog_secondsc                    | dS t          | t                    rt                              d|           dS t          | t                    r| }nt          | t
                    r|                                 }|r(|                                r|                                st                              d|           dS 	 t	          |d          }nV# t          t          t          f$ r t                              d|           Y dS w xY wt                              d|           dS |dk    rdS d|cxk     rt          k    s%n t                              d|t                     dS |S )zReturn a bounded positive watchdog interval or zero when disabled.

    Runtime and service generation share this normalization so a value can
    never enable ``Type=notify`` while disabling application heartbeats.
    Nr   z1Ignoring invalid %s (expected a positive integer)rE   z6Ignoring invalid %s (expected an integer from 1 to %d))r   r6   r.   r/   rA   r    r!   isascii	isdecimalr;   r<   OverflowError_SYSTEMD_WATCHDOG_MAX_SECONDS)r   rC   rG   r1   s       r$   coerce_systemd_watchdog_secondsrO      s{    }q% JCPPPq% 	E3		 kkmm 	#++-- 	s}} 	NNNPSTTT1	b\\FF:}5 	 	 	NNNPSTTT11	 	JCPPPq{{qv666666666D)	
 	
 	

 qMs    C 2DDc                 4    t          | t                    r| ni S )z=Return *value* when it is a mapping, otherwise an empty dict.)r   dictr7   s    r$   _coerce_dictrR      s    ud++3553r&   pairc                     t          | t                    r,|                                                                 }|dv r|S |S )z8Normalize unauthorized DM behavior to a supported value.>   rS   ignorer   r    r!   r"   r   r   
normalizeds      r$   #_normalize_unauthorized_dm_behaviorrY      sD    % [[]]((**
+++Nr&   publicc                     t          | t                    r,|                                                                 }|dv r|S |S )z4Normalize notice delivery mode to a supported value.>   rZ   privaterV   rW   s      r$   _normalize_notice_deliveryr]      sD    % [[]]((**
...Nr&   platforms_datanamec                     |                      |i           }t          |t                    si }|| |<   |                     di           }t          |t                    si }||d<   ||fS )a  Get-or-create ``platforms_data[name]`` and its nested ``extra`` dict.

    Both slots are coerced to ``{}`` if a non-dict value is encountered, so
    callers can safely write keys without type-checking.  Returns
    ``(plat_data, extra)`` for in-place mutation.
    extra)
setdefaultr   rQ   )r^   r_   	plat_datara   s       r$   _ensure_platform_extra_dictrd      s{     ))$33Ii&& )	(t  "--EeT"" #"	'er&   c                     t                      t          | d          }||n|S t          j                            |           }||S |S )a  Read env vars through the active profile secret scope when present.

    ``load_gateway_config()`` runs in many contexts, including multiplexed
    profile startup where ``_profile_runtime_scope`` installs per-profile
    secrets. In that scope we must prefer the scoped value; outside it we keep
    legacy ``os.getenv`` behavior for single-profile callers and unscoped
    gateway reads.
    N)r   _get_secretr*   environget)r_   r   	scope_valenv_vals       r$   _getenvrk      sQ     )d++	%1yyw>jnnT""GNr&    c                 .    t          | |          }||n|S N)rk   )r_   r   vals      r$   _getenv_strrp      s    
$
 
 C/33w.r&   c                     t          | d           }||S 	 t          t          |                                          d          S # t          t
          f$ r |cY S w xY w)NrE   )rk   rA   r    r!   r;   r<   )r_   r   r1   s      r$   _getenv_intrr     si    
$

C
{3s88>>##R(((z"   s   .A AA_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dS )Platforma?  Supported messaging platforms.

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

        Creates a pseudo-member cached in ``_value2member_map_`` so that
        ``Platform("irc") is Platform("irc")`` holds True (identity-stable).
        Arbitrary strings are rejected to prevent enum pollution.
        N-_ r   platform_registry)r   r    r!   r"   _value2member_map_rs   _scan_bundled_plugin_platformsobject__new___value_upperreplace_name__member_map_gateway.platform_registryr   is_registered	Exception)clsr   pseudor   s       r$   	_missing_zPlatform._missing_0  s    %%% 	U[[]] 	4##%%C***)%00
 +2.1.P.P.R.R+333^^C((F"FN!KKMM11#s;;CCCMMFM,2C"5).4CV]+M
	CCCCCC ..u55 ,,!& % 5 5c3 ? ? G GS Q Q06&u-28 /  	 	 	D	 ts   
BF# #
F0/F0r   c                    t                      }	 t          t                    j        j        dz  dz  }|                                r|                                D ]}|                                rq|dz                                  rZ|dz                                  s|dz                                  r,|                    |j        	                                           n# t          $ r Y nw xY w|S )zFReturn names of bundled platform plugins under ``plugins/platforms/``.plugins	platformsz__init__.pyzplugin.yamlz
plugin.yml)setr   __file__parentis_diriterdirexistsaddr_   r"   r   )r   namesplatforms_dirchilds       r$   r   z'Platform._scan_bundled_plugin_platforms]  s    UU	 NN189D{RM##%% 
6*2244 	6 	6E6"]2::<<6 #]2::<<	6
 !& 4<<>>6 		%*"2"2"4"4555 	 	 	D	s   CC% %
C21C2N) __name__
__module____qualname____doc__LOCALTELEGRAMDISCORDWHATSAPP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   r    r&   r$   ru   ru     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&   ru   c              #   $   K   | ]}|j         V  d S rn   r7   ).0ms     r$   	<genexpr>r   u  s$      $T$TQW$T$T$T$T$T$Tr&   >	   r   liner   r   r   r   r   rz   r   r   r   PORT_BINDING_CONDITIONAL_MODESplatform_valuera   c                     | t           vrdS t                              |           }|Ot          |pi                     dd                                                                                    }||k    S dS )zReturn True when *platform_value* actually binds a port for *extra* config.

    Mode-conditional platforms (Feishu) only bind in their listener mode;
    everything else in ``PORT_BINDING_PLATFORM_VALUES`` always binds.
    FNconnection_mode	websocketT)PORT_BINDING_PLATFORM_VALUESr   rh   r    r!   r"   )r   ra   expected_modeactuals       r$   platform_binds_portr     sx     999u266~FFM ekr&&'8+FFGGMMOOUUWW&&4r&   c                       e Zd ZU dZeed<   eed<   eed<   dZee         ed<   de	ee
f         fdZed	e	ee
f         dd fd
            ZdS )HomeChannela@  
    Default destination for a platform.
    
    When a cron job specifies deliver="telegram" without a specific chat ID,
    messages are sent to this home channel. Thread-aware platforms may also
    store a thread/topic ID so the bare platform target routes to the exact
    conversation where /sethome was run.
    platformchat_idr_   N	thread_idr   c                 \    | j         j        | j        | j        d}| j        r
| j        |d<   |S )N)r   r   r_   r   )r   r   r   r_   r   selfresults     r$   to_dictzHomeChannel.to_dict  s=    +|I
 

 > 	1"&.F;r&   datac           	           | t          |d                   t          |d                   |                    dd          |                    d          rt          |d                   nd           S )Nr   r   r_   Homer   r   r   r_   r   )ru   r    rh   r   r   s     r$   	from_dictzHomeChannel.from_dict  sq    sd:.//Y((&&))040E0EOc${+,,,4	
 
 
 	
r&   )r   r   r   r   ru   __annotations__r    r   r
   r   r   r   r   r   r   r&   r$   r   r     s           LLL
III#Ix}###c3h     
T#s(^ 
 
 
 
 [
 
 
r&   r   c                       e Zd ZU dZdZeed<   dZeed<   dZ	eed<   dZ
eed	<   d
Zeed<   dZeed<   deeef         fdZedeeef         dd fd            ZdS )SessionResetPolicyuT  
    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)

    Default is "none" — sessions never auto-reset unless the user opts in
    via the `session_reset` section in config.yaml (or gateway.json
    overrides). Changed July 2026 from "both" (24h idle + daily 4am), which
    surprised users who expected their conversations to persist.
    nonemode   at_hour  idle_minutesTnotifyr   r   notify_exclude_platforms   bg_process_max_age_hoursr   c                 j    | j         | j        | j        | j        t	          | j                  | j        dS )Nr   r   r   r   r   r   )r   r   r   r   listr   r   r   s    r$   r   zSessionResetPolicy.to_dict  s:    I| -k(,T-J(K(K(,(E
 
 	
r&   r   c           	         t          |          }|                    d          }|                    d          }|                    d          }|                    d          }|                    d          }|                    d          } | ||nd||nd||nd	t          |d
          |t          |          nd||nd          S )Nr   r   r   r   r   r   r   r   r   Tr   r   r   )rR   rh   r%   tuple)r   r   r   r   r   r   exclude
bg_max_ages           r$   r   zSessionResetPolicy.from_dict  s    D!!xx((9%%xx//(##((566XX899
s)v&2GG)5)At--7>7JU7^^^Pi3=3IZZr
 
 
 	
r&   N)r   r   r   r   r   r    r   r   rA   r   r   r6   r   r   r   r   r   r   r   r   r   r&   r$   r   r     s           D#GSL#FD&?e??? %'c&&&
c3h 
 
 
 
 
T#s(^ 
0D 
 
 
 [
 
 
r&   r   c                       e Zd ZU dZdZee         ed<   dZee         ed<   dZ	ee         ed<   de
eef         fdZede
eef         dd fd	            ZdS )
ChannelOverridea"  
    Per-channel override for model, provider, and system prompt.

    Used in config under platforms.<name>.channel_overrides[channel_id].
    Enables different channels (e.g. Discord #daily vs #dev) to use different
    models and personas without running separate gateway instances.
    Nmodelprovidersystem_promptr   c                 p    i }| j         
| j         |d<   | j        
| j        |d<   | j        
| j        |d<   |S )Nr  r  r  r  r  r  )r   outs     r$   r   zChannelOverride.to_dict  sH     :!:CL=$"mC
O)#'#5C 
r&   r   c                     |s
 |             S  | |                     d          |                     d          |                     d                    S )Nr  r  r  r  )rh   r   s     r$   r   zChannelOverride.from_dict  s[     	355Ls((7##XXj))((?33
 
 
 	
r&   )r   r   r   r   r  r
   r    r   r  r  r   r   r   r   r   r   r&   r$   r  r    s            E8C="Hhsm"""#'M8C='''c3h     
T#s(^ 
0A 
 
 
 [
 
 
r&   r  TELEGRAM_BOT_TOKENDISCORD_BOT_TOKENSLACK_BOT_TOKENMATTERMOST_TOKENMATRIX_ACCESS_TOKENWEIXIN_TOKENPLATFORM_TOKEN_ENV_NAMESc                   d   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<   d
Zeed<   dZee	         ed<    ee          Zee	ef         ed<    ee          Zee	ef         ed<   dee	ef         fdZedee	ef         dd fd            ZdS )PlatformConfigz.Configuration for a single messaging platform.FenabledNr2   api_keyhome_channelfirstreply_to_modeTgateway_restart_notificationtyping_indicatortyping_status_textdefault_factorychannel_overridesra   r   c                 N   | j         | j        | j        | j        | j        d}| j        
| j        |d<   | j        r
| j        |d<   | j        r
| j        |d<   | j        r| j        	                                |d<   | j
        r&d | j
                                        D             |d<   |S )N)r  ra   r  r  r  r  r2   r  r  c                 >    i | ]\  }}||                                 S r   r   )r   cidovs      r$   
<dictcomp>z*PlatformConfig.to_dict.<locals>.<dictcomp>q  s3     + + +&-c2RZZ\\+ + +r&   r  )r  ra   r  r  r  r  r2   r  r  r   r  itemsr   s     r$   r   zPlatformConfig.to_dict`  s    |Z!/,0,M $ 5
 
 ".+/+BF'(: 	)"jF7O< 	- $F9 	A%)%6%>%>%@%@F>"! 	+ +151G1M1M1O1O+ + +F&' r&   r   c                 (   t          |          }d }t          |                    d          t                    r t                              |d                   }t          |                    di                     }|                    d          }||                    d          }|                    d          }||                    d          }|                    d          }||                    d          }i }|                    d          pi }t          |t                    rY|                                D ]D\  }	}
t          |
t                    r*t                              |
          |t          |	          <   E | t          |                    d          d          |                    d	          |                    d
          ||                    dd          t          |d          t          |d          |||
  
        S )Nr  ra   r  r  r  r  r  Fr2   r  r  r  T)
r  r2   r  r  r  r  r  r  r  ra   )
rR   r   rh   rQ   r   r   r%  r  r    r%   )r   r   r  ra   _grn_typing_typing_textr  raw_overridesr"  ov_datas              r$   r   zPlatformConfig.from_dictv  s   D!!dhh~..55 	G&00n1EFFL TXXgr2233xx677<99;<<D
 ((-..?ii 233G xx 455 99%9::L8:!455;mT** 	U - 3 3 5 5 U UWgt,, U2A2K2KG2T2T%c#hh/s )!4!4e<<((7##HHY''%((?G<<)5dD)A)A)'488+/
 
 
 	
r&   )r   r   r   r   r  r6   r   r2   r
   r    r  r  r   r  r  r  r  r   rQ   r  r   r  ra   r   r   r   r   r   r&   r$   r  r  3  sc        88GTE8C=!GXc]!!!*.L(;'... !M3    *. $--- "d!!! )-,,, 5:E$4O4O4OtC01OOO "E$777E4S>777c3h    , .
T#s(^ .
0@ .
 .
 .
 [.
 .
 .
r&   r  g?DEFAULT_STREAMING_EDIT_INTERVALr   "DEFAULT_STREAMING_BUFFER_THRESHOLDu    ▉DEFAULT_STREAMING_CURSORc                       e Zd ZU dZdZeed<   dZeed<   e	Z
eed<   eZeed<   eZeed<   d	Zeed
<   deeef         fdZedeeef         dd fd            ZdS )StreamingConfigzCConfiguration for real-time token streaming to messaging platforms.Fr  r5   	transportedit_intervalbuffer_thresholdcursor        fresh_final_after_secondsr   c                 P    | j         | j        | j        | j        | j        | j        dS )Nr  r1  r2  r3  r4  r6  r8  r   s    r$   r   zStreamingConfig.to_dict  s2    |!/ $ 5k)-)G
 
 	
r&   r   c                 p   t          |t                    r|s
 |             S |                    d          }|                    d          }||n|}t          |          }d|v r$t	          |                    d          d          }n|t          |          dk    }nd} | ||t          |                    d          t                    t          |                    d          t                    |                    dt                    t          |                    d	          d
                    S )Nr1  r   r  Fr   r2  r3  r4  r6  r5  r8  )
r   rQ   rh   r8   r%   r>   r,  rB   r-  r.  )r   r   raw_transportraw_modepickedr1  r  s          r$   r   zStreamingConfig.from_dict  sC   $%% 	T 	355L  --88F## #0";.v66	"488I#6#6>>GG! 1::eCGGGs'))+J  )+,,.P  88H&>??&3455s' '
 
 
 	
r&   N)r   r   r   r   r  r6   r   r1  r    r,  r2  r:   r-  r3  rA   r.  r4  r6  r   r   r   r   r   r   r&   r$   r0  r0    s         MMGT" Is:M5:::>c>>>*FC*** (+u***
c3h 
 
 
 
 0
T#s(^ 0
0A 0
 0
 0
 [0
 0
 0
r&   r0  c                     | sdS 	 ddl m} nB# t          $ r5 t          t	          |                                                     dk    cY S w xY w || d          S )a#  True when API_SERVER_KEY is present and strong enough to be usable.

    Mirrors the startup guard in ``gateway/platforms/api_server.py``
    (``has_usable_secret`` with ``min_length=16``) so the platform is only
    enrolled at load time when the adapter would actually agree to start.
    Fr   has_usable_secret   
min_length)hermes_cli.authr?  ImportErrorlenr    r!   )rC   r?  s     r$   _has_usable_api_server_keyrF    s      u+5555555 + + +3s88>>##$$****+SR0000s    <AAc                     t          | j                            d          o | j        p| j                            d                    S )N
account_idr2   )r6   ra   rh   r2   cfgs    r$   <lambda>rK  )  s;    	l##M)LcimmG6L6L" " r&   c                     t          | j                            d          o| j                            d                    S )Nphone_number_idaccess_tokenr6   ra   rh   rI  s    r$   rK  rK  ,  s5    	'((JSY]]>-J-J* * r&   c                 P    t          | j                            d                    S )Nhttp_urlrO  rI  s    r$   rK  rK  /  s    cimmJ&?&?!@!@ r&   c                 X    t          | r| j                            d          nd           S )NrC   )rF  ra   rh   rI  s    r$   rK  rK  0  s,    %? #-	e& & r&   c                     dS )NTr   rI  s    r$   rK  rK  3  s    $ r&   c                     t          t          | j                            d          pd                                                    S )Nclient_staterl   )r6   r    ra   rh   r!   rI  s    r$   rK  rK  4  s:    $CIMM.))/R006688+ + r&   c                     t          | j                            d          o| j                            d                    S )N
server_urlpasswordrO  rI  s    r$   rK  rK  7  s4    d	l##A	j(A(A' ' r&   c                     t          | j                            d          o| j                            d                    S )Napp_idclient_secretrO  rI  s    r$   rK  rK  :  s4    	hBCIMM/$B$B! ! r&   c                     t          | j                            d          o| j                            d                    S )NrZ  
app_secretrO  rI  s    r$   rK  rK  =  s4    $	h?CIMM,$?$?# # r&   c                     t          | j                            d          p| j                            d                    S )N	relay_urlurlrO  rI  s    r$   rK  rK  D  s4    	k"":cimmE&:&:! ! 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
d<   dZee
d<   dZee          e
d<   dZ!ee
d<   dZ"e e
d<   dZ#ee
d<    ee$          Z%e$e
d<   dZ&e e
d<    ee'          Z(e'e
d<   d.d!Z)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/e0d*eeef         d d fd+            Z1d0d#ee         d efd,Z2d0d#ee         d efd-Z3dS )1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$   rK  zGatewayConfig.<lambda>Z  s    vx>P r&   reset_triggersquick_commandsc                  $    t                      dz  S )Nsessionsr   r   r&   r$   rK  zGatewayConfig.<lambda>`  s    7H7H:7U r&   sessions_dirTwrite_sessions_jsonalways_log_localfilter_silence_narrationstt_enabledstt_echo_transcriptsgroup_sessions_per_userFthread_sessions_per_userNmax_concurrent_sessionsmultiplex_profilesr   systemd_watchdog_secondsrS   unauthorized_dm_behavior	streamingZ   session_store_max_age_daysprofile_routesr   c                 8    t          | j                  | _        d S rn   )rO   rx  r   s    r$   __post_init__zGatewayConfig.__post_init__  s     (G))
 )
%%%r&   c                     g }| j                                         D ]8\  }}|j        s|                     ||          r|                    |           9t          |d           S )u  Return list of platforms that are enabled and configured.

        Sorted by platform value so the rendered "Connected Platforms" list
        (and the home-channel blocks derived from it) is byte-stable across
        gateway restarts and mid-process platform registration — dict
        insertion order is not a stable contract and a reorder busts the
        prompt cache without any semantic change.
        c                 *    t          | j                  S rn   )r    r   )ps    r$   rK  z7GatewayConfig.get_connected_platforms.<locals>.<lambda>  s    s17|| r&   )rC   )r   r%  r  _is_platform_connectedappendr0   )r   	connectedr   configs       r$   get_connected_platformsz%GatewayConfig.get_connected_platforms  s|     	 $ 4 4 6 6 	+ 	+Hf> **8V<< +  ***i%;%;<<<<r&   r   r  c                 D   |t           j        k    rHt          |j                            d          o |j        p|j                            d                    S |j        s|j        rdS t                              |          }| ||          S 	 ddlm	} 	 ddl
m}  |             n# t          $ r Y nw xY w|                    |j                  }|r:|j        |                    |          S |j        |                    |          S dS n# t          $ r Y nw xY wdS )	z;Check whether a single platform is sufficiently configured.rH  r2   TNr   r   discover_pluginsF)ru   r   r6   ra   rh   r2   r  ra  r   r   hermes_cli.pluginsr  r   r   is_connectedvalidate_config)r   r   r  checkerr   r  entrys          r$   r  z$GatewayConfig._is_platform_connected  s    x&&  .. @\>V\%5%5g%>%>   < 	6> 	4 /228<<76??"	CCCCCC??????  """"   %))(.99E %1 --f555(4 00888t  	 	 	D	 us<   D B) (D )
B63D 5B66:D 1D 
DDc                 L    | j                             |          }|r|j        S dS )z$Get the home channel for a platform.N)r   rh   r  )r   r   r  s      r$   get_home_channelzGatewayConfig.get_home_channel  s-    ##H-- 	'&&tr&   session_typec                 p    |r|| j         v r| j         |         S |r|| j        v r| j        |         S | j        S )z
        Get the appropriate reset policy for a session.
        
        Priority: platform override > type override > default
        )rf  re  rd  )r   r   r  s      r$   get_reset_policyzGatewayConfig.get_reset_policy  sU      	4D$:::)(33  	4LD,>>>%l33((r&   c                 j   i dd | j                                         D             d| j                                        dd | j                                        D             dd | j                                        D             d| j        d	| j        d
t          | j	                  d| j
        d| j        d| j        d| j        d| j        d| j        d| j        d| j        d| j        d| j        | j        | j                                        | j        d | j        D             dS )Nr   c                 H    i | ]\  }}|j         |                                 S r   r   r   )r   r  cs      r$   r$  z)GatewayConfig.to_dict.<locals>.<dictcomp>  s5       )-A  r&   rd  re  c                 >    i | ]\  }}||                                 S r   r!  r   kvs      r$   r$  z)GatewayConfig.to_dict.<locals>.<dictcomp>  s3       #'1a199;;  r&   rf  c                 H    i | ]\  }}|j         |                                 S r   r  )r   r  r  s      r$   r$  z)GatewayConfig.to_dict.<locals>.<dictcomp>  s5     " " ")-A" " "r&   rj  rk  rn  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  c                 x    g | ]7}t          |          r$t          |t                    st          |          n|8S r   )r   r   typer   )r   rs     r$   
<listcomp>z)GatewayConfig.to_dict.<locals>.<listcomp>  sL        *!__OZ45H5HOq			a  r&   )ry  rz  r|  r}  )r   r%  rd  r   re  rf  rj  rk  r    rn  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r|  r}  r   s    r$   r   zGatewayConfig.to_dict  s   
  151E1E1G1G  
 #D$=$E$E$G$G	

   +/+=+C+C+E+E  
   " "151G1M1M1O1O" " "
 d1
 d1
 C 122
 "4#;
  5
  '(E!
" 4+#
$ #D$=%
& &t'C'
( '(E)
* &t'C+
, !$"9-
. '(E/
0 )-(E//11*.*I ,  7
 
 
 	
r&   r   c                    t          |          }i }t          |                    di                     }|                                D ]X\  }}t          |t                    s	 t          |          }t                              |          ||<   I# t          $ r Y Uw xY wi }t          |                    di                                                     D ]"\  }}	t                              |	          ||<   #i }
t          |                    di                                                     D ]B\  }}		 t          |          }t                              |	          |
|<   3# t          $ r Y ?w xY wt                      }d|v r t                              |d                   }t                      dz  }d|v rt          |d                   }|                    di           }t          |t                    si }|                    d          }|St          |                    d	          t                    r)|                    d	i                               d
          nd }|                    d          }|St          |                    d	          t                    r)|                    d	i                               d          nd }|                    d          }|                    d          }|                    d          }t          |                    d          t                    r|                    d          ni }d|v r|                    d          }d}n|                    d          }d}t          ||          }|*t          |t                    r|                    d          }t                      }||}d|v r|                    d          }d}n|                    d          }d}t          ||          }t          |                    d          d          }	 t!          |                    dd                    }t#          |d          }n# t$          t          f$ r d}Y nw xY wddlm}  ||                    d          pg           } | d%i d|d|d|d|
d|                    dddg          d|d|dt+          |                    d          d           d!t+          |                    d!          d           d"t+          |                    d"          d           dt+          |d           dt+          |d           dt+          |d           dt+          |d#          dt+          |d#          d|d|d|d$t,                              |                    d$i                     d|d|S )&Nr   re  rf  rd  rm  rn  rk  rr  sttr  rs  echo_transcriptsrt  ru  rw  gatewayrx  rI   rv  zgateway.max_concurrent_sessionsry  rS   r|  r{  r   )parse_profile_routesr}  rj  rh  ri  ro  Trp  rq  Frz  r   )rR   rh   r%  r   rQ   ru   r  r   r<   r   r   r   rO   r3   rH   rY   rA   maxr;   gateway.profile_routingr  r%   r0  )r   r   r   r^   platform_nameplatform_datar   re  	type_namepolicy_datarf  default_policyrn  rk  rr  rs  rt  ru  rw  nested_gatewaysystemd_watchdog_rawsystemd_watchdog_keyrx  env_multiplexmax_concurrent_rawmax_concurrent_keyrv  ry  r|  r  r}  s                                  r$   r   zGatewayConfig.from_dict  s   D!!	%dhh{B&?&?@@,:,@,@,B,B 	 	(M=mT22 #M22&4&>&>}&M&M	(##    &2488OR3P3P&Q&Q&W&W&Y&Y 	Q 	Q"I{'9'C'CK'P'PM)$$*6txx@SUW7X7X*Y*Y*_*_*a*a 	 	&M;#M22.@.J.J;.W.W!(++    ,--!T))/99$?U:VWWN&((:5T!!^ 455L"2B77.$// 	 Nhh}--@J488TY??\`@a@ak$((5"--11)<<<gkK#xx(>??' dhhuoot44##''(:;;; ! #'((+D"E"E#'88,F#G#G !XX&:;;0:488I;N;NPT0U0U]),,,[]%--#'88,F#G#G #=  #1#5#56P#Q#Q #E #B "6$
 $
  %*^T*J*J% "0!3!34H!I!I 9::$!.$,,!%*C!D!D!:!/!3!34M!N!N!B"?#
 #
 $GHH/00$
 $
 
	,),TXX6RTV-W-W)X)X&),-G)K)K&&:& 	, 	, 	,)+&&&	, 	A@@@@@--dhh7G.H.H.NBOOs 
 
 
i
!/
 (-
 0/	

  88$4vx6HIII
 *>
 &
 !-TXX6K-L-Ld S S S
 *$((3E*F*FMMM
 &2344d& & &
 %[$777
 "..BD!I!I!I
 %11H$$O$O$O
  &22JE%R%R%R!
"  ,,>FFF#
$ &>%=%
& %<$;'
( &>%=)
* &//b0I0IJJJ+
, (B'A-
. *>/
 	
s6   %,B
BB9,E&&
E32E393Q- -RRc                     |rd| j                             |          }|r6d|j        v r-t          |j                            d          | j                  S |t
          j        k    rdS | j        S )a*  Return the effective unauthorized-DM behavior for a platform.

        Email is inbox-shaped, not chat-shaped, so it defaults to ``"ignore"``
        unless ``platforms.email.unauthorized_dm_behavior`` explicitly opts
        into pairing. A global default does not opt email into pairing.
        ry  rU   )r   rh   ra   rY   ry  ru   r   r   r   platform_cfgs      r$   get_unauthorized_dm_behaviorz*GatewayConfig.get_unauthorized_dm_behavior  s      	 >--h77L  :l>P P P: &**+EFF1   8>))x,,r&   c                     |rM| j                             |          }|r1d|j        v r(t          |j                            d          d          S dS )z9Return the effective notice-delivery mode for a platform.notice_deliveryrZ   )r   rh   ra   r]   r  s      r$   get_notice_deliveryz!GatewayConfig.get_notice_delivery  sf     	>--h77L  1\5G G G1 &**+<==   xr&   )r   N)NNrn   )4r   r   r   r   r   rQ   r   r   ru   r  r   r   rd  re  r    rf  rj  r	   rk  r   rn  r   ro  r6   rp  rq  rr  rs  rt  ru  rv  r
   rA   rw  rx  ry  r0  rz  r|  r   r}  r  r  r  r   r  r  r   r   r   r  r  r   r&   r$   rc  rc  J  s          16d0K0K0KItHn,-KKK 05uEW/X/X/X,XXX3853N3N3NM4//0NNN<AERV<W<W<WtH&889WWW !&6P6P Q Q QNDIQQQ &+U4%@%@%@NDcN@@@ /U/UVVVL$VVV !%$$$ "d!!! &*d))) K!%$%%% %)T(((%*d***-1Xc]111  %$$$ %&c%%% %+c*** "'!G!G!GIGGG ')(((
 !5666ND666
 
 
 

=h = = = ="(x ( (TX ( ( ( (T h{6K     (,&*) )8$) sm) 
	) ) ) )( 
c3h  
  
  
  
D ~
T#s(^ ~
 ~
 ~
 ~
 [~
@- -Xh5G -SV - - - -$	 	HX,> 	# 	 	 	 	 	 	r&   rc  c                    2 t                      } i }| dz  }|                                r	 t          |dd          5 }t          j        |          pi }ddd           n# 1 swxY w Y   t
                              d|           n3# t          $ r&}t
                              d||           Y d}~nd}~ww xY w	 ddl	}| d	z  }|                                r-t          |d          5 }|
                    |          pi }ddd           n# 1 swxY w Y   dd
lm} |                    |          }|                    d          }	|                    d          }
d|vr*t          |	t                     r|	                    d          }
|
rt          |
t                     r|
|d<   |                    d          }|*t          |	t                     r|	                    d          }|Ht          |t                     r||d<   n-t
                              dt#          |          j                   |                    d          }d|vr*t          |	t                     r|	                    d          }t          |t                     r||d<   d|v r|d         |d<   n$t          |	t                     rd|	v r|	d         |d<   |                    d          }d|v r|d         |d<   n$t          |	t                     rd|	v r|	d         |d<   d|v r|d         |d<   n$t          |	t                     rd|	v r|	d         |d<   d|v r|d         |d<   |                    d          }|*t          |	t                     r|	                    d          }t          |t&                    r||d<   t          |	t                     r1d|	v rd|vr|	d         |d<   d|	v r|	d         |d<   d|	v r|	d         |d<   d|v r|d         |d<   |                    d          }t          |t                     s*t          |	t                     r|	                    d          }t          |t                     r||d<   d|v r|d         |d<   n$t          |	t                     rd|	v r|	d         |d<   d|v r|d         |d<   n$t          |	t                     rd|	v r|	d         |d<   d|v r|d         |d<   n$t          |	t                     rd|	v r|	d         |d<   d|v r|d         |d<   n$t          |	t                     rd|	v r|	d         |d<   d|v r't)          |                    d          d          |d<   n?t          |	t                     r*d|	v r&t)          |	                    d          d          |d<   t          |t                     r|                    d          nd}|                    di           2t          2t                     si 22|d<   d t,          d!df2fd"} ||            ||                    d                     t          |t                     rri }|                                D ]N\  }}|dk    r	 t1          |           n# t2          t4          f$ r Y 0w xY wt          |t                     r|||<   O|r ||           2                    d#          }t          |t                     rV|                    d$          }t          |t                     si }||d$<   d%D ]"}||v r||vr|                    |          ||<   #2r2|d<   	 dd&lm}  |             dd'lm} n4# t          $ r'}t
                               d(|           d}Y d}~nd}~ww xY wt'          t0                    }|]|!                                D ]H}	 t1          |j"                  }n# t2          tF          f$ r Y +w xY w||vr|$                    |           I|D ]Z}|t0          j%        k    r|                    |j&                  }t          |t                     }|sb||                    d          fD ]J}t          |t                     r3|                    |j&                  } t          | t                     r| } nKt          |t                     si }!d|v r:t)          |                    d          |                    dd                    |!d<   d)|v r&tO          |                    d)          d*          |!d)<   d+|v r|d+         |!d+<   d,|v r|d,         |!d,<   d-|v r|d-         |!d-<   d.|v r|d.         |!d.<   |t0          j(        k    rd/|v r|d/         |!d/<   |t0          j(        k    rd0|v r|d0         |!d0<   |t0          j(        k    rd1|v r|d1         |!d1<   d2|v r|d2         |!d2<   d3|v r|d3         |!d3<   d4|v r|d4         |!d4<   |t0          j(        k    rd5|v r|d5         |!d5<   d6|v r|d6         |!d6<   d7|v r|d7         |!d7<   d8|v r|d8         |!d8<   d9|v r|d9         |!d9<   d:|v r|d:         |!d:<   d;|v r|d;         |!d;<   d<|v r|d<         |!d<<   d=|v r|d=         |!d=<   |t0          j)        t0          j*        hv rd>|v r|d>         |!d><   d?|v rD|d?         }"t          |"t                     r"d@ |"                                D             |!d?<   n|"|!d?<   dA|v r|dA         |!dA<   dB|v r|dB         |!dB<   dC|v r|dC         |!dC<   |t0          j+        t0          j,        hv r,dDD ])}||v r#||                    d$i           vr||         |!|<   *|t0          j-        k    r,dED ])}||v r#||                    d$i           vr||         |!|<   *dF|v }#|#rc|                    dF          }$t          |$t                     r9t]          2|j&                  \  }%}&dG |$                                D             |%dF<   |odH|v }'|!s|'s|#st]          2|j&                  \  }%}(|'r|dH         |%dH<   dI|(dJ<   |(/                    |!           \|^|0                                D ]H})|)j1        |                    |)j"                  }t          |t                     sb||                    d          fD ]J}t          |t                     r3|                    |)j"                  } t          | t                     r| } nKt          |t                     s	 |)1                    ||          }*n8# t          $ r+}t
                               dK|)j"        |           Y d}~d}~ww xY wt          |*t                     r|*st]          2|)j"                  \  }+}(|(/                    |*           J|                    d.          },|,|                    dL          pi }-d.|-vr2                    t0          j(        j&        i           }.|.                    d$i           }/|/                    d.|,           te          j3        dM          s.ti          |,          5                                td          j6        dM<   |                    dNi           }0t          |0t                     rLd.|0v rHte          j3        dO          s4ti          |0d.                   5                                td          j6        dO<   n6# t          $ r)}t
                              dP| d	z  |           Y d}~nd}~ww xY wtn          8                    |          }1ts          |1           tu          |1           |1S )Qu  
    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.jsonr  zutf-8)encodingNu<   Loaded legacy %s — consider moving settings to config.yamlzFailed to load %s: %sr   zconfig.yaml)managed_scoper  session_resetrd  rk  zIIgnoring invalid quick_commands in config.yaml (expected mapping, got %s)r  rs  rt  ru  rw  r}  rv  rx  rz  rj  rp  ro  rq  ry  rS   r   source_platformsr   c                    t          | t                    sd S |                                 D ]\  }}t          |t                    s                    |i           }t          |t                    si }i |                    di           |                    di           }d|v rd|d<   i ||}|r||d<   ||<   d S )Nra   r  T_enabled_explicit)r   rQ   r%  rh   )r  	plat_name
plat_blockexistingmerged_extramergedr^   s         r$   _merge_platform_mapz0load_gateway_config.<locals>._merge_platform_mapk  s    !"2D99 F-=-C-C-E-E 7 7)Iz%j$77 ! -11)R@@H%h55 &#%#_hll7B&?&?#_:>>RY[]C^C^#_L J..<@%8977J7F# 7*6w06N9--7 7r&   r   ra   )portrC   hostcors_origins
model_namer  r   zplugin discovery skipped: %sr  rZ   reply_prefixreply_in_threadcron_continuable_surfacerequire_mentionallowed_chatsgroup_allowed_chatsallowed_topicsfree_response_channelsmention_patternsexclusive_bot_mentions"observe_unmentioned_group_messages	dm_policy
allow_fromallow_admin_fromuser_allowed_commandsgroup_policygroup_allow_fromgroup_allow_admin_fromgroup_user_allowed_commandschannel_skill_bindingschannel_promptsc                 4    i | ]\  }}t          |          |S r   )r    r  s      r$   r$  z'load_gateway_config.<locals>.<dictcomp>  s$    5d5d5dDAqc!ffa5d5d5dr&   r  r  r  )r  r  secret)r  r  r  c                 ^    i | ]*\  }}t          |t                    t          |          |+S r   )r   rQ   r    )r   r"  r+  s      r$   r$  z'load_gateway_config.<locals>.<dictcomp>*  sD     : : : ,W)'488:HHg: : :r&   r  Tr  z&apply_yaml_config_fn for %s raised: %srw   TELEGRAM_REQUIRE_MENTIONr|   SIGNAL_REQUIRE_MENTIONus   Failed to process config.yaml — falling back to .env / gateway.json values. Check %s for syntax errors. Error: %s);r   r   openjsonloadr.   infor   r/   yaml	safe_load
hermes_clir  apply_managed_overlayrh   r   rQ   r  r   r   rY   rb   r   r%  ru   r<   AttributeErrorpopr  r  r   r   debugplugin_entriesr_   KeyErrorr  r   r   r]   r   r   r   r   r   r   rd   updateall_entriesapply_yaml_config_fnr*   r+   r    r"   rg   rc  r   _apply_env_overrides_validate_gateway_config)3_homegw_datagateway_json_pathfer  config_yaml_pathyaml_cfgr  gateway_sectionsrqcstt_cfggateway_cfg_prstreaming_cfggateway_platformsr  _nested_platforms_k_v	_api_plat
_api_extra_bridge_keyr  _shared_loop_targets_entry_platplatr  _cfg_toplevel_src
_candidatebridgedr  has_channel_overridesr*  rc   _extraenabled_was_explicitra   r  seededr   _tl_require_mention_tg_section_tg_plat	_tg_extra
signal_cfgr  r^   s3                                                     @r$   load_gateway_configr    s    EG .!! 	J	J'w??? -1)A,,,"- - - - - - - - - - - - - - -KKN!     	J 	J 	JNN24EqIIIIIIII	JM
 =0""$$ s	f&999 3Q>>!,,23 3 3 3 3 3 3 3 3 3 3 3 3 3 3 100000$::8DDH 'll955O o..Bh..:ot3T3T.$((99 5jT** 524././/Bzj$??z$(()9::~b$'' 02G,--NN5R)   ll5))GH$$OT)J)J$)--e44'4(( )!(%112:;Q2R.//OT22 Z7MQ`7`7`2ABX2Y./",,y11K(H445=>W5X122OT22 `7PTc7c7c5DE^5_12)X556>?Y6Z233OT22 b7QUd7d7d6EF`6a23
 $x//089M0N,-
 ,,/00C{z/4@@{%))*:;;#t$$ 0,/()/400 	'?::?S[b?b?b4CDX4YG01,??9HIb9cG56-@@:I2;G67 )H445=>W5X12$LL55MmT22 Az/SW7X7X A !0 3 3K @ @-.. 5'4$8++,45E,F())OT22 N7G?7Z7Z,;<L,M()!X--.67I.J*++OT22 R7I_7\7\.=>P.Q*+ %0019:O1P-..OT22 X7LP_7_7_1@AV1W-.)X556>.7233 OT22 7QUd7d7d6E.723 *X556YLL!;<<7 7233 OT22 7QUd7d7d6Y#''(BCC7 723 AK;X\@]@] g < < <cg$//R@@Nnd33 6!#'5$7c 7d 7 7 7 7 7 7$   1222[ 9 9::: +t,, ;*,!)//11 3 3FB[(( ! &7 ! ! ! !!"d++ 302)"-$ ;''(9::: '**<88I)T** M&]]733
!*d33 4!#J)3Ig&#X M MK"i//Kz4Q4Q2;--2L2L
;/ 6'5$??????  """NNNNNNN   ;Q??? *.h !0022 ; ;F! ( 5 5&1 ! ! ! !$888,33E:::, C& C&8>))'||DJ77 *< > > % &!2HLL4M4M N & &%dD11 &)-$*)=)=J)*d;; &/9 %!,55 -==:]$(()CDD$>GG; ;G67 %441K$(():;; 2 2G-. "\11.:>.JGN+$441=>O1PG-.-==:FGa:bG67$441=>O1PG-.8,,,L1P1P/;O/LGO,8,,,1F,1V1V5ABW5XG128,,,1A\1Q1Q0<=M0NG,-+|;;8DE]8^G45%552>?Q2RG./+|;;8DE]8^G458,,,1UYe1e1eDPQuDvG@A,..+7+DGK(<//,8,FGL)%552>?Q2RG./*l::7CD[7\G34!\11.:>.JGN+%552>?Q2RG./+|;;8DE]8^G450L@@=IJg=hG9:H,hn===BZ^jBjBj8DE]8^G45$44&23D&EO!/488 E5d5dOLaLaLcLc5d5d5d 1225D 121\AA>JKi>jG:;%552>?Q2RG./'<774@AU4VG01 H,h.FGGG'A M M&,66;lN^N^_fhjNkNk;k;k3?3LGK08...'7 M M&,66;lN^N^_fhjNkNk;k;k3?3LGK0(;|(K%( 
$0$4$45H$I$IM!-66 ,G*DJ- -)	6: :0=0C0C0E0E: : :	"56
 (5'Rl9R$ '; DY #>~tz#Z#Z 	5' 6+7	+BIi( 26E-.W%%%%  __.. ) )E19 #+<<
#;#;L &lD99 *%6[8Q8Q$R * *D)$55 *-1XXej-A-A
#-j$#?#? !*3=L$)E%lD99 ! !!&!;!;Hl!S!S$ ! ! !D!J   !! &fd33 !6 ! :>5:VVHAuLL(((( #+,,/@"A"A".&ll:66<"$K77-889J9PRTUUH ( 3 3GR @ @I(():<OPPP 9%?@@ bADEXAYAYA_A_AaAa
#=> "h33J*d++ f$
2229E];^;^2;>zJ[?\;];];c;c;e;eBJ78"  
 
 
4M!		
 	
 	
 	
 	
 	
 	
 	

 $$W--F     V$$$Ms  B A!B !A%%B (A%)B 
B8B33B8</| +D| D| DU| 7Z| Z| ZB2| ]% $| %
^/^| ^/| _| _/,| ._//U| 4u
| 
v !u;6| ;v  F| 
|;|66|;r  c           	         | j         }d|j        cxk    rdk    s)n t                              d|j                   d|_        |j        |j        dk    r't                              d|j                   d|_        t
          }| j                                        D ]e\  }}|j        s|	                    |          }|rA|j
        :|j
                                        s!t                              d|j        |           f	 dd	lm} n# t          $ r d}Y nw xY w|| j                                        D ]\  }}|j        s|	                    |          }|s%|j
        }|rg|                                rS ||d
          sFt                              d|j        ||                                dd         dz              d|_        dS dS )zValidate and sanitize a loaded GatewayConfig in place.

    Called by ``load_gateway_config()`` after all config sources are merged.
    Extracted as a separate function for testability.
    r      z3Invalid at_hour=%s (must be 0-23). Using default 4.r   Nz?Invalid idle_minutes=%s (must be positive). Using default 1440.r   zG%s is enabled but %s is empty. The adapter will likely fail to connect.r>  rA  z%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)rd  r   r.   r/   r   r  r   r%  r  rh   r2   r!   r   rC  r?  rD  error)r  policy_token_env_namesr   pconfigenv_namer?  r2   s           r$   r  r    sH    (F%%%%2%%%%A6>	
 	
 	
 "f&9Q&>&>M	
 	
 	
 # 0#-3355 	 	' 	#''11 	1'-:M:M:O:O1NN;  !5555555 ! ! ! ! $!'!1!7!7!9!9 	( 	(Hg? '++H55H ME ( (/@/@ST/U/U/U (7 NHekkmmBQB.?%.G	   #( %$	( 	(s   D
 
DDc                 DG    t           }t          }dt          dt          f fd} |d          }|r |t          j                  }||_         |dd                                          }|dv rOt          j         j        vr t                       j        t          j        <   | j        t          j                 _         |dd          }|rot          j         j        vr t                       j        t          j        <   d	 |	                    d
          D              j        t          j                 j
        d<    |d          }|r_t          j         j        v rLt          t          j        | |dd           |d          pd           j        t          j                 _         |d          }	|	r |t          j                  }
|	|
_         |d          }|r_t          j         j        v rLt          t          j        | |dd           |d          pd           j        t          j                 _         |dd                                          }|dv rOt          j         j        vr t                       j        t          j        <   | j        t          j                 _        t           |dd                    } |dd                                          dv }t          j         j        v r+ j        t          j                 }|rd|_        n.|rd|_        n$|r"t          d           j        t          j        <    |d          }|r_t          j         j        v rLt          t          j        | |dd           |d          pd           j        t          j                 _         |d          } |d           }|r|r t          j         j        vr t                       j        t          j        <   d j        t          j                 _         j        t          j                 j
                            ||d!            |d"          }|r| j        t          j                 j
        d#<    |d$          }|r| j        t          j                 j
        d%<    |d&          }|r| j        t          j                 j
        d'<    |d(          }|r| j        t          j                 j
        d)<    |d*          }|r| j        t          j                 j
        d+<    |d,          }|r>	 t'          |           j        t          j                 j
        d-<   n# t(          $ r Y nw xY w |d.          }|r| j        t          j                 j
        d/<    |d0          }|r| j        t          j                 j
        d1<    |d2          }|r_t          j         j        v rLt          t          j        | |d3d           |d4          pd           j        t          j                 _         |d5          }|rt          j         j        vr=t                       j        t          j        <   d j        t          j                 _        nO j        t          j                 }t-          |j
                            d6d                    }|j        s	|sd|_        | j        t          j                 _         |d7          }|r_t          j         j        v rLt          t          j        | |d8d           |d9          pd           j        t          j                 _         |d:          }  |d;          }!| rL|!rJ |t          j                  }"|"j
                            | |!t           |d<d=                    d>            |d?          }#|#r_t          j         j        v rLt          t          j        |# |d@d           |dA          pd           j        t          j                 _         |dB          }$|$rN |dCd          }%|%st2                              dD            |t          j                  }&|$|&_        |%|&j
        dE<    |dF          }'|'r_t          j         j        v rLt          t          j        |' |dGd           |dH          pd           j        t          j                 _         |dI          }( |dJd          })|(s |dK          r|)st2                              dL            |t          j                  }*|(r|(|*_        |)|*j
        dM<    |dNd          }+|+r
|+|*j
        dO<    |dKd          },|,r
|,|*j
        dP<    |dQd                                                                          }-|-dRv pt           |dSd                    }.|.|*j
        dT<   |-r
|-|*j
        dU<    |dVd          }/|/r
|/|*j
        dW<    |dX          }0|0r_t          j         j        v rLt          t          j        |0 |dYd           |dZ          pd           j        t          j                 _         |d[          }1|1rt          j         j        vr t                       j        t          j        <   d j        t          j                 _        |1 j        t          j                 _         |d\          }2|2r|2 j        t          j                 j
        dE<    |d]          }3 |d^          }4 |d_          }5 |d`          }6t?          |3|4|5|6g          rt          j          j        vr t                       j        t          j         <   d j        t          j                  _         j        t          j                  j
                            |3|5|6da            |db          }7|7r_t          j          j        v rLt          t          j         |7 |dcd           |dd          pd           j        t          j                  _         |de          }8|8rut          j!         j        vr t                       j        t          j!        <   d j        t          j!                 _         |dfd           j        t          j!                 _"         |dg          }9|9r_t          j!         j        v rLt          t          j!        |9 |dhd           |di          pd           j        t          j!                 _        t           |djd                    }: |dkd          }; |dld          }< |dm          }= |dn          }>tG          |;          rt          j$         j        vr t                       j        t          j$        <    j        t          j$                 j
        %                    d6d          }?|?r j        t          j$                 j        rd j        t          j$                 _        |;r|; j        t          j$                 j
        do<   |<r@dp |<	                    d
          D             }@|@r|@ j        t          j$                 j
        dq<   |=r>	 t'          |=           j        t          j$                 j
        dr<   n# t(          $ r Y nw xY w|>r|> j        t          j$                 j
        ds<    |dtd          }A|Ar|A j        t          j$                 j
        du<   t           |dvd                    }B |dw          }C |dxd          }D|Brt          j&         j        vr t                       j        t          j&        <   d j        t          j&                 _        |Cr>	 t'          |C           j        t          j&                 j
        dr<   n# t(          $ r Y nw xY w|Dr|D j        t          j&                 j
        dy<   t           |dzd                    }E |d{          }F |d|d          }G |d}d          }H |d~d          }I|Est          j'         j        v s	|Fs|Gs|Hs|Ir6t          j'         j        vr t                       j        t          j'        <   |Erd j        t          j'                 _        |Fr>	 t'          |F           j        t          j'                 j
        dr<   n# t(          $ r Y nw xY w|Gr|G j        t          j'                 j
        d<   |Hr@d |H	                    d
          D             }J|Jr|J j        t          j'                 j
        d<   |Ir@d |I	                    d
          D             }K|Kr|K j        t          j'                 j
        d<    |d          }L |d          }M|Lr|Mrt          j(         j        vr t                       j        t          j(        <   d j        t          j(                 _         j        t          j(                 j
                            |L|Md            |d          }N|NrLt          t          j(        |N |dd           |d          pd           j        t          j(                 _         |d          }O |d          }P|OrM|PrJt          j)         j        vr t                       j        t          j)        <   d j        t          j)                 _         j        t          j)                 j
                            |O|P |dd           |dd          d            |dd          }Q|Qr|Q j        t          j)                 j
        d<    |dd          }R|Rr|R j        t          j)                 j
        d<    |d          }S|SrLt          t          j)        |S |dd           |d          pd           j        t          j)                 _         |d          }T |d          }U|Tr
|Urt          j*         j        vr t                       j        t          j*        <   d j        t          j*                 _         j        t          j*                 j
                            |T|Ud            |dd          }V|Vr|V j        t          j*                 j
        d<    |d          }W|WrLt          t          j*        |W |dd           |d          pd           j        t          j*                 _         |d          }X |d          }Y|Xr|Yrt          j+         j        vr t                       j        t          j+        <   d j        t          j+                 _         j        t          j+                 j
                            |X|Y |dd           |dd           |dd           |dd           |dd          d            |d          }Z |d          }[|Zs|[rIt          j,         j        vr t                       j        t          j,        <   d j        t          j,                 _        |Zr|Z j        t          j,                 _         j        t          j,                 j
        }\|[r|[|\d<    |dd                                          }]|]r|]-                    d          |\d<    |dd                                          }^|^r|^-                    d          |\d<    |dd                                                                          }_|_r|_|\d<    |dd                                                                          }`|`r|`|\d<    |dd                                          }a|ar|a|\d<    |dd                                          }b|br|b|\d<    |dd                                          }c|cr|c|\d<    |dd                                          }d|drLt          t          j,        |d |dd           |d          pd           j        t          j,                 _         |d          }e |d          }f|er|frt          j.         j        vr t                       j        t          j.        <   d j        t          j.                 _         j        t          j.                 j
                            |e-                    d          |f |dd¦           |dd           |ddŦ          t           |dd=                    dǜ            |dȦ          }g|g3|g                                dv  j        t          j.                 j
        d<    |d˦          }h|hrx	 t_          j0        |h          }inC# tb          $ r6 d̄ |h2                    dd
          	                    d
          D             }iY nw xY w|i j        t          j.                 j
        d<    |dϦ          }j|jr_t          j.         j        v rLt          t          j.        |j |dd           |dѦ          pd           j        t          j.                 _         |dҦ          }k |dӦ          }l|ks|lrt          j3         j        vr t                       j        t          j3        <   d j        t          j3                 _         j        t          j3                 j
        }\|kr|k|\d#<   |lr|l|\d<    |dd                                          }m|mr|m|\d<    |dd                                          }n|nr|n|\d<    |dd                                          }od}p|osP |dd                                          }q|qr0|q}od}pti          j5        tl                                        dۦ           |orbt          t          j3        |o |dئ          p ||pd           |dܦ          p |dݦ          pd           j        t          j3                 _         |dަ          p
 |dߦ          }r |d          }s|rr|srt          j7         j        vr t                       j        t          j7        <   d j        t          j7                 _         j        t          j7                 j
        }\|r|\d#<   |s|\d%<    |d          }t|tr|t|\d<    |d          }u|ur|u|\d<    |d          }v|vr|v|\d<    |d          }w|wr|w|\d<    |d          }x|xrLt          t          j7        |x |dd           |d          pd           j        t          j7                 _         |d          }y|yr)|y                                                                |\d<    |d          }z|zr|z|\d<    |d          }{|{r)|{                                                                |\d<    |d          }|||r|||\d<    |d          }}|}r+	 t'          |}           j8        _9        n# t(          $ r Y nw xY w |d          }~|~r+	 t'          |~           j8        _:        n# t(          $ r Y nw xY w	 ddl;m<}  |             ddl=m>} |?                                D ]}	 t          |j@                  }n8# tb          $ r+}t2          A                    d|j@        |           Y d}~Id}~ww xY w j                            |          }|2|j        s+t-          |j
        pi                     d6d                    rd}|jB        P	 |B                                }n:# tb          $ r-}t2          A                    d|j@        |           d}Y d}~nd}~ww xY w||j        sJ|jC        B	 |/|}|j        s%t          dt          |j
        pi                     }nt          d          }t          |t                    rj|rht          t          |di           pi           }|G                                D ]"\  }}|dk    r|H                    ||           #t          d|          }t-          |C                    |                    }n:# tb          $ r-}t2          A                    d|j@        |           d}Y d}~nd}~ww xY w|s"t2          A                    d|j@                   L	 |I                                scn9# tb          $ r,}t2          A                    d|j@        |           Y d}~d}~ww xY w| j        vrt                       j        |<   d j        |         _        t          |t                    r|rt          |          }|%                    dd          } j        |         j
                            |           t          |t                    r|                    d          rt          |t          |d                   t          |                    d          pd          |                    d           rt          |d                    nd           j        |         _        n3# tb          $ r&}t2          A                    d|           Y d}~nd}~ww xY wt          jL        dd                                          }d} j                            t          jM                  }|<t          |j
                            d          pd                                          }|p|}|r3 |t          jM                  }|-                    d          |j
        d<    j        N                                D ]}|j
        %                    d6d           dS (  z/Apply environment variable overrides to config.r   r   c                     | j         vr%t          d          j         | <   j         |          S j         |          }t          |j                            dd                    }|j        s	|sd|_        |S )NTr  r  F)r   r  r6   ra   rh   r  )r   platform_configr  r  s      r$   _enable_from_envz._apply_env_overrides.<locals>._enable_from_env  s    6+++)7)E)E)EFX&#H-- *84  $O$9$=$=>QSX$Y$YZZ& 	+/C 	+&*O#r&   r  TELEGRAM_REPLY_TO_MODErl   >   allr   r  TELEGRAM_FALLBACK_IPSc                 ^    g | ]*}|                                 |                                 +S r   r!   )r   ips     r$   r  z(_apply_env_overrides.<locals>.<listcomp>  sD     E
 E
 E
RXXZZE
HHJJE
 E
 E
r&   ,fallback_ipsTELEGRAM_HOME_CHANNELTELEGRAM_HOME_CHANNEL_NAMEr   TELEGRAM_HOME_CHANNEL_THREAD_IDNr   r  DISCORD_HOME_CHANNELDISCORD_HOME_CHANNEL_NAMEDISCORD_HOME_CHANNEL_THREAD_IDDISCORD_REPLY_TO_MODEWHATSAPP_ENABLED>   r   r   r   FTr)  WHATSAPP_HOME_CHANNELWHATSAPP_HOME_CHANNEL_NAMEWHATSAPP_HOME_CHANNEL_THREAD_IDWHATSAPP_CLOUD_PHONE_NUMBER_IDWHATSAPP_CLOUD_ACCESS_TOKEN)rM  rN  WHATSAPP_CLOUD_APP_IDrZ  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   )rQ  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_idrX  MATRIX_E2EE_MODE)requiredrequireoptionalprefer	preferredMATRIX_ENCRYPTION
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)address	imap_host	smtp_hostEMAIL_HOME_ADDRESSEMAIL_HOME_ADDRESS_NAMEEMAIL_HOME_ADDRESS_THREAD_IDTWILIO_ACCOUNT_SID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_HOSTrC   c                 ^    g | ]*}|                                 |                                 +S r   r0  )r   origins     r$   r  z(_apply_env_overrides.<locals>.<listcomp>:  s2    iii&Z`ZfZfZhZhiv||~~iiir&   r  r  r  API_SERVER_MODEL_NAMEr  WEBHOOK_ENABLEDWEBHOOK_PORTWEBHOOK_SECRETr  MSGRAPH_WEBHOOK_ENABLEDMSGRAPH_WEBHOOK_PORTMSGRAPH_WEBHOOK_CLIENT_STATE"MSGRAPH_WEBHOOK_ACCEPTED_RESOURCES$MSGRAPH_WEBHOOK_ALLOWED_SOURCE_CIDRSrU  c                 ^    g | ]*}|                                 |                                 +S r   r0  )r   resources     r$   r  z(_apply_env_overrides.<locals>.<listcomp>x  sB       >>##    r&   accepted_resourcesc                 ^    g | ]*}|                                 |                                 +S r   r0  )r   cidrs     r$   r  z(_apply_env_overrides.<locals>.<listcomp>  s>       ::<<

  r&   allowed_source_cidrsDINGTALK_CLIENT_IDDINGTALK_CLIENT_SECRET)	client_idr[  DINGTALK_HOME_CHANNELDINGTALK_HOME_CHANNEL_NAMEDINGTALK_HOME_CHANNEL_THREAD_IDFEISHU_APP_IDFEISHU_APP_SECRETFEISHU_DOMAINr   FEISHU_CONNECTION_MODEr   )rZ  r]  domainr   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)bot_idr  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!  )corp_idcorp_secretagent_idr2   encoding_aes_keyr  r  r  WEIXIN_ACCOUNT_IDrH  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)rW  rX  rH  rJ  rL  send_read_receiptsBLUEBUBBLES_REQUIRE_MENTION>   r   r   r   r   r  BLUEBUBBLES_MENTION_PATTERNSc                 ^    g | ]*}|                                 |                                 +S r   r0  )r   parts     r$   r  z(_apply_env_overrides.<locals>.<listcomp>'	  s>     # # #zz||#JJLL# # #r&   
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  r   zunknown platform name %r: %sz#env_enablement_fn for %s raised: %s)r  ra   ra   r  u6   is_connected for %s raised: %s — skipping enablementuc   Plugin platform '%s' available but not configured (is_connected returned False) — skipping enablezcheck_fn for %s raised: %sr   r_   r   z&Plugin platform enable pass failed: %sGATEWAY_RELAY_URLr_  )Orp   rr   ru   r  r   r2   r"   r   r  splitra   r   r  r   r   r   r  r   r  rA   r<   r   r6   rh   r   r.   r/   r   r   r!   r   r-  r   r   r  rF  r   r  r   r   r   r   r   r   r   rstripr   r  loadsr   r   r   logging	getLoggerr   r   rd  r   r   r  r  r   r   r  r_   r  env_enablement_fnr  rQ   r   getattrr%  rb   check_fnr    r*   r+   r   values)r  r+   
getenv_intr+  telegram_tokentelegram_configtelegram_reply_modetelegram_fallback_ipstelegram_homediscord_tokendiscord_configdiscord_homediscord_reply_modewhatsapp_enabledwhatsapp_disabled_explicitlywa_cfgwhatsapp_home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_configr  
slack_home
signal_urlsignal_accountsignal_configsignal_homemattermost_tokenmattermost_urlmattermost_configmattermost_homematrix_tokenmatrix_homeservermatrix_configmatrix_usermatrix_passwordmatrix_e2ee_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api_server_explicitoriginsapi_server_model_namewebhook_enabledrJ  webhook_secretmsgraph_webhook_enabledmsgraph_webhook_portmsgraph_webhook_client_statemsgraph_webhook_resourcesmsgraph_webhook_allowed_cidrs	resourcescidrsdingtalk_client_iddingtalk_client_secretdingtalk_homefeishu_app_idfeishu_app_secretfeishu_encrypt_keyfeishu_verification_tokenfeishu_homewecom_bot_idwecom_secretwecom_ws_url
wecom_homewecom_callback_corp_idwecom_callback_corp_secretweixin_tokenweixin_account_idra   weixin_base_urlweixin_cdn_base_urlweixin_dm_policyweixin_group_policyweixin_allowed_usersweixin_group_allowed_usersweixin_split_multilineweixin_homebluebubbles_server_urlbluebubbles_passwordbluebubbles_require_mentionbluebubbles_mention_patternsparsed_patternsbluebubbles_home	qq_app_idqq_client_secretqq_allowed_usersqq_group_allowedqq_homeqq_home_name_envlegacy_homeyuanbao_app_idyuanbao_app_secretyuanbao_bot_idyuanbao_ws_urlyuanbao_api_domainyuanbao_route_envyuanbao_homeyuanbao_dm_policyyuanbao_dm_allow_fromyuanbao_group_policyyuanbao_group_allow_fromr   
reset_hourr  r   r  r   r  existing_cfgseed_for_probe	probe_cfgprobe_extrar  r  
configuredexcseedhomerelay_url_envrelay_url_yamlexisting_relayrelay_url_valrelay_configr*  s   `                                                                                                                                                   r$   r  r    s(   FJ8       $ V011N /**8+<== . !&!92>>DDFF555F$4442@2B2BFX./<O*+9"F#:B?? 
F$4442@2B2BFX./E
 E
!6!<!<S!A!AE
 E
 E
*+1.A F233M 
*f.>>>;F&!4f==f>??G4	<
 <
 <
*+8 F.//M -))(*:;;,6011L 
(F,<<<:E% 3V<<f=>>F$	;
 ;
 ;
)*7   7<<BBDD4446#3331?1A1AFX-.;M)*8 'vv.@"'E'EFF#)6*<b#A#A#G#G#I#IMa#a F,,,!("34' 	""FNN 	"!FN	 K.<T.J.J.J*+F233M 
*f.>>>;F&!4f==f>??G4	<
 <
 <
*+8 %f%EFF!6"?@@ 'b#7 'b"&*:::8F8H8HFX45<@019017>>60@
 @
 	 	 	
 !&!899 	XHWFX45;HE$f%@AA 	`L_FX45;LI!6":;; 	ZIYFX45;IF &'D E E  	dNcFX45;NK<== 	\N[FX45;NK<== 	RUVcRdRd !89?OO   <== 	\N[FX45;NK%v&BCC 	bMaFX45;MJ &!>?? 
x6&:JJJAL,':FCCfDEEM	B
 B
 B
01> &*++K =>!111/=/?/?FX^,7;FX^,44!+HN;L $((:(>(>?RTY(Z(Z#[#[ ' ,0D , (,$ 2=(.,--J 
hn(8888C^1266f;<<D	9
 9
 9
(5 )**JV,--N n ((99"""%-ff5Lf.U.UVV$
 $
 	 	 	
 &.//K 
x&*:::9D_2F;;f<==E	:
 :
 :
)6 v011 8 0"55 	QNNOPPP,,X-@AA"2)7&f677O 
8.&2BBB=H(#6??f@AAIT	>
 >
 >
,-: 6/00L2B77 @vv/00 @  	gNNefff((99 	/".M,=L)f-r22 	9-8M	* &!2B77 	>.=M
+!6"4b99??AAGGII ZZ @vv&92>>?? 	 -8L) 	@/?M,!6"4b99 	@/?M,&+,,K 
x&*:::9D_/88f9::Bd	:
 :
 :
)6 %%J M!)9997E7G7GFX34;?/089C/066*%% 	MDLFX34:5A ((J'((I)**J)**J
J	:z:;; >!111/=/?/?FX^,37(0(.55!##7
 7
 	 	 	
 ,--J 
hn(8888C^16::f;<<D	9
 9
 9
(5 ,--J Q<v///-;-=-=FX\*15&.178KR1P1P&.v())H 
HLF$4446A\/88f9::Bd	7
 7
 7
&3 )0Db)I)IJJV,b11N$f%>CCf.//Of.//O ".11 ^f&6664B4D4DFX01 %.x/BCIMMNachii" 	Af&6x7J&K&S 	A<@FX019 	PAOFX017>" 	Vii4K4Q4QRU4V4ViiiG VNU !45;NK 	FI/FZFZ !45;FCC    	RBQFX017? &'> C C  	^H]FX017E &ff->&C&CDDO6.))LV,b11N 
P6#3331?1A1AFX-.59)*2 	CF|CTCT !128@@    	PAOFX-.4X> .ff5NPR.S.STT!6"899#)6*H"#M#M  &'KR P P$*F.% %! 	 *#v'777 8' 8 % 8 )	 8 #6+;;;9G9I9IFX56" 	FAEFX56> 	KN(L L !9:@HH    ' 	, X56<^L % 		  9 ? ? D D  I
     !9:@( ) 		 9??DD  E
     !9:@*
   455#V$<== 4 F$4442@2B2BFX./6:*+3*+188+3:
 :
 	 	 	 677 	?J!*%V8&AA &!BCCKt	@ @ @FX./< F?++M233 * ?&"2220>0@0@FX_-48)1)/66#+f_h77%v&>LL	8
 8
 	 	 	 $V$8"== 	XEWFX_-3MB$*F+F$K$K!$ 	fLeFX_-34HIf233 	=H!#V6?? &!@AAIT	> > >FX_-: 6.))L6.))L  >!111/=/?/?FX^,37(0(.55""7
 7
 	 	 	 v3R88 	SFRFX^,2?CV011
 	<G!"V5v>> &!?@@HD	= = =FX^,9 $V$<==!'(D!E!E "< "&*:::8F8H8HFX45<@019017>>-58"==V2B77 &'H" M MF0)<<J4d;;@
 @
 	 	 	 6.))L233 %( %?&"2220>0@0@FX_-48)1 	C6BFX_-3 17 	4"3E, &!2B77==?? 	< / 6 6s ; ;E*$f%:B??EEGG 	D$7$>$>s$C$CE.!!6"4b99??AAGGII 	2!1E+$f%:B??EEGGMMOO 	8$7E.!%v&<bAAGGII 	7"6E,%+V,H"%M%M%S%S%U%U"% 	C(BE$%!'(I2!N!N!T!T!V!V! 	G0FE,-f2B77==?? 	=H!#V6?? &!@AAIT	> > >FX_-: $V$<==!6"899 _"6 _v'7775C5E5EFX129=-.6-.4;;077<<,"F#={KK&J'A4HH"F#=?UVV"1&&9Y[a2b2b"c"c=
 =
 	 	 	 '-f-J&K&K#&2+11337QQ X1289JK (.v.L'M'M$' 		_"&*-I"J"J   # # < D DT3 O O U UVY Z Z# # # P_FX1289KLv899 
H0F4DDD>I)$7@@fABBJd	?
 ?
 ?
-.; {##Iv011 %$ %>!111/=/?/?FX^,37(0 06 	('E(O 	6%5E/"!6"4b99??AA 	3"2E,!6":B??EEGG 	9(8E$%&-r2288::4 		 &!2B77==??K %#9 !(++33J    
	<G!V566Z&&AQSY:Z:ZF9:: v9::	= 	= 	=FX^,9 V,--J8I1J1JN 455 &A, &A6#3331?1A1AFX-.59)*2 !128(h0l 011 	-,E(O 011 	-,E(O#V$899 	5"4E,"F#677 	3!2E+v455 	>I!)$V7@@ &!ABBJd	? ? ?FX-.; #F#677 	C!2!8!8!:!:!@!@!B!BE+ &'> ? ?  	;%:E/"%v&<== 	I$8$>$>$@$@$F$F$H$HE.!#)6*D#E#E # 	A(@E$% 6011L 	7:<7H7HF'44 	 	 	D	 ,--J 	25j//F'// 	 	 	D	*FB777777??????&5577 @	 @	E#EJ//   ;UZKKK "+//99L ($, ),,2778KUSSTT )  "N&2*%*%<%<%>%>NN  * * *LL=uz1   &*NNNNNN	* #<+?#%1$+ (3(4I#,#4 ",:,0*.y/D"*E*E-" -" -"	
 )7t(D(D(DI%nd;;   +/wy'2/N/N/TRT*U*UK(6(<(<(>(> = =1#$#6#6$, + 6 6q! < < < <(6(,&1) ) )I &*%*<*<Y*G*G%H%H

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





+ & !P!J  
 !~~''    95:qIII v///-;-=-= *15FX&. .$// N N++ xx55 *077===dD)) 
dhhy.A.A 
>I!) #DO 4 4 &!1!1!;V<<  $xx44&C[ 1222!%	? 	? 	?F$X.;o@	B  B B B=qAAAAAAAAB I1266<<>>MN%))(.99N!^155kBBHbIIOOQQ!3^M D''77*7*>*>s*C*C;'!+2244 = =!!"5t<<<<= =s  ;,U( (
U54U5,{ 
{{., 
('(C,AC3 C3
AD C?AD fAf' f'=Ag'g&Ag'xAx x
Ax+x*Ax+x<Ay y
Ay#y"Ay#y'-BI1 zAz*z)BI1 z*
A{z4!A{{BI1 {A{{ABI1 |:A}}BI1 }
A~}#A~}<BI1 ~A~~BI1 ~C"BA?A>BI1 A?
BB6B	#BB1B,BI1 B1BB6B6'BI1 CBC5C2BI1 C5
BD+C?!BD&D BI1 D&BD+D+EBI1 I1
BJ!I;BJJBJ!)T)r   r'   )rI   )rS   )rZ   rn   )rl   )r  rc  r   N)_r   r   r*   r  pathlibr   dataclassesr   r   r   r   typingr   r	   r
   r   r   enumr   hermes_cli.configr   agent.secret_scoper   r   rf   utilsr   r  r   r.   r6   r%   	frozensetr,   r-   r3   r    r8   r:   r>   rA   rB   rH   rN   rO   rR   rY   r]   rQ   r   rd   rk   rp   rr   rs   r   r   ru   __members__r  _BUILTIN_PLATFORM_VALUESr   r   r   r   r   r  r   r   r   r   r   r   r  r  r,  r-  r.  r0  r   rF  r   r   r   r   r   r   r   r   r   ra  rc  r  r  r  r   r&   r$   <module>r     s      				        > > > > > > > > > > > > 6 6 6 6 6 6 6 6 6 6 6 6 6 6       - - - - - - N N N N N N N N ! ! ! ! ! !		8	$	$3 3 3d 3d 3 3 3 3$ &I&@&@&@AA $9%@%@%@AA    :0c 0c 0 0 0 0" u     s S S    ! !3 !8C= ! ! ! !H !.  >% %%%% % % %P4 4S#X 4 4 4 4
 s S c     c C s     C E$PT*DU    $ #  #    $/ /c /C / / / / /
c C C     26 # 5 5 5` ` ` ` `t ` ` `J %9$T$Th6J6Q6Q6S6S$T$T$TTT   )y 
* 
* 
* 
  
  " i2 S#X   
  HTN d     
 
 
 
 
 
 
 
D 6
 6
 6
 6
 6
 6
 6
 6
r 
 
 
 
 
 
 
 
P +)N%+O*O^3 $z3/    q
 q
 q
 q
 q
 q
 q
 q
r *-  , , ,*, "C , , , & # & & & [
 [
 [
 [
 [
 [
 [
 [
J1F 1t 1 1 1 1" O      O@@   &&      N      N  9R d8X~6F6L-M#MN   D g g g g g g g gTs] s s s sl;( ;( ;( ;(|_= _=4 _= _= _= _= _= _=r&   