+
    lHàjÚ”  ã                  ó¤  € R t ^ RIHt ^RIHt R R ltR R ltR R ltR	 R
 ltR R lt	R R lt
R R ltR R ltR R ltRR/R R lltR R ltR R ltReR R lltR  R! ltR" R# ltR$ R% lt/ R&R'bR(R)bR)R)bR*R)bR+R,bR,R,bR-R,bR.R'bR/R)bR0R'bR'R'bR1R)bR2R3bR4R)bR3R3bR5R)btR6 R7 ltRfR8 R9 lltR: R; ltR< R= ltR> R? ltR@ RA lt]! 0 Rgm4      tRB RC ltRD RE ltRF RG lt RH RI lt!RJ RK lt"ReRL RM llt#RN RO lt$RP RQ lt%RR RS lt&RT RU lt'RV RW lt(]! 0 Rhm4      t)RX RY lt*ReRZ R[ llt+R\ R] lt,R^ R_ lt-R` Ra lt.RiRb Rc llt/Rd t0R# )jzOTUI agent_factory seam; functions bind to the server namespace at registration.)Úannotations)Úbind_modulec               ó   € V ^8„  d   QhRR/# ©é   ÚreturnÚstr© )Úformats   "Ú>/home/ubuntu/.hermes/hermes-agent/tui_gateway/agent_factory.pyÚ__annotate__r      s   € ÷ hñ h˜ñ hó    c                 ó®   € \         P                  P                  RR4      ;'       g!    \         P                  P                  RR4      P                  4       # )zWThe launch-scoped model seed (``hermes --tui -m``, hosted provisioning); "" when unset.ÚHERMES_MODELÚ ÚHERMES_INFERENCE_MODEL)ÚosÚenvironÚgetÚstripr	   r   r   Ú_env_model_seedr      s9   € ä�J‰J�N‰N˜>¨2Ó.×^Ð^´"·*±*·.±.ÐAYÐ[]Ó2^×eÑeÓgÐgr   c               ó   € V ^8„  d   QhRR/# r   r	   )r
   s   "r   r   r      s   € ÷ ñ ˜ñ r   c                 óæ  € \        4       ;p '       d   V # \        4       P                  R R4      p\        V\        4      '       d4   \        VP                  RR4      ;'       g    R4      P                  4       # \        V\
        4      '       d   V'       d   VP                  4       # \        P                  \        4      ;_uu_ 4        ^ RI
Hp V! 4       uuRRR4       #   + '       g   i     R# ; i)Úmodelr   Údefault)Ú"get_preferred_silent_default_modelNzz-ai/glm-5.2)r   Ú	_load_cfgr   Ú
isinstanceÚdictr   r   Ú
contextlibÚsuppressÚ	ExceptionÚhermes_cli.modelsr   )ÚenvÚmr   s      r   Ú_resolve_modelr%      s¤   € ÜÓÐ€sÖØˆ
Ü‹�‰˜ Ó$€AÜ�!”T×ÒÜ�1—5‘5˜ BÓ'×-Ð-¨2Ó.×4Ñ4Ó6Ð6Ü�!”S×ÒŸaØ�w‰w‹yÐä	×	Ñ	œY×	'Õ	'ÝHÙ1Ó3÷ 
(×	'×	'Ñ	'ñ ús   ÃCÃC0	c               ó   € V ^8„  d   QhRR/# r   r	   )r
   s   "r   r   r      s   € ÷ nñ n 3ñ nr   c                 óÆ   € \        \        P                  P                  R4      4      p V '       d1   \        \        P                  P                  R4      4      '       g   R# R# )uÉ   ``HERMES_DESKTOP=1`` without ``HERMES_DESKTOP_TERMINAL`` â†’ "desktop" (chat panel; the agent then
suggests TUI-only slash commands), else "tui" (embedded terminal pane or standalone ``hermes --tui``).ÚHERMES_DESKTOPÚHERMES_DESKTOP_TERMINALÚdesktopÚtui)Úis_truthy_valuer   r   r   )r*   s    r   Ú_resolve_session_platformr-      sB   € ô œbŸj™jŸn™nÐ-=Ó>Ó?€Gß¬¼¿
¹
¿¹ÐG`Ó8a×(bÒ(bˆ9ÐmÐhmÐmr   c               ó    € V ^8„  d   QhRRRR/# )r   Úexplicitú
str | Noner   r   r	   )r
   s   "r   r   r   "   s   € ÷ 3ñ 3 jð 3°Sñ 3r   c                ó*   € T ;'       g    \        4       # )z£Session DB ``source``: an explicit caller value (plugin session tagged ``"telegram"``) is never
rewritten; only empty/None falls back to the env-resolved platform.)r-   )r/   s   &r   Ú_resolve_session_sourcer2   "   s   € ð ×2Ð2Ô0Ó2Ð2r   c               ó    € V ^8„  d   QhRRRR/# )r   Úsourcer0   r   r   r	   )r
   s   "r   r   r   (   s   € ÷ +ñ + Jð +°3ñ +r   c                ó   € \        V 4      # ©N)r2   )r4   s   &r   Ú_resolve_agent_platformr7   (   s   € Ü" 6Ó*Ð*r   c               ó   € V ^8„  d   QhRR/# )r   r   ztuple[str, str]r	   )r
   s   "r   r   r   ,   s   € ÷ Iñ I˜oñ Ir   c                 ó¶  € \        4       P                  R4      p \        V \        4      '       d€   \	        V P                  R4      ;'       g    R4      P                  4       p\	        V P                  RR4      ;'       g    R4      P                  4       VP                  4       R8X  d   R3# T3# \        V \        4      '       d   V P                  4       R3# RR3# )u-  (model, provider) selected by config.yaml â€” and ONLY config: the HERMES_MODEL launch seed fed into
the per-turn sync would be replayed as a /model switch and persisted globally, or pin the session so
dashboard/CLI model changes never reach an open chat. Empty model = "no preference" â†’ no-op sync.r   Úproviderr   r   Úauto)r   r   r   r   r   r   Úlower)Ú	cfg_modelr:   s     r   Ú_config_model_targetr>   ,   s±   € ô “—‘ Ó(€IÜ�)œT×"Ò"Ü�y—}‘} ZÓ0×6Ð6°BÓ7×=Ñ=Ó?ˆÜ�9—=‘= ¨BÓ/×5Ð5°2Ó6×<Ñ<Ó>ÀhÇnÁnÓFVÐZ`ÔF`ÀÐnÐnÐfnÐnÐnÜ!+¨I´s×!;Ò!;ˆI�O‰OÓÀbÐHÐHÀÀbÐHÐHr   c               ó   € V ^8„  d   QhRR/# )r   r   ztuple[str, str | None]r	   )r
   s   "r   r   r   7   s   € ÷ ñ Ð"8ñ r   c            
     óÔ  € \        4       p \        P                  P                  R R4      P	                  4       ;p'       d   W3# \        4       ;p'       g   V R3# \        P                  \        4      ;_uu_ 4        ^ RI	H
p ^ RIHp \        4       pVP                  R4      ;'       g    / p\        V\        4      '       dA   \!        VP                  R4      ;'       g    R4      P	                  4       P#                  4       MR;'       gG    \        P                  P                  RR4      P	                  4       P#                  4       ;'       g    RpV! W'VP                  R	4      VP                  R
4      R7      ;p'       d#   VP$                  VP&                  3uuRRR4       # V! W'4      ;p	'       d   V	w  r«Wº3uuRRR4       #  RRR4       V R3#   + '       g   i     T R3# ; i)ÚHERMES_TUI_PROVIDERr   N)Úresolve_startup_model_route)Ú detect_static_provider_for_modelr   r:   ÚHERMES_INFERENCE_PROVIDERr;   Ú	providersÚcustom_providers)Úcurrent_providerÚuser_providersrF   )r%   r   r   r   r   r   r   r    r!   Úhermes_cli.model_switchrB   r"   rC   r   r   r   r   r<   r   r:   )r   Úexplicit_providerÚexplicit_modelrB   rC   Úfull_cfgÚcfgrG   ÚrouteÚdetectedr:   Údetected_models               r   Ú_resolve_startup_runtimerQ   7   s§  € ÜÓ€EÜŸJ™JŸN™NÐ+@À"ÓE×KÑKÓMÐMÐÖMØÐ'Ð'Ü-Ó/Ð/ˆNÖ/Ø�dˆ{ÐÜ	×	Ñ	œY×	'Õ	'ÝGÝFÜ“;ˆØ�l‰l˜7Ó#×)Ð) rˆÜOYÐZ]Ô_c×OdÒOdœS §¡¨Ó!4×!:Ð!:¸Ó;×AÑAÓC×IÑIÔKÐjl÷ ið iÜ!Ÿz™zŸ~™~Ð.IÈ2ÓN×TÑTÓV×\Ñ\Ó^÷ið iØbhð 	ñ 0ØØ'Ÿ|™|¨KÓ8È8Ï<É<ÐXjÓKkômð mˆ5ö mð —;‘; §¡Ð.÷ 
(Ò	'ñ 8¸ÓYÐYˆ8ÖYØ'/Ñ$ˆHØ!Ð+÷ 
(Ò	'ð Z÷ 
(ð �$ˆ;Ð÷ 
(Ö	'ð �$ˆ;Ðús'   Á;A$GÃ +GÄAGÅAGÆ&GÇG'	c               ó    € V ^8„  d   QhRRRR/# )r   r:   r   r   Úboolr	   )r
   s   "r   r   r   O   s   € ÷ ñ  Cð ¨Dñ r   c                óž   € \         P                  \        4      ;_uu_ 4        ^ RIHp V! V 4      uuRRR4       #   + '       g   i     R# ; i)é    )Úis_routable_providerNF)r   r    r!   Úhermes_cli.runtime_providerrV   )r:   rV   s   & r   Ú_is_routable_providerrX   O   s2   € Ü	×	Ñ	œY×	'Õ	'ÝDÙ# HÓ-÷ 
(×	'×	'Ñ	'ñ ús	   ¢;»A	c               ó    € V ^8„  d   QhRRRR/# )r   Ú	overridesr   r   rS   r	   )r
   s   "r   r   r   V   s   € ÷ >ñ >°ð >¸$ñ >r   c                óH  € \        V P                  R4      ;'       g    R4      P                  4       pV'       gL   \        V P                  R4      ;'       g    / P                  R4      ;'       g    R4      P                  4       p\        V4      ;'       d    \	        V4      # )uÈ   Whether persisted runtime overrides still name a routable provider (renamed/removed â†’ "Unknown
provider" at agent init). Empty = NOT routable, so the caller falls back to the session's picked model.Úprovider_overrider   Úmodel_overrider:   )r   r   r   rS   rX   )rZ   r:   s   & r   Ú!_overrides_have_routable_providerr^   V   s}   € ô �9—=‘=Ð!4Ó5×;Ð;¸Ó<×BÑBÓD€HßÜ˜	Ÿ™Ð&6Ó7×=Ð=¸2×BÑBÀ:ÓN×TÐTÐRTÓU×[Ñ[Ó]ˆÜ�‹>×=Ð=Ô3°HÓ=Ð=r   ÚquietFc               ó    € V ^8„  d   QhRRRR/# )r   r_   rS   r   r   r	   )r
   s   "r   r   r   _   s   € ÷ ñ  tð ¸ñ r   c               óR  € \        V \        4      '       d   V # \        V \        4      '       dG   V P                  4       '       d1    \        P                  V 4      p\        V\        4      '       d   V# / # / #   \         d%    T'       g   h \        P                  RRR7        / # i ; i)zSA row's ``model_config`` (dict or JSON text) as a dict; ``{}`` when absent/invalid.z+failed to parse stored session model_configT©Úexc_info)	r   r   r   r   ÚjsonÚloadsr!   ÚloggerÚdebug)Úrawr_   Úparseds   &$ r   Ú_parse_model_configrj   _   sŒ   € ä�#”t×ÒØˆ
Ü�#”s×Ò §	¡	§¢ð	WÜ—Z‘Z “_ˆFÜ'¨´×5Ò5�6Ð=¸2Ð=ð
 €Iøô	 ô 	WßØÜ�L‰LÐFÐQUˆLÕVØ€Ið		Wús   Á,A7 Á3A7 Á7B&Â
B&Â%B&c               ó    € V ^8„  d   QhRRRR/# )r   Úrowúdict | Noner   rS   r	   )r
   s   "r   r   r   n   s   € ÷ pñ p˜kð p¨dñ pr   c                óü   € V '       g   R# \        V P                  R4      RR7      p\        VP                  R4      ;'       g6    \        V P                  R4      ;'       g    R4      P	                  4       R8H  4      # )	a  Whether a stored row is a canonical Bot Chat whose runtime follows the member profile's config.
Identity is the persisted ``follow_profile_config`` marker; the bare title compare stays ONLY here as
the legacy fallback for rows written before the marker existed.FÚmodel_configT©r_   Úfollow_profile_configÚtitler   zBot Chat)rj   r   rS   r   r   )rl   ro   s   & r   Ú_row_follows_profilers   n   sd   € ÷ ÙÜ& s§w¡w¨~Ó'>ÀdÔK€LÜ�× Ñ Ð!8Ó9×nÐn¼SÀÇÁÈÓAQ×AWÐAWÐUWÓ=X×=^Ñ=^Ó=`ÐdnÑ=nÓoÐor   c               ó    € V ^8„  d   QhRRRR/# )r   rl   rm   r   r   r	   )r
   s   "r   r   r   x   s   € ÷ ;ñ ;¨;ð ;¸4ñ ;r   c           	     óh  a€ V '       g   / # \        V P                  R4      RR7      p\        V P                  R4      ;'       g    R4      P                  4       pVP                  R4      ;'       g+    V P                  R4      ;'       d    VP	                  R4      pVP                  R	4      p\        V\        4      ;'       dp    \        VP                  R
4      ;'       g    R4      P                  4       \        VP                  R4      ;'       g    R4      P                  4       3\        4       8H  pV'       g   \        V 4      '       d   V'       g   / # / p\        V P                  R
4      ;'       g    VP                  R
4      ;'       g    R4      P                  4       p^ RI	H
p VP                  V 4      oV3R lR 4       w  ršp\        VP                  R4      ;'       g    R4      P                  4       pVP                  R4      p^ RIHp V! Wš4      '       d   R;r«V	'       da   \        V	4      '       gP   Rp ^ RIHp T! T
;'       g    RT;'       g    RR7      pV'       d   \"        P'                  RWŸ4       Tp	Rp
MR;p	;r«V'       d,   R
TRT	;'       g    RRT
;'       g    RRT;'       g    R/VR&   V	'       d   W–R&   \        V\        4      '       d   WÖR&   V'       d   VP)                  4       R8X  d   RMTVR&   V#   \          d    \"        P%                  RRR7        LËi ; i)aé  Runtime fields persisted with a stored session (model column, ``billing_provider``, JSON ``model_config``):
resume restores the model/provider/reasoning THAT chat used, not the global pick. Plugin-owned Bot-Mode
sessions normally rebuild from the member profile's CURRENT config (a stale provider pin left room bots
"out of Nous credits" after a profile switch). A canonical Bot Chat may instead restore an explicit
composer pick while the profile model it diverged from remains unchanged.ro   Trp   rr   r   Úroom_plumbingÚhiddenzGroup:Úcomposer_override_profiler   r:   )Ú	SessionDBc              3  óˆ   <"  € T F7  p\        SP                  V4      ;'       g    R 4      P                  4       x € K9  	  R# 5i)r   N)r   r   r   )Ú.0ÚkrN   s   & €r   Ú	<genexpr>Ú4_stored_session_runtime_overrides.<locals>.<genexpr>�   s4   øé € Ð#rÑMqÈ¤C¨¯	©	°!«×(:Ð(:¸Ó$;×$AÑ$A×$CÐ$CÓMqùs
   ƒ!A¥AÚbase_urlÚapi_modeÚservice_tierÚreasoning_config)Úis_foreign_provider_endpointN©Úcanonical_custom_identity©r   r   z(custom provider identity recovery failedrb   z&healed stale session provider %r to %rr]   r\   Úreasoning_config_overrideÚnormalÚservice_tier_override)r:   r   r€   )rj   r   r   r   Ú
startswithr   r   r>   rs   Úhermes_statery   Úsession_gateway_runtimerW   rƒ   rX   r…   r!   rf   rg   Úinfor<   )rl   ro   Ú
_row_titlerv   Úcomposer_profileÚcomposer_profile_matchesrZ   r   ry   r:   r   r€   r�   r‚   rƒ   Úhealedr…   rN   s   &                @r   Ú!_stored_session_runtime_overridesr’   x   sâ  ø€ ÷ Øˆ	Ü& s§w¡w¨~Ó'>ÀdÔK€LÜ�S—W‘W˜WÓ%×+Ð+¨Ó,×2Ñ2Ó4€JØ ×$Ñ$ _Ó5×pÐp¸#¿'¹'À(Ó:K×:oÐ:oÐPZ×PeÑPeÐfnÓPo€MØ#×'Ñ'Ð(CÓDÐÜ)Ð*:¼DÓA÷   ð   ÜÐ× Ñ  Ó)×/Ð/¨RÓ0×6Ñ6Ó8ÜÐ× Ñ  Ó,×2Ð2°Ó3×9Ñ9Ó;ðGô 
Ó	ñG Ð÷ Ô-¨c×2Ò2×;SØˆ	Ø€IÜ�—‘˜Ó ×CÐC L×$4Ñ$4°WÓ$=×CÐCÀÓD×JÑJÓL€Eõ 'Ø×-Ñ-¨cÓ2€EÜ#rÑMqÓ#rÑ €H˜Ü�|×'Ñ'¨Ó7×=Ð=¸2Ó>×DÑDÓF€LØ#×'Ñ'Ð(:Ó;ÐÝHÙ# H×7Ò7à Ð ˆ÷ Ô-¨h×7Ò7Øˆð	TÝMÙ.¸×8HÐ8HÀDÐPU×P]ÐP]ÐY]Ô^ˆF÷ Ü�K‰KÐ@À(ÔSØˆHØ‰Hð .0Ð/ˆHÐ/�xßð �U˜J¨×(8Ð(8°D¸*Àh×FVÐFVÐRVÐXbÐdl×dtÐdtÐptð'vˆ	Ð"Ñ#çØ)1Ð%Ñ&ÜÐ"¤D×)Ò)Ø1AÐ-Ñ.ßØ3?×3EÑ3EÓ3GÈ8Ô3S©RÐYeˆ	Ð)Ñ*ØÐøô+ ô 	TÜ�L‰LÐCÈdˆLÖSð	Tús   ÉL É
L ÉL Ì"L1Ì0L1Nc               ó    € V ^8„  d   QhRRRR/# )r   Úexistingrm   r   r   r	   )r
   s   "r   r   r   ¶   s   € ÷ ñ ¨;ð À$ñ r   c                óp  a € \        T;'       g    / 4      p^ RIHp V! S 4      o V 3R lpV! R4      V! R4      V! R4      rvpVP                  4       R8X  d%    ^ RIHp T! Yu;'       g    RR	7      ;'       g    Tp\        S RR4      p	RTRTRTRV! R4      R\        V	\         4      '       d   T	MRR\        S RR4      /p
V
P                  4        F;  w  r¼V'       g   \        V\         4      '       d   WÂV&   K)  VP                  VR4       K=  	  V#   \         d    \        P                  R
RR7        L¹i ; i)a0  Merge the agent's CURRENT runtime identity onto the row's persisted ``model_config``. Falsy agent
attributes DELETE the key rather than skip the write: resume reads provider/endpoint from this JSON
(model column written separately), so a stale provider would route the resumed chat to the wrong endpoint.)Úsession_runtime_viewc                ó`   <€ \        \        SV R 4      ;'       g    R 4      P                  4       # ©r   )r   Úgetattrr   )r|   Úagents   &€r   Ú<lambda>Ú'_runtime_model_config.<locals>.<lambda>½   s$   ø€ ”Sœ ¨¨2Ó.×4Ð4°"Ó5×;Ñ;Ô=r   r   r:   r   Úcustomr„   Nr†   z&custom provider identity lookup failedTrb   r‚   r€   r�   )r   Úagent.voice_turn_router–   r<   rW   r…   r!   rf   rg   r™   r   ÚitemsÚpop)rš   r”   Úconfigr–   Úattrr   r:   r   r…   r‚   ÚliveÚkeyÚvalues   f&           r   Ú_runtime_model_configr¦   ¶   s*  ø€ ô �(—.�.˜bÓ!€FÝ;Ù  Ó'€EÜ=€DÙ $ W£©t°JÓ/?ÁÀjÓAQ�X€EØ‡~�~Ó˜8Ô#ð	RÝMÙ0¸(Ï-È-ÐSWÔX×dÐdÐ\dˆHô ˜uÐ&8¸$Ó?Ðà�˜
 H¨j¸(ÀJÑPTÐU_ÓP`à´
Ð;KÌT×0RÒ0RÑ,ÐX\Øœ  ~°tÓ<ð	€Dð —j‘j–l‰
ˆß”J˜u¤d×+Ò+Ø�3‹Kà�J‰J�s˜DÖ!ñ	 #ð
 €Møô ô 	RÜ�L‰LÐAÈDˆLÖQð	Rús   ÁD Á)D Á8D Ä"D5Ä4D5c               ó    € V ^8„  d   QhRRRR/# )r   Úsessionrm   r   ÚNoner	   )r
   s   "r   r   r   Ö   s   € ÷ Nñ N¨;ð N¸4ñ Nr   c                ó   € \        V 4      pVf   R# Vw  r#p VP                  V4      ;'       g    / p\        V\        VP	                  R4      4      4      p\        V P	                  R4      ;p\        4      '       d   WvR&   MRV 9   d   VP                  RR4       V P	                  R4      ;pe   T;'       g    RVR&   \        VP	                  R4      ;'       g    R4      P                  4       p	\        VR	4      '       d3   TP                  T\        P                  V4      T	;'       g    R4       R# V	'       d(   \        VR
4      '       d   VP                  W94       R# R# R#   \         d    \         P#                  RRR7        R# i ; i)zIPersist active session runtime so future resumes restore the same footer.Nro   rx   Úcreate_service_tier_overriderˆ   r�   r   r   Úupdate_session_metaÚupdate_session_modelz&failed to persist live session runtimeTrb   )Ú_live_session_agent_dbÚget_sessionr¦   rj   r   r   r   r    r   r   Úhasattrr¬   rd   Údumpsr­   r!   rf   rg   )
r¨   r£   rš   Úsession_keyÚdbrl   ro   r�   Útier_overrider   s
   &         r   Ú_persist_live_session_runtimerµ   Ö   sZ  € ä! 'Ó*€DØ‚|ÙØ!Ñ€E˜ðNØ�n‰n˜[Ó)×/Ð/¨RˆÜ,¨UÔ4GÈÏÉÐP^ÓH_Ó4`ÓaˆÜ¨'¯+©+Ð6QÓ*RÐRÐ&ÔTX×YÒYØ8HÐ4Ò5Ø(¨GÔ3Ø×ÑÐ8¸$Ô?Ø$Ÿ[™[Ð)GÓHÐHˆMÒUà+8×+DÐ+D¸HˆL˜Ñ(Ü�L×$Ñ$ WÓ-×3Ð3°Ó4×:Ñ:Ó<ˆÜ�2Ð,×-Ò-Ø×"Ñ" ;´·
±
¸<Ó0HÈ%Ï-È-ÐSWÖXß”w˜rÐ#9×:Ò:Ø×#Ñ# KÖ7ñ ;‰Uøäô NÜ�‰Ð=Èˆ×MðNús6   ˜E' °B	E' Â:"E' ÃAE' Ä-E' Ä6E' Ä>#E' Å'"FÆFc               ó   € V ^8„  d   QhRR/# r   r	   )r
   s   "r   r   r   î   s   € ÷ 9ñ 9˜Sñ 9r   c                 ó:   € ^ RI Hp  V ! 4       pV\        9   d   V# R# )z‹Effective ``approvals.mode`` via the gate's own ``_get_approval_mode`` (a raw re-read missed the
managed overlay and ``${VAR}`` expansion).)Ú_get_approval_modeÚmanual)Útools.approval_contextr¸   Ú_APPROVAL_MODES)r¸   Úmodes     r   Ú_load_approval_moder½   î   s!   € õ :ÙÓ€DØœ?Ô*ˆ4Ð8°Ð8r   c               ó   € V ^8„  d   QhRR/# r   r	   )r
   s   "r   r   r   ö   s   € ÷ cñ c˜cñ cr   c                ó˜   € V R J d   R# \        V \        4      '       d,   V P                  4       P                  4       ;p\        9   d   V# R# )FÚoffÚtop)r   r   r   r<   Ú_STATUSBAR_MODES)rh   Úss   & r   Ú_coerce_statusbarrÄ   ö   s@   € Ø
ˆeƒ|ÙÜ˜3¤×$Ò$¨s¯y©y«{×/@Ñ/@Ó/BÐ*B¨!ÔGWÔ)Wˆ1ÐbÐ]bÐbr   Ú0rÀ   Ú1ÚallÚanyÚbuttonÚbuttonsÚclickÚfalseÚfullÚnoÚonÚscrollÚwheelÚtrueÚyesc               ó    € V ^8„  d   QhRRRR/# )r   Údisplayr   r   r   r	   )r
   s   "r   r   r     s   € ÷ 8ñ 8 Tð 8¨cñ 8r   c                ó8  € \        V \        4      '       g   R# RV 9   d   V P                  R4      MV P                  RR4      p\        V\        4      '       d3   \        P                  VP                  4       P                  4       R4      # VRJ g   V^ 8X  d   R# R# )uã   display.mouse_tracking â†’ ``off|wheel|buttons|all`` (bools: True â†’ all, False â†’ off); ``wheel`` (DEC
1000+1006) is the tmux-friendly subset without hover events. Legacy ``tui_mouse`` only when ``mouse_tracking`` is absent.rÇ   Úmouse_trackingÚ	tui_mouseTFrÀ   )r   r   r   r   Ú_MOUSE_TRACKING_ALIASESr   r<   )rÕ   rh   s   & r   Ú_display_mouse_trackingrÚ     s   € ô �gœt×$Ò$ÙØ+;¸wÔ+Fˆ'�+‰+Ð&Ô
'ÈGÏKÉKÐXcÐeiÓLj€CÜ�#”s×ÒÜ&×*Ñ*¨3¯9©9«;×+<Ñ+<Ó+>ÀÓFÐFØ˜5“L C¨1¤Hˆ5Ð7°%Ð7r   c               ó    € V ^8„  d   QhRRRR/# )r   r   r   r   rm   r	   )r
   s   "r   r   r     s   € ÷ 8ñ 8 #ð 8¨{ñ 8r   c                ó0   € ^ RI Hp V! \        4       V 4      # )z­Via the shared chokepoint :func:`hermes_constants.resolve_reasoning_config` (per-model override >
global ``agent.reasoning_effort``; YAML False = disabled).

Closes #21256.
)Úresolve_reasoning_config)Úhermes_constantsrÝ   r   )r   rÝ   s   & r   Ú_load_reasoning_configrß     s   € õ :Ù#¤I£K°Ó7Ð7r   c               ó   € V ^8„  d   QhRR/# )r   r   r0   r	   )r
   s   "r   r   r     s   € ÷ Xñ X˜Jñ Xr   c                 ó€   € ^ RI Hp  T ! \        4       P                  R4      ;'       g    / P                  RR4      4      # )rU   ©Úparse_service_tierrš   r�   r   )Úagent.fast_moderã   r   r   râ   s    r   Ú_load_service_tierrå     s1   € Ý2áœy›{Ÿ™¨wÓ7×=Ð=¸2×BÑBÀ>ÐSUÓVÓWÐWr   c               ó   € V ^8„  d   QhRR/# )r   r   r   r	   )r
   s   "r   r   r     s   € ÷ ñ  ñ r   c                 óÊ   € \         P                  \        4      ;_uu_ 4        \        4       P	                  R/ 4      ;'       g    / uuRRR4       #   + '       g   i     / # ; i)u|   OpenRouter ``provider_routing`` prefs (gateway/CLI parity â€” without them OpenRouter picks an effectively random provider).Úprovider_routingN)r   r    r!   r   r   r	   r   r   Ú_load_provider_routingré     s@   € ä	×	Ñ	œY×	'Õ	'Ü‹{�‰Ð1°2Ó6×<Ð<¸"÷ 
(×	'×	'Ñ	'à€Iús   ¢$AÁA"	c               ó   € V ^8„  d   QhRR/# )r   r   rS   r	   )r
   s   "r   r   r   %  s   € ÷ <ñ <˜dñ <r   c                 óH   € \        \        4       P                  R R4      4      # )Úshow_reasoningT)rS   Ú_display_cfgr   r	   r   r   Ú_load_show_reasoningrî   %  s   € ä”“×"Ñ"Ð#3°TÓ:Ó;Ð;r   c               ó   € V ^8„  d   QhRR/# r   r	   )r
   s   "r   r   r   *  s   € ÷ -ñ - Cñ -r   c                 ó¾   € \        4       P                  R4      p \        V \        4      '       d   V '       d   R# R# V '       d   \	        V 4      P                  4       # R# )u¥   ``display.memory_notifications`` (``off`` / ``on`` default / ``verbose``; bool normalized) â€” gates the
"ðŸ’¾ Self-improvement review" summary (gateway/CLI parity).Úmemory_notificationsrÏ   rÀ   )rí   r   r   rS   r   r<   )rh   s    r   Ú_load_memory_notificationsrò   *  sI   € ô ‹.×
Ñ
Ð3Ó
4€CÜ�#”t×ÒßˆtÐ% Ð%ß"Œ3ˆs‹8�>‰>ÓÐ,¨Ð,r   c               ó   € V ^8„  d   QhRR/# r   r	   )r
   s   "r   r   r   6  s   € ÷ ;ñ ; #ñ ;r   c                 óŒ  € \         P                  P                  R R4      P                  4       P	                  4       p V \
        9   d   V # \        4       P                  RR4      p\        V\        4      '       d   V'       d   R# R# \        T;'       g    R4      P                  4       P	                  4       pV\
        9   d   V# R# )ÚHERMES_TUI_TOOL_PROGRESSr   Útool_progressrÇ   rÀ   )
r   r   r   r   r<   Ú_TOOL_PROGRESS_MODESrí   r   rS   r   )r#   rh   r¼   s      r   Ú_load_tool_progress_moderø   6  sš   € Ü
�*‰*�.‰.Ð3°RÓ
8×
>Ñ
>Ó
@×
FÑ
FÓ
H€CØ
Ô"Ô"Øˆ
Ü
‹.×
Ñ
˜_¨eÓ
4€CÜ�#”t×ÒßˆuÐ& Ð&Üˆs�|ˆ|�eÓ×"Ñ"Ó$×*Ñ*Ó,€DØÔ/Ô/ˆ4Ð:°UÐ:r   c               ó    € V ^8„  d   QhRRRR/# )r   Úplatformr   r   zset[str]r	   )r
   s   "r   r   r   A  s   € ÷ Rñ R Cð R¨Hñ Rr   c                ó8   € ^ RI Hp V R8X  d   \        V4      # R0# )a  Toolsets that exist because of the CLIENT (off ``_HERMES_CORE_TOOLS``; this is the one gate).
``platform`` is the SESSION's source, never a process env var: the desktop may drive a URL/cloud
backend where ``HERMES_DESKTOP`` is unset (AGENTS.md surface rule).)ÚCLIENT_SURFACE_TOOLSETSr*   Úproject)Útoolsetsrü   Úset)rú   rü   s   & r   Ú_gui_surface_toolsetsr   A  s!   € õ 1Ø+3°yÔ+@Œ3Ð&Ó'ÐQÀyÀkÐQr   c               ó    € V ^8„  d   QhRRRR/# )r   rú   r   r   ú	list[str]r	   )r
   s   "r   r   r   I  s   € ÷ *ñ *°ð *¸	ñ *r   c                óÀ   € \        V4      \        V 4      ,
          p\        \        4       ;'       g    . 4      pV'       d   W#R0,
          ,          p. V O\        V4      O# )uÞ  *selection* plus the client surface's toolsets the session carries whatever its config says.

The fold-in happens after ``_get_platform_tools`` already subtracted ``agent.disabled_toolsets``,
so the same subtraction is applied to the fold-in itself â€” otherwise ``disabled_toolsets:
[project]`` is a no-op on desktop/TUI, the only surfaces where the client toolsets exist
(#54433). ``desktop_ui`` is kept regardless: it is the client's own control surface, not a
model toolset.Ú
desktop_ui)r   rÿ   Ú_load_disabled_toolsetsÚsorted)Ú	selectionrú   Úfold_inÚdisableds   &&  r   Ú_with_session_toolsetsr
  I  sS   € ô $ HÓ-´°I³Õ>€GÜÔ*Ó,×2Ð2°Ó3€HßØ˜|˜nÕ,Õ,ˆØ)ˆYÐ)œ ›Ð)Ð)r   c               ó    € V ^8„  d   QhRRRR/# )r   Útextr   r   r©   r	   )r
   s   "r   r   r   X  s   € ÷ -ñ -�cð -˜dñ -r   c                ó>   € \        V \        P                  R R7       R# )T)ÚfileÚflushN)ÚprintÚsysÚstderr)r  s   &r   Ú_tui_noticer  X  s   € Ü	ˆ$”S—Z‘Z t×,r   c               ó    € V ^8„  d   QhRRRR/# )r   r/   r  r   zlist[str] | None | boolr	   )r
   s   "r   r   r   \  s   € ÷ '+ñ '+¨ð '+ÐI`ñ '+r   c                óÖ  € V  Uu. uF  q!! V4      '       g   K  VNK  	  ppV  Uu. uF  q"V9  g   K  VNK  	  ppV'       dY    ^ RI Hp V! 4        V Uu. uF  q!! V4      '       g   K  VNK  	  ppVP                  V4       V Uu. uF  q"V9  g   K  VNK  	  pp\        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       dB   V  Uu. uF  q"R9  g   K  VNK  	  up;p'       d   \        RRP                  V4       24       R# V'       g   V#  ^ RIHp ^ R	I	H
p	 V! 4       p
\        V
P                  R
4      \        4      '       d   V
P                  R
4      M/ p\        4       \        4       rÜVP                  4        FI  w  r.\        V\        4      '       g   K  V	! V4      pV'       d   TMTP!                  \#        V4      4       KK  	  V Uu. uF  q"V9   g   K  VNK  	  ppV Uu. uF  q"V9   g   K  VNK  	  ppV Uu. uF  q"V9  g   K  W-9  g   K  VNK  	  ppV'       d   \        RRP                  V4       24       V'       d   \        RRP                  V4       24       VV,           ;'       g    R# u upi u upi u upi   \         d    . p EL:i ; iu upi u upi   \         d    \        4       \        4       rÜ Lýi ; iu upi u upi u upi )zVResolve a HERMES_TUI_TOOLSETS pin: list, None for "all", False when nothing was valid.)Údiscover_pluginsc              3  ó*   "  € T F	  qR9   x € K  	  R# 5i)rÇ   N>   Ú*rÇ   r	   )r{   Únames   & r   r}   Ú-_resolve_explicit_toolsets.<locals>.<genexpr>i  s   é € Ð
5©H D�<Ö«Hùs   ‚TFzR[tui] HERMES_TUI_TOOLSETS=all enables every toolset; ignoring additional entries: ú, N)Úread_raw_config)Úmcp_server_enabledÚmcp_serversz4[tui] ignoring unknown HERMES_TUI_TOOLSETS entries: zf[tui] ignoring disabled MCP servers in HERMES_TUI_TOOLSETS (set enabled: true in config.yaml to use): >   r  rÇ   )Úhermes_cli.pluginsr  r!   ÚextendrÈ   r  ÚjoinÚhermes_cli.configr  Útools.mcp_tool_commonr  r   r   r   rÿ   rŸ   Úaddr   )r/   Úvalidate_toolsetr  Úbuilt_inÚ
unresolvedr  Úplugin_validÚignoredr  r  Úraw_cfgr  Ú	mcp_namesÚmcp_disabledÚ
server_cfgrÏ   Ú	mcp_validr	  Úunknowns   &&                 r   Ú_resolve_explicit_toolsetsr0  \  s’  € á!)ÓD¡˜Ð-=¸d×-C—�¡€HÐDÙ#+ÓD¡8˜4¸8Ñ/C—$�$¡8€JÐDßð	Ý;ÙÔÙ-7ÓR©Z TÐ;KÈD×;QŸD˜D©ZˆLÐRð 	�‰˜Ô%Ù'1ÓN¡z˜tÀÑ5M—d�d¡zˆ
ÐNß
ƒsÑ
5©HÓ
5‡s‡s‚sÑ
5©HÓ
5×5Ò5Ù(0ÓM© ÀÑ4L—t�t©ÑMÐMˆ7ÖMÜÐlÐmq×mvÑmvÐw~Ómð  mAð  Bô  CÙßØˆð/Ý5Ý<Ù!Ó#ˆÜ4>¸w¿{¹{È=Ó?YÔ[_×4`Ò4`�g—k‘k -Ô0ÐfhˆÜ"%£%¬«�<Ø +× 1Ñ 1Ö 3ÑˆDÜ˜*¤d×+Ô+Ù'¨
Ó3�ß ‘ l×7Ñ7¼¸D»	ÖBñ !4ñ #-ÓB¡*˜$¸	Ñ0A—�¡*€IÐBÙ!+ÓD¡˜°|Ñ/C—�¡€HÐDÙ *Óa¡
˜¸)Ñ.CŒtÈÑH`�tˆt¡
€GÐaßÜÐJÈ4Ï9É9ÐU\ÓK]ÐJ^Ð_Ô`ßÜð BØBFÇ)Á)ÈHÓBUÐAVðXô 	Yà�yÕ ×*Ð* UÐ*ùòK EùÚDùò
 SøÜô 	Ø‹Lð	üò OùâMøô ô /Ü"%£%¬«’<ð/üâBùÚDùÚasŸ   …J™J¥J²JÁJ ÁJÁ(JÁ.J ÂJ.ÂJ.ÃJ3Ã%J3Ä BJ8 Æ+J8 Æ; J8 ÇKÇ,KÇ8K!ÈK!ÈK&ÈK&È&K&ÊJ ÊJ+Ê*J+Ê8KËKc               ó    € V ^8„  d   QhRRRR/# )r   rú   r0   r   úlist[str] | Noner	   )r
   s   "r   r   r   †  s   € ÷ 2ñ 2 Zð 2Ð;Kñ 2r   c                ób  € T ;'       g    \        4       p\        P                  P                  RR4      P	                  R4       Uu. uF*  q"P                  4       '       g   K  VP                  4       NK,  	  ppRpV'       g]   \        P                  \        4      ;_uu_ 4        ^ RI	H
p V! VR7      pVe   \        \        Wa4      4      uuRRR4       #  RRR4        ^ RIHp V'       d   Ve   \        W74      pVRJd   V# R	p ^ R
IHp	 ^ RIHp
Hp V	! 4       pV
! VRRR7      pVe   \+        V4       V'       d   \        \        WÑ4      4      # V! VR4      '       d   . # R# u upi   + '       g   i     Lœ; i  \         d    Rp L§i ; i  \         d    Te   \+        R4        R# i ; i)uê  The agent's toolsets for this session (None = all): an explicit HERMES_TUI_TOOLSETS pin; else the
coding posture (coding_context collapses to coding toolset + enabled MCP servers in a code workspace);
else the configured CLI toolsets. Client-surface toolsets fold in here â€” only this surface can answer them.
An explicitly saved EMPTY list (``platform_toolsets.cli: []`` that resolves to nothing) is a
zero-tool state and returns [] â€” never None, which would mean unrestricted (#82010).ÚHERMES_TUI_TOOLSETSr   Ú,N)Úcoding_selection)rú   )r%  FzI[tui] no valid HERMES_TUI_TOOLSETS entries; using configured CLI toolsets©Úload_config)Ú_get_platform_toolsÚ#_platform_toolsets_explicitly_savedÚcliT)Úinclude_default_mcp_serverszq[tui] no valid HERMES_TUI_TOOLSETS entries and configured CLI toolsets could not be loaded; enabling all toolsets)r-   r   r   r   Úsplitr   r   r    r!   Úagent.coding_contextr6  r  r
  rþ   r%  r0  r"  r8  Úhermes_cli.tools_configr9  r:  r  )rú   Úsession_platformÚitemr/   Úfallback_noticer6  r  r%  Úresolvedr8  r9  r:  rM   Úenableds   &             r   Ú_load_enabled_toolsetsrE  †  s~  € ð  ×>Ð>Ô#<Ó#>ÐÜ)+¯©¯©Ð8MÈrÓ)R×)XÑ)XÐY\Ô)]ÓnÑ)] ×akÑak×am”�—
‘
–Ñ)]€HÐnØ€OßÜ× Ñ ¤×+Õ+Ý=Ù(Ð2BÔCˆIØÒ$ÜÔ4°YÓQÓR÷	 ,Ò+ð %÷ ,ð
 Ý-÷ Ð$Ò0Ü-¨hÓIˆØ˜5Ó àˆOØeˆðÝ1ßdÙ‹mˆñ & c¨5ÈdÔSˆØÒ&Ü˜Ô(ßÜÔ0°ÓKÓLÐLñ /¨s°E×:Ò:ØˆIÙùòO o÷ ,×+ûô ô  ØÒð ûô< ô ØÒ&Üð  Lô  MÚðúsN   ÁE%Á"E%Â#'E*ÃE= Ä6F Ä>F ÅF Å!F Å*E:	Å=FÆFÆF.Æ-F.c               ó   € V ^8„  d   QhRR/# )r   r   r2  r	   )r
   s   "r   r   r   »  s   € ÷ ñ Ð!1ñ r   c                 ó  €  ^ RI Hp  ^ RIHp V! 4       P	                  R4      ;'       g    / pV ! VP	                  R4      4      pV Uu. uF  p\        V4      NK  	  up;'       g    R# u upi   \         d     R# i ; i)u  ``agent.disabled_toolsets`` from config.yaml, or ``None``.

The classic CLI (``cli_init_mixin``) and the messaging gateway both forward this list to
AIAgent, where ``get_tool_definitions`` strips the named toolsets even out of composite
defaults like ``hermes-cli`` (#17309). The desktop/TUI gateway historically dropped it, so
e.g. ``disabled_toolsets: [browser]`` silently had no effect on Desktop â€” the only consumer
was ``_get_platform_tools``'s name-level subtraction, which can't reach inside a composite
default toolset (#44499).
)Úparse_config_string_listr7  rš   Údisabled_toolsetsN)Úagent.skill_utilsrH  r"  r8  r   r   r!   )rH  r8  Ú	agent_cfgr	  Útss        r   r  r  »  sq   € ð	Ý>å1á“M×%Ñ% gÓ.×4Ð4°"ˆ	Ù+¨I¯M©MÐ:MÓ,NÓOˆÙ"*Ó+¡(˜B”�B–¡(Ñ+×3Ð3¨tÐ3ùÒ+øÜô Úðús.   ‚(A/ «A/ Á	A*Á	A/ Á'A/ Á*A/ Á/A>Á=A>c               ó    € V ^8„  d   QhRRRR/# )r   Úsidr   r   r	   )r
   s   "r   r   r   Ñ  s   € ÷ Qñ Q Sð Q¨Sñ Qr   c                ót   € \        \        P                  V / 4      P                  R R4      ;'       g    R4      # )Útool_progress_moderÇ   )r   Ú	_sessionsr   ©rN  s   &r   Ú_session_tool_progress_moderS  Ñ  s.   € ÜŒy�}‰}˜S "Ó%×)Ñ)Ð*>ÀÓF×OÐOÈ%ÓPÐPr   c               ó    € V ^8„  d   QhRRRR/# ©r   rN  r   r   rS   r	   )r
   s   "r   r   r   Õ  s   € ÷ 9ñ 9˜#ð 9 $ñ 9r   c                ó   € \        V 4      R 8H  # )Úverbose©rS  rR  s   &r   Ú_session_verboserY  Õ  s   € Ü& sÓ+¨yÑ8Ð8r   c               ó    € V ^8„  d   QhRRRR/# rU  r	   )r
   s   "r   r   r   Ù  s   € ÷ "ñ " ð "¨ñ "r   c                ó†   € \         P                  V 4      ;'       g    / pRV9   d   \        VR,          4      # \        4       # )zCSession display flag. Missing means the config default, not hidden.rì   )rQ  r   rS   rî   )rN  r¨   s   & r   Ú_session_show_reasoningr\  Ù  s:   € ä�m‰m˜CÓ ×&Ð& B€GØ˜7Ô"Ü�GÐ,Õ-Ó.Ð.ÜÓ!Ð!r   c               ó    € V ^8„  d   QhRRRR/# rU  r	   )r
   s   "r   r   r   á  s   € ÷ 5ñ 5 ð 5¨ñ 5r   c                ó   € \        V 4      R 8g  # )rÀ   rX  rR  s   &r   Ú_tool_progress_enabledr_  á  s   € Ü& sÓ+¨uÑ4Ð4r   c               ó    € V ^8„  d   QhRRRR/# )r   r  r   r   rS   r	   )r
   s   "r   r   r   í  s   € ÷ ,ñ ,¨#ð ,°$ñ ,r   c                ó   € V \         9   # )a_  Interactive UI / card surfaces, not optional chrome.

Desktop renders these from the tool-call part itself, so suppressing the
lifecycle hides the turn's deliverable entirely (`isCardTool` /
`isFileEditTool` in apps/desktop/src/lib/tool-render-class.ts must stay in
sync with `_TOOL_LIFECYCLE_UI_TOOLS`): clarify / connection cards are
consent surfaces, image_generate / manage_catalog / delegate_task draw the
thing the user asked for, and file edits are the diff the user reviews.
The start and complete guards both consult this set, so a card's
`tool.complete` can never arrive without its `tool.start`.
)Ú_TOOL_LIFECYCLE_UI_TOOLS)r  s   &r   Ú_tool_lifecycle_required_for_uirc  í  s   € ð Ô+Ñ+Ð+r   c               ó    € V ^8„  d   QhRRRR/# )r   Úresolve_kwargsrm   r   Ú_RuntimeFallbackResolutionr	   )r
   s   "r   r   r   û  s   € ÷ ñ °;ð ÐJdñ r   c           	     ót  € ^ RI Hp ^ RIHp  \	        T! R/ T ;'       g    / B RR4      #   T Ed…   p\        4       ;'       g    .  EFe  p\        T\        4      '       d3   \        TP                  R4      ;'       g    R4      P                  4       MRp\        T\        4      '       d3   \        TP                  R4      ;'       g    R4      P                  4       MRpT'       d	   T'       g   Kª   ^ RIHpHp R	TR
T/TP                  R4      '       d   RTR,          /M/ Cp	T! T4      ;p
'       d   Y©R&   T! R/ T	B pT! YK4      TR&   ^ RI Hp \        P!                  \"        4      P%                  RT! T4      ^ ,          Y5T4       \	        Y¶R4      u u Rp?#   \&         d     EKd  i ; i	  h Rp?ii ; i)z¹Resolve the primary runtime or one complete provider/model fallback. Provider-only fallback entries
are skipped so the unavailable primary model can never leak into a different runtime.)Ú	AuthError)Úresolve_runtime_providerNFr:   r   r   )Úeffective_runtime_providerÚresolve_entry_api_keyÚ	requestedÚtarget_modelr   Úexplicit_base_urlÚexplicit_api_key)Úprimary_failure_wordingz,Primary %s (%s), falling back to %s model %sTr	   )Úhermes_cli.authrh  rW   ri  rf  Ú_load_fallback_modelr   r   r   r   r   Úhermes_cli.fallback_configrj  rk  rp  ÚloggingÚ	getLoggerÚ__name__Úwarningr!   )re  rh  ri  Úprimary_excÚentryÚfb_providerÚfb_modelrj  rk  Ú	fb_kwargsÚ
fb_api_keyÚruntimerp  s   &            r   Ú_resolve_runtime_with_fallbackr  û  sœ  € õ *ÝDðÜ)Ñ*BÑ*\Àn×FZÐFZÐXZÑ*\Ð^bÐdiÓjÐjøØõ Ü)Ó+×1Ð1¨rÓ1ˆEÜFPÐQVÔX\×F]ÒF]œ#˜eŸi™i¨
Ó3×9Ð9°rÓ:×@Ñ@ÔBÐceˆKÜ@JÈ5ÔRV×@WÒ@W”s˜5Ÿ9™9 WÓ-×3Ð3°Ó4×:Ñ:Ô<Ð]_ˆHß§hÙðßhØ#.°¸^ÈXð #rØRW×R[ÑR[Ð\f×RgÒRgÐ':¸EÀ*Õ<MÑ&NÐmoð#r�	á!6°uÓ!=Ð=�:Ö=Ø4>Ð0Ñ1Ù2Ñ?°YÑ?�ñ 'AÀÓ&P�˜
Ñ#ÝCÜ×!Ñ!¤(Ó+×3Ñ3ØBÙ+¨KÓ8¸Õ;¸[ÐW_ôaô 2°'ÀTÓJ×JøÜô Ûðúñ) 2ð, 	ûð/úsi   Ž+  
+ «F7³A
F2Á>A	F2ÃF2Ã'F2Ã/F2Ã2#FÄFÄ4A FÆF2ÆF7ÆF,Æ'F2Æ+F,Æ,F2Æ2F7c               ó   € V ^8„  d   QhRR/# )r   r   ztuple[str, dict]r	   )r
   s   "r   r   r     s   € ÷ /%ñ /%ÐGWñ /%r   c                óH  € \        V \        4      '       Ed"   V P                  R4      '       Ed
   \        V P                  R4      ;'       g    R4      pV P                  R4      ;'       g    T;'       g    RpV P                  R4      p/ p\        T;'       g    R4      P	                  4       P                  4       R8X  d;   ^ RIHp T! T;'       g    RT;'       g    RR7      ;p'       d   TpV'       d   WER	&   TP                  Y2;'       g    RR
7       R Uu/ uF  qˆV P                  V4      bK  	  p	pMH\        4       w  r#\        V \        4      '       d   V '       d   T pV'       d   TpRTRT;'       g    R/p/ p	\        V4      p
V
P                  '       dÂ   V
P                  '       g   \        R4      h^ RIHp \!        4       P                  R4      pT;'       g*    \        V\        4      '       d   VP                  R4      MRpV! WÒV
P"                  P                  R4      V
P                  4      V
P"                  R&   V
P                  V
P"                  3# V
P"                  P                  R4      R8X  d   V	P%                  RR4       V
P"                  P                  V	P'                  4        UUu/ uF  w  rŽV'       g   K  WŽbK  	  upp4       \)        V	P+                  4       4      '       d   \-        W*P"                  4       W*P"                  3# u upi u uppi )u�  (model, runtime) for a new agent; a per-session override (/model switch or a resumed row's persisted
runtime) wins over global config/env. Older rows stored the resolved provider "custom" (no named entry
matches) â€” recover the identity from the persisted base_url or the rebuild fails "No LLM provider
configured". Persisted base_url/api_key/api_mode are honored only for the original runtime, never a fallback.r   r   r:   Nr   r�   r„   r†   rn  )rl  rm  rl  rm  z&Auth fallback resolved without a model)Úpre_agent_fallback_noticeÚ_fallback_noticer4   zlocal-runtime)r   Úapi_keyr€   )r   r   r   r   r   r<   rW   r…   ÚupdaterQ   r  Úused_fallbackÚselected_modelÚRuntimeErrorrs  r‚  r   r~  r    rŸ   rÈ   ÚvaluesÚ_rederive_per_model_route)r]   r\   r   Úrequested_providerÚoverride_base_urlre  r…   Ú	recoveredr|   rZ   Ú
resolutionr‚  r=   Úprimary_providerÚvs   &&             r   Ú_resolve_agent_model_runtimer‘    s®  € ô
 �.¤$×'Ó'¨N×,>Ñ,>¸w×,GÓ,GÜ�N×&Ñ& wÓ/×5Ð5°2Ó6ˆØ+×/Ñ/°
Ó;×XÐXÐ?P×XÐXÐTXÐØ*×.Ñ.¨zÓ:ÐØˆÜÐ!×'Ð' RÓ(×.Ñ.Ó0×6Ñ6Ó8¸HÔDÝMÙ5Ð?P×?XÐ?XÐTXÐ`e×`mÐ`mÐimÔnÐnˆyÖnØ%.Ð"ß à6GÐ2Ñ3Ø×ÑÐ(:ÏÈÐRVÐÔWÙ7ZÓ[Ñ7Z°!˜×*Ñ*¨1Ó-Ò-Ñ7Zˆ	Ð[ˆ	ä$<Ó$>Ñ!ˆÜ�n¤c×*Ò*¯~Ø"ˆEßØ!2ÐØ%Ð'9¸>È5Ï=È=ÐTXÐYˆØˆ	Ü/°Ó?€JØ××ÐØ×(×(Ð(ÜÐGÓHÐHõ 	Iô “K—O‘O GÓ,ˆ	Ø-×uÐuÌzÐZcÔei×OjÒOj°)·-±-À
Ô2KÐptÐÙ1JØ Z×%7Ñ%7×%;Ñ%;¸JÓ%GÈ×IbÑIbó2dˆ
×ÑÐ-Ñ.à×(Ñ(¨*×*<Ñ*<Ð<Ð<Ø×Ñ×Ñ˜hÓ'¨?Ô:à�‰�j $Ô'Ø×Ñ×Ñ°	·±Ô0AÔGÑ0A©¨ÄQœt˜qštÑ0AÒGÔHÜ
ˆ9×ÑÓ×ÒÜ! %×);Ñ);Ô<Ø×$Ñ$Ð$Ð$ùò; \ùó4 Hs   ÄLÊ9L
Ë
L
c               ó$   € V ^8„  d   QhRRRRRR/# )r   r   r   r~  r   r   r©   r	   )r
   s   "r   r   r   N  s&   € ÷ cñ c Sð c°4ð c¸Dñ cr   c                óò   € ^ RI Hp ^ RIHp \	        VP                  R4      ;'       g    VP                  R4      ;'       g    R4      pV! W@4      pVf   R# WQR&   V! WEVP                  R4      4      VR&   R# )	a•  A row's persisted api_mode/base_url were written for whichever model the session last ran. Providers
that pick the wire per model (OpenCode Zen/Go, Copilot, Nous) must re-derive both from the target model,
or a resumed opencode-go session keeps a MiniMax-era anthropic_messages route (and its /v1-stripped or
other-family relay URL) for a chat_completions model like deepseek-v4-flash-vision-exp (#96066).)Úmodel_derived_api_mode)Únormalize_opencode_base_urlr‹  r:   r   Nr€   r   )rI   r”  r"   r•  r   r   )r   r~  r”  r•  r:   r€   s   &&    r   rŠ  rŠ  N  sn   € õ
 ?Ý=Ü�7—;‘;Ð3Ó4×UÐU¸¿¹ÀJÓ8O×UÐUÐSUÓV€HÙ% hÓ6€HØÒÙØ"ˆJÑÙ5°hÈ'Ï+É+ÐV`ÓJaÓb€GˆJÓr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rM   r   Útask_idr   r   r	   )r
   s   "r   r   r   ]  s!   € ÷ ñ  ð ¨sð °sñ r   c                ój  € ^ RI Hp V! V 4      p\        4       pV'       g   V# ^ RIHpHp V! WAR7      w  rxp	V	'       dF   V'       g   \        V! V	4      4      h\        P                  RV! V	4      RP                  V4      4       V'       d(   RP                  R W73 4       4      P                  4       pV# )z»Config ephemeral system prompt + HERMES_TUI_SKILLS preload block. Hard-fails only when EVERY requested
skill is missing (cli.py parity): a typo'd name must not auto-block the Kanban task.)Ú+resolve_ephemeral_system_prompt_from_config)Úbuild_preloaded_skills_promptÚformat_missing_skills)r—  zRSkipping %s. Continuing with: %s. List available skills with `hermes skills list`.r  z

c              3  ó8   "  € T F  q'       g   K  Vx € K  	  R # 5ir6   r	   )r{   Úparts   & r   r}   Ú)_startup_system_prompt.<locals>.<genexpr>m  s   é € Ð#\Ñ5S¨TÓW[§D¢DÓ5Sùs   ‚	�
)r"  r™  Ú_parse_tui_skills_envÚagent.skill_commandsrš  r›  Ú
ValueErrorrf   rw  r!  r   )
rM   r—  r™  Úsystem_promptÚstartup_skillsrš  r›  Úskills_promptÚloaded_skillsÚmissing_skillss
   &&        r   Ú_startup_system_promptr§  ]  s™   € õ NÙ?ÀÓD€MÜ*Ó,€NßØÐßYÙ3PÐQ_Ô3qÑ0€M .ßßÜÑ2°>ÓBÓCÐCÜ�‰ÐkÙ,¨^Ó<¸d¿i¹iÈÓ>Vô	XçØŸ™Ñ#\°mÑ5SÓ#\Ó\×bÑbÓdˆØÐr   c               óD   € V ^8„  d   QhRRRRRRRRRRR	R
RRRRRRRRRR/# )r   rN  r   r¤   Ú
session_idr0   r]   zdict | str | Noner\   r‡   rm   r‰   Úplatform_overrideÚcontext_cwd_is_launch_artifactzbool | NoneÚcwd_overrideÚauth_user_idr	   )r
   s   "r   r   r   q  s�   € ÷ @ñ @Ø	ð@Øð@Ø$.ð@à%ð@àAKð@ð  +ð@ð KUð@ð "ð	@ð KVð	@ð
 ð@ð
 4>ñ@r   c                ó¦  € ^ RI Hp T! T;'       g    TV4      pVe   V# ^ RIHp ^ RIHp R8 FP  p\        P                  \        4      ;_uu_ 4        \        P                  V4      P                  4        RRR4       KR  	  \        4       p^ RIHp V! V4       \        TT;'       g    T4      p\!        WE4      w  ppVP#                  RR4      p\%        4       p\'        V4      p\)        \*        P,                  P/                  R4      4      p\0        ;_uu_ 4        \2        P/                  V 4      pRRR4       T! R9/ RVbR	\5        VR
4      bRVP/                  R4      bRVP/                  R4      bRVP/                  R4      bRVP/                  R4      bRVP/                  R4      bRVP/                  R4      bRVP/                  R4      bRVP/                  R4      bRRbRRbRVe   TM\7        \9        T;'       g    R4      4      bRVe   TM	\;        4       bRT! \=        V4      Ve   TM	\?        4       T;'       g    T4      bR\A        4       bRVP/                  R4      bR VP/                  R!4      bR"VP/                  R#4      bR$VP/                  R%4      bR&VP/                  R'R4      bR(VP/                  R)4      bR*VbR+T;'       g    TbR,V
bR-Ve   TM
\C        X4      bR.Ve   TM	\?        4       bR/T;'       g    RbR0\E        V4      bR1\)        \*        P,                  P/                  R24      4      bR3VbR4VbR5\G        4       bR6VP/                  R64      bR7\I        4       ;'       g    Rb\K        V 4      B pV	f   \M        X4      p	\O        V	4      Vn&        V'       d   VVn(        V#   + '       g   i     EKŽ  ; i  + '       g   i     EL—; i):rU   )Úmaybe_build_synthetic_agentN)Úonboarding_toolsets)ÚAIAgent)Úregister_from_configrƒ  ÚHERMES_IGNORE_RULESr   Úmax_iterationsiô  r:   r‹  r   r„  r€   Úacp_commandÚcommandÚacp_argsÚargsÚcredential_poolÚ
quiet_modeTÚverbose_loggingFr‚   r   r�   Úenabled_toolsetsrI  Úproviders_allowedÚonlyÚproviders_ignoredÚignoreÚproviders_orderÚorderÚprovider_sortÚsortÚprovider_require_parametersÚrequire_parametersÚprovider_data_collectionÚdata_collectionrú   r©  ÚcwdÚuser_idÚ
session_dbÚephemeral_system_promptÚcheckpoints_enabledÚpass_session_idÚHERMES_TUI_PASS_SESSION_IDÚskip_context_filesÚskip_memoryÚfallback_modelÚrequest_overridesÚprefill_messages)zhermes_cli.mcp_startupztui_gateway.entryr	   ))Útui_gateway.synthetic_turnr¯  Úagent.onboarding_sessionr°  Ú	run_agentr±  r   r    r!   Ú	importlibÚimport_moduleÚwait_for_mcp_discoveryr   Úagent.shell_hooksr²  r§  r‘  r    ré   r7   r,   r   r   r   Ú_sessions_lockrQ  Ú_cfg_max_turnsrß   r   rå   rE  Ú_get_dbr  Ú_session_auth_user_idÚ_resolve_checkpoints_enabledrr  Ú_load_prefill_messagesÚ
_agent_cbsÚ_context_cwd_is_launch_artifactrS   Ú_pending_fallback_notice)rN  r¤   r©  rË  r]   r\   r‡   r‰   rª  r«  r¬  r­  r¯  Ú	syntheticr°  r±  Ú_modrM   r²  r¢  r   r~  rB  Ú_prrú   Úignore_rulesr¨   rš   s   &&&&&&&&&&&&                r   Ú_make_agentré  q  s"  € õ GÙ+¨J×,=Ð,=¸#¸~ÓN€IØÒØÐÝ<Ý!ó @ˆÜ× Ñ ¤×+Õ+Ü×#Ñ# DÓ)×@Ñ@ÔB÷ ,Ñ+ñ @ô ‹+€Cå6Ù˜ÔÜ*¨3°
×0AÐ0A¸cÓB€MÜ1°.ÓT�N€Eˆ7Ø—k‘kÐ"4°dÓ;€OÜ
 Ó
"€CÜ&Ð'8Ó9€HÜ"¤2§:¡:§>¡>Ð2GÓ#HÓI€Lß	ŽÜ—-‘- Ó$ˆ÷ 
áò NÙðNÜ$2°3¸Ô$<ðNØGNÇ{Á{ÐS]ÔG^ðNà"Ÿ;™;Ð';Ô<ðNð —‘˜ZÔ(ðNð 3:·+±+¸iÔ2HðNð T[×S^ÑS^Ð_iÔSjðNð —K‘K 	Ô*ð	Nð 6=·[±[ÀÔ5Hð	Nð
  Ÿ™Ð$5Ô6ðNñ
 DHðNñ ðNð *CÒ)NÑ%ÔTjÔknÐot×ozÐozÐxzÓk{ÓT|øðNð /DÒ.OÑ*ÔUgÓUiøðNñ -Ô-CÀHÓ-MØ;EÒ;Q©ZÔW^ÓW`Ðbl×bsÐbsÐpsôuðNô 2Ô3ðNð Ÿ'™' &œ/ðNð >A¿W¹WÀXÔ=NðNð ad×`gÑ`gÐhoÔ`pðNð —g‘g˜f”oðNð DGÇ7Á7ÐK_ÐafÔCgðNð  "%§¡Ð):Ô!;ð!Nñ  GOð!Nð  \f×[lÐ[lÐiløð!Nñ" ð#Nð( !-Ò 8‘Ô>SÐT[Ó>\øð)Nð* ",Ò!7‘:¼W»Yøð+Nð* an×`uÐ`uÐquøð+Nô, 9¸Ô=ð-Nô. (¬¯
©
¯©Ð7SÓ(TÔUð/Nñ0 (ð1Nñ0 6Bð1Nô0 SgÔRhð1Nð4 "Ÿ+™+Ð&9Ô:ð5Nô6 0Ó1×9Ð9°Tø¼ZÈ»_ñ7N€Eð8 &Ò-Ü)HÈÓ)QÐ&Ü,0Ð1OÓ,P€EÔ)ßà)8ˆÔ&Ø€L÷a ,×+Ñ+ú÷ 
�ˆús   Á$N*ÄN?Î*N<Î?O	c                ó.   € \        \        4       V 4       R # r6   )r   Úglobals)Úservers   &r   Úregisterrí  ´  s   € Ü”“	˜6Ö"r   r6   r˜   >   rÇ   ÚnewrÀ   rW  >   ÚpatchÚclarifyÚ	edit_fileÚ	set_themeÚ	setup_mcpÚ
setup_beatÚ
write_fileÚdelegate_taskÚimage_generateÚmanage_catalogÚmanage_connections)
NNNNNNNNNN)1Ú__doc__Ú
__future__r   Ú
method_ctxr   r   r%   r-   r2   r7   r>   rQ   rX   r^   rj   rs   r’   r¦   rµ   r½   rÄ   rÙ   rÚ   rß   rå   ré   rî   rò   Ú	frozensetr÷   rø   r   r
  r  r0  rE  r  rS  rY  r\  r_  rb  rc  r  r‘  rŠ  r§  ré  rí  r	   r   r   Ú<module>rþ     sÁ  ðÙ Uå "å #õhõ
õnõ3õ+õIõõ0õ>ð¨e÷ õpõ;÷|õ@Nõ09õcðØˆðØ�UðØ! 5ðØ*/°ðØ8@À)ðØMVÐXaðàˆYðà ðà(.°ðà7;¸UðàDIÈ5ðàRVÐX]ðð ˆgðð ˜uðð '.¨wðð 9>¸uðÐ õ8÷8õXõõ<õ
-ñ !Ò!AÓBÐ õ;õRõ*õ-õ'+÷T2õjõ,Qõ9õ"õ5ñ %ò &ó Ð õ,÷õB/%õdcõ÷(@ôF#r   