
    i-                    L   d dl mZ d dlmZ d dlmZmZ d dlmZmZ d dl	Z	d dl
mZmZ d dlmZmZ d dlmZ d,dZ ed           G d d                      Z ed           G d d                      Zd-dZd.dZd/dZddd0d"Zd1d$Zd2d%Zd2d&Zd3d(Zddd)d4d+ZdS )5    )annotations)	dataclass)datetimetimezone)AnyOptionalN)_is_oauth_tokenresolve_anthropic_token)_read_codex_tokens!resolve_codex_runtime_credentials)resolve_runtime_providerreturnr   c                 >    t          j        t          j                  S N)r   nowr   utc     8/home/ubuntu/.hermes/hermes-agent/agent/account_usage.py_utc_nowr      s    <%%%r   T)frozenc                  D    e Zd ZU ded<   dZded<   dZded<   dZded	<   dS )
AccountUsageWindowstrlabelNzOptional[float]used_percentOptional[datetime]reset_atOptional[str]detail)__name__
__module____qualname____annotations__r   r   r    r   r   r   r   r      sN         JJJ$(L((((#'H'''' F      r   r   c                      e Zd ZU ded<   ded<   ded<   dZded<   dZd	ed
<   dZded<   dZded<   dZd	ed<   e	dd            Z
dS )AccountUsageSnapshotr   providersourcer   
fetched_atzAccount limitstitleNr   planr   ztuple[AccountUsageWindow, ...]windowsztuple[str, ...]detailsunavailable_reasonr   boolc                H    t          | j        p| j                  o| j         S r   )r/   r,   r-   r.   )selfs    r   	availablezAccountUsageSnapshot.available%   s$    DL0DL11Q$:Q6QQr   )r   r/   )r!   r"   r#   r$   r*   r+   r,   r-   r.   propertyr2   r   r   r   r&   r&      s         MMMKKK!E!!!!D.0G0000!G!!!!(,,,,,R R R XR R Rr   r&   valuer   c                    t          | pd                                          }|sd S |                    dd                              dd                                          S )N _ -)r   stripreplacer*   )r4   cleaneds     r   _title_case_slugr=   *   s\    %+2$$&&G t??3$$,,S#66<<>>>r   r   r   c                   | dv rd S t          | t          t          f          r-t          j        t          |           t
          j                  S t          | t                    r|                                 }|sd S |	                    d          r|d d         dz   }	 t          j
        |          }|j        r|n|                    t
          j                  S # t          $ r Y d S w xY wd S )N)Nr6   )tzZz+00:00)tzinfo)
isinstanceintfloatr   fromtimestampr   r   r   r:   endswithfromisoformatrB   r;   
ValueError)r4   textdts      r   	_parse_dtrL   1   s    
t%#u&& E%eEllx|DDDD% 
{{}} 	4== 	(9x'D	'--BG22

(,
(G(GG 	 	 	44	4s    <C 
C+*C+rK   r   c                   | sdS |                                  }| t                      z
  }t          |                                          }|dk    rd|                    d           dS t          |d          \  }}|dz  }|dk    rt          |d          \  }}d	| d
| d}n|dk    r
d	| d| d}nd	| d}| d|                    d           dS )Nunknownr   znow (z%Y-%m-%d %H:%M %Z)i  <      zin zd hzh m ()
astimezoner   rD   total_secondsstrftimedivmod)	rK   local_dtdeltarV   hoursremminutesdaysrels	            r   _format_resetr`   D   s    y}}HOE++--..M@x(()<==@@@@t,,JE3RiG{{UB''e$D$$E$$$	'E''W'''G>>X&&':;;>>>>r   F)markdownsnapshotOptional[AccountUsageSnapshot]ra   r/   	list[str]c          
        | sg S d|rdnd | j          |rdnd }|g}| j        r'|                    d| j         d| j         d           n|                    d| j                    | j        D ]}|j        |j         d}nqt          dt          d	t          |j                  z
                      }t          dt          t          |j                                      }|j         d
| d| d}|j
        r|dt          |j
                   z  }n|j        r|d|j         z  }|                    |           | j        D ]}|                    |           | j        r|                    d| j                    |S )Nu   📈 z**r6   z
Provider: rT   rO   z: unavailabler   d   z: z% remaining (z% used)u    • resets     • zUnavailable: )r*   r+   appendr'   r,   r   r   maxroundrE   r   r`   r    r-   r.   )	rb   ra   headerlineswindowbase	remainingusedr    s	            r   render_account_usage_linesrq   X   s    	YX-TT2Yx~Yx?WttUWYYFHE} 7G("3GGx}GGGHHHH5("355666"  &l111DDAuS51D+E+E%EFFGGIq%f&9 : :;;<<DlKKiKKdKKKD? 	,C=#A#ACCCDD] 	,+FM+++DT"  V" DBX%@BBCCCLr   base_urlc                    | pd                                                     d          }|sd}|                    d          r|d t          d                    }d|v r|dz   S |dz   S )Nr6   /z%https://chatgpt.com/backend-api/codexz/codexz/backend-apiz/wham/usagez/api/codex/usage)r:   rstriprG   len)rr   
normalizeds     r   _resolve_codex_usage_urlrx   t   s    .b''))0055J =<
8$$ 2 03x==. 01
##M))***r   c                    t          d          } t                      }|                    d          pi }t          |                    dd          pd                                          pd }d| d          dd	d
}|r||d<   t          j        d          5 }|                    t          |                     dd                    |          }|                                 d d d            n# 1 swxY w Y   |	                                pi }|                    d          pi }g }	dD ]\  }
}|                    |
          pi }|                    d          }|4|	
                    t          |t          |          t          |                    d                                         g }|                    d          pi }|                    d          r|                    d          }t          |t          t          f          r'|
                    dt          |          d           n*|                    d          r|
                    d           t!          ddt#                      t%          |                    d                    t'          |	          t'          |                    S ) NT)refresh_if_expiringtokens
account_idr6   Bearer api_keyapplication/jsonz	codex-cli)AuthorizationAccept
User-AgentzChatGPT-Account-Id      .@timeoutrr   headers
rate_limit))primary_windowSession)secondary_windowWeeklyr   r   r   r   r   creditshas_creditsbalanceCredits balance: $.2f	unlimitedzCredits balance: unlimitedopenai-codex	usage_api	plan_type)r'   r(   r)   r+   r,   r-   )r   r   getr   r:   httpxClientrx   raise_for_statusjsonrh   r   rE   rL   rC   rD   r&   r   r=   tuple)creds
token_datar{   r|   r   clientresponsepayloadr   r,   keyr   rm   rp   r-   r   r   s                    r   _fetch_codex_account_usager      s   -$GGGE#%%J^^H%%+FVZZb117R88>>@@HDJ55#355$! G
  3(2$%	d	#	#	# $v::6uyyR7P7PQQ[b:cc!!###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ mmoo#G\**0bJ(*GU 
 

U$$*zz.))<"4[["6::j#9#9::  	
 	
 	
 	
 Gkk)$$*G{{=!! 9++i((gU|,, 	9NNDgDDDEEEE[[%% 	9NN7888::gkk+6677gg   s   AC33C7:C7c                    t                      pd                                } | sd S t          |           st          ddt	                      d          S d|  dddd	d
}t          j        d          5 }|                    d|          }|                                 d d d            n# 1 swxY w Y   |	                                pi }g }d}|D ]\  }}|                    |          pi }	|	                    d          }
|
4t          |
          dk    rt          |
          dz  nt          |
          }|                    t          ||t          |	                    d                                         g }|                    d          pi }|                    d          r|                    d          }|                    d          }|                    d          pd}t          |t          t          f          r<t          |t          t          f          r |                    d|dd|dd|            t          ddt	                      t!          |          t!          |                    S ) Nr6   	anthropicoauth_usage_apizMAnthropic account limits are only available for OAuth-backed Claude accounts.)r'   r(   r)   r.   r}   r   zoauth-2025-04-20zclaude-code/2.1.0)r   r   zContent-Typezanthropic-betar   r   r   z)https://api.anthropic.com/api/oauth/usager   ))	five_hourzCurrent session)	seven_dayzCurrent week)seven_day_opusz	Opus week)seven_day_sonnetzSonnet weekutilization   rf   	resets_atr   extra_usage
is_enabledused_creditsmonthly_limitcurrencyUSDzExtra usage: r   z / r8   r'   r(   r)   r,   r-   )r
   r:   r	   r&   r   r   r   r   r   r   rE   rh   r   rL   rC   rD   r   )tokenr   r   r   r   r,   mappingr   r   rm   utilrp   r-   extrar   r   r   s                    r   _fetch_anthropic_account_usager      s   $&&,"3355E t5!! 
# $zzn	
 
 
 	
 +5**$*,) G 
d	#	#	# $v::ISZ:[[!!###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ mmoo#G(*GG  
 

US!!'Rzz-((<$)$KK1$4$4uT{{S  %++!"6::k#:#:;;  	
 	
 	
 	
 GKK&&,"Eyy yy00		/2299Z((1ElS%L11 	jQTV[P\6]6] 	NNSSSS]SSSSS     ::gg   s   5,B--B14B1r~   c           	     	   t          d| |          }t          |                    dd          pd                                          }|sd S t          |                    dd          pd                              d          }| d}| d}d	| d
d}t          j        d          5 }|                    ||          }	|	                                 |	                                pi                     d          pi }
	 |                    ||          }|                                 |                                pi                     d          pi }n# t          $ r i }Y nw xY wd d d            n# 1 swxY w Y   t          |
                    d          pd          }t          |
                    d          pd          }dt          d||z
            dg}g }|                    d          }|                    d          }t          |                    d          pd                                          }|                    d          }t          |t          t          f          rt          |          dk    rt          |t          t          f          rdt          |          cxk    rt          |          k    rn nt          |          }t          |          }||z
  |z  dz  }d|dd|ddg}|r|                    d|            |                    t          d|d                     |          !                     t          |t          t          f          rd"t          |          dd#g}|                    d$          d%f|                    d&          d'f|                    d(          d)ffD ]]\  }}t          |t          t          f          r<t          |          dk    r)|                    dt          |          dd*|            ^|                    d                     |                     t#          dd+t%                      t'          |          t'          |          ,          S )-N
openrouter)	requestedexplicit_base_urlexplicit_api_keyr~   r6   rr   rt   z/creditsz/keyr}   r   )r   r   g      $@r   r   datatotal_creditsg        total_usager   r   limitlimit_remaininglimit_resetusager   rf   $z of $z
 remainingzresets zAPI key quotarg   )r   r   r    zAPI key usage: $z totalusage_dailytodayusage_weeklyz	this weekusage_monthlyz
this monthr8   credits_apir   )r   r   r   r:   ru   r   r   r   r   	ExceptionrE   ri   rC   rD   rh   r   joinr&   r   r   )rr   r~   runtimer   rw   credits_urlkey_urlr   r   credits_respr   key_respkey_datar   r   r-   r,   r   r   r   r   limit_valueremaining_valuer   detail_partsusage_partsr4   r   s                               r   _fetch_openrouter_account_usager      s   &"   G
 Ir**0b117799E tW[[R006B77>>sCCJ)))K!!!G*5**$ G 
d	#	#	# 	vzz+wz??%%'''$$&&,"11&99?R	zz'7z;;H%%''' -2226::@bHH 	 	 	HHH		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 '++o66=#>>MM229c::KOC][-H$I$IOOOPG(*GLL!!Ell#455Ohll=117R88>>@@KLL!!E53,''
%LL1e55 ''77775<<77777Ell00$6+ELQOQQQkQQQQR 	9 7+ 7 7888%)||L11  	
 	
 	
 %#u&& 	2B%,,BBBBC\\-(('2\\.));7\\/**L9
 	C 	CLE5
 %#u.. C5<<!3C3C""#AuU||#A#A#A%#A#ABBBw||K00111::gg   s8   -AE:AEE:E+(E:*E++E::E>E>)rr   r~   r'   c                  t          | pd                                                                          }|dv rd S 	 |dk    rt                      S |dk    rt	                      S |dk    rt          ||          S n# t          $ r Y d S w xY wd S )Nr6   >   r6   autocustomr   r   r   )r   r:   lowerr   r   r   r   )r'   rr   r~   rw   s       r   fetch_account_usager   4  s     X^$$**,,2244J+++t''-///$$1333%%28WEEE &   tt4s   A< A< %A< <
B
	B
)r   r   )r4   r   r   r   )r4   r   r   r   )rK   r   r   r   )rb   rc   ra   r/   r   rd   )rr   r   r   r   )r   rc   )rr   r   r~   r   r   rc   )r'   r   rr   r   r~   r   r   rc   )
__future__r   dataclassesr   r   r   typingr   r   r   agent.anthropic_adapterr	   r
   hermes_cli.authr   r   hermes_cli.runtime_providerr   r   r   r&   r=   rL   r`   rq   rx   r   r   r   r   r   r   r   <module>r      s,   " " " " " " ! ! ! ! ! ! ' ' ' ' ' ' ' '                  L L L L L L L L Q Q Q Q Q Q Q Q @ @ @ @ @ @& & & & $! ! ! ! ! ! ! ! $R R R R R R R R? ? ? ?   &? ? ? ?( ^c      8+ + + +- - - -`: : : :zE E E EV #!	       r   