+
    jHàjw  ã                  ól  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIH	t	 ^ RI
Ht ^ RIHtHtHtHtHt ^ RIHt ^ RIHtHtHtHtHtHtHt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* ^ RI+H,t, ]'       d   ^ RI-H.t. ^ RI/H0t0 ]Pb                  ! R4      t2Rt3R]4R&   0 Rmt5 ! R R4      t6R# )aC  Config/env loaders (busy modes, reasoning, service tier, timeouts, fallback) for GatewayRunner.

Split out of ``gateway/run.py``; bound onto ``GatewayRunner`` via the MRO.
``gateway.run`` internals are imported lazily inside method bodies (import cycle),
so ``patch("gateway.run.X")`` keeps intercepting them at call time.
)ÚannotationsN)Úsuppress)ÚPath)ÚTYPE_CHECKINGÚAnyÚDictÚListÚOptional)ÚPlatform)Ú"DEFAULT_GATEWAY_CRON_DRAIN_TIMEOUTÚ,DEFAULT_GATEWAY_POST_INTERRUPT_GRACE_TIMEOUTÚ*DEFAULT_GATEWAY_RESTART_AFTER_TURN_TIMEOUTÚ%DEFAULT_GATEWAY_RESTART_DRAIN_TIMEOUTÚ.DEFAULT_GATEWAY_SIGNAL_INTERRUPT_GRACE_TIMEOUTÚparse_cron_drain_timeoutÚ parse_restart_after_turn_timeoutÚparse_restart_drain_timeoutÚlaunchd_service_labelÚ$parse_signal_interrupt_grace_timeoutÚread_launchd_exit_timeout_sÚresolve_launchd_capped_drain)ÚSessionSource)ÚSERVICE_TIER_UNSET)Úcfg_getÚ+resolve_ephemeral_system_prompt_from_config)Úget_fallback_chain)Úis_truthy_value©ÚGatewayRunner)Ú
TurnRunnerzgateway.runztuple[int, int]ÚDEFAULT_HUMAN_DELAY_RANGE_MSc                  ó
  € ] tR t^-tRt]R R l4       t]R R l4       t]R R l4       t	]R R	 l4       t
R
 R ltRRRRRR/R R lltRRRR/R R llt]RWR R ll4       t]R R l4       tRRRRRR/R R lltR R ltRXR  R! lltRYR" R# llt]R$ R% l4       t]R& R' l4       t]R( R) l4       t]R* R+ l4       t]R, R- l4       t]R. R/ l4       t]R0 R1 l4       tR2 R3 ltR4 R5 ltR6 R7 ltR8 R9 ltR: R; lt]R< R= l4       t ]R> R? l4       t!]R@ RA l4       t"]RB RC l4       t#]RD RE l4       t$]RF RG l4       t%]RH RI l4       t&RJ RK lt']RL RM l4       t(]RN RO l4       t)]RP RQ l4       t*RR RS lt+]RT RU l4       t,RVt-R# )ZÚGatewayConfigLoadersMixinz_Config/env loaders (busy modes, reasoning, service tier, timeouts, fallback) for GatewayRunner.c               ó$   € V ^8„  d   QhRRRRRR/# )é   ÚsectionÚstrÚkeyÚreturn© )Úformats   "Ú?/home/ubuntu/.hermes/hermes-agent/gateway/run_config_loaders.pyÚ__annotate__Ú&GatewayConfigLoadersMixin.__annotate__1   s&   € ÷ \ñ \˜#ð \ Cð \¨Cñ \ó    c           	     óv   € ^ RI Hp \        \        V! 4       WRR7      ;'       g    R4      P	                  4       # )zY``<section>.<key>`` from the gateway runtime config as a stripped string ("" when unset).©Ú_load_gateway_configÚ ©Údefault)Úgateway.runr1   r&   r   Ústrip)r%   r'   r1   s   && r+   Ú_cfg_strÚ"GatewayConfigLoadersMixin._cfg_str0   s1   € õ 	5Ü”7Ñ/Ó1°7ÈÔL×RÐRÐPRÓS×YÑYÓ[Ð[r.   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r$   Úenv_varr&   r%   r'   r(   r)   )r*   s   "r+   r,   r-   7   s.   € ÷ Lñ L cð L°Cð L¸cð LÀcñ Lr.   c                ó~   € \         P                  ! VR4      P                  4       ;'       g    V P                  W#4      # )z2Non-empty stripped env var, else :meth:`_cfg_str`.r2   )ÚosÚgetenvr6   r7   )Úclsr:   r%   r'   s   &&&&r+   Ú_env_or_cfg_strÚ)GatewayConfigLoadersMixin._env_or_cfg_str6   s/   € ô �yŠy˜ "Ó%×+Ñ+Ó-×KÐK°·±¸gÓ1KÐKr.   c               ó   € V ^8„  d   QhRR/# )r$   r(   zlist[dict[str, Any]]r)   )r*   s   "r+   r,   r-   <   s   € ÷ ñ Ð$8ñ r.   c            	     ó  € ^ RI Hp Hp \        P                  ! RR4      pV'       gD   V! 4       p\        VP                  RR4      ;'       g    \        VRRRR7      ;'       g    R4      pV'       g   . # \        V4      P                  4       pVP                  4       '       g   V ! 4       V,          pVP                  4       '       g   \        P                  RV4       . #  \        VRR	R
7      ;_uu_ 4       p\        P                   ! V4      pRRR4       \#        X\$        4      '       g   \        P                  RV4       . # V#   + '       g   i     L@; i  \&         d#   p\        P                  RYG4       . u Rp?# Rp?ii ; i)zæLoad ephemeral prefill messages from config or env var.

HERMES_PREFILL_MESSAGES_FILE env wins, then top-level prefill_messages_file in config.yaml,
then legacy agent.prefill_messages_file. Relative paths resolve from ~/.hermes/.
)Ú_gateway_config_homer1   ÚHERMES_PREFILL_MESSAGES_FILEr2   Úprefill_messages_fileÚagentr3   z#Prefill messages file not found: %sÚrz	utf-8-sig)ÚencodingNz3Prefill messages file must contain a JSON array: %sz+Failed to load prefill messages from %s: %s)r5   rC   r1   r<   r=   r&   Úgetr   r   Ú
expanduserÚis_absoluteÚexistsÚloggerÚwarningÚopenÚjsonÚloadÚ
isinstanceÚlistÚ	Exception)rC   r1   Ú	file_pathÚcfgÚpathÚfÚdataÚes           r+   Ú_load_prefill_messagesÚ0GatewayConfigLoadersMixin._load_prefill_messages;   s/  € ÷ 	KÜ—I’IÐ<¸bÓAˆ	ßÙ&Ó(ˆCÜØ—‘Ð/°Ó4×xÐx¼ÀÀWÐNeÐoqÔ8r×xÐxÐvxóˆI÷ ØˆIÜ�I‹×)Ñ)Ó+ˆØ×Ñ×!Ò!Ù'Ó)¨DÕ0ˆDØ�{‰{�}Š}Ü�N‰NÐ@À$ÔGØˆIð		Ü�d˜C¨+×6Õ6¸!Ü—y’y “|�÷ 7ä˜d¤D×)Ò)Ü—‘ÐTÐVZÔ[Ø�	ØˆK÷ 7×6ûô ô 	Ü�N‰NÐHÈ$ÔRØ�Iûð	ús<   Ã!E Ã7EÄ5E ÅE ÅE	ÅE ÅFÅ$FÅ;FÆFc               ó   € V ^8„  d   QhRR/# ©r$   r(   r&   r)   )r*   s   "r+   r,   r-   ]   s   € ÷ Sñ S¨3ñ Sr.   c                 ó^   € ^ RI Hp  ^ RIHp V ! R4      pV'       d   V# \	        V! 4       4      # )zƒHERMES_EPHEMERAL_SYSTEM_PROMPT env first (a local session's: its client's), then
``display.personality`` / ``agent.system_prompt``.)Úsession_envr0   ÚHERMES_EPHEMERAL_SYSTEM_PROMPT)Úagent.session_client_envr`   r5   r1   r   )r`   r1   Úprompts      r+   Ú_load_ephemeral_system_promptÚ7GatewayConfigLoadersMixin._load_ephemeral_system_prompt\   s,   € õ 	9Ý4ÙÐ=Ó>ˆßØˆMÜ:Ñ;OÓ;QÓRÐRr.   c               ó    € V ^8„  d   QhRRRR/# )r$   Úplatformr
   Úchat_idr&   r)   )r*   s   "r+   r,   r-   g   s   € ÷ jñ j¨(ð j¸Sñ jr.   c                óR   € ^ RI Hp \        V RR4      pV'       g   R# V! WaW#VR7      # )z\``channel_overrides`` entry for this channel/thread, or None (also when no config is bound).)Ú_get_channel_overrideÚconfigN)Ú	thread_idÚ	parent_id)r5   rj   Úgetattr)Úselfrg   rh   rl   rm   rj   rk   s   &&&&&  r+   Ú_channel_overrideÚ+GatewayConfigLoadersMixin._channel_overrideg   s)   € å5Ü˜˜x¨Ó.ˆßÙÙ$ V°wÐ_hÔiÐir.   Úuser_configNrl   rm   c               ó0   € V ^8„  d   QhRRRRRRRRR	RR
R/# )r$   rg   r
   rh   r&   rr   úOptional[dict]rl   úOptional[str]rm   r(   r)   )r*   s   "r+   r,   r-   o   s>   € ÷ 
ñ 
Ø ð
Ø+.ð
Ø@Nð
à ð
à4Að
ð 
ñ
r.   c          	     óZ   € ^ RI Hp ^ RIHp V! RV P	                  WWE4      V! V4      4      # )a8  Resolve model for this channel: channel_overrides else global default.

Precedence lives in :func:`hermes_cli.model_switch.resolve_effective_model` (shared with the
API server so the surfaces cannot diverge). No session tier here: session /model overrides
are applied later by ``_apply_session_model_override``.
)Ú_resolve_gateway_model)Úresolve_effective_modelN)r5   rw   Úhermes_cli.model_switchrx   rp   )ro   rg   rh   rr   rl   rm   rw   rx   s   &&&$$$  r+   Ú_resolve_model_for_channelÚ4GatewayConfigLoadersMixin._resolve_model_for_channelo   s2   € õ 	7ÝCÙ&ØØ×"Ñ" 8°iÓKÙ" ;Ó/ó
ð 	
r.   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r$   rg   r
   rh   r&   rl   ru   rm   r(   r)   )r*   s   "r+   r,   r-   �   s6   € ÷ 4ñ 4Ø ð4Ø+.ð4Ø>Kð4à ð4ð 
ñ4r.   c               óÂ   € V P                  WW44      pV'       d7   VP                  '       d%   VP                  ;'       g    RP                  4       # V P                  4       # )aá  Ephemeral system prompt for this channel/thread.

``channel_overrides`` when set, else the gateway prompt resolved from the CURRENT profile's
config on every call (callers run inside ``_profile_runtime_scope``, so routed multiplex
profiles get their own personality/system_prompt and ``/personality`` edits apply next turn).
Legacy ``channel_prompts`` are applied separately via ``event.channel_prompt`` in ``run_sync``.

Callers run inside ``_profile_runtime_scope`` (``run_sync`` under ``_run_agent``), so a routed
multiplex profile gets its own ``display.personality`` / ``agent.system_prompt`` instead of a
boot-time snapshot of the launch profile's (#89161); ``/personality`` edits take effect on the next
turn for the same reason.
r2   )rp   Úsystem_promptr6   rd   )ro   rg   rh   rl   rm   Úoverrides   &&&$$ r+   Ú_get_system_prompt_for_channelÚ8GatewayConfigLoadersMixin._get_system_prompt_for_channel�   sP   € ð  ×)Ñ)¨(¸YÓRˆß˜×.×.Ð.Ø×*Ñ*×0Ð0¨b×7Ñ7Ó9Ð9Ø×1Ñ1Ó3Ð3r.   r2   c               ó    € V ^8„  d   QhRRRR/# )r$   Úmodelr&   r(   údict | Noner)   )r*   s   "r+   r,   r-   —   s   € ÷ 
Gñ 
G cð 
G°;ñ 
Gr.   c                ó6   € ^ RI Hp ^ RIHp V! V! 4       V 4      # )záReasoning effort from config.yaml via :func:`hermes_constants.resolve_reasoning_config`.

Per-model override > global ``agent.reasoning_effort``; YAML False = disabled. Empty
``model`` uses ``model.default``.

Closes #21256.
r0   )Úresolve_reasoning_config)r5   r1   Úhermes_constantsr†   )rƒ   r1   r†   s   &  r+   Ú_load_reasoning_configÚ0GatewayConfigLoadersMixin._load_reasoning_config–   s   € õ 	5Ý=Ù'Ñ(<Ó(>ÀÓFÐFr.   c               ó    € V ^8„  d   QhRRRR/# )r$   Úraw_argsr&   r(   ztuple[str, bool]r)   )r*   s   "r+   r,   r-   ¤   s   € ÷ ;ñ ;°ð ;Ð8Hñ ;r.   c                ó`  € ^ RI p\        T ;'       g    R4      P                  4       P                  RR4      pV'       g   R#  VP	                  V4      pRP                  R V 4       4      pVP                  4       P                  4       RV9   3#   \
         d    TP	                  4       p LXi ; i)	z_Parse `/reasoning` args into `(value, persist_global)`; `--global` anywhere persists to config.Nr2   u   â€”z--Ú c              3  ó6   "  € T F  qR 8w  g   K  Vx € K  	  R# 5i)ú--globalNr)   )Ú.0Útokens   & r+   Ú	<genexpr>ÚJGatewayConfigLoadersMixin._parse_reasoning_command_args.<locals>.<genexpr>®   s   é € ÐJ©F 5¸zÑ6IŸš«Fùs   ‚�
r�   )r2   F)Úshlexr&   r6   ÚreplaceÚsplitÚ
ValueErrorÚjoinÚlower)r‹   r”   ÚtextÚtokensÚvalues   &    r+   Ú_parse_reasoning_command_argsÚ7GatewayConfigLoadersMixin._parse_reasoning_command_args£   sš   € ó 	Ü�8—>�>˜rÓ"×(Ñ(Ó*×2Ñ2°5¸$Ó?ˆßØÐð	"Ø—[‘[ Ó&ˆFð —‘ÑJ©FÓJÓJˆØ�{‰{‹}×"Ñ"Ó$ j°FÑ&:Ð:Ð:øô ô 	"Ø—Z‘Z“\ŠFð	"ús   ÁB ÂB-Â,B-ÚsourceÚsession_keyrƒ   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r$   rŸ   zOptional[SessionSource]r    ru   rƒ   r&   r(   r„   r)   )r*   s   "r+   r,   r-   ±   s.   € ÷ 2ñ 2Ø0ð2ØFSð2àð2ð 
ñ2r.   c               ó"  € V P                  W4      pV'       dD   V P                  V4      pVe/   VP                  P                  e   VP                  P                  # ^ RIHp V! W4      ;pe   VP                  W4      # V P                  V4      # )zÎSession ``/reasoning --session`` > per-model ``agent.reasoning_overrides`` > global.

``model`` must be the session's *effective* model (session ``/model`` override included);
empty uses ``model.default``.
)Úlocal_policy)Ú_resolve_session_key_or_noneÚ_peek_session_stateÚconversationÚreasoning_overrideÚ gateway.session_setting_commandsr£   Úcurrent_reasoning_configrˆ   )ro   rŸ   r    rƒ   Úresolved_session_keyÚ_r_stater£   Úpolicys   &$$$    r+   Ú!_resolve_session_reasoning_configÚ;GatewayConfigLoadersMixin._resolve_session_reasoning_config±   s‡   € ð  $×@Ñ@ÀÓUÐßØ×/Ñ/Ð0DÓEˆHØÒ#¨×(=Ñ(=×(PÑ(PÒ(\Ø×,Ñ,×?Ñ?Ð?ÝAÙ" 4Ó0Ð0ˆFÒ=à×2Ñ2°4ÓNÐNØ×*Ñ*¨5Ó1Ð1r.   c               ó$   € V ^8„  d   QhRRRRRR/# )r$   r    r&   Úreasoning_configrt   r(   ÚNoner)   )r*   s   "r+   r,   r-   Å   s#   € ÷ 
ñ 
¸3ð 
ÐR`ð 
Ðeiñ 
r.   c                óx   € V'       g   R# Vf   RM
\        V4      V P                  V4      P                  n        R# )z3Set or clear the session-scoped reasoning override.N)ÚdictÚ_session_stater¦   r§   )ro   r    r°   s   &&&r+   Ú_set_session_reasoning_overrideÚ9GatewayConfigLoadersMixin._set_session_reasoning_overrideÅ   s3   € çÙð %Ò,‰D´$Ð7GÓ2Hð 	×Ñ˜KÓ(×5Ñ5ÖHr.   c               ó    € V ^8„  d   QhRRRR/# )r$   r    ru   r(   r)   )r*   s   "r+   r,   r-   Ï   s   € ÷ )ñ )Àmð )Ð_lñ )r.   c                ó\  € V P                  W4      pV'       dJ   V P                  V4      pVe5   VP                  P                  \        Jd   VP                  P                  # ^ RIHpHp V! W4      pVe(   V! WP                  4      ;pe   VP                  W4      # V P                  4       # )u¹   Effective service tier: a session-scoped /fast override beats the config default.

The override stores "priority" or None (explicit normal), so presence â€” not truthiness â€” decides.
)Úlocal_live_for_router£   )r¤   r¥   r¦   Úservice_tier_overrideÚ_SERVICE_TIER_UNSETr¨   r¹   r£   rŸ   Úcurrent_service_tierÚ_load_service_tier)	ro   rŸ   r    rª   Ú_t_stater¹   r£   Úliver¬   s	   &&&      r+   Ú_resolve_session_service_tierÚ7GatewayConfigLoadersMixin._resolve_session_service_tierÏ   s›   € ð
  $×@Ñ@ÀÓUÐßØ×/Ñ/Ð0DÓEˆHØÒ#¨×(=Ñ(=×(SÑ(SÔ[nÓ(nØ×,Ñ,×BÑBÐBßWÙ# DÓ?ˆØÒ©<¸¿k¹kÓ+JÐ!J Ò WØ×.Ñ.¨tÓJÐJØ×&Ñ&Ó(Ð(r.   c               ó$   € V ^8„  d   QhRRRRRR/# )r$   r    r&   ÚclearÚboolr(   r±   r)   )r*   s   "r+   r,   r-   ß   s#   € ÷ 
ñ 
¸cð 
ÐX\ð 
Ðimñ 
r.   c                óv   € V'       g   R# V'       d   \         MTV P                  V4      P                  n        R# )zYSet ("priority" / None = explicit normal) or ``clear`` the session-scoped /fast override.N)r»   r´   r¦   rº   )ro   r    Úservice_tierrÃ   s   &&&&r+   Ú"_set_session_service_tier_overrideÚ<GatewayConfigLoadersMixin._set_session_service_tier_overrideß   s+   € çÙ÷ $)Õ¨lð 	×Ñ˜KÓ(×5Ñ5ÖKr.   c               ó   € V ^8„  d   QhRR/# )r$   r(   z
str | Noner)   )r*   s   "r+   r,   r-   ê   s   € ÷ Qñ Q :ñ Qr.   c                ó>   € ^ RI Hp V! V P                  RR4      4      # )ze``agent.service_tier`` parsed like the CLI (``hermes_cli.cli_config_load``); None when unset/unknown.)Ú_parse_service_tier_configrF   rÆ   )Úhermes_cli.cli_config_loadrË   r7   )r>   rË   s   & r+   r½   Ú,GatewayConfigLoadersMixin._load_service_tieré   s   € õ 	Já)¨#¯,©,°wÀÓ*OÓPÐPr.   c               ó   € V ^8„  d   QhRR/# )r$   r(   rÄ   r)   )r*   s   "r+   r,   r-   ñ   s   € ÷ lñ l $ñ lr.   c                 óH   € ^ RI Hp  \        \        V ! 4       RR4      RR7      # )z"``display.show_reasoning`` toggle.r0   ÚdisplayÚshow_reasoningFr3   )r5   r1   r   r   r0   s    r+   Ú_load_show_reasoningÚ.GatewayConfigLoadersMixin._load_show_reasoningð   s#   € õ 	5ÜœwÑ';Ó'=¸yÐJZÓ[ÐejÔkÐkr.   c               ó   € V ^8„  d   QhRR/# r^   r)   )r*   s   "r+   r,   r-   ÷   s   € ÷ Cñ C cñ Cr.   c                óZ   € V P                  RRR4      P                  4       pVR9   d   V# R# )zOGateway drain-time busy-input behavior from env/config (default ``interrupt``).ÚHERMES_GATEWAY_BUSY_INPUT_MODErÐ   Úbusy_input_modeÚ	interrupt>   ÚqueueÚsteer)r?   r™   )r>   Úmodes   & r+   Ú_load_busy_input_modeÚ/GatewayConfigLoadersMixin._load_busy_input_modeö   s6   € ð ×"Ñ"Ð#CÀYÐPaÓb×hÑhÓjˆØÐ1Ô1ˆtÐB°{ÐBr.   c               ó   € V ^8„  d   QhRR/# r^   r)   )r*   s   "r+   r,   r-   ý   s   € ÷ 
\ñ 
\ Sñ 
\r.   c                ó–   € ^ RI Hp V P                  RRR4      P                  4       pVR9   d   V# VP                  ! 4       R8X  d   R# R# )zÏNormal busy TEXT follow-up behavior.

``busy_input_mode`` is the source of truth (default ``interrupt``); legacy ``busy_text_mode``
is honored only when explicitly set so existing queue setups keep working.
r   ÚHERMES_GATEWAY_BUSY_TEXT_MODErÐ   Úbusy_text_moderØ   rÙ   >   rÙ   rØ   )r5   r   r?   r™   rÜ   )r>   r   Úlegacys   &  r+   Ú_load_busy_text_modeÚ.GatewayConfigLoadersMixin._load_busy_text_modeü   sP   € õ 	.Ø×$Ñ$Ð%DÀiÐQaÓb×hÑhÓjˆØÐ+Ô+ØˆMØ'×=Ò=Ó?À7ÔJˆwÐ[ÐP[Ð[r.   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r$   rk   r³   Úfallback_inputr&   Úfallback_textr(   ztuple[str, str]r)   )r*   s   "r+   r,   r-   
  s*   € ÷ %ñ %¨ð %Àð %ÐUXð %Ð]lñ %r.   c          	     ól  € \        \        V RRRR7      ;'       g    R4      P                  4       P                  4       pV\        9   d   TMTp\        \        V RRRR7      ;'       g    R4      P                  4       P                  4       pVR9   d   TpWF3# V\        9   d   VR8X  d   RMRpWF3# TpWF3# )	z@Resolve one profile's busy modes without consulting process env.rÐ   r×   r2   r3   rá   rØ   rÙ   >   rÙ   rØ   )r&   r   r6   r™   Ú_BUSY_INPUT_MODES)rk   ræ   rç   Ú	raw_inputÚ
input_modeÚraw_textÚ	text_modes   &$$    r+   Ú_busy_modes_from_configÚ1GatewayConfigLoadersMixin._busy_modes_from_config	  sÂ   € ô œ ¨	Ð3DÈbÔQ×WÐWÐUWÓX×^Ñ^Ó`×fÑfÓhˆ	Ø"+Ô/@Ô"@‘YÀnˆ
Ü”w˜v yÐ2BÈBÔO×UÐUÐSUÓV×\Ñ\Ó^×dÑdÓfˆØÐ-Ô-Ø ˆIð
 Ð$Ð$ð	 Ô+Ô+Ø#-°Ô#8™¸kˆIð Ð$Ð$ð &ˆIØÐ$Ð$r.   c               ó    € V ^8„  d   QhRRRR/# )r$   rk   r³   r(   ztuple[float, float]r)   )r*   s   "r+   r,   r-     s   € ÷ ñ ¨dð Ð7Jñ r.   c                ó‚  € ^ RI HpHp . pRV3RV33 Fh  w  rE\        V RVRR7      pVe   VR8X  d   VP	                  V4       K2   \        V4      pV^ 8  g   Ww8w  d   \        V4      h VP	                  V4       Kj  	  V^ ,          V^,          3#   \        \        3 d    \        P                  RYFT4       Tp LSi ; i)	zí``display.busy_text_debounce_seconds`` / ``display.busy_text_hard_cap_seconds`` for one
profile, without consulting process env (#116893). A non-numeric or negative value is
rejected with a warning naming the key, never silently coerced.)Ú"DEFAULT_BUSY_TEXT_DEBOUNCE_SECONDSÚ"DEFAULT_BUSY_TEXT_HARD_CAP_SECONDSÚbusy_text_debounce_secondsÚbusy_text_hard_cap_secondsrÐ   Nr3   r2   z4display.%s=%r is not a non-negative number; using %s)
Úgateway.platforms.baserò   ró   r   ÚappendÚfloatr—   Ú	TypeErrorrM   rN   )rk   rò   ró   Úoutr'   r4   Úrawrœ   s   &       r+   Ú_busy_text_timing_from_configÚ7GatewayConfigLoadersMixin._busy_text_timing_from_config  sÑ   € ÷
 	rØˆØ:Ð<^Ð_Ø:Ð<^Ð_óa‰LˆCä˜& )¨S¸$Ô?ˆCØŠ{˜c RœiØ—
‘
˜7Ô#Ùð Ü˜c›
�Ø˜1”9 ¤Ü$ S›/Ð)ð !/ð
 �J‰J�uÖñað �1�v�s˜1•vˆ~Ðøô	 œzÐ*ô  Ü—‘ÐUÐWZÐahÔiØ’ð ús   Á#BÂ*B>Â=B>c               ó    € V ^8„  d   QhRRRR/# )r$   rk   r³   r(   zOptional[tuple[int, int]]r)   )r*   s   "r+   r,   r-   /  s   € ÷ ñ ¨ð Ð2Kñ r.   c           	     óh  € \        \        V RRRR7      ;'       g    R4      P                  4       P                  4       pVR8X  d   R# \        w  r#VR8w  d«   VR8w  d   \
        P                  RV4       \        # . pR	V3R
V33 FQ  w  rV\        V RVRR7      p Ve   VR8X  d   TM
\        V4      pV^ 8  d   \        V4      h VP                  V4       KS  	  Vw  r#W#8”  d   \
        P                  RW#4       \        w  r#W#3#   \        \        3 d    \
        P                  RYWT4       Tp Lli ; i)ac  ``human_delay.{mode,min_ms,max_ms}`` for one profile as a ``(lo_ms, hi_ms)`` range, or
``None`` when off (#116895). ``natural`` is the fixed 800-2500 range; ``custom`` reads the
bounds and rejects non-integer, negative or inverted values with a warning naming the key,
falling back to the natural range instead of letting ``random.uniform`` raise at send.Úhuman_delayrÛ   Úoffr3   NÚnaturalÚcustomz<human_delay.mode=%r is not off/natural/custom; using naturalÚmin_msÚmax_msr2   z9human_delay.%s=%r is not a non-negative integer; using %szHhuman_delay.min_ms=%s exceeds human_delay.max_ms=%s; using natural range)r&   r   r6   r™   r    rM   rN   Úintr—   rù   r÷   )	rk   rÛ   ÚloÚhiÚboundsr'   r4   rû   rœ   s	   &        r+   Ú_human_delay_from_configÚ2GatewayConfigLoadersMixin._human_delay_from_config.  s1  € ô ”7˜6 =°&À%ÔH×QÐQÈEÓR×XÑXÓZ×`Ñ`ÓbˆØ�5Œ=ÙÜ-‰ˆØ�9ÔØ�xÔÜ—‘Ð]Ð_cÔdÜ3Ð3ØˆFØ"*¨B °(¸B°Ó @‘�Ü˜f m°SÀ$ÔG�ð$Ø'*¢{°c¸R´i™GÄSÈÃX�EØ˜q”yÜ(¨›oÐ-ð !ð
 —‘˜eÖ$ñ !Að ‰FˆBØŒwÜ—‘ÐiÐkmÔrÜ5‘�Øˆvˆøô "¤:Ð.ô $Ü—N‘NÐ#^Ð`cÐjqÔrØ#’Eð$ús   Â*DÄ*D1Ä0D1c               ó$   € V ^8„  d   QhRRRRRR/# )r$   Úprofile_namer&   rk   r³   r(   r±   r)   )r*   s   "r+   r,   r-   M  s!   € ÷ 3ñ 3¸ð 3Àdð 3Ètñ 3r.   c           	     óŽ  € V P                  V\        V RR4      \        V RR4      R7      w  r4W0P                  P                  R/ 4      V&   W@P                  P                  R/ 4      V&   V P	                  V4      V P                  P                  R/ 4      V&   V P                  V4      V P                  P                  R/ 4      V&   R	# )
zJCache a routed profile's busy policy and pacing for this gateway lifetime.Ú_busy_input_moderØ   Ú_busy_text_mode)ræ   rç   Ú_busy_input_modes_by_profileÚ_busy_text_modes_by_profileÚ_busy_text_timing_by_profileÚ_human_delay_by_profileN)rî   rn   Ú__dict__Ú
setdefaultrü   r
  )ro   r  rk   rë   rí   s   &&&  r+   Ú_snapshot_profile_busy_modesÚ6GatewayConfigLoadersMixin._snapshot_profile_busy_modesM  sÄ   € à $× <Ñ <Ø¤7¨4Ð1CÀ[Ó#QÜ! $Ð(9¸;ÓGð !=ó !
Ñˆ
ð V`�‰× Ñ Ð!?ÀÓDÀ\ÑRØT]�‰× Ñ Ð!>ÀÓCÀLÑQà×.Ñ.¨vÓ6ð 	�‰× Ñ Ð!?ÀÓDÀ\ÑRð ×)Ñ)¨&Ó1ð 	�‰× Ñ Ð!:¸BÓ?ÀÓMr.   c               ó    € V ^8„  d   QhRRRR/# )r$   rŸ   r   r(   ru   r)   )r*   s   "r+   r,   r-   Z  s   € ÷ 
ñ 
°Mð 
Àmñ 
r.   c                óR  € \        \        V RR4      RR4      '       g   R# \        \        VRR4      ;'       g    R4      P                  4       pV'       g4    \        V P                  V4      ;'       g    R4      P                  4       pT;'       g    R#   \         d    Rp Li ; i)z<Return the routed profile whose busy policy applies, if any.rk   NÚmultiplex_profilesFÚprofiler2   )rn   r&   r6   Ú_profile_name_for_sourcerT   )ro   rŸ   Únames   && r+   Ú_busy_profile_name_for_sourceÚ7GatewayConfigLoadersMixin._busy_profile_name_for_sourceZ  s”   € ä”w˜t X¨tÓ4Ð6JÈE×RÒRÙÜ”7˜6 9¨bÓ1×7Ð7°RÓ8×>Ñ>Ó@ˆßðÜ˜4×8Ñ8¸Ó@×FÐFÀBÓG×MÑMÓO�ð �|ˆ|�tÐøô ô Ø’ðús   ÁB Á5B ÂB&Â%B&c               ó$   € V ^8„  d   QhRRRRRR/# )r$   rŸ   r   Úattrr&   r(   r)   )r*   s   "r+   r,   r-   f  s&   € ÷ Zñ Z¨=ð ZÀð ZÈñ Zr.   c                óÈ   € \        WR4      pV P                  V4      pV'       g   V# \        WR,           R4      p\        V\        4      '       d   VP	                  WC4      # T# )zbBusy mode from the routed profile snapshot (``attr``: ``_busy_input_mode`` / ``_busy_text_mode``).rØ   Ús_by_profileN)rn   r  rR   r³   rI   )ro   rŸ   r"  Úfallbackr  Úmodess   &&&   r+   Ú_effective_busy_modeÚ.GatewayConfigLoadersMixin._effective_busy_modef  sX   € ä˜4 {Ó3ˆØ×9Ñ9¸&ÓAˆßØˆOÜ˜ ^Õ3°TÓ:ˆÜ4>¸uÄd×4KÒ4Kˆu�y‰y˜Ó0ÐYÐQYÐYr.   c               ó    € V ^8„  d   QhRRRR/# ©r$   rŸ   r   r(   r&   r)   )r*   s   "r+   r,   r-   o  s   € ÷ Eñ E°ð EÀ3ñ Er.   c                ó&   € V P                  VR4      # )zAResolve busy input mode from the routed profile startup snapshot.r  ©r'  ©ro   rŸ   s   &&r+   Ú_effective_busy_input_modeÚ4GatewayConfigLoadersMixin._effective_busy_input_modeo  s   € à×(Ñ(¨Ð1CÓDÐDr.   c               ó    € V ^8„  d   QhRRRR/# r*  r)   )r*   s   "r+   r,   r-   s  s   € ÷ Dñ D°ð DÀ#ñ Dr.   c                ó&   € V P                  VR4      # )z?Resolve legacy busy text mode from the routed profile snapshot.r  r,  r-  s   &&r+   Ú_effective_busy_text_modeÚ3GatewayConfigLoadersMixin._effective_busy_text_modes  s   € à×(Ñ(¨Ð1BÓCÐCr.   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r$   Úcfg_keyr&   rû   Úobjectr4   rø   r(   r±   r)   )r*   s   "r+   r,   r-   x  s.   € ÷ Zñ Z¨#ð Z°Fð ZÀUð ZÈtñ Zr.   c                ó|   €  \        V4       R#   \        \        3 d    \        P	                  RYT4        R# i ; i)zaWarn when a supplied timeout value is not a number (the parser already fell back to ``default``).z$Invalid %s '%s', using default %.0fsN)rø   rù   r—   rM   rN   )r5  rû   r4   s   &&&r+   Ú_warn_unparsable_timeoutÚ2GatewayConfigLoadersMixin._warn_unparsable_timeoutw  s7   € ð	ZÜ�#ŽJøÜœ:Ð&ô 	ZÜ�N‰NÐAÀ7ÐQX×Yð	Zús   ‚ �(;º;c               ó   € V ^8„  d   QhRR/# ©r$   r(   rø   r)   )r*   s   "r+   r,   r-   €  s   € ÷ ñ ¨Eñ r.   c                ó–   € V P                  RRR4      p\        V4      pV'       d#   V\        8X  d   V P                  RV\        4       V# )z7Graceful gateway restart/stop drain timeout in seconds.ÚHERMES_RESTART_DRAIN_TIMEOUTrF   Úrestart_drain_timeout)r?   r   r   r8  )r>   rû   rœ   s   &  r+   Ú_load_restart_drain_timeoutÚ5GatewayConfigLoadersMixin._load_restart_drain_timeout  sH   € ð ×!Ñ!Ð"@À'ÐKbÓcˆÜ+¨CÓ0ˆß�5ÔAÔAØ×(Ñ(Ð)@À#ÔGlÔmØˆr.   c               ó    € V ^8„  d   QhRRRR/# )r$   Údrain_timeoutrø   r(   zOptional[float]r)   )r*   s   "r+   r,   r-   ‰  s   € ÷ ñ °%ð ¸Oñ r.   c                óÊ   € \        4       pVf   R# \        V4      pVf   R# \        W4      pW08  d   \        P	                  RWW4       V# \        P                  RWV 4       V# )uP  Read the live launchd ``ExitTimeOut`` this job runs under, if any.

launchd is the one supervisor the gateway cannot size from config: the per-user (gui)
domain clamps ``ExitTimeOut`` (measured 60s on macOS 26), and any signal-driven stop that
drains past it is SIGKILLed mid-teardown â€” the unclean-exit half of the state.db
corruption class. Returns ``None`` (fail-open, drain unchanged) when not launchd-owned or
when ``launchctl print`` is unavailable. Logs a WARNING when the configured drain exceeds
the live budget so the misconfiguration is visible at boot, not at the next SIGKILL.
Nzàrestart_drain_timeout=%.0fs exceeds the live launchd exit timeout (%.0fs) for %s; signal-driven stops will drain at most %.0fs so teardown finishes before launchd SIGKILLs (launchd clamps ExitTimeOut in the per-user domain).z7launchd exit timeout for %s is %.0fs (drain %.0fs fits))r   r   r   rM   rN   Úinfo)rB  ÚlabelÚexit_timeoutÚ	effectives   &   r+   Ú_load_launchd_exit_timeoutÚ4GatewayConfigLoadersMixin._load_launchd_exit_timeoutˆ  sv   € ô &Ó'ˆØŠ=Ùä2°5Ó9ˆØÒÙÜ0°ÓMˆ	ØÔ$Ü�N‰NðPð ¨Uô	ð Ðô	 �K‰KØIØ ]ôð Ðr.   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r$   r:   r&   r5  r4   rø   r(   r)   )r*   s   "r+   r,   r-   ª  s*   € ÷ ñ °Sð À3ð ÐX]ð Ðbgñ r.   c                ó(  € ^ RI Hp \        P                  ! V4      pVe"   \	        V4      P                  4       R8w  d   TpM\        V! 4       RVRR7      pV! V4      pVe1   \	        V4      P                  4       R8w  d   V P                  W'V4       V# )z§Env var (non-empty) else ``agent.<cfg_key>``; warn once when a supplied value fails to parse.

``0`` is a valid value; the parser falls back to ``default`` on garbage.r0   Nr2   rF   r3   )r5   r1   r<   r=   r&   r6   r   r8  )	r>   r:   r5  Úparser4   r1   Úenv_rawrû   rœ   s	   &&&&&    r+   Ú_load_env_or_agent_cfg_timeoutÚ8GatewayConfigLoadersMixin._load_env_or_agent_cfg_timeout©  s}   € õ
 	5Ü—)’)˜GÓ$ˆØÒ¤3 w£<×#5Ñ#5Ó#7¸2Ô#=Ø!‰CäÑ.Ó0°'¸7ÈDÔQˆCÙ�c“
ˆØŠ?œs 3›xŸ~™~Ó/°2Ô5Ø×(Ñ(¨°wÔ?Øˆr.   c               ó   € V ^8„  d   QhRR/# r;  r)   )r*   s   "r+   r,   r-   º  s   € ÷ 
ñ 
°ñ 
r.   c                ó:   € V P                  RR\        \        4      # )z1In-band restart wait-for-idle timeout in seconds.Ú!HERMES_RESTART_AFTER_TURN_TIMEOUTÚrestart_after_turn_timeout)rN  r   r   ©r>   s   &r+   Ú _load_restart_after_turn_timeoutÚ:GatewayConfigLoadersMixin._load_restart_after_turn_timeout¹  s#   € ð ×1Ñ1Ø/Ð1MÜ,Ô.Xó
ð 	
r.   c               ó   € V ^8„  d   QhRR/# r;  r)   )r*   s   "r+   r,   r-   Â  s   € ÷ 
ñ 
¨ñ 
r.   c                ó:   € V P                  RR\        \        4      # )zNThe cron and api_server (/v1) floor under the stop()/drain wait.

See #82161.
ÚHERMES_CRON_DRAIN_TIMEOUTÚcron_drain_timeout)rN  r   r   rT  s   &r+   Ú_load_cron_drain_timeoutÚ2GatewayConfigLoadersMixin._load_cron_drain_timeoutÁ  s#   € ð ×1Ñ1Ø'Ð)=Ü$Ô&Hó
ð 	
r.   c               ó   € V ^8„  d   QhRR/# r;  r)   )r*   s   "r+   r,   r-   Í  s   € ÷ 	ñ 	°Uñ 	r.   c                ó”   € ^ RI Hp \        V! 4       RRRR7      p\        V4      pVe   VR8w  d   V P	                  RV\
        4       V# )z^``gateway.signal_interrupt_grace_timeout``: unexpected-signal post-interrupt grace in seconds.r0   ÚgatewayÚsignal_interrupt_grace_timeoutNr3   r2   )r5   r1   r   r   r8  r   )r>   r1   rû   rœ   s   &   r+   Ú$_load_signal_interrupt_grace_timeoutÚ>GatewayConfigLoadersMixin._load_signal_interrupt_grace_timeoutÌ  sO   € õ 	5ÜÑ*Ó,¨iÐ9YÐcgÔhˆÜ4°SÓ9ˆØŠ?˜s bœyØ×(Ñ(Ø0°#Ô7eôð ˆr.   c               ó   € V ^8„  d   QhRR/# r;  r)   )r*   s   "r+   r,   r-   Ø  s   € ÷ <ñ <¨uñ <r.   c                ó¦   € \        V RR4      '       d:   \        V RR4      '       g'   \        V R\        4      p\        R\        V4      4      # \        # )zZGrace before teardown after forcibly interrupting agents (longer on an unexpected signal).Ú_signal_initiated_shutdownFÚ_restart_requestedÚ_signal_interrupt_grace_timeoutg        )rn   r   Úmaxrø   r   )ro   Úgraces   & r+   Ú_post_interrupt_grace_timeoutÚ7GatewayConfigLoadersMixin._post_interrupt_grace_timeoutØ  sI   € ä�4Ð5°u×=Ò=ÄgÈdÐThÐjo×FpÒFpÜ˜DÐ"CÔEsÓtˆEÜ�sœE %›LÓ)Ð)Ü;Ð;r.   c               ó   € V ^8„  d   QhRR/# r^   r)   )r*   s   "r+   r,   r-   à  s   € ÷ ñ °ñ r.   c                 ó&  € ^ RI Hp  ^ RIHp V! R4      pV'       g.   \	        V ! 4       RR4      pVRJ d   RpMVR
9  d   \        V4      pT;'       g    RP                  4       P                  4       pVR9  d   \        P                  R	V4       R# V# )u^  Background process notification mode from env/config (default ``concise``), resolved for
the AMBIENT profile â€” callers deciding for another profile's event enter its scope first
(``_completion_event_scope``). The env override reads through the secret scope so a served
secondary sees its own ``.env`` value, not the launch profile's ``os.environ``.r0   )Úplatform_gate_envÚHERMES_BACKGROUND_NOTIFICATIONSrÐ   Ú background_process_notificationsFr  ÚconcisezFUnknown background_process_notifications '%s', defaulting to 'concise'>   Nr2   >   Úallr  ÚerrorÚresultrq  )
r5   r1   Úgateway.platforms._sharedrn  r   r&   r6   r™   rM   rN   )r1   Ú_platform_gate_envrÛ   rû   s       r+   Ú#_load_background_notifications_modeÚ=GatewayConfigLoadersMixin._load_background_notifications_modeß  sˆ   € õ 	5ÝUÙ!Ð"CÓDˆßÜÑ.Ó0°)Ð=_Ó`ˆCØ�e‹|Ø‘Ø˜JÔ&Ü˜3“x�Ø×!Ð!˜	×(Ñ(Ó*×0Ñ0Ó2ˆØÐCÔCÜ�N‰NÐcÐeiÔjÙØˆr.   c               ó   € V ^8„  d   QhRR/# )r$   r(   r³   r)   )r*   s   "r+   r,   r-   õ  s   € ÷ ñ  Dñ r.   c                 óx   € ^ RI Hp   V ! 4       P                  R/ 4      ;'       g    / #   \         d    / u # i ; i)z_OpenRouter provider routing preferences (canonical fail-open loader: managed overlay + ${VAR}).r0   Úprovider_routing)r5   r1   rI   rT   r0   s    r+   Ú_load_provider_routingÚ0GatewayConfigLoadersMixin._load_provider_routingô  s?   € õ 	5ð	Ù'Ó)×-Ñ-Ð.@À"ÓE×KÐKÈÐKøÜô 	ØŠIð	ús   ˆ) ¦) ©9¸9c               ó   € V ^8„  d   QhRR/# ©r$   r(   úlist | Noner)   )r*   s   "r+   r,   r-   þ  s   € ÷ ñ  +ñ r.   c                 óh   € ^ RI Hp   \        V ! 4       4      ;'       g    R#   \         d     R# i ; i)zZFallback chain: ``fallback_providers`` (kept first) merged with legacy ``fallback_model``.r0   N)r5   r1   r   rT   r0   s    r+   Ú_load_fallback_modelÚ.GatewayConfigLoadersMixin._load_fallback_modelý  s5   € õ 	5ð	ä%Ñ&:Ó&<Ó=×EÐEÀÐEøÜô 	Úð	ús   ˆ" Ÿ" ¢1°1c               ó   € V ^8„  d   QhRR/# r  r)   )r*   s   "r+   r,   r-     s   € ÷ %$ñ %$¨ñ %$r.   c                óô  € ^ RI Hp ^ RIHp V! 4       p\	        V RR4      pVf	   / ;q@n        T! V4      p ^ RIHp VR,          pVP                  4       '       g   R;WE&   V n	        V P                  # V! VRR7      p\        T4      ;'       g    R;YE&   T n	        T P                  #   \         dG    \        P                  R	RR
7       TP                  YPP                  4      T n	        T P                  u # i ; i)aƒ  Re-read fallback_providers from disk for the next agent create/reuse.

Lets a chain edited after startup reach messaging sessions (cron already re-reads per job).
A TRANSIENT read/parse failure (user mid-edit, non-atomic write) keeps the last known-good
chain; only a successful read that genuinely lacks the key clears it.

Cron already does this per job via ``get_fallback_chain``; the gateway previously froze
``self._fallback_model`` at process start, so a chain configured (or changed) after ``hermes
gateway`` was running never reached messaging sessions even though the same process's cron jobs fell
back correctly. Fixes #60955.

Reads the ACTIVE gateway home (the routed profile under multiplexing, else the launch home)
and keeps one last-known-good chain per home: a single runner-wide slot filled from the launch
home handed every secondary profile the default profile's fallback chain.
)rC   )Úhermes_home_keyÚ_fallback_model_by_homeN)Úload_user_config_effectivezconfig.yamlT)Úfail_closedzRfallback_providers refresh: config.yaml read failed; keeping last known-good chain)Úexc_info)r5   rC   r‡   r†  rn   r‡  Úhermes_cli.config_effectiverˆ  rL   Ú_fallback_modelrT   rM   ÚdebugrI   r   )	ro   rC   r†  ÚhomeÚby_homeÚhome_keyrˆ  Úcfg_pathrV   s	   &        r+   Ú_refresh_fallback_modelÚ1GatewayConfigLoadersMixin._refresh_fallback_model  sö   € õ  	5Ý4Ù#Ó%ˆÜ˜$Ð 9¸4Ó@ˆØŠ?Ø57Ð7ˆGÔ2Ù" 4Ó(ˆð	(ÝNØ˜mÕ+ˆHØ—?‘?×$Ò$Ø;?Ð?�Ñ! DÔ$8Ø×+Ñ+Ð+ñ -¨XÀ4ÔHˆCô
 4FÀcÓ3J×3RÐ3RÈdÐRˆÑ˜DÔ0Ø×#Ñ#Ð#øô ô 	(Ü�L‰LÐmÐx|ˆLÔ}Ø#*§;¡;¨x×9MÑ9MÓ#NˆDÔ Ø×'Ñ'Ò'ð	(ús   ¶$B& ÁB& Á2
B& Â&AC7Ã6C7c               ó$   € V ^8„  d   QhRRRRRR/# )r$   rF   r   Úchainr€  r(   r±   r)   )r*   s   "r+   r,   r-   /  s!   € ÷ $ñ $¨cð $¸+ð $È$ñ $r.   c                óÖ  € V f   R# \        T;'       g    . 4      p\        V R^ 4      ;'       g    ^ p\        V RR4      '       d   V\        P                  ! 4       8”  d   R# \        \        V R. 4      ;'       g    . 4      pW n        V'       d
   V^ ,          MRV n        \        V RR4      '       g   ^ V n        W$8w  d*   \        V RR4      pV'       d   VP                  4        R# R# R# )aÒ  Keep a cached agent's fallback chain aligned with current config.

Skips the rewrite while a cooldown holds the agent on an activated fallback provider
(``restore_primary_runtime`` owns that lifecycle); otherwise replaces the chain so
mid-uptime ``fallback_providers`` edits apply without a restart.

When primary is active (or cooldown expired), replace the chain so mid-uptime ``fallback_providers``
edits take effect without requiring a gateway restart (#60955).
NÚ_rate_limited_untilÚ_fallback_activatedFÚ_fallback_chainÚ_unavailable_fallback_keys)rS   rn   ÚtimeÚ	monotonicr™  rŒ  Ú_fallback_indexrÃ   )rF   r•  Ú	new_chainÚrate_limited_untilÚ	old_chainÚunavailables   &&    r+   Ú_apply_fallback_chain_to_agentÚ8GatewayConfigLoadersMixin._apply_fallback_chain_to_agent.  sÓ   € ð Š=ÙÜ˜Ÿ˜ "Ó%ˆ	Ü$ UÐ,AÀ1ÓE×JÐJÈÐÜ�5Ð/°×7Ò7Ð<NÔQU×Q_ÒQ_ÓQaÔ<aÙÜœ Ð(9¸2Ó>×DÐDÀ"ÓEˆ	Ø )Ôß09 	¨!¦¸tˆÔÜ�uÐ3°U×;Ò;Ø$%ˆEÔ!ð
 Ô!Ü! %Ð)EÀtÓLˆKßØ×!Ñ!Ö#ñ ñ "r.   )rŒ  r‡  )r2   )NN)F).Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ústaticmethodr7   Úclassmethodr?   r[   rd   rp   rz   r€   rˆ   r�   r­   rµ   rÀ   rÇ   r½   rÒ   rÜ   rã   rî   rü   r
  r  r  r'  r.  r2  r8  r?  rH  rN  rU  r[  ra  rj  rw  r|  r‚  r’  r¢  Ú__static_attributes__r)   r.   r+   r"   r"   -   s‚  † Ùiàô\ó ð\ð
 ôLó ðLð ôó ðð@ ôSó ðSõjð
ØQUð
à#'ð
àDH÷
ð$4ØNRð4à#'÷4ð* ö
Gó ð
Gð ô;ó ð;ð2Ø37ð2ØVZð2à÷2õ(
÷)÷ 
ð ôQó ðQð ôló ðlð
 ôCó ðCð
 ô
\ó ð
\ð ô%ó ð%ð ôó ðð, ôó ðõ<3õ
õZõEõDð ôZó ðZð ôó ðð ôó ðð@ ôó ðð ô
ó ð
ð ô
ó ð
ð ô	ó ð	õ<ð ôó ðð( ôó ðð ôó ðõ%$ðN ô$ó ô$r.   r"   )i   iÄ	  >   rÙ   rÚ   rØ   )7Ú__conditional_annotations__r¨  Ú
__future__r   rP   Úloggingr<   r›  Ú
contextlibr   Úpathlibr   Útypingr   r   r   r   r	   Úgateway.configr
   Úgateway.restartr   r   r   r   r   r   r   r   r   r   r   r   Úgateway.sessionr   Úgateway.session_stater   r»   Úhermes_cli.configr   r   Úhermes_cli.fallback_configr   Úutilsr   r5   r   Úgateway.run_turn_runnerr   Ú	getLoggerrM   r    Ú__annotations__ré   r"   )r¬  s   @r+   Ú<module>r¼     sˆ   øðôõ #ã Û Û 	Û Ý Ý ß ;Õ ;å #÷÷ ÷ ó õ *Ý Kß RÝ 9Ý !çÝ)Ý2ð 
×	Ò	˜=Ó	)€à0;Ð ˜oÓ ;â3Ð ÷^$ó ^$r.   