
    `gj                       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j6                  e      ZdTd
ededefdZ e h d      Z! e h d      Z"dUd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+	 dVd
ede$de(fdZ,d
edee$ef   fdZ-dWd
ede$de$fdZ.dXd
ede$de$fdZ/de0de$de1e0e0f   fdZ2dYde$dee$   dee$   fdZ3dZd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$ e9jt                  jw                         D              Z< e h d%      Z=d&d'iZ>e0e$e$f   e8d(<   dYd)e$d*ee0   defd+Z?e G d, d-             Z@e G d. d/             ZAe G d0 d1             ZBe9j                  d2e9j                  d3e9j                  d4e9j                  d5e9j                  d6e9j                  d7iZIe0d#e$f   e8d8<   e G d9 d:             ZJd;ZKe&e8d<<   d=ZLe(e8d><   d?ZMe$e8d@<   e G dA dB             ZNe9j                  dC e9j                  dD e9j                  dE e9j                  dF e9j                  dG e9j                  dH e9j                  dI e9j                  dJ e9j                  dK e9j                  dL i
ZXe0e9eeJgef   f   e8dM<   e G dN dO             ZYdeYfdPZZd[dRZ[dQeYddfdSZ\y)\z
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_valuevaluedefaultreturnc                     | |S t        | t              r*| j                         j                         }|dv ry|dv ry|S t	        | |      S )zDCoerce bool-ish config values, preserving a caller-provided default.>   1onyestrueT>   0noofffalseF)r   )
isinstancestrstriplowerr   )r   r   lowereds      A/root/.hermes/venv/lib/python3.12/site-packages/gateway/config.py_coerce_boolr%      sT    }%++-%%'00115'22    >   r   r   r   r   >   r   r   r   r   c                      t        j                  d      } | y| j                         j                         }|sy|t        v ry|t
        v ryt        j                  d| t        t              t        t
                     y)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_overrider2   0   sy     ))0
1C
{IIKE))((
NN	C()'( r&   c                     | yt        | t              r| rdS dS t        |       j                         j	                         xs 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"``.
    autor   )r   boolr    r!   r"   r   s    r$   _normalize_transport_tokenr7   M   sD     }%v)E)u:##%//r&   c                 P    | |S 	 t        |       S # t        t        f$ r |cY S w xY w)z>Coerce numeric config values, falling back on malformed input.)float	TypeError
ValueErrorr   r   s     r$   _coerce_floatr=   ^   s4    }U|z"    
 %%c                 P    | |S 	 t        |       S # t        t        f$ r |cY S w xY w)z>Coerce integer config values, falling back on malformed input.)intr:   r;   r<   s     r$   _coerce_intrA   h   s4    }5zz" r>   keyc                    | yt        | t              rt        j                  d||        y	 t        | t              r'| j                         st        |       t        |       }n6t        | t              rt        | j                         d      }nt        |       }|dk  ry|S # t        t        f$ r t        j                  d||        Y yw xY w)zCoerce an optional positive integer config value.

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

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

 s   A-B" "&C
Cic                 B   | yt        | t              rt        j                  d|       yt        | t              r| }n~t        | t
              rW| j                         }|r |j                         r|j                         st        j                  d|       y	 t	        |d      }nt        j                  d|       y|dk(  ryd|cxk  r	t        k  sn t        j                  d|t               y|S # t        t        t        f$ r t        j                  d|       Y yw xY w)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.
    r   z1Ignoring invalid %s (expected a positive integer)rD   z6Ignoring invalid %s (expected an integer from 1 to %d))r   r5   r-   r.   r@   r    r!   isascii	isdecimalr:   r;   OverflowError_SYSTEMD_WATCHDOG_MAX_SECONDS)r   rB   rF   r0   s       r$   coerce_systemd_watchdog_secondsrM      s     }%JCP%	E3	kkm#++-s}}NNNPST	b\F
 	JCP{v666D)	

 M :}5 	NNNPST	s   C1 1*DDc                 *    t        | t              r| S i S )z=Return *value* when it is a mapping, otherwise an empty dict.)r   dictr6   s    r$   _coerce_dictrP      s    ud+533r&   c                 n    t        | t              r$| j                         j                         }|dv r|S |S )z8Normalize unauthorized DM behavior to a supported value.>   pairignorer   r    r!   r"   r   r   
normalizeds      r$   #_normalize_unauthorized_dm_behaviorrW      s4    %[[]((*
++Nr&   c                 n    t        | t              r$| j                         j                         }|dv r|S |S )z4Normalize notice delivery mode to a supported value.>   publicprivaterT   rU   s      r$   _normalize_notice_deliveryr[      s4    %[[]((*
..Nr&   platforms_datanamec                     | j                  |i       }t        |t              si }|| |<   |j                  di       }t        |t              si }||d<   ||fS )a  Get-or-create ``platforms_data[name]`` and its nested ``extra`` dict.

    Both slots are coerced to ``{}`` if a non-dict value is encountered, so
    callers can safely write keys without type-checking.  Returns
    ``(plat_data, extra)`` for in-place mutation.
    extra)
setdefaultr   rO   )r\   r]   	plat_datar_   s       r$   _ensure_platform_extra_dictrb      se     ))$3Ii&	(t  "-EeT""	'er&   c                     t               t        | d      }||S |S t        j                  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$   _getenvri      sK     )d+	%1y>w>jjnnT"GNr&   c                 &    t        | |      }||S |S N)ri   )r]   r   vals      r$   _getenv_strrm      s    
$
 C/3.w.r&   c                     t        | d       }||S 	 t        t        |      j                         d      S # t        t
        f$ r |cY S w xY w)NrD   )ri   r@   r    r!   r:   r;   )r]   r   r0   s      r$   _getenv_intro     sN    
$
C
{3s8>>#R((z" s   "5 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y)Platforma?  Supported messaging platforms.

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

        Creates a pseudo-member cached in ``_value2member_map_`` so that
        ``Platform("irc") is Platform("irc")`` holds True (identity-stable).
        Arbitrary strings are rejected to prevent enum pollution.
        N-_ r   platform_registry)r   r    r!   r"   _value2member_map_rp   _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  sm    %%U[[]##%C***))%00
 +2.1.P.P.R+33^^C(F"FN!KKM11#s;CCCMFM,2C""5).4CV]]+M
	C ..u5,!& % 5 5c3 ? G GS Q06&&u-28  / 6   		s   7BF 	FFr   c                    t               }	 t        t              j                  j                  dz  dz  }|j	                         r|j                         D ]w  }|j	                         s|dz  j                         s(|dz  j                         s|dz  j                         sO|j                  |j                  j                                y |S # t        $ r Y |S w xY w)zFReturn names of bundled platform plugins under ``plugins/platforms/``.plugins	platformsz__init__.pyzplugin.yamlz
plugin.yml)setr   __file__parentis_diriterdirexistsaddr]   r"   r   )r   namesplatforms_dirchilds       r$   r   z'Platform._scan_bundled_plugin_platforms]  s     U	 N11889D{RM##%*224 	6E"]2::<"]2::< % 4<<> 		%**"2"2"45	6   		s$   AC )C =&C $+C 	CCN) __name__
__module____qualname____doc__LOCALTELEGRAMDISCORDWHATSAPPWHATSAPP_CLOUDSLACKSIGNAL
MATTERMOSTMATRIXHOMEASSISTANTEMAILSMSDINGTALK
API_SERVERWEBHOOKMSGRAPH_WEBHOOKFEISHUWECOMWECOM_CALLBACKWEIXINBLUEBUBBLESQQBOTYUANBAORELAYclassmethodr   r   r    r&   r$   rr   rr     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&   rr   c              #   4   K   | ]  }|j                     y wrk   r6   ).0ms     r$   	<genexpr>r   u  s     $TQWW$Ts   >	   r~   liner   r   r   r   r   rw   r   r   r   PORT_BINDING_CONDITIONAL_MODESplatform_valuer_   c                     | t         vryt        j                  |       }|@t        |xs i j                  dd            j	                         j                         }||k(  S y)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.
    Fconnection_mode	websocketT)PORT_BINDING_PLATFORM_VALUESr   rf   r    r!   r"   )r   r_   expected_modeactuals       r$   platform_binds_portr     sb     99266~FM ekr&&'8+FGMMOUUW&&r&   c                   ~    e Zd ZU dZeed<   eed<   eed<   dZee   ed<   de	ee
f   fdZed	e	ee
f   dd fd
       Zy)HomeChannela@  
    Default destination for a platform.
    
    When a cron job specifies deliver="telegram" without a specific chat ID,
    messages are sent to this home channel. Thread-aware platforms may also
    store a thread/topic ID so the bare platform target routes to the exact
    conversation where /sethome was run.
    platformchat_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@    ++||II

 >>"&..F;r&   datac           	           | t        |d         t        |d         |j                  dd      |j                  d      rt        |d               S d       S )Nr   r   r]   Homer   r   r   r]   r   )rr   r    rf   r   r   s     r$   	from_dictzHomeChannel.from_dict  s_    d:./Y(&&)040Ec${+,	
 	
 LP	
 	
r&   )r   r   r   r   rr   __annotations__r    r   r
   r   r   r   r   r   r   r&   r$   r   r     se     L
I#Ix}#c3h  
T#s(^ 
 
 
r&   r   c                       e Zd ZU dZdZeed<   dZeed<   dZ	eed<   dZ
eed	<   d
Zeed<   dZeed<   deeef   fdZedeeef   dd fd       Zy)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                  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  sA    II|| --kk(,T-J-J(K(,(E(E
 	
r&   r   c           	      X   t        |      }|j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  d      } | ||nd||nd||nd	t        |d
      |t        |      nd||      S d      S )Nr   r   r   r   r   r   r   r   r   Tr   r   r   )rP   rf   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XX89
)v&2G)5)At-7>7JU7^Pi3=3IZ
 	
 PR
 	
r&   N)r   r   r   r   r   r    r   r   r@   r   r   r5   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y)
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                     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  sV     ::!::CL==$"mmC
O)#'#5#5C 
r&   r   c                     |s |        S  | |j                  d      |j                  d      |j                  d            S )Nr   r  r  r  )rf   r   s     r$   r   zChannelOverride.from_dict  s=    5L((7#XXj)((?3
 	
r&   )r   r   r   r   r   r
   r    r   r  r  r   r   r   r   r   r   r&   r$   r   r     sr      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                       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y)PlatformConfigz.Configuration for a single messaging platform.FenabledNr1   api_keyhome_channelfirstreply_to_modeTgateway_restart_notificationtyping_indicatortyping_status_textdefault_factorychannel_overridesr_   r   c                    | j                   | j                  | j                  | j                  | j                  d}| j
                  | j
                  |d<   | j                  r| j                  |d<   | j                  r| j                  |d<   | j                  r| j                  j                         |d<   | j                  r?| j                  j                         D ci c]  \  }}||j                          c}}|d<   |S c c}}w )N)r  r_   r  r  r  r  r1   r  r  r  )r  r_   r  r  r  r  r1   r  r  r   r  items)r   r   cidovs       r$   r   zPlatformConfig.to_dict`  s    ||ZZ!//,0,M,M $ 5 5
 "".+/+B+BF'(::"jjF7O<< $F9%)%6%6%>%>%@F>"!!151G1G1M1M1O+&-c2RZZ\!+F&' +s   Dr   c                 T   t        |      }d }t        |j                  d      t              rt        j                  |d         }t        |j                  di             }|j                  d      }||j                  d      }|j                  d      }||j                  d      }|j                  d      }||j                  d      }i }|j                  d      xs i }t        |t              rJ|j                         D ]7  \  }	}
t        |
t              st        j                  |
      |t        |	      <   9  | t        |j                  d      d      |j                  d	      |j                  d
      ||j                  dd      t        |d      t        |d      |||
      S )Nr  r_   r  r  r  r  r  Fr1   r  r  r  T)
r  r1   r  r  r  r  r  r  r  r_   )
rP   r   rf   rO   r   r   r  r   r    r%   )r   r   r  r_   _grn_typing_typing_textr  raw_overridesr  ov_datas              r$   r   zPlatformConfig.from_dictv  s   D!dhh~.5&00n1EFL TXXgr23xx67<99;<D
 ((-.?ii 23G xx 45 99%9:L8:!45;mT* - 3 3 5 UWgt,2A2K2KG2T%c#h/U  )!4e<((7#HHY'%((?G<)5dD)A)'48+/
 	
r&   )r   r   r   r   r  r5   r   r1   r
   r    r  r  r   r  r  r  r  r   rO   r  r   r   r_   r   r   r   r   r   r&   r$   r  r  3  s    8GTE8C=!GXc]!*.L(;'. !M3  *. $- "d! )-, 5:$4OtC01O "$7E4S>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y)StreamingConfigzCConfiguration for real-time token streaming to messaging platforms.Fr  r4   	transportedit_intervalbuffer_thresholdcursor        fresh_final_after_secondsr   c                     | j                   | j                  | j                  | j                  | j                  | j
                  dS )Nr  r*  r+  r,  r-  r/  r1  r   s    r$   r   zStreamingConfig.to_dict  s<    ||!// $ 5 5kk)-)G)G
 	
r&   r   c                    t        |t              r|s |        S |j                  d      }|j                  d      }||n|}t        |      }d|v rt	        |j                  d      d      }n|t        |      dk7  }nd} | ||t        |j                  d      t              t        |j                  d      t              |j                  dt              t        |j                  d	      d
            S )Nr*  r   r  Fr   r+  r,  r-  r/  r.  r1  )
r   rO   rf   r7   r%   r=   r%  rA   r&  r'  )r   r   raw_transportraw_modepickedr*  r  s          r$   r   zStreamingConfig.from_dict  s    $%T5L  -88F# #0";.v6	"488I#6>G! 1:eCGG')+J )+,.P 88H&>?&345s'
 	
r&   N)r   r   r   r   r  r5   r   r*  r    r%  r+  r9   r&  r,  r@   r'  r-  r/  r   r   r   r   r   r   r&   r$   r)  r)    s    MGT" Is:M5:>c>*FC* (+u*
c3h 
 0
T#s(^ 0
0A 0
 0
r&   r)  c                     t        | j                  j                  d      xr) | j                  xs | j                  j                  d            S )N
account_idr1   )r5   r_   rf   r1   cfgs    r$   <lambda>r:    s6    		l#M)LciimmG6L" r&   c                     t        | j                  j                  d      xr | j                  j                  d            S )Nphone_number_idaccess_tokenr5   r_   rf   r8  s    r$   r:  r:    s.    		'(JSYY]]>-J* r&   c                 J    t        | j                  j                  d            S )Nhttp_urlr>  r8  s    r$   r:  r:    s    ciimmJ&?!@ r&   c                      yNTr   r8  s    r$   r:  r:         r&   c                      yrB  r   r8  s    r$   r:  r:  !  rC  r&   c                     t        t        | j                  j                  d      xs d      j	                               S )Nclient_state )r5   r    r_   rf   r!   r8  s    r$   r:  r:  "  s.    $CIIMM.)/R0668+ r&   c                     t        | j                  j                  d      xr | j                  j                  d            S )N
server_urlpasswordr>  r8  s    r$   r:  r:  %  s-    d		l#A		j(A' r&   c                     t        | j                  j                  d      xr | j                  j                  d            S )Napp_idclient_secretr>  r8  s    r$   r:  r:  (  s-    		hBCIIMM/$B! r&   c                     t        | j                  j                  d      xr | j                  j                  d            S )NrL  
app_secretr>  r8  s    r$   r:  r:  +  s-    $		h?CIIMM,$?# r&   c                     t        | j                  j                  d      xs | j                  j                  d            S )N	relay_urlurlr>  r8  s    r$   r:  r:  2  s-    		k":ciimmE&:! r&   _PLATFORM_CONNECTED_CHECKERSc                      e Zd ZU dZ ee      Zeee	f   e
d<    ee      Zee
d<    ee      Zeeef   e
d<    ee      Zeeef   e
d<    ed       Zee   e
d<    ee      Zeeef   e
d	<    ed
       Zee
d<   dZee
d<   dZee
d<   dZee
d<   dZee
d<   dZee
d<   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-Z3y)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$   r:  zGatewayConfig.<lambda>H  s    vx>P r&   reset_triggersquick_commandsc                      t               dz  S )Nsessionsr   r   r&   r$   r:  zGatewayConfig.<lambda>N  s    7H: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_secondsrR   unauthorized_dm_behavior	streamingZ   session_store_max_age_daysprofile_routesr   c                 8    t        | j                        | _        y rk   )rM   rj  r   s    r$   __post_init__zGatewayConfig.__post_init__  s    (G)))
%r&   c                     g }| j                   j                         D ]6  \  }}|j                  s| j                  ||      s&|j	                  |       8 t        |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 rk   )r    r   )ps    r$   r:  z7GatewayConfig.get_connected_platforms.<locals>.<lambda>  s    s177| r&   )rB   )r   r  r  _is_platform_connectedappendr/   )r   	connectedr   configs       r$   get_connected_platformsz%GatewayConfig.get_connected_platforms  sb     	 $ 4 4 6 	+Hf>>**8V<  *		+
 i%;<<r&   r   rx  c                 P   |t         j                  k(  rOt        |j                  j	                  d      xr) |j
                  xs |j                  j	                  d            S |j
                  s|j                  ryt        j	                  |      }| ||      S 	 ddlm	} 	 ddl
m}  |        |j	                  |j                        }|r;|j                  |j                  |      S |j                  |j                  |      S y	 y# t        $ r Y ew xY w# t        $ r Y yw xY w)z;Check whether a single platform is sufficiently configured.r7  r1   Tr   r   discover_pluginsF)rr   r   r5   r_   rf   r1   r  rS  r   r   hermes_cli.pluginsr|  r   r   is_connectedvalidate_config)r   r   rx  checkerr   r|  entrys          r$   ru  z$GatewayConfig._is_platform_connected  s$    x&  . @\\>V\\%5%5g%>  <<6>> /228<6?"	C? " &))(..9E%%1 --f55((4 0088      		s<   D #D
 09D *D 
	DD DD 	D%$D%c                 V    | j                   j                  |      }|r|j                  S y)z$Get the home channel for a platform.N)r   rf   r  )r   r   rx  s      r$   get_home_channelzGatewayConfig.get_home_channel  s(    ##H-&&&r&   session_typec                     |r|| j                   v r| j                   |   S |r|| j                  v r| j                  |   S | j                  S )z
        Get the appropriate reset policy for a session.
        
        Priority: platform override > type override > default
        )rX  rW  rV  )r   r   r  s      r$   get_reset_policyzGatewayConfig.get_reset_policy  sT     D$:$::))(33 LD,>,>>%%l33(((r&   c                 F   i d| j                   j                         D ci c]   \  }}|j                  |j                         " c}}d| j                  j                         d| j
                  j                         D ci c]  \  }}||j                          c}}d| j                  j                         D ci c]   \  }}|j                  |j                         " c}}d| j                  d| j                  dt        | j                        d| j                  d	| j                  d
| j                  d| j                  d| j                  d| j                   d| j"                  d| j$                  d| j&                  d| j(                  | j*                  | j,                  j                         | j.                  | j0                  D cg c]*  }t3        |      rt5        |t6              st9        |      n|, c}dS c c}}w c c}}w c c}}w c c}w )Nr   rV  rW  rX  r\  r]  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  )rk  rl  rn  ro  )r   r  r   r   rV  rW  rX  r\  r]  r    r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rn  ro  r   r   typer   )r   rt  ckvrs         r$   r   zGatewayConfig.to_dict  s=   
151E1E1G)-A$
 #D$=$=$E$E$G	

 +/+=+=+C+C+E#'1a199;
  151G1G1M1M1O")-A$"
 d11
 d11
 C 1 12
 "4#;#;
  5 5
  '(E(E!
" 4++#
$ #D$=$=%
& &t'C'C'
( '(E(E)
* &t'C'C+
, !$"9"9-
. '(E(E/
0 )-(E(E//1*.*I*I ,, *!_Z45Hq	aO7
 	
"&s   %H
H
?%H
/Hr   c                 	   t        |      }i }t        |j                  di             }|j                         D ]:  \  }}t        |t              s	 t        |      }t        j                  |      ||<   < i }t        |j                  di             j                         D ]  \  }}	t        j                  |	      ||<    i }
t        |j                  di             j                         D ])  \  }}		 t        |      }t        j                  |	      |
|<   + t               }d|v rt        j                  |d         }t               dz  }d|v rt        |d         }|j                  di       }t        |t              si }|j                  d      }|Bt        |j                  d	      t              r!|j                  d	i       j                  d
      nd }|j                  d      }|Bt        |j                  d	      t              r!|j                  d	i       j                  d      nd }|j                  d      }|j                  d      }|j                  d      }t        |j                  d      t              r|j                  d      ni }d|v r|j                  d      }d}n|j                  d      }d}t        ||      }|!t        |t              r|j                  d      }t               }||}d|v r|j                  d      }d}n|j                  d      }d}t        ||      }t        |j                  d      d      }	 t!        |j                  dd            }t#        |d      }ddlm}  ||j                  d      xs g       } | d%i d|d|d|d|
d|j                  dddg      d|d|dt+        |j                  d      d       d!t+        |j                  d!      d       d"t+        |j                  d"      d       dt+        |d       dt+        |d       dt+        |d       dt+        |d#      dt+        |d#      d|d|d|d$t,        j                  |j                  d$i             d|d|S # t        $ r Y ]w xY w# t        $ r Y w xY w# t$        t        f$ r d}Y Lw xY w)&Nr   rW  rX  rV  r_  r`  r]  rd  sttr  re  echo_transcriptsrf  rg  ri  gatewayrj   gateway.systemd_watchdog_secondsrh  zgateway.max_concurrent_sessionsrk  rR   rn  rm  r   )parse_profile_routesro  r\  rZ  r[  ra  Trb  rc  Frl  r   )rP   rf   r  r   rO   rr   r  r   r;   r   r   r   rM   r2   rG   rW   r@   maxr:   gateway.profile_routingr  r%   r)  )r   r   r   r\   platform_nameplatform_datar   rW  	type_namepolicy_datarX  default_policyr`  r]  rd  re  rf  rg  ri  nested_gatewaysystemd_watchdog_rawsystemd_watchdog_keyrj  env_multiplexmax_concurrent_rawmax_concurrent_keyrh  rk  rn  r  ro  s                                  r$   r   zGatewayConfig.from_dict  sE   D!	%dhh{B&?@,:,@,@,B 	(M=mT2#M2&4&>&>}&M	(#	 &2488OR3P&Q&W&W&Y 	Q"I{'9'C'CK'PM)$	Q *6txx@SUW7X*Y*_*_*a 	&M;#M2.@.J.J;.W!(+	 ,-!T)/99$?U:VWN&(:5T!^ 45L"2B7.$/Nhh}-@J488TY?\`@a$((5"-11)<gkK#xx(>?' dhhuot4 #''(:; ! #'((+D"E#'88,F#G !XX&:;0:488I;NPT0U),[]%-#'88,F#G #= #1#5#56P#Q #E #B "6$
  %*^T*J "0!3!34H!I 9:$!.$,!%*C!D!:!/!3!34M!N!B"?#
 $GHH/0$
 
	,),TXX6RTV-W)X&),-G)K&
 	A-dhh7G.H.NBO 

!/
 (
 0	

  88$4vx6HI
 *
 &
 !-TXX6K-Ld S
 *$((3E*FM
 &234d&
 %[$7
 "..BD!I
 %11H$$O
  &22JE%R!
"  ,,>F#
$ &>%
& %<'
( &>)
* &//b0IJ+
, (B-
. */
 	
y    R :& 	,)+&	,s6   #R
3#R'R* 
	RR	R'&R'*R?>R?c                     |rn| j                   j                  |      }|r=d|j                  v r/t        |j                  j                  d      | j                        S |t
        j                  k(  ry| 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.
        rk  rS   )r   rf   r_   rW   rk  rr   r   r   r   platform_cfgs      r$   get_unauthorized_dm_behaviorz*GatewayConfig.get_unauthorized_dm_behavior  st     >>--h7L :l>P>P P: &&**+EF11  8>>),,,r&   c                     |rP| j                   j                  |      }|r3d|j                  v r%t        |j                  j                  d      d      S y)z9Return the effective notice-delivery mode for a platform.notice_deliveryrY   )r   rf   r_   r[   r  s      r$   get_notice_deliveryz!GatewayConfig.get_notice_delivery  sT    >>--h7L 1\5G5G G1 &&**+<=  r&   )r   N)NNrk   )4r   r   r   r   r   rO   r   r   rr   r  r   r   rV  rW  r    rX  r\  r	   r]  r   r`  r   ra  r5   rb  rc  rd  re  rf  rg  rh  r
   r@   ri  rj  rk  r)  rl  rn  r   ro  rq  ry  ru  r   r  r  r   r   r   r  r  r   r&   r$   rU  rU  8  sX    16d0KItHn,-K 05EW/X,X383NM4//0N<ARV<WtH&889W !&6P QNDIQ &+4%@NDcN@ /UVL$V !%$ "d! &*d) K!%$% %)T(%*d*-1Xc]1  %$ %&c% %+c* "'!GIG ')(
 !6ND6

=h ="(x ( (TX (T h{6K  (,&*)8$) sm) 
	)( 
c3h  
D ~
T#s(^ ~
 ~
 ~
@-Xh5G -SV -$	HX,> 	# 	r&   rU  c            	      x  0 t               } i }| dz  }|j                         rG	 t        |dd      5 }t        j                  |      xs i }ddd       t
        j                  d|       	 ddl	}| d	z  }|j                         
rt        |d      5 }|j                  |      xs i }ddd       dd
lm} |j                        }|j                  d      }	|j                  d      }
d|vr!t        |	t               r|	j                  d      }
|
rt        |
t               r|
|d<   |j                  d      }|!t        |	t               r|	j                  d      }|?t        |t               r||d<   n)t
        j                  dt#        |      j$                         |j                  d      }d|vr!t        |	t               r|	j                  d      }t        |t               r||d<   d|v r	|d   |d<   nt        |	t               rd|	v r|	d   |d<   |j                  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<   |j                  d      }|!t        |	t               r|	j                  d      }t        |t&              r||d<   t        |	t               r(d|	v rd|vr|	d   |d<   d|	v r|	d   |d<   d|	v r|	d   |d<   d|v r|d   |d<   |j                  d      }t        |t               s!t        |	t               r|	j                  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)        |j                  d      d      |d<   n2t        |	t               r"d|	v rt)        |	j                  d      d      |d<   t        |t               r|j                  d      nd}|j+                  di       0t        0t               si 00|d<   d t,        d!df0fd"} ||        ||j                  d             0r0|d<   	 dd#lm}  |        dd$lm} t'        t8              }|A|j;                         D ].  }	 t9        |j<                        }||vs|jC                  |       0 |D ]  }|t8        jD                  k(  r|j                  |jF                        }t        |t               }|sX||j                  d      fD ]B  }t        |t               s|j                  |jF                        }t        |t               s@|} n t        |t               si }d|v r.t)        |j                  d      |j                  dd            |d<   d&|v rtI        |j                  d&      d'      |d&<   d(|v r|d(   |d(<   d)|v r|d)   |d)<   d*|v r|d*   |d*<   d+|v r|d+   |d+<   |t8        jJ                  k(  rd,|v r|d,   |d,<   |t8        jJ                  k(  rd-|v r|d-   |d-<   |t8        jJ                  k(  rd.|v r|d.   |d.<   d/|v r|d/   |d/<   d0|v r|d0   |d0<   d1|v r|d1   |d1<   |t8        jJ                  k(  rd2|v r|d2   |d2<   d3|v r|d3   |d3<   d4|v r|d4   |d4<   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:<   |t8        jL                  t8        jN                  hv rd;|v r|d;   |d;<   d<|v rK|d<   }t        |t               r1|jQ                         D ci c]  \  }}tS        |      | c}}|d<<   n||d<<   d=|v r|d=   |d=<   d>|v r|d>   |d><   d?|v r|d?   |d?<   d@|v }|rz|j                  d@      } t        | t               rYtU        0|jF                        \  }!}"| jQ                         D #$ci c]!  \  }#}$t        |$t               rtS        |#      |$# c}$}#|!d@<   |xr dA|v }%|s|%s|setU        0|jF                        \  }!}&|%r|dA   |!dA<   dB|&dC<   |&jW                  |        ||jY                         D ]  }'|'jZ                  |j                  |'j<                        }t        |t               sX||j                  d      fD ]B  }t        |t               s|j                  |'j<                        }t        |t               s@|} n t        |t               s	 |'j[                  ||      }(t        |(t               r|(stU        0|'j<                        \  })}&|&jW                  |(        |j                  d+      }*|*|j                  dE      xs i }+d+|+vr0j+                  t8        jJ                  jF                  i       },|,j+                  dFi       }-|-j+                  d+|*       t]        j^                  dG      s*tS        |*      ja                         t\        jb                  dG<   |j                  dHi       }.t        |.t               rFd+|.v rBt]        j^                  dI      s-tS        |.d+         ja                         t\        jb                  dI<   td        jg                  |      }/ti        |/       tk        |/       |/S # 1 sw Y   
xY w# t        $ r"}t
        j                  d||       Y d}~d}~ww xY w# 1 sw Y   
xY w# t        $ r#}t
        j7                  d%|       d}Y d}~d}~ww xY w# t>        t@        f$ r Y w xY wc c}}w c c}$}#w # t        $ r,}t
        j7                  dD|'j<                  |       Y d}~d}~ww xY w# t        $ r%}t
        j                  dJ| d	z  |       Y d}~'d}~ww xY w)Ku  
    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_resetrV  r]  zIIgnoring invalid quick_commands in config.yaml (expected mapping, got %s)r  re  rf  rg  ri  ro  rh  rj  rl  r\  rb  ra  rc  rk  rR   r   source_platformsr   c                 D   t        | t              sy | j                         D ]{  \  }}t        |t              sj                  |i       }t        |t              si }i |j                  di       |j                  di       }d|v rd|d<   i ||}|r||d<   ||<   } y )Nr_   r  T_enabled_explicit)r   rO   r  rf   )r  	plat_name
plat_blockexistingmerged_extramergedr\   s         r$   _merge_platform_mapz0load_gateway_config.<locals>._merge_platform_mapY  s    !"2D9-=-C-C-E 7)Iz%j$7 -11)R@H%h5#%#_hll7B&?#_:>>RY[]C^#_L J.<@%8977J7F#*6w06N9-7r&   r{  r   zplugin discovery skipped: %sr  rY   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_promptsr  r  r  r  r  Tr  z&apply_yaml_config_fn for %s raised: %srt   r_   TELEGRAM_REQUIRE_MENTIONry   SIGNAL_REQUIRE_MENTIONus   Failed to process config.yaml — falling back to .env / gateway.json values. Check %s for syntax errors. Error: %s)6r   r   openjsonloadr-   infor   r.   yaml	safe_load
hermes_clir  apply_managed_overlayrf   r   rO   r  r   r   rW   r`   r   r}  r|  r   r   debugrr   plugin_entriesr]   r;   KeyErrorrv  r   r   r[   r   r   r   r  r    rb   updateall_entriesapply_yaml_config_fnr)   r*   r"   re   rU  r   _apply_env_overrides_validate_gateway_config)1_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  r|  _shared_loop_targets_entry_platplatr  _cfg_toplevel_src
_candidatebridgedr  r  r  has_channel_overridesr#  ra   _extrar  r$  enabled_was_explicitr_   r  seededr   _tl_require_mention_tg_section_tg_plat	_tg_extra
signal_cfgrx  r\   s1                                                   @r$   load_gateway_configr    s    EG .!	J'w? -1))A,,"-KKN!X
 =0""$&9 3Q>>!,23 1$::8DH 'll95O o.Bh.:ot3T$((9jT*24././Bzj$?$(()9:~b$'02G,-NN5R)) ll5)GH$OT)J)--e4'4(!(%12:;Q2R./OT27MQ`7`2ABX2Y./",,y1K(H45=>W5X12OT27PTc7c5DE^5_12)X56>?Y6Z23OT27QUd7d6EF`6a23
 $x/089M0N,-
 ,,/0C{z/4@%))*:;#t$,/()/40'?:?S[b?b4CDX4YG01,?9HIb9cG56-@:I2;G67 )H45=>W5X12$LL5MmT2z/SW7X !0 3 3K @-.'4$8+,45E,F()OT27G?7Z,;<L,M()!X-.67I.J*+OT27I_7\.=>P.Q*+ %019:O1P-.OT27LP_7_1@AV1W-.)X56>.723 OT27QUd7d6E.723 *X56YLL!;<723 OT27QUd7d6Y#''(BC723 AK;X\@] <cg$//R@Nnd3!#'5$7c 7d 7$   12[ 9:'5$? "N
 *.h !002 ;F! ( 5 $88,33E:; - q&8>>)'||DJJ7 *< > %!2HLL4M N &%dD1)-$**)=J)*d;/9 %& ",5-=:]$(()CD$>G;G67 %41K$(():; 2G-. "\1.:>.JGN+$41=>O1PG-.-=:FGa:bG67$41=>O1PG-.8,,,L1P/;O/LGO,8,,,1F,1V5ABW5XG128,,,1A\1Q0<=M0NG,-+|;8DE]8^G45%52>?Q2RG./+|;8DE]8^G458,,,1UYe1eDPQuDvG@A,.+7+DGK(</,8,FGL)%52>?Q2RG./*l:7CD[7\G34!\1.:>.JGN+%52>?Q2RG./+|;8DE]8^G450L@=IJg=hG9:H,,hnn==BZ^jBj8DE]8^G45$4&23D&EO!/48L[LaLaLc5dDAqc!fai5d 125D 121\A>JKi>jG:;%52>?Q2RG./'<74@AU4VG01(;|(K%($0$4$45H$IM!-6,G*DJJ-)	6
 1>0C0C0E: ,W)'48  Hg-:	"56
 (5'Rl9R$';DY#>~tzz#Z 	5'+7	+BIi( 26E-.W%cq&p  __. )E119 #+<<

#;L &lD9%6[8Q$R *D)$5-1XXejj-A
#-j$#?3=L$)* &lD9 !!&!;!;Hl!S &fd36 :>5::VHAuLL(;)P #+,,/@"A".&ll:6<"$K7-889J9J9P9PRTUH ( 3 3GR @I(():<OP 99%?@ADEXAYA_A_Aa

#=> "h3J*d+$
2299E];^;>zJ[?\;];c;c;eBJJ782 $$W-F   V$MY- -  	JNN24EqII	J3 3d  ;Q? '1 ! !j 6e :Z % !D!JJ !!B  
4M!		
 	

s  m l:m +'p m5(P2p n .$p n1(p -B p .+p G6p o&Bp *&oCp +p p o-E p :m?m 	m2m--m25m?:p 	n.n)#p )n..p 1o p op 	p!p=p pp 	p9p44p9rx  c           	         | j                   }d|j                  cxk  rdk  s)n t        j                  d|j                         d|_        |j                  |j                  dk  r't        j                  d|j                         d|_        t
        }| j                  j                         D ]o  \  }}|j                  s|j                  |      }|s'|j                  4|j                  j                         rOt        j                  d|j                  |       q 	 dd	lm} || j                  j                         D ]  \  }}|j                  s|j                  |      }|s'|j                  }|s6|j                         sG ||d
      rRt        j!                  d|j                  ||j                         dd dz          d|_         yy# t        $ r d}Y w xY w)zValidate and sanitize a loaded GatewayConfig in place.

    Called by ``load_gateway_config()`` after all config sources are merged.
    Extracted as a separate function for testability.
    r      z3Invalid at_hour=%s (must be 0-23). Using default 4.r   Nz?Invalid idle_minutes=%s (must be positive). Using default 1440.r   zG%s is enabled but %s is empty. The adapter will likely fail to connect.)has_usable_secret)
min_lengthz%s is enabled but %s is set to a placeholder value ('%s'). Set a real bot token before starting the gateway. The adapter will NOT be started.   z...F)rV  r   r-   r.   r   r  r   r  r  rf   r1   r!   r   hermes_cli.authr  ImportErrorerror)rx  policy_token_env_namesr   pconfigenv_namer  r1   s           r$   r  r  d  s    ((F%2%A6>>	
 "f&9&9Q&>M	
 # 0#--335 	'#''11'--:M:M:ONN;	!5 $!'!1!1!7!7!9 	(Hg??'++H5HMME/@ST/U7 NNHekkmBQ.?%.G	 #(	( %  ! !s    G G#"G#c                 J    t         }t        }dt        dt        f fd} |d      }|r |t        j                        }||_         |dd      j                         }|dv rct        j                   j                  vr%t                j                  t        j                  <   | j                  t        j                     _         |dd      }|rt        j                   j                  vr%t                j                  t        j                  <   |j                  d	      D cg c]#  }|j                         s|j                         % c} j                  t        j                     j                  d
<    |d      }	|	rjt        j                   j                  v rNt        t        j                  |	 |dd       |d      xs d       j                  t        j                     _         |d      }
|
r |t        j                        }|
|_         |d      }|rjt        j                   j                  v rNt        t        j                  | |dd       |d      xs d       j                  t        j                     _         |dd      j                         }|dv rct        j                   j                  vr%t                j                  t        j                  <   | j                  t        j                     _        t         |dd            } |dd      j                         dv }t        j                    j                  v r1 j                  t        j                      }|rd|_        n3|r1d|_        n)|r't        d       j                  t        j                   <    |d      }|rjt        j                    j                  v rNt        t        j                   | |dd       |d      xs d       j                  t        j                      _         |d      } |d      }|rI|rFt        j$                   j                  vr%t                j                  t        j$                  <   d j                  t        j$                     _         j                  t        j$                     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+      }|r4	 t)        |       j                  t        j$                     j                  d,<    |d-      }|r*| j                  t        j$                     j                  d.<    |d/      }|r*| j                  t        j$                     j                  d0<    |d1      }|rjt        j$                   j                  v rNt        t        j$                  | |d2d       |d3      xs d       j                  t        j$                     _         |d4      }|rt        j,                   j                  vrHt                j                  t        j,                  <   d j                  t        j,                     _        nW j                  t        j,                     }t/        |j                  j1                  d5d            }|j"                  s	|sd|_        | j                  t        j,                     _         |d6      } | rjt        j,                   j                  v rNt        t        j,                  |  |d7d       |d8      xs d       j                  t        j,                     _         |d9      }! |d:      }"|!rG|"rE |t        j2                        }#|#j                  j'                  |!|"t         |d;d<            d=        |d>      }$|$rjt        j2                   j                  v rNt        t        j2                  |$ |d?d       |d@      xs d       j                  t        j2                     _         |dA      }%|%rL |dBd      }&|&st4        j7                  dC        |t        j8                        }'|%|'_        |&|'j                  dD<    |dE      }(|(rjt        j8                   j                  v rNt        t        j8                  |( |dFd       |dG      xs d       j                  t        j8                     _         |dH      }) |dId      }*|)s |dJ      r|*st4        j7                  dK        |t        j:                        }+|)r|)|+_        |*|+j                  dL<    |dMd      },|,r|,|+j                  dN<    |dJd      }-|-r|-|+j                  dO<    |dPd      j                         j                         }.|.dQv xs t         |dRd            }/|/|+j                  dS<   |.r|.|+j                  dT<    |dUd      }0|0r|0|+j                  dV<    |dW      }1|1rjt        j:                   j                  v rNt        t        j:                  |1 |dXd       |dY      xs d       j                  t        j:                     _         |dZ      }2|2rt        j<                   j                  vr%t                j                  t        j<                  <   d j                  t        j<                     _        |2 j                  t        j<                     _         |d[      }3|3r*|3 j                  t        j<                     j                  dD<    |d\      }4 |d]      }5 |d^      }6 |d_      }7t?        |4|5|6|7g      rt        j@                   j                  vr%t                j                  t        j@                  <   d j                  t        j@                     _         j                  t        j@                     j                  j'                  |4|6|7d`        |da      }8|8rjt        j@                   j                  v rNt        t        j@                  |8 |dbd       |dc      xs d       j                  t        j@                     _         |dd      }9|9rt        jB                   j                  vr%t                j                  t        jB                  <   d j                  t        jB                     _         |ded       j                  t        jB                     _"         |df      }:|:rjt        jB                   j                  v rNt        t        jB                  |: |dgd       |dh      xs d       j                  t        jB                     _        t         |did            }; |djd      }< |dkd      }= |dl      }> |dm      }?|;s|<rt        jF                   j                  vr%t                j                  t        jF                  <   d j                  t        jF                     _        |<r*|< j                  t        jF                     j                  dn<   |=ri|=j                  d	      D @cg c]#  }@|@j                         s@j                         % }A}@|Ar*A j                  t        jF                     j                  do<   |>r4	 t)        |>       j                  t        jF                     j                  dp<   |?r*|? j                  t        jF                     j                  dq<    |drd      }B|Br*B j                  t        jF                     j                  ds<   t         |dtd            }C |du      }D |dvd      }E|Crt        jH                   j                  vr%t                j                  t        jH                  <   d j                  t        jH                     _        Dr4	 t)        D       j                  t        jH                     j                  dp<   Er*E j                  t        jH                     j                  dw<   t         |dxd            }F |dy      }G |dzd      }H |d{d      }I |d|d      }J|Fs%t        jJ                   j                  v s	GsHsIsJrt        jJ                   j                  vr%t                j                  t        jJ                  <   Fr"d j                  t        jJ                     _        Gr4	 t)        G       j                  t        jJ                     j                  dp<   Hr*H j                  t        jJ                     j                  d}<   IrhIj                  d	      D Kcg c]"  }K|Kj                         rKj                         $ }L}K|Lr*L j                  t        jJ                     j                  d~<   JrhJj                  d	      D Mcg c]"  }M|Mj                         rMj                         $ }N}M|Nr*N j                  t        jJ                     j                  d<    |d      }O |d      }P|OrPrt        jL                   j                  vr%t                j                  t        jL                  <   d j                  t        jL                     _         j                  t        jL                     j                  j'                  OPd        |d      }Q|QrNt        t        jL                  Q |dd       |d      xs d       j                  t        jL                     _         |d      }R |d      }S|RrqSrnt        jN                   j                  vr%t                j                  t        jN                  <   d j                  t        jN                     _         j                  t        jN                     j                  j'                  RS |dd       |dd      d        |dd      }T|Tr*T j                  t        jN                     j                  d<    |dd      }U|Ur*U j                  t        jN                     j                  d<    |d      }V|VrNt        t        jN                  V |dd       |d      xs d       j                  t        jN                     _         |d      }W |d      }X|Wr,Xr)t        jP                   j                  vr%t                j                  t        jP                  <   d j                  t        jP                     _         j                  t        jP                     j                  j'                  WXd        |dd      }Y|Yr*Y j                  t        jP                     j                  d<    |d      }Z|ZrNt        t        jP                  Z |dd       |d      xs d       j                  t        jP                     _         |d      }[ |d      }\|[r\rt        jR                   j                  vr%t                j                  t        jR                  <   d j                  t        jR                     _         j                  t        jR                     j                  j'                  [\ |dd       |dd       |dd       |dd       |dd      d        |d      }] |d      }^|]s^r(t        jT                   j                  vr%t                j                  t        jT                  <   d j                  t        jT                     _        ]r"] j                  t        jT                     _         j                  t        jT                     j                  }_^r^_d<    |dd      j                         }`|`r`jW                  d      _d<    |dd      j                         }a|arajW                  d      _d<    |dd      j                         j                         }b|brb_d<    |dd      j                         j                         }c|crc_d<    |dd      j                         }d|drd_d<    |dd      j                         }e|ere_d<    |dd      j                         }f|frf_d<    |dd      j                         }g|grNt        t        jT                  g |dd       |d      xs d       j                  t        jT                     _         |d      }h |d      }i|hreirbt        jX                   j                  vr%t                j                  t        jX                  <   d j                  t        jX                     _         j                  t        jX                     j                  j'                  hjW                  d      i |dd       |dd       |dd      t         |dd<            dÜ        |dī      }j|j:jj                         dv  j                  t        jX                     j                  d<    |dǫ      }k|kr@	 t[        j\                  k      }ll j                  t        jX                     j                  d<    |dʫ      }n|nrjt        jX                   j                  v rNt        t        jX                  n |dd       |d̫      xs d       j                  t        jX                     _         |dͫ      }o |dΫ      }p|osprt        jb                   j                  vr%t                j                  t        jb                  <   d j                  t        jb                     _         j                  t        jb                     j                  }_oro_d"<   prp_d<    |dd      j                         }q|qrq_d<    |dd      j                         }r|rrr_d<    |dd      j                         }sd}t|ssE |dd      j                         }u|ur,u}sd}tte        jf                  th              j7                  d֫       srbt        t        jb                  s |dӫ      xs	  |td       |d׫      xs  |dث      xs d       j                  t        jb                     _         |d٫      xs  |dګ      }v |d۫      }w|vrwrt        jj                   j                  vr%t                j                  t        jj                  <   d j                  t        jj                     _         j                  t        jj                     j                  }_v|_d"<   w|_d$<    |dܫ      }x|xrx_d<    |dޫ      }y|yry_d<    |d      }z|zrz_d<    |d      }{|{r{_d<    |d      }|||rNt        t        jj                  | |dd       |d      xs d       j                  t        jj                     _         |d      }}|}r!}j                         j                         _d<    |d      }~|~r~_d<    |d      }|r!j                         j                         _d<    |d      }|r_d<    |d      }|r	 t)               jl                  _7         |d      }|r	 t)               jl                  _8        	 ddl9m:}  |        ddl;m<} |j{                         D ]  }	 t        j|                        } j                  j1                        }|6j"                  s*t/        j                  xs i j1                  d5d            rmd}j                  	 j                         }j"                  sj                  	 3}|j"                  s1t        dt        j                  xs i             }nt        d      }t        t              rYrWt        t        di       xs i       }j                         D ]  \  }}|dk(  rj                          t        d      }t/        j                              }s"t4        j                  dj|                         	 j                         s	  j                  vrt                j                  <   d j                     _        t        t              sst              }|j                  dd      } j                     j                  j'                  |       t        |t              sIj1                  d      s\t        t        d         t        |j1                  d      xs d      j1                  d      rt        d         nd       j                     _         	 t        j                  dd      j                         }d} j                  j1                  t        j                        }|6t        j                  j1                  d      xs d      j                         }xs }|r4 |t        j                        }jW                  d      |j                  d<    j                  j                         D ]  }|j                  j                  d5d         yc c}w # t*        $ r Y w xY wc c}@w # t*        $ r Y w xY w# t*        $ r Y w xY w# t*        $ r Y w xY wc c}Kw c c}Mw # t^        $ rV kja                  dd	      j                  d	      D mcg c]"  }m|mj                         rmj                         $ nc c}mw }l}mY w xY w# t*        $ r Y w xY w# t*        $ r Y w xY w# t^        $ r,}t4        j                  dj|                         Y d}~d}~ww xY w# t^        $ r.}t4        j                  dj|                         d}Y d}~{d}~ww xY w# t^        $ r.}t4        j                  dj|                         d}Y d}~d}~ww xY w# t^        $ r,}t4        j                  dj|                         Y d}~yd}~ww xY w# t^        $ r!}t4        j                  d       Y d}~d}~ww xY w)z/Apply environment variable overrides to config.r   r   c                    | j                   vr(t        d      j                   | <   j                   |    S j                   |    }t        |j                  j	                  dd            }|j
                  s	|sd|_        |S )NTr  r  F)r   r  r5   r_   rf   r  )r   platform_configr  rx  s      r$   _enable_from_envz._apply_env_overrides.<locals>._enable_from_env  s    6+++)7)EFX&##H-- **84  $O$9$9$=$=>QSX$YZ&&/C&*O#r&   r  TELEGRAM_REPLY_TO_MODErG  >   allr   r  TELEGRAM_FALLBACK_IPS,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)r<  r=  WHATSAPP_CLOUD_APP_IDrL  WHATSAPP_CLOUD_APP_SECRETrO  WHATSAPP_CLOUD_WABA_IDwaba_idWHATSAPP_CLOUD_VERIFY_TOKENverify_tokenWHATSAPP_CLOUD_WEBHOOK_HOSTwebhook_hostWHATSAPP_CLOUD_WEBHOOK_PORTwebhook_portWHATSAPP_CLOUD_WEBHOOK_PATHwebhook_pathWHATSAPP_CLOUD_API_VERSIONapi_versionWHATSAPP_CLOUD_HOME_CHANNEL WHATSAPP_CLOUD_HOME_CHANNEL_NAME%WHATSAPP_CLOUD_HOME_CHANNEL_THREAD_IDr	  r  SLACK_HOME_CHANNELSLACK_HOME_CHANNEL_NAMESLACK_HOME_CHANNEL_THREAD_IDSIGNAL_HTTP_URLSIGNAL_ACCOUNTSIGNAL_IGNORE_STORIESr   )r@  accountignore_storiesSIGNAL_HOME_CHANNELSIGNAL_HOME_CHANNEL_NAMESIGNAL_HOME_CHANNEL_THREAD_IDr
  MATTERMOST_URLz2MATTERMOST_TOKEN set but MATTERMOST_URL is missingrR  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_idrJ  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_HOSTrB   cors_originsporthostAPI_SERVER_MODEL_NAME
model_nameWEBHOOK_ENABLEDWEBHOOK_PORTWEBHOOK_SECRETsecretMSGRAPH_WEBHOOK_ENABLEDMSGRAPH_WEBHOOK_PORTMSGRAPH_WEBHOOK_CLIENT_STATE"MSGRAPH_WEBHOOK_ACCEPTED_RESOURCES$MSGRAPH_WEBHOOK_ALLOWED_SOURCE_CIDRSrF  accepted_resourcesallowed_source_cidrsDINGTALK_CLIENT_IDDINGTALK_CLIENT_SECRET)	client_idrM  DINGTALK_HOME_CHANNELDINGTALK_HOME_CHANNEL_NAMEDINGTALK_HOME_CHANNEL_THREAD_IDFEISHU_APP_IDFEISHU_APP_SECRETFEISHU_DOMAINr   FEISHU_CONNECTION_MODEr   )rL  rO  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_idrp  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_idr1   encoding_aes_keyrj  ri  r  WEIXIN_ACCOUNT_IDr7  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)rI  rJ  r&  r(  r*  send_read_receiptsBLUEBUBBLES_REQUIRE_MENTION>   r   r   r   r   r  BLUEBUBBLES_MENTION_PATTERNS
r  BLUEBUBBLES_HOME_CHANNELBLUEBUBBLES_HOME_CHANNEL_NAME"BLUEBUBBLES_HOME_CHANNEL_THREAD_ID	QQ_APP_IDQQ_CLIENT_SECRETrM  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  r_   r_   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_URLrQ  )Nrm   ro   rr   r  r   r1   r"   r   r  splitr!   r_   r   r  r   r   r   r  r   r  r@   r;   r   r5   rf   r   r-   r.   r   r   r   r  r   r   r  r   r   r   r   r   r   r   r   rstripr   r  loadsr   r   r   logging	getLoggerr   r   rV  r   r   r}  r|  r   r   r  r]   r  env_enablement_fnr~  rO   r   getattrr  r`   check_fnpopr    r)   r*   r   values)rx  r*   
getenv_intr  telegram_tokentelegram_configtelegram_reply_modetelegram_fallback_ipsiptelegram_homediscord_tokendiscord_configdiscord_homediscord_reply_modewhatsapp_enabledwhatsapp_disabled_explicitlywa_cfgwhatsapp_homewhatsapp_cloud_phone_idwhatsapp_cloud_tokenwa_cloud_app_idwa_cloud_app_secretwa_cloud_waba_idwa_cloud_verify_tokenwa_cloud_hostwa_cloud_portwa_cloud_pathwa_cloud_api_versionwhatsapp_cloud_homeslack_tokenslack_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originoriginsapi_server_model_namewebhook_enabledr(  webhook_secretmsgraph_webhook_enabledmsgraph_webhook_portmsgraph_webhook_client_statemsgraph_webhook_resourcesmsgraph_webhook_allowed_cidrsresource	resourcescidrcidrsdingtalk_client_iddingtalk_client_secretdingtalk_homefeishu_app_idfeishu_app_secretfeishu_encrypt_keyfeishu_verification_tokenfeishu_homewecom_bot_idwecom_secretwecom_ws_url
wecom_homewecom_callback_corp_idwecom_callback_corp_secretweixin_tokenweixin_account_idr_   weixin_base_urlweixin_cdn_base_urlweixin_dm_policyweixin_group_policyweixin_allowed_usersweixin_group_allowed_usersweixin_split_multilineweixin_homebluebubbles_server_urlbluebubbles_passwordbluebubbles_require_mentionbluebubbles_mention_patternsparsed_patternspartbluebubbles_home	qq_app_idqq_client_secretqq_allowed_usersqq_group_allowedqq_homeqq_home_name_envlegacy_homeyuanbao_app_idyuanbao_app_secretyuanbao_bot_idyuanbao_ws_urlyuanbao_api_domainyuanbao_route_envyuanbao_homeyuanbao_dm_policyyuanbao_dm_allow_fromyuanbao_group_policyyuanbao_group_allow_fromr   
reset_hourr|  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  $ 01N*8+<+<= . !!92>DDF55F$4$442@2BFX../<O**+9"#:B?F$4$442@2BFX../!6!<!<S!AE
RXXZBHHJE
**+11.A 23M**f.>.>>;F&&!4f=>?G4	<
**+8 ./M)(*:*:;,01L((F,<,<<:E%% 3V<=>F$	;
))*7   7<BBD446#3#331?1AFX--.;M))*8 'v.@"'EF#)*<b#A#G#G#IMa#a F,,,!!("3"34'"FN!FN	.<T.J**+23M**f.>.>>;F&&!4f=>?G4	<
**+8 %%EF!"?@#7""&*:*::8F8HFX445<@001900177>>60@
 	
 !!89HWFX445;;HE$%@AL_FX445;;LI!":;IYFX445;;IF &'D E NcFX445;;NK<=N[FX445;;NK<=RUVcRd  !8!89??O <=N[FX445;;NK%&BCMaFX445;;MJ !>?x66&:J:JJAL,,':FCDEM	B
001> *+K>>!1!11/=/?FX^^,7;FX^^,4!++HNN;L $((:(:(>(>?RTY(Z#[ ''0D (,$ 2=(.,-Jhnn(8(888C^^126;<D	9
(5 )*J,-Nn(9"""%-f5Lf.UV$
 	
 ./Kx&*:*::9D__2F;<=E	:
)6 01 0"5NNOP,X-@-@A"2)7&67O8..&2B2BB=H((#6?@AIT	>
,,-: /0L2B7v/0 NNef(9".M,=L)-r2-8M	* !2B7.=M
+!"4b9??AGGI ZZ @v&92>? 	 -8L)/?M,!"4b9/?M,+,Kx&*:*::9D__/89:Bd	:
)6 %J!!)9)997E7GFX334;?//089C//06*%DLFX334::5A (J'(I)*J)*J
J	:z:;>>!1!11/=/?FX^^,37(0(..55!##7
 	
 ,-Jhnn(8(888C^^16:;<D	9
(5 ,-J<<v///-;-=FX\\*15&.178KR1P&.()HHLLF$4$446A\\/89:Bd	7
&3 )0Db)IJ,b1N$%>C./O./O^f&6&664B4DFX0018<,,-5AOFX00177>"4K4Q4QRU4Vi&Z`ZfZfZhv||~iGiNU  !4!45;;NKFI/FZ  !4!45;;FC BQFX00177? &'> C H]FX00177E &f->&CDO.)L,b1N6#3#331?1AFX--.59))*2CF|CT  !1!1288@ AOFX--.44X> .f5NPR.ST!"89#)*H"#M  &'KR P$*.%! 	 ##v'7'77'$(##6+;+;;9G9IFX556"AEFX556>KN(L  !9!9:@@H
 (, X556<<^L % !: ? ? D>>#  I 
     !9!9:@@( ) :??D::< 

E 
     !9!9:@@*
   45#$<=4F$4$442@2BFX../6:**+3**+1188+3:
 	 67?J!**%8&A !BCKt	@FX../< ?+M23*??&"2"220>0@FX__-48)1)//66#+_h7%&>L	8
 	 $$8"=EWFX__-33MB$*+F$K!$LeFX__-334HI23=H!#6? !@AIT	>FX__-: .)L.)L>>!1!11/=/?FX^^,37(0(..55""7
 	 3R8FRFX^^,22?C01
<G!"5v> !?@HD	=FX^^,9 $$<=!'(D!E"<""&*:*::8F8HFX445<@001900177>>-58"=2B7 &'H" M0)<4d;@
 	 .)L23(??&"2"220>0@FX__-48)16BFX__-3  177"3E, !2B7==? / 6 6s ;E*$%:B?EEG$7$>$>s$CE.!!"4b9??AGGI!1E+$%:B?EEGMMO$7E.!%&<bAGGI"6E,%+,H"%M%S%S%U"%(BE$%!'(I2!N!T!T!V!0FE,-2B7==?=H!#6? !@AIT	>FX__-: $$<=!"89"6v'7'775C5EFX1129=--.6--.44;;077<,"#={K&'A4H"#=?UV"1&9Y[a2b"c=
 	 '--J&K#&2+1137QQ X112889JK (..L'M$'"&**-I"J P_FX112889KL89H00F4D4DD>I))$7@ABJd	?
--.; {#I01$>>!1!11/=/?FX^^,37(0  066'E(O%5E/"!"4b9??A"2E,!":B?EEG(8E$%-r288:4 !2B7==?K%#9 !!(+33J <G!56Z&AQSY:Z9: 9:	=FX^^,9 ,-J8I1JN 45,6#3#331?1AFX--.59))*2  !1!1288(h0l 01,E(O 01,E(O#$89"4E,"#67!2E+45>I!))$7@ !ABJd	?FX--.; ##67!2!8!8!:!@!@!BE+ &'> ? %:E/"%&<=$8$>$>$@$F$F$HE.!#)*D#E #(@E$% 01L	7:<7HF''4 ,-J	25j/F''/,FB7?&557 @	E#EJJ/ "++//9L ($,,,,,2778KUST "N&&2*%*%<%<%>N #<+?+?%%1$+ (3(4I#,#4#4,:,0*.y/D"*E-"	
 )7t(DI%nd; +/wy'2/N/TRT*UK(6(<(<(> =1#$#6$, + 6 6q! <= )7(,&1)I &*%*<*<Y*G%H
 &P!JJ
 !~~' (
 v///-;-=  *15FX&. .$/NN+ xx5  *0077=dD)dhhy.A>I!) #DO 4 &!1!;V<  $xx4  [ 12!%	?F$$X.;o@	Z II126<<>MN%%))(..9N!^1155kBHbIOOQ!3^M'7*7*>*>s*C;'!++224 =!!"5t<=ME
|  v j  &  <  H   != D DT3 O U UVY Z#zz| JJL# # #T  		  		8  ;UZZK< ! *LL=uzz1 &*N	*V % +T!JJ &+
+4  95::qI6  B=qAABs  $BM<:BM<3BN BNBN3BN B<3BN& G3BN6 I'BOJ='BOl+BO }BP2 }7BQ ~'BT6 ~:BQA!BT6 @1BR
ABT6 ACBSD $BT6 EBS>EABT6 F#BT6 F'ABT6 G>BT6 HA+BT6 N	BNNBNN	BN#N"BN#N&	BN3N2BN3N6	BOOBOO,BP/O<'BP$P#BP/P.BP/P2	BP?P>BP?Q	BQQBQQ	BRQ!BRQ<BT6 RBRRBT6 R
	BSR#BR<R6BT6 R<BSSBT6 S	BS;S#BS6S0BT6 S6BS;S;BT6 S>	BT3T!BT.T(BT6 T.BT3T3BT6 T6	BU T?BUUBU )T)r   zbool | None)r  )rR   )rY   rk   )rG  )rx  rU  r   N)]r   r  r)   r  pathlibr   dataclassesr   r   r   r   typingr   r	   r
   r   r   enumr   hermes_cli.configr   agent.secret_scoper   r   rd   utilsr   r  r   r-   r5   r%   	frozensetr+   r,   r2   r    r7   r9   r=   r@   rA   rG   rL   rM   rP   rW   r[   rO   r   rb   ri   rm   ro   rp   r   r   rr   __members__r  _BUILTIN_PLATFORM_VALUESr   r   r   r   r   r   r   r   r   r   r   r   r  r  r%  r&  r'  r)  r   r   r   r   r   r   r   r   r   rS  rU  r  r  r  r   r&   r$   <module>ru     sg    	   > > 6 6  - N !			8	$3 3d 3d 3$ &&@A $%@A :0c 0c 0" u  s S S ! !3 !8C= !H !.  >%%%%P4 4S#X 4
s S c c C s  C E$PT*DU $#  # $/c /C / /
c C C  26 # 5`t `J %$Th6J6J6Q6Q6S$TT   ) 
* 
  " i2 S#X 
 HTN d  
 
 
D 6
 6
 6
r 
 
 
P +)NN%+OO*OO^3 $z3/  q
 q
 q
r *-  ,*, "C , & # & [
 [
 [
L OO    OO@)&    NN    NN 5R d8X~6F6L-M#MN @ g g gT~] ~B;(|N= N=4 N=r&   