
    jy                    |   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 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!Z/d6d"Z0d6d#Z1d6d$Z2d6d%Z3d7d8d(Z4d6d)Z5d6d*Z6d6d+Z7d6d,Z8d6d-Z9dS )9z!Credential-pool auth subcommands.    )annotationsN)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)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_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                   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           ti          t          | dEd6                    F          }t          | dd           pd                                pKtM          |d>         d         tO          |t+          |                                          dz                       }
t7          |t9          j                    j        d d         |
t          dt>           dG|d>         d         |d>                             d          |                    d@          |                    dA          B
  
        }|!                    |           tE          d| dt+          |                                           d|j(         d           d S |dHk    r+ddIl7m8}  |            }t          | dd           pd                                pF|                    dJ          p1tO          |t+          |                                          dz             }
t7          |t9          j                    j        d d         |
t          dt>           dK|d         |                    d          L          }|!                    |           tE          d| dt+          |                                           d|j(         d           d S |dMk    r/tS          j9        d6N          }t          | dd           pd                                pEtM          |d
         tO          |t+          |                                          dz                       }
t7          |t9          j                    j        d d         |
t          dt>           dO|d
         |                    d@                    }|!                    |           tE          d| dt+          |                                           d|j(         d           d S |dPk    retS          j:        t          | d5d6           t          | d'd           pd(Q          }t          | dd           pd                                pEtM          |d         tO          |t+          |                                          dz                       }
t7          |t9          j                    j        d d         |
t          dt>           dR|d         |                    d          |                    dS          T	  	        }|!                    |           tE          d| dt+          |                                           d|j(         d           d S t          dU| dV| dW          )XNrA   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@manual_paste)r   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      s7   "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(+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<???gdNEBBCC
 
 

 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                 
   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#   modelrA   r&   	auth_modezazure-foundryentra_id)EntraIdentityConfigSCOPE_AI_AZURE_DEFAULTdescribe_active_credentialhas_azure_identity_installedrM   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?r]   r   . z	
Choice: 1234)#r   r   r   agent.bedrock_adapterr.  r/  r0  boto3clientget_caller_identityr+   r(   ImportErrorr'   r#   r)   r*   r,   r-   r:   agent.azure_identity_adapterr8  r9  r:  r;  joinr   r   r   r   r   _interactive_add_interactive_remove_interactive_reset_interactive_strategy)r.  r/  r0  auth_sourceregionrH  r2  identityarnr#   _cfg
_model_cfg_cfg_provider_cfg_auth_moder8  r9  r:  r;  	_base_url_entra_scope
_entra_cfg_info_env_sources_tag_err_hintchoicesichoicer5   s                                  r3   _interactive_authrf    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.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: r?  zCustom endpoints: r  )r   setr    r   r   r4   r   rM  r   r-   r   r   r   rJ   )rh  knowncustom_namescustom_displayr5   s        r3   _pick_providerrr    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]: rD  oauthr   z!Label / account name (optional): F)rA   r   r   r   r   r   r   r   r   r   r   r   )rr  r   r<   r   r   r   r   r   r-   r   r   r   r   )rA   type_choicer   r   typed_labels        r3   rN  rN    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  )rr  r   has_credentialsr   r   r   r   r   r   rZ   r   r   r-   r   r   r  r   )rA   r   rd  ero   r5   s         r3   rO  rO    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!  )rr  r  r   r!  s    r3   rP  rP    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   rB  15su    — z
Strategy [1-4]: zInvalid choice.r   )r#   save_configcredential_pool_strategieszSet z strategy to: )rr  r   r
   r   r   r   r   r   r+   r   r-   r   r   rT   
ValueError
IndexErrorr'   r#   r  r)   r*   )rA   r   
strategiesdescriptionsrd  r   r   r5   r   strategyr#   r  cfgpool_strategiess                 r3   rQ  rQ    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,  rf  r*  s     r3   auth_commandr    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   )rg  )rh  r,   r   r,   ):__doc__
__future__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   hermes_cli.secret_promptr   r   r4   r?   rJ   rR   rW   rY   r_   r   r   r   r   r  r  r  r#  r,  rf  rr  rN  rO  rP  rQ  r  rV   r@   r3   <module>r     s^   ' ' " " " " " "  



  ! ! ! ! ! !                                    $ # " " " " " - - - - - - 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:Jm Jm Jm JmZ   6# # # #L= = = =' ' ' '(W W W W? ? ? ?i  i  i  i X$ $ $ $ $"! ! ! !HH H H H,; ; ; ;'5 '5 '5 '5T     r@   