+
    jHàjÁÛ  ã                   ó  a € 0 t $ R t^ RIHt ^ RIt^ RIHt ^ RIHtH	t	 ^ RI
HtHtHt ^ RIHtHt ^ RIHt ]! 4       t/ tR]R	&   ]! R
R7       ! R R4      4       tR R ltR R ltR R ltRRRRRRRRRRRRRRRRRRRRRR
R RR!RR"RR#RR$R/R% R& lltR' R( ltRRRRRR/R) R* lltR+ R, ltR- R. ltR/tR0 R1 lt R2 R3 lt!R4 R5 lt"R6 R7 lt#R8R9R:R9R;R9R"R/R< R= llt$R8R9R;R9/R> R? llt%R@ RA lt&RBR/RC RD llt'^t(RBR/RE RF llt)RG RH lt*RI RJ lt+RK RL lt,RM RN lt-ROR/RP RQ llt.RR RS lt/RT RU lt0RV RW lt1RX RY lt2RZ R[ lt3R\ R] lt4R^ R_ lt5R` Ra lt6RRRbR/Rc Rd llt7Re Rf lt8R8R9R;R9/Rg Rh llt9RkRi Rj llt:R# )lu®   Provider/model inventory â€” shared substrate for the dashboard ``/api/model/options``, the TUI
``model.options``/``model.save_key`` RPC handlers, and the interactive picker.)ÚannotationsN)Úcopy_context)Ú	dataclassÚreplace)ÚLockÚThreadÚcurrent_thread)ÚAnyÚOptional)ÚUTCz5dict[tuple[str, tuple[tuple[str, str], ...]], Thread]Ú_pricing_prewarm_threadsT)Úfrozenc                  óx   € ] tR t^t$ RtR]R&   R]R&   R]R&   R]R&   R]R	&   R
tR]R&   RR
RR
RR
/R R lltRtR
# )ÚConfigContextzmDisk-config snapshot (``load_picker_context()``); the TUI overlays live agent state via
``with_overrides()``.ÚstrÚcurrent_providerÚcurrent_modelÚcurrent_base_urlÚdictÚuser_providersÚlistÚcustom_providersNÚexcluded_providersc               ó(   € V ^8„  d   QhRRRRRRRR/# )é   r   úOptional[str]r   r   Úreturnr   © )Úformats   "Ú9/home/ubuntu/.hermes/hermes-agent/hermes_cli/inventory.pyÚ__annotate__ÚConfigContext.__annotate__   s.   € ÷ 	3ñ 	3Ø#0ð	3ØHUð	3à'ð	3ð 
ñ	3ó    c               óŽ   € RV3RV3RV33pV UUu/ uF  w  rVV'       g   K  WVbK  	  pppV'       d   \        V 3/ VB # T # u uppi )u¬   Copy with TRUTHY overrides applied: the TUI reads agent attributes that may be empty strings
before an agent is spawned â€” empties must not clobber the disk-config values.r   r   r   )r   )Úselfr   r   r   Ú	overridesÚkÚvÚkws   &$$$    r   Úwith_overridesÚConfigContext.with_overrides   s\   € ð )Ð*:Ð;¸oÈ}Ð=]Ø(Ð*:Ð;ð=ˆ	á(Ô.™y‘t�q¬AŒdˆaŠd™yˆÑ.ß&(Œw�tÑ"˜rÑ"Ð2¨dÐ2ùó /s
   ‘A¢Ar   )	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__r   r)   Ú__static_attributes__r   r"   r   r   r      sT   ‡ ñð ÓØÓØÓØÓØÓØ#Ð˜Ó#ð	3Ø37ð	3ØX\ð	3à*.÷	3ó 	3r"   r   c               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r    r    )   s   € ÷ ñ ˜]ñ r"   c                 ót  € ^ RI Hp HpHpHp V! 4       pVP                  R/ 4      p\        V\        4      '       dt   \        VP                  RVP                  RR4      4      ;'       g    R4      pV ! VP                  RR4      4      p\        VP                  RR4      ;'       g    R4      pMV'       d   \        V4      MRRRr‡pVP                  R/ 4      P                  R	4      ;'       g    . p	\        YvTV! VP                  R
4      4      V! V4      \        V	\        4      '       d   V	R7      # . R7      # )z3Load the disk-config snapshot every consumer needs.)Úcoerce_provider_idÚget_compatible_custom_providersÚload_configÚstringify_provider_mapÚmodelÚdefaultÚnameÚ ÚproviderÚbase_urlÚmodel_catalogr   Ú	providers)r   r   r   r   r   r   )Úhermes_cli.configr4   r5   r6   r7   ÚgetÚ
isinstancer   r   r   r   )
r4   r5   r6   r7   ÚcfgÚ	model_cfgr   r   r   Úexcludeds
             r   Úload_picker_contextrF   )   s  € ÷ó ñ ‹-€CØ—‘˜ Ó$€IÜ�)œT×"Ò"ô ˜IŸM™M¨)°Y·]±]À6È2Ó5NÓO×UÐUÐSUÓVˆÙ-¨i¯m©m¸JÈÓ.KÓLÐÜ˜yŸ}™}¨Z¸Ó<×BÐBÀÓCÑçOX¼SÀ¼^Ð^`ÐceÐgiÐ)9ˆØ�w‰w�¨Ó+×/Ñ/Ð0DÓE×KÐKÈ€HÜØ)ÐYiÙ-¨c¯g©g°kÓ.BÓCÙ8¸Ó=Ü'1°(¼D×'AÒ'A˜8ô	ð ð HJô	ð r"   c               ó    € V ^8„  d   QhRRRR/# )r   Úrowr   r   r   r   )r   s   "r   r    r    A   s   € ÷ 6ñ 6ˆtð 6˜ñ 6r"   c                ó‚   € \        V P                  R 4      ;'       g    R4      P                  4       P                  4       # )Úslugr;   )r   rA   ÚstripÚlower)rH   s   &r   Ú_slugrM   A   s/   € Üˆs�w‰w�v‹×$Ð$ "Ó%×+Ñ+Ó-×3Ñ3Ó5Ð5r"   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úrowsú
list[dict]rJ   r   r   r   )r   s   "r   r    r    E   s!   € ÷ 1ñ 1˜
ð 1¨#ð 1°*ñ 1r"   c                óT   € V  Uu. uF  p\        V4      V8w  g   K  VNK  	  up# u upi ©N)rM   )rO   rJ   Úrs   && r   Ú_without_slugrT   E   s'   € ÙÓ0‘t�!œu Q›x¨4Ñ/�AˆA‘tÑ0Ð0ùÒ0s   …%œ%Úexplicit_onlyFÚinclude_unconfiguredÚpicker_hintsÚcanonical_orderÚpricingÚpricing_cache_onlyÚcapabilitiesÚfeaturedÚforce_fresh_nous_tierÚrefreshÚprobe_custom_providersÚprobe_current_custom_providerÚ
for_pickerÚ
max_modelsÚnon_blocking_catalogsÚfast_custom_probec          $     ó`   € 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RRRRRRRRRRRRR/# )r   Úctxr   rU   ÚboolrV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   ú
int | Nonerc   rd   zbool | Noner   r   r   )r   s   "r   r    r    L   sâ   € ÷ ^]ñ ^]Ø	ð^]Ø*.ð^]ØNRð^]àð^]à15ð^]àHLð^]ð ð^]ð ð	^]ð +/ð	^]ð PTð	^]ð
 ð^]ð
 48ð^]ð
 `dð^]ð ð^]ð +5ð^]ð UYð^]ð #ð^]ð 
ñ^]r"   c               ó:  a€ ^ RI Hp T! V P                  V P                  V P                  V P
                  V P                  T	YêTYÍV P                  ;'       g    . VVR7      p\        V 4      pVeh   \        VR4      V.,           pVP                  R4      '       d=   \        VR,          4      oR V3R llpV Uu. uF  pV! V4      '       d   K  VNK  	  pp\        V P                  4      pVe   V.\        VR	4      ,           pV'       d†   \        VV 4      p\        T;'       dA    VP                  R4      ;'       d(    V P                  ;'       g    R
P                  4       R8H  4      pV'       g   \!        V4      \#        VV RR7      ,           p\%        V4       V'       d'   \!        V4      \        \#        VV 4      R	4      ,           pV'       d   \'        V4       V'       d   \)        V4      pV'       d   \+        VW–R7       RpV'       g	   V'       d    ^ RIHp V! 4       pV'       d   \3        VVR7       V'       d   \5        VVR7       \7        V4       ^ RIHp V! V4       RVRV P                  RV P                  /# u upi   \0         d    Rp Lsi ; i)uÊ  Build the ``{providers, model, provider}`` shape every consumer needs. ``explicit_only`` keeps
only providers the user explicitly configured â€” hides ambient/auto-seeded credentials from
desktop chat pickers. ``pricing_cache_only``: with ``pricing``, use only values already resident
in process caches (normal picker opens, while a background worker warms cold endpoints).
``non_blocking_catalogs``: provider catalogs come from the disk cache only â€” a degraded provider
cannot stall the response (GUI picker opens). ``fast_custom_probe`` overrides the
custom-endpoint discovery budget ``for_picker`` otherwise implies (1.5s vs 5s) â€” ``None`` keeps
the coupling, ``False`` retains the full 5s budget (#103843).)Úlist_authenticated_providers)r   r   r   r   r   r]   rb   r^   r_   r`   ra   r   rc   rd   NÚllamacppÚ
is_currentÚmodelsc               ó    € V ^8„  d   QhRRRR/# ©r   rH   r   r   rg   r   )r   s   "r   r    Ú*build_models_payload.<locals>.__annotate__u   s   € ÷ Tñ T¨ð T°ñ Tr"   c                óÐ   <€ V P                  R 4      ;'       g    .  Uu0 uF  p\        V4      kK  	  pp\        V 4      R8H  ;'       d    \        V4      ;'       d    VS8*  # u upi )rm   Úcustom)rA   r   rM   rg   )rH   Úmrm   Ústageds   &  €r   Ú_is_managed_customÚ0build_models_payload.<locals>._is_managed_customu   s_   ø€ Ø+.¯7©7°8Ó+<×+BÐ+BÀÐ+BÓDÑ+B Qœ#˜až&Ñ+B�ÐDÜ˜S“z XÑ-×SÐS´$°v³,×SÐSÀ6ÈVÑCSÐSùò Es   ŸA#Úmoar;   rr   T)Úcurrent_only)r]   Úcached_only)Úload_config_readonly)Úmetadata_config)Údrop_unofferable_model_idsr?   r8   r<   )Úhermes_cli.model_switchrj   r   r   r   r   r   r   Ú_local_runtime_rowrT   rA   ÚsetÚ_moa_provider_rowÚ_filter_explicit_provider_rowsrg   rL   r   Ú_append_unconfigured_rowsÚ_strip_aggregator_overlapsÚ_apply_picker_hintsÚ_reorder_canonicalÚ_apply_pricingr@   rz   Ú	ExceptionÚ_apply_capabilitiesÚ_apply_featuredÚ_apply_custom_aliasesÚhermes_cli.models_validater|   )rf   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   rj   rO   Ú	local_rowru   rS   Úmoa_rowÚ_local_owns_currentr{   rz   r|   rt   s   &$$$$$$$$$$$$$$$$          @r   Úbuild_models_payloadr�   L   sQ  ø€ õ" Eá'Ø×-Ñ-À×@TÑ@TØ×'Ñ'¸×8JÑ8JØ×-Ñ-ÐEZØÐG]Ø&CØ×1Ñ1×7Ð7°RØ3ÐGXô€Dô # 3Ó'€IØÒÜ˜T :Ó.°)°Õ<ˆð �=‰=˜×&Ò&Ü˜ 8Õ,Ó-ˆF÷Tð Tñ  $ÓA™t˜!Ñ+=¸a×+@—A�A™tˆDÐAä × 4Ñ 4Ó5€GØÒØˆyœ=¨¨uÓ5Õ5ˆçÜ-¨d°CÓ8ˆô
 # 9÷ $Xð $X°·±¸|Ó1L÷ $Xð $XØ(+×(<Ñ(<×(BÐ(BÀ×'IÑ'IÓ'KÈxÑ'WóYÐç"Ü˜“:Ô 9¸$ÀÐRVÔ WÕWˆDô ˜tÔ$çÜ�D‹zœMÔ*CÀDÈ#Ó*NÐPUÓVÕVˆßÜ˜DÔ!ßÜ! $Ó'ˆßÜ�tÐ3HÕið €Oß—xð	#Ý>á2Ó4ˆO÷ Ü˜D°/ÕBßÜ˜¨oÕ>Ü˜$ÔÝEá˜tÔ$à˜˜w¨×(9Ñ(9¸:Às×G[ÑG[Ð\Ð\ùòc BøôL ô 	#Ø"ŠOð	#ús   Â;JÃJÈJ
 Ê
JÊJc               ó    € V ^8„  d   QhRRRR/# ©r   rO   rP   r   ÚNoner   )r   s   "r   r    r    ­   s   € ÷ 30ñ 30 Zð 30°Dñ 30r"   c                óV  a€  ^ RI Hp T  Uu0 uF@  pTP                  R4      '       d   K  T! \	        T4      4      '       g   K5  \	        T4      kKB  	  upoR T3R llp\        4       pT  Fe  pTP                  R4      '       g   K  S'       d   T! T4      '       d   K4  TP                  R TP                  R4      ;'       g    .  4       4       Kg  	  T'       g   R# T  F©  pTP                  R4      '       g   T! TP                  RR	4      4      '       g   K:  TP                  R4      ;'       g    . pT Uu. uF  qfP                  4       T9  g   K  TNK  	  pp\        T4      \        T4      8  g   K—  YrR&   \        T4      TR
&   K«  	  R#   \         d     R# i ; iu upi u upi )ak  Drop models from TRUE routing aggregators (OpenRouter, custom:* proxies) that a user-defined
provider also serves. The is_user_defined guard matters: is_routing_aggregator() is True for every
custom:* slug, so without it the dedup would empty a user's own custom row. Flat-namespace
resellers (opencode-go/zen) serve every model first-party and keep shared names.©Úis_routing_aggregatorNÚis_user_definedc               ó    € V ^8„  d   QhRRRR/# ro   r   )r   s   "r   r    Ú0_strip_aggregator_overlaps.<locals>.__annotate__¼   s   € ÷ Hñ H¨Dð H°Tñ Hr"   c                ó"  <€ \        V 4      pVP                  R 4      '       d   VP                  R^4      ^,          MRpV'       d
   VS9   d   R# ^ RIHp T! \        V P                  R4      ;'       g    R4      4      pVRJ;'       d    VS9   # )úcustom:Ú:r;   T)Ú_infer_provider_from_urlÚapi_urlN)rM   Ú
startswithÚsplitÚagent.model_metadatarœ   r   rA   )rH   Úrow_slugÚslug_suffixrœ   ÚinferredÚbuiltin_aggregatorss   &    €r   Ú_duplicates_builtin_aggregatorÚB_strip_aggregator_overlaps.<locals>._duplicates_builtin_aggregator¼   s„   ø€ ô
 ˜“:ˆà)1×)<Ñ)<¸Y×)GÒ)GˆH�N‰N˜3 Ó" 1Ö%ÈRð 	÷ ˜;Ð*=Ô=ÙÝAá+¬C°·±¸	Ó0B×0HÐ0HÀbÓ,IÓJˆØ˜tÐ#×GÐG¨Ð4GÑ(GÐGr"   c              3  ó@   "  € T F  qP                  4       x € K  	  R # 5irR   )rL   )Ú.0rs   s   & r   Ú	<genexpr>Ú-_strip_aggregator_overlaps.<locals>.<genexpr>Ñ   s   é € ÐLÑ3J¨QŸw™wŸy˜yÓ3Jùs   ‚rm   rJ   r;   Útotal_models)	Úhermes_cli.providersr•   r‡   rA   rM   r   ÚupdaterL   Úlen)	rO   r•   rH   r¥   Úuser_modelsÚoriginalrs   Úfilteredr¤   s	   &       @r   rƒ   rƒ   ­   sp  ø€ ð
Ý>ñ
 #óÙ"�sØ�w‰wÐ(×)ô 	Ù.CÄEÈ#ÃJ×.Oô 	ŒˆcŽ
™dñÐ÷
Hð Hô   ›E€KÛˆØ�7‰7Ð$×%Ô%ß"Ñ'EÀc×'JÒ'JÙØ×ÑÑL°3·7±7¸8Ó3D×3JÐ3JÈÐ3JÓLÖLñ	 ÷
 ÙÛˆØ�7‰7Ð$×%Ò%Ñ-BÀ3Ç7Á7È6ÐSUÓCV×-WÒ-WÙð —7‘7˜8Ó$×*Ð*¨ˆÙ'ÓH™x˜!¯7©7«9¸KÑ+G—A�A™xˆÐHÜˆx‹=œ3˜x›=Ö(Ø$�‰MÜ"% h£-ˆC�Óó øôA ô ÚðüòùòL Is-   ƒF �F!«F!ÁF!Ä9F&ÅF&ÆFÆFc          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   rf   r   rU   rg   rV   r^   r   r   r   )r   s   "r   r    r    ã   s6   € ÷ ñ Ø	ðØ*.ðØNRðàðð 
ñr"   c               ó:  € \        V4      p\        V \        V4      \        V4      RRRV'       * RRRRW3V'       * V'       * R7      p\        VR,          4       \        VR,          4       V'       g*   \	        VR,          V P
                  V P                  R7       V# )a£  Shared API-server/dashboard/TUI payload. Normal open probes only the current custom provider so
offline saved endpoints don't block the picker; explicit refresh probes all and busts the cache.

A normal open (``refresh=False``) is a READ path: provider catalogs come from the disk cache
only and stale/missing ones warm in the background, so a degraded provider (hanging endpoint,
failed auth probe) delays neither the other providers' rows nor the response (#114215).

``for_picker=True`` keeps providers whose credential pool is entirely rate-limited visible:
these are human-facing pickers, and hiding a temporarily exhausted pool makes providers vanish
mid-session even though another model under the same provider may still work (same contract
as ``/model`` and the aux pickers, #66584 / #66624). Visibility only: ``fast_custom_probe=False``
keeps the live probe of the current custom endpoint on its full 5s discovery budget.TF)rU   rV   rW   rX   rY   rZ   r[   r\   ra   rd   r^   r_   r`   rc   r?   )r   r   )rg   r�   Ú_apply_limitsÚ_apply_usageÚ_prewarm_pricing_asyncr   r   )rf   rU   rV   r^   Úpayloads   &$$$ r   Úbuild_model_options_payloadr¸   ã   s’   € ô  �7‹m€GÜ"Øœ4 Ó.ÄTÐJ^ÓE_Ø¨4¸ÐV]ÔR]Ø D°TÈUØÐ[bÔWbØ")œkô€Gô �'˜+Õ&Ô'Ü�˜Õ%Ô&ßÜ˜w {Õ3Àc×FZÑFZØ03×0DÑ0Dõ	Fà€Nr"   c               ó    € V ^8„  d   QhRRRR/# r‘   r   )r   s   "r   r    r      s   € ÷ lñ l˜
ð l tñ lr"   c                ó,  a€ ^ RI p^ RIHoHp ^ RIHp ^ RIHp R V3R llpV! 4       P                  4        UUu0 uF  w  rgV'       g   K  VkK  	  pppV  Fò  p	\        V	P                  R4      ;'       g    R4      pWh9  g/   V	P                  R	4      '       g   V	P                  R
4      '       d   K]   V! V4      P                  V	P                  R4      ;'       g    . 4      p
T
f   K”  T
R,          R8X  d   RRRT! T
R,          4      /T	R&   Kº  RRRT
R,          P                  4        UUu/ uF  w  r¼Yµ! T4      bK  	  upp/T	R&   Kô  	  R# u uppi   \         d.    TP                  ! \        4      P                  RTRR7        EK5  i ; iu uppi )a  Attach ``limit`` to rows whose credential pool is rate-limited, so a picker can say why and until
when instead of the row just looking broken. Only providers with a persisted pool are read (no
seeding), and a pool that fails to load says nothing rather than failing the whole catalog.N©ÚdatetimeÚtimezone)Ú	load_pool©Úread_credential_poolc               ó    € V ^8„  d   QhRRRR/# ©r   ÚepochÚfloatr   r   r   )r   s   "r   r    Ú#_apply_limits.<locals>.__annotate__  s   € ÷ >ñ >�5ð >˜Sñ >r"   c                óL   <€ SP                  V \        4      P                  4       # rR   )Úfromtimestampr   Ú	isoformat)rÃ   r¼   s   &€r   ÚisoÚ_apply_limits.<locals>.iso  s   ø€ Ø×%Ñ% e¬SÓ1×;Ñ;Ó=Ð=r"   rJ   r;   r–   Ú
plan_usagerm   zPool limit read failed for %sT©Úexc_infoÚscopeÚaccountÚ	resets_atÚlimit)Úloggingr¼   r½   Úagent.credential_poolr¾   Úhermes_cli.authrÀ   Úitemsr   rA   Úlimit_stater‡   Ú	getLoggerr+   Údebug)rO   rÒ   r½   r¾   rÀ   rÉ   rJ   ÚentriesÚpooledrH   Ústaters   Úatr¼   s   &            @r   r´   r´     sk  ø€ ó ß+å/Ý4÷>ð >ñ )=Ó(>×(DÑ(DÔ(FÔRÑ(F‘}�tÌ'�dˆdÑ(F€FÑRÛˆÜ�3—7‘7˜6“?×(Ð( bÓ)ˆð Ô §¡Ð):×!;Ò!;¸s¿w¹wÀ|×?TÒ?TÙð	Ù˜d“O×/Ñ/°·±¸Ó0A×0GÐ0GÀRÓHˆEð Š=ÙØ��>˜YÔ&Ø# Y°¹SÀÀ{ÕASÓ=TÐUˆC�‹Là# X¨xÐRWÐX`ÕRa×RgÑRgÔRiÔ9jÑRiÉÈ¸!¸SÀ»Wº*ÑRiÒ9jÐkˆC�‹Ló! ùó Søô ô 	Ø×ÒœhÓ'×-Ñ-Ð.MÈtÐ^bÐ-ÔcÛð	üó :ks)   »EÁEÂ5(EÃEÄ.FÅ3FÆFc               ó    € V ^8„  d   QhRRRR/# r‘   r   )r   s   "r   r    r    $  s   € ÷ B8ñ B8�zð B8 dñ B8r"   c                óî  € ^ RI HpHpHpHpHp ^ RIHp R R lpR R lp. p	. p
V! 4       P                  4        UUu/ uF  w  r¼V'       g   K  V\        V4      bK  	  pppV  Fø  p\        VP                  R4      ;'       g    R4      pV'       d-   VP                  R	4      '       g   VP                  R
4      RJ d   K]  V! V4      pVP                  V^ 4      ^8  dK   V'       g   K†  V	P                  V4       V! V4      pV! V4      pV'       d   V! V4      '       g   RV/VR&   KÆ  V'       d   V	P                  V4       \        W·WŠ4      pVf   Kñ  RV/VR&   Kú  	  V! V	4       V! V
4       R# u uppi )u  Attach ``usage`` (subscription windows: % spent + reset) to signed-in rows that can report it,
from the cache only, and ask for a background refresh, so the picker never waits on a usage API
and a chip can warn before the wall instead of at it.

Single-account providers keep the legacy gauge (``usage.windows``). A provider with a
MULTI-ENTRY credential pool reports ``usage.accounts`` instead â€” one row per account, each with
its own windows/state/resets_at â€” because one account's quota says nothing about its siblings;
a provider-wide percentage there would be a fabricated average. A snapshot older than the
staleness bound renders ``unknown``/``unavailable``, never a confident stale gauge. Nothing here
mutates the pool or disables routing: telemetry never benches a credential.)Úcached_account_usageÚhas_account_usageÚrefresh_account_usage_asyncÚ#refresh_account_usage_entries_asyncÚsnapshot_is_staler¿   c               ó   € V ^8„  d   QhRR/# )r   r   rP   r   )r   s   "r   r    Ú"_apply_usage.<locals>.__annotate__5  s   € ÷ 
ñ 
 :ñ 
r"   c                ó,  € V '       d   V P                   MR Uu. uFo  qP                  f   K  RVP                  R\        VP                  4      RVP                  '       d   VP                  P                  4       MR RVP                  /NKq  	  up# u upi )NÚlabelÚused_percentrÐ   rÎ   r   )Úwindowsrè   rç   rÄ   Úreset_atrÈ   rÎ   )ÚsnapshotÚws   & r   Ú_wire_windowsÚ#_apply_usage.<locals>._wire_windows5  s}   € ÷
 +3�h×&Ò&¸Ð:ó	
ñ ;�¿~¹~ôˆW�a—g‘g˜~¬u°Q·^±^Ó/DØ°A·J·J°J˜!Ÿ*™*×.Ñ.Ô0ÀDØ�a—g‘góñ ;ñ	
ð 	
ùò 
s   ™B­A!Bc               ó    € V ^8„  d   QhRRRR/# )r   Úlive_cooldown_untilzfloat | Noner   z
str | Noner   )r   s   "r   r    rå   =  s   € ÷ /ñ /¸,ð /È:ñ /r"   c                óž  € . pV'       d   VP                  \        V4      4       V '       d   V P                  MR F{  pVP                  R8w  g   VP                  e   VP
                  f   K2  \        VP                  4      \        8¼  g   KR  VP                  VP
                  P                  4       4       K}  	  V'       d   \        V4      # R# )uM  A quota-exhausted account recovers at the LATEST of its exhausted account-scoped
windows (all of them must reopen before the account is whole again); a live
credential-wide cooldown wins when later. Model-scoped windows never reset an account.
Unknown stays None â€” the frontend renders its own advisory (e.g. the earliest sibling).rÏ   Nr   )
ÚappendÚ_iso_from_epochré   rÎ   rè   rê   rÄ   Ú_EXHAUSTED_WINDOW_PERCENTrÈ   Úmax)rë   rð   ÚresetsÚwindows   &&  r   Ú_account_resets_atÚ(_apply_usage.<locals>._account_resets_at=  s˜   € ð
 ˆßØ�M‰Mœ/Ð*=Ó>Ô?ß+3�x×'Ò'¸Ò;ˆFØ�|‰|˜yÔ(¨F×,?Ñ,?Ò,GÈ6Ï?É?ÒKbÙÜ�V×(Ñ(Ó)Ô-FÖFØ—‘˜fŸo™o×7Ñ7Ó9Ö:ñ	 <÷
 %Œs�6‹{Ð.¨$Ð.r"   rJ   r;   r–   ÚauthenticatedFré   ÚusageNÚaccounts)Úagent.account_usage_cacherß   rà   rá   râ   rã   rÔ   rÀ   rÕ   r®   r   rA   rò   Ú_pool_usage_accounts)rO   rß   rà   rá   râ   rã   rÀ   rí   rø   ÚwantedÚentry_requestsrJ   rÙ   Úpooled_sizesrH   Úsupports_usagerë   ré   rü   s   &                  r   rµ   rµ   $  sR  € ÷õ õ 5õ
õ/ð €FØ!#€NÙ<PÓ<R×<XÑ<XÔ<ZÔfÑ<Z©=¨4Ô^eÔ&�Dœ#˜g›,Ò&Ñ<Z€LÑfÛˆÜ�3—7‘7˜6“?×(Ð( bÓ)ˆß�s—w‘wÐ0×1Ò1°S·W±W¸_Ó5MÐQVÓ5VÙÙ*¨4Ó0ˆð ×Ñ˜D !Ó$ qÔ(ß!ÙØ�M‰M˜$ÔÙ+¨DÓ1ˆHÙ# HÓ-ˆGßÑ0°×:Ò:Ø )¨7Ð3��G‘ÙßØ�M‰M˜$ÔÜ'¨Ð=OÓ`ˆØÔØ&¨Ð1ˆC�‹Lñ+ ñ,   Ô'Ù'¨Ö7ùó1 gs   ½E1ÁE1ç      Y@c               ó    € V ^8„  d   QhRRRR/# rÂ   r   )r   s   "r   r    r    m  s   € ÷ Añ A˜5ð A Sñ Ar"   c                ól   € ^ RI H pHp VP                  \        V 4      \        4      P                  4       # )é    r»   )r¼   r½   rÇ   rÄ   r   rÈ   )rÃ   r¼   r½   s   &  r   ró   ró   m  s%   € ß+à×!Ñ!¤%¨£,´Ó4×>Ñ>Ó@Ð@r"   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rJ   r   r   rP   r   zOptional[list[dict]]r   )r   s   "r   r    r    s  s(   € ÷ Mñ M˜sð MØ)3ðMØ8LñMr"   c                óÄ  € ^ RI p^ RIp^ RIHpHpHpHp	 ^ RIHp
H	pH
p  V! V 4      p\        VP                  4       4      pT'       g   R# T Uu. uF  qÿP"                  T
8w  g   K  TNK  	  pp\%        T4      ^8*  pT! T 4      pTP                  4       p. p/ pT EFø  pT! T T4      p\'        T T4      pT TT3pTP"                  T
8H  pT'       d   T'       g   T! T TR7      MRpT	! T4      pT'       g	   T! T4      M. pT'       d   RM	T! TTR7      pT'       d
   TT8”  d   TMRp\)        T4      ;'       d5    \*        ;QJ d    R	 T 4       F  '       g   K   RM	  R
M! R	 T 4       4      p T'       d   Rp!M(Tf	   T '       d   Rp!MTe   T'       g	   T'       g   Rp!MRp!RTR\-        TP.                  ;'       g    R4      RTRT!RT! TT4      /p"TT9   de   TT,          p#R^R^R^R^ /p$T$P1                  T"R,          ^ 4      T$P1                  T#R,          ^ 4      8”  d   T"TTP3                  T#4      &   T"TT&   EKŸ  T"TT&   TP5                  T"4       T'       g   EKÀ  T'       d   EKË  TP5                  RT RTR\7        T T4      RTP8                  /4       EKû  	  T;'       g    R#   \         d-    TP                  ! \        4      P!                  RT RR7        R# i ; iu upi )u§  Per-account usage rows for one pooled provider, or None when the pool cannot be read.

Read-only: entries are inspected via ``load_pool(slug)`` properties (no select/rotate/refresh).
Dedupe is scoped to provider+host+trusted decoded account id where supported (several
credentials of one Codex account are ONE account), else per-credential token identity â€” never
a provider-wide singleton. Providers without a usage fetcher still get one metadata row per
account with state unknown/limited/unavailable, so the chip can count honestly without bogus
fetches. DEAD auth rows stay visible as ``unavailable`` (never a quota row). No secrets, raw
payloads or base URLs ride the wire.N)Ú_identity_id_forrß   rà   rã   )ÚSTATUS_DEADÚ_exhausted_untilr¾   zPool usage read failed for %sTrÌ   )Úidentity_id)Úsole_credentialc              3  óÂ   "  € T FU  pVP                  R 4      R8H  ;'       d5    VP                  R4      RJ;'       d    \        VR,          4      \        8¬  x € KW  	  R# 5i)rÎ   rÏ   rè   N)rA   rÄ   rô   )r¨   rì   s   & r   r©   Ú'_pool_usage_accounts.<locals>.<genexpr>Ÿ  sf   é € ð 0XáOVÈ!ð �E‰E�'‹N˜iÑ'÷ Fð F¨A¯E©E°.Ó,AÈÐ,M÷ Fð FÜ�a˜Õ'Ó(Ô,EÑEôFÛOVùs   ‚A¢A½"AFÚunavailableÚlimitedÚunknownÚreadyÚidrç   r;   ré   rÛ   rÐ   r<   r  r=   Úapi_key)rÒ   Útimerý   r	  rß   rà   rã   rÓ   r
  r  r¾   r   rÙ   r‡   r×   r+   rØ   Úlast_statusr®   Ú_pool_entry_hostrg   Úanyr   rç   rA   Úindexrò   Ú_pool_entry_route_base_urlÚruntime_api_key)%rJ   Úwire_windowsÚaccount_resets_atr   rÒ   r  r	  rß   rà   rã   r
  r  r¾   ÚpoolrÙ   ÚeÚliveÚsoler  Únowrü   ÚseenÚentryr  ÚhostÚ
dedupe_keyÚis_deadrë   Ústaleré   Úcooldown_untilÚlive_cooldownÚquota_exhaustedrÛ   Úaccount_rowÚexistingÚranks%   &&&&                                 r   rþ   rþ   s  sÖ  € ó ÛçvÓvßNÑNðÙ˜‹ˆÜ�t—|‘|“~Ó&ˆ÷ ÙÙÓ?‘w�!§-¡-°;Ñ">�AˆA‘w€DÐ?Üˆt‹9˜‰>€DÙ& tÓ,€NØ
�)‰)‹+€CØ€HØ-/€DÜˆÙ& t¨UÓ3ˆÜ  eÓ,ˆØ˜D +Ð.ˆ
Ø×#Ñ# {Ñ2ˆç%¯gñ )¨¸;ÕGØ;?ð 	á! (Ó+ˆß05‘,˜xÔ(¸2ˆ÷ ")™Ñ.>¸uÐVZÔ.[ˆß*8¸^ÈcÔ=Q™ÐW[ˆÜ˜w›-÷ Xð X¯C«Cñ 0XáOVó0X¯C¯CªCñ 0XáOVó0Xó -Xˆ÷ Ø!‰EØÒ&¯/Ø‰EØÒ§¯gð ‰EàˆEà�+˜w¬¨E¯K©K×,=Ð,=¸2Ó(>À	È7Ø�U˜KÑ):¸8À]Ó)Sð
ˆð ˜Ôð ˜JÕ'ˆHØ˜q '¨1¨i¸¸MÈ1ÐMˆDØ�x‰x˜ GÕ,¨aÓ0°4·8±8¸HÀWÕ<MÈqÓ3QÔQØ5@�˜Ÿ™¨Ó1Ñ2Ø#.��ZÑ ÚØ&ˆˆZÑØ�‰˜Ô$ßŠ>§'¢'Ø×!Ñ!Ø˜D -°ØÔ6°t¸UÓCÀYÐPU×PeÑPeð#÷ ñU ð\ ×Ð�tÐøôs ô Ø×Òœ(Ó#×)Ñ)Ð*IÈ4ÐZ^Ð)Ô_Úðüò
 @s    !J# ÁKÁ&KÊ#3KËKc               ó    € V ^8„  d   QhRRRR/# )r   rJ   r   r   r   )r   s   "r   r    r    Ã  s   € ÷ ?ñ ?˜3ð ?¨#ñ ?r"   c                ó~   € ^ RI Hp V R8X  d   ^ RIHp V! V! VP                  4      4      # V! \        VRR4      4      # )zQNormalized route host of one entry, for account dedupe scoping. Never serialized.)Ú	_norm_urlúopenai-codex©Ú_codex_pool_route_base_urlÚruntime_base_urlN)rÓ   r2  Úhermes_cli.auth_codexr5  r6  Úgetattr)rJ   r%  r2  r5  s   &&  r   r  r  Ã  s<   € å/àˆ~ÔÝDáÑ3°E×4JÑ4JÓKÓLÐLÙ”W˜UÐ$6¸Ó=Ó>Ð>r"   c               ó    € V ^8„  d   QhRRRR/# )r   rJ   r   r   r   r   )r   s   "r   r    r    Î  s   € ÷ <ñ < Sð <°Mñ <r"   c                ón   € V R8X  d   ^ RI Hp V! VP                  4      # \        VRR4      ;'       g    R# )zVThe base URL a usage fetch for *entry* must target (its own route, never a sibling's).r3  r4  r6  N)r7  r5  r6  r8  )rJ   r%  r5  s   && r   r  r  Î  s6   € àˆ~ÔÝDá)¨%×*@Ñ*@ÓAÐAÜ�5Ð,¨dÓ3×;Ð;°tÐ;r"   r   r;   r   r   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   r   r   r   r   rb   rh   r   rP   r   )r   s   "r   r    r    Ú  s6   € ÷ &ñ &Øð&Ø25ð&ØNQð&àð&ð ñ&r"   c                ó~   € \        4       P                  WVR7      p\        VRRRVR7      R,          p\        VR4      # )uv  Provider rows for any auxiliary-task picker (vision, compression, â€¦). Honours
``excluded_providers``; exhausted-pool providers stay visible (``for_picker``); only the active
custom endpoint is probed. ``moa`` is excluded: auxiliary_client unwraps it to its aggregator
anyway, so offering it would be a choice silently rewritten.

Aux pickers kept re-deriving their own kwargs and each one silently dropped a different slice of the
user's configuration. Two independent contributor PRs landed against the same two call sites for exactly
this: 52642 (user ``providers:`` / ``custom_providers:`` entries never appeared) and #66624 (providers
with an exhausted credential pool were hidden). Both were per-site kwarg patches, so the next aux picker
would have reintroduced the same gap. Routing through one function makes the correct behaviour the
default that a new caller cannot forget:
)r   r   r   TF)ra   r_   r`   rb   r?   rw   )rF   r)   r�   rT   )r   r   r   rb   rf   rO   s   $$$$  r   Úbuild_aux_picker_rowsr=  Ú  sT   € ô  Ó
×
.Ñ
.Ø)ÐYið /ó €Cô  Ø˜°UÐZ^Øôð õ€Dô ˜˜uÓ%Ð%r"   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rO   rP   r   r   r   r   z list[tuple[str, str, list[str]]]r   )r   s   "r   r    r    ô  s,   € ÷ ñ Ø
ðØ+.ðØGJðà%ñr"   c          
     ó¶  € . p\        T;'       g    R4      P                  4       P                  4       p\        \        T;'       g    R4      P                  4       4      pV  Fó  p\        VP	                  R4      ;'       g    R4      pVP	                  R4      ;'       g    TpVP	                  R4      ;'       g%    \        VP	                  R4      ;'       g    . 4      p	V	'       d   RV	 R2MRp
VP                  4       V8X  d   V'       d   V'       g   RMRpTP                  Yx V
 V 2\        VP	                  R4      ;'       g    . 4      34       Kõ  	  V# )	u¿   Render aux-picker rows as ``(slug, label, models)``. A raw ``base_url`` custom endpoint is
"current" only through that URL, never a slug â€” so with ``current_base_url`` set no row is marked.r;   rJ   r:   r«   rm   u    â€” z modelsu     â†� current)r   rK   rL   rg   rA   r®   rò   r   )rO   r   r   rÙ   Úcurrent_slugÚhas_base_urlrH   rJ   r:   ÚtotalÚ
model_hintÚmarkers   &$$         r   Úformat_aux_picker_entriesrE  ô  s  € ð
 13€GÜÐ'×-Ð-¨2Ó.×4Ñ4Ó6×<Ñ<Ó>€LÜœÐ,×2Ð2°Ó3×9Ñ9Ó;Ó<€LÛˆÜ�3—7‘7˜6“?×(Ð( bÓ)ˆØ�w‰w�v‹×&Ð& $ˆØ—‘˜Ó'×GÐG¬3¨s¯w©w°xÓ/@×/FÐ/FÀBÓ+Gˆß/4�u˜U˜G 7Ñ+¸"ˆ
Ø$(§J¡J£L°LÔ$@Ç\×Zf‘ÐlnˆØ�‰˜  z l°6°(Ð;¼TÀ#Ç'Á'È(ÓBS×BYÐBYÐWYÓ=ZÐ[Ö\ñ ð €Nr"   c               ó   € V ^8„  d   QhRR/# )r   rJ   r   r   )r   s   "r   r    r      s   € ÷ ñ  Cñ r"   c                ó†   €  ^ RI HpHpHpHp RY13RYB3/pY9  d   R# YP,          w  rgT! 4        T#   \
         d     R# i ; i)uÇ   Per-model reasoning-capability reader for aggregators that publish one. Cache-only â€” the picker
must never block on HTTP; a cold cache warms in the background and reports no restriction until then.)Ú!nous_model_reasoning_capabilitiesÚ'openrouter_model_reasoning_capabilitiesÚwarm_nous_reasoning_caps_asyncÚ$warm_openrouter_reasoning_caps_asyncNÚnousÚ
openrouter)Ú hermes_cli.models_reasoning_capsrH  rI  rJ  rK  r‡   )rJ   rH  rI  rJ  rK  ÚreadersÚwarmÚreads   &       r   Ú_reasoning_catalog_readerrR    s^   € ð÷	
ó 	
ð 	Ð/ÐSØÐ;Ðeð€Gð ÔÙØ•�J€DÙ„FØ€Køô ô Úðús   ‚1 ±A ¿A r{   c               ó$   € V ^8„  d   QhRRRRRR/# ©r   rO   rP   r{   údict | Noner   r’   r   )r   s   "r   r    r      s"   € ÷ 0#ñ 0#˜jð 0#¸kð 0#ÐUYñ 0#r"   c          	     óT  € ^ RI Hp ^ RIHpHp  ^ RIHp V  EFQ  pVP                  R4      ;'       g    Rp/ p\        VP                  4       4      p	VP                  R4      ;'       g    .  Fô  p
RpVe2   V'       d*    V! WzVR	7      pVe   VP                  e   VP                  pV! W§VP                  R
4      R7      RJpRVRV/pV'       d3   V! V
4      '       d%   V! W§VP                  R
4      R7      '       d   RVR&   V'       dT   V	eP    V	! V
4      pV'       d   VP                  R4      '       g   RVR&   M!V'       d   VP                  R4      '       * VR&   WèV
&   Kö  	  W†R&   EKT  	  R#   \         d    Rp ELji ; i  \         d    Rp Lìi ; i  \         d    Rp L�i ; i)us  Attach ``{model: {fast, reasoning, ...}}`` per row. ``reasoning`` defaults True when the catalog is
silent (the dial is a no-op on models that ignore it; hiding it from a capable model is worse). A
serving aggregator's detail overrides models.dev (adds ``can_disable_reasoning``). ``supported_efforts``
is deliberately NOT forwarded â€” it under-reports levels that work.)Úultrafast_offered)Úmodel_supports_ultrafastÚresolve_fast_mode_overrides)Úget_model_capabilitiesNrJ   r;   rm   T©Úconfigr�   )r<   r=   ÚfastÚ	reasoningÚ	ultrafastÚsupports_reasoningFÚ	mandatoryÚcan_disable_reasoningr[   )Úagent.codex_service_tiersrW  Úhermes_cli.modelsrX  rY  Úagent.models_devrZ  r‡   rA   rR  rL   r`  )rO   r{   rW  rX  rY  rZ  rH   rJ   ÚcapsÚread_reasoning_catalogr8   r^  Úmetar]  r%  Údetails   &$              r   rˆ   rˆ     s­  € õ
 <ßWð&Ý;ô ˆØ�w‰w�v‹×$Ð$ "ˆØ*,ˆÜ!:¸4¿:¹:»<Ó!HÐØ—W‘W˜XÓ&×,Ð,¨"Ò,ˆEØˆIØ%Ò1·dð%Ù1°$ÀoÔV�DØÒ'¨D×,CÑ,CÒ,OØ$(×$;Ñ$;˜	ñ /Ø¨s¯w©w°yÓ/AôCØJNðOˆDà%+¨T°;À	Ð$JˆEßÑ0°×7Ò7Ñ<MØ°3·7±7¸9Ó3E÷=Gó =Gà%)��kÑ"çÐ3Ò?ð"Ù3°EÓ:�F÷  &§*¡*Ð-A×"BÒ"Bð */�E˜+Ò&ßØ9?¿¹ÀKÓ9PÔ5P�EÐ1Ñ2à�‹Kñ; -ð> #ˆNÔóG øô ô &Ø!%Óð&ûô !ô %Ø $’Ið%ûô !ô "Ø!’Fð"ús5   �E0 Á?(FÄFÅ0FÆ FÆFÆFÆF'Æ&F'c               ó$   € V ^8„  d   QhRRRRRR/# rT  r   )r   s   "r   r    r    V  s'   € ÷ 3Jñ 3J˜*ð 3J¸+ð 3JÐQUñ 3Jr"   c               ó  a€  ^ RI Hp  ^ RIHp V  EFÇ  p\        VP                  R4      ;'       g    R4      P                  4       P                  4       pVP                  R4      ;'       g    . pVP                  R4      '       g   V'       d   V! V4      '       g   . VR&   K“  / p\        V4       F�  w  r‰R	V	9   d   V	P                  R	^4      ^ ,          MRp
V
'       g   / p M`RpVe4   V! WYVR
7      ;'       g    V! RW‘R
7      pV'       d   \        VRR4      MRpVP                  V
. 4      P                  W‹V	34       K‘  	  \        V4      ^8  d	   . VR&   EKK  . pVP                  4        F1  p\!        VR RR7      pVP#                  R VR\$          4       4       K3  	  \        V4       UUu/ uF	  w  ppVVbK  	  uppo\!        VV3R lR7      VR&   EKÊ  	  R#   \         d    Rp ELçi ; i  \         d    Rp ELôi ; iu uppi )u‚  Attach a ``featured_models`` shortlist to each routing-aggregator row: newest
``_FEATURED_PER_LAB`` per vendor by models.dev ``release_date`` (ranked within the row, never vs.
today, so it is stable); ties keep curated order. Non-aggregators â€” including every user-defined
row, whose ``models:`` list is an explicit allow-list â€” get an empty list and keep top-N
behaviour (#120217).)Úget_model_infoNr”   rJ   r;   rm   r–   Úfeatured_modelsÚ/r[  rM  Úrelease_datec                ó(   € V ^,          V ^ ,          ) 3# )é   r   )r   s   &r   Ú<lambda>Ú!_apply_featured.<locals>.<lambda>†  s   € °A°aµD¸1¸Q½4¸%±=r"   T)ÚkeyÚreversec              3  ó*   "  € T F	  w  rq3x € K  	  R # 5irR   r   )r¨   Ú_posÚ_dater8   s   &   r   r©   Ú"_apply_featured.<locals>.<genexpr>‡  s   é € ÐWÑ<VÑ&8 d°5œEÓ<Vùs   ‚c                ó   <€ SV ,          # rR   r   )rs   Úorders   &€r   rr  rs  ‰  s	   ø€ ÀÀaÆr"   ©rt  )re  rl  r‡   r¬   r•   r   rA   rK   rL   Ú	enumeraterŸ   r8  Ú
setdefaultrò   r®   ÚvaluesÚsortedÚextendÚ_FEATURED_PER_LAB)rO   r{   rl  r•   rH   rJ   rm   Úby_labÚposr8   ÚlabÚdateÚinfor\   rÙ   ÚrankedÚirs   r{  s   &$                @r   r‰   r‰   V  sñ  ø€ ðÝ3ð%Ý>ô ˆÜ�3—7‘7˜6“?×(Ð( bÓ)×/Ñ/Ó1×7Ñ7Ó9ˆØ—‘˜Ó"×(Ð( bˆà�7‰7Ð$×%Ò%×.CÑH]Ð^b×HcÒHcØ%'ˆCÐ!Ñ"Ùà8:ˆÜ# FÖ+‰JˆCØ,/°5¬L�%—+‘+˜c 1Ó% aÖ(¸bˆCßØ�ÙØˆDØÒ)Ù& t¸?ÔK÷ Wð WÙ)¨,¸ÔVð ç<@”w˜t ^°RÔ8Àb�Ø×Ñ˜c 2Ó&×-Ñ-¨s¸%Ð.@ÖAñ ,ô ˆv‹;˜Œ?Ø%'ˆCÐ!Ñ"Úà ˆØ—}‘}–ˆGä˜GÑ)@È$ÔOˆFØ�O‰OÑW¸FÐCUÔDUÑ<VÓWÖWñ 'ô #,¨FÔ"3Ô4Ñ"3™$˜!˜Q��A’Ñ"3Ò4ˆÜ!'¨Ô6HÔ!IˆÐÔó? øô ô Ø‹ðûô ô %Ø $Óð%üóB 5s(   ƒG  ŠG4 Æ2HÇ G1Ç0G1Ç4HÈHc               ó    € V ^8„  d   QhRRRR/# r‘   r   )r   s   "r   r    r    Œ  s   € ÷ ñ  
ð ¨tñ r"   c                ó
  € ^ RI Hp V  Fd  pVP                  R4      '       g   K   \        V! \	        VP                  RR4      4      \	        VP                  RR4      4      4      4      VR&   Kf  	  R#   \
         d     Kx  i ; i)ué  Attach the accepted identity set to each user-defined row: ``model.options`` reports the canonical
``custom:<key>`` while rows carry the bare key as ``slug``, so GUI exact-match never finds the row.

GUI pickers compare the two to decide which row is active; exact equality never matches for custom
providers (#87035). Exposing ``aliases`` â€” every current and legacy spelling from
:func:`hermes_cli.providers.custom_provider_aliases` â€” lets the frontend do a membership check instead.
)Úcustom_provider_aliasesr–   r:   r;   rJ   ÚaliasesN)r¬   rŒ  rA   r€  r   r‡   )rO   rŒ  rH   s   &  r   rŠ   rŠ   Œ  sw   € õ =ãˆØ�w‰wÐ(×)Ò)Ùð	Ü#Ù'¬¨C¯G©G°F¸BÓ,?Ó(@Ä#ÀcÇgÁgÈfÐVXÓFYÓBZÓ[ó]ˆC�	‹Nó	 øô ô 	Úð	ús   ¦AA3Á3BÂBc               ó    € V ^8„  d   QhRRRR/# )r   rJ   r   r   ztuple[str, str]r   )r   s   "r   r    r    £  s   € ÷ ñ ˜cð  oñ r"   c                óÀ   € ^ RI Hp VP                  V 4      pV'       d   VP                  MRpV'       d&   VP                  '       d   VP                  ^ ,          MRpW43# )zZ``(auth_type, key_env)`` for a canonical provider (``("api_key", "")`` when unregistered).)ÚPROVIDER_REGISTRYr  r;   )rÔ   r�  rA   Ú	auth_typeÚapi_key_env_vars)rJ   r�  rC   r‘  Úkey_envs   &    r   Ú_provider_auth_hintr”  £  sJ   € å1à
×
Ñ
 Ó
%€Cß!$�—’¨)€Iß*-°#×2F×2FÐ2Fˆc×"Ñ" 1Ö%ÈR€GØÐÐr"   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   rJ   r   r:   rl   rg   Úextrar	   r   r   r   )r   s   "r   r    r    ­  s6   € ÷ eñ eˆsð e˜#ð e¨4ð e¸#ð eÀ$ñ er"   c                ó   € R V RVRVRR/VC# )rJ   r:   rl   r–   Fr   )rJ   r:   rl   r–  s   &&&,r   Ú_rowr˜  ­  s!   € Ø�D˜& $¨°jÐBSÐUZÐdÐ^cÐdÐdr"   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úcurr   r–  r	   r   r   r   )r   s   "r   r    r    ±  s&   € ÷ oñ o˜sð o¨Sð o°Tñ or"   c                ó¼   € ^ RI Hp \        V P                  VP	                  V P                  V P
                  4      V P                  P                  4       V8H  3/ VB # )r  )Ú_PROVIDER_LABELS)rd  rœ  r˜  rJ   rA   rç   rL   )r%  rš  r–  rœ  s   &&, r   Ú_canonical_rowr�  ±  sG   € Ý2ä�—
‘
Ð,×0Ñ0°·±¸U¿[¹[ÓIÈ5Ï:É:×K[ÑK[ÓK]ÐadÑKdÑnÐhmÑnÐnr"   rx   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rO   rP   rf   r   rx   rg   r   r   )r   s   "r   r    r    ·  s,   € ÷ 0ñ 0Ø
ð0Ø(ð0Ø;?ð0àñ0r"   c               óR  € ^ RI HpHp ^ RIHp V  Uu0 uF  qfR,          P                  4       kK  	  ppVP                  ;'       g    RP                  4       p\        VP                  ;'       g    R4      P                  4       p	VP                  ;'       g    .  U
u0 uF3  qª'       g   K  \        V
4      P                  4       P                  4       kK5  	  pp
/ pVP                  4        FQ  w  rÞVP                  VP                  4       VP                  4       04      P                  VP                  4       4       KS  	  . pV! 4        EFP  pVP                  P                  4       pVV9   d   K'  VP                  VV04      V,          '       d   KI  V'       d"   VP                  P                  4       V8w  d   Kr  VP                  P                  4       V8X  d¡   V! VP                  V	4      '       d   RMT	p\!        VP                  4      w  ppV	'       d   V'       g   RMRpVR8X  d   V'       d	   RV R	V 2MR
V 2pTP#                  \%        TTV'       d   V.M. V'       d   ^M^ RRVVVR7	      4       EK1  VP#                  \%        VV. ^ RR7      4       EKS  	  V# u upi u up
i )uù   Empty setup skeletons for canonical providers missing from ``rows`` â€” except the *current* one:
if config.yaml still points at it but credentials are gone, keep a row carrying the saved model so
GUI pickers don't silently snap to another provider.)Ú_PROVIDER_ALIASESÚ!_model_requires_account_discovery)Úlisted_canonical_providersrJ   r;   z9Astra requires successful account-scoped model discovery.zShowing the saved model only.r  z6Configured provider missing usable credentials; paste z to reactivate. zLConfigured provider is not authenticated; run `hermes model` to reactivate. zconfigured-currentF)rm   r«   Úsourcerú   r‘  r“  ÚwarningÚ	canonical)rm   r«   r£  )rd  r   r¡  Ú hermes_cli.models_catalog_staticr¢  rL   r   r   r   rK   r   rÕ   r~  ÚaddrJ   rA   r”  rò   r�  )rO   rf   rx   r   r¡  r¢  rS   r$  rš  Ú	cur_modelÚprE   Ú	names_forÚaliasÚcanonÚextrasr%  rJ   Úsaved_modelr‘  r“  Útailr¤  s   &&$                    r   r‚   r‚   ·  sE  € ÷ WÝKá'+Ó,¡t !ˆf�I�O‰OÖ¡t€DÐ,Ø×Ñ×%Ð% 2×
,Ñ
,Ó
.€CÜ�C×%Ñ%×+Ð+¨Ó,×2Ñ2Ó4€Ið
 25×1GÑ1G×1MÐ1MÈ2Ð1MÓTÑ1M¨1ÓRSÔ&”�A“—‘“×$Ñ$Ö&Ñ1M€HÐTØ%'€IØ)×/Ñ/Ö1‰ˆØ×Ñ˜UŸ[™[›]¨U¯[©[«]¨OÓ<×@Ñ@ÀÇÁÃÖOñ 2à€FÙ+×-ˆØ�z‰z×ÑÓ!ˆØ�4Œ<ÙØ�=‰=˜ ˜vÓ&¨×1Ô1Ùß˜EŸJ™J×,Ñ,Ó.°#Ô5ÙØ�:‰:×ÑÓ Ô$Ù AÀ%Ç*Á*Èi× XÒ X™"Ð^gˆKÜ!4°U·Z±ZÓ!@ÑˆI�w÷ §[ñ LØ6Uð ð  	Ô)¯gð IÈÈ	ÐQaÐbfÐagÑhàcÐdhÐciÐjð ð
 �M‰Mœ.Ø�s·K K¡=ÀR×[fÑVWÐlmØ+¸5ÈIÐ_fØôô ò
 Ø�‰”n U¨C¸ÈÐS^Ô_×`ñ5 .ð6 €MùòO -ùò Us   “JÂ	J$Â++J$c               ó   € V ^8„  d   QhRR/# ©r   r   rg   r   )r   s   "r   r    r    ê  s   € ÷ ñ ¨dñ r"   c                 óî  €  ^ RI Hp Hp W3p\        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   R#   ^ RIHp ^ RIHp T! R4       Fn  p\        T\        4      '       g   K  TP                  R4      T8X  g   K3  \        TP                  R	4      ;'       g    R
4      P                  4       '       g   Km   R# 	  R#   \         d     R# i ; i  \         d     R# i ; i)uº   True when the user explicitly authenticated Anthropic via OAuth (Hermes device flow or Claude Code
login) â€” those leave no trace in active_provider / model.provider / API-key env vars.)Úread_claude_code_credentialsÚread_hermes_oauth_credentialsc              3  ó`   "  € T F$  q! 4       ;'       g    / P                  R 4      x € K&  	  R# 5i)ÚaccessTokenN)rA   )r¨   rQ  s   & r   r©   Ú7_anthropic_oauth_credentials_present.<locals>.<genexpr>ñ  s&   é € ÐE¹W°T�“—�˜"×!Ñ! -×0Ð0»Wùs   ‚.”.TF)ÚAUTH_TYPE_OAUTHr¿   Ú	anthropicr‘  Úaccess_tokenr;   )Úagent.anthropic_credentialsr³  r´  r  r‡   rÓ   r¸  rÔ   rÀ   rB   r   rA   r   rK   )r³  r´  rO  r¸  rÀ   r%  s         r   Ú$_anthropic_oauth_credentials_presentr¼  ê  sÊ   € ðßkà0ÐOˆß‹3ÑE¹WÓE�3�3Š3ÑE¹WÓE×EÒEÙð Fð	Ý9Ý8á)¨+Ö6ˆEÜ˜5¤$×'Ô'¨E¯I©I°kÓ,BÀoÖ,UÜ˜EŸI™I nÓ5×;Ð;¸Ó<×BÑB×DÔDÚñ 7ñ øô ô Úðûô ô ØÙðúsF   ‚'C ¬C Á*C% Á:C% ÂC% Â/C% ÃC% ÃC% ÃC"Ã!C"Ã%C4Ã3C4c               ó$   € V ^8„  d   QhRRRRRR/# )r   rO   rP   rf   r   r   r   )r   s   "r   r    r      s&   € ÷ _ñ _¨ð _¸-ð _ÈJñ _r"   c           	     ól  aa€ ^ RI Ho \        VP                  ;'       g    R4      P	                  4       P                  4       oR VV3R llpV  Uu. uFV  p\        VP                  RR4      4      P	                  4       P                  4       ;p'       g   KD  V! W44      '       g   KT  VNKX  	  up# u upi )u½   Keep only rows backed by explicit user configuration â€” ``list_authenticated_providers`` also
discovers ambient credentials (e.g. GitHub CLI -> Copilot) Desktop chat pickers must not show.)Ú!is_provider_explicitly_configuredr;   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rH   r   rJ   r   r   rg   r   )r   s   "r   r    Ú4_filter_explicit_provider_rows.<locals>.__annotate__  s!   € ÷ 
ñ 
˜$ð 
 cð 
¨dñ 
r"   c                ó  <€ V P                  R 4      '       g&   S'       d   VS8X  g   V P                  R4      R8X  d   R# VR8X  d   \        4       # VR8H  ;'       d    \        4       ;'       g    \        V4      ;'       g	    S! V4      # )r–   r£  úlocal-runtimeTrw   r¹  )rA   Ú"_raw_config_has_enabled_moa_presetr¼  Ú_external_process_signed_in)rH   rJ   r@  r¿  s   &&€€r   Ú_is_explicitÚ4_filter_explicit_provider_rows.<locals>._is_explicit  sƒ   ø€ ð �G‰GÐ%×&Ò&¯<¸DÀLÔ<PØ—7‘7˜8Ó$¨Ô7ÙØ�5Œ=ô 6Ó7Ð7ð �[Ñ ×KÐKÔ%IÓ%K÷ 7ð 7Ü*¨4Ó0÷7ð 7á0°Ó6ð	
r"   rJ   )rÔ   r¿  r   r   rK   rL   rA   )rO   rf   rÆ  rH   rJ   r@  r¿  s   &&   @@r   r�   r�     s£   ù€ õ Bä�s×+Ñ+×1Ð1¨rÓ2×8Ñ8Ó:×@Ñ@ÓB€L÷
ñ 
ñ&  ó _™4�CÜ˜CŸG™G F¨BÓ/Ó0×6Ñ6Ó8×>Ñ>Ó@Ð@�Ó@ô ÙFRÐSV×F]÷ ˆC™4ñ _ð _ùò _s   ÁAB1ÂB1Â(B1c               ó    € V ^8„  d   QhRRRR/# )r   rJ   r   r   rg   r   )r   s   "r   r    r    #  s   € ÷ ñ  cð ¨dñ r"   c                óÜ   €  ^ RI HpHp VP                  V 4      p\	        T;'       d/    VP
                  R8H  ;'       d    V! V 4      P                  R4      4      #   \         d     R# i ; i)zDTrue when an external-process provider has verified CLI credentials.)r�  Ú$get_external_process_provider_statusÚexternal_processÚauth_verifiedF)rÔ   r�  rÊ  rA   rg   r‘  r‡   )rJ   r�  rÊ  Úpconfigs   &   r   rÅ  rÅ  #  sv   € ðß[Ø#×'Ñ'¨Ó-ˆÜ�G÷ Xð X × 1Ñ 1Ð5GÑ G÷ Xð XÙ<¸TÓB×FÑFÀÓWóYð 	Yøäô Úðús   ‚&A ©A Á A ÁA+Á*A+c               ó   € V ^8„  d   QhRR/# r±  r   )r   s   "r   r    r    .  s   € ÷ Uñ U¨Dñ Ur"   c                 óv  a€  ^ RI Hp  V ! 4       p\        T\        4      '       d   TP                  R4      MRo\        S\        4      '       g   R# SP                  R4      p\        T\        4      '       dQ   \        ;QJ d*    R TP                  4        4       F  '       g   K   R# 	  R# ! R TP                  4        4       4      # 0 R
mp\        ;QJ d    T3R lT 4       F  '       g   K   RM	  RM! T3R lT 4       4      ;'       d    \        SP                  R	R4      4      #   \         d     R# i ; i)zËTrue when the user's RAW config enables MoA: ``load_config()`` merges the DEFAULT_CONFIG preset for
everyone, which is not a user choice; visible once one enabled preset (or legacy flat config) is saved.)Úread_raw_configFrw   NÚpresetsc              3  óÚ   "  € T Fa  w  r\        T;'       g    R 4      P                  4       '       g   K0  \        V\        4      '       * ;'       g    VP	                  RR4      x € Kc  	  R# 5i)r;   ÚenabledTN)r   rK   rB   r   rA   )r¨   r:   Úpresets   &  r   r©   Ú5_raw_config_has_enabled_moa_preset.<locals>.<genexpr>>  sQ   é € ð 
á /‘�´3°t·z°z¸r³?×3HÑ3H×3Jô H”
˜6¤4Ó(Ô(×GÐG¨F¯J©J°yÀ$Ó,GÔGÛ /ùs   ‚A+—A+´A+ÁA+Tc              3  ó,   <"  € T F	  qS9   x € K  	  R # 5irR   r   )r¨   rt  rw   s   & €r   r©   rÕ  E  s   øé € Ð1¡[˜c�cŽz£[ùs   ƒrÓ  >   ÚfanoutÚ
aggregatorÚ
max_tokensÚreference_modelsÚreference_max_tokensÚreference_temperatureÚaggregator_temperature)	r@   rÐ  r‡   rB   r   rA   r  rÕ   rg   )rÐ  ÚrawrÑ  Úlegacy_keysrw   s       @r   rÄ  rÄ  .  s÷   ø€ ðÝ5áÓˆô ' s¬D×1Ò1ˆ#�'‰'�%Œ.°t€CÜ�cœ4× Ò Ùà�g‰g�iÓ €GÜ�'œ4× Ò ß‹sñ 
à '§¡¤ó
�sŒsð 	
Šsð 	
ˆsñ 
à '§¡¤ó
ó 
ð 	
ò
C€Kç‹3Ô1¡[Ó1�3�3Š3Ô1¡[Ó1Ó1×TÐT´d¸3¿7¹7À9ÈdÓ;SÓ6TÐTøô! ô Úðús   ƒD) Ä)D8Ä7D8c               ó    € V ^8„  d   QhRRRR/# r‘   r   )r   s   "r   r    r    H  s   € ÷ Qñ Q˜jð Q¨Tñ Qr"   c                óX  € V  F£  pRV9   d   K  VP                  R4      R8H  ;'       d    VP                  R4      '       * pV'       * VR&   V'       d   VP                  R4      '       d   Ki  \        VR,          4      w  r4W1R&   WAR&   VR	8X  d   V'       d   R
V R2MRV R2VR&   K¥  	  R# )zDAdd ``authenticated``/``auth_type``/``key_env``/``warning`` per row.rú   r£  r¥  rm   r–   rJ   r‘  r“  r  zpaste z to activatez!run `hermes model` to configure (Ú)r¤  N)rA   r”  )rO   rH   Úis_skeletonr‘  r“  s   &    r   r„   r„   H  sª   € ãˆØ˜cÔ!Ùà—g‘g˜hÓ'¨;Ñ6×PÐP¸s¿w¹wÀxÓ?PÔ;PˆØ#.œˆˆOÑß˜cŸg™gÐ&7×8Ò8ÙÜ0°°VµÓ=Ñˆ	Ø$ˆKÑØ ˆI‰Ø<EÈÔ<R×W^˜F 7 )¨<Ñ8Ø!BÀ9À+ÈQÐOð 	ˆI‹ó r"   c               ó    € V ^8„  d   QhRRRR/# )r   rO   rP   r   r   )r   s   "r   r    r    Y  s   € ÷ ñ ˜Zð ¨Jñ r"   c                ó   a€ ^ RI Hp \        V4       UUu/ uF  w  r#VP                  VbK  	  uppo\	        V3R lV  4       V3R lR7      pV  Uu. uF  qUR,          S9  g   K  VNK  	  ppWF,           # u uppi u upi )uÃ   Canonical slugs in ``CANONICAL_PROVIDERS`` order, truly-custom rows last. Keys on slug membership,
NOT ``is_user_defined`` â€” ``providers:`` config rows carry that flag even for canonical slugs.)ÚCANONICAL_PROVIDERSc              3  óF   <"  € T F  qR ,          S9   g   K  Vx € K  	  R# 5i)rJ   Nr   )r¨   rS   r{  s   & €r   r©   Ú%_reorder_canonical.<locals>.<genexpr>_  s   øé € Ð:™t˜!¨¥y°EÑ'9—A’A›tùs   ƒ!—
!c                ó$   <€ SV R ,          ,          # )rJ   r   )rS   r{  s   &€r   rr  Ú$_reorder_canonical.<locals>.<lambda>_  s   ø€ È%ÐPQÐRXÕPYÖJZr"   r|  rJ   )rd  ræ  r}  rJ   r€  )rO   ræ  r‰  r   r¬  rS   r­  r{  s   &      @r   r…   r…   Y  sq   ø€ õ 6ä#,Ð-@Ô#AÔBÑ#A™4˜1ˆQ�V‰V�QŠYÑ#AÒB€EÜÔ:™tÓ:Ô@ZÔ[€EÙÓ8™�A 6¥°%Ñ!7�aˆa™€FÐ8Ø�>Ðùó Cùâ8s   –A5ÁA;Á%A;c               ó    € V ^8„  d   QhRRRR/# )r   rH   r   rP  rg   r   )r   s   "r   r    r    d  s   € ÷ ñ  ð °ñ r"   c               ó\  €  ^ RI Hp V! W'       * R7      pTeÑ   TP                  4       T R&   TP                  '       g¬   T P                  R4      '       g•   \        ;QJ d&    R	 TP                   4       F  '       g   K   RM	  R
M! R	 TP                   4       4      '       gG   TP                   Uu. uF!  qDP                  '       g   K  \        T4      NK#  	  ppT'       d   RT/T R&   T#   \         d0    \        P                  ! \
        4      P                  RRR7        R# i ; iu upi )a  Stamp ``plan_usage`` from the portal snapshot (window plans only) and return the PickerUsage (or
None). A cache-only open reads the last snapshot at any age: the 60s account cache has usually lapsed
by the time someone opens the composer menu. Accounts without a window plan get nothing.)Únous_picker_usage)rP  Úany_agezNous plan usage unavailableTrÌ   NrË   rû   c              3  ó>   "  € T F  qP                   R 8*  x € K  	  R# 5i)g        N)Úleft_fraction)r¨   Úgs   & r   r©   Ú*_attach_nous_plan_usage.<locals>.<genexpr>t  s   é € ÐGuÑhtÐcdÏÉÐ[^ÖH^Óhtùs   ‚Fré   )Úhermes_cli.model_picker_usagerí  r‡   rÒ   r×   r+   rØ   Ú
to_payloadÚpaused_reasonrA   r  ÚgaugesÚresets_at_msÚ_plan_usage_window)rH   rP  rí  rû   rñ  ré   s   &$    r   Ú_attach_nous_plan_usagerù  d  sï   € ðÝCÙ! t´XÔ>ˆð ÒØ!×,Ñ,Ó.ˆˆLÑð
 ×"×"Ð"¨3¯7©7°7×+;Ò+;ÇCÃCÑGuÐhm×htÒhtÓGuÇCÇCÂCÑGuÐhm×htÒhtÓGu×DuÒDuØ6;·l²lÓU±l°ÇnÅnÔ,Ô)¨!Ö,±lˆGÐUßØ )¨7Ð3��G‘Ø€Løô ô Ü×Òœ(Ó#×)Ñ)Ð*GÐRVÐ)ÔWÚðüò Vs   ‚C, Â2D)Ã
D)Ã,6D&Ä%D&c               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r    r    {  s   € ÷ 
ñ 
˜Tñ 
r"   c           	     óx  € ^ RI H p ^ RIHpHp RT! T! V P                  V P
                  V P                  ;'       g    V P                  ^ 4      4      R\        V P                  R,          ^4      RVP                  V P                  R,          \        4      P                  4       RV P
                  R	8X  d   R
/# R/# )z One window-plan allowance in main's ``ProviderUsageWindow`` shape. The label is Hermes's row title
(``Today``), like the other providers' English window labels.)r¼   )ÚWindowGaugeÚgauge_titlerç   rè   r  rÐ   iè  rÎ   ÚallrÏ   r8   )r¼   Úagent.usage_gaugesrü  rý  rç   rÎ   ÚtitleÚroundÚused_fractionrÇ   r÷  r   rÈ   )rñ  r¼   rü  rý  s   &   r   rø  rø  {  s™   € õ "ß;à‘™[¨¯©°!·'±'¸1¿7¹7×;MÐ;MÀaÇgÁgÈqÓQÓRØœ˜aŸo™o°Õ5°qÓ9Ø�X×+Ñ+¨A¯N©N¸TÕ,AÄ3ÓG×QÑQÓSØ˜aŸg™g¨Ô.�ð	ð ð 5<ð	ð r"   ry   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rO   rP   r]   rg   ry   r   r’   r   )r   s   "r   r    r    ‰  s0   € ÷ f)ñ f)˜ð f)¸tð f)ÐZ^ð f)Ðkoñ f)r"   c               óB  € ^ RI HpHpHp ^ RIHpHpHp Rp	V  EFM  p
\        V
P                  RR4      4      P                  4       pV
P                  R4      ;'       g    . pV'       g   KR  V
P                  R4      '       d   Kk   V'       d   RR	/M/ pVP                  R
4      '       d(   \        V
P                  R4      ;'       g    R4      VR&   V! V3/ VB ;'       g    / pRpVR8X  d   \        W¢'       * R7      MRpVR8X  dF   V'       d>   V! 4       pVf3   R	V
R&   \        V4      V
R&   V
P                  R4      '       g   RV
R&   EK3  V'       g6   VR8X  d,   \        V4      V
R&   R	V
R&   V'       d   \        V4      M. V
R&   EKp  / pV Fú  pVP                  V4      pV'       g   K  VP                  RR4      VP                  RR4      ppVP                  RR4      pVR8w  d	   V! V4      MRpVR8w  d	   V! V4      MRpRTRTRV'       d	   V! V4      MRRVR8H  ;'       d    VR'9   /pVR8X  dO   V! VVVP                  R4      4      pVe2   Vw  pppVVR&   RV3RV33 F  w  ppVR8w  g   K  V! V4      VV&   K  	  VVV&   Kü  	  V'       d   VV
R &   VR8X  g   EK‰   V	f   V'       d   TMV! VR!7      p	\        V	4      V
R&   V	'       d   V! \        V4      VR	R"7      ^,          M. V
R&   Vf   EKÞ  ^ R$IHp  V ! \        V4      V4      V
R%&   TP%                  V U!u/ uF  p!V!VP                  V!4      bK  	  up!4      P'                  4       V
R&&   V
P)                  R R4       EKP  	  R#   \         d    / p EL™i ; i  \         d    R#T
R&   . T
R&    L¨i ; iu up!i )(ai  Set ``row["pricing"] = {model_id: {input, output, cache | None, free}}``; for Nous also
``free_tier`` (account is free-tier) and ``unavailable_models`` (paid models a free user can't pick).
``cached_only`` never hits the network: unknown Nous entitlement fails closed (``free_tier_pending``,
all models locked) and missing pricing is marked ``pricing_pending``.)Ú_format_price_per_mtokÚcompute_sale_discountÚget_pricing_for_provider)Úcheck_nous_free_tierÚget_cached_nous_free_tierÚpartition_nous_models_by_tierNrJ   r;   rm   Úfree_tier_rowry   Trš   r�   r=   rL  )rP  Úfree_tier_pendingÚunavailable_modelsr¤  uS   Checking Nous plan entitlementâ€¦ models unlock on the next picker open or refresh.Ú	free_tierÚpricing_pendingÚpromptÚ
completionÚinput_cache_readÚinputÚoutputÚcacheÚfreer°   Údiscount_percentÚ	was_inputÚ
was_outputrY   )Úforce_fresh)r  F)Úusage_levelsr  rË   )r  r;   )Úhermes_cli.models_pricingr  r  r  rd  r  r	  r
  r   rA   rL   rž   r‡   rù  r   rg   ró  r  Úwith_pricingrô  Úpop)"rO   r]   ry   r  r  r  r  r	  r
  Únous_free_tierrH   rJ   rm   Úpricing_kwargsÚraw_pricingÚcached_nous_tierrË   Ú	formattedÚmidr©  Úinp_rawÚout_rawÚ	cache_rawÚinpÚoutr%  Úsaler  Úwas_prompt_rawÚwas_out_rawrt  Úwas_rawr  rs   s"   &$$                               r   r†   r†   ‰  sÅ  € ÷
ñ ÷
ñ ð &*€NäˆÜ�3—7‘7˜6 2Ó&Ó'×-Ñ-Ó/ˆØ—‘˜Ó"×(Ð( bˆßÙØ�7‰7�?×#Ò#ñ ð	ß6A˜m¨TÑ2ÀrˆNØ�‰˜y×)Ò)Ü-0°·±¸Ó1C×1IÐ1IÀrÓ-J�˜zÑ*Ù2°4ÑJ¸>ÑJ×PÐPÈbˆKð ,0ÐØKOÐSYÌ>Ô,¨S´ÕGÐ_cˆ
Ø�6Œ>ŸkÙ8Ó:ÐØÒ'ð ,0�Ð'Ñ(Ü,0°«L�Ð(Ñ)Ø—w‘w˜y×)Ò)ð'E�C˜	‘NâßØ�vŒ~Ü#'Ð(8Ó#9��KÑ Ø)-�Ð%Ñ&ß<L¬D°¬LÐRT�Ð(Ñ)Úà%'ˆ	ÛˆCØ—‘ Ó$ˆAßÙØ Ÿu™u X¨rÓ2°A·E±E¸,ÈÓ4K�WˆGØŸ™Ð0°"Ó5ˆIØ5<À´]Ñ(¨Ô1ÈˆCØ5<À´]Ñ(¨Ô1ÈˆCà˜˜h¨Ø¿iÑ/°	Ô:ÈTØ˜˜v™×=Ð=¨#°Ñ*=ðˆEð �vŒ~Ù,¨W°g¸q¿u¹uÀZÓ?PÓQ�ØÒ#ØDHÑAÐ$ n°kØ0@�EÐ,Ñ-Ø*5°~Ð)FÈÐWbÐHcÓ(d™˜˜WØ" bž=Ù)?ÀÓ)H˜E #›Jñ )eð #ˆI�c‹Nñ/ ÷2 Ø&ˆC�	‰Nà�6�>ð
/Ø!Ò)ß:EÑ&6Ù+?ÐLaÔ+bð #ä#'¨Ó#7��KÑ ÷ &ñ 2´$°v³,ÀÐW[Ô\Ð]^Ö_Ø+-ð Ð(Ñ)ð Õ%ÝFá&2´4¸³<ÀÓ&M��NÑ#à$.×$;Ñ$;Ñ\bÓ<cÑ\bÐWX¸QÀÇÁÐPQÓ@RÒ=RÑ\bÑ<cÓ$d×$oÑ$oÓ$q��LÑ!à—‘˜	 4×(ói øô ô 	Ø‹Kð	ûôx ô /Ø#(��KÑ Ø,.�Ð(Ó)ð/üò =dsI   ÂM-ÂM-Â*M-ÃM-Ã!M-Ê#NÊ/ANÌ!N
Í-M>Í=M>ÎNÎNc               ó    € V ^8„  d   QhRRRR/# )r   rf   r   r   rU  r   )r   s   "r   r    r    ò  s   € ÷ ñ ˜Mð ¨kñ r"   c                ó  €  ^ RI Hp ^ RIHpHp V! 4       pV'       g   R# V P
                  ;'       g    RP                  4       P                  4       V9   pV'       gn    ^ RIH	p V! 4       p\        T;'       dM    V P                  ;'       g    RP                  4       P                  R4      VR,          P                  R4      8H  4      p\        VR	WT\        V4      R
RRRR7	      #   \         d    Rp L+i ; i  \         d     R# i ; i)ul  The ``llamacpp`` row from staged GGUFs (``None`` when none) â€” downloaded models must be selectable
before the server runs (selection starts it via the runtime_provider seam). The row's id comes from
the provider registry's own definition, never a local literal: a row the resolver can't resolve is
the bug this row's offline-first contract depends on not having.)Ústaged_model_ids)ÚLLAMACPP_ALIASESÚLLAMACPP_PROVIDER_IDNr;   )Ú_state_endpointrn  r=   FÚLocalrÃ  TÚlocal©rm   r«   r£  rú   r‘  r¤  )Ú"hermes_cli.local_runtime.bootstrapr0  r¬   r1  r2  r   rK   rL   Ú!hermes_cli.local_runtime.endpointr3  rg   r   Úrstripr‡   r˜  r®   )rf   r0  r1  r2  rt   Úcurrentr3  Úmanageds   &       r   r~   r~   ò  s  € ð
ÝGßOá!Ó#ˆßÙØ×'Ñ'×-Ð-¨2×4Ñ4Ó6×<Ñ<Ó>ÐBRÑRˆßð ÝMá)Ó+�Ü˜w÷  Bð  B¨C×,@Ñ,@×,FÐ,FÀB×+MÑ+MÓ+O×+VÑ+VÐWZÓ+[Ø")¨*Õ"5×"<Ñ"<¸SÓ"Añ,Bó C�ô
 Ð(¨'°7ÔX[Ð\bÓXcØ*¸$È'Ð[_ôað 	aøô ô  Ø’ð ûô
 ô ÚðúsK   ‚C: ¡C: ´)C: ÁC' Á:C' Â=C' ÃC: Ã'C7Ã4C: Ã6C7Ã7C: Ã:D	ÄD	c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rO   rP   r   r   r   r   zOptional[Thread]r   )r   s   "r   r    r      s,   € ÷ )ñ )Ø
ð)Ø+.ð)ØGJð)àñ)r"   c               óè  aaa
aa€ ^ RI Hp ^ RIHo V  Uu0 uFº  qDP	                  R4      '       g   K  \        VP	                  R4      ;'       g    R4      P                  4       \        VP	                  R4      ;'       g    R4      P                  4       P                  R4      '       d%   \        VP	                  R4      ;'       g    R4      MR3kK¼  	  pp\        \        VVV3R lV 4       4      4      pV! 4       V3o
\        ;_uu_ 4        \        P	                  S
4      pVe#   VP                  4       '       d   VuuRRR4       # V  Uu. uF-  p/ VCR	\        VP	                  R	4      ;'       g    . 4      /CNK/  	  upoR
 V
V3R llp\        \        4       P                   V3RRR7      p	V	\        S
&   V	P#                  4        V	uuRRR4       # u upi u upi   + '       g   i     R# ; i)zƒWarm picker pricing caches without delaying the current payload (one worker per
profile + endpoint scope; a live worker is reused).)Úhermes_home_key)Úpricing_cache_scoperJ   r;   rš   r�   c           	   3  óB   <"  € T F  w  rVS! WSSR 7      3x € K  	  R# 5i))r=   r   r   Nr   )r¨   rJ   r=   r   r   r?  s   &  €€€r   r©   Ú)_prewarm_pricing_async.<locals>.<genexpr>   s4   øé € ð "%ñ $‰NˆDð 
Ñ"ØÐ6FÐYiô
õ 	ó $ùs   ƒNrm   c               ó   € V ^8„  d   QhRR/# )r   r   r’   r   )r   s   "r   r    Ú,_prewarm_pricing_async.<locals>.__annotate__.  s   € ÷ 	Hñ 	H˜ñ 	Hr"   c            	     ó°  <€  \        S4       \        ;_uu_ 4        \        P                  S 4      \	        4       J d   \        P                  S R 4       R R R 4       R #   + '       g   i     R # ; i  \        ;_uu_ 4        \        P                  S 4      \	        4       J d   \        P                  S R 4       R R R 4       i   + '       g   i     i ; i; irR   )r†   Ú_pricing_prewarm_lockr   rA   r   r  )Úprewarm_keyÚworker_rowss   €€r   Ú_workerÚ'_prewarm_pricing_async.<locals>._worker.  s‡   ø€ ðHÜ˜{Ô+ç*Ö*Ü/×3Ñ3°KÓ@ÄNÓDTÓTÜ0×4Ñ4°[À$ÔG÷ +×*×*Ò*û×*Ö*Ü/×3Ñ3°KÓ@ÄNÓDTÓTÜ0×4Ñ4°[À$ÔG÷ +×*×*Ð*ýs.   ƒA2 œ8AÁA/	Á2CÂ8C	Â9	CÃCÃCzhermes-picker-pricing-prewarmT)ÚtargetÚargsr:   Údaemon)Úhermes_constantsr>  r  r?  rA   r   rL   rž   Útupler€  rE  r   Úis_aliver   r   r   ÚrunÚstart)rO   r   r   r>  rH   ÚslugsÚendpoint_scoper:  rH  ÚthreadrF  r?  rG  s   &dd       @@@r   r¶   r¶     s¯  ü€ õ
 1Ý=ñ óñ
 ˆCŸ7™7 6Ÿ?ô		
Ü�—‘˜“×%Ð% 2Ó&×,Ñ,Ó.Ü-0°·±¸³×1FÐ1FÀBÓ-G×-MÑ-MÓ-O×-ZÑ-ZÐ[d×-eÒ-eŒC�—‘˜	Ó"×(Ð( bÔ)Ðkmó	
ñ ð 
ð ô œ6ö "%ñ $ó	"%ó %ó &€Nñ
 #Ó$ nÐ5€Kç	Ö	Ü*×.Ñ.¨{Ó;ˆØÒ 7×#3Ñ#3×#5Ò#5Ø÷ 
Ò	ñ
 TXÓXÑSWÈCÐG˜#ÐG˜x¬¨c¯g©g°hÓ.?×.EÐ.EÀ2Ó)FÔGÑSWÑXˆ÷	Hñ 	Hô œ|›~×1Ñ1¸¸
Ø<ÀTôKˆà06Ô  Ñ-Ø�‰ŒØ÷' 
Ò	ùòùò& Y÷ 
×	Ð	úsS   –G³GÁ0GÂ)GÂ+GÃGÄ/G Ä?G ÅG Å%GÅ5GÆA	G ÇG Ç G1	c               ó    € V ^8„  d   QhRRRR/# )r   r   r   r   rU  r   )r   s   "r   r    r    =  s   € ÷ ñ ¨ð °[ñ r"   c                ó†  € \        4       '       g   R#  ^ RIHp ^ RIHp T! V! 4       P                  R4      ;'       g    / 4      p\        VP                  R/ 4      P                  4       4      pV'       g   R# \        RRT ;'       g    RP                  4       R8H  V\        V4      RR	RR
R7	      #   \         d     R# i ; i)u‚  The virtual ``moa`` row shared by the CLI inventory and gateway picker; ``None`` without presets.

Strictly opt-in (#63353): the row only appears when the user's raw config.yaml explicitly
enables at least one MoA preset. The synthesized ``default`` preset from
``normalize_moa_config({})`` â€” which every user gets via DEFAULT_CONFIG defaults â€” must not
be treated as a user choice.N)r6   )Únormalize_moa_configrw   rÑ  zMixture of Agentsr;   ÚvirtualTzhAggregator is the acting model billed for the run; references only advise once per user turn by default.r6  )rÄ  r@   r6   Úhermes_cli.moa_configrW  rA   r   Úkeysr˜  rL   r®   r‡   )r   r6   rW  rC   rm   s   &    r   r€   r€   =  s´   € ô .×/Ò/ÙðÝ1Ý>á"¡;£=×#4Ñ#4°UÓ#;×#AÐ#A¸rÓBˆÜ�c—g‘g˜i¨Ó,×1Ñ1Ó3Ó4ˆßÙÜØÐ&Ð)9×)?Ð)?¸R×(FÑ(FÓ(HÈEÑ(QÐZ`Ü˜V›¨YÀdÐV_Ø~ô@ð 	@øô ô Úðús"   ”*B1 ¿8B1 Á9B1 Â	'B1 Â1C Â?C )r;   );Ú__conditional_annotations__r/   Ú
__future__r   rÒ   Úcontextvarsr   Údataclassesr   r   Ú	threadingr   r   r   Útypingr	   r
   r¼   r   rE  r   r0   r   rF   rM   rT   r�   rƒ   r¸   r´   rµ   rô   ró   rþ   r  r  r=  rE  rR  rˆ   r‚  r‰   rŠ   r”  r˜  r�  r‚   r¼  r�   rÅ  rÄ  r„   r…   rù  rø  r†   r~   r¶   r€   )r[  s   @r   Ú<module>ra     sk  øðôRõ #ã Ý $ß *ß 2Ñ 2ß  Ý á›Ð ØRTÐ ÐOÓ Tñ �$Ô÷3ð 3ó ð3õ.õ06õ1ð^]Ø16ð^]ØUZð^]àð^]à8=ð^]àOTð^]ð  %ð^]ð ð	^]ð 27ð	^]ð W\ð	^]ð
 ð^]ð
 ;?ð^]ð
 glð^]ð ð^]ð 8<ð^]ð \að^]ð &*÷^]õB30ðlØ16ðØUZðà÷õ@lõBB8ðL "Ð õAõMõ`?õ<ð&Ø!ð&Ø8:ð&ØTVð&à!÷&ð4Ø13ðØMO÷õ$ð00#ÈD÷ 0#ðj Ð ð3JÈ÷ 3Jõlõ.õeõoð0ØBG÷0õfõ6_õ<õUõ4Qõ"õõ.
ðf)Àeð f)Ðaf÷ f)õRð>)Ø13ð)ØMO÷)÷Xñ r"   