+
    jHàjæ²  ã                   ó8  a € Rc tg0 t R t^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RI	H
t
HtHtHtHt ^ RIHtHtHtHtHt ^ RIHt ^ RIHt ^ RIHtHt ^ RIHtHtH t  ^ R	I!H"t"H#t# ]PH                  ! ]%4      t&]'! 0 Rdm4      t(]'! 0 Rem4      t)R
 R lt*RfR R llt+R R lt,Rgt-R R lt.R R lt/R R lt0R R lt1R R lt2R R lt3Rt4RhR R llt5R  R! lt60 Rimt7R"t8R# R$ lt9R% R& lt:RjR' R( llt;RkR) R* llt<Rs=] ^ k Rs>] ^k R+ R, lt? ! R- R.]4      t@]'! R/ ]@P‚                  P…                  4        4       4      tC]'! 0 Rlm4      tDR2R0/tE] ^k ]'! R1R004      tFR1R3R0R4/tG] ^k RjR5 R6 lltH]P’                  ! R74      tJR8 R9 ltK] ! R: R;4      4       tLR<R=/R> R? lltM] ! R@ RA4      4       tN]@Pž                  RB]@P                   RC]@P¢                  RD]@P¤                  RE]@P¦                  RF]@P¨                  RG/tU] ^k ] ! RH RI4      4       tVRJtW] ^k ^tX] ^k RKtY] ^k ] ! RL RM4      4       tZRN RO lt[]@P¸                  RP ]@Pº                  RQ ]@P¼                  RR ]@P¾                  RS /t`] ^k RT RU ltaRVRRWRRXRRYRRZR=/tb] ! R[ R\4      4       tcR] R^ ltdR_ R` lteRa Rb ltfR# )mzšGateway configuration: connected platforms, home channels, session reset
policies and delivery preferences, loaded from config.yaml / gateway.json / env.
N)ÚPath)ÚasdictÚ	dataclassÚfieldÚfieldsÚis_dataclass)ÚDictÚListÚOptionalÚAnyÚCallable)ÚEnum©Úget_hermes_home)Úcurrent_secret_scopeÚ
get_secret)Ú DEFAULT_LOOP_WATCHDOG_INTERVAL_SÚ!DEFAULT_LOOP_WATCHDOG_MAX_STRIKESÚDEFAULT_LOOP_WATCHDOG_TIMEOUT_S)Úfast_safe_loadÚis_truthy_valuec                óF   € V ^8„  d   QhR\         R\        \        ,          /# ©é   ÚvalueÚreturn)r   r
   Úbool)Úformats   "Ú3/home/ubuntu/.hermes/hermes-agent/gateway/config.pyÚ__annotate__r      s"   € ÷ \ñ \”sð \œx¬�~ñ \ó    c                óˆ   € \        V 4      P                  4       P                  4       pV\        9   d   R# V\        9   d   R# R# )z:True/False for a recognized truthy/falsy token, else None.TFN)ÚstrÚstripÚlowerÚ_TRUTHY_STRINGSÚ_FALSY_STRINGS)r   Útokens   & r   Ú_bool_tokenr(      s<   € ä�‹J×ÑÓ×$Ñ$Ó&€EØœOÔ+ˆ4Ð[¸%Ä>Ô:Q°Ð[ÐW[Ð[r    Tc                ó<   € V ^8„  d   QhR\         R\        R\        /# ©r   r   Údefaultr   ©r   r   )r   s   "r   r   r   $   s!   € ÷ 3ñ 3œð 3¤dð 3´dñ 3r    c                óx   € V f   V# \        V \        4      '       d   \        V 4      pVf   V# T# \        WR7      # )zDCoerce bool-ish config values, preserving a caller-provided default.)r+   )Ú
isinstancer"   r(   r   )r   r+   Úparseds   && r   Ú_coerce_boolr0   $   s=   € à‚}ØˆÜ�%œ×ÒÜ˜UÓ#ˆØ š.ˆwÐ4¨fÐ4Ü˜5Ô2Ð2r    c                ó2   € V ^8„  d   QhR\         R,          /# ©r   r   N©r   )r   s   "r   r   r   .   s   € ÷ ñ ¬$°­+ñ r    c                 óø   € \         P                  ! R4      p T ;'       g    RP                  4       '       g   R# \        V 4      pVf3   \        P                  RV \        \        4      \        \        4      4       V# )aV  GATEWAY_MULTIPLEX_PROFILES operator override: True/False for a recognized token.

``None`` when unset, blank, or unrecognized so 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_PROFILESÚ NzlIgnoring unrecognized GATEWAY_MULTIPLEX_PROFILES=%r (expected one of %s or %s); falling back to config.yaml.)	ÚosÚgetenvr#   r(   ÚloggerÚwarningÚsortedr%   r&   )Úrawr/   s     r   Ú _env_multiplex_profiles_overrider=   .   sd   € ô �)Š)Ð0Ó
1€CØ�IˆI�2×Ñ×ÒÙÜ˜Ó€FØ‚~Ü�‰ðGà”œÓ(¬&´Ó*@ô	
ð
 €Mr    c                ó2   € V ^8„  d   QhR\         R,          /# r2   ©r"   )r   s   "r   r   r   G   s   € ÷ ñ ¬C°$­Jñ r    c                 ó  € \         P                  ! R4      p T ;'       g    RP                  4       '       g   R# V P                  4       P                  4       pV\        9   d   V# \
        P                  RV \        \        4      4       R# )a¶  GATEWAY_ON_ALL_ADAPTERS_DOWN operator override: 'exit'/'stay_alive' for a recognized token.

``None`` when unset, blank, or unrecognized so the caller keeps the config.yaml value
(env > config > default). Launchers without a supervising service manager (the desktop app
spawns ``hermes serve`` directly) set ``stay_alive``: a failure exit there only severs the
UI's websocket connections and drops in-flight assistant messages (#118080).
ÚGATEWAY_ON_ALL_ADAPTERS_DOWNr6   NzhIgnoring unrecognized GATEWAY_ON_ALL_ADAPTERS_DOWN=%r (expected one of %s); falling back to config.yaml.)r7   r8   r#   r$   ÚON_ALL_ADAPTERS_DOWN_POLICIESr9   r:   Úlist)r<   r'   s     r   Ú"_env_on_all_adapters_down_overriderD   G   sn   € ô �)Š)Ð2Ó
3€CØ�IˆI�2×Ñ×ÒÙØ�I‰I‹K×ÑÓ€EØÔ-Ô-ØˆÜ
‡N�Nð	=àŒTÔ/Ó0ôñ
 r    c                ó0   € V ^8„  d   QhR\         R\        /# r   )r   r"   )r   s   "r   r   r   ]   s   € ÷ 0ñ 0¤cð 0¬cñ 0r    c                ó´   € V f   R# \        V \        4      '       d   V '       d   R# R# \        V 4      P                  4       P	                  4       ;'       g    R# )uò   Canonical streaming transport token. YAML 1.1 parses bare ``on``/``off`` as
booleans (``mode: off`` â†’ ``False`` â†’ ``"false"`` would ENABLE streaming), so
booleans map to ``"auto"``/``"off"``; anything else lower-cases, default ``"auto"``.ÚautoÚoff)r.   r   r"   r#   r$   ©r   s   &r   Ú_normalize_transport_tokenrJ   ]   sJ   € ð ‚}ÙÜ�%œ×ÒßˆvÐ) EÐ)Üˆu‹:×ÑÓ×#Ñ#Ó%×/Ð/¨Ð/r    c                ó$   € V ^8„  d   QhR\         /# )r   r   )r   )r   s   "r   r   r   h   s   € ÷ ñ œSñ r    c                 ó\   €  Vf   V# V ! V4      #   \         \        \        3 d    Tu # i ; i©N)Ú	TypeErrorÚ
ValueErrorÚOverflowError)Úcastr   r+   s   &&&r   Ú_coerce_numrR   h   s5   € ðØš-ˆwÐ8©T°%«[Ð8øÜ”z¤=Ð1ô ØŠðús   ‚ ˆ �+ª+c                ó<   € V ^8„  d   QhR\         R\        R\        /# r*   )r   Úfloat)r   s   "r   r   r   p   s!   € ÷ .ñ .œð .¤uð .´ñ .r    c                 ó"   € \        \        W4      # rM   )rR   rT   ©r   r+   s   &&r   Ú_coerce_floatrW   p   s   € Ü”u˜eÓ-Ð-r    c                ó<   € V ^8„  d   QhR\         R\        R\        /# r*   )r   Úint)r   s   "r   r   r   t   s!   € ÷ ,ñ ,”sð ,¤Sð ,¬Sñ ,r    c                 ó"   € \        \        W4      # rM   )rR   rY   rV   s   &&r   Ú_coerce_intr[   t   s   € Ü”s˜EÓ+Ð+r    c                óR   € V ^8„  d   QhR\         R\        R\        \        ,          /# ©r   r   Úkeyr   )r   r"   r
   rY   )r   s   "r   r   r   x   s%   € ÷ *ñ *¬ð *´3ð *¼8ÄC½=ñ *r    c                ó’  € V f   R#  \        V \        4      '       g-   \        V \        4      '       d"   V P                  4       '       g   \	        V 4      h\        V \
        4      '       d   \        V P                  4       ^
4      M
\        V 4      pT^ 8”  d   T# R#   \        \        3 d    \        P                  RY4        R# i ; i)zh``None``/0/negative disable; malformed values are ignored with a warning so a typo never blocks startup.NzEIgnoring invalid %s=%r (expected a positive integer; 0/null disables))r.   r   rT   Ú
is_integerrO   r"   rY   r#   rN   r9   r:   ©r   r^   r/   s   && r   Ú_coerce_optional_positive_intrb   x   s¡   € à‚}ÙðÜ�eœT×"Ò"¤z°%¼×'?Ò'?È×HXÑHX×HZÒHZÜ˜UÓ#Ð#Ü+5°e¼S×+AÒ+A”�U—[‘[“] BÔ'ÄsÈ5Ãzˆð ˜a”Zˆ6Ð) TÐ)øô ”zÐ"ô Ü�‰Ð^Ð`cÔkÚðús   ˆAB Á
AB Â'CÃCiÿÿÿc                ó<   € V ^8„  d   QhR\         R\        R\        /# r]   )r   r"   rY   )r   s   "r   r   r   ‰   s$   € ÷ ñ ÜðÜðäñr    c                ó   € V f   ^ # Rp\        V \        4      '       d   \        V \        4      '       g   T pM­\        V \        4      '       d˜   V P	                  4       P                  4       '       dt   V P	                  4       P                  4       '       dP   \        P                  ! \        \        \        4      ;_uu_ 4        \        V P	                  4       ^
4      pRRR4       Vf   \        P                  RV4       ^ # V'       d3   ^ Tu;8  d   \        8:  g    M \        P                  RV\        4       ^ # V#   + '       g   i     Lh; i)z«Bounded positive watchdog interval, or zero when disabled/invalid. Shared by runtime
and service generation so a value can never enable ``Type=notify`` without heartbeats.Nz1Ignoring invalid %s (expected a positive integer)z6Ignoring invalid %s (expected an integer from 1 to %d))r.   rY   r   r"   r#   ÚisasciiÚ	isdecimalÚ
contextlibÚsuppressrN   rO   rP   r9   r:   Ú_SYSTEMD_WATCHDOG_MAX_SECONDSra   s   && r   Úcoerce_systemd_watchdog_secondsrj   ‰   sÝ   € ð
 ‚}ÙØ €FÜ�%œ×Ò¤j°¼×&=Ò&=Ø‰Ü	�Eœ3×	Ò	 E§K¡K£M×$9Ñ$9×$;Ò$;ÀÇÁÃ×@WÑ@W×@YÒ@YÜ× Ò ¤¬J¼×FÕFÜ˜Ÿ™›¨Ó+ˆF÷ Gà‚~Ü�‰ÐJÈCÔPÙß�a˜&ÖAÔ$AÖAÜ�‰ÐOÐQTÔVsÔtÙØ€M÷ G×Fús   ÃD=Ä=E	c                óR   € V ^8„  d   QhR\         R\        \        \         3,          /# r   )r   Údictr"   )r   s   "r   r   r   Ÿ   s"   € ÷ 4ñ 4œð 4¤¤S¬# X¥ñ 4r    c                 ó6   € \        V \        4      '       d   V # / # rM   )r.   rl   rI   s   &r   Ú_coerce_dictrn   Ÿ   s   € Ü˜u¤d×+Ò+ˆ5Ð3°Ð3r    zbHi! I'm a personal assistant and can only chat with my owner, so I can't help you directly. Sorry!c                óH   € V ^8„  d   QhR\         R\        R\        R\        /# )r   r   Úchoicesr+   r   )r   Úsetr"   )r   s   "r   r   r   «   s(   € ÷ <ñ <œSð <¬3ð <¼ð <Äñ <r    c                ó‚   € \        V \        4      '       d   V P                  4       P                  4       MRpW19   d   V# T# )z@Lower-cased *value* when it is one of *choices*, else *default*.N)r.   r"   r#   r$   )r   rp   r+   Ú
normalizeds   &&& r   Ú_normalize_choicert   «   s4   € ä*4°U¼C×*@Ò*@�—‘“×$Ñ$Ô&Àd€JØ#Ô.ˆ:Ð;°GÐ;r    c                ó<   € V ^8„  d   QhR\         R\        R\         /# )r   Ú	containerr^   r   )rl   r"   )r   s   "r   r   r   ±   s!   € ÷ ñ œ$ð ¤Sð ¬Tñ r    c                ób   € V P                  V/ 4      p\        V\        4      '       g   / pW V&   V# )zSGet-or-create ``container[key]`` as a dict, replacing a non-dict value with ``{}``.)Ú
setdefaultr.   rl   )rv   r^   r   s   && r   Ú
_dict_slotry   ±   s2   € à× Ñ   bÓ)€EÜ�eœT×"Ò"ØˆØ�#‰Ø€Lr    c                óh   € V ^8„  d   QhR\         R\        \         ,          R\        \         ,          /# ©r   Únamer+   r   ©r"   r
   )r   s   "r   r   r   º   s)   € ÷ )ñ )”#ð )¤¬¥ð )¼Ä#½ñ )r    c                ó€   € \        4       e   \        V R4      pVe   V# T# \        P                  P	                  W4      # )z‰Env read through the active profile secret scope when present (multiplexed
per-profile secrets must win); otherwise legacy ``os.getenv``.N)r   Ú_get_secretr7   ÚenvironÚget)r|   r+   Ú	scope_vals   && r   Ú_getenvrƒ   º   s<   € ô ÓÒ)Ü  dÓ+ˆ	Ø%Ò1ˆyÐ>°wÐ>Ü�:‰:�>‰>˜$Ó(Ð(r    c                ó<   € V ^8„  d   QhR\         R\         R\         /# r{   r?   )r   s   "r   r   r   Ã   s&   € ÷ Kñ K”cð K¤Cð K´ñ Kr    c                 ó(   € \        W4      ;pe   V# T# rM   )rƒ   )r|   r+   Úvals   && r   Ú_getenv_strr‡   Ã   s   € Ü! $Ó0Ð0�3Ò=ˆ3ÐJÀ7ÐJr    c                óF   € V ^8„  d   QhR\         R\        \        ,          /# )r   Ú
plugin_dirr   )r   r
   r"   )r   s   "r   r   r   Ë   s   € ÷ ñ ´ð ¼Ä#½ñ r    c                ó`  a €  \        V 3R lR 4       R4      pVf   R# \        VP                  RR7      4      ;'       g    / p\        V\        4      '       d   VP                  R4      MRp\        V4      P                  4       P                  4       ;'       g    R#   \         d     R# i ; i)z]Lowercased ``name:`` from a bundled platform's plugin manifest (None when absent/unreadable).c              3   ót   <"  € T F-  pSV,          P                  4       '       g   K"  SV,          x € K/  	  R # 5irM   )Úexists)Ú.0Úmr‰   s   & €r   Ú	<genexpr>Ú2_bundled_platform_manifest_name.<locals>.<genexpr>Ï   s+   øé € Ð`Ñ%B ÀzÐTUÅ~×F]ÑF]×F_Œ^ˆZ˜!�^Š^Ó%Bùs   ƒ8§8Nz	utf-8-sig)Úencodingr|   )úplugin.yamlú
plugin.yml)
Únextr   Ú	read_textr.   rl   r�   r"   r#   r$   Ú	Exception)r‰   Úmanifest_fileÚdatar|   s   f   r   Ú_bundled_platform_manifest_namer™   Ë   s™   ø€ ð	ÜÜ`Ñ%BÓ`ÐbfóhˆàÒ ÙÜ˜m×5Ñ5¸{Ð5ÓKÓL×RÐRÐPRˆÜ#-¨d´D×#9Ò#9ˆt�x‰x˜Ô¸tˆÜ�4‹y�‰Ó ×&Ñ&Ó(×0Ð0¨DÐ0øÜô Úðús#   ƒB Ÿ!B ÁAB ÂB ÂB-Â,B-c                   óÈ   a € ] tR t^Ùt o RtRtRtRtRtRt	Rt
RtR	tR
tRtRtRtRtRtRtRtRtRtRtRtRtRtRt]R 4       t]V 3R lR l4       t]V 3R lR l4       tRt V t!R# ) ÚPlatformz¢Supported messaging platforms. Plugin platforms are dynamic members created on
demand by ``_missing_`` and cached so ``Platform("irc") is Platform("irc")`` holds.ÚlocalÚtelegramÚdiscordÚwhatsappÚwhatsapp_cloudÚslackÚsignalÚ
mattermostÚmatrixÚemailÚsmsÚdingtalkÚ
api_serverÚwebhookÚmsgraph_webhookÚfeishuÚwecomÚwecom_callbackÚweixinÚbluebubblesÚqqbotÚyuanbaoÚrelayc                ó²  € \        V\        4      '       d   VP                  4       '       g   R# VP                  4       P                  4       pWP                  9   d   V P                  V,          # \
        f   V P                  4       w  ssV\
        9   pV'       g�   \        P                  V4      pVe5   V P                  P                  V4      ;'       g    V P                  V4      # \        P                  ! \        4      ;_uu_ 4        ^ RIHp VP                  V4      pRRR4       V'       d   V P                  V4      # R#   + '       g   i     L+; i)z`Accept unknown names only for bundled or runtime-registered plugin adapters (no enum pollution).N©Úplatform_registry)r.   r"   r#   r$   Ú_value2member_map_Ú_Platform__bundled_plugin_namesÚ_scan_bundled_plugin_platformsÚ!_Platform__bundled_plugin_aliasesr�   Ú_add_pseudo_memberrg   rh   r–   Úgateway.platform_registryrµ   Úis_registered)Úclsr   Ú
registeredÚaliasrµ   s   &&   r   Ú	_missing_ÚPlatform._missing_ô   s  € ô ˜%¤×%Ò%¨U¯[©[¯]ª]ÙØ—‘“×#Ñ#Ó%ˆØ×*Ñ*Ô*Ø×)Ñ)¨%Õ0Ð0ä*Ò2ØQT×QsÑQsÓQuÑNÐ+Ð-NØÔ=Ñ=ˆ
ßÜ5×9Ñ9¸%Ó@ˆEØÒ ð
 ×-Ñ-×1Ñ1°%Ó8×YÐY¸C×<RÑ<RÐSXÓ<YÐYÜ×$Ò$¤Y×/Õ/ÝGØ.×<Ñ<¸UÓC�
÷ 0÷ 1;ˆs×%Ñ% eÓ,ÐDÀÐD÷ 0×/ús   ÄEÅE	c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   r   r   r›   r?   )r   Ú__classdict__s   "€r   r   ÚPlatform.__annotate__  s   ø€ ÷ ñ ¡sð ¨zñ r    c                óò   € \         P                  V 4      pWn        VP                  4       P	                  R R4      P	                  RR4      Vn        W P                  V&   W P                  VP
                  &   V# )Ú-Ú_Ú )ÚobjectÚ__new__Ú_value_ÚupperÚreplaceÚ_name_r¶   Ú_member_map_)r½   r   Úpseudos   && r   rº   ÚPlatform._add_pseudo_member  sa   € ä—‘ Ó$ˆØŒØŸ™›×-Ñ-¨c°3Ó7×?Ñ?ÀÀSÓIˆŒØ(.×Ñ˜uÑ%Ø*0×Ñ˜Ÿ™Ñ'Øˆr    c                ó6   <€ V ^8„  d   QhRS[ S[S[3,          /# ©r   r   )Útuplerq   rl   )r   rÃ   s   "€r   r   rÄ     s   ø€ ÷ ñ ©u±S¹$°YÕ/?ñ r    c                óö  €  \        \        4      P                  P                  R,          R,          pVP                  4       '       d   VP	                  4       MR Uu. uFx  pVP                  4       '       g   K  VR,          P                  4       '       g   K:  VR,          P                  4       '       g    VR,          P                  4       '       g   Kv  VNKz  	  ppV Uu0 uF  q"P                  P                  4       kK  	  pp/ pV FD  p\        V4      pV'       g   K  Wd9  g   K   We9  g   K(  VP                  P                  4       WV&   KF  	  WE3# u upi u upi   \         d    \        4       / 3u # i ; i)a  Directory names of bundled platform plugins under ``plugins/platforms/``, plus a map of
manifest ``name:`` keys that differ from their directory (alias -> directory name). Aliases
never shadow a directory name, so the directory stays the canonical platform value.ÚpluginsÚ	platformsz__init__.pyr’   r“   © )r   Ú__file__ÚparentÚis_dirÚiterdirrŒ   r|   r$   r™   r–   rq   )r½   Úplatforms_dirÚchildÚdirsÚnamesÚaliasesÚmanifest_names   &      r   r¸   Ú'Platform._scan_bundled_plugin_platforms  s<  € ð
	Ü ¤›N×1Ñ1×8Ñ8¸9ÕDÀ{ÕRˆMà?L×?SÑ?S×?UÒ?U M×$9Ñ$9Ô$;Ð[]Ð$]óÙ$]˜%Ø—<‘<—>ô Ø',¨}Õ'<×&DÑ&D×&Fô à˜mÕ+×3Ñ3×5Ò5¸%À,Õ:N×9VÑ9V×9X÷ �Ñ$]ð ð ñ
 6:Ó:±T¨E—Z‘Z×%Ñ%Ö'±TˆEÐ:ØˆGÛ�Ü ?ÀÓ F�ß ‘= ]Ö%?ÀMÖD`Ø-2¯Z©Z×-=Ñ-=Ó-?�GÓ*ñ ð �>Ð!ùòùò
 ;øô ô 	Ü“5˜"�9Òð	úsZ   ‚AE ÁEÁ:EÂEÂ6EÃEÃE Ã!"EÄE Ä!E Ä)E Ä1"E Å
E ÅE8Å7E8rØ   N)"Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ÚLOCALÚTELEGRAMÚDISCORDÚWHATSAPPÚWHATSAPP_CLOUDÚSLACKÚSIGNALÚ
MATTERMOSTÚMATRIXÚEMAILÚSMSÚDINGTALKÚ
API_SERVERÚWEBHOOKÚMSGRAPH_WEBHOOKÚFEISHUÚWECOMÚWECOM_CALLBACKÚWEIXINÚBLUEBUBBLESÚQQBOTÚYUANBAOÚRELAYÚclassmethodrÀ   rº   r¸   Ú__static_attributes__Ú__classdictcell__©rÃ   s   @r   r›   r›   Ù   sº   ø‡ € ñ[à€EØ€HØ€GØ€HØ%€NØ€EØ€FØ€JØ€FØ€EØ
€CØ€HØ€JØ€GØ'€OØ€FØ€EØ%€NØ€FØ€KØ€EØ€GØ€EàñEó ðEð0 ÷ó ðð ÷ó ör    r›   c              #   ó8   "  € T F  qP                   x € K  	  R # 5irM   rI   )r�   rŽ   s   & r   r�   r�   .  s   é € Ð$TÑ6S°§W¦WÓ6Sùs   ‚r©   r¨   r«   z/v1z/webhooks/<route>c                óR   € V ^8„  d   QhR\         R\        \        ,          R\        /# )r   Úplatform_valueÚextrar   )r"   r
   rl   r   )r   s   "r   r   r   @  s*   € ÷ |ñ |¬ð |´H¼TµNð |Ìdñ |r    c                óæ   € V \         9  d   R# \        P                  V 4      pVRJ ;'       gE    \        T;'       g    / P                  RR4      4      P	                  4       P                  4       V8H  # )zDTrue when *platform_value* actually binds a port for *extra* config.FNÚconnection_modeÚ	websocket)ÚPORT_BINDING_PLATFORM_VALUESÚPORT_BINDING_CONDITIONAL_MODESr�   r"   r#   r$   )r  r  Úexpected_modes   && r   Úplatform_binds_portr  @  sb   € àÔ9Ô9ÙÜ2×6Ñ6°~ÓF€MØ˜DÐ ×{Ð{¤C¨¯¨°"×(9Ñ(9Ð:KÈ[Ó(YÓ$Z×$`Ñ$`Ó$b×$hÑ$hÓ$jÐn{Ñ${Ð{r    zThttps://(?:(?:ptb|canary)\.)?discord(?:app)?\.com/channels/(?:[0-9]+|@me)/([0-9]+)/?c                óF   € V ^8„  d   QhR\         R\        \         ,          /# r   r}   )r   s   "r   r   r   K  s   € ÷ -ñ -¬ð -´¼µñ -r    c                ób   € \         P                  V 4      pV'       d   VP                  ^4      # R# )zðChannel id from a pasted Discord channel link (``https://discord.com/channels/<guild>/<channel>``),
else None. Message links (a third path segment) and anything that is not a channel link are
left alone so callers keep their own error path.N)Ú_DISCORD_CHANNEL_LINK_REÚ	fullmatchÚgroup)r   Úmatchs   & r   Údiscord_channel_id_from_linkr  K  s)   € ô %×.Ñ.¨uÓ5€Eß"ˆ5�;‰;�q‹>Ð,¨Ð,r    c                   ó|   a € ] tR tRt o RtRtRtRtV 3R lR ltV 3R lR lt	]
V 3R lR	 l4       tV 3R
 ltRtV tR# )ÚHomeChanneliS  z˜Default destination for a platform (``deliver="telegram"`` without a chat ID);
``thread_id`` routes the bare target to the topic where /sethome was run.Nc                ó   <€ V ^8„  d   QhRR/# r2   rØ   )r   rÃ   s   "€r   r   ÚHomeChannel.__annotate___  s   ø€ ÷ ^ñ ^˜tñ ^r    c                ó  € V P                   \        P                  8X  da   \        V P                  \
        4      '       d?   \        V P                  P                  4       4      ;'       g    V P                  V n        R # R # R # rM   )Úplatformr›   rë   r.   Úchat_idr"   r  r#   ©Úselfs   &r   Ú__post_init__ÚHomeChannel.__post_init___  sW   € ð �=‰=œH×,Ñ,Ô,´¸D¿L¹LÌ#×1NÒ1NÜ7¸¿¹×8JÑ8JÓ8LÓM×]Ð]ÐQU×Q]ÑQ]ˆDŽLñ 2OÑ,r    c                ó6   <€ V ^8„  d   QhRS[ S[S[3,          /# rÓ   ©rl   r"   r   )r   rÃ   s   "€r   r   r  e  s   ø€ ÷ iñ i™™c¡3˜h�ñ ir    c                ó¼   € R Uu/ uF  p\        W4      ;p'       g   K  WbK  	  ppRV P                  P                  RV P                  RV P                  /VC# u upi )Ú	thread_idr  r  r|   ©r$  Úuser_idÚscope_id)Úgetattrr  r   r  r|   )r  ÚkÚvÚoptionals   &   r   Úto_dictÚHomeChannel.to_dicte  sa   € Ù"FÓbÑ"F˜QÔPWÐX\ÓP`ÐK`È1ÓK`”D�A’DÑ"FˆÐbØ˜DŸM™M×/Ñ/°¸D¿L¹LÈ&ÐRV×R[ÑR[ÐhÐ_gÐhÐhùò cs
   …AŸAc                ó:   <€ V ^8„  d   QhRS[ S[S[3,          RR/# )r   r˜   r   r  r"  )r   rÃ   s   "€r   r   r  j  s'   ø€ ÷ Añ A™T¡#¡s (�^ð A°ñ Ar    c                óú   € R Uu/ uF-  q"VP                  V4      '       d   \        W,          4      MRbK/  	  ppV ! RR\        VR,          4      R\        VR,          4      RVP                  RR4      /VB # u upi )r$  Nr  r  r|   ÚHomer%  rØ   )r�   r"   r›   )r½   r˜   r)  r+  s   &&  r   Ú	from_dictÚHomeChannel.from_dicti  sˆ   € áFjÓkÑFjÀ t§x¡x°§{¢{”s˜4�7”|¸Ò<ÑFjˆÐkÙñ  AœH T¨*Õ%5Ó6ð  AÄÀDÈÅOÓ@Tð  AÐ[_×[cÑ[cÐdjÐlrÓ[sð  AÐwñ  Að  	Aùò ls   …3A8c                ó’   <€ V ^8„  d   Qh/ S[ ;R&   S[;R&   S[;R&   S[S[,          ;R&   S[S[,          ;R&   S[S[,          ;R&   # )r   r  r  r|   r$  r&  r'  )r›   r"   r
   )r   rÃ   s   "€r   r   r  S  s]   ø‡ ‚ ñ Ññ	 ñ
 �Lñ ñ �Iñ ñ ™�}Ñ#ñ ñ ‘c�]Ñ!ñ ñ ‘s�mÑ"ò r    )r  )rä   rå   ræ   rç   rè   r$  r&  r'  r  r,  r   r1  Ú__annotate_func__r  r  r  s   @r   r  r  S  sQ   ø‡ € ñQð
  $€Ià!€GØ"€H÷^ð ^÷ið ið ÷Aó ðA÷/ ƒ r    r  Úenabled_if_newFc                ó4   € V ^8„  d   QhR\         R\        RR/# )r   Úhomer5  r   N)r  r   )r   s   "r   r   r   o  s"   € ÷ ñ œ{ð ¼tð ÐPTñ r    c               óâ   € ^ RI HpHp V! 4       p\        \        VR4      V P                  P
                  4      pV'       d   VP                  RR4       V P                  4       VR&   V! V4       R# )zHPersist a logical home without falsely enabling a Relay-fronted adapter.)Úload_configÚsave_configr×   ÚenabledTÚhome_channelN)Úhermes_cli.configr9  r:  ry   r  r   rx   r,  )r7  r5  r9  r:  ÚconfigÚplatform_configs   &$    r   Úpersist_home_channelr@  o  sT   € ç:Ù‹]€FÜ ¤¨F°KÓ!@À$Ç-Á-×BUÑBUÓV€OßØ×"Ñ" 9¨dÔ3Ø&*§l¡l£n€O�NÑ#Ù�Ör    c                   ój   a € ] tR tRt o RtRtRtRtV 3R lR lt]	V 3R lR l4       t
V 3R ltR	tV tR# )
ÚChannelOverrideiz  zgPer-channel model/provider/system_prompt override (``platforms.<name>.channel_overrides[channel_id]``).Nc                ó6   <€ V ^8„  d   QhRS[ S[S[3,          /# rÓ   r"  )r   rÃ   s   "€r   r   ÚChannelOverride.__annotate__�  s   ø€ ÷ Hñ H™™c¡3˜h�ñ Hr    c                ót   € \        V 4      P                  4        UUu/ uF  w  rVf   K  WbK  	  upp# u uppi rM   )r   Úitems)r  r)  r*  s   &  r   r,  ÚChannelOverride.to_dict�  s1   € Ü!'¨£×!3Ñ!3Ô!5ÔGÑ!5™˜¸”�’Ñ!5ÒGÐGùÓGs   �4ª4c                ó:   <€ V ^8„  d   QhRS[ S[S[3,          RR/# )r   r˜   r   rB  r"  )r   rÃ   s   "€r   r   rD  …  s(   ø€ ÷ Yñ Y™T¡#¡s (�^ð YÐ0Añ Yr    c                ó²   € V'       dE   T ! R/ \        V 4       Uu/ uF(  q"P                  VP                  VP                  4      bK*  	  upB # V ! 4       # u upi )NrØ   )r   r|   r�   )r½   r˜   Úfs   && r   r1  ÚChannelOverride.from_dict„  sE   € çIM‰sÑE¼¸s¼ÓD¹°1—f‘f˜dŸh™h q§v¡vÓ.Ò.¹ÑDÑEÐXÑSVÓSXÐXùÒDs   š.Ac                ón   <€ V ^8„  d   Qh/ S[ S[,          ;R&   S[ S[,          ;R&   S[ S[,          ;R&   # )r   ÚmodelÚproviderÚsystem_prompt)r
   r"   )r   rÃ   s   "€r   r   rD  z  s8   ø‡ ‚ ñ ‘C�=Ññ ñ ‘s�mÑ"ñ	 ñ
 ™C•=Ñ'ò r    rØ   )rä   rå   ræ   rç   rè   rM  rN  rO  r,  r   r1  r4  r  r  r  s   @r   rB  rB  z  s@   ø‡ € áqØ€EØ"€HØ#'€M÷Hð Hð ÷Yó ðY÷ ƒ r    rB  ÚTELEGRAM_BOT_TOKENÚDISCORD_BOT_TOKENÚSLACK_BOT_TOKENÚMATTERMOST_TOKENÚMATRIX_ACCESS_TOKENÚWEIXIN_TOKENc                   ó¶   a € ] tR tRt o RtRtRtRtRtRt	Rt
RtRt]! ]R7      t]! ]R7      tV 3R lR	 lt]! 0 Rm4      t]V 3R
 lR l4       tV 3R ltRtV tR# )ÚPlatformConfigi˜  z.Configuration for a single messaging platform.FNÚfirstT©Údefault_factoryc                ó6   <€ V ^8„  d   QhRS[ S[S[3,          /# rÓ   r"  )r   rÃ   s   "€r   r   ÚPlatformConfig.__annotate__§  s   ø€ ÷ ñ ™™c¡3˜h�ñ r    c           
     ó"  € R V P                   RV P                  RV P                  RV P                  RV P                  /V P
                  e   RV P
                  /M/ CR Uu/ uF  p\        W4      ;p'       g   K  WbK  	  upCpV P                  '       d   V P                  P                  4       VR&   V P                  '       d@   V P                  P                  4        UUu/ uF  w  rEWEP                  4       bK  	  uppVR&   V# u upi u uppi )	r;  r  Úreply_to_modeÚgateway_restart_notificationÚtyping_indicatorÚtyping_status_textr<  Úchannel_overrides)r'   Úapi_key)r;  r  r^  r_  r`  ra  r(  r<  r,  rb  rF  )r  r)  r*  ÚresultÚcidÚovs   &     r   r,  ÚPlatformConfig.to_dict§  s  € à�t—|‘| W¨d¯j©j¸/È4×K]ÑK]Ø*¨D×,MÑ,MØ × 5Ñ 5ð
ð CG×BYÑBYÒBeÐ$ d×&=Ñ&=Ñ>Ðkmð	
ñ
 2ÓMÑ1˜¼7À4Ó;KÐ6K°aÓ6KŒtˆqŠtÑ1ÑMð
ˆð ××ÐØ%)×%6Ñ%6×%>Ñ%>Ó%@ˆF�>Ñ"Ø×!×!Ð!ØLP×LbÑLb×LhÑLhÔLjÔ*kÑLjÁÀ¨3·
±
³Ò+<ÑLjÒ*kˆFÐ&Ñ'Øˆùò Nùó
 +ls   Á DÁ:DÃ"Dc                ó:   <€ V ^8„  d   QhRS[ S[S[3,          RR/# )r   r˜   r   rW  r"  )r   rÃ   s   "€r   r   r\  ½  s$   ø€ ÷ 
ñ 
™T¡#¡s (�^ð 
Ð0@ñ 
r    c                ó|  aa
€ \        S4      oSP                  R 4      p/ SP                  4        UUu/ uF  w  r4W0P                  9  g   K  W4bK  	  uppC\        SP                  R/ 4      4      Co
R VV
3R llpSP                  R4      ;'       g    / p\	        V\
        4      '       dZ   VP                  4        UUu/ uF<  w  rx\	        V\
        4      '       g   K  \        V4      \        P                  V4      bK>  	  uppM/ p	T ! \        SP                  R4      R4      SP                  R4      SP                  R4      \	        V\
        4      '       d   \        P                  V4      MR	SP                  R
R4      \        V! R4      R4      \        V! R4      R4      V! R4      V	S
R7
      # u uppi u uppi )r<  r  c                ó0   € V ^8„  d   QhR\         R\        /# ©r   r^   r   ©r"   r   )r   s   "r   r   Ú.PlatformConfig.from_dict.<locals>.__annotate__Æ  s   € ÷ 	>ñ 	>¤3ð 	>¬3ñ 	>r    c                 óT   <€ SP                  V 4      pVf   SP                  V 4      # T# rM   ©r�   )r^   r   r˜   r  s   & €€r   Útoplevel_or_extraÚ3PlatformConfig.from_dict.<locals>.toplevel_or_extraÆ  s'   ø€ Ø—H‘H˜S“MˆEØ%*¢]�5—9‘9˜S“>Ð=¸Ð=r    rb  r;  Fr'   rc  Nr^  rX  r_  Tr`  ra  )
r;  r'   rc  r<  r^  r_  r`  ra  rb  r  )rn   r�   rF  Ú_TYPED_KEYSr.   rl   r"   rB  r1  r0   r  )r½   r˜   r7  r)  r*  rp  Úraw_overridesre  Úov_datarb  r  s   &f        @r   r1  ÚPlatformConfig.from_dict¼  sŽ  ù€ ä˜DÓ!ˆØ�x‰x˜Ó'ˆð
 w T§Z¡Z¤\ÔN¡\™T˜Q°Q¿o¹oÑ5M”D�A’D¡\ÒNÐvÔR^Ð_c×_gÑ_gÐhoÐqsÓ_tÓRuÐvˆ÷	>ñ 	>ð Ÿ™Ð!4Ó5×;Ð;¸ˆô
 ˜¤t×,Ò,ð !.× 3Ñ 3Ô 5ô
á 5‘�Ü˜'¤4×(ô 9ŒC�‹H”o×/Ñ/°Ó8Ò8Ù 5ó
ð 35ð	 	ñ Ü  §¡¨)Ó!4°eÓ<Ø—(‘(˜7Ó#Ø—H‘H˜YÓ'Ü8BÀ4Ì×8NÒ8Nœ×.Ñ.¨tÔ4ÐTXØŸ(™( ?°GÓ<Ü)5Ñ6GÐHfÓ6gÐimÓ)nÜ)Ñ*;Ð<NÓ*OÐQUÓVÙ0Ð1EÓFØ/Øô
ð 	
ùó Oùó
s   ³F2ÁF2Ã F8Ã#F8c                óþ   <€ V ^8„  d   Qh/ S[ ;R&   S[S[,          ;R&   S[S[,          ;R&   S[S[,          ;R&   S[;R&   S[ ;R&   S[ ;R&   S[S[,          ;R&   S[S[S[3,          ;R	&   S[S[S[3,          ;R
&   # )r   r;  r'   rc  r<  r^  r_  r`  ra  rb  r  )r   r
   r"   r  rl   rB  r   )r   rÃ   s   "€r   r   r\  ˜  sª   ø‡ ‚ ñ Ññ ñ ‘C�=Ññ	 ñ
 ‘c�]Ñ!ñ ñ ™;Õ'Ñ.ñ ñ Ñ ñ ñ #'Ñ-ñ ñ Ñ!ñ ñ !¡�Ñ,ñ ñ ™C¡Ð0Õ1ÑOñ ñ ‘‘S��>Ñ7ò r    rØ   >
   r  r'   rc  r;  r<  r^  r`  rb  ra  r_  )rä   rå   ræ   rç   rè   r;  r'   rc  r<  r^  r_  r`  ra  r   rl   rb  r  r,  Ú	frozensetrr  r   r1  r4  r  r  r  s   @r   rW  rW  ˜  s   ø‡ € á8Ø€GØ€EØ!€GØ*.€LØ €MØ)-Ð Ø!Ðà(,ÐÙ49È$Ô4OÐÙ!°$Ô7€E÷ð ñ  ò ó €Kð
 ÷
ó ð
÷K ƒ r    rW  gš™™™™™é?u    â–‰c                   ó¤   a € ] tR tRt o RtRtRt]t]	t
]tRt]V 3R lR l4       tV 3R lR	 ltV 3R
 lR lt]V 3R lR l4       tV 3R ltRtV tR# )ÚStreamingConfigiæ  z1Real-time token streaming to messaging platforms.FrG   ç        c                ó    <€ V ^8„  d   QhRS[ /# rÓ   r3   )r   rÃ   s   "€r   r   ÚStreamingConfig.__annotate__ù  s   ø€ ÷ >ñ >¡$ñ >r    c                óZ   € \        V P                  4      ;'       d    V P                  R8g  # )zKThe ``streaming.enabled`` master switch (``transport: off`` also disables).rH   )r   r;  Ú	transportr  s   &r   Úglobally_enabledÚ StreamingConfig.globally_enabledø  s$   € ô �D—L‘LÓ!×=Ð= d§n¡n¸Ñ&=Ð=r    c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   Úplatform_overrider   r,   )r   rÃ   s   "€r   r   r|  ý  s   ø€ ÷ `ñ `©Sð `±Tñ `r    c                óX   € V P                   ;'       d    VRJ ;'       g    \        V4      # )zÞEffective streaming for one platform.

``platform_override`` is ``display.platforms.<plat>.streaming`` (``None`` = follow global).
A per-platform value can only narrow the global switch, never enable streaming on its own.
N)r  r   )r  r‚  s   &&r   Úenabled_forÚStreamingConfig.enabled_forý  s,   € ð ×$Ñ$×_Ð_Ð*;¸tÐ*C×*^Ð*^ÄtÐL]ÓG^Ð_r    c                ó6   <€ V ^8„  d   QhRS[ S[S[3,          /# rÓ   r"  )r   rÃ   s   "€r   r   r|    s   ø€ ÷ ñ ™™c¡3˜h�ñ r    c                ó   € \        V 4      # rM   )r   r  s   &r   r,  ÚStreamingConfig.to_dict  s   € Ü�d‹|Ðr    c                ó:   <€ V ^8„  d   QhRS[ S[S[3,          RR/# )r   r˜   r   ry  r"  )r   rÃ   s   "€r   r   r|  	  s$   ø€ ÷ 
ñ 
™T¡#¡s (�^ð 
Ð0Añ 
r    c                ó  € \        V\        4      '       d	   V'       g   V ! 4       # VP                  R 4      pVP                  R4      pRV9   d   \        VP                  R4      R4      pMVRJ;'       d    \	        V4      R8g  pT ! T\	        Ve   TMT4      \        VP                  R4      \        4      \        VP                  R4      \        4      VP                  R\        4      \        VP                  R	4      R
4      R7      # )r~  Úmoder;  FNrH   Úedit_intervalÚbuffer_thresholdÚcursorÚfresh_final_after_secondsrz  )r;  r~  rŒ  r�  rŽ  r�  )
r.   rl   r�   r0   rJ   rW   ÚDEFAULT_STREAMING_EDIT_INTERVALr[   Ú"DEFAULT_STREAMING_BUFFER_THRESHOLDÚDEFAULT_STREAMING_CURSOR)r½   r˜   Úraw_transportÚraw_moder;  s   &&   r   r1  ÚStreamingConfig.from_dict  sÞ   € ä˜$¤×%Ò%¯TÙ“5ˆLð
 Ÿ™ Ó-ˆØ—8‘8˜FÓ#ˆØ˜ÔÜ" 4§8¡8¨IÓ#6¸Ó>‰Gà dÐ*×\Ð\Ô/IÈ(Ó/SÐW\Ñ/\ˆGÙØÜ0À-ÒB[±ÐaiÓjÜ'¨¯©°Ó(AÔCbÓcÜ(¨¯©Ð2DÓ)EÔGiÓjØ—8‘8˜HÔ&>Ó?Ü&3°D·H±HÐ=XÓ4YÐ[^Ó&_ô
ð 	
r    c                ób   <€ V ^8„  d   Qh/ S[ ;R&   S[;R&   S[;R&   S[;R&   S[;R&   S[;R&   # )r   r;  r~  rŒ  r�  rŽ  r�  )r   r"   rT   rY   )r   rÃ   s   "€r   r   r|  æ  sS   ø‡ ‚ ñ Ññ ñ Ññ ñ Ñ:ñ ñ Ñ>ñ ñ Ñ*ñ ñ   %Ñ*ò! r    rØ   N)rä   rå   ræ   rç   rè   r;  r~  r�  rŒ  r‘  r�  r’  rŽ  r�  Úpropertyr  r„  r,  r   r1  r4  r  r  r  s   @r   ry  ry  æ  sp   ø‡ € á;Ø€Gð €IØ:€MØ>ÐØ*€Fð (+Ðà÷>ó ð>÷`ð `÷ð ð ÷
ó ð
÷G ƒ r    ry  c                ó0   € V ^8„  d   QhR\         R\        /# rk  )rÉ   r   )r   s   "r   r   r      s   € ÷ 	+ñ 	+¤Fð 	+¬tñ 	+r    c                ó¤   € V '       g   R#  ^ RI Hp V! V ^R7      #   \         d)    \        \	        T 4      P                  4       4      ^8¬  u # i ; i)z£True when API_SERVER_KEY is strong enough for the adapter to start (mirrors the
``has_usable_secret(min_length=16)`` guard in ``gateway/platforms/api_server.py``).F©Úhas_usable_secret©Ú
min_length)Úhermes_cli.authr›  ÚImportErrorÚlenr"   r#   )r^   r›  s   & r   Ú_has_usable_api_server_keyr¡     sI   € ÷ Ùð+Ý5Ù  °Ô4Ð4øÜô +Ü”3�s“8—>‘>Ó#Ó$¨Ñ*Ò*ð+ús   Œ œ0AÁAc                 óf   € \        V '       d    V P                  P                  R 4      4      # R4      # )r^   N)r¡  r  r�   ©Úcfgs   &r   Ú<lambda>r¥  /  s    € Ô%?×X[ÀÇ	Á	ÇÁÈeÓ@TÔ%fÐaeÔ%fr    c                 ó   € R # ©TrØ   r£  s   &r   r¥  r¥  0  s   € ¡$r    c                 óŒ   € \        \        V P                  P                  R 4      ;'       g    R4      P	                  4       4      # )Úclient_stater6   )r   r"   r  r�   r#   r£  s   &r   r¥  r¥  1  s-   € ¬$¬s°3·9±9·=±=ÀÓ3P×3VÐ3VÐTVÓ/W×/]Ñ/]Ó/_Ô*`r    c                 ó�   € \        V P                  P                  R 4      ;'       g    V P                  P                  R4      4      # )Ú	relay_urlÚurl)r   r  r�   r£  s   &r   r¥  r¥  3  s,   € ¤ S§Y¡Y§]¡]°;Ó%?×%WÐ%WÀ3Ç9Á9Ç=Á=ÐQVÓCWÔ Xr    c                ó$   € V ^8„  d   QhR\         /# )r   r  )r›   )r   s   "r   r   r   7  s   € ÷ ñ ¬ñ r    c                ó\  € \         P                  ! \        4      ;_uu_ 4        ^ RIHp V! 4        RRR4       \         P                  ! \        4      ;_uu_ 4        ^ RIHp VP                  V P                  4      uuRRR4       #   + '       g   i     L^; i  + '       g   i     R# ; i)u7  Registry entry for *platform* after (idempotent) plugin discovery, so a directly-constructed
config sees plugin platforms; None when absent or the registry is not initialised yet (early import).

Enablement gate (#31116): a plugin's ``is_connected`` ("has the user actually configured
credentials for this?") is consulted before treating it as connected; ``check_fn`` alone â€” a
passive "is the SDK importable?" probe â€” must never make a platform the user never opted into
look connected (``_platform_status`` was fixed for the same bug class in commit 7849a3d73).)Údiscover_pluginsNr´   )	rg   rh   r–   Úhermes_cli.pluginsr¯  r»   rµ   r�   r   )r  r¯  rµ   s   &  r   Ú_discovered_registry_entryr±  7  sj   € ô 
×	Ò	œY×	'Õ	'Ý7ÙÔ÷ 
(ô 
×	Ò	œY×	'Õ	'Ý?Ø ×$Ñ$ X§^¡^Ó4÷ 
(Ò	'÷ 
(×	'ú÷ 
(Ö	'ñ ús   £BÁ!BÂB	ÂB+	Úwrite_sessions_jsonÚalways_log_localÚfilter_silence_narrationÚgroup_sessions_per_userÚthread_sessions_per_userc                   ó¤  a € ] tR tRt o Rt]! ]R7      t]! R R7      t]! ]R7      t	]! R R7      t
RtRtRtRtRtRtRtRtRtRt^ tRt]t]t]tR	tR
tRt]! ] R7      t!^Zt"]! ]#R7      t$R t%V 3R lR lt&V 3R lR lt'V 3R lR lt(V 3R lR lt)V 3R lR lt*]+V 3R lR l4       t,V 3R lR lt-R!V 3R lR llt.R!V 3R lR llt/V 3R lt0Rt1V t2R# )"ÚGatewayConfigiO  zVMain gateway configuration: platform connections, session policies, delivery settings.rY  c                 ó
   € R R.# )ú/newú/resetrØ   rØ   r    r   r¥  ÚGatewayConfig.<lambda>S  s	   € ¸vÀxÑ>Pr    c                 ó$   € \        4       R ,          # )Úsessionsr   rØ   r    r   r¥  r¼  U  s   € ´Ó7HÈ:Ö7Ur    TFNÚexitÚpairr6   c                ó   <€ V ^8„  d   QhRR/# r2   rØ   )r   rÃ   s   "€r   r   ÚGatewayConfig.__annotate__—  s   ø€ ÷ gñ g˜tñ gr    c                ó:   € \        V P                  4      V n        R # rM   )rj   Úsystemd_watchdog_secondsr  s   &r   r  ÚGatewayConfig.__post_init__—  s   € Ü(GÈ×HeÑHeÓ(fˆÖ%r    c                ó0   <€ V ^8„  d   QhRS[ S[,          /# rÓ   )rC   r›   )r   rÃ   s   "€r   r   rÂ  š  s   ø€ ÷ =ñ =©©h­ñ =r    c                óÞ   € V P                   P                  4        UUu. uF4  w  rVP                  '       g   K  V P                  W4      '       g   K2  VNK6  	  ppp\	        VR R7      # u uppi )z•Enabled + configured platforms, sorted by value so the rendered "Connected
Platforms" prompt block is byte-stable (a reorder busts the prompt cache).c                 ó,   € \        V P                  4      # rM   )r"   r   )Úps   &r   r¥  Ú7GatewayConfig.get_connected_platforms.<locals>.<lambda>ž  s   € ¬s°1·7±7¬|r    )r^   )r×   rF  r;  Ú_is_platform_connectedr;   )r  rÉ  ÚcÚ	connecteds   &   r   Úget_connected_platformsÚ%GatewayConfig.get_connected_platformsš  sU   € ð $(§>¡>×#7Ñ#7Ô#9ÔmÑ#9™4˜1¸Q¿Y½Y”QÈ4×KfÑKfÐgh×Kl—Q�QÑ#9ˆ	ÑmÜ�iÑ%;Ô<Ð<ùó ns   žA)¹A)ÁA)c                ó,   <€ V ^8„  d   QhRS[ RS[RS[/# )r   r  r>  r   )r›   rW  r   )r   rÃ   s   "€r   r   rÂ     s#   ø€ ÷ ñ ©xð Áð ÑTXñ r    c                óè  € \         P                  V4      pVe:   \        VP                  ;'       g    VP                  4      ;'       g	    V! V4      # \        V4      pVe    VP                  e   VP                  V4      # VP                  '       g   VP                  '       d   R# Vf   R# VP                  e   VP                  MVP                  p Vf   R# V! V4      #   \         d     R# i ; i)NTF)
Ú_PLATFORM_CONNECTED_CHECKERSr�   r   r'   rc  r±  Úconfig_connected_fnÚis_connectedÚvalidate_configr–   )r  r  r>  ÚcheckerÚentryÚchecks   &&&   r   rË  Ú$GatewayConfig._is_platform_connected   sÏ   € Ü.×2Ñ2°8Ó<ˆØÒÜ˜Ÿ™×6Ð6¨¯©Ó7×JÐJ¹7À6»?ÐJÜ*¨8Ó4ˆàÒ ×!:Ñ!:Ò!FØ×,Ñ,¨VÓ4Ð4Ø�<�<ˆ<˜6Ÿ>Ÿ>˜>ÙØŠ=ÙØ&+×&8Ñ&8Ò&D�×"Ò"È%×J_ÑJ_ˆð	Ø š=�4Ð;©e°F«mÐ;øÜô 	Úð	ús   ÃC" ÃC" Ã"C1Ã0C1c                ó6   <€ V ^8„  d   QhRS[ RS[S[,          /# ©r   r  r   )r›   r
   r  )r   rÃ   s   "€r   r   rÂ  ²  s$   ø€ ÷ _ñ _©ð _±h¹{Õ6Kñ _r    c                ó‚   € V P                   P                  V4      '       d   V P                   V,          P                  # R # rM   )r×   r�   r<  )r  r  s   &&r   Úget_home_channelÚGatewayConfig.get_home_channel²  s1   € Ø8<¿¹×8JÑ8JÈ8×8TÒ8Tˆt�~‰~˜hÕ'×4Ñ4Ð^ÐZ^Ð^r    c                ó6   <€ V ^8„  d   QhRS[ S[S[3,          /# rÓ   r"  )r   rÃ   s   "€r   r   rÂ  µ  s   ø€ ÷ 
ñ 
™™c¡3˜h�ñ 
r    c                óº  € R V P                   P                  4        UUu/ uF   w  rVP                  VP                  4       bK"  	  uppRV P                  RV P
                  R\        V P                  4      /V P                   Uu/ uF  q3\        W4      bK  	  upCRV P                  P                  4       RV P                  RV P                   UUUu. uFf  p\        V4      '       dQ   \        V\        4      '       g;   \!        V4      P                  4        UUu/ uF  w  rVVR8w  g   Vf   K  WVbK  	  uppMTNKh  	  uppp/C# u uppi u upi u uppi u upppi )r×   Úreset_triggersÚquick_commandsÚsessions_dirÚ	streamingÚsession_store_max_age_daysÚprofile_routesr&  )r×   rF  r   r,  rá  râ  r"   rã  Ú_SCALAR_DICT_FIELDSr(  rä  rå  ræ  r   r.   Útyper   )r  rÉ  rÌ  r|   Úrr)  r*  s   &      r   r,  ÚGatewayConfig.to_dictµ  s9  € à¸4¿>¹>×;OÑ;OÔ;QÔRÑ;Q±4°1˜!Ÿ'™' 1§9¡9£;Ò.Ñ;QÒRØ˜d×1Ñ1Ø˜d×1Ñ1ØœC × 1Ñ 1Ó2ð	
ð
 6:×5MÒ5MÓNÑ5M¨T”W˜TÓ(Ò(Ñ5MÑNð
ð ˜Ÿ™×/Ñ/Ó1Ø(¨$×*IÑ*IØð ×,Ò,õñ -�Aô   —?’?¬:°a¼×+>Ò+>ô #)¨£)§/¡/Ô"3ÔWÑ"3™$˜!°q¸I´~È”�’Ñ"3ÓWØDEòFá,óñ
ð 	
ùÛRùò Oùó Xùôs*   Ÿ&EÂEÃAEÄEÄ.EÄ4
EÅEc                ó:   <€ V ^8„  d   QhRS[ S[S[3,          RR/# )r   r˜   r   r¸  r"  )r   rÃ   s   "€r   r   rÂ  Æ  s'   ø€ ÷ \
ñ \
™T¡#¡s (�^ð \
°ñ \
r    c                óÂ  aaa€ \        S4      o\        SP                  R 4      4      oR VV3R lloR V3R llpRR/R V3R lllpR	 V3R
 llpR V3R llpSP                  R4      p\        S! R4      \        4      p^Tu;8:  d   R8:  g	   M \        p\	        S! R4      V! R4      4      pSP                  R4      p	V	f   SP                  R4      p	\        4       p
V
e   T
p	\        4       pVf   \        S! R4      \        R4      p\        S! R4      V! R4      4      p \        \        SP                  R^Z4      4      ^ 4      p^ RIHp T ! R1RV! R\         P"                  RR7      RSP                  RRR.4      R\        SP                  R/ 4      4      RRS9   d   \%        SR,          4      M\'        4       R ,          /\(        P+                  4        UUu/ uF"  w  ppV\-        SP                  V4      V4      bK$  	  uppB/ R!\-        V! R!R"4      R4      bR#\-        V! R#R$4      R4      bRV	f   RM\-        V	R4      bR\/        V\0        4      '       d   TMRbRVbR%\-        S! R%4      R4      bR&V! R&\2        R'R(4      bR)V! R)\4        R'R*4      bRVbRVbRVbR+\        SP                  R+4      \6        R,4      bR-\1        SP                  R-4      ;'       g    R.4      P9                  4       bR/\:        P#                  SP                  R// 4      4      bRVbR0T! SP                  R04      ;'       g    . 4      bB #   \        \        3 d    ^Zp ELi ; iu uppi )2Úgatewayc                ó0   € V ^8„  d   QhR\         R\        /# rk  rl  )r   s   "r   r   Ú-GatewayConfig.from_dict.<locals>.__annotate__Ê  s   € ÷ 	Iñ 	I”cð 	Iœcñ 	Ir    c                óF   <€ V S9   d
   SV ,          # SP                  V 4      # )zGTop-level key wins by presence; else the nested ``gateway.<key>`` form.ro  )r^   r˜   Únested_gateways   &€€r   ÚpickÚ%GatewayConfig.from_dict.<locals>.pickÊ  s#   ø€ à # t¤�4˜•9ÐH°×1CÑ1CÀCÓ1HÐHr    c                ó0   € V ^8„  d   QhR\         R\         /# rk  r?   )r   s   "r   r   rï  Î  s   € ÷ 	<ñ 	<œ3ð 	<¤3ñ 	<r    c                ó    <€ V S9   d   V # RV  2# )zJWarning key prefix: "gateway." when the nested form was the one consulted.zgateway.rØ   )r^   r˜   s   &€r   Ú	key_labelÚ*GatewayConfig.from_dict.<locals>.key_labelÎ  s   ø€ à œ+�3Ð;¨X°c°UÐ+;Ð;r    Ú
dicts_onlyFc                ó<   € V ^8„  d   QhR\         R\        R\        /# )r   r^   rø  r   )r"   r   rl   )r   s   "r   r   rï  Ò  s!   € ÷ 
	ñ 
	œSð 
	¼ð 
	Ìñ 
	r    c               óþ   <€ / p\        SP                  V / 4      4      P                  4        F:  w  rEV'       d   \        V\        4      '       g   K%   V! V4      V\        V4      &   K<  	  V#   \         d     KN  i ; i)z[``{Platform(name): parse(block)}`` for a platform-keyed mapping; unknown platforms skipped.)rn   r�   rF  r.   rl   r›   rO   )r^   Úparserø  ÚoutÚplatform_nameÚblockr˜   s   &&$   €r   Úby_platformÚ,GatewayConfig.from_dict.<locals>.by_platformÒ  st   ø€ àˆCÜ(4°T·X±X¸cÀ2Ó5FÓ(G×(MÑ(MÖ(OÑ$�ß¤j°¼×&=Ò&=ÙðÙ38¸³<�Cœ Ó/Ó0ñ	 )Pð ˆJøô "ô Úðús   ÁA-Á-A<Á;A<c                ó<   € V ^8„  d   QhR\         R\         R\        /# )r   Úflat_keyÚ
nested_keyr   rl  )r   s   "r   r   rï  Þ  s&   € ÷ 	]ñ 	]¤#ð 	]´3ð 	]¼3ñ 	]r    c                 ó„   <€ SP                  V 4      pVf*   \        SP                  R4      4      P                  V4      # T# )NÚstt)r�   rn   )r  r  r   r˜   s   && €r   Ústt_settingÚ,GatewayConfig.from_dict.<locals>.stt_settingÞ  s9   ø€ Ø—H‘H˜XÓ&ˆEØDIÂM”< §¡¨£Ó0×4Ñ4°ZÓ@Ð\ÐW\Ð\r    c          
      óT   € V ^8„  d   QhR\         R\        R\        R\        R\        /# )r   r^   r+   ÚloÚhir   )r"   rT   )r   s   "r   r   rï  â  s6   € ÷ 	Tñ 	Tœsð 	T¬Uð 	T¼ð 	TÄ5ð 	TÌUñ 	Tr    c                 ó†   <€ \        S! V 4      V4      p\        P                  ! V4      '       d   Y$u;8:  d	   V8:  d   V#  T# rM   )rW   ÚmathÚisfinite)r^   r+   r	  r
  r   rò  s   &&&& €r   Úbounded_floatÚ.GatewayConfig.from_dict.<locals>.bounded_floatâ  s9   ø€ ä!¡$ s£)¨WÓ5ˆEÜ ŸMšM¨%×0Ò0°RÖ5FÀBÔ5F�5ÐSÐ5FÈGÐSr    Úroom_link_urlÚloop_watchdog_max_strikesiè  rÄ  Úmultiplex_profilesNÚon_all_adapters_downr¿  Úmax_concurrent_sessionsrå  )Úparse_profile_routesr×   T)rø  rá  rº  r»  râ  rã  r¾  Ústt_enabledr;  Ústt_echo_transcriptsÚecho_transcriptsÚloop_watchdogÚloop_watchdog_probe_interval_sg      ð?g      ¬@Úloop_watchdog_probe_timeout_sg     À‚@Úunauthorized_dm_behaviorrÀ  Úunauthorized_dm_decline_messager6   rä  ræ  rØ   )rn   r�   r[   r   rj   r=   rD   rt   rB   rb   ÚmaxrY   rN   rO   Úgateway.profile_routingr  rW  r1  r   r   Ú_TOPLEVEL_BOOL_DEFAULTSrF  r0   r.   r"   r   r   ÚUNAUTHORIZED_DM_BEHAVIORSr#   ry  )r½   r˜   rö  rÿ  r  r  r  Úmax_strikesrÄ  r  Úenv_multiplexr  r  rå  r  r|   r+   rñ  rò  s   &f               @@r   r1  ÚGatewayConfig.from_dictÅ  sÂ  ú€ ä˜DÓ!ˆÜ% d§h¡h¨yÓ&9Ó:ˆ÷	Iñ 	I÷	<ð 	<ð
	¸u÷ 
	ò 
	÷	]ð 	]÷	Tð 	Tð
 Ÿ™ Ó1ˆÜ!¡$Ð'BÓ"CÔEfÓgˆØ�KÖ' 4Ö'Ü;ˆKä#BÙÐ+Ó,©iÐ8RÓ.Só$
Ð ð "ŸX™XÐ&:Ó;ÐØÒ%Ø!/×!3Ñ!3Ð4HÓ!IÐÜ8Ó:ˆØÒ$Ø!.Ðô  BÓCÐØÒ'Ü#4ÙÐ+Ó,Ô.KÈVó$Ð ô #@ÙÐ*Ó+©YÐ7PÓ-Qó#
Ðð	,Ü),¬S°·±Ð:VÐXZÓ1[Ó-\Ð^_Ó)`Ð&õ 	Aáñ 
Ù! +¬~×/GÑ/GÐTXÔYð
àŸ8™8Ð$4°v¸xÐ6HÓIð
ô (¨¯©Ð1AÀ2Ó(FÓGð
ð 8FÈÔ7Mœ˜d >Õ2Ô3ÔSbÓSdÐgqÕSqð	
ô
 Qh×PmÑPmÔPoÔpÑPo¹}¸tÀWˆt”\ $§(¡(¨4£.°'Ó:Ò:ÑPoÒpò
ô %¡[°À	Ó%JÈDÔQð
ô ".©kÐ:PÐRdÓ.eÐgkÔ!lð
ð (:Ò'A™tÄ|ÐTfÐhlÓGmøð
ô ,6°mÄS×+IÒ+I™-Ètøð
ñ &>ð
ô '¡t¨OÓ'<¸dÔCð
ñ ,9Ð9YÔ[{ð  ~Að  CIô  ,Jð
ñ +8Ð8WÔYxÐz}ð  @Eô  +Fð
ñ '2ð
ñ "6ð
ñ  %<ð!
ô" &7°t·x±xÐ@ZÓ7[Ô]vÐx~Ô%ð#
ô$ -0°·±Ð9ZÓ0[×0aÐ0aÐ_aÓ,b×,hÑ,hÔ,jð%
ô& &×/Ñ/°·±¸ÀbÓ0IÔJð'
ñ( (Bð)
ñ* 0°·±Ð9IÓ0J×0PÐ0PÈbÔQñ+
ð 	
øô œ:Ð&ô 	,Ø)+Ó&ð	,üó qs   Ä%%M Ç(MÍMÍMc                óX   <€ V ^8„  d   QhRS[ S[,          RS[RS[RS[RS[ S[,          /# )r   r  r^   rp   r+   r   )r
   r›   r"   rq   )r   rÃ   s   "€r   r   rÂ  $  s=   ø€ ÷ ñ ¡h©xÕ&8ð ¹sð ÉSð Ñ[^ð ÑckÑloÕcpñ r    c                óÊ   € V'       d   V P                   P                  V4      MRpV'       d6   W%P                  9   d&   \        VP                  P                  V4      W44      # R# )zQNormalized ``platforms[platform].extra[key]`` when the key is present, else None.N)r×   r�   r  rt   )r  r  r^   rp   r+   Úplatform_cfgs   &&&&& r   Ú_extra_choiceÚGatewayConfig._extra_choice$  sI   € ç7?�t—~‘~×)Ñ)¨(Ô3ÀTˆß˜C×#5Ñ#5Ô5Ü$ \×%7Ñ%7×%;Ñ%;¸CÓ%@À'ÓSÐSÙr    c                ó6   <€ V ^8„  d   QhRS[ S[,          RS[/# rÛ  ©r
   r›   r"   )r   rÃ   s   "€r   r   rÂ  +  s%   ø€ ÷ Yñ Y±X¹hÕ5Gð YÑSVñ Yr    c                ó˜   € V P                  VR\        V P                  4      pVe   V# V\        P                  8X  d   R# V P                  # )z©Effective unauthorized-DM behavior. Email is inbox-shaped so it defaults to ``"ignore"``
unless its own ``unauthorized_dm_behavior`` opts in (a global default does not).r  Úignore)r(  r!  r  r›   rò   ©r  r  Úchoices   && r   Úget_unauthorized_dm_behaviorÚ*GatewayConfig.get_unauthorized_dm_behavior+  sU   € ð ×#Ñ# HÐ.HÔJcÐei÷  fCñ  fCó  DˆØÒØˆMØ#¤x§~¡~Ô5ˆxÐX¸4×;XÑ;XÐXr    c                ó6   <€ V ^8„  d   QhRS[ S[,          RS[/# rÛ  r+  )r   rÃ   s   "€r   r   rÂ  3  s    ø€ ÷ 6ñ 6©H±XÕ,>ð 6É#ñ 6r    c                ó>   € V P                  VRRR0R4      pVf   R# T# )zCEffective notice-delivery mode ("public"/"private") for a platform.Únotice_deliveryÚpublicÚprivate)r(  r.  s   && r   Úget_notice_deliveryÚ!GatewayConfig.get_notice_delivery3  s.   € à×#Ñ# HÐ.?À(ÈIÐAVÐX`ÓaˆØ!š>ˆxÐ5¨vÐ5r    c                ó²  <€ V ^8„  d   Qh/ S[ S[S[3,          ;R&   S[S[,          ;R&   S[ S[S[3,          ;R&   S[;R&   S[;R&   S[;R&   S[;R&   S[;R&   S[;R	&   S[;R
&   S[;R&   S[S[	,          ;R&   S[S[,          ;R&   S[S[,          ;R&   S[	;R&   S[;R&   S[
;R&   S[
;R&   S[	;R&   S[;R&   S[;R&   S[;R&   S[;R&   S[	;R&   S[;R&   # )r   r×   rá  râ  rã  r²  r³  r´  r  r  rµ  r¶  r  r  r  rÄ  r  r  r  r  r  r  r  rä  rå  ræ  )rl   r›   rW  rC   r"   r   r   r   r
   rY   rT   ry  )r   rÃ   s   "€r   r   rÂ  O  s‚  ø‡ ‚ ñ ‘H™nÐ,Õ-ÑKñ ñ ™•IÑQñ	 ñ
 ™™c˜•NÑ@ñ ñ ÑVñ ñ Ñ$ñ ñ Ñ!ñ ñ #Ñ)ñ ñ  Ññ! ñ" Ñ%ñ# ñ$ "Ñ(ñ% ñ& #Ñ*ñ' ñ( &¡c�]Ñ1ñ) ñ8 !¡�Ñ-ñ9 ñ> ™C•=Ñ'ñ? ñ@ "Ñ%ñA ñV ÑñW ñX %*ÑLñY ñZ $)ÑJñ[ ñ\  #ÑFñ] ñj Ñ&ñk ñl "Ñ*ñm ñn &)Ñ-ño ñp ÑGñq ñt !$Ñ(ñu ñv Ñ6òw r    )rÄ  )r²  r³  r´  r  r  rµ  r¶  r  r  r  r  rÄ  r  r  r  r  r  r  rM   )3rä   rå   ræ   rç   rè   r   rl   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  ry  rä  rå  rC   ræ  rç  r  rÎ  rË  rÝ  r,  r   r1  r(  r0  r7  r4  r  r  r  s   @r   r¸  r¸  O  s>  ø‡ € á`Ù05ÀdÔ0K€IÙ %Ñ6PÔ Q€NÙ%*¸4Ô%@€NÙÑ/UÔV€Lð
 !%ÐØ!Ðð &*ÐØ€KØ!%ÐØ$(ÐØ%*ÐØ-1Ðð *.Ðð $(€MØ$%Ðð €MØ,LÐ"Ø+JÐ!Ø%FÐð !'ÐØ$*ÐØ+-Ð#Ù!&°Ô!G€Ià&(ÐÙ °Ô6€NðÐ÷gð g÷=ð =÷ð ÷$_ð _÷
ð 
ð  ÷\
ó ð\
÷|ð ÷Yò Y÷6ò 6÷I ƒ r    r¸  c                ó$   € V ^8„  d   QhR\         /# rÓ   ©r¸  )r   s   "r   r   r   9  s   € ÷ ñ œ]ñ r    c                 ó.  € ^ RI Hp  \        4       pV P                  V4      p V P	                  W4       \        P                  V4      p\        V4       \        V4       V#   \
         d)   p\        P                  RTR,          T4        Rp?L[Rp?ii ; i)zcLoad gateway configuration. Priority: env > ~/.hermes/config.yaml > legacy gateway.json > defaults.)Úconfig_loaderus   Failed to process config.yaml â€” falling back to .env / gateway.json values. Check %s for syntax errors. Error: %szconfig.yamlN)rí  r=  r   Úload_legacy_gateway_jsonÚload_yaml_layerr–   r9   r:   r¸  r1  Ú_apply_env_overridesÚ_validate_gateway_config)r=  Ú_homeÚgw_dataÚer>  s        r   Úload_gateway_configrE  9  s‰   € å%äÓ€EØ×4Ñ4°UÓ;€Gð
Ø×%Ñ% eÔ5ô  ×$Ñ$ WÓ-€FÜ˜Ô Ü˜VÔ$Ø€Møô% ô 
Ü�‰ð4à�MÕ! 1÷	
ñ 	
ûð
ús   £A! Á!BÁ,BÂBc                ó(   € V ^8„  d   QhR\         RR/# ©r   r>  r   Nr;  )r   s   "r   r   r   V  s   € ÷ $ñ $¤]ð $°tñ $r    c                óÔ  €  ^ RI Hp V P                  P	                  4        UUu. uFE  w  r#VP
                  '       g   K  V\        9   g   K&  VP                  f   K6  W#\        V,          3NKG  	  pppV FI  w  rVpVP                  P                  4       '       d   K(  \        P                  RVP                  V4       KK  	  Vf   R# V F€  w  rVpVP                  pVP                  4       '       g   K*  V! V^R7      '       d   K<  \        P                  RVP                  WxP                  4       R,          R,           4       RVn        K‚  	  R#   \         d    Rp ELXi ; iu uppi )	zUValidate and sanitize a loaded GatewayConfig in place (after all sources are merged).rš  NzG%s is enabled but %s is empty. The adapter will likely fail to connect.rœ  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.:Né   Nz...F)rž  r›  rŸ  r×   rF  r;  ÚPLATFORM_TOKEN_ENV_NAMESr'   r#   r9   r:   r   Úerror)	r>  r›  rÉ  rÌ  Útoken_platformsr  ÚpconfigÚenv_namer'   s	   &        r   rA  rA  V  s5  € ð!õ 	6ð
 9?×8HÑ8H×8NÑ8NÔ8PôÙ8P±°Ø�9�9ô 	,ØÔ6Ñ6ô 	,Ø;<¿7¹7ô 	,ˆÔ'¨Õ*Ó+Ñ8Pð ñ ó (7Ñ#ˆ˜8Ø�}‰}×"Ñ"×$Ô$Ü�N‰NÐdÐfn×ftÑftÐv~Öñ (7ð Ò ÙÛ'6Ñ#ˆ˜8Ø—‘ˆØ�;‰;�=Œ=Ñ!2°5ÀQ×!GÕ!GÜ�L‰Lð3ð —‘ ¯+©+«-¸Õ*;¸eÕ*Cô	ð $ˆGŽOó (7øô ô !Ø Óð!üós(   ‚E ¥E$Á E$ÁE$ÁE$ÅE!Å E!c                ó(   € V ^8„  d   QhR\         RR/# rG  r;  )r   s   "r   r   r   u  s   € ÷ ñ ¤ð °4ñ r    c                ó"   € ^ RI Hp V! V 4       R# )zLApply environment variable overrides to config (see ``gateway.config_env``).)r@  N)Úgateway.config_envr@  )r>  Ú_impls   & r   r@  r@  u  s   € å@Ù	ˆ&†Mr    c                óX  € V ^8„  d   Qh/ ^ \         9   d   \        \        ,          ;R&   ^\         9   d   \        \        ,          ;R&   ^\         9   d   \        \        \        3,          ;R&   ^\         9   d   \        \        \        3,          ;R&   ^\         9   d   \        \
        \        3,          ;R&   ^\         9   d
   \        ;R&   ^\         9   d
   \        ;R&   ^\         9   d
   \        ;R&   ^\         9   d-   \        \
        \        \        .\        3,          3,          ;R	&   # )
r   r·   r¹   r  ÚSHARED_LISTENER_MIRROR_PATHSrJ  r�  r‘  r’  rÒ  )Ú__conditional_annotations__r
   rq   rl   r"   r›   rT   rY   r   rW  r   )r   s   "r   r   r      s  € ÷ ñ ÷L 6Ò 5¤¬#¥Ñ 5ñM÷N 9Ò 8¤8¬D¥>Ñ 8ñO÷n	 GÒ F¤¤S¬# X¥Ñ Fño	÷x	 eÒ dœd¤3¬ 8�nÑ dñy	÷Zò œ$œx¬˜}Õ-ñ ñ[÷@ -Ò ,¤Ñ ,ñA÷B -Ò ,¤CÑ ,ñC÷D 'Ò &œ#Ñ &ñE÷Zò œd¤8¬X´~Ð6FÌÐ6LÕ-MÐ#MÕNñ ò[r    >   Ú1ÚonÚyesÚtrue>   Ú0ÚnorH   Úfalser§  )r¿  Ú
stay_alive)z gateway.systemd_watchdog_seconds>   rÀ  r-  ÚdeclinerM   )r6   >
   r¦   ÚlineÚteamsr«   r©   r¨   r¯   r­   r    rª   )hrU  rè   rg   Úloggingr  r7   ÚreÚpathlibr   Údataclassesr   r   r   r   r   Útypingr   r	   r
   r   r   Úenumr   r=  r   Úagent.secret_scoper   r   r   Úgateway.shutdown_watchdogr   r   r   Úutilsr   r   Ú	getLoggerrä   r9   rw  r%   r&   r(   r0   r=   rB   rD   rJ   rR   rW   r[   rb   ri   rj   rn   r!  Ú'DEFAULT_UNAUTHORIZED_DM_DECLINE_MESSAGErt   ry   rƒ   r‡   r·   r¹   r™   r›   Ú__members__ÚvaluesÚ_BUILTIN_PLATFORM_VALUESr  r  Ú SHARED_LISTENER_MIRROR_PLATFORMSrT  r  Úcompiler  r  r  r@  rB  rê   rë   rî   rð   rñ   rû   rJ  rW  r�  r‘  r’  ry  r¡  rõ   rö   r÷   rÿ   rÒ  r±  r   r¸  rE  rA  r@  r   )rU  s   @r   Ú<module>rq     s  øðöó Û Û Û 	Û 	Ý ß FÕ Fß 6Õ 6Ý å -ß N÷ñ ÷
 2à	×	Ò	˜8Ó	$€áÒ6Ó7€ÙÒ6Ó7€õ\÷3õð, !7Ð õõ,0õõ.õ,õ*ð !.Ð ÷õ,4ò :Ð àhð (õ
<õ÷)÷Kð 26Ð Ó 5Ø48Ð !Ó 8õôQˆtô Qñj %Ñ$T°h×6JÑ6J×6QÑ6QÔ6SÓ$TÓTÐ ñ
  )ò *ó  Ð ð
 3;¸IÐ1FÐ Ó Fñ $-¨l¸IÐ-FÓ#GÐ  à0<¸eÀYÐPcÐ/dÐ Ó d÷|ð Ÿ:š:Ø[ó]Ð õ-ð ÷Að Aó ðAð6Àe÷ ð ÷Yð Yó ðYð( ×ÑÐ+Ø×ÑÐ)Ø‡N�NÐ%Ø×ÑÐ+Ø‡O�OÐ*Ø‡O�O�^ð1Ð ó ð ÷C
ð C
ó ðC
ðP *-Ð Ó ,Ø*,Ð "Ó ,Ø &Ð Ó &ð ÷6
ð 6
ó ð6
õr	+ð ×ÑÑfØ×ÑÑ&Ø×ÑÑ`à‡N�NÑXðRÐ ó õð& ˜4Ð!3°TÐ;UÐW[Ø˜tÐ%?ÀðÐ ð ÷f6ð f6ó ðf6õRõ:$÷>r    