+
    jHàjwâ  ã                  ó$  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIHt ^ RIH	t	H
t
 ^ RIHtHtHtHt ^ RIHtHt ^ RIHtHtHtHtHt ^ RIHt ^ R	IH t H!t! ^ R
I"H#t#H$t$ ^ RI%H&t&H't' ^ RI(H)t)H*t* ]PV                  ! R4      t,R R lt-RRRRRR/R R llt.RRR¡RR/3RRR¢RR/3RRR£RR/3R R!R¤/ 3R#R$R¥RR/3/t/R& R' lt0R( R¦ 4       w  t1t2t3t4t5R) R* lt6R+]1R,]2R-]3R.]4R/]5R0R1 /t7R2 R3 lt8R4RR5R/R6 R7 llt9R5RR8R/R9 R: llt:R; R< lt;R4R/R= R> llt<R? R@ lt=R4RRAR/RB RC llt>RD RE lt?RF RG lt@RH RI ltAR§tBRL]CRM&   RN RO ltDRP RQ ltERR RS ltFRT RU ltGRV RW ltHRX RY ltIRZ R[ ltJR%R\ 3RJR] 3R"]G3R^]I3R]A3R_R` 3Ra]J33tKRb]CRc&   R4R/Rd Re lltLR4R/Rf Rg lltMRh Ri ltNRj Rk ltORlRmRnRoRRp]N/RqRmRrRoRRp]O//tPRs Rt ltQ]! ]QR4      tR]! ]QR4      tSRuRv/Rw Rx lltTRy Rz ltUR{ R| ltV]! ]VR4      tW]! ]VR4      tXR} R~ ltYR R€ ltZR�R/R‚ Rƒ llt[]! ][R4      t\]! ][R4      t]R„ R… lt^R%R#RJRKR"R RRRRRaRRR/t_R† R‡ lt`Rˆ R‰ ltaRŠ R‹ ltbRŒ R� ltcRŽ R� ltdR� R‘ lteR’R/R“ R” lltfR• R– ltgR4RRAR/R— R˜ llthR4R/R™ Rš lltiR› Rœ ltjR� Rž ltkRAR/RŸ R  lltlR# )¨znProvider rows, active-provider detection, model pickers and provider-selection persistence for `hermes tools`.)ÚannotationsN)Úpartial)ÚCallableÚOptional)Ú
print_infoÚprint_successÚprint_warningÚprompt)ÚColorsÚcolor)Úcfg_getÚget_env_valueÚload_configÚsave_configÚsave_env_value)Ú&format_nous_portal_entitlement_message)Ú!MANAGED_FEATURE_COVERAGE_CATEGORYÚNousSubscriptionFeatures)ÚNOUS_MANAGED_PROVIDERÚfal_key_is_configured)ÚSTT_MODEL_CATALOGÚSTT_MODEL_CONFIG_KEY)Úbase_url_hostnameÚis_truthy_valuezhermes_cli.tools_configc               ó   € V ^8„  d   QhRR/# )é   ÚmoduleÚstr© )Úformats   "ÚF/home/ubuntu/.hermes/hermes-agent/hermes_cli/tools_config_providers.pyÚ__annotate__r!      s   € ÷ 	ñ 	˜Sñ 	ó    c                ór   €  \         P                  ! V 4      p^ RIHp V! 4        V#   \         d     R# i ; i)zPImport a plugin registry module after plugin discovery; ``None`` on any failure.)Ú_ensure_plugins_discoveredN)Ú	importlibÚimport_moduleÚhermes_cli.pluginsr$   Ú	Exception)r   Úregistryr$   s   &  r    Ú_plugin_registryr*      s7   € ðÜ×*Ò*¨6Ó2ˆÝAá"Ô$ØˆøÜô Úðús   ‚$' §6µ6Úrequire_nameTÚskip_builtinFÚflatten_variantsc               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r   Úregistry_moduler   Úmarker_keysztuple[str, ...]r+   Úboolr,   r-   Úreturnú
list[dict]r   )r   s   "r    r!   r!   '   s<   € ÷ +ñ +Øð+Ø'6ð+ØIMð+Ødhð+àð+à'1ñ+r"   c               ór  € \        V 4      pVf   . #  VP                  4       pV'       d   VP                  M	\        4       p. pT EF½  p	T'       dC   \        T	RR4      p
T
'       d,   T'       d&   T
P                  4       P                  4       T9   d   KN   T	P                  4       p\        T\        4      '       g   Kw  T'       g   T	P                  p
T.pT'       dJ   YËP                  R4      ;'       g    .  Uu. uF  p\        T\        4      '       g   K  TNK  	  up,          pT FØ  pRTP                  RT	P                  4      RTP                  RR4      RTP                  RR4      RTP                  R. 4      /pTP                  T Uu/ uF  pTX
bK  	  up4       T'       d$   TP                  R4      '       d   TR,          TR&   TP                  R	4      '       d   TR	,          TR	&   TP                  T4       KÚ  	  EKÀ  	  T#   \         d    . u # i ; i  \         d     EKæ  i ; iu upi u upi )
a‚  Picker-row dicts (TOOL_CATEGORIES-shaped) for a plugin registry's providers.
``marker_keys`` are all set to the registry name so downstream config/model-picker code routes
through the registry. ``skip_builtin`` drops names shadowing ``_BUILTIN_NAMES``;
``flatten_variants`` expands a schema's tier ``variants`` into separate rows sharing one backend
name, distinguished by ``web_tier``.NÚnameÚvariantsÚbadgeÚ ÚtagÚenv_varsÚweb_tierÚ
post_setup)r*   Úlist_providersÚ_BUILTIN_NAMESÚ	frozensetr(   ÚgetattrÚlowerÚstripÚget_setup_schemaÚ
isinstanceÚdictr5   ÚgetÚdisplay_nameÚupdateÚappend)r/   r0   r+   r,   r-   r)   Ú	providersÚbuiltinÚrowsÚproviderr5   ÚschemaÚentriesÚvÚentryÚrowÚkeys   &&$$$            r    Ú_plugin_provider_rowsrT   '   sí  € ô   Ó0€HØÒØˆ	ðØ×+Ñ+Ó-ˆ	ß-9�(×)Ò)¼y»{ˆð €DÜˆßÜ˜8 V¨TÓ2ˆDßŸL¨T¯Z©Z«\×-?Ñ-?Ó-AÀWÔ-LÙð	Ø×.Ñ.Ó0ˆFô ˜&¤$×'Ò'ÙßØ—=‘=ˆDØ�(ˆßØ§J¡J¨zÓ$:×$@Ð$@¸bÐ$@ÓYÑ$@˜aÄZÐPQÔSW×EXŸ˜Ñ$@ÑYÕYˆGÛˆEØ˜5Ÿ9™9 V¨X×-BÑ-BÓCÀWÈeÏiÉiÐX_ÐacÓNdØ˜%Ÿ)™) E¨2Ó.°
¸E¿I¹IÀjÐRTÓ<UðWˆCà�J‰J©[Ó9©[ c˜˜Tš	©[Ñ9Ô:ß E§I¡I¨j×$9Ò$9Ø"'¨
Õ"3��J‘Ø�y‰y˜×&Ò&Ø$)¨,Õ$7��LÑ!Ø�K‰K˜Öô ñ! ð2 €Køô; ô ØŠ	ðûô ô 	Ûð	üò Zùò :s:   “H	 «H	 ÂHÃ8H/ÄH/ÆH4È	HÈHÈH,È+H,Ú	image_genúagent.image_gen_registryÚimage_gen_plugin_nameÚ	video_genúagent.video_gen_registryÚvideo_gen_plugin_nameÚwebzagent.web_search_registryÚweb_backendÚbrowserzagent.browser_registryÚbrowser_providerÚttszagent.tts_registryÚtts_providerc               ó    € V ^8„  d   QhRRRR/# )r   Úcategoryr   r2   r3   r   )r   s   "r    r!   r!   `   s   € ÷ <ñ <˜sð < zñ <r"   c                ó:   € \         V ,          w  rp\        W3/ VB # )z_Picker rows for the plugin-registered providers of one ``_PLUGIN_PROVIDER_ROW_SPECS`` category.)Ú_PLUGIN_PROVIDER_ROW_SPECSrT   )rb   r   ÚmarkersÚkwargss   &   r    Ú_plugin_rows_forrg   `   s!   € ä8¸ÕBÑ€F�VÜ  Ñ;°FÑ;Ð;r"   c              #  óB   "  € T F  p\        \        V4      x € K  	  R # 5i©N)r   rg   )Ú.0Úcats   & r    Ú	<genexpr>rl   g   s    é € ð 8gÙ2e¨3ŒÔ  #×&Ð&Ó2eùó   ‚c               ó    € V ^8„  d   QhRRRR/# )r   Úbackendr   r2   Úlistr   )r   s   "r    r!   r!   k   s   € ÷ !ñ ! sð !¨tñ !r"   c                óê   €  ^ RI Hp V! V 4      pVeC   RVP                  4       3RVP                  4       33 UUu. uF  w  r4V'       g   K  VNK  	  upp#  RR.# u uppi   \         d     RR.# i ; i)a"  Capabilities (``search`` / ``extract``) a web backend supports, per the registry provider instance.
Lets the Capabilities GUI offer ``web.search_backend`` / ``web.extract_backend`` only where it makes
sense (ddgs and brave-free are search-only). Unknown backend or registry failure -> both.©Úget_providerÚsearchÚextract)Úagent.web_search_registryrs   Úsupports_searchÚsupports_extractr(   )ro   rs   rM   ÚcapÚ	supporteds   &    r    Úweb_provider_capabilitiesr{   k   s¤   € ðÝ:á Ó(ˆØÒØ08¸(×:RÑ:RÓ:TÐ/UØ09¸8×;TÑ;TÓ;VÐ/Wñ/Yô gñ /Y™N˜CÜ\e÷ �Cñ /Yò gð gð  ð
 �iÐ Ð ùó	gøäô ØØ�iÐ Ð ðús(   ‚9A! »AÁAÁA! ÁA! Á!A2Á1A2zImage GenerationzVideo GenerationzWeb Search & ExtractzBrowser AutomationzText-to-Speechz"Computer Use (macOS/Windows/Linux)c                 ó   € \        4       # ri   )Ú_computer_use_provider_rowsr   r"   r    Ú<lambda>r~   ‚   s   € Ô2MÔ2Or"   c               ó   € V ^8„  d   QhRR/# )r   r2   r3   r   )r   s   "r    r!   r!   …   s   € ÷ \ñ \ Zñ \r"   c                 óx   € ^ RI Hp Hp V! 4        UUu. uF  w  r#W 8w  g   K  RVRRRVR. RV/NK  	  upp# u uppi )zÈRows for installed computer-use providers other than the built-in ``cua`` (hand-written row with its
install post-setup). Read from plugin.yaml without importing: an unselected provider stays dormant.)ÚDEFAULT_BACKENDÚdiscover_computer_use_providersr5   r7   r8   r9   r:   Úcomputer_use_backend)Úplugins.computer_user�   r‚   )r�   r‚   r5   Údescs       r    r}   r}   …   sW   € ÷ Vñ >Ô?ô\Ù?‘
�À4ÑCZô cˆV�T˜7 B¨¨t°ZÀÐE[Ð]aÓbÙ?ò\ð \ùó \s   “
6¢6Úforce_freshÚfeaturesc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   rk   rE   Úconfigr†   r1   r‡   z"Optional[NousSubscriptionFeatures]r2   r3   r   )r   s   "r    r!   r!   Ž   s4   € ÷ ñ Ø	ðØðØ-1ðØEgðàñr"   c               ó’  € ^ RI Hp Vf
   V! WR7      pVP                  p\        T;'       d7    VP                  ;'       d#    VP
                  RJ;'       d    VP                  4      p. pV P                  R. 4       Fˆ  pVP                  R4      p	VP                  R4      '       d   V	'       g   VP                  '       g   KG  V'       d)   V	R8X  d"   V'       d   VP                  R4      '       g   Kw  VP                  V4       KŠ  	  \        P                  V P                  R	4      4      p
V
e   VP                  V
! 4       4       V# )
z³Provider entries visible for the current auth/config state.
Nous-managed rows (``managed_nous_feature``) are always shown, even logged-out/unentitled, to
advertise the capability.©Úget_nous_subscription_features©r†   TrJ   Úmanaged_nous_featureÚrequires_nous_authrX   z	fal-videor5   )Úhermes_cli.tools_configrŒ   Úaccount_infor1   Ú	logged_inÚpaid_service_accessÚtool_gateway_entitledrF   Únous_auth_presentÚtool_gateway_entitled_forrI   Ú_PLUGIN_ROW_BUILDERSÚextend)rk   r‰   r†   r‡   rŒ   ÚacctÚ	pool_onlyÚvisiblerM   ÚmanagedÚbuilders   &&$$       r    Ú_visible_providersrž   Ž   s  € õ GàÒÙ1°&ÔRˆØ× Ñ €Dô �T×tÐt˜dŸn™n×tÐt°×1IÑ1IÐQUÐ1U×tÐtÐZ^×ZtÑZtÓu€IØ€GØ—G‘G˜K¨Ö,ˆØ—,‘,Ð5Ó6ˆð �<‰<Ð,×-Ò-·gÀh×F`×F`ÐF`Ùß˜ KÔ/¿À$×B`ÑB`Ðal×BmÒBmÙØ�‰�xÖ ñ -ô #×&Ñ& s§w¡w¨v£Ó7€GØÒØ�‰‘w“yÔ!Ø€Nr"   Ú	is_activec               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rM   rE   r‰   rŸ   zOptional[bool]r2   r   r   )r   s   "r    r!   r!   ®   s*   € ÷ *-ñ *-¨ð *-°dð *-ÐYgð *-Ðsvñ *-r"   c               óR  € ^ RI HpHpHp ^ RIHp V P                  R. 4      '       d   V! V 4      '       d   R# R# V P                  R4      pV P                  R4      '       g	   V'       d¡   Vf	   V! V4      pVP                  '       g   R# V'       dy   VP                  p	\        P                  ! V4      p
\        T	;'       d:    V	P                  ;'       d&    V
'       d   V	P                  V
4      MV	P                  4      pV'       g   R# V P                  R	4      pV'       di   VP                  V4      pVe   V! 4       '       d   R# R# VP                  V4      pVe    V! 4       '       d   R# R
# Vf   \        W4      pV'       d   R# R
# \!        V 4      #   \         d     R# i ; i)zîHonest readiness state for a provider picker row.
``features`` avoids re-fetching portal state per row. ``is_active`` is the completed-setup fallback
for post_setup hooks with no registered installed-check (selecting a row runs its hook).)Ú_POST_SETUP_READYÚ_provider_env_readyrŒ   )Ú_POST_SETUP_AUTH_READYr:   ÚreadyÚ
needs_keysrŽ   r�   Ú
needs_authr<   Úneeds_setup)r�   r¢   r£   rŒ   Ú"hermes_cli.tools_config_post_setupr¤   rF   r•   r‘   r   r1   r’   r–   r”   r(   Ú_is_provider_activeÚ_web_registry_readiness)rM   r‰   r‡   rŸ   r¢   r£   rŒ   r¤   Úmanaged_featurer™   rb   Úentitledr<   Úauth_predicateÚ	predicates   &&$$           r    Úprovider_readiness_statusr°   ®   s�  € ÷ oÑnÝIà‡|�|�J ×#Ò#Ù-¨h×7Ò7ˆwÐI¸\ÐIà—l‘lÐ#9Ó:€OØ‡|�|Ð(×)Ò)¯_ØÒÙ5°fÓ=ˆHØ×)×)Ð)Ùßà×(Ñ(ˆDÜ8×<Ò<¸_ÓMˆHÜ˜D÷ fð f T§^¡^÷ fð fß<D�×.Ñ.¨xÔ8È$×JdÑJdógˆHçÙ#ð —‘˜lÓ+€JßØ/×3Ñ3°JÓ?ˆØÒ%Ù,×.Ò.�7Ð@°LÐ@Ø%×)Ñ)¨*Ó5ˆ	ØÒ ðÙ"+§+¢+�wÐ@°=Ð@ð ÒÜ+¨HÓ=ˆIß#ˆwÐ6¨Ð6ä" 8Ó,Ð,øô ô Úðús   Å F Å-F Å/F ÆF&Æ%F&c               ó    € V ^8„  d   QhRRRR/# )r   rM   rE   r2   r   r   )r   s   "r    r!   r!   Û   s   € ÷ 
Xñ 
X dð 
X¨sñ 
Xr"   c                ó¾   € V P                  R4      pV'       d   V P                  R4      '       d   R# ^ RIHp V! V4      pVe   VP                  4       '       d   R# R# )a'  Keyless, untiered web rows are ready only when their registry provider is available: the only such
row's ``is_available()`` is an account login (OpenAI Native = openai-codex), hence ``needs_auth``.
Free-tier rows are exempt: they run on the public keyless ring, which ``is_available()`` ignores.r\   r;   r¥   rr   r§   )rF   rv   rs   Úis_available)rM   ro   rs   Ú
registereds   &   r    r«   r«   Û   sQ   € ð �l‰l˜=Ó)€Gß�h—l‘l :×.Ò.ÙÝ6á˜gÓ&€JØ Ò(¨J×,CÑ,C×,EÒ,Eˆ7ÐWÈ<ÐWr"   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úts_keyr   r‰   rE   r†   r1   r2   r   )r   s   "r    r!   r!   è   s0   € ÷ Jñ J°ð J¸Tð JÐSWð JÐdhñ Jr"   c               ój  € ^ RI HpHpHp VP	                  V 4      pV'       g   V! WVR7      '       * # \        WaVR7       F/  pVP	                  R4      pV'       g   K  V! V4      '       d   K.   R# 	  RRRRR	R
/P	                  V 4      p	V	'       dP   VP	                  V / 4      p
\        V
\        4      '       g   R# Wš9   d   R# V R	8H  ;'       d    \        V4      '       * # V R8X  d(   \        4       '       * ;'       d    \        R4      '       * # V R8X  d   \        R4      '       * # V! WVR7      '       * # )zBReturn True when enabling this toolset should open provider setup.)ÚTOOL_CATEGORIESÚ_post_setup_already_installedÚ_toolset_has_keysr�   r<   Tr_   rM   r[   ro   r]   Úcloud_providerFrU   rV   rX   rY   )r�   r¸   r¹   rº   rF   rž   rD   rE   Ú_browser_backendr   Ú_any_plugin_provider_available)r¶   r‰   r†   r¸   r¹   rº   rk   rM   r<   Úselection_keyÚsections   &&$        r    Ú#_toolset_needs_configuration_promptrÀ   è   s  € çiÑià
×
Ñ
˜fÓ
%€CßÙ$ VÀÔMÔMÐMô ' sÀ×LˆØ—\‘\ ,Ó/ˆ
ß‰:Ñ;¸J×GÔGÚñ Mð ˜J¨¨y¸)ÐEUÐV×ZÑZÐ[aÓb€MßØ—*‘*˜V RÓ(ˆÜ˜'¤4×(Ò(ÙØÔ#Ùð ˜iÑ'×DÐDÔ,<¸VÓ,DÔEÐEØ�ÔÜ(Ó*Ô*×mÐmÔ3QÐRlÓ3mÔ/mÐmØ�ÔÜ1Ð2LÓMÔMÐMá  ¸[ÔIÔIÐIr"   c               ó    € V ^8„  d   QhRRRR/# )r   r/   r   r2   r1   r   )r   s   "r    r!   r!   
  s   € ÷ ñ °Cð ¸Dñ r"   c                óÈ   € \        V 4      p VP                  4        F  p VP                  4       '       d    R# K  	  R#   \         d     K1  i ; i  \         d     R# i ; i)zITrue when any provider in the plugin registry reports ``is_available()``.TF)r*   r=   r³   r(   )r/   r)   rM   s   &  r    r½   r½   
  sm   € ä Ó0€HðØ ×/Ñ/Ö1ˆHðØ×(Ñ(×*Ò*Úñ +ñ 2ñ øô	 ô Úðûäô ØÙðús8   �A ¡A ·A ºA Á AÁA ÁAÁA ÁA!Á A!Úreconfigurec          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   r¶   r   rk   rE   r‰   r†   r1   rÃ   r   )r   s   "r    r!   r!     s8   € ÷ 8kñ 8k Sð 8k¨tð 8k¸Tð 8kÐSWð 8kÐmqñ 8kr"   c               óÞ  € ^ RI HpHpHp VR,          p\	        WVR7      p	\        V	4      ^8H  p
V'       d   RMVP                  RR4      p\        4        V
'       d   RV	^ ,          R,           R2MRV 2p\        \        R	VP                  R
R4       RV RV R2\        P                  4      4       V
'       dC   V'       g;   V	^ ,          P                  R4      '       d   \        RV	^ ,          R,           24       V'       g-   VP                  R4      '       d   \        RVR,           24       V
'       d   \        V	^ ,          W#VR7       R# \        4        RpV'       g    \        V! W#R7      P                  4      p. pV	 FÝ  pVP                  R4      '       d   RVR,           R2MRpVP                  R4      '       d   RVR,           2MRpRpV! V4      '       d1   \!        WòVR7      '       d   RpMVP                  R. 4      '       d   RpRpV'       g$   VP                  R4      '       d   V'       d   RMRpVP#                  VR,           V V V V 24       Kß  	  V'       g   VP#                  R4       \%        W’VR7      pV'       d   RMRV R 2pV! VVV4      pV\        V	4      8¼  d   \        R!V 24       R# \        V	V,          W#VR7       R#   \         d     ELji ; i)"a  Provider selection for a tool category, then API-key setup for the chosen row.
``reconfigure`` ("Reconfigure an existing tool"): no setup note / skip row / Nous marker, and the
chosen provider goes through the key-update prompts instead of the new-enable prompts.)Ú_prompt_choicer£   rŒ   r5   r�   zChoose a providerÚsetup_titleÚ(Ú)z- z  --- Úiconr8   Ú z ---r9   ú  Ú
setup_note©r†   rÃ   NFr7   z [Ú]u    â€” z	 [active]r:   z [configured]rŽ   u*     â˜… Included with your Nous subscriptionu'     â˜… via Nous Portal (login on select)u(   Skip â€” keep defaults / configure laterz  Select provider:Ú:z
  Skipped )r�   rÆ   r£   rŒ   rž   ÚlenrF   Úprintr   r
   ÚCYANÚ_print_infoÚ_configure_providerr1   r•   r(   rª   rI   Ú_detect_active_provider_index)r¶   rk   r‰   r†   rÃ   rÆ   r£   rŒ   r5   rJ   ÚsingleÚtitleÚheadingÚ_nous_logged_inÚprovider_choicesÚpr7   r9   Ú
configuredÚ
sub_markerÚdefault_idxÚquestionÚprovider_idxs   &&&$$                  r    Ú_configure_tool_categoryrâ     s’  € ÷ lÑkàˆv�;€DÜ" 3¸KÔH€IÜ�‹^˜qÑ €Fß#.Ñ°C·G±G¸MÐK^Ó4_€Eä	„Gß-3��)˜A•,˜vÕ&Ð' qÑ)¸2¸e¸W¸€GÜ	Œ%�&˜Ÿ™ ¨Ó,Ð-¨Q¨t¨f°A°g°Y¸dÐCÄVÇ[Á[Ó
QÔRß—k i°¥l×&6Ñ&6°u×&=Ò&=Ü�b˜ 1� eÕ,Ð-Ð.Ô/ß˜3Ÿ7™7 <×0Ò0Ü�b˜˜\Õ*Ð+Ð,Ô-ßÜ˜I a�L¨&ÐWbÕcÙÜ	„Gð €Oßð	Ü"Ñ#AÀ&Ô#b×#tÑ#tÓuˆOð ÐÛˆØ&'§e¡e¨G§n¢n�"�Q�w•Z�L Ñ"¸"ˆØ$%§E¡E¨%§L¢L��a˜•h�ZÑ °bˆØˆ
Ù˜q×!Ò!Ü" 1¸+×FÓFØ(‘
Ø—‘�z 2×&Ò&Ø,�
àˆ
ß˜qŸu™uÐ%;×<Ò<ßIXÑEð  _HˆJØ×Ñ 1 V¥9 +¨e¨W°S°E¸*¸ÀjÀ\Ð RÖSñ ÷ Ø×ÑÐ JÔKä/°	È{Ô[€Kß'2Ñ#¸"¸U¸GÀ1¸€HÙ! (Ð,<¸kÓJ€LØ”s˜9“~Ô%Ü�j  Ð'Ô(ÙÜ˜	 ,Õ/°Ð^i×jøô9 ô 	Úð	ús   Å%K ËK,Ë+K,c               ó$   € V ^8„  d   QhRRRRRR/# ©r   rM   rE   r‰   r2   r1   r   )r   s   "r    r!   r!   T  s!   € ÷ 7ñ 7 ð 7¨dð 7°tñ 7r"   c                ó€  € V P                  R4      pV'       g   R# \        VP                  R4      \        4      '       d   VP                  R4      M/ p\        VP                  R4      \        4      '       d   VP                  R4      M/ p\        VP                  V R,          R4      ;'       g    R4      P	                  4       P                  4       pVR9   d   WR8H  #  ^ R	IHp R
RRR/P                  V R,          4      pV'       d   \        V! V4      4      MRpY('       d   R8H  # R8H  #   \         d    Rp Li ; i)u—  True when a web picker row's tier matches the configured tier (``web.provider_tier.<backend>``).
Tiered rows (Exa/Parallel Free vs Paid) share one ``web_backend`` and differ only in ``web_tier``.
No ``web_tier`` on the row â†’ matches; configured tier set â†’ must equal the row's tier; unset â†’
"auto": paid when the row's key is present, free otherwise (highlight the row the runtime would
actually use).r;   Tr[   Úprovider_tierr\   r8   ÚfreeÚpaid)Úget_provider_envÚexaÚEXA_API_KEYÚparallelÚPARALLEL_API_KEYF)rç   rè   )
rF   rD   rE   r   rA   rB   Úagent.web_search_providerré   r1   r(   )	rM   r‰   Úrow_tierÚweb_cfgÚtiersrÝ   ré   Úkey_varÚhas_keys	   &&       r    Ú_web_tier_matchesrô   T  s  € ð �|‰|˜JÓ'€HßÙÜ#-¨f¯j©j¸Ó.?Ä×#FÒ#Fˆf�j‰j˜ÔÈB€GÜ,6°w·{±{À?Ó7SÔUY×,ZÒ,ZˆG�K‰K˜Ô(Ð`b€EÜ�U—Y‘Y˜x¨Õ6¸Ó;×AÐA¸rÓB×HÑHÓJ×PÑPÓR€JØÐ%Ô%ØÑ%Ð%ðÝ>à˜-¨Ð5GÐH×LÑLÈXÐVcÕMdÓeˆß5<”$Ñ'¨Ó0Ô1À%ˆð ¦'˜Ñ6Ð6¨vÑ6Ð6øô ô ØŠðús   Ã )D- Ä
D- Ä-D=Ä<D=c               ó    € V ^8„  d   QhRRRR/# )r   r‰   rE   r2   Úsetr   )r   s   "r    r!   r!   m  s   € ÷ ñ  $ð ¨3ñ r"   c                ó<  a€ V P                  R4      p\        V\        4      '       d   TM/ oR V3R llp\        SP                  R4      RR7      '       d   \        MV! R4      pR	 Uu0 uF  qB! V4      ;'       g    TkK  	  ppVP                  R4       V# u upi )
a3  Backend names serving web search / extract as configured: each capability's own
``web.<cap>_backend`` override first, else the shared ``web.backend`` (``tools/web_tools.py``
dispatch order; legacy ``use_gateway: true`` reads as the managed ``nous`` selection).
Lower-cased and stripped like the dispatchers.r[   c               ó    € V ^8„  d   QhRRRR/# )r   rS   r   r2   r   )r   s   "r    r!   Ú+_web_serving_backends.<locals>.__annotate__u  s   € ÷ Gñ G�3ð G˜3ñ Gr"   c                ó’   <€ SP                  V 4      p\        V\        4      '       d   VP                  4       P	                  4       # R # )r8   )rF   rD   r   rA   rB   )rS   Úvaluerð   s   & €r    Ú_nameÚ$_web_serving_backends.<locals>._nameu  s7   ø€ Ø—‘˜CÓ ˆÜ(2°5¼#×(>Ò(>ˆu�{‰{‹}×"Ñ"Ó$ÐFÀBÐFr"   Úuse_gatewayF©Údefaultro   r8   )Úsearch_backendÚextract_backend)rF   rD   rE   r   r   Údiscard)r‰   Úraw_web_cfgrü   ÚsharedrS   Úservingrð   s   &     @r    Ú_web_serving_backendsr  m  s•   ø€ ð
 —*‘*˜UÓ#€KÜ'¨´T×:Ò:‰kÀ€G÷Gð Gô '6°g·k±kÀ-Ó6PÐZ_×&`Ó&`Õ"ÑfkÐluÓfv€FÙ/TÓUÑ/T¨ˆu�S‹z×#Ð#˜VÒ#Ñ/T€GÐUØ‡O�O�BÔØ€Nùò Vs   Á*BÁ=Bc               ó$   € V ^8„  d   QhRRRRRR/# rä   r   )r   s   "r    r!   r!     s!   € ÷ 8ñ 8 $ð 8°ð 8¸ñ 8r"   c                óÚ  aa€ V P                  R4      oS'       d"   S\        V4      9   d   \        W4      '       g   R# ^ RIHpHo V P                  R4      '       d   S! V 4      '       d   R# \        V P                  R4      4      ;'       d^    \        ;QJ d.    VV3R lVR,          R	,           4       F  '       g   K   RM#	  RM! VV3R lVR,          R	,           4       4      '       * # )
uO  True when a web row's ``web_backend`` serves either capability as configured: a vendor serving
one capability through its override is in use even when the shared key names a different one,
and a shared vendor shadowed by both overrides serves nothing. Managed Nous rows never reach
here â€” they answer in ``_managed_provider_active``.r\   F)r¸   r£   r:   TÚweb_search_plugin_namec              3  óž   <"  € T FB  pVP                  R 4      S8H  ;'       d"    VP                  R4      ;'       d	    S! V4      x € KD  	  R# 5i)r\   r:   N©rF   )rj   rR   r£   ro   s   & €€r    rl   Ú&_web_backend_active.<locals>.<genexpr>Ž  sJ   øé € ð D8á6ˆCð 	�‰�Ó 'Ñ)×^Ð^¨c¯g©g°jÓ.A×^Ð^ÑFYÐZ]ÓF^Ô^Û6ùs   ƒA£A¼Ar[   rJ   )rF   r  rô   r�   r¸   r£   r1   Úany)rM   r‰   r¸   r£   ro   s   && @@r    Ú_web_backend_activer    s½   ù€ ð
 �l‰l˜=Ó)€Gß˜Ô#8¸Ó#@Ô@ÔEVÐW_×EhÒEhÙ÷
 MØ�<‰<˜
×#Ò#Ñ':¸8×'DÒ'DÙÜ�—‘Ð5Ó6Ó7÷ 8ð 8ÇÃõ D8à" 5Õ)¨+Ö6óD8ÇÇÂõ D8à" 5Õ)¨+Ö6óD8ó A8ô =8ð 8r"   Ústt_providerÚsttz tuple[tuple[str, str, str], ...]Ú_MANAGED_SELECTION_KEYSc               ó$   € V ^8„  d   QhRRRRRR/# )r   rM   rE   Úmarkerr   r2   r1   r   )r   s   "r    r!   r!   ™  s&   € ÷ ^ñ ^˜$ð ^¨ð ^°ñ ^r"   c                óL   € VR8X  d   W9   # \        V P                  V4      4      # )z‚``browser_provider`` is a membership test (a local row carries ``browser_provider: ""``); every other
marker is a truthiness test.r^   )r1   rF   )rM   r  s   &&r    Ú_has_markerr  ™  s)   € ð "(Ð+=Ô!=ˆ6ÑÐ]Ä4ÈÏÉÐU[ÓH\ÓC]Ð]r"   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   rM   rE   r‰   r¬   r   r†   r1   r2   r   )r   s   "r    r!   r!   Ÿ  s1   € ÷ #ñ # tð #°Tð #ÈCð #Ð^bð #Ðgkñ #r"   c                óÌ  € ^ RI Hp V! WR7      P                  P                  V4      pVf   R# VR9   d™   VP                  V/ 4      p\	        V\
        4      '       de   VP                  R4      pVRRR\        09  d   R# V\        8w  d8   VP                  R4      e%   \        VP                  R4      RR	7      '       g   R# VP                  # \        V R
4      '       d'   VP                  ;'       d    \        \        V4      9   # \         FJ  w  r‰p
\        W4      '       g   K  \        WV
4      pVP                  ;'       d    W°V,          \        09   u # 	  VP                  # )z‹Active check for a Nous-managed row: the feature must be managed AND the category's selected
provider must be the row's vendor or ``nous``.r‹   r�   NFrM   r8   Úfalrþ   rÿ   r\   ©rU   rX   )r�   rŒ   r‡   rF   rD   rE   r   r   Úmanaged_by_nousr  r  r  r   )rM   r‰   r¬   r†   rŒ   ÚfeatureÚgen_cfgÚconfigured_providerr  r¿   rS   Úcurrents   &&&&        r    Ú_managed_provider_activer   Ÿ  s;  € õ Gá,¨VÔM×VÑV×ZÑZÐ[jÓk€GØ‚ÙØÐ4Ô4Ø—*‘*˜_¨bÓ1ˆÜ�gœt×$Ò$Ø")§+¡+¨jÓ"9ÐØ"¨4°°UÔ<QÐ*RÔRÙà#Ô'<Ô<Ø—K‘K Ó.Ò:Ü'¨¯©°MÓ(BÈE×RÓRÙØ×&Ñ&Ð&ô �8˜]×+Ò+ð ×&Ñ&×aÐaÔ+@ÔDYÐZ`ÓDaÑ+aÐaß 7Ñˆ˜Ü�x×(Ô(Ü˜f¨sÓ3ˆGØ×*Ñ*×cÐc¨wÀFÕ;KÔMbÐ:cÑ/cÒcñ !8ð ×"Ñ"Ð"r"   c               ó    € V ^8„  d   QhRRRR/# )r   r‰   rE   r2   r1   r   )r   s   "r    r!   r!   À  s   € ÷ ñ ¨ð °ñ r"   c                ó   € \        V \        4      '       d   V P                  R4      MRp ^ RIHpHp T! T;'       g    / 4      '       d   R#  ^ RIHp V! 4       '       d   R#  V! 4       RJ#   \         d     Li ; i  \         d     R# i ; i)zº``browser.backend`` unset: Browser Use mode is the default, so the row is active whenever the
effective mode resolves on (legacy direct-API cloud config, or CLI runnable and no Camofox).r]   N)Ú	_find_cliÚ"is_legacy_browser_use_cloud_configT)Úis_camofox_modeF)	rD   rE   rF   Útools.browser_use_clir#  r$  Útools.browser_camofoxr%  r(   )r‰   Úbrowser_cfgr#  r$  r%  s   &    r    Ú_browser_use_default_activer)  À  s�   € ô ,6°f¼d×+CÒ+C�&—*‘*˜YÔ'È€KðßWá-¨k×.?Ð.?¸R×@Ò@Ùð	Ý=á× Ò Ùð !ñ ‹{ $Ð&Ð&øô ô 	Ùð	ûô ô Úðús:   «A> ¾A> ÁA- Á#	A> Á-A;Á8A> Á:A;Á;A> Á>BÂBc               ó$   € V ^8„  d   QhRRRRRR/# rä   r   )r   s   "r    r!   r!   Õ  s!   € ÷ 	ñ 	 tð 	°Tð 	¸dñ 	r"   c                óø   € V R ,          \        VRR4      8w  d   R# V P                  R4      '       dH   \        \        VRR4      ;'       g    R4      P                  4       P	                  4       pW R,          8H  # R# )r^   r]   r»   FÚbrowser_engineÚengineÚautoT)r   rF   r   rB   rA   )rM   r‰   r-  s   && r    Ú_browser_provider_activer/  Õ  sn   € àÐ"Õ#¤w¨v°yÐBRÓ'SÔSÙð ‡|�|Ð$×%Ò%Ü”W˜V Y°Ó9×CÐC¸VÓD×JÑJÓL×RÑRÓTˆØÐ"2Õ3Ñ3Ð3Ùr"   c               ó    € V ^8„  d   QhRRRR/# )r   r‰   rE   r2   r   r   )r   s   "r    r!   r!   á  s   € ÷ :ñ :˜Tð : cñ :r"   c                óD   € \        V RR4      pVRJ d   R# T;'       g    R# )zk``browser.backend`` as a string; ``""`` when unset or empty (YAML 1.1 parses an unquoted ``off`` as False).r]   ro   FÚoffr8   ©r   )r‰   ro   s   & r    r¼   r¼   á  s(   € ä�f˜i¨Ó3€GØ˜uÓ$ˆ5Ð9¨7¯=¨=°bÐ9r"   c               ó$   € V ^8„  d   QhRRRRRR/# rä   r   )r   s   "r    r!   r!   ç  s!   € ÷ /ñ / dð /°Dð /¸Tñ /r"   c                ó€   € \        V4      pW R ,          8X  d   R# V'       d   R# V R ,          R8w  d   R# \        V4      # )Úbrowser_backendTFzbrowser-use)r¼   r)  )rM   r‰   ro   s   && r    Ú_browser_backend_activer7  ç  s=   € Ü˜vÓ&€GØÐ,Õ-Ô-ÙßÙØÐ!Õ" mÔ3ÙÜ& vÓ.Ð.r"   c               ó$   € V ^8„  d   QhRRRRRR/# rä   r   )r   s   "r    r!   r!   ò  s&   € ÷ Nñ N tð N°Tð N¸dñ Nr"   c                óø   € VP                  R / 4      p\        V\        4      ;'       dR    V R,          R8H  ;'       d>    VP                  R4      R9   ;'       d"    \        VP                  R4      RR7      '       * # )rU   Úimagegen_backendr  rM   rþ   Frÿ   >   Nr8   r  )rF   rD   rE   r   )rM   r‰   Ú	image_cfgs   && r    Ú_imagegen_backend_activer<  ò  s~   € Ø—
‘
˜;¨Ó+€Iä�9œdÓ#÷ 	Mð 	MØÐ'Õ(¨EÑ1÷	Mð 	Mà�M‰M˜*Ó%Ð):Ñ:÷	Mð 	Mô   	§¡¨mÓ <ÀeÔLÔLð	Nr"   c                ó0   € \        VR R4      V R,          8H  # )r_   rM   r`   r3  ©rÜ   Úcs   &&r    r~   r~   þ  s   € ¤'¨!¨U°JÓ"?À1À^ÕCTÒ"Tr"   c                óD   € \        VR R4      ;'       g    RV R,          8H  # )r  rM   Úlocalr  r3  r>  s   &&r    r~   r~   ÿ  s!   € ¤7¨1¨e°ZÓ#@×#KÐ#KÀGÐPQÐR`ÕPaÒ"ar"   r6  rƒ   c                ó0   € \        VR R4      V R,          8H  # )Úcomputer_usero   rƒ   r3  r>  s   &&r    r~   r~     s   € ¬'°!°^ÀYÓ*OÐSTÐUkÕSlÒ*lr"   r:  z4tuple[tuple[str, Callable[[dict, dict], bool]], ...]Ú_ACTIVE_CHECKSc               ó(   € V ^8„  d   QhRRRRRRRR/# ©r   rM   rE   r‰   r†   r1   r2   r   )r   s   "r    r!   r!     s)   € ÷ ñ  $ð °ð Àdð ÐW[ñ r"   c               óä  € V P                  R4      pR Fš  pV P                  V R24      pV'       g   K!  V'       d   K+  VP                  V/ 4      p\        V\        4      '       d   VP                  R4      V8X  g    R# VR8H  ;'       g"    \        VP                  R4      RR7      '       * u # 	  V'       d   \	        WW24      # \
         F   w  rx\        W4      '       g   K  V! W4      u # 	  R# )	z>Check if a provider entry matches the currently active config.rŽ   rX   Ú_plugin_namerM   Frþ   rÿ   r  )rF   rD   rE   r   r   rD  r  )	rM   r‰   r†   r¬   r¿   Úplugin_namer  r  Úchecks	   &&$      r    rª   rª     sË   € à—l‘lÐ#9Ó:€Oó .ˆØ—l‘l g Y¨lÐ#;Ó<ˆß‰;Ÿ™Ø—j‘j ¨"Ó-ˆGÜ˜w¬×-Ò-°'·+±+¸jÓ2IÈ[Ô2XÚà˜kÑ)×kÐk´ÀÇÁÈ]ÓA[ÐejÔ1kÔ-kÒkñ .÷ Ü'¨¸/ÓWÐWç'‰ˆÜ�x×(Ô(Ù˜Ó*Ò*ñ (ñ r"   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   rJ   rp   r‰   rE   r†   r1   r2   Úintr   )r   s   "r    r!   r!     s*   € ÷ 	ñ 	¨Tð 	¸4ð 	ÐQUð 	Ðbeñ 	r"   c               óÀ   € ^ RI Hp \        V 4       FH  w  rE\        WQVR7      '       d   Vu # VP	                  R. 4      '       g   K6  V! V4      '       g   KF  Vu # 	  ^ # )z8Return the index of the currently active provider, or 0.)r£   r�   r:   )r�   r£   Ú	enumeraterª   rF   )rJ   r‰   r†   r£   ÚirÜ   s   &&$   r    rÖ   rÖ     sN   € å;ä˜)Ö$‰ˆÜ˜q°k×BÓBØŠHØ�5‰5�˜R× Ô Ñ%8¸×%;Ô%;ØŠHñ	 %ñ
 r"   c               ó   € V ^8„  d   QhRR/# ©r   r‰   rE   r   )r   s   "r    r!   r!   *  s   € ÷ %ñ %˜tñ %r"   c                ó   € ^ RI HpHp W3# )z Lazy-load the FAL model catalog.)Ú
FAL_MODELSÚDEFAULT_MODEL)Útools.image_generation_catalogrS  rT  )r‰   rS  rT  s   &  r    Ú_fal_model_catalogrV  *  s   € çHØÐ$Ð$r"   c               ó   € V ^8„  d   QhRR/# rQ  r   )r   s   "r    r!   r!   0  s   € ÷ lñ l 4ñ lr"   c                ó  € ^ RI Hp ^ RIHp V! V 4      P                  p\        T;'       d#    VP                  ;'       d    VP                  RJ4      pT! V'       * ;'       g    VP                  R4      V'       * R7      # )a  The managed row's union catalog (FAL + Krea + Portal), minus the gateways this account cannot use.

A free-pool account is funded for FAL only, so its picker never offers a Krea or Portal model it
would be denied at generation time; a logged-out or paid account sees everything.r‹   )Úmanaged_image_catalogTÚkrea)Úinclude_kreaÚinclude_portal)	r�   rŒ   Útools.image_generation_managedrY  r‘   r1   r’   r“   r–   )r‰   rŒ   rY  r™   rš   s   &    r    Ú_managed_image_catalogr^  0  sr   € õ
 GÝDá)¨&Ó1×>Ñ>€DÜ�T×UÐU˜dŸn™n×UÐU°×1IÑ1IÐQUÐ1UÓV€IÙ Ø"”]×LÐL d×&DÑ&DÀVÓ&LÐajÔ]jôlð lr"   r  ÚdisplayzFAL.aiÚ
config_keyÚ
catalog_fnÚnousúNous Subscriptionc               ó    € V ^8„  d   QhRRRR/# )r   r/   r   rI  r   )r   s   "r    r!   r!   F  s   € ÷ 
Vñ 
V¨3ð 
V¸Sñ 
Vr"   c                ó>  € \        V 4      p VP                  V4      pVP                  4       ;'       g    . pVP                  4       pT Uu/ uF.  p\        T\        4      '       g   K  RT9   g   K$  TR,          TbK0  	  upT3#   \         d    / R3u # i ; iu upi )zÆ``(catalog_dict, default_model_id)`` for a plugin provider; ``catalog_dict`` is shaped like the legacy
``FAL_MODELS`` table so the picker path is shared. ``({}, None)`` if unregistered or no models.NÚid)r*   rs   Úlist_modelsÚdefault_modelr(   rD   rE   )r/   rI  r)   rM   Úmodelsr   Úms   &&     r    Ú_plugin_model_catalogrk  F  sš   € ô   Ó0€HðØ×(Ñ(¨Ó5ˆØ×%Ñ%Ó'×-Ð-¨2ˆØ×(Ñ(Ó*ˆñ !'ÓL¡˜1¬*°Q¼×*=ŒJÀ$È!Á)ŒJˆAˆd�G�QŠJ¡ÑLÈgÐUÐUøô ô Ø�4ˆxŠðüâLs(   �'B µB ÁBÁ)BÁ2BÂBÂBÚ
row_indentr8   c               ó0   € V ^8„  d   QhRRRRRRRRRRRR	/# )
r   ÚcatalogrE   Úcfg_keyr   r_  r‰   rl  r2   ÚNoner   )r   s   "r    r!   r!   W  s<   € ÷ )0ñ )0Øð)0Ø+.ð)0Ø9<ð)0ØFJð)0Ø[^ð)0à	ñ)0r"   c               óò  a € ^ RI HpHp S '       g   R# V! WB4      pVP                  R4      ;'       g    Tp	V	S 9  d   VS 9   d   TM\	        \        S 4      4      p	\        S P                  4       4      p
V	.V
 Uu. uF  q»V	8w  g   K  VNK  	  up,           pR\        R V
 4       4      R\        V 3R lV
 4       ^R7      R\        V 3R	 lV
 4       ^ R7      /p\        4        R
RRVR,           2 R
RRVR,           2 R
RRVR,           2 R2p\        \        V\        P                  4      4       . pV F�  pS V,          pV VRVR,           2 R
VP                  RR4      RVR,           2 R
VP                  RR4      RVR,           2 R
VP                  RR4       2pVV	8X  d
   VR,          pVP                  V4       K�  	  V! RV R2V^ R7      pVV,          pVVR&   \        RV 24       R# u upi )u‹  Column-aligned model picker shared by the FAL, plugin image gen and video gen flows.
Writes the choice to ``config[cfg_key]["model"]``. The current model is listed first so the cursor
lands on it; a saved model belonging to another provider (shared config key) or a drifted catalog
default never indexes the catalog. Safe when stdin is not a TTY â€” curses_radiolist keeps the current
selection.©Ú_cfg_sectionrÆ   NÚmodelc              3  ó8   "  € T F  p\        V4      x € K  	  R # 5iri   )rÑ   )rj   rj  s   & r    rl   Ú+_pick_model_from_catalog.<locals>.<genexpr>k  s   é € Ð/¡Y ”S˜—V�V£Yùs   ‚Úspeedc              3  óh   <"  € T F'  p\        SV,          P                  R R4      4      x € K)  	  R# 5i)rw  r8   N©rÑ   rF   ©rj   rj  rn  s   & €r    rl   rv  l  s(   øé € ÐJÁ	¸1”c˜' !�*Ÿ.™.¨°"Ó5×6Ð6Ã	ùó   ƒ/2rÿ   Ú	strengthsc              3  óh   <"  € T F'  p\        SV,          P                  R R4      4      x € K)  	  R# 5i)r|  r8   Nry  rz  s   & €r    rl   rv  m  s(   øé € ÐRÉ	À1œ#˜g a�jŸn™n¨[¸"Ó=×>Ð>Ë	ùr{  rÌ   ÚModelÚ<ÚSpeedÚ	Strengthsz  Pricer8   Úpriceu     â†� currently in usez	  Choose z model:z  Model set to: )r�   rs  rÆ   rF   ÚnextÚiterrp   ÚkeysÚmaxrÒ   r   r
   rÓ   rI   Ú_print_success)rn  rh  ro  r_  r‰   rl  rs  rÆ   Úcur_cfgÚcurrent_modelÚ	model_idsrj  ÚorderedÚwidthsÚheaderrL   ÚmidÚmetarR   ÚidxÚchosens   f&&&&$               r    Ú_pick_model_from_catalogr’  W  s  ø€ ÷ EçÙÙ˜6Ó+€GØ—K‘K Ó(×9Ð9¨M€MØ˜GÔ#Ø)6¸'Ô)A™ÄtÌDÐQXËMÓGZˆä�W—\‘\“^Ó$€IØˆo©IÓ L©I q¸mÑ9K§ ©IÑ LÕL€Gà”Ñ/¡YÓ/Ó/Ø”ÔJÁ	ÓJÐTUÔVØ”SÔRÉ	ÓRÐ\]Ô^ð`€Fô
 
„GØ�7˜1˜V G�_Ð-Ð-Ð.¨b°¸¸6À'½?Ð:KÐ8KÐ0LÈBØ˜Q˜v kÕ2Ð3Ð3Ð4°Gð=€Fä	Œ%�œŸ™Ó
$Ô%à€DÛˆØ�s�|ˆØ�˜c ! F¨7¥OÐ#4Ð!4Ð5°R¸¿¹ÀÈ"Ó8MÈaÐPVÐW^ÕP_ÐO`ÐM`Ð7aÐacØ—(‘(˜;¨Ó+¨A¨f°[Õ.AÐ-BÐ+BÐCÀ2ÀdÇhÁhÈwÐXZÓF[ÐE\ð^ˆà�-ÔØÐ+Õ+ˆCØ�‰�CÖñ ñ ˜9 W I¨WÐ5°tÀQÔ
G€CØ�S�\€FØ€GˆGÑÜÐ% f XÐ.Ö/ùò/ !Ms   Á:G4ÂG4c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úbackend_namer   r‰   rE   r2   rp  r   )r   s   "r    r!   r!   ƒ  s&   € ÷ hñ h¨Cð h¸ð hÀ$ñ hr"   c                óž   € \         P                  V 4      pV'       g   R# VR,          ! V4      w  r4\        W4VR,          VR,          V4       R# )zJPrompt for a model of an in-tree imagegen backend (``IMAGEGEN_BACKENDS``).Nra  r`  r_  )ÚIMAGEGEN_BACKENDSrF   r’  )r”  r‰   ro   rn  rh  s   &&   r    Ú_configure_imagegen_modelr—  ƒ  sD   € ä×#Ñ# LÓ1€GßÙØ$ \Ö2°6Ó:Ñ€GÜ˜W°W¸\Õ5JÈGÐT]ÕL^Ð`fÖgr"   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r¿   r   rI  r‰   rE   r2   rp  r   )r   s   "r    r!   r!   Œ  s/   € ÷ Pñ P¨Sð P¸sð PÈDð PÐUYñ Pr"   c           	     óp   € V R8X  d   \         M\        pV! V4      w  rE\        YEYTV R8X  d   RMRR7       R# )zxPrompt for a model from a plugin-registered image/video gen catalog (video rows keep their historical
two-space indent).rU   r8   rÌ   )rl  N)Ú_plugin_image_gen_catalogÚ_plugin_video_gen_catalogr’  )r¿   rI  r‰   ra  rn  rh  s   &&&   r    Ú_configure_gen_model_for_pluginrœ  Œ  s<   € ð /6¸Ô.DÕ*ÔJc€JÙ'¨Ó4Ñ€GÜ˜W°WÈ6Ø.5¸Ô.D©È$÷Pr"   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úsection_namer   r‰   rE   r2   rp  r   )r   s   "r    r!   r!   ™  s&   € ÷ Uñ U°ð U¸dð UÀtñ Ur"   c                ó  € ^ RI HpHp V! V! V! W4      R4      R4      p\        R4       . ROpV! RV^ R7      pV^8X  d   RVR&   \	        R	4       R
# RVR&   RVR&   V^8X  d   RMR
VR&   \	        V^8X  d	   R4       R
# R4       R
# )z2Prompt for xAI Imagine stored public URL behavior.rr  ÚxaiÚstoragez~  xAI Imagine can store generated media and create reusable public URLs. xAI may bill for stored files and public URL hosting.z  Stored public URLs:rÿ   FÚenabledz!  xAI stored public URLs disabledNTÚ
public_urlÚexpires_afterz+  xAI stored public URLs enabled for 2 daysz9  xAI stored public URLs enabled without automatic expiry)z9Enable public URLs without automatic expiry (recommended)zDisable stored public URLszEnable public URLs for 2 daysi £ )r�   rs  rÆ   Ú_print_warningr‡  )rž  r‰   rs  rÆ   Ústorage_cfgÚchoicesr�  s   &&     r    Ú_configure_xai_imagine_storager¨  ™  s£   € çDá™|©L¸Ó,NÐPUÓVÐXaÓb€KÜð	@ôAò0€Gá
Ð0°'À1Ô
E€CØ
ˆa„xØ!&ˆ�IÑÜÐ:Ô;ÙØ!€K�	ÑØ $€K�ÑØ7:¸a´xÑ#3ÀT€K�Ñ ÜÀCÈ1ÄHÐ@ö UØSöUr"   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r‰   rE   r¿   r   rS   r2   r   )r   s   "r    r!   r!   ¯  s(   € ÷ ñ ˜ð ¨ð °#ð È4ñ r"   c                ój   € ^ RI Hp V! W4      pV'       d   \        MTWb&   VP                  RR4       V# )zÁWrite ``config[section][key] = vendor`` (``nous`` for a managed pick) and drop any legacy ``use_gateway``
key so the old read-time shim cannot override the new choice. Returns the section dict.)rs  rþ   N)r�   rs  r   Úpop)r‰   r¿   rS   Úvendorrœ   rs  Úcfgs   &&&&&  r    Ú_select_intor®  ¯  s0   € õ 5á
�vÓ
'€Cß(/Õ$°V€C�HØ‡G�GˆM˜4Ô Ø€Jr"   rþ   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   r¿   r   rI  r‰   rE   rþ   r1   r2   rp  r   )r   s   "r    r!   r!   º  s1   € ÷ 8ñ 8¨ð 8¸3ð 8Èð 8Ð^bð 8Ðosñ 8r"   c               ó�   € \        W RW4      p\        RV  RVR,           24       \        WV4       VR8X  d   \        W4       R# R# )z�Persist a plugin-backed image/video gen provider selection (``nous`` for a Nous-managed pick, else the
plugin name) and run its model picker.rM   rÌ   z.provider set to: r   N)r®  r‡  rœ  r¨  )r¿   rI  r‰   rþ   r­  s   &&&$ r    Ú_select_plugin_gen_providerr±  º  sL   € ô �v¨
°KÓ
M€CÜ�R˜�yÐ 2°3°zµ?Ð2CÐDÔEÜ# G¸&ÔAØ�eÔÜ& wÖ7ñ r"   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r  r   r‰   rE   r2   rp  r   )r   s   "r    r!   r!   Ç  s!   € ÷ 4ñ 4 sð 4°Dð 4¸Tñ 4r"   c                óÂ  € ^ RI HpHp \        P                  ! V 4      pVf   V R8X  d   ^ RIHp V! R4      pV'       g   R# V! V! VR4      V 4      p\        P                  ! V R4      p\        VP	                  V4      ;'       g    R4      P                  4       p\        V4      p	Y“! RY˜V	9   d   V	P                  V4      M^ 4      ,          p
W¦V&   \        R	V
 24       R# )
zYPrompt for the STT model after a provider pick (static catalog, or DeepInfra's live one).rr  NÚ	deepinfra)Údeepinfra_model_idsr  rt  r8   z  Select STT model:z  STT model set to: )r�   rs  rÆ   r   rF   Úhermes_cli.modelsrµ  r   r   rB   rp   Úindexr‡  )r  r‰   rs  rÆ   rn  rµ  Úprov_cfgÚ	model_keyr  r‹  r‘  s   &&         r    Ú_configure_stt_modelrº  Ç  sÅ   € çDä×#Ò# LÓ1€GØ‚˜<¨;Ô6Ý9Ù% eÓ,ˆßÙÙ™L¨°Ó7¸ÓF€HÜ$×(Ò(¨°wÓ?€IÜ�(—,‘,˜yÓ)×/Ð/¨RÓ0×6Ñ6Ó8€GÜ�7‹m€GØ�^Ð$9¸7ÐipÔ^pÀGÇMÁMÐRYÔDZÐvwÓxÕy€FØ ˆYÑÜÐ)¨&¨Ð2Ö3r"   c               ó$   € V ^8„  d   QhRRRRRR/# ©r   rM   rE   r‰   r2   rp  r   )r   s   "r    r!   r!   á  s"   € ÷ ;=ñ ;= Tð ;=°4ð ;=ÐPTñ ;=r"   c          	     ób  € ^ RI Hp R F2  w  rEV P                  V4      '       g   K  \        WRW,          V4       K4  	  RV 9   dK   V R,          pV'       g	   V'       d   \        VRRWb4       M"VP	                  R/ 4      P                  RR4       V P                  R4      '       d   V R,          VP	                  R/ 4      R	&   V P                  R
4      '       d   V R
,          VP	                  R/ 4      R&   V P                  R4      '       dÂ   \        VRR	V R,          V4      pV'       d%   VP                  RR4       VP                  RR4       V P                  R4      pV'       d   VP	                  R/ 4      MVP                  R4      p	\        V	\        4      '       d.   V'       d   W‰V R,          &   MV	P                  V R,          R4       V P                  R4      '       d   V R,          VP	                  R/ 4      R	&   V'       dO   VR9  dH   VP	                  V/ 4      p
\        V
\        4      '       d   \        V
R&   V
P                  RR4       R# R# V'       gÅ   \        P                  4        UUu. uF  w  rEW@9   g   K  VNK  	  pppV'       gD   VP                  4        UUu. uF  w  rÍWP                  R. 4      9   g   K  VNK!  	  uppR,          pV FB  p\        VP                  V4      \        4      '       g   K*  W,          P                  RR4       KD  	  R# R# u uppi u uppi )aµ  Persist the provider/backend config keys for a selected provider.
Pure, non-interactive core of :func:`_configure_provider` (no env prompts, post-setup hooks, Nous
auth gating or model pickers) shared by the CLI and the GUI ``PUT .../provider`` endpoint. Each pick
writes exactly ONE provider string per category (``nous`` for managed rows) and removes any legacy
``use_gateway`` key so the read-time shim cannot override the new choice.©r¸   rM   r^   r]   r»   rþ   Nr6  ro   r,  r-  r\   r[   r  r  r;   ræ   rƒ   rC  rJ   :Né   N))r`   r_   )r  r  >   r  r_   r[   r]   )r�   r¸   rF   r®  Ú
setdefaultr«  rD   rE   r   Ú_PROVIDER_MARKER_SECTIONSÚitems)rM   r‰   r¬   r¸   r  Úsection_keyÚbprð   Útierrñ   r¿   ÚsectionsÚcat_keyrk   s   &&$           r    Ú_write_provider_configrÈ  á  s¦  € õ 8ãQÑˆØ�<‰<˜×ÔÜ˜¨j¸(Õ:JÈOÖ\ñ  Rð ˜XÔ%ØÐ(Õ)ˆß—ä˜ Ð,<¸bÕRà×Ñ˜i¨Ó,×0Ñ0°ÀÔEØ‡|�|Ð%×&Ò&Ø6>Ð?PÕ6Qˆ×Ñ˜) RÓ(¨Ñ3à‡|�|Ð$×%Ò%Ø5=Ð>NÕ5Oˆ×Ñ˜) RÓ(¨Ñ2à‡|�|�M×"Ò"Ü˜v u¨i¸À-Õ9PÐRaÓbˆßð �K‰KÐ(¨$Ô/Ø�K‰KÐ)¨4Ô0Ø�|‰|˜JÓ'ˆß;?�×"Ñ" ?°BÔ7ÀWÇ[Á[ÐQ`ÓEaˆÜ�eœT×"Ò"ßØ15�h˜}Õ-Ò.à—	‘	˜( =Õ1°4Ô8à‡|�|Ð*×+Ò+Ø;CÐDZÕ;[ˆ×Ñ˜.¨"Ó-¨iÑ8ç˜?Ð2RÔRð ×#Ñ# O°RÓ8ˆÜ�gœt×$Ò$Ü"7ˆG�JÑØ�K‰K˜ tÖ,ñ %÷ ô <U×;ZÑ;ZÔ;\ÔsÑ;\Ñ$7 FÐ`fÑ`r—K�KÑ;\ˆÑsßØ4C×4IÑ4IÔ4KÔtÑ4K¡L GÈx×[bÑ[bÐcnÐprÓ[sÑOsŸ˜Ñ4KÒtÐuwÕxˆHÛ#ˆKÜ˜&Ÿ*™* [Ó1´4×8Ô8ØÕ#×'Ñ'¨°tÖ<ó $ñ ùó tùãts   É6
L%ÊL%Ê)L+ËL+c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r¶   r   Úprovider_namer‰   rE   r2   rp  r   )r   s   "r    r!   r!     s.   € ÷ Sñ S Sð S¸ð SÀdð SÈtñ Sr"   c                óâ  a€ ^ RI Hp VP                  V 4      pVf   \        RV  24      h\	        WBRR7      p\        V3R lV 4       R4      pVf   \        RS: RV : 24      hVP                  R	4      p\        WbVR
7       RVP                  R4      3RVP                  R4      3RVP                  R4      '       d   V'       g   RMR3.pV F  w  ršV
'       g   K  \        W)RW§4       K  	  R# )u&  Non-interactively persist a provider selection for a toolset (config keys only â€” API keys, post-setup
hooks, auth gating and model pickers are separate GUI endpoints). ``provider_name`` is resolved among
:func:`_visible_providers` rows; raises ``KeyError`` for an unknown toolset or provider.r¾  Nz&Toolset has no configurable category: Tr�   c              3  óV   <"  € T F  qP                  R 4      S8X  g   K  Vx € K   	  R# 5i)r5   Nr  )rj   rÜ   rÊ  s   & €r    rl   Ú+apply_provider_selection.<locals>.<genexpr>*  s    øé € ÐL¡	˜1¯U©U°6«]¸mÑ-K—Q’Q£	ùs   ƒ)Ÿ
)zUnknown provider z for toolset rŽ   ©r¬   rU   rW   rX   rZ   r:  r  rM   )r�   r¸   rF   ÚKeyErrorrž   rƒ  rÈ  r®  )r¶   rÊ  r‰   r¸   rk   rJ   rM   r¬   Ú
selectionsrÃ  r¬  s   &f&        r    Úapply_provider_selectionrÑ    sñ   ø€ õ 8à
×
Ñ
˜fÓ
%€CØ
‚{ÜÐ?À¸xÐHÓIÐIä" 3¸DÔA€IÜÔL¡	ÓLÈdÓS€HØÒÜÐ*¨=Ñ*;¸=ÈÉ
ÐSÓTÐTà—l‘lÐ#9Ó:€OÜ˜8¸_ÕMð 
�h—l‘lÐ#:Ó;Ð<Ø	�h—l‘lÐ#:Ó;Ð<Ø	˜xŸ|™|Ð,>×?Ò?Ï‘eÐ]aÐbðd€Jó  *Ñˆß‰6Ü˜¨j¸&ÖRó  *r"   c               ó(   € V ^8„  d   QhRRRRRRRR/# rF  r   )r   s   "r    r!   r!   =  s*   € ÷ ñ  $ð °ð ÐW[ð Ð`dñ r"   c               ó  € ^ RI Hp V'       dK   ^ RIHp V! V P	                  RR4       \
        P                  ! V4      R7      '       g   \        R4       R# R# V P	                  R	4      '       d›   V! WR
7      p\        VP                  ;'       d    VP                  P                  RJ 4      pVP                  '       d	   V'       gC   \        VP                  V P	                  RR4       R7      p\        RT;'       g    R 24       R# R# )u‚  Return False (after printing why) when a Nous-gated row cannot be selected.
Managed Tool Gateway rows are always listed but only *activate* with paid Nous Portal access â€”
selecting one runs an inline Portal login (auth + entitlement only, no inference-provider switch).
Pure pre-auth UX rows (``requires_nous_auth`` without a managed feature) keep the older logged-in +
entitled gate.r‹   )Úensure_nous_portal_accessr5   zthe Nous Tool Gateway)Ú
capabilityÚcoverage_categoryuB     Not enabled â€” Nous Portal access is required for this backend.FTr�   r�   rc  )rÕ  rÌ   zCNous Subscription is only available after logging into Nous Portal.)r�   rŒ   Úhermes_cli.nous_subscriptionrÔ  rF   r   r¥  r1   r‘   r“   r•   r   )	rM   r‰   r¬   r†   rŒ   rÔ  r‡   r­   Úmessages	   &&&$     r    Ú_nous_provider_gaterÙ  =  sä   € õ GçÝJá(Ø"Ÿ,™, vÐ/FÓGÐHÜ?×CÒCÀOÓT÷Vó Vô Ð_Ô`ÙÙà‡|�|Ð(×)Ò)Ù1°&ÔRˆÜ˜×-Ñ-×cÐc°(×2GÑ2G×2[Ñ2[Ð_cÐ2cÓdˆØ×)×)Ð)·Ü<Ø×%Ñ%°X·\±\À&ÐJ]Ó5^Ð4_ôbˆGä˜R × pÐ pÐ+pÐqÐrÔsÙÙr"   c               ó$   € V ^8„  d   QhRRRRRR/# r¼  r   )r   s   "r    r!   r!   Z  s"   € ÷ ?ñ ?¨ð ?°tð ?ÐQUñ ?r"   c           	     óV  € R	 F9  pV P                  V R24      pV'       g   K!  \        W4V\        V4      R7        R# 	  V P                  R4      pV'       d   \        WQ4       \	        VRRRV4       V P                  R4      '       d    V'       g   \        V R,          V4       R# R# R# )
zTModel pickers that follow a provider pick: plugin image/video gen, in-tree FAL, STT.rU   rH  )rþ   Nr:  rM   r  r  r  )rF   r±  r1   r—  r®  rº  )rM   r‰   r¬   r¿   rI  ro   s   &&&   r    Ú_finish_provider_selectionrÜ  Z  s’   € ã-ˆØ—l‘l g Y¨lÐ#;Ó<ˆß‰;Ü'¨¸fÔRVÐWfÓRgÕhÚñ	 .ð
 �l‰lÐ-Ó.€GßÜ! 'Ô2ô 	�V˜[¨*°e¸_ÔMà‡|�|�N×#Ò#¯OÜ˜X nÕ5°vÖ>ñ -<Ñ#r"   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rM   rE   rÃ   r1   r2   rp  r   )r   s   "r    r!   r!   l  s'   € ÷ ]ñ ]¨ð ]Ètð ]ÐX\ñ ]r"   c               óŠ  € V'       d-   V P                  R4      '       d   \        RV R,           24       V P                  R4      '       d   \        RV R,           24       RV 9   d\   V R,          pV'       d"   V'       d   \        RT;'       g    R 24       M)VR8X  d   \        R	4       MV'       d   \        RV 24       V P                  R
4      '       d   \        R4       V P                  R4      '       d$   V R,          R8w  d   \        RV R,           24       V P                  R4      '       dV   V'       d%   V P                  R4      '       d   RV R,           R2MRpV'       d   \        MV R,          p\        RV V 24       V'       d1   V P                  R4      '       d   \        RV R,           24       R# R# R# )zBStatus lines announcing which backend/provider keys a pick writes.r`   z  TTS provider set to: r  z  STT provider set to: r^   z!  Browser cloud provider set to: rb  rA  z  Browser set to local moder6  z7  Browser set to Browser Use (browser_exec via CLI 3.0)r,  r.  z  Browser engine set to: r\   r;   ú (z tier)r8   z  Web backend set to: rƒ   z  Computer Use backend set to: N)rF   r‡  r   )rM   r¬   rÃ   rÄ  rÅ  ro   s   &&$   r    Ú_print_provider_selectionrà  l  sv  € ç�x—|‘| N×3Ò3ÜÐ0°¸.Õ1IÐ0JÐKÔLØ‡|�|�N×#Ò#ÜÐ0°¸.Õ1IÐ0JÐKÔLØ˜XÔ%ØÐ(Õ)ˆßŸ?ÜÐ>¸r¿|¸|ÀV¸nÐMÕNØ�7Œ]ÜÐ8Õ9ßÜÐ>¸r¸dÐCÔDØ‡|�|Ð%×&Ò&ÜÐPÔQØ‡|�|Ð$×%Ò%¨(Ð3CÕ*DÈÔ*NÜÐ2°8Ð<LÕ3MÐ2NÐOÔPØ‡|�|�M×"Ò"ß4?ÀHÇLÁLÐQ[×D\ÒD\��H˜ZÕ(Ð)¨Ñ0Ðbdˆß+:Õ'ÀÈÕ@WˆÜÐ/°¨y¸¸Ð?Ô@ß�x—|‘|Ð$:×;Ò;ÜÐ8¸ÐBXÕ9YÐ8ZÐ[Ö\ñ <�{r"   c               ó(   € V ^8„  d   QhRRRRRRRR/# rF  r   )r   s   "r    r!   r!   †  s*   € ÷ ñ  ð ¨dð ÐRVð Ð[_ñ r"   c                óˆ  € ^ RI HpHp V'       g   V P                  R4      '       d   R#  VP	                  4        Fq  pVP                  R. 4      pW9   g   K  \
        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       g   KY  V! WR7      P                  '       * u # 	  R#   \         d     R# i ; i)u¸   True when a BYOK row shares its category with a Nous-managed sibling and the user is not authed to
Nous â€” a single dim hint tells them the key is avoidable via a Portal subscription.)r¸   rŒ   r�   FrJ   c              3  óB   "  € T F  qP                  R 4      x € K  	  R# 5i)rŽ   Nr  )rj   Úsibs   & r    rl   Ú$_show_portal_hint.<locals>.<genexpr>�  s   é € Ð-dÑYcÐRU¯g©gÐ6L×.MÐ.MÓYcùrm   Tr�   )r�   r¸   rŒ   rF   Úvaluesr  r•   r(   )rM   r‰   r¬   r†   r¸   rŒ   Ú_catÚ
_providerss   &&&&    r    Ú_show_portal_hintré  †  s�   € ÷ Xç˜(Ÿ,™,Ð';×<Ò<ÙðØ#×*Ñ*Ö,ˆDØŸ™ +¨rÓ2ˆJØÖ%¯#«#Ñ-dÑYcÓ-d¯#¯#ª#Ñ-dÑYcÓ-d×*dÔ*dÙ9¸&ÔZ×lÑlÔlÒlñ -ñ øô ô ØÙðús/   «(B2 Á
B2 Á#B2 Á7B2 ÂB2 Â.B2 Â2CÃ CrB   c               ó8   € V ^8„  d   QhRRRRRRRRRRRRR	RR
R/# )r   rS   r   ÚlabelÚurlÚdefault_valrÃ   r1   Ú	url_labelrB   r2   r   )r   s   "r    r!   r!   —  sL   € ÷ ñ Ø	ðØðØ"ðØ14ðØFJðØWZðØcgðà	ñr"   c               óR  € V'       d   \        V 4      MRpV'       d   \        RV  RVR,           R24       V'       d   \        RV RV 24       V'       d\   \        RV R2V'       * R	7      ;'       g    RP                  4       pV'       d   \	        W4       \        R
4       R# \        R4       R# V'       d   \        RV 2V4      M\        RV 2RR	7      pV'       d   T;'       g    RP                  4       pV'       d   \	        W4       \        R4       R# \        R4       R# )aR  One env-var prompt; True unless the new-enable flow skipped the key.
Reconfigure mode shows the current value and re-prompts ("Enter to keep current"); the new-enable
flow prompts with ``default_val`` visible when one exists, else as a password, and ``strip`` decides
whether whitespace is trimmed (and whitespace-only counts as skipped).r8   rÌ   z: configured (:Né   Nz...)z: z    z (Enter to keep current)©Úpasswordz    Updatedz    Kept currentTz	    Savedú    SkippedF)r   rÔ   Ú_promptrB   r   r‡  r¥  )	rS   rë  rì  rí  rÃ   rî  rB   Úexistingrû   s	   &&&&$$$  r    Ú_prompt_secretrö  —  sù   € ÷ &1Œ}˜SÔ!°b€HßÜ�b˜˜˜^¨H°R­L¨>¸Ð>Ô?ß
Ü�b˜˜ 2 c UÐ+Ô,ßÜ˜4 ˜wÐ&>Ð?ÈkÌ/ÔZ×`Ð`Ð^`×gÑgÓiˆßÜ˜3Ô&Ü˜=Ô)ñ ô Ð*Ô+Ùß4?ŒG�d˜5˜'�N KÔ0ÄWÈtÐTYÐSZÈ^ÐfjÔEk€EßØ—�˜"×#Ñ#Ó%ˆßÜ�sÔ"Ü�{Ô#ÙÜ�=Ô!Ùr"   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r:   rp   rÃ   r1   r2   r   )r   s   "r    r!   r!   ¶  s!   € ÷ ñ ˜tð °Tð ¸dñ r"   c          
     óB  € RpV  F–  pV'       g1   \        VR,          4      '       d   \        RVR,           R24       K;  \        VR,          VP                  RVR,          4      VP                  RR4      VP                  RR4      VR	R
7      pT;'       d    TpK˜  	  V# )zéPrompt for a provider's env vars; True when every key ended up configured.
Reconfigure mode re-prompts every key and always returns True; the new-enable flow keeps already-set
keys without asking and reports False on any skipped key.TrS   rÌ   z: already configuredr	   rì  r8   r   zGet yours at)rÃ   rî  )r   r‡  rö  rF   )r:   rÃ   Úall_configuredÚvarÚoks   &$   r    Ú_prompt_env_varsrü  ¶  s™   € ð €NÛˆßœ}¨S°­Z×8Ò8Ü˜R  E¥
˜|Ð+?Ð@ÔAÙÜ˜C �J¨¯©°¸#¸e½*Ó(EÀsÇwÁwÈuÐVXÓGYÐ[^×[bÑ[bÐclÐnpÓ[qØ(3¸~ôOˆà'×.Ð.¨BŠñ ð Ðr"   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rM   rE   r‰   r†   r1   rÃ   r   )r   s   "r    r!   r!   Å  s/   € ÷ #Fñ #F $ð #F°ð #FÀdð #FÐ`dñ #Fr"   c               ó¦  € ^ RI Hp V P                  R. 4      pV P                  R4      p\        WWbR7      '       g   R# \	        WVR7       \        WVR7       V'       g^   V P                  R4      '       d   V! V R,          4       \        R	V R
,           R24       V'       d   \        R4       \        WV4       R# V'       g   \        WWb4      '       d   \        R4       \        WSR7      pV P                  R4      '       d   V'       d   V! V R,          4       V'       d-   V'       g   \        R	V R
,           R24       \        WV4       R# R# )a  Configure a single provider - prompt for API keys and set config.
``reconfigure=False`` (new-enable): already-set keys are kept without asking and the post-setup hook
only runs when every key was provided. ``reconfigure=True`` re-prompts every key and always runs the
hook.)Ú_run_post_setupr:   rŽ   r�   N)rÃ   rÎ  r<   rÌ   r5   z - no configuration needed!zB  Requests for this tool will be billed to your Nous subscription.z-  Available through Nous Portal subscription.z configured!)r�   rÿ  rF   rÙ  rà  rÈ  r‡  rÔ   rÜ  ré  rü  )rM   r‰   r†   rÃ   rÿ  r:   r¬   rù  s   &&$$    r    rÕ   rÕ   Å  s  € õ
 8à�|‰|˜J¨Ó+€HØ—l‘lÐ#9Ó:€Oä˜x°×ZÓZÙä˜hÀ[ÕQä˜8¸_ÕMçØ�<‰<˜×%Ò%Ù˜H \Õ2Ô3Ü˜˜H VÕ,Ð-Ð-HÐIÔJßÜÐ\Ô]Ü" 8°_ÔEÙçÔ,¨X¸×\Ò\ÜÐCÔDä% hÔH€NØ‡|�|�L×!Ò!§nÙ˜ Õ.Ô/ßßÜ˜R ¨Õ 0Ð1°Ð>Ô?Ü" 8°_ÖEñ r"   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rM   rE   r‰   r†   r1   r   )r   s   "r    r!   r!   ë  s&   € ÷ Uñ U Dð U°$ð UÈñ Ur"   c               ó"   € \        WVRR7       R# )z)Reconfigure a provider - update API keys.TrÎ   N)rÕ   )rM   r‰   r†   s   &&$r    Ú_reconfigure_providerr  ë  s   € ä˜°kÈt×Tr"   c               ó   € V ^8„  d   QhRR/# )r   r2   rp  r   )r   s   "r    r!   r!   ð  s   € ÷ 46ñ 46 4ñ 46r"   c                 ó  € ^ RI Hp Hp \        4        \        \	        R\
        P                  4      4       \        \	        R\
        P                  4      4       . ROpV! RV^ 4      p\        4       pV ! V ! VR4      R4      pV^ 8X  d4   R F  pVP                  VR
4       K  	  \        V4       \        R4       R
# V^8X  d   \        WE4       R
# V^8X  Ed!   \        R4      P                  4       ;'       g    Rp\        V4      R8H  pV'       d   RMRp	\        V	RR7      p
V
'       d   V
P                  4       '       g   \!        R4       R
# V'       d   RMRp\        RV'       d   RV R2MR 24      P                  4       ;'       g    Tp\#        RV
P                  4       4       RVR&   WuR	&   V'       d   WÅR&   MVP                  RR
4       \        V4       \        RV'       d   RV R2MR 24       R
# \%        R4       R
# ) a-  Interactive vision-backend configuration (``auxiliary.vision.{provider,model,base_url}``).
Offers any authenticated provider + model (same surface as ``hermes model``) or a custom endpoint
rather than forcing OpenRouter. "Auto" leaves the keys empty so the resolver uses the main-model
fallback chain.rr  z3  Vision / Image Analysis needs a multimodal model.zA  Pick any provider + model (like /model), or let it auto-detect.z  Configure vision backendÚ	auxiliaryÚvisionrM   rt  Úbase_urlNz7  Vision set to auto (main model / aggregator fallback)z    Base URL (blank for OpenAI)zhttps://api.openai.com/v1zapi.openai.comz    OPENAI_API_KEYz    API keyTrñ  ró  zgpt-4o-minir8   z    Vision modelz (blank for rÉ   ÚOPENAI_API_KEYÚcustomz  Vision set to custom endpointrß  z  Skipped vision configuration)u@   Auto â€” use your main model / aggregator fallback (recommended)zPick a provider and modelu>   Custom OpenAI-compatible endpoint â€” base URL, API key, modelÚSkip)rM   rt  r  Úapi_keyÚapi_mode)r�   rs  rÆ   rÒ   r   r
   ÚYELLOWÚDIMr   r«  r   r‡  Ú _configure_vision_provider_modelrô  rB   r   r¥  r   rÔ   )rs  rÆ   r§  r�  r‰   Ú
vision_cfgrS   r  Úis_native_openaiÚ	key_labelr  rh  rt  s                r    Ú_configure_vision_backendr  ð  s¶  € ÷
 Eä	„GÜ	Œ%ÐEÄvÇ}Á}Ó
UÔVÜ	Œ%ÐSÔU[×U_ÑU_Ó
`Ôaò€Gñ
 Ð5°wÀÓ
B€Cä‹]€FÙ™l¨6°;Ó?ÀÓJ€Jà
ˆa„xãKˆCØ�N‰N˜3 Ö%ñ Lä�FÔÜÐPÖQØ	�ŒÜ(¨Ö<Ø	��ÜÐ<Ó=×CÑCÓE×dÐdÐIdˆÜ,¨XÓ6Ð:JÑJÐß,<Ñ(À-ˆ	Ü˜)¨dÔ3ˆß˜GŸM™MŸOšOÜ˜=Ô)Ùß)9™¸rˆÜÐ*Ïm¨\¸-¸ÈÑ+JÐacÐ*dÐeÓf×lÑlÓn×ÐÐrˆÜÐ'¨¯©«Ô9ð "*ˆ
�:ÑØ!)�:ÑßØ"'�wÒà�N‰N˜7 DÔ)Ü�FÔÜÐ8Ï%¸2¸e¸WÀA¹ÐUWÐ8XÐYÖZäÐ4Ö5r"   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r‰   rE   r  r2   rp  r   )r   s   "r    r!   r!   '  s!   € ÷ 68ñ 68¨Tð 68¸tð 68Èñ 68r"   c                óÈ  € ^ RI Hp  ^ RIHpHp \        TP                  R4      ;'       g    R4      P                  4       p\        TP                  R4      ;'       g    R4      P                  4       p\        TP                  R4      ;'       g    R4      P                  4       p T! YgT^(R	7      p	T	'       g   \        R4       R# T! Y–TR7       U
UUu. uF  w  r«qËNK	  	  uppp
R.,           pT! RT^ 4      pT\        T	4      8¼  d   \        R4       R# Yž,          pTP                  R4      p\        TP                  R. 4      4      pT! RTP                  R4      ;'       g    T R2TR.,           ^ 4      pT\        T4      8  d   TT,          pM.\        R4      P                  4       pT'       g   \        R4       R# TTR&   TTR&   TP                  RR4       TP                  RR4       \        T 4       \!        RT RT 24       R#   \
         d   p\        RT 24        Rp?R# Rp?ii ; i  \
         d   p\        R
T 24       . p	 Rp?EL£Rp?ii ; iu uppp
i )a5  Provider + model picker for vision, mirroring the ``/model`` surface.
Rows come from ``build_aux_picker_rows()`` so this lists exactly what the ``hermes model`` aux-task
picker lists, including user-defined ``providers:`` / ``custom_providers:`` endpoints. Persists
``auxiliary.vision.provider`` + ``.model``.)rÆ   )Úbuild_aux_picker_rowsÚformat_aux_picker_entriesz   Could not load provider list: NrM   r8   rt  r  )Úcurrent_providerr‰  Úcurrent_base_urlÚ
max_modelsz  Could not detect providers: ze  No authenticated providers found. Configure a provider first with `hermes model`, then re-run this.)r  r  ÚCancelz  Choose vision provider:z  CancelledÚslugri  z  Choose vision model for r5   rÐ   u   Type a custom model idâ€¦z    Model idu      No model entered â€” cancelledr  z  Vision set to z / )r�   rÆ   Úhermes_cli.inventoryr  r  r(   r¥  r   rF   rB   rÑ   rÔ   rp   rô  r«  r   r‡  )r‰   r  rÆ   r  r  Úexcr  r‰  r  rJ   Ú_slugrë  Ú_modelsÚprovider_labelsÚpidxr‘  r  ri  Úmidxrt  s   &&                  r    r  r  '  sM  € õ
 7ðßYô
 ˜:Ÿ>™>¨*Ó5×;Ð;¸Ó<×BÑBÓDÐÜ˜
Ÿ™ wÓ/×5Ð5°2Ó6×<Ñ<Ó>€MÜ˜:Ÿ>™>¨*Ó5×;Ð;¸Ó<×BÑBÓDÐðÙ)Ð;KØ;KÐXZô\ˆ	÷ Üð @ô 	Aáá:SØÐGWõ;Yõ Zñ ;YÑ!6 ¨w’uñ ;Yó ZØ]eÐ\fõg€OáÐ5°ÈÓJ€DØŒs�9‹~ÔÜ�MÔ"Ùà�_€FØ�:‰:�fÓ€DÜ�&—*‘*˜X rÓ*Ó+€FÙÐ6°v·z±zÀ&Ó7I×7QÐ7QÈTÐ6RÐRSÐTÐV\Ð`{Ð_|ÕV|Ð~ó  A€DØŒc�&‹kÔØ�t•‰ä˜Ó'×-Ñ-Ó/ˆßÜÐ=Ô>Ùà!€JˆzÑØ€JˆwÑà‡N�N�:˜tÔ$Ø‡N�N�9˜dÔ#Ü�ÔÜÐ% d V¨3¨u¨gÐ6Ö7øô[ ô ÜÐ9¸#¸Ð?Ô@Ýûðûô ô ÜÐ7¸°uÐ=Ô>ØŽ	ûðüôZs5   ˆH Â'H4 ÃIÈH1ÈH,È,H1È4IÈ?IÉIc               ó    € V ^8„  d   QhRRRR/# )r   r¶   r   rÃ   r1   r   )r   s   "r    r!   r!   `  s   € ÷ gñ g¨3ð gÀñ gr"   c               ó  € ^ RI HpHpHp V R8X  d#   V'       g   V! R4      '       g   \	        4        R# VP                  V . 4      pV'       g*   V UUu. uF  w  rg\        V4      '       d   K  Wg3NK  	  pppV'       g   R# V! V 4      p\        4        V'       d)   \        \        RV R2\        P                  4      4       M'\        \        RV R2\        P                  4      4       V F  w  rg\        WfVRVRR	R
7       K  	  R# u uppi )uì   Fallback for toolsets that just need env vars (no provider selection).
Vision has its own provider/model picker â€” run it directly so neither flow falls back to the generic
single-key prompt (which would re-ask for OPENROUTER_API_KEY).)ÚTOOLSET_ENV_REQUIREMENTSrº   Ú_toolset_labelr  NrÌ   rÐ   z requires configuration:r8   z
Get key atT)rÃ   rî  rB   )r�   r&  rº   r'  r  rF   r   rÒ   r   r
   rÓ   r  rö  )	r¶   rÃ   r&  rº   r'  Úrequirementsrú  rì  Úts_labels	   &$       r    Ú_configure_simple_requirementsr*  `  s×   € ÷ dÑcà�ÔßÑ/°×9Ò9Ü%Ô'Ùà+×/Ñ/°¸Ó;€LßÙ3?ÔZ±<¡x sÄ}ÐUX×GYœ
˜›
±<ˆÑZßÙá˜fÓ%€HÜ	„GßÜŒe�b˜˜
 !Ð$¤f§k¡kÓ2Õ3äŒe�b˜˜
Ð":Ð;¼V¿]¹]ÓKÔLã ‰ˆÜ�s  b°kÈ\Ðae×fó !ùó [s   ÁDÁ-D)rW   )rZ   )r\   r
  )r^   Úbrowser_plugin_name)r`   Útts_plugin_name)rU   rX   r[   r]   r_   ))r`   r_   rM   )r  r  rM   )r^   r]   r»   )mÚ__conditional_annotations__Ú__doc__Ú
__future__r   r%   ÚloggingÚ	functoolsr   Útypingr   r   Úhermes_cli.cli_outputr   rÔ   r   r‡  r   r¥  r	   rô  Úhermes_cli.colorsr
   r   Úhermes_cli.configr   r   r   r   r   Úhermes_cli.nous_accountr   r×  r   r   Útools.tool_backend_helpersr   r   Útools.transcription_commonr   r   Úutilsr   r   Ú	getLoggerÚloggerr*   rT   rd   rg   Ú_plugin_image_gen_providersÚ_plugin_video_gen_providersÚ_plugin_web_search_providersÚ_plugin_browser_providersÚ_plugin_tts_providersr{   r—   r}   rž   r°   r«   rÀ   r½   râ   rô   r  r  r  Ú__annotations__r  r   r)  r/  r¼   r7  r<  rD  rª   rÖ   rV  r^  r–  rk  rš  r›  r’  r—  rœ  Ú$_configure_imagegen_model_for_pluginÚ$_configure_videogen_model_for_pluginr¨  r®  r±  Ú!_select_plugin_image_gen_providerÚ!_select_plugin_video_gen_providerrº  rÁ  rÈ  rÑ  rÙ  rÜ  rà  ré  rö  rü  rÕ   r  r  r  r*  )r-  s   @r    Ú<module>rF     sÊ  øðÜ tå "ã Û Ý ß %÷ó ÷ ,ß ^Õ ^Ý Jß dß Sß Nß 4à	×	Ò	Ð4Ó	5€õ	ð+ØPTð+Økpð+à"÷+ðd Ð,Ð.HÈ>Ð[`ÐJaÐbØÐ,Ð.HÈ>Ð[`ÐJaÐbØ	Ð'Ð)RÐUgÐimÐTnÐoØÐ(Ð*UÐWYÐZØ	Ð Ð"EÈÐX\ÐG]Ð^ð`Ð õ<ñ8gÙ2eó8gñ5Ð Ð8Ð:VØÐ4õ!ð$ Ð3ØÐ3ØÐ8ØÐ3ØÐ+Ø(Ñ*OðQÐ õ\ðØ49ðØjn÷ð@*-Èð *-Ðjn÷ *-õZ
XðJÐZ_÷ JõDð8kÐZ^ð 8kÐty÷ 8kõv7õ2õ$8ð*=7Ð Ð9ó 7õ
^õ#õBõ*	õ:õ/õNð ÑTÐUØÑaÐbØÐ1Ð2ØÐ/Ð0ØÐ'Ð(ØÑlÐmØÐ1Ð2ðH4€ÐDó 4ðÈU÷ ð.	ÐX]÷ 	õ%õlð$ 
ˆI�x ¨{¸LÐJ\Ð]Ø
ˆYÐ+¨\¸;ÈÐVlÐmðoÐ õ

Vñ $Ð$9Ð;UÓVÐ Ù#Ð$9Ð;UÓVÐ ð)0Øac÷)0õXhõPñ (/Ð/NÐP[Ó'\Ð $Ù'.Ð/NÐP[Ó'\Ð $õUõ,ð8Ðej÷ 8ñ %,Ð,GÈÓ$UÐ !Ù$+Ð,GÈÓ$UÐ !õ4ð* �E˜>¨5Ð2DÀiÐQ^Ð`eØ˜[Ð*<¸kÐKbÐdoðÐ õ;=õ|Sõ<õ:?õ$]õ4ð"Øjo÷õ>ð#FÈTð #FÐgl÷ #FðLUÈt÷ Uõ
46õn68ðrgÀu÷ gñ gr"   