Ë
    âß²jy2  ã                  óø   — d Z ddlmZ ddlZddlZddlmZmZmZ ddl	m
Z
  ej                  d«      ZdZdZd	Zd
d
d
ddœ	 	 	 	 	 	 	 	 	 	 	 dd„Z G d„ d«      Z	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zdd„Zy)zñInteractive model picker used after OAuth login.

Re-exported from ``hermes_cli/auth.py`` (patch targets unchanged); origin helpers are imported
lazily per function so ``hermes_cli.auth.<helper>`` patches still intercept and no cycle forms.
é    )ÚannotationsN)ÚDictÚListÚOptional)ÚDEFAULT_NOUS_PORTAL_URLzhermes_cli.authzEnter custom model namezSkip (keep current)u     â†� currently in useÚ ©ÚproviderÚbase_urlÚapi_keyÚinclude_kindsc               óN  — 	 ddl m}m}  || ||||¬«      }|syt	        «        t	        d«       t	         |«      «       t	        d«       	 t        d«      j                  «       j                  «       }|dv S # t        $ r g }Y Œmw xY w# t        t        f$ r t	        «        Y yw xY w)	z²Prompt before saving a model that trips any selection guard (cost, data-policy, ...).

    Shows one [y/N] confirm listing every warning that fired. Returns True to proceed.
    r   )Úcombined_messageÚselection_warningsr	   TzH========================================================================zSwitch anyway? [y/N]: F>   ÚyÚyes)
Ú!hermes_cli.model_selection_guardsr   r   Ú	ExceptionÚprintÚinputÚstripÚlowerÚKeyboardInterruptÚEOFError)	Úmodel_idr
   r   r   r   r   r   ÚwarningsÚresponses	            úA/home/ubuntu/.hermes/hermes-agent/hermes_cli/auth_model_picker.pyÚ_confirm_selection_guardsr      s«   € ðßZÙ%Ø˜x°(ÀGÐ[hô
ˆñ
 Øä	„GÜ	ˆ(„OÜ	Ñ
˜8Ó
$Ô%Ü	ˆ(„OðÜÐ1Ó2×8Ñ8Ó:×@Ñ@ÓBˆð �|Ð#Ð#øô ò ØŠðûô œxÐ(ò ÜŒÙðús#   ‚A7 Á'B Á7BÂBÂB$Â#B$c                  óL   — e Zd ZdZddœ	 	 	 	 	 	 	 	 	 	 	 dd„Zd	d„Zd
d„Zdd„Zy)Ú_ModelPickerRowsuÎ   Column-aligned picker rows (name + $/Mtok + Nous sale chrome).

    Sale chrome is emitted as styled segments, not ANSI baked into one string â€” curses addnstr
    would render escape bytes literally.
    N)Únotesc               ó<  ‡‡— ddl mŠm} || _        |xs i | _        t        ‰xr t        ˆfd„|D «       «      «      | _        |rdnd}| j                  rt        d„ |D «       d¬«      |z   nd| _	        i | _
        d| _        d| _        d| _        d| _        | j                  sy dˆfd	„}|D �]F  }	‰j                  |	«      }
d }d
x}}d\  }}}|
r½ ‰|
j                  dd
«      «      } ‰|
j                  dd
«      «      }|
j                  dd
«      }|r ‰|«      nd
}|rd| _        |r9 ||
j                  dd
«      |
j                  dd
«      |
j                  d«      «      nd }|�'d| _        |\  }}}|d
k7  s|d
k7  r ||«       ||«      }}||||||f| j                  |	<   t        | j                  t!        |«      t!        |«      «      | _        t        | j                  t!        |«      «      | _        �ŒI | j                  rt        | j                  d«      | _        y y )Nr   )Ú_format_price_per_mtokÚcompute_sale_discountc              3  ó@   •K  — | ]  }‰j                  |«      –— Œ y ­w©N)Úget)Ú.0ÚmÚpricings     €r   ú	<genexpr>z,_ModelPickerRows.__init__.<locals>.<genexpr>B   s   øè ø€ Ò/SÀ1°·±¸A·Ñ/Sùs   ƒé   é   c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr'   )Úlen)r)   r*   s     r   r,   z,_ModelPickerRows.__init__.<locals>.<genexpr>E   s   è ø€ Ò8¨œS ŸVÑ8ùs   ‚)ÚdefaultFc                ó"   •— | dk7  r ‰| «      S dS )Nr   ú?© )Úrawr$   s    €r   Ú_wasz'_ModelPickerRows.__init__.<locals>._wasO   s   ø€ Ø25¸²)Ñ)¨#Ó.ÐDÀÐDó    r   )r   r   r   ÚpromptÚ
completionÚinput_cache_readTÚoriginalé   )r5   ÚstrÚreturnr=   )Úhermes_cli.models_pricingr$   r%   Úcurrent_modelr"   ÚboolÚanyÚhas_pricingÚmaxÚname_colÚ_price_cacheÚ	price_colÚ	cache_colÚ	has_cacheÚany_on_saler(   r0   )ÚselfÚ
all_modelsr+   r@   Úsale_chromer"   r%   Úname_padr6   ÚmidÚpÚpctÚwas_inpÚwas_outÚinpÚoutÚcacheÚ
cache_readÚsaleÚwas_prompt_rawÚwas_out_rawr$   s     `                  @r   Ú__init__z_ModelPickerRows.__init__:   s  ù€ ÷ 	\Ø*ˆÔà’[˜bˆŒ
Ü Ò S¬CÓ/SÈ
Ô/SÓ,SÓTˆÔá#‘1¨ˆØSW×ScÒScœÑ8¨ZÔ8À!ÔDÀxÒOÐijˆŒàSUˆÔØˆŒØˆŒØˆŒØ ˆÔØ×ÒØõ	Eð ó 	=ˆCØ—‘˜CÓ ˆAØ"ˆCØ "Ð"ˆG�gØ(‰OˆC��eÙÙ,¨Q¯U©U°8¸RÓ-@ÓA�Ù,¨Q¯U©U°<ÀÓ-DÓE�ØŸU™UÐ#5°rÓ:�
Ù>HÑ.¨zÔ:Èb�ÙØ%)�D”NÙq|Ñ,¨Q¯U©U°8¸RÓ-@À!Ç%Á%ÈÐVXÓBYÐ[\×[`Ñ[`ÐakÓ[lÔmð  CG�ØÐ#Ø'+�DÔ$Ø7;Ñ4�C˜¨ð &¨Ò+¨{¸bÒ/@Ù+/°Ó+?ÁÀkÓAR ˜Ø&)¨3°°s¸GÀWÐ%MˆD×Ñ˜cÑ"Ü  §¡´°S³¼3¸s»8ÓDˆDŒNÜ  §¡´°U³Ó<ˆDŽNð-	=ð. �>Š>Ü  §¡°Ó3ˆD�Nð r7   c                ó¨  — || j                   k(  r	t        dfgng }| j                  j                  |«      rd| j                  |   › �dfgng }| j                  s	|dfg|¢|¢S | j
                  j                  |d«      \  }}}}}}	|du}
|
rd|d| j                  dz
  › d�›dfg}n|d| j                  › d�›dfg}d	|d
| j                  › d�›d|d
| j                  › d�›�}| j                  r|d|d
| j                  › d�›�z  }|j                  |df«       |
r4|j                  d|› d�df«       |s|	r|j                  d|› d|	› �df«       ||z   |z   S )uA   Build a rich radiolist row: yellow â˜…/% , dim was, plain prices.Nu     Â· Údim)r   r   r   Nr   r   )u   â˜… Úyellowú<r.   r   ú ú>ú  z  -ú%r^   z  was ú/)r@   Ú_CURRENT_SUFFIXr"   r(   rC   rF   rE   rG   rI   rH   Úappend)rK   rO   ÚcurrentÚnoterT   rU   rV   rQ   rR   rS   Úon_saleÚsegsÚ
price_parts                r   Úsegmentsz_ModelPickerRows.segmentsl   s§  € à/2°d×6HÑ6HÒ/H”O TÐ*Ñ+ÈbˆØ7;·z±z·~±~ÀcÔ7J�5˜Ÿ™ C™Ð)Ð*¨EÐ2Ñ3ÐPRˆØ×ÒØ˜$�KÐ1 $Ð1¨Ð1Ð1à15×1BÑ1B×1FÑ1FÀsÐLfÓ1gÑ.ˆˆS�%˜˜g wØ˜T�/ˆáØ2DÈ#ÈaÐPT×P]ÑP]Ð`aÑPaÐObÐbbÐMbÐIcÐfjÐFkÐ1l‰Dà˜A˜dŸm™m˜_¨@Ð,Ð-°Ð5Ð6ˆDà˜˜Q˜tŸ~™~Ð.¨`Ð.Ð/¨r°#°a¸¿¹Ð7GÀpÐ5GÐ1HÐIˆ
Ø�>Š>Ø˜B˜u Q t§~¡~Ð&6°`Ð$6Ð7Ð8Ñ8ˆJØ�‰�Z Ð&Ô'ÙØ�K‰K˜3˜s˜e 1˜ xÐ0Ô1Ù™'Ø—‘˜v g Y¨a°¨yÐ9¸5ÐAÔBØ�d‰{˜WÑ$Ð$r7   c                óP   — dj                  d„ | j                  |«      D «       «      S )Nr   c              3  ó&   K  — | ]	  \  }}|–— Œ y ­wr'   r4   )r)   ÚtextÚ_styles      r   r,   z)_ModelPickerRows.label.<locals>.<genexpr>†   s   è ø€ ÒC¡  f”tÑCùs   ‚)Újoinrl   )rK   rO   s     r   Úlabelz_ModelPickerRows.label…   s    € Ø�w‰wÑC°·±¸cÓ0BÔCÓCÐCr7   c           
     ó  — d}| j                   rxd}d|› dd| j                  › d�›ddd| j                  › d�›dd	d| j                  › d�›�}| j                  r|dd
d| j                  › d�›�z  }||dz   z  }| j
                  r|dz  }|S )zJ``Select default model:`` plus an aligned pricing header hint when priced.úSelect default model:z     ú
r   ra   r`   ÚInrb   ÚOutÚCachez  $/Mtoku     â˜… = on sale)rC   rE   rG   rI   rH   rJ   )rK   ÚtitleÚpadÚheaders       r   Ú
menu_titlez_ModelPickerRows.menu_titleˆ   s»   € à'ˆØ×Òð ˆCØ˜#˜˜r ! D§M¡M ?° Ð!2Ð3°1°T¸!¸D¿N¹NÐ;KÈ0Ð9KÐ4LÈBÈuÐUVÐW[×WeÑWeÐVfÐffÐTfÐNgÐhˆFØ�~Š~Ø˜B˜w q¨¯©Ð(8¸ Ð&8Ð9Ð:Ñ:�à�V˜jÑ(Ñ(ˆEØ×ÒØÐ*Ñ*�Øˆr7   )rL   ú	List[str]r+   ú#Optional[Dict[str, Dict[str, str]]]r@   r=   rM   rA   r"   úOptional[Dict[str, str]]r>   ÚNone)rO   r=   r>   zlist[tuple[str, str | None]])rO   r=   r>   r=   )r>   r=   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r[   rl   rr   r|   r4   r7   r   r!   r!   3   sV   „ ñð RVñ04Ø#ð04Ø.Qð04àð04à)-ð04à6Nð04ð 
ó04ód%ó2Dôr7   r!   c
                óŽ  ‡‡‡‡$‡%‡&— ddl mŠ% |xs g }
‰xs dj                  «       j                  «       dk(  }d(ˆˆˆfd„Š$d)ˆ$ˆ%fd„}t	        t
        j                  |r|| v r|gng t	        | «      z   «      «      }t        |t	        |
«      z   ||||	¬«      Š&d}d	}‰&j                  «       }|xs t        j                  d
«      }t        |«      }	 ddlm} |D �cg c]  }‰&j                  |«      ‘Œ c}t        t         gz   }|j                  «       }|s|
rd|› d�}‰&j"                  r#|j%                  dd«      d   j'                  «       ng }|
r/|j)                  ˆ&fd„|
D «       «       |j+                  d|› d�«       ddlm} g }|D ]8  }‰&j1                  |«       ||«      }}|j+                  ||k(  r|n|› d|› �«       Œ: |t        t         gz  } |d|dd|rdj3                  |«      ndd|¬«      }|dk  ryt5        «        ||k  r ‰$||   «      S ||k(  r |«       S yc c}w # t6        t8        t:        t<        j>                  f$ r Y nw xY wddlm } ddl!m"}m#} |j'                  «       D ]5  } t5        d| v r$| jI                  d |d|jJ                  «      d«      n| «       Œ7 t        tM        |dz   «      «      }!tO        |d«      D ]0  \  }"}t5        d|"d|!› d�›d  |‰&j                  |«      «      › �«       Œ2 t5        d|dz   d|!› d�›d t        › �«       t5        d|dz   d|!› d�›d t         › �«       |
rf|j                  «       xs d!|› d"�}t5        «        t5        d|› d#|› d|› �«       |
D ]+  }t5        ddd|!› d�›d|› ‰&j1                  |«      › |› �«       Œ- t5        «        	 	 tQ        d$|dz   › d%�«      j                  «       }#|#sytS        |#«      }d|cxk  r|k  rn n ‰$||dz
     «      S ||dz   k(  r |«       S ||dz   k(  ryt5        d&|dz   › �«       n*# tT        $ r t5        d'«       Y ntV        tX        f$ r Y yw xY wŒ )*a'  Interactive model picker; current_model listed first. Returns the chosen model ID or None.

    With *pricing* (``{model_id: {prompt, completion}}``) a compact price column is shown; models in
    *unavailable_models* render grayed out and unselectable with an upgrade link to *portal_url*.
    r   )Ú
line_inputr   Únousc                ó@   •— | sy t        | ‰‰‰‰rd ndg¬«      }|r| S d S )NÚdata_policyr	   )r   )rO   ÚokÚconfirm_api_keyÚconfirm_base_urlÚconfirm_providers     €€€r   Ú_confirmed_selectionz5_prompt_model_selection.<locals>._confirmed_selectionª   s6   ø€ ÙØä&ØÐ*Ð5EÈÙ"2™$¸¸ô
ˆñ ˆsÐ"˜dÐ"r7   c                 ót   •— 	  ‰d«      j                  «       } | r ‰| «      S d S # t        t        f$ r Y y w xY w)NzEnter model name: )r   r   r   )ÚcustomrŽ   r†   s    €€r   Ú_custom_selectionz2_prompt_model_selection.<locals>._custom_selection´   sK   ø€ ð	ÙÐ 4Ó5×;Ñ;Ó=ˆFñ 06Ñ# FÓ+Ð?¸4Ð?øô Ô+Ð,ò 	Ùð	ús   ƒ% ¥7¶7)r@   rM   r"   z[2mz[0mrd   )Úcurses_radiolistzUpgrade at z for paid modelsru   é   c              3  óF   •K  — | ]  }d ‰j                  |«      › �–— Œ y­w)z   N)rr   )r)   rO   Úrowss     €r   r,   z*_prompt_model_selection.<locals>.<genexpr>Õ   s!   øè ø€ ÒN¸#  D§J¡J¨s£OÐ#4Ô5ÑNùs   ƒ!u	     â”€â”€ u    â”€â”€)Úmodel_search_textr`   rt   éÿÿÿÿNT)ÚselectedÚcancel_returnsÚdescriptionÚ
searchableÚsearch_labels)Úformat_radio_item_ansi)ÚColorsÚcoloru   â˜…r.   rb   ra   z. u6   Unavailable models (requires paid tier â€” upgrade at ú)u   â”€â”€ z
Choice [1-z] (default: skip): zPlease enter 1-zPlease enter a number)rO   r=   r>   úOptional[str])r>   r¡   )-Úhermes_cli.cli_outputr†   r   r   ÚlistÚdictÚfromkeysr!   r|   r   Úrstripr0   Úhermes_cli.curses_uir’   rl   Ú_CUSTOM_LABELÚ_SKIP_LABELrC   ÚsplitÚ
splitlinesÚextendrf   Úhermes_cli.model_searchr–   rr   rq   r   ÚImportErrorÚNotImplementedErrorÚOSErrorÚ
subprocessÚSubprocessErrorr�   Úhermes_cli.colorsrž   rŸ   ÚreplaceÚYELLOWr=   Ú	enumerater   ÚintÚ
ValueErrorr   r   )'Ú	model_idsr@   r+   Úunavailable_modelsÚ
portal_urlÚunavailable_messager�   rŒ   r‹   r"   Ú_unavailablerM   r‘   ÚorderedÚ_DIMÚ_RESETr|   Ú_upgrade_urlÚnr’   rO   ÚchoicesÚunavailable_footerÚ
desc_linesr–   Úmodel_search_labelsrr   ÚhaystackÚidxr�   rž   rŸ   ÚlineÚ	num_widthÚiÚchoicerŽ   r†   r•   s'         ```                           @@@r   Ú_prompt_model_selectionrÍ   ™   s®  ý€ õ 1Ø%Ò+¨€Là#Ò) r×0Ñ0Ó2×8Ñ8Ó:¸fÑD€K÷#ö@ô ”4—=‘=Ù)¨m¸yÑ.Hˆ-‰ÈbÔTXÐYbÓTcÑcóó €Gô
 ˜G¤d¨<Ó&8Ñ8¸'ÐQ^Ðlwð  @Eô  F€DØ€DØ€Fà—‘Ó"€JØÒ9Ô"9×AÑAÀ#ÓF€LÜˆG‹€Að)Ý9Ø18Ö9¨#�4—=‘= Õ%Ò9¼]ÌKÐ<XÑXˆà0×6Ñ6Ó8ÐÙ!¡lØ#.¨|¨nÐ<LÐ!MÐð NR×M]ÒM] 
× 0Ñ 0°°qÓ 9¸!Ñ <× GÑ GÔ IÐceˆ
ÙØ×ÑÓNÀÔNÔNØ×Ñ 	Ð*<Ð)=¸WÐEÔFõ 	>Ø ÐØò 	\ˆCØ"Ÿj™j¨›oÑ/@ÀÓ/E�8ˆEØ×&Ñ&°¸C²¡uÈÀwÈaÐPXÈzÐEZÕ[ð	\ð 	¤¬{Ð;Ñ;ÐáØ#ØØØÙ1;˜Ÿ	™	 *Ô-ÀØØ-ô
ˆð �Š7ØÜŒØ�Š7Ù'¨°©Ó5Ð5Ø�!Š8Ù$Ó&Ð&ØùòK :øôL Ô,¬g´z×7QÑ7QÐRò Ùðúõ <ß/Ø×%Ñ%Ó'ò ^ˆÜÀUÈdÁ]ˆd�l‰l˜5¡%¨¨v¯}©}Ó"=¸qÔAÐX\Õ]ð^ä”C˜˜A™“J“€IÜ˜G QÓ'ò S‰ˆˆ3Ü��1�Q�y�k �MÐ" "Ñ%;¸D¿M¹MÈ#Ó<NÓ%OÐ$PÐQÕRðSä	ˆBˆq�1‰u�Q�y�k �MÐ" "¤] OÐ
4Ô5Ü	ˆBˆq�1‰u�Q�y�k �MÐ" "¤[ MÐ
2Ô3áØ0×6Ñ6Ó8ò 
ØDÀ\ÀNÐRSÐTð 	ô 	ŒÜ��4�&˜Ð 2Ð3°7¸6¸(ÐCÔDØò 	KˆCÜ�B�r˜!˜I˜; `˜Ð' r¨$¨°·
±
¸3³Ð/@ÀÀÐIÕJð	Kä	„Gà
ð	Ü˜Z¨¨A© wÐ.AÐBÓC×IÑIÓKˆFÙØÜ�f“+ˆCØ�CŒ}˜1�}Ù+¨G°C¸!±GÑ,<Ó=Ð=Ø�a˜!‘eŠ|Ù(Ó*Ð*Ø�a˜!‘eŠ|ØÜ�O A¨¡E 7Ð+Õ,øÜò 	+ÜÐ)Ö*Ü!¤8Ð,ò 	Ùð	úð sa   Ã
H% ÃH Ã1DH% Ç9H% ÈH% È H% È%#IÉ
IÎ("P Ï&P Ï2P ÐP Ð
P ÐQÐ2QÑQc                ó�   — ddl m}m}  |«       }t        |j	                  d«      t
        «      r	| |d   d<   nd| i|d<    ||«       y)ub   Save the selected model to config.yaml only â€” NOT .env, which would stomp in multi-agent setups.r   )Úsave_configÚload_configÚmodelr1   N)Úhermes_cli.configrÏ   rÐ   Ú
isinstancer(   r¤   )r   rÏ   rÐ   Úconfigs       r   Ú_save_model_choicerÕ     sC   € ç:Ù‹]€Fä�&—*‘*˜WÓ%¤tÔ,Ø%-ˆˆw‰˜	Ò"à$ hÐ/ˆˆw‰Ù�Õr7   )r   r=   r
   r=   r   r=   r   r=   r   úOptional[List[str]]r>   rA   )	r   NNr   r   r   r   r   N)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„   Ú
__future__r   Úloggingr±   Útypingr   r   r   Úhermes_cli.auth_constantsr   Ú	getLoggerÚloggerr¨   r©   re   r   r!   rÍ   rÕ   r4   r7   r   ú<module>rÝ      s$  ðñõ #ã Û ß 'Ñ 'Ý =à	ˆ×	Ñ	Ð,Ó	-€à)€Ø#€Ø*€ð ')¸"ÈRØ)-ñ$Øð$Ø #ð$Ø47ð$ØGJð$à&ð$ð 
ó$÷<cñ cðN 02Ø37ØFHØWYØAEðAØðAØ),ðAà0ðAð ,ðAð ADðAð ð	Að 69ð	Að RUð	Að
 ðAð
 '?ðAð óAôH	r7   