
    `gj}                    ~   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%d#dZ&d#dZ'd$dZ(d%dZ)d&dZ*d'dZ+d(dZ,d)dZ-d)dZ.d)dZ/d)dZ0d)dZ1d)dZ2d)dZ3d)dZ4d*d+dZ5d)dZ6d)dZ7d)dZ8d)dZ9d)d Z:y),z!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-oauthc                    	 ddl m} m}  |       }g } | |      D ]  }t	        |t
              s|j                  d      }t	        |t              r|j                         sFt         t        |       }t        |j                  dd      xs d      j                         }|j                  |j                         ||f        |S # t        $ r g cY S w xY w)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           K/root/.hermes/venv/lib/python3.12/site-packages/hermes_cli/auth_commands.py_get_custom_provider_namesr2   (   s    R F08 >%&yy $$DJJL()*Ed*K)LM599^R8>B?EEGtzz|X|<=> M  	s   C CCc                6   | xs dj                         j                         j                  dd      }|sy|j                  t              r|S t               D ]@  \  }}}t        |      |k(  r|c S |s|j                         j                         |k(  s>|c S  y)z[If raw input matches a custom_providers entry name (case-insensitive), return its pool key.r$    -N)r+   lowerreplace
startswithr   r2   r   )raw
normalizeddisplay_namer0   r#   s        r1   _resolve_custom_provider_inputr<   =   s    )""$**,44S#>J/00J0L ,h&|4
BOL..0668JFO	
     c                |    | xs dj                         j                         }|dv ry|dv ryt        |      }|r|S |S )Nr$   >   open-routeror
openrouter>   
grok-oauth
x-ai-oauthxai-grok-oauthr   r   )r+   r6   r<   )providerr:   
custom_keys      r1   _normalize_providerrG   M   sN    .b'')//1J**PP/
;Jr=   c                   | dk(  rt         S | j                  t              r=ddlm}  ||       }|r,t        |j                  d      xs d      j                         S yt        j                  |       }|r|j                  S dS )NrA   r   )_get_custom_provider_configbase_urlr$   )
r   r8   r   agent.credential_poolrI   r*   r)   r+   r   inference_base_url)rE   rI   	cp_configpconfigs       r1   _provider_base_urlrO   Z   sw    <""-.E/9	y}}Z06B7==??##H-G)07%%8b8r=   c                    |  d| S )Nz-oauth- )rE   counts     r1   _oauth_default_labelrS   h   s    Zwug&&r=   c                    d|  S )Nzapi-key-rQ   )rR   s    r1   _api_key_default_labelrU   l   s    eWr=   c                R    | j                  d      r| j                  dd      d   S | S )Nzmanual::   )r8   split)sources    r1   _display_sourcer[   p   s*    &,&7&7	&B6<<Q"NNr=   c                   t        | dd       }t        t        | dd      xs d      j                         j                         t        t        | dd      xs d      j                         j                         |dk(  s(t	        fddD              st	        fdd	D              ry
|dv s(t	        fddD              st	        fddD              ryy)Nlast_error_codelast_error_reasonr$   last_error_messagei  c              3  &   K   | ]  }|v  
 y wNrQ   .0tokenreasons     r1   	<genexpr>z-_classify_exhausted_status.<locals>.<genexpr>y   s     ke%6/k   )
rate_limitusage_limitquota	exhaustedc              3  &   K   | ]  }|v  
 y wra   rQ   rc   rd   messages     r1   rf   z-_classify_exhausted_status.<locals>.<genexpr>y   s      s"srg   )z
rate limitzusage limitrj   ztoo many requests)zrate-limitedT>       c              3  &   K   | ]  }|v  
 y wra   rQ   rb   s     r1   rf   z-_classify_exhausted_status.<locals>.<genexpr>~   s       !GU&  !Grg   )invalid_tokeninvalid_grantunauthorized	forbiddenauthc              3  &   K   | ]  }|v  
 y wra   rQ   rm   s     r1   rf   z-_classify_exhausted_status.<locals>.<genexpr>~   s      N"Nrg   )rt   ru   expiredrevokedzinvalid tokenauthentication)zauth failedF)rk   T)getattrr*   r+   r6   any)r/   codern   re   s     @@r1   _classify_exhausted_statusr~   t   s    5+T2D 3R8>B?EEGMMOF'%!5r:@bAGGIOOQGs{ck7jkkor s&as p $zS  !G  ?F  !G  G  KN N&|N K $r=   c           
        | j                   t        k7  ryt        |       \  }}t        | dd       }t	        |t
              r|j                         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$   r^   r4    ()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+   r]   r   maxintmathceiltimedivmod)r/   labelshow_retry_windowre   reason_textr}   exhausted_until	remainingminutessecondshoursdayswaits                r1   _format_exhausted_statusr      s   ,,9%@EU/6F",VS"9fllnAfX,RTK,1,A,AR%%&a(rD5'+tf,FGG&u-O5'+tf--As499_tyy{%BCDEIA~5'+tf,=>>i,GWGR(NE7#KD%r%"	7)1%	"WIQ'!}ugk]4&4&77r=   c                   t        t        | dd            }|t        vr(|dk7  r#|j                  t              st        d|       t        t        | dd      xs d      j                         j                         }|t        dhv rt        }|s0|j                  t              rt        }n|t        v rt        nt        }t        |      }|j                  t              sN	 ddlm}m}  |       j!                  d	i       }t#        |j!                  |g       xs g       D ]  } |||        	 |t        k(  rPt        | d
d       xs dj                         }|st'        d      j                         }|st        d      t)        t+        |j-                               dz         }	t        | dd       xs dj                         }
|
sBt.        j0                  j3                         r"t5        d|	 d      j                         xs |	}
n|	}
t7        |t9        j:                         j<                  d d |
t        dt>        |tA        |            }|jC                  |       tE        d| dt+        |j-                                d|
 d       y |dk(  r(ddl#m$} |jK                         }|st        d      t        | dd       xs dj                         xs3 tM        |d   tO        |t+        |j-                               dz               }
t7        |t9        j:                         j<                  d d |
t        dt>         d|d   |j!                  d      |j!                  d      tA        |      
      }|jC                  |       tE        d| dt+        |j-                                d|jP                   d       y |d k(  r@tS        jT                         }|r%	 tS        jV                         }tE                |rtE        d!|        ntE        d"       	 t5        d#      j                         j                         }|d%v rtE        d&       tS        j^                  t        | d'd       xs d()      }|t        | dd       xs dj                         xs d }tS        j`                  ||*      }||jP                  n%tM        |j!                  dd      tO        |d            }tE        d+| d,| d       y tE        d-       tS        jb                  t        | d.d       t        | d/d       t        | d0d       t        | d1d       t        | d2d3       t        | d'd       xs d(te        t        | d4d3            t        | d5d       6      }t        | dd       xs dj                         xs d }tS        j`                  ||*      }||jP                  n%tM        |j!                  dd      tO        |d            }tE        d7| d8| d       y |d9k(  rMtS        jf                         }t        | dd       xs dj                         xs6 tM        |d:   d   tO        |t+        |j-                               dz               }
t7        |t9        j:                         j<                  d d |
t        dth        |d:   d   |d:   j!                  d      |j!                  d;      |j!                  d<      =
      }|j-                          }|jC                  |       |rtS        jj                  |       tE        d| dt+        |j-                                d|jP                   d       y |d>k(  r}tS        jl                  t        | d'd       xs d?t        | d2d3       @      }t        | dd       xs dj                         xs6 tM        |d:   d   tO        |t+        |j-                               dz               }
t7        |t9        j:                         j<                  d d |
t        dth        |d:   d   |d:   j!                  d      |j!                  d;      xs tR        jn                  |j!                  d<      =
      }|j-                          }|jC                  |       |rtS        jj                  |       tE        d| dt+        |j-                                d|jP                   d       y |dAk(  rtS        jp                  d3B      }tS        jr                  |       t        | dd       xs dj                         xs3 tM        |d
   tO        |t+        |j-                               dz               }
t7        |t9        j:                         j<                  d d |
t        dt>         dC|d
   |j!                  d;            }|jC                  |       tE        d| dt+        |j-                                d|jP                   d       y |dDk(  r-tS        jt                  t        | d2d3       t        | d'd       xs d(E      }t        | dd       xs dj                         xs3 tM        |d   tO        |t+        |j-                               dz               }
t7        |t9        j:                         j<                  d d |
t        dt>         dF|d   |j!                  d      |j!                  dG      H	      }|jC                  |       tE        d| dt+        |j-                                d|jP                   d       y t        dI| dJ| dK      # t$        $ r Y 
w xY w# tX        $ r d }Y iw xY w# tZ        t\        f$ r d$}Y 3w xY w)LNrE   r$   rA   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.rX   r   zLabel (optional, default: z):    )rE   idr   r   priorityrZ   access_tokenrJ   zAdded  credential #z: ""r   )anthropic_adapterz1Anthropic OAuth login did not return credentials.r   z:hermes_pkcerefresh_tokenexpires_at_ms)
rE   r   r   r   r   rZ   r   r   r   rJ   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_urlrL   r   r   open_browserr   r   r   zSaved z! OAuth device-code credentials: "r   tokensrJ   last_refresh)
rE   r   r   r   r   rZ   r   r   rJ   r   r   g      4@)r   r   r   )refresh_if_expiringz	:qwen_clir   )r   r   z:minimax_oauthrL   )	rE   r   r   r   r   rZ   r   r   rJ   z`hermes auth add z#` is not implemented for auth type z yet.);rG   r{   r   r8   r   
SystemExitr*   r+   r6   r   _OAUTH_CAPABLE_PROVIDERSr   r   hermes_cli.authr   r   r)   listr&   r   rU   lenentriessysstdinisattyinputr   uuiduuid4hexr   rO   	add_entryprintagentr   run_hermes_oauth_login_purer   rS   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_device_code_loginDEFAULT_XAI_OAUTH_BASE_URL resolve_qwen_runtime_credentials_mark_qwen_oauth_active_minimax_oauth_login)argsrE   requested_typepoolr   r   
suppressedsrcrd   default_labelr   r/   anthropic_modcredssharedpath	do_import
rehydratedcustom_labelshown_labelfirst_credentials                        r1   auth_add_commandr      s
   "74R#@AH((X-EhNaNabtNu-hZ899{B7=2>DDFLLNN+Y77*12.N08<T0T_ZkNXD 12		 *+//0DbIJJNN8R8>B? <,Xs;<
 **y$/52<<>()?@FFHE344.s4<<>/BQ/FGw-3::<yy! :=/MNTTVgZg% zz|#' '1	
 	uxjc$,,..A-B#eWANO;<99;PQQw-3::< 
@P.! 3t||~+>+BCA
 !zz|#%#_L1~.))O4))O4'1
 	uxj 3C4G3HEKK=XYZ[6 113779 GA$HIDE !"EFLLNTTV	 ,,KL%CC$+D)T$B$Jd
 )$+D'4$@$FB#M#M#O#WSWL$==jP\]E161B%++HX"~r:<PQY[\<]IK IhZ/D[MQRST cd00#D,=&t_dCdK6$.$T<??#D)T:Bd'$
E:;dK6	
  gt4:AACKt11%|L%*%6ekk<LIInb)+?!+L=
 	xj A+aPQ>!113w-3::< 
@P(ON+ 3t||~+>+BCA
 !zz|#%,x8/--o>YYz*>2
  $||~-u 228<xj 3C4G3HEKK=XYZ[;55#D)T:Bd$T<??
 w-3::< 
@P(ON+ 3t||~+>+BCA
 !zz|#%,x8/--o>YYz*Qh.Q.Q>2
  $||~-u 228<xj 3C4G3HEKK=XYZ[<99eT((/w-3::< 
@P) 3t||~+>+BCA
 !zz|#%#_I.y)YYz*	
 	uxj 3C4G3HEKK=XYZ[?"--$T<??#D)T:Bd
 w-3::< 
@P.! 3t||~+>+BCA
 !zz|#%#_N3~.))O4YY34

 	uxj 3C4G3HEKK=XYZ[
(
2UVdUeejk
lla  		F    /0  	 s7    Al2 m 'm 2	l?>l?mmm)(m)c                t   t        t        | dd      xs d      }|r|g}n+t        h t        j                         dt                     }|D ]  }t        |      }|j                         }|s!|j                         }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|	 j%                                 t                 y )NrE   r$   rA   r   z credentials):rX   )start  u   ←   #z<20r4   z<7)rG   r{   sortedr   keysr   r   r   peekr   r   	enumerater   r   r[   rZ   r   r   rstrip)r   provider_filter	providersrE   r   r   currentidxr/   markerstatusrZ   s               r1   auth_list_commandr     sI   )'$
B*G*M2NO$%	 
##%

 ()
 	
  ",,.))+
"S\N.9:#G15 	jJCF"uxx7::'=-e4F$U\\2FCuBu{{3/q0DAfXfXUVW]V^_ffhi	j 	r=   c           	     p   t        t        | dd            }t        | dd       }|t        | dd       }t        |      }|j                  |      \  }}}||t	        | d| d      |j                  |      }|t	        d| d| d      t        d	| d
| d|j                   d       ddlm	} ddl
m}	  |||j                        }
|
y |
j                  ||      }|j                  D ]  }t        |        |j                  r |	||j                         |j                   D ]  }t        |        y )NrE   r$   targetindexz Provider: .zNo credential matching "z" for provider zRemoved r   r   r   r   )find_removal_step)suppress_credential_source)rG   r{   r   resolve_targetr   remove_indexr   r   agent.credential_sourcesr   r   r   rZ   	remove_fncleanedsuppresshints)r   rE   r   r   r   matchederrorremovedr   r   stepr.   lines                r1   auth_remove_commandr    sE   "74R#@AHT8T*F~w-XD //7E7E%-E7+hZq9::&G3F8?8*TUVWW	HXJmE7"W]]O1
EF ;:Xw~~6D| 	^^Hg.F d"8W^^< dr=   c                    t        t        | dd            }t        |      }|j                         }t	        d| d| d       y )NrE   r$   zReset status on r4   z credentials)rG   r{   r   reset_statusesr   )r   rE   r   rR   s       r1   auth_reset_commandr    sE    "74R#@AHXD!E	UG1XJl
;<r=   c                z   t        t        | dd      xs d      }|st        d      t        j                  |      }|j                  d      s4|j                  d      }|rt        | d| d       y t        | d       y t        | d	       d
D ]'  }|j                  |      }|st        d| d|        ) y )NrE   r$   z<Provider is required. Example: `hermes auth status spotify`.	logged_inr	  z: logged out (r   z: logged outz: logged in)r   r   redirect_urir   
expires_atapi_base_urlr   : )rG   r{   r   r   get_auth_statusr)   r   )r   rE   r   re   keyvalues         r1   auth_status_commandr    s    "74R#@#FBGHWXX%%h/F::k"G$XJnVHA67 	 XJl+,	XJk
"#` '

3Bse2eW%&'r=   c           	     X    t        j                  t        t        | dd                    y )NrE   rE   )r   logout_commandr   r{   )r   s    r1   auth_logout_commandr    s    OWT:t5TUVr=   c                *   t        t        | dd      xs d      j                         j                         }|dv rt	        j
                  |        y |dk(  rt        t        d             y |dk(  rt        t        d             y t        d	|       )
Nspotify_actionr$   login>   r$   r!  r   spotifyr  logoutzUnknown Spotify auth action: )
r*   r{   r+   r6   r   login_spotify_commandr  r   r  r   r   actions     r1   auth_spotify_commandr'    s    /4?@FFHNNPF&&t,OY?@OY?@
4VH=
>>r=   c                    t        d       t        d       t        t        d             	 ddlm} m}m}  |        r |       xs d} |       }t        d       t        d	|        t        d
|        	 ddl}|j                  d|      }|j                         }|j                  dd      }t        d|        t                	 ddlm}	  |	       }
t        |
t               r|
j                  d      nd}t        |t               rt#        |j                  d      xs d      j%                         j'                         }t#        |j                  d      xs d      j%                         j'                         }|dk(  r|dk(  ryddlm}m}m}m} t#        |j                  d      xs d      j%                         }|j                  d      xs i }t        |t               si }t#        |j                  d      xs d      j%                         xs |}t        d       t        d|xs d        t        d|         |       st        d       n ||       } ||d!"      }|j                  d#      xs g }|j                  d$      r%|rd%j3                  |      nd&}t        d'| d(       nD|j                  d)      xs d*}t        d+|        |j                  d,      }|rt        d-|        t                t                g d.}t        d/       t5        |d0      D ]  \  }}t        d1| d2|         	 t7        d3      j%                         }|r|t#        t=        |            k(  ry|d4k(  rt?                y|d5k(  rtA                y|d6k(  rtC                y|d7k(  rtE                yy# t        $ r t        d       Y w xY w# t        $ r Y w xY w# t        $ r Y w xY w# t8        t:        f$ r Y yw xY w)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!   modelrE   r$   	auth_modezazure-foundryentra_id)EntraIdentityConfigSCOPE_AI_AZURE_DEFAULTdescribe_active_credentialhas_azure_identity_installedrJ   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      $@)r-   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?rX   r   . z	
Choice: 1234)#r   r   r   agent.bedrock_adapterr)  r*  r+  boto3clientget_caller_identityr)   r&   ImportErrorr%   r!   r'   r(   r*   r+   r6   agent.azure_identity_adapterr3  r4  r5  r6  joinr   r   r   r   r   _interactive_add_interactive_remove_interactive_reset_interactive_strategy)r)  r*  r+  auth_sourceregionrC  r-  identityarnr!   _cfg
_model_cfg_cfg_provider_cfg_auth_moder3  r4  r5  r6  	_base_url_entra_scope
_entra_cfg_info_env_sources_tag_err_hintchoicesichoicer9   s                                  r1   _interactive_authra  #  s    

"#	(Oot45oo 24A	K+-F78H[M*+Jvh'(Sll5fl=224ll5)4SE*+ G
-1}*4T4*@TXXg&d
j$'
z : @bAGGIOOQM !<!BCIIKQQSN/Nj4P   
z : @bAGGI	#06B!&$/F

7+1r288: .-  ;<Y%D2D$EFG	&*+35 9 : "5$"J 7jZ^_E#(99]#;#ArLyy:Ftyy6O >tfAFG$yy1Q5Qtf56 %		& 1 !HUG"45 
GG 

&'w* "	61#Rx !"L!'') #S\**
cz			 
c  SQRS  `  $ '( s\   A
O 8AN7 ?
O 
H:O" O1 7OO OO 	OO"	O.-O.1PPc                   t        t        t        t        j                               dgz               }t               }|rR|D cg c]  \  }}}|
 }}}}t        ddj                  |              t        ddj                  |              nt        ddj                  |              	 t        |  d      j                         }t        |      S c c}}}w # t        t        f$ r t               w xY w)z4Prompt for a provider name with auto-complete hints.rA   z
Known providers: r:  zCustom endpoints: r  )r   setr   r   r   r2   r   rH  r   r+   r   r   r   rG   )promptknowncustom_namesr"   _key_provider_keycustom_displayr9   s           r1   _pick_providerrj    s    3t-2245FGHE-/L@LMM#<4}$MM#DIIe$4#567"499^#<"=>?#DIIe$4#567vhbM"((* s## N '( ls   C0C C8c                    t        d      } | t        vr(| dk7  r#| j                  t              st	        d|        | t
        v rJt        d|  d       t        d       t        d       	 t        d      j                         }|d	k(  rd
}nd}nd}d }	 t        d      j                         }|r|}t        t        | ||d d d d d dd dd              y # t        t        f$ r Y y w xY w# t        t        f$ r Y y w xY w)NzProvider to add credential forrA   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]: r?  oauthr   z!Label / account name (optional): F)rE   r   r   r   r   r   r   r   r   r   r   r   )rj  r   r8   r   r   r   r   r   r+   r   r   r   r   )rE   type_choicer   r   typed_labels        r1   rI  rI    s#   >?H((X-EhNaNabtNu-hZ899 ++8*DEFFG;<	/557K #I!I	E?@FFH _YeTtt4$$ # +, 		 '( s$   *C C& C#"C#&C87C8c                    t        d      } t        |       }|j                         st        d|  d       y t	        |j                         d      D ]W  \  }}t        |      }t        d| d|j                  dd|j                  d	d|j                   | d
|j                   d       Y 	 t        d      j                         }|sy t        t!        | |             y # t        t        f$ r Y y w xY w)Nz"Provider to remove credential fromzNo credentials for r   rX   r   r   25sr4   10sz [id:]z*Remove #, id, or label (blank to cancel): )rE   r   )rj  r   has_credentialsr   r   r   r   r   r   rZ   r   r   r+   r   r   r  r   )rE   r   r_  erk   r9   s         r1   rJ  rJ    s    BCHXD!#H:Q/0 $,,.!, \1,Q/	A3bQq{{3&7q
9+USTSWSWRXXYZ[\@AGGI #FG '( s   ,C C10C1c                 D    t        d      } t        t        |              y )NzProvider to reset cooldowns forr  )rj  r  r   r  s    r1   rK  rK    s    ?@H9:r=   c                    t        d      } t        |       }t        t        t        t
        g}t        d|  d|        t                t        dt        dt        dt
        di}t        |d      D ]5  \  }}||k(  rd	nd
}t        d| d|dd|j                  |d
       |        7 	 t        d      j                         }|sy 	 t        |      dz
  }||   }	ddlm}
m}  |
       }|j                  d      xs i }t'        |t(              si }|	|| <   ||d<    ||       t        d|  d|	        y # t        t        f$ r Y y w xY w# t        t        f$ r t        d       Y y w xY w)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 selectionrX   u    ←r$   r   r=  15su    — z
Strategy [1-4]: zInvalid choice.r   )r!   save_configcredential_pool_strategieszSet z strategy to: )rj  r   r   r   r   r   r   r   r)   r   r+   r   r   r   
ValueError
IndexErrorr%   r!   ry  r'   r(   )rE   r   
strategiesdescriptionsr_  r   r   r9   r   strategyr!   ry  cfgpool_strategiess                 r1   rL  rL    s   <=H)G%';=PRabJ	#H:Ry
9:	GG9=+	L *a( G1<R1#R#weL$4$4Q$;#<VHEFG()//1 #hlc?
 ;
-Cgg:;ArOot, (OH(7C$%	D
.

34) '(  
#  s$   'D1 E 1EEE#"E#c                    t        | dd      }|dk(  rt        |        y |dk(  rt        |        y |dk(  rt        |        y |dk(  rt	        |        y |dk(  rt        |        y |dk(  rt        |        y |d	k(  rt        |        y t                y )
Nauth_actionr$   addr   removeresetr   r#  r"  )	r{   r   r   r  r  r  r  r'  ra  r%  s     r1   auth_commandr  
  s    T="-F$D!4 D!D!T"r=   )returnr   )r9   r*   r  z
str | None)rE   r*   r  r*   )rE   r*   rR   r   r  r*   )rR   r   r  r*   )rZ   r*   r  r*   )r  ztuple[str, bool])r  r*   )r  None)Provider)rd  r*   r  r*   );__doc__
__future__r   r   r   r   typesr   r   rK   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   rv   r   r   hermes_constantsr   hermes_cli.secret_promptr   r   r2   r<   rG   rO   rS   rU   r[   r~   r   r   r   r  r  r  r  r'  ra  rj  rI  rJ  rK  rL  r  rQ   r=   r1   <module>r     s    ' "  
  !     & # - 0 9 m * 
9'O&8:Nmb6#L='(W?i X$"!HH,;'5Tr=   