
    |+j{                       d Z ddlmZ ddlZddlZddlZddlmZ ddlZddl	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZ ddlmZ ddlm Z  ddl!m"Z" h d	Z#d.dZ$d/dZ%d0dZ&d0dZ'd1dZ(d2dZ)d3dZ*d4dZ+d5dZ,d6dZ-d6dZ.d6d Z/d6d!Z0d6d"Z1d6d#Z2d6d$Z3d6d%Z4d7d8d(Z5d6d)Z6d6d*Z7d6d+Z8d6d,Z9d6d-Z:dS )9z!Credential-pool auth subcommands.    )annotationsN)SimpleNamespace)AUTH_TYPE_API_KEYAUTH_TYPE_OAUTHCUSTOM_POOL_PREFIXSOURCE_MANUALSOURCE_MANUAL_DEVICE_CODESTATUS_EXHAUSTEDSTRATEGY_FILL_FIRSTSTRATEGY_ROUND_ROBINSTRATEGY_RANDOMSTRATEGY_LEAST_USEDPooledCredential_exhausted_until_normalize_custom_pool_nameget_pool_strategylabel_from_tokenlist_custom_pool_providers	load_pool)PROVIDER_REGISTRY)OPENROUTER_BASE_URL)masked_secret_prompt>   nous	anthropic	xai-oauth
qwen-oauthopenai-codexminimax-oauthgoogle-gemini-clireturnlistc                    	 ddl m} m}  |            }n# t          $ r g cY S w xY wg } | |          D ]}t	          |t
                    s|                    d          }t	          |t                    r|                                sWt           t          |           }t          |                    dd          pd                                          }|                    |                                ||f           |S )z=Return list of (display_name, pool_key, provider_key) tuples.r   )get_compatible_custom_providersload_confignameprovider_key )hermes_cli.configr#   r$   	Exception
isinstancedictgetstrstripr   r   append)r#   r$   configresultentryr%   pool_keyr&   s           7/usr/local/lib/hermes-agent/hermes_cli/auth_commands.py_get_custom_provider_namesr5   (   s'   RRRRRRRR   			F0088 > >%&& 	yy  $$$ 	DJJLL 	(M*Ed*K*KMM599^R88>B??EEGGtzz||X|<====Ms    $$rawr-   
str | Nonec                v   | pd                                                                                     dd          }|sdS |                    t                    r|S t                      D ]M\  }}}t          |          |k    r|c S |r.|                                                                 |k    r|c S NdS )z[If raw input matches a custom_providers entry name (case-insensitive), return its pool key.r'    -N)r.   lowerreplace
startswithr   r5   r   )r6   
normalizeddisplay_namer3   r&   s        r4   _resolve_custom_provider_inputr@   =   s    )""$$**,,44S#>>J t/00 0J0L0L  ,h&|44
BBOOO 	L..006688JFFOOO4    providerc                    | pd                                                                 }|dv rdS |dv rdS t          |          }|r|S |S )Nr'   >   open-routeror
openrouter>   
grok-oauth
x-ai-oauthxai-grok-oauthr   r   )r.   r;   r@   )rB   r>   
custom_keys      r4   _normalize_providerrK   M   sf    .b''))//11J***|PPP{/
;;J rA   c                $   | dk    rt           S |                     t                    rKddlm}  ||           }|r6t          |                    d          pd                                          S dS t          j        |           }|r|j	        ndS )NrF   r   )_get_custom_provider_configbase_urlr'   )
r   r=   r   agent.credential_poolrM   r-   r,   r.   r   inference_base_url)rB   rM   	cp_configpconfigs       r4   _provider_base_urlrS   Z   s    <""-.. EEEEEE//99	 	@y}}Z006B77==???r#H--G)087%%b8rA   countintc                    |  d| S )Nz-oauth- )rB   rT   s     r4   _oauth_default_labelrX   h   s    &&u&&&rA   c                    d|  S )Nzapi-key-rW   )rT   s    r4   _api_key_default_labelrZ   l   s    erA   sourcec                h    |                      d          r|                     dd          d         n| S )Nzmanual::   )r=   split)r[   s    r4   _display_sourcer`   p   s3    &,&7&7	&B&BN6<<Q""NrA   tuple[str, bool]c                0   t          | dd           }t          t          | dd          pd                                                                          t          t          | dd          pd                                                                          |dk    s6t	          fddD                       st	          fdd	D                       rd
S |dv s6t	          fddD                       st	          fddD                       rdS dS )Nlast_error_codelast_error_reasonr'   last_error_messagei  c              3      K   | ]}|v V  	d S NrW   .0tokenreasons     r4   	<genexpr>z-_classify_exhausted_status.<locals>.<genexpr>y   s'      kke%6/kkkkkkrA   )
rate_limitusage_limitquota	exhaustedc              3      K   | ]}|v V  	d S rg   rW   ri   rj   messages     r4   rl   z-_classify_exhausted_status.<locals>.<genexpr>y   sA       s s"s s s s s srA   )z
rate limitzusage limitro   ztoo many requests)zrate-limitedT>       c              3      K   | ]}|v V  	d S rg   rW   rh   s     r4   rl   z-_classify_exhausted_status.<locals>.<genexpr>~   s?        !G  !GU&  !G  !G  !G  !G  !G  !GrA   )invalid_tokeninvalid_grantunauthorized	forbiddenauthc              3      K   | ]}|v V  	d S rg   rW   rr   s     r4   rl   z-_classify_exhausted_status.<locals>.<genexpr>~   sA       N N"N N N N N NrA   )ry   rz   expiredrevokedzinvalid tokenauthentication)zauth failedF)rp   T)getattrr-   r.   r;   any)r2   coders   rk   s     @@r4   _classify_exhausted_statusr   t   s   5+T22D 3R88>B??EEGGMMOOF'%!5r::@bAAGGIIOOQQGs{{ckkkk7jkkkkk{or s s s s&as s s p p{ $#zS  !G  !G  !G  !G  ?F  !G  !G  !G  G  G  KN N N N N&|N N N K K $#rA   c           
        | j         t          k    rdS t          |           \  }}t          | dd           }t	          |t
                    r|                                rd| nd}| j        rd| j         dnd}|s
d| | | dS t          |           }|	d| | | S t          dt          t          j        |t          j                    z
                                }|dk    r
d| | | dS t          |d	          \  }}	t          |d	          \  }
}t          |
d
          \  }}
|r	| d|
 d}n|
r	|
 d| d}n|r	| d|	 d}n|	 d}d| | | d| dS )Nr'   rd   r9    ()z (re-auth may be required)r   z (ready to retry)<      zd hzh mzm sz left))last_statusr
   r   r   r*   r-   r.   rc   r   maxrU   mathceiltimedivmod)r2   labelshow_retry_windowrk   reason_textr   exhausted_until	remainingminutessecondshoursdayswaits                r4   _format_exhausted_statusr      s   ,,,r9%@@EU/66F",VS"9"9TfllnnT,f,,,RTK,1,AI(%((((rD HG5G+GtGGGG&u--O-5-+-t---As49_ty{{%BCCDDEEIA~~>5>+>t>>>>i,,GWGR((NE7##KD% ""%"""	 %%7%%%	 ''W'''}}}7u7k747747777rA   Nonec                   t          t          | dd                    }|t          vr2|dk    r,|                    t                    st          d|           t          t          | dd          pd                                                                          }|t          dhv rt          }|s9|                    t                    rt          }n|t          v rt          nt          }t          |          }|                    t                    sl	 ddlm}m}  |                                d	i           }t#          |                    |g           pg           D ]} |||           n# t$          $ r Y nw xY w|t          k    rt          | d
d           pd                                }|s!t'          d                                          }|st          d          t)          t+          |                                          dz             }	t          | dd           pd                                }
|
sHt.          j                                        r(t5          d|	 d                                          p|	}
n|	}
t7          |t9          j                    j        d d         |
t          dt>          |tA          |                    }|!                    |           tE          d| dt+          |                                           d|
 d           d S |dk    rgddl#m$} |%                                }|st          d          t          | dd           pd                                pEtM          |d         tO          |t+          |                                          dz                       }
t7          |t9          j                    j        d d         |
t          dt>           d|d         |                    d          |                    d          tA          |          
  
        }|!                    |           tE          d| dt+          |                                           d|j(         d           d S |d k    rtS          j*                    }|r	 tS          j+                    }n# tX          $ r d }Y nw xY wtE                       |rtE          d!|            ntE          d"           	 t5          d#                                                                          }n# tZ          t\          f$ r d$}Y nw xY w|d%v rtE          d&           tS          j/        t          | d'd           pd()          }|t          | dd           pd                                pd }tS          j0        ||*          }||j(        n1tM          |                    dd          tO          |d                    }tE          d+| d,| d           d S tE          d-           tS          j1        t          | d.d           t          | d/d           t          | d0d           t          | d1d           t          | d2d3           t          | d'd           pd(te          t          | d4d3                    t          | d5d           6          }t          | dd           pd                                pd }tS          j0        ||*          }||j(        n1tM          |                    dd          tO          |d                    }tE          d7| d8| d           d S |d9k    rtS          j3                    }t          | dd           pd                                pKtM          |d:         d         tO          |t+          |                                          dz                       }
t7          |t9          j                    j        d d         |
t          dth          |d:         d         |d:                             d          |                    d;          |                    d<          =
  
        }|                                 }|!                    |           |rtS          j5        |           tE          d| dt+          |                                           d|j(         d           d S |d>k    r2tS          j6        t          | d'd           pd?t          | d2d3           te          t          | d@d3                    A          }tS          j7        |d:         |                    dB          |                    dCd          |                    d<          D           t          |          }tq          dE |                                D             d           }||j(        n)tM          |d:         d         tO          |d                    }tE          d7| d,| d           d S |dFk    r?ddGl9m:}  |            }tS          j;        |           t          | dd           pd                                pF|                    dH          p1tO          |t+          |                                          dz             }
t7          |t9          j                    j        d d         |
t          dt>           dI|d         |                    d          J          }|!                    |           tE          d| dt+          |                                           d|j(         d           d S |dKk    rCtS          j<        d3L          }tS          j=        |           t          | dd           pd                                pEtM          |d
         tO          |t+          |                                          dz                       }
t7          |t9          j                    j        d d         |
t          dt>           dM|d
         |                    d;                    }|!                    |           tE          d| dt+          |                                           d|j(         d           d S |dNk    retS          j>        t          | d2d3           t          | d'd           pd(O          }t          | dd           pd                                pEtM          |d         tO          |t+          |                                          dz                       }
t7          |t9          j                    j        d d         |
t          dt>           dP|d         |                    d          |                    dQ          R	  	        }|!                    |           tE          d| dt+          |                                           d|j(         d           d S t          dS| dT| dU          )VNrB   r'   rF   Unknown provider: 	auth_typezapi-keyr   )_load_auth_storeunsuppress_credential_sourcesuppressed_sourcesapi_keyzPaste your API key: zNo API key provided.r^   r   zLabel (optional, default: z):    )rB   idr   r   priorityr[   access_tokenrN   zAdded  credential #z: ""r   )anthropic_adapterz1Anthropic OAuth login did not return credentials.r   z:hermes_pkcerefresh_tokenexpires_at_ms)
rB   r   r   r   r   r[   r   r   r   rN   z OAuth credential #r   z)Found existing Nous OAuth credentials at z,Found existing shared Nous OAuth credentialsz!Import these credentials? [Y/n]: y>   r'   r   yesz3Rehydrating Nous session from shared credentials...timeoutg      .@)timeout_seconds)r   z	Imported z OAuth credentials: "uK   Could not refresh shared credentials — falling back to device-code login.
portal_urlinference_url	client_idscope
no_browserFinsecure	ca_bundle)portal_base_urlrP   r   r   open_browserr   r   r   zSaved z! OAuth device-code credentials: "r   tokensrN   last_refresh)
rB   r   r   r   r   r[   r   r   rN   r   r   g      4@manual_paste)r   r   r   	discoveryredirect_uri)r   r   r   c              3  D   K   | ]}t          |d d          dk    |V  dS )r[   r'   loopback_pkceN)r   )ri   es     r4   rl   z#auth_add_command.<locals>.<genexpr>h  s8      __A71h3K3K3^3^a3^3^3^3^__rA   r   )run_gemini_oauth_login_pureemailz:google_pkce)rB   r   r   r   r   r[   r   r   r   )refresh_if_expiringz	:qwen_clir   )r   r   z:minimax_oauthrP   )	rB   r   r   r   r   r[   r   r   rN   z`hermes auth add z#` is not implemented for auth type z yet.)?rK   r   r   r=   r   
SystemExitr-   r.   r;   r   _OAUTH_CAPABLE_PROVIDERSr   r   hermes_cli.authr   r   r,   r!   r)   r   rZ   lenentriessysstdinisattyinputr   uuiduuid4hexr   rS   	add_entryprintagentr   run_hermes_oauth_login_purer   rX   r   auth_mod_read_shared_nous_state_nous_shared_store_pathRuntimeErrorEOFErrorKeyboardInterrupt_try_import_shared_nous_statepersist_nous_credentials_nous_device_code_loginbool_codex_device_code_loginr	   mark_provider_active_if_unset_xai_oauth_loopback_login_save_xai_oauth_tokensnextagent.google_oauthr   _mark_google_gemini_cli_active resolve_qwen_runtime_credentials_mark_qwen_oauth_active_minimax_oauth_login)argsrB   requested_typepoolr   r   
suppressedsrcrj   default_labelr   r2   anthropic_modcredssharedpath	do_import
rehydratedcustom_labelshown_labelfirst_credentialr   s                         r4   auth_add_commandr      s   "74R#@#@AAH(((X-E-EhNaNabtNuNu-E8h88999{B77=2>>DDFFLLNNN+Y777* l122 	l.NN08<T0T0T__ZkNXD 122 
		        *)++//0DbIIJJNN8R88>B?? < <,,Xs;;;;< 	 	 	D	 ***y$//52<<>> 	I()?@@FFHHE 	53444.s4<<>>/B/BQ/FGGw--3::<< 	&y!! &M=MMMNNTTVVgZg% z||#' '11	
 	
 	
 	uNxNNc$,,...A.ANNeNNNOOO;<<<<<<99;; 	RPQQQw--3::<< 
@P.! 3t||~~+>+>+BCCA
 A
 !z||#%#111~.))O44))O44'11
 
 
 	uZxZZC4G4GZZEKZZZ[[[6 133 	e799   GGG FH$HHIIIIDEEE !"EFFLLNNTTVV		/0      			 ,,,KLLL%C$+D)T$B$B$Jd  
 )$+D'4$@$@$FB#M#M#O#O#WSWL$=jP\]]]E161B%++HX"~r::<PQY[\<]<]I IK ShSS[SSSTTTF cddd0#D,==&t_dCCdK66$..$T<???#D)T::Bd'$
E::;;dK66	
 	
 	
  gt44:AACCKt1%|LLL%*%6ekk<LIInb))+?!+L+L=
 =
 	PxPP+PPPQQQ>!!133w--3::<< 
@P(ON+ 3t||~~+>+>+BCCA
 A
 !z||#%,x8/--o>>YYz**>22
 
 
  $||~~-u  	=28<<<ZxZZC4G4GZZEKZZZ[[[;2#D)T::Bd$T<???gdNEBBCC
 
 

 	'(Oii,,>266>22		
 	
 	
 	
 ""_____aeff%*%6ekk<L(ON+-A(A-N-N=
 =
 	DxDDkDDDEEE&&&BBBBBB++--/666w--3::<< 
IIgY"6xT\\^^ATATWXAX"Y"Y 	 !z||#%#111~.))O44	
 	
 	
 	uZxZZC4G4GZZEKZZZ[[[<9eTTT(///w--3::<< 
@P) 3t||~~+>+>+BCCA
 A
 !z||#%#...y)YYz**	
 	
 	
 	uZxZZC4G4GZZEKZZZ[[[?""-$T<???#D)T::Bd
 
 
 w--3::<< 
@P.! 3t||~~+>+>+BCCA
 A
 !z||#%#333~.))O44YY344

 

 

 	uZxZZC4G4GZZEKZZZ[[[
kkkVdkkk
l
lls7   AE0 0
E=<E=,S   SS3T9 9UUc                   t          t          | dd          pd          }|r|g}n2t          h t          j                    dt                                }|D ]}t          |          }|                                }|s(|                                }t          | dt          |           d           t          |d          D ]|\  }}d}	||j        |j        k    rd	}	t          |          }
t          |j                  }t          d
| d|j        dd|j        dd| |
 d|	                                            }t                       d S )NrB   r'   rF   r   z credentials):r^   )start  u   ←   #z<20r9   z<7)rK   r   sortedr   keysr   r   r   peekr   r   	enumerater   r   r`   r[   r   r   rstrip)r   provider_filter	providersrB   r   r   currentidxr2   markerstatusr[   s               r4   auth_list_commandr	    s   )'$
B*G*G*M2NNO $%		 
#%%

 ())
  	
   "",,.. 	))++99S\\999:::#G1555 	j 	jJCF"ux7:'='=-e44F$U\22F___u{______f_f__W]__ffhhiiii rA   c           	        t          t          | dd                    }t          | dd           }|t          | dd           }t          |          }|                    |          \  }}}||t	          | d| d          |                    |          }|t	          d| d| d          t          d	| d
| d|j         d           ddlm	} ddl
m}	  |||j                  }
|
d S |
                    ||          }|j        D ]}t          |           |j        r |	||j                   |j        D ]}t          |           d S )NrB   r'   targetindexz Provider: .zNo credential matching "z" for provider zRemoved r   r   r   r   )find_removal_step)suppress_credential_source)rK   r   r   resolve_targetr   remove_indexr   r   agent.credential_sourcesr  r   r  r[   	remove_fncleanedsuppresshints)r   rB   r  r   r  matchederrorremovedr  r  stepr1   lines                r4   auth_remove_commandr    s   "74R#@#@AAHT8T**F~w--XD //77E7E%-E99h999:::&&GVFVV8VVVWWW	
EX
E
EE
E
EW]
E
E
EFFF ;:::::::::::Xw~66D| 	^^Hg..F  d =""8W^<<<  d rA   c                    t          t          | dd                    }t          |          }|                                }t	          d| d| d           d S )NrB   r'   zReset status on r9   z credentials)rK   r   r   reset_statusesr   )r   rB   r   rT   s       r4   auth_reset_commandr    sa    "74R#@#@AAHXD!!E	
;U
;
;X
;
;
;<<<<<rA   c                   t          t          | dd          pd          }|st          d          t          j        |          }|                    d          sA|                    d          }|rt          | d| d           nt          | d           d S t          | d	           d
D ].}|                    |          }|rt          d| d|            /d S )NrB   r'   z<Provider is required. Example: `hermes auth status spotify`.	logged_inr  z: logged out (r   z: logged outz: logged in)r   r   r   r   
expires_atapi_base_urlr   : )rK   r   r   r   get_auth_statusr,   r   )r   rB   r  rk   keyvalues         r4   auth_status_commandr(    s   "74R#@#@#FBGGH YWXXX%h//F::k"" G$$ 	-X66V6667777X+++,,,	X
"
"
"###` ' '

3 	'%s%%e%%&&&' 'rA   c           	     h    t          j        t          t          | dd                                d S )NrB   rB   )r   logout_commandr   r   )r   s    r4   auth_logout_commandr,    s0    OWT:t5T5TUUUVVVVVrA   c                v   t          t          | dd          pd                                                                          }|dv rt	          j        |            d S |dk    rt          t          d                     d S |dk    rt          t          d                     d S t          d	|           )
Nspotify_actionr'   login>   r'   r/  r  spotifyr*  logoutzUnknown Spotify auth action: )
r-   r   r.   r;   r   login_spotify_commandr(  r   r,  r   r   actions     r4   auth_spotify_commandr5    s    /44?@@FFHHNNPPF&t,,,OY???@@@OY???@@@
=V==
>
>>rA   c                 
   t          d           t          d           t          t          d                     	 ddlm} m}m}  |             r |            pd} |            }t          d           t          d	|            t          d
|            	 ddl}|                    d|          }|	                                }|
                    dd          }t          d|            n# t          $ r t          d           Y nw xY wt                       n# t          $ r Y nw xY w	 ddlm}	  |	            }
t          |
t                     r|

                    d          nd}t          |t                     rgt#          |
                    d          pd                                                                          }t#          |
                    d          pd                                                                          }|dk    r|dk    rddlm}m}m}m} t#          |
                    d          pd                                          }|
                    d          pi }t          |t                     si }t#          |
                    d          pd                                          p|}t          d           t          d|pd            t          d|             |            st          d           n ||           } ||d!"          }|
                    d#          pg }|
                    d$          r-|rd%                    |          nd&}t          d'| d(           nR|
                    d)          pd*}t          d+|            |
                    d,          }|rt          d-|            t                       n# t          $ r Y nw xY wt                       g d.}t          d/           t5          |d0          D ]\  }}t          d1| d2|            	 t7          d3                                          }n# t8          t:          f$ r Y dS w xY w|r |t#          t=          |                    k    rdS |d4k    rt?                       dS |d5k    rtA                       dS |d6k    rtC                       dS |d7k    rtE                       dS dS )8zIInteractive credential pool management when `hermes auth` is called bare.zCredential Pool Statusz2==================================================Nr*  r   )has_aws_credentialsresolve_aws_auth_env_varresolve_bedrock_regionunknownz#bedrock (AWS SDK credential chain):z  Auth: z
  Region: sts)region_nameArnz  Identity: u9     Identity: (could not resolve — boto3 STS call failed))r$   modelrB   r'   	auth_modezazure-foundryentra_id)EntraIdentityConfigSCOPE_AI_AZURE_DEFAULTdescribe_active_credentialhas_azure_identity_installedrN   entrar   z#azure-foundry (Microsoft Entra ID):z  Endpoint: z(not configured)z	  Scope: uG     Status: ⚠ azure-identity not installed (pip install azure-identity))r   g      $@)r0   r   env_sourcesok, zdefault chainu     Status: ✓ token acquired (r   r  zcredential chain exhaustedu     Status: ⚠ hintz  Hint: )zAdd a credentialzRemove a credentialzReset cooldowns for a providerz$Set rotation strategy for a providerExitzWhat would you like to do?r^   r   . z	
Choice: 1234)#r   r	  r   agent.bedrock_adapterr7  r8  r9  boto3clientget_caller_identityr,   r)   ImportErrorr(   r$   r*   r+   r-   r.   r;   agent.azure_identity_adapterrA  rB  rC  rD  joinr  r   r   r   r   _interactive_add_interactive_remove_interactive_reset_interactive_strategy)r7  r8  r9  auth_sourceregionrQ  r;  identityarnr$   _cfg
_model_cfg_cfg_provider_cfg_auth_moderA  rB  rC  rD  	_base_url_entra_scope
_entra_cfg_info_env_sources_tag_err_hintchoicesichoicer6   s                                  r4   _interactive_authro  #  s    

"###	(OOOot444555oooooooooo   	2244A	K++--F8999*[**+++'v''(((Tll5fl==2244ll5)44*S**++++ T T TRSSSSSTGGG   -111111{}}*4T4*@*@JTXXg&&&d
j$'' '	
z : : @bAAGGIIOOQQM !<!<!BCCIIKKQQSSN//Nj4P4P             
z : : @bAAGGII	#006B!&$//  F

7++1r2288:: .-  <===FY%D2DFFGGG*&**+++3355 6 9 : : : : "5!4$" " "J 76jZ^___E#(99]#;#;#ArLyy 6:F[tyy666OFtFFFGGGG$yy11Q5Q5t55666 %		& 1 1  6!"4U"4"4555   	GGG  G 

&'''w** " "	6 1    !!!!L!!''))'(     #S\\****
czz			 
s\   AD! AC3 2D! 3DD! DD! !
D.-D.2J9O, ,
O98O9	!Q+ +R ?R Providerpromptc                F   t          t          t          t          j                              dgz                       }t                      }|rWd |D             }t          dd                    |                      t          dd                    |                      n%t          dd                    |                      	 t          |  d          	                                }n## t          t          f$ r t                      w xY wt          |          S )z4Prompt for a provider name with auto-complete hints.rF   c                    g | ]\  }}}|	S rW   rW   )ri   r%   _key_provider_keys       r4   
<listcomp>z"_pick_provider.<locals>.<listcomp>  s    MMM#<4}$MMMrA   z
Known providers: rH  zCustom endpoints: r$  )r   setr!   r   r   r5   r   rV  r   r.   r   r   r   rK   )rq  knowncustom_namescustom_displayr6   s        r4   _pick_providerr{    s!   3t-24455FGGHHE-//L 8MMMMM6DIIe$4$466777>499^#<#<>>????6DIIe$4$466777vMMM""((**'(   lls###s   $C1 1 Dc                 r   t          d          } | t          vr2| dk    r,|                     t                    st	          d|            | t
          v rxt          d|  d           t          d           t          d           	 t          d                                          }n# t          t          f$ r Y d S w xY w|d	k    rd
}nd}nd}d }	 t          d                                          }n# t          t          f$ r Y d S w xY w|r|}t          t          | ||d d d d d dd dd                      d S )NzProvider to add credential forrF   r   
z( supports both API keys and OAuth login.z6  1. API key (paste a key from the provider dashboard)z+  2. OAuth login (authenticate via browser)zType [1/2]: rM  oauthr   z!Label / account name (optional): F)rB   r   r   r   r   r   r   r   r   r   r   r   )r{  r   r=   r   r   r   r   r   r.   r   r   r   r   )rB   type_choicer   r   typed_labels        r4   rW  rW    s   >??H(((X-E-EhNaNabtNuNu-E8h88999 +++E8EEEFFFFGGG;<<<	//5577KK+, 	 	 	FF	#II!II	E?@@FFHH'(    _YeTtt4$$       s$   !B( (B=<B=!C3 3DDc                 *   t          d          } t          |           }|                                st          d|  d           d S t	          |                                d          D ]K\  }}t          |          }t          d| d|j        dd|j        d	d|j	         | d
|j
         d           L	 t          d                                          }n# t          t          f$ r Y d S w xY w|sd S t          t!          | |                     d S )Nz"Provider to remove credential fromzNo credentials for r  r^   r   r   25sr9   10sz [id:]z*Remove #, id, or label (blank to cancel): )rB   r  )r{  r   has_credentialsr   r  r   r   r   r   r[   r   r   r.   r   r   r  r   )rB   r   rm  r   rp   r6   s         r4   rX  rX    sO   BCCHXD!! /H///000 $,,..!,, \ \1,Q//	ZAZZZZZq{ZZZZ9ZZSTSWZZZ[[[[@AAGGII'(    #FFFGGGGGs   7!C C.-C.c                 ^    t          d          } t          t          |                      d S )NzProvider to reset cooldowns forr*  )r{  r  r   r*  s    r4   rY  rY    s/    ?@@H999:::::rA   c                 n   t          d          } t          |           }t          t          t          t
          g}t          d|  d|            t                       t          dt          dt          dt
          di}t          |d          D ]>\  }}||k    rd	nd
}t          d| d|dd|                    |d
           |            ?	 t          d          
                                }n# t          t          f$ r Y d S w xY w|sd S 	 t          |          dz
  }||         }	n'# t          t          f$ r t          d           Y d S w xY wddlm}
m}  |
            }|                    d          pi }t'          |t(                    si }|	|| <   ||d<    ||           t          d|  d|	            d S )NzProvider to set strategy forz
Current strategy for r$  z(Use first key until exhausted, then nextzCycle through keys evenlyzAlways pick the least-used keyzRandom selectionr^   u    ←r'   r   rK  15su    — z
Strategy [1-4]: zInvalid choice.r   )r$   save_configcredential_pool_strategieszSet z strategy to: )r{  r   r   r   r   r   r   r  r,   r   r.   r   r   rU   
ValueError
IndexErrorr(   r$   r  r*   r+   )rB   r  
strategiesdescriptionsrm  r   r  r6   r  strategyr$   r  cfgpool_strategiess                 r4   rZ  rZ    s1   <==H))G%';=PRabJ	
9H
9
9
9
9:::	GGGG9=+	L *a(( G G1<<RE1EEEEEL$4$4Q$;$;EVEEFFFF())//11'(    #hhlc?
#       ;:::::::
+--Cgg:;;ArOot,,  (OH(7C$%K	
3
3
3
3
344444s$   
!C, ,D D	D$ $ EEc                   t          | dd          }|dk    rt          |            d S |dk    rt          |            d S |dk    rt          |            d S |dk    rt	          |            d S |dk    rt          |            d S |dk    rt          |            d S |d	k    rt          |            d S t                       d S )
Nauth_actionr'   addr!   removeresetr  r1  r0  )	r   r   r	  r  r  r(  r,  r5  ro  r3  s     r4   auth_commandr  
  s    T="--F$D!!!4   D!!!D!!!T"""rA   )r    r!   )r6   r-   r    r7   )rB   r-   r    r-   )rB   r-   rT   rU   r    r-   )rT   rU   r    r-   )r[   r-   r    r-   )r    ra   )r    r-   )r    r   )rp  )rq  r-   r    r-   );__doc__
__future__r   r   r   r   typesr   r   rO   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r{   r   r   hermes_constantsr   hermes_cli.secret_promptr   r   r5   r@   rK   rS   rX   rZ   r`   r   r   r   r	  r  r  r(  r,  r5  ro  r{  rW  rX  rY  rZ  r  rW   rA   r4   <module>r     sh   ' ' " " " " " "  



  ! ! ! ! ! !                                      & # " " " " " - - - - - - 0 0 0 0 0 0 9 9 9 9 9 9 B  B  B    *    
 
 
 
9 9 9 9' ' ' '   O O O O   &8 8 8 8:Nm Nm Nm Nmb   6# # # #L= = = =' ' ' '(W W W W? ? ? ?i  i  i  i X$ $ $ $ $"! ! ! !HH H H H,; ; ; ;'5 '5 '5 '5T     rA   