
    PL
j$p                    |   d Z ddlm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 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!Z.d6d"Z/d6d#Z0d6d$Z1d6d%Z2d7d8d(Z3d6d)Z4d6d*Z5d6d+Z6d6d,Z7d6d-Z8dS )9z!Credential-pool auth subcommands.    )annotations)getpassN)SimpleNamespace)AUTH_TYPE_API_KEYAUTH_TYPE_OAUTHCUSTOM_POOL_PREFIXSOURCE_MANUAL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>   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           </home/kuhnn/.hermes/hermes-agent/hermes_cli/auth_commands.py_get_custom_provider_namesr4   '   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   r4   r   )r5   
normalizeddisplay_namer2   r%   s        r3   _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?   )rA   r=   
custom_keys      r3   _normalize_providerrJ   L   sf    .b''))//11J***|PPP{/
;;J r@   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 )NrE   r   )_get_custom_provider_configbase_urlr&   )
r   r<   r   agent.credential_poolrL   r,   r+   r-   r   inference_base_url)rA   rL   	cp_configpconfigs       r3   _provider_base_urlrR   Y   s    <""-.. EEEEEE//99	 	@y}}Z006B77==???r#H--G)087%%b8r@   countintc                    |  d| S )Nz-oauth- )rA   rS   s     r3   _oauth_default_labelrW   g   s    &&u&&&r@   c                    d|  S )Nzapi-key-rV   )rS   s    r3   _api_key_default_labelrY   k   s    er@   sourcec                h    |                      d          r|                     dd          d         n| S )Nzmanual::   )r<   split)rZ   s    r3   _display_sourcer_   o   s3    &,&7&7	&B&BN6<<Q""Nr@   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 NrV   .0tokenreasons     r3   	<genexpr>z-_classify_exhausted_status.<locals>.<genexpr>x   s'      kke%6/kkkkkkr@   )
rate_limitusage_limitquota	exhaustedc              3      K   | ]}|v V  	d S rf   rV   rh   ri   messages     r3   rk   z-_classify_exhausted_status.<locals>.<genexpr>x   sA       s s"s s s s s sr@   )z
rate limitzusage limitrn   ztoo many requests)zrate-limitedT>       c              3      K   | ]}|v V  	d S rf   rV   rg   s     r3   rk   z-_classify_exhausted_status.<locals>.<genexpr>}   s?        !G  !GU&  !G  !G  !G  !G  !G  !Gr@   )invalid_tokeninvalid_grantunauthorized	forbiddenauthc              3      K   | ]}|v V  	d S rf   rV   rq   s     r3   rk   z-_classify_exhausted_status.<locals>.<genexpr>}   sA       N N"N N N N N Nr@   )rx   ry   expiredrevokedzinvalid tokenauthentication)zauth failedF)ro   T)getattrr,   r-   r:   any)r1   coderr   rj   s     @@r3   _classify_exhausted_statusr   s   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 $#r@   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&   rc   r8    ()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-   rb   r   maxrT   mathceiltimedivmod)r1   labelshow_retry_windowrj   reason_textr   exhausted_until	remainingminutessecondshoursdayswaits                r3   _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7r@   Nonec                l   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    r"tS          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 rtE          d&           tS          j/        t          | d'd           pd(ta          d)tc          t          | d*d+                              ,          }|t          | dd           pd                                pd }tS          j2        ||-          }||j(        n1tM          |                    dd          tO          |d                    }tE          d.| d/| d           d S tE          d0           tS          j3        t          | d1d           t          | d2d           t          | d3d           t          | d4d           t          | d5d6           t          | d'd           pd(ti          t          | d7d6                    t          | d8d           ta          d)tc          t          | d*d+                              9	  	        }t          | dd           pd                                pd }tS          j2        ||-          }||j(        n1tM          |                    dd          tO          |d                    }tE          d:| d;| d           d S |d<k    r|tS          j        |d=           tS          j5                    }t          | dd           pd                                pKtM          |d>         d         tO          |t+          |                                          dz                       }
t7          |t9          j                    j        d d         |
t          dt>           d?|d>         d         |d>                             d          |                    d@          |                    dA          B
  
        }|!                    |           tE          d| dt+          |                                           d|j(         d           d S |dCk    rtS          j6        t          | d'd           pdDt          | d5d6           E          }t          | dd           pd                                pKtM          |d>         d         tO          |t+          |                                          dz                       }
t7          |t9          j                    j        d d         |
t          dt>           dF|d>         d         |d>                             d          |                    d@          |                    dA          B
  
        }|!                    |           tE          d| dt+          |                                           d|j(         d           d S |dGk    r+ddHl7m8}  |            }t          | dd           pd                                pF|                    dI          p1tO          |t+          |                                          dz             }
t7          |t9          j                    j        d d         |
t          dt>           dJ|d         |                    d          K          }|!                    |           tE          d| dt+          |                                           d|j(         d           d S |dLk    r/tS          j9        d6M          }t          | dd           pd                                pEtM          |d
         tO          |t+          |                                          dz                       }
t7          |t9          j                    j        d d         |
t          dt>           dN|d
         |                    d@                    }|!                    |           tE          d| dt+          |                                           d|j(         d           d S |dOk    retS          j:        t          | d5d6           t          | d'd           pd(P          }t          | dd           pd                                pEtM          |d         tO          |t+          |                                          dz                       }
t7          |t9          j                    j        d d         |
t          dt>           dQ|d         |                    d          |                    dR          S	  	        }|!                    |           tE          d| dt+          |                                           d|j(         d           d S t          dT| dU| dV          )WNrA   r&   rE   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):    )rA   idr   r   priorityrZ   access_tokenrM   zAdded  credential #z: ""r   )anthropic_adapterz1Anthropic OAuth login did not return credentials.r   z:hermes_pkcerefresh_tokenexpires_at_ms)
rA   r   r   r   r   rZ   r   r   r   rM   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      .@r   min_key_ttl_secondsi,  )timeout_secondsr   )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_urlrO   r   r   open_browserr   r   r   r   zSaved z! OAuth device-code credentials: "r   device_codetokensz:device_coderM   last_refresh)
rA   r   r   r   r   rZ   r   r   rM   r   r   g      4@)r   r   z	:xai_pkcer   )run_gemini_oauth_login_pureemailz:google_pkce)rA   r   r   r   r   rZ   r   r   r   )refresh_if_expiringz	:qwen_clir   )r   r   z:minimax_oauthrO   )	rA   r   r   r   r   rZ   r   r   rM   z`hermes auth add z#` is not implemented for auth type z yet.);rJ   r   r   r<   r   
SystemExitr,   r-   r:   r   _OAUTH_CAPABLE_PROVIDERSr   r   hermes_cli.authr   r   r+   r    r(   r   rY   lenentriessysstdinisattyinputr   uuiduuid4hexr	   rR   	add_entryprintagentr   run_hermes_oauth_login_purer   rW   r   auth_mod_read_shared_nous_state_nous_shared_store_pathRuntimeErrorEOFErrorKeyboardInterrupt_try_import_shared_nous_stater   rT   persist_nous_credentials_nous_device_code_loginbool_codex_device_code_login_xai_oauth_loopback_loginagent.google_oauthr    resolve_qwen_runtime_credentials_minimax_oauth_login)argsrA   requested_typepoolr   r   
suppressedsrcri   default_labelr   r1   anthropic_modcredssharedpath	do_import
rehydratedcustom_labelshown_labelr   s                        r3   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<<>> 	<23399;;E 	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(+C.CV L LMM) )  
 )$+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 #BGD:OQW,X,X(Y(Y Z Z

 

 

  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>!! 	-hFFF133w--3::<< 
@P(ON+ 3t||~~+>+>+BCCA
 A
 !z||#%#111x8/--o>>YYz**>22
 
 
 	uZxZZC4G4GZZEKZZZ[[[;2#D)T::Bd$T<???
 
 
 w--3::<< 
@P(ON+ 3t||~~+>+>+BCCA
 A
 !z||#%#...x8/--o>>YYz**>22
 
 
 	uZxZZC4G4GZZEKZZZ[[[&&&BBBBBB++--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 )NrA   r&   rE   r   z credentials):r]   )start  u   ←   #z<20r8   z<7)rJ   r   sortedr   keysr   r   r   peekr   r   	enumerater   r   r_   rZ   r   r   rstrip)r   provider_filter	providersrA   r   r   currentidxr1   markerstatusrZ   s               r3   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 r@   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 )NrA   r&   targetindexz Provider: .zNo credential matching "z" for provider zRemoved r   r   r   r   )find_removal_step)suppress_credential_source)rJ   r   r   resolve_targetr   remove_indexr   r   agent.credential_sourcesr  r   r  rZ   	remove_fncleanedsuppresshints)r   rA   r   r   r  matchederrorremovedr  r  stepr0   lines                r3   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 r@   c                    t          t          | dd                    }t          |          }|                                }t	          d| d| d           d S )NrA   r&   zReset status on r8   z credentials)rJ   r   r   reset_statusesr   )r   rA   r   rS   s       r3   auth_reset_commandr    sa    "74R#@#@AAHXD!!E	
;U
;
;X
;
;
;<<<<<r@   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 )NrA   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   : )rJ   r   r   r   get_auth_statusr+   r   )r   rA   r   rj   keyvalues         r3   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%%&&&' 'r@   c           	     h    t          j        t          t          | dd                                d S )NrA   rA   )r   logout_commandr   r   )r   s    r3   auth_logout_commandr"    s0    OWT:t5T5TUUUVVVVVr@   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     r3   auth_spotify_commandr+    s    /44?@@FFHHNNPPF&t,,,OY???@@@OY???@@@
=V==
>
>>r@   c                 l   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t                       g d}	t          d           t          |	d          D ]\  }
}t          d|
 d|            	 t          d                                          }n# t           t"          f$ r Y dS w xY w|r |t%          t'          |	                    k    r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S )zIInteractive 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))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_adapterr-  r.  r/  boto3clientget_caller_identityr+   r(   ImportErrorr   r   r-   r   r   r,   r   _interactive_add_interactive_remove_interactive_reset_interactive_strategy)r-  r.  r/  auth_sourceregionr;  r1  identityarnchoicesichoicer5   s                r3   _interactive_authrJ    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   	GGG  G 

&'''w** " "	6 1    !!!!L!!''))'(     #S\\****
czz			 
sI   AD! AC3 2D! 3DD! DD! !
D.-D.>!F   F54F5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.rE   c                    g | ]\  }}}|	S rV   rV   )rh   r$   _key_provider_keys       r3   
<listcomp>z"_pick_provider.<locals>.<listcomp>^  s    MMM#<4}$MMMr@   z
Known providers: z, zCustom endpoints: r  )r   setr    r   r   r4   r   joinr   r-   r   r   r   rJ   )rL  knowncustom_namescustom_displayr5   s        r3   _pick_providerrW  Y  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 forrE   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]: r7  oauthr   z!Label / account name (optional): F)rA   r   r   r   r   r   r   r   r   r   r   r   )rW  r   r<   r   r   r   r   r   r-   r   r   r   r   )rA   type_choicer   r   typed_labels        r3   r?  r?  j  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   25sr8   10sz [id:]z*Remove #, id, or label (blank to cancel): )rA   r   )rW  r   has_credentialsr   r   r   r   r   r   rZ   r   r   r-   r   r   r  r   )rA   r   rH  ero   r5   s         r3   r@  r@    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   )rW  r  r   r   s    r3   rA  rA    s/    ?@@H999:::::r@   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   r5  15su    — z
Strategy [1-4]: zInvalid choice.r   )r#   save_configcredential_pool_strategieszSet z strategy to: )rW  r   r   r   r   r   r   r   r+   r   r-   r   r   rT   
ValueError
IndexErrorr'   r#   rf  r)   r*   )rA   r   
strategiesdescriptionsrH  r   r   r5   r   strategyr#   rf  cfgpool_strategiess                 r3   rB  rB    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   r'  r&  )	r   r   r   r  r  r  r"  r+  rJ  r)  s     r3   auth_commandrt    s    T="--F$D!!!4   D!!!D!!!T"""r@   )r   r    )r5   r,   r   r6   )rA   r,   r   r,   )rA   r,   rS   rT   r   r,   )rS   rT   r   r,   )rZ   r,   r   r,   )r   r`   )r   r,   )r   r   )rK  )rL  r,   r   r,   )9__doc__
__future__r   r   r   r   r   typesr   r   rN   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   rz   r   r   hermes_constantsr   r   r4   r?   rJ   rR   rW   rY   r_   r   r   r   r   r  r  r  r"  r+  rJ  rW  r?  r@  rA  rB  rt  rV   r@   r3   <module>ry     sZ   ' ' " " " " " "        



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