
    ifM                    T   d Z ddlmZ ddlm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"d+dZ#d+dZ$d,dZ%d-dZ&d.dZ'd/dZ(d0dZ)d0dZ*d0dZ+d0dZ,d0d Z-d1d2d#Z.d0d$Z/d0d%Z0d0d&Z1d0d'Z2d0d(Z3dS )3z!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
qwen-oauthopenai-codex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           6/root/.hermes/hermes-agent/hermes_cli/auth_commands.py_get_custom_provider_namesr1   &   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   r1   r   )r2   
normalizeddisplay_namer/   r"   s        r0   _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 t          |          }|r|S |S )Nr#   >   open-routeror
openrouter)r*   r7   r<   )r>   r:   
custom_keys      r0   _normalize_providerrD   K   sU    .b''))//11J***|/
;;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 )NrB   r   )_get_custom_provider_configbase_urlr#   )
r   r9   r   agent.credential_poolrF   r)   r(   r*   r   inference_base_url)r>   rF   	cp_configpconfigs       r0   _provider_base_urlrL   V   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- )r>   rM   s     r0   _oauth_default_labelrQ   d   s    &&u&&&r=   c                    d|  S )Nzapi-key-rP   )rM   s    r0   _api_key_default_labelrS   h   s    er=   sourcec                h    |                      d          r|                     dd          d         n| S )Nzmanual::   )r9   split)rT   s    r0   _display_sourcerY   l   s3    &,&7&7	&B&BN6<<Q""Nr=   c           
     v   | j         t          k    rdS t          | dd           }t          |t                    r|                                rd| nd}| j        rd| j         dnd}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#   last_error_reasonr5    ()z
 exhaustedr   z (ready to retry)<      zd hzh mzm sz left))last_statusr
   getattrr&   r)   r*   last_error_coder   maxrN   mathceiltimedivmod)r.   reasonreason_textcodeexhausted_until	remainingminutessecondshoursdayswaits              r0   _format_exhausted_statusru   p   s   ,,,rU/66F",VS"9"9TfllnnT,f,,,RTK,1,AI(%((((rD&u--O/K////As49_ty{{%BCCDDEEIA~~@K@@@@@i,,GWGR((NE7##KD% ""%"""	 %%7%%%	 ''W'''}}}99T99T9999r=   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          }|s4|                    t                    rt          }n|dv rt          nt          }t          |          }|t          k    rst          | dd           pd                                }|s!t          d	                                          }|st          d
          t          t          |                                          dz             }t          | dd           pd                                }|s't!          d| d                                          p|}t#          |t%          j                    j        d d         |t          dt*          |t-          |                    }|                    |           t1          d| dt          |                                           d| d           d S |dk    rgddlm} |                                }	|	st          d          t          | dd           pd                                pEt9          |	d         t;          |t          |                                          dz                       }t#          |t%          j                    j        d d         |t          dt*           d|	d         |	                    d          |	                    d          t-          |          
  
        }|                    |           t1          d| dt          |                                           d|j         d           d S |dk    rtA          j!        t          | d d           t          | d!d           t          | d"d           t          | d#d           t          | d$d%           t          | d&d           pd'tE          t          | d(d%                    t          | d)d           tG          d*tI          t          | d+d,                              -	  	        }	t          | dd           pd                                pSt9          |	                    dd          t;          |t          |                                          dz                       }t#          j%        |i |	|t          t*           d.|	                    d/          d0          }|                    |           t1          d| dt          |                                           d|j         d           d S |d1k    rgtA          j&                    }	t          | dd           pd                                pKt9          |	d2         d         t;          |t          |                                          dz                       }t#          |t%          j                    j        d d         |t          dt*           d.|	d2         d         |	d2                             d          |	                    d3          |	                    d4          5
  
        }|                    |           t1          d| dt          |                                           d|j         d           d S |d6k    r/tA          j'        d%7          }	t          | dd           pd                                pEt9          |	d         t;          |t          |                                          dz                       }t#          |t%          j                    j        d d         |t          dt*           d8|	d         |	                    d3                    }|                    |           t1          d| dt          |                                           d|j         d           d S t          d9| d:| d;          )<Nr>   r#   rB   Unknown provider: 	auth_typezapi-key>   r   r   r   r   api_keyzPaste your API key: zNo API key provided.rW   labelzLabel (optional, default: z):    r   )r>   idr{   ry   priorityrT   access_tokenrG   zAdded  credential #z: ""r   )anthropic_adapterz1Anthropic OAuth login did not return credentials.r   z:hermes_pkcerefresh_tokenexpires_at_ms)
r>   r}   r{   ry   r~   rT   r   r   r   rG   z OAuth credential #r   
portal_urlinference_url	client_idscope
no_browserFtimeoutg      .@insecure	ca_bundler^   min_key_ttl_secondsi,  )	portal_base_urlrI   r   r   open_browsertimeout_secondsr   r   r   z:device_coderI   )r{   ry   rT   rG   r   tokensrG   last_refresh)
r>   r}   r{   ry   r~   rT   r   r   rG   r   r   )refresh_if_expiringz	:qwen_cliz`hermes auth add z#` is not implemented for auth type z yet.)(rD   rd   r   r9   r   
SystemExitr)   r*   r7   r   r   r   r   rS   lenentriesinputr   uuiduuid4hexr	   rL   	add_entryprintagentr   run_hermes_oauth_login_purer   rQ   r(   r{   auth_mod_nous_device_code_loginboolrf   rN   	from_dict_codex_device_code_login resolve_qwen_runtime_credentials)
argsr>   requested_typepooltokendefault_labelr{   r.   anthropic_modcredss
             r0   auth_add_commandr      sb   "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* G122 	G.NN08<o0o0o__  vGNXD***y$//52<<>> 	<23399;;E 	53444.s4<<>>/B/BQ/FGGw--3::<< 	dI}IIIJJPPRRcVcE 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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

 

 

 w--3::<< 
@PIInb)) 3t||~~+>+>+BCCA
 A
 !*8 6
6
(&444		"6776
 6
 6
   	uZxZZC4G4GZZEKZZZ[[[>!!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[[[<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[[[
kkkVdkkk
l
llr=   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 )Nr>   r#   rB   r\   z credentials):rW   )start  u   ←   #z<20r5   z<7)rD   rd   sortedr   keysr   r   r   peekr   r   	enumerater}   ru   rY   rT   r{   ry   rstrip)r   provider_filter	providersr>   r   r   currentidxr.   markerstatusrT   s               r0   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           |j        	                    d          rJ|j        t          d          d          }|r(ddlm}	  |	|          }
|
rt          d| d           d S d S d S |j        dk    r|dv rddlm}m}m}  |            5   |            }|                    d          }t%          |t&                    r%||v r!||=  ||           t          d| d           d d d            d S # 1 swxY w Y   d S |j        dk    rT|dk    rNddlm}  |            dz  }|                                r%|                                 t          d           d S d S |j        dk    rG|dk    rCddlm}  ||d           t          d           t          d           t          d            d S d S d S )!Nr>   r#   targetindexz Provider: .zNo credential matching "z" for provider zRemoved r   r\   r]   zenv:r   )remove_env_valuezCleared z
 from .envdevice_code)r   r   )_load_auth_store_save_auth_store_auth_store_lockr   z OAuth tokens from auth storehermes_pkcer   )get_hermes_homez.anthropic_oauth.jsonz*Cleared Hermes Anthropic OAuth credentialsclaude_code)suppress_credential_sourceu?   Suppressed claude_code credential — it will not be re-seeded.zGNote: Claude Code credentials still live in ~/.claude/.credentials.jsonz7Run `hermes auth add anthropic` to re-enable if needed.)rD   rd   r   resolve_targetr   remove_indexr   r{   rT   r9   r   r$   r   hermes_cli.authr   r   r   r(   r&   r'   hermes_constantsr   existsunlinkr   )r   r>   r   r   r   matchederrorremovedenv_varr   clearedr   r   r   
auth_storeproviders_dictr   
oauth_filer   s                      r0   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 ~  (( #I.V. 	6::::::&&w//G 6444455555		6 	66 6 
=	(	(X9Q-Q-Q	
 	
 	
 	
 	
 	
 	
 	
 	
 	
  	J 	J))++J'^^K88N.$// JH4N4N"8,  ,,,HHHHIII	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 
=	(	(X-D-D444444$_&&)@@
 	@>?????	@ 	@ 
=	(	(X-D-D>>>>>>""8];;;OPPPWXXXGHHHHH 
)	(-D-Ds   AF==GGc                    t          t          | dd                    }t          |          }|                                }t	          d| d| d           d S )Nr>   r#   zReset status on r5   z credentials)rD   rd   r   reset_statusesr   )r   r>   r   rM   s       r0   auth_reset_commandr   e  sa    "74R#@#@AAHXD!!E	
;U
;
;X
;
;
;<<<<<r=   c                    t          d           t          d           t          t          d                     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==================================================Nr>   )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?rW   r   . z	
Choice: 1234)r   r   r   r   r   r*   EOFErrorKeyboardInterruptr)   r   _interactive_add_interactive_remove_interactive_reset_interactive_strategy)choicesichoicer2   s       r0   _interactive_authr   l  s    

"###	(OOOot444555	GGG  G 

&'''w** " "	6 1    !!!!L!!''))'(     #S\\****
czz			 
s   	!B+ +C ?C 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.rB   c                    g | ]\  }}}|	S rP   rP   ).0r!   _key_provider_keys       r0   
<listcomp>z"_pick_provider.<locals>.<listcomp>  s    MMM#<4}$MMMr=   z
Known providers: z, zCustom endpoints: : )r   setr   r   r   r1   r   joinr   r*   r   r   r   rD   )r   knowncustom_namescustom_displayr2   s        r0   _pick_providerr     s!   3t-24455FGGHHE-//L 8MMMMM6DIIe$4$466777>499^#<#<>>????6DIIe$4$466777vMMM""((**'(   lls###s   $C1 1 Dc                 r   t          d          } | t          vr2| dk    r,|                     t                    st	          d|            | t
          v rxt          d|  d           t          d           t          d           	 t          d                                          }n# t          t          f$ r Y d S w xY w|d	k    rd
}nd}nd}d }	 t          d                                          }n# t          t          f$ r Y d S w xY w|r|}t          t          | ||d d d d d dd dd                      d S )NzProvider to add credential forrB   rx   
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   oauthrz   z!Label / account name (optional): F)r>   ry   r{   rz   r   r   r   r   r   r   r   r   )r   r   r9   r   r   _OAUTH_CAPABLE_PROVIDERSr   r   r*   r   r   r   r   )r>   type_choicery   r{   typed_labels        r0   r   r     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   rW   r   r   25sr5   10sz [id:]z*Remove #, id, or label (blank to cancel): )r>   r   )r   r   has_credentialsr   r   r   ru   r{   ry   rT   r}   r   r*   r   r   r   r   )r>   r   r   e	exhaustedr2   s         r0   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   )r   r   r   r   s    r0   r   r     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 selectionrW   u    ←r#   r   r   15su    — z
Strategy [1-4]: zInvalid choice.r   )r    save_configcredential_pool_strategieszSet z strategy to: )r   r   r   r   r   r   r   r   r(   r   r*   r   r   rN   
ValueError
IndexErrorr$   r    r  r&   r'   )r>   r   
strategiesdescriptionsr   rb   r   r2   r   strategyr    r  cfgpool_strategiess                 r0   r   r     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 t                       d S )Nauth_actionr#   addr   removereset)rd   r   r   r   r   r   )r   actions     r0   auth_commandr    s    T="--F$D!!!4   r=   )r   r   )r2   r)   r   r3   )r>   r)   r   r)   )r>   r)   rM   rN   r   r)   )rM   rN   r   r)   )rT   r)   r   r)   )r   r)   )r   rv   )r   )r   r)   r   r)   )4__doc__
__future__r   r   rg   ri   typesr   r   rH   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   authr   r   r   r   r   r1   r<   rD   rL   rQ   rS   rY   ru   r   r   r   r   r   r   r   r   r   r   r  rP   r=   r0   <module>r!     s   ' ' " " " " " "         ! ! ! ! ! !                                    $ # " " " " " - - - - - - 0 0 0 0 0 0 ONN    *       9 9 9 9' ' ' '   O O O O: : : :4Gm Gm Gm GmT   63I 3I 3I 3Il= = = =$  $  $  $ N$ $ $ $ $"! ! ! !HH H H H,; ; ; ;'5 '5 '5 '5T     r=   