+
    iHàjiÅ  ã                  óØ  a € 0 t $ ^ RIHt ^ RIt^ RIt^ RIt^ RIHtHt ^ RI	H
t
H	t	 ^ RIHtHtHtHt ^ RIt^ RIHtHt ^ RIHtHtHt ^ RIHt ^ R	IHt ^ R
IHt ^ RIHt ]'       d   ^ RIH t  ]PB                  ! ]"4      t#Rt$Rt%Rt&Rt'R R lt(]! RR7       ! R R4      4       t)]! RR7       ! R R4      4       t*R R lt+R R lt,R R lt-R R  lt.R! R" lt/R#R$/R% R& llt0R' R( lt1R) R* lt2R+ R, lt3R- R. lt4R/RR0R$/R1 R2 llt5R3 R4 lt6R’R5 R6 llt7R7t8R8t9R9R/R: R; llt:R< R= lt;R> R? lt<R@ RA lt=RB RC lt>RD RE lt?R#R$RFRGRHR/RI RJ llt@R#R$RFRGRHR/RK RL lltAR’RM RN lltBRO RP ltC]! RR7       ! RQ RR4      4       tDR#R$RFRG/RS RT lltERU RV ltFRWR$/RX RY lltGRZ R[ ltHR\ R] ltIR^ R_ ltJR`R$Ra]K! 4       /Rb Rc lltLRdReRfRg/tMR“tNRh Ri ltORj Rk ltPR”Rl Rm lltQR”Rn Ro lltRR”RpR$/Rq Rr llltSRs Rt ltT]! RR7       ! Ru Rv4      4       tURwtVRx Ry ltWRz R{ ltXR| R} ltYR~RRRR€R$/R� R‚ lltZR”Rƒ R„ llt[R… R† lt\R‡]QRˆ][R‰]\/t]RŠ]^R‹&   R‡]R/t_RŠ]^RŒ&   RGt`R� RŽ ltaR~RRRRpR$R�R/R� R‘ lltbR# )•é    )ÚannotationsN)Ú	dataclassÚreplace)ÚUTCÚdatetime)ÚTYPE_CHECKINGÚAnyÚCallableÚOptional)Ú_is_oauth_tokenÚresolve_anthropic_token)Ú	AuthErrorÚ_read_codex_tokensÚ!resolve_codex_runtime_credentials)Ú_codex_pool_route_base_url)Úresolve_runtime_provider)Úsafe_strftime)ÚBP_FULL)Ú	TypeGuardu-   Status: access depleted â€” top up to restorez%Monthly large-model usage is used up.z†Status: included usage paused. Your subscription payment failed. Update your card to restore it. Until then, Hermes uses your credits.z_Status: included usage paused. See Billing in the Portal. Until then, Hermes uses your credits.c               ó   € V ^8„  d   QhRR/# )é   Úreturnr   © )Úformats   "Ú8/home/ubuntu/.hermes/hermes-agent/agent/account_usage.pyÚ__annotate__r   !   s   € ÷ ñ �(ñ ó    c                 ó6   € \         P                  ! \        4      # ©N)r   Únowr   r   r   r   Ú_utc_nowr!   !   s   € Ü�<Š<œÓÐr   T)Úfrozenc                  óZ   € ] tR t^%t$ R]R&   RtR]R&   RtR]R&   RtR]R	&   R
tR]R&   Rt	R# )ÚAccountUsageWindowÚstrÚlabelNúOptional[float]Úused_percentúOptional[datetime]Úreset_atúOptional[str]ÚdetailÚaccountÚscoper   )
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__annotations__r(   r*   r,   r.   Ú__static_attributes__r   r   r   r$   r$   %   s2   ‡ àƒJØ$(€L�/Ó(Ø#'€HÐ Ó'Ø €FˆMÓ ð €Eˆ3×r   r$   c                  ó¼   € ] tR t^1t$ R]R&   R]R&   R]R&   RtR]R&   RtR	]R
&   RtR]R&   RtR]R&   Rt	R	]R&   Rt
R	]R&   RtR]R&   RtR]R&   ]R R l4       tRtR# )ÚAccountUsageSnapshotr%   ÚproviderÚsourcer   Ú
fetched_atzAccount limitsÚtitleNr+   Úplanztuple[AccountUsageWindow, ...]Úwindowsútuple[str, ...]ÚdetailsÚunavailable_reasonÚidentityzOptional[dict]ÚrawFÚboolÚusage_windowc               ó   € V ^8„  d   QhRR/# ©r   r   rB   r   )r   s   "r   r   Ú!AccountUsageSnapshot.__annotate__G   s   € ÷ Rñ R˜4ñ Rr   c                	ó†   € \        V P                  ;'       g    V P                  4      ;'       d    V P                  '       * # r   )rB   r<   r>   r?   ©Úselfs   &r   Ú	availableÚAccountUsageSnapshot.availableF   s.   € ä�D—L‘L×0Ð0 D§L¡LÓ1×QÐQ¸$×:QÑ:QÔ6QÐQr   r   )r/   r0   r1   r2   r3   r:   r;   r<   r>   r?   r@   rA   rC   ÚpropertyrJ   r4   r   r   r   r6   r6   1   s~   ‡ àƒMØƒKØÓØ!€Eˆ3Ó!Ø€Dˆ-ÓØ.0€GÐ+Ó0Ø!€Gˆ_Ó!Ø(,Ð˜Ó,ð #€HˆmÓ"ð €CˆÓð €L�$ÓàôRó ôRr   r6   c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r   r7   r%   r8   r<   Úlistr>   Úkwr	   r   r6   r   )r   s   "r   r   r   K   s?   € ÷ Oñ O˜ð O Sð O°4ð OÀ$ð OÈcð OÐVjñ Or   c                ó`   € \        RR V RVR\        4       R\        V4      R\        V4      /VB # )r7   r8   r9   r<   r>   r   )r6   r!   Útuple)r7   r8   r<   r>   rO   s   &&&&,r   Ú	_snapshotrR   K   s^   € Üñ  O¨ð  O¸&ð  OÌXËZð  OÔafÐgnÓaoð  OÔy~ð  @Gó  zHð  Oð  LNñ  Oð  Or   c               ó    € V ^8„  d   QhRRRR/# )r   Úvaluer+   r   r   )r   s   "r   r   r   O   s   € ÷ Tñ T˜Mð T¨mñ Tr   c                ó¼   € \        T ;'       g    R 4      P                  4       pV'       d1   VP                  RR4      P                  RR4      P                  4       # R# )Ú Ú_Ú Ú-N)r%   Ústripr   r:   )rT   Úcleaneds   & r   Ú_title_case_slugr\   O   sI   € Ü�%—+�+˜2Ó×$Ñ$Ó&€GßBIˆ7�?‰?˜3 Ó$×,Ñ,¨S°#Ó6×<Ñ<Ó>ÐSÈtÐSr   c               ó    € V ^8„  d   QhRRRR/# )r   rT   r	   r   r)   r   )r   s   "r   r   r   T   s   € ÷ ñ �Sð Ð/ñ r   c                óæ  € V R9   d   R # \        V \        \        34      '       d&   \        P                  ! \        V 4      \
        R7      # \        V \        4      '       d   V P                  4       ;p'       g   R # VP                  R4      '       d   VR R R,           MTp \        P                  ! V4      pVP                  '       d   V# VP                  \
        R7      #   \         d     R # i ; i)N©ÚtzÚZz+00:00)Útzinfo>   NrV   éÿÿÿÿ)Ú
isinstanceÚintÚfloatr   Úfromtimestampr   r%   rZ   ÚendswithÚfromisoformatrb   r   Ú
ValueError)rT   ÚtextÚdts   &  r   Ú	_parse_dtrm   T   sº   € Ø�
ÔÙÜ�%œ#œu˜×&Ò&Ü×%Ò%¤e¨E£l´sÔ;Ð;Ü�eœS×!Ò!°%·+±+³-Ð*?¨$Ö*?ÙØ#'§=¡=°×#5Ò#5ˆ4��ˆ9�xÖ¸4€DðÜ×#Ò# DÓ)ˆØ—Y—Y�YˆrÐ: B§J¡J´c JÓ$:Ð:øÜô Úðús   Â!'C! Ã	C! ÃC! Ã!C0Ã/C0c               ó    € V ^8„  d   QhRRRR/# ©r   rl   r)   r   r%   r   )r   s   "r   r   r   c   s   € ÷ Xñ XÐ(ð X¨Sñ Xr   c                ó^  € V '       g   R # \        V P                  4       R4      p\        V \        4       ,
          P	                  4       4      pV^ 8:  d   RV R2# \        VR4      w  r4V^<,          pV^8¼  d   \        V^4      w  rcRV RV RV R2# V'       d   RV RV R	V R2# RV R	V R2# )
Úunknownz%Y-%m-%d %H:%M %Zznow (Ú)i  zin zd zh (zh zm ()r   Ú
astimezonere   r!   Útotal_secondsÚdivmod)rl   Ústamprt   ÚhoursÚremÚminutesÚdayss   &      r   Ú_format_resetr{   c   sÄ   € ßÙÜ˜"Ÿ-™-›/Ð+>Ó?€EÜ˜œh›j�×7Ñ7Ó9Ó:€MØ˜ÔØ�u�g˜QÐÐÜ˜ tÓ,�J€EØ�R�i€GØ�„{Ü˜U BÓ'‰ˆØ�T�F˜"˜U˜G 3 u g¨QÐ/Ð/ß27ˆS���r˜'˜ # e W¨AÐ.ÐW¸sÀ7À)È3ÈuÈgÐUVÐ=WÐWr   c               ó    € V ^8„  d   QhRRRR/# ro   r   )r   s   "r   r   r   r   s   € ÷ 	-ñ 	-Ð(ð 	-¨Sñ 	-r   c                óÜ   € V '       g   R#  ^ RI Hp V! \        V P                  4       R,          4      4      #   \         d)    \
        P                  RRR7       R\        T 4       2u # i ; i)uN   ``resets in 23h`` â€” no wall-clock stamp (those wrap and collide in the TUI).zresets soon)Úformat_resets_inéè  zReset phrase formatting failedT©Úexc_infoúresets )Úhermes_cli.model_picker_usager~   re   Ú	timestampÚ	ExceptionÚloggerÚdebugr{   )rl   r~   s   & r   Ú_reset_phraserˆ   r   s^   € çÙð-ÝBÙ¤ B§L¡L£N°TÕ$9Ó :Ó;Ð;øÜô -Ü�‰Ð5ÀˆÔEØœ rÓ*Ð+Ð,Ò,ð-ús   Œ+8 ¸0A+Á*A+ÚmarkdownFc               ó$   € V ^8„  d   QhRRRRRR/# )r   ÚsnapshotúOptional[AccountUsageSnapshot]r‰   rB   r   ú	list[str]r   )r   s   "r   r   r   ~   s$   € ÷ ñ Ð)Gð ÐVZð Ðgpñ r   c               óx  € V '       g   . # V P                   '       d   \        V 4      # V'       d   R MRpV P                  '       d   RV P                   R2MRpRV V P                   V 2RV P                   V 2.pV P
                   Fã  pVP                  f   VP                   R2pMW\        VP                  4      pVP                   R\        ^ \        ^dV,
          4      4       R\        ^ \        V4      4       R	2pVP                  '       d!   VR
\        VP                  4       2,          pM(VP                  '       d   VRVP                   2,          pVP                  V4       Kå  	  VP                  V P                   4       V P"                  '       d   VP                  RV P"                   24       V# )z**rV   z (rr   u   ðŸ“ˆ ú
Provider: z: unavailableú: z% remaining (z% used)u    â€¢ resets õ    â€¢ úUnavailable: )rC   Ú_render_usage_window_linesr;   r:   r7   r<   r(   r&   rf   ÚmaxÚroundr*   r{   r,   ÚappendÚextendr>   r?   )r‹   r‰   Úboldr;   ÚlinesÚwindowÚbaseÚuseds   &$      r   Úrender_account_usage_linesr�   ~   s  € ßØˆ	Ø××ÐÜ)¨(Ó3Ð3ß‰4 €DØ$,§M§M MˆR�—‘ˆ˜aÑ °r€DØ�T�F˜8Ÿ>™>Ð*¨4¨&Ð1°ZÀ×@QÑ@QÐ?RÐSWÐRXÐ3YÐZ€EØ×"Ô"ˆØ×ÑÒ&Ø—l‘l�^ =Ð1‰Dä˜×,Ñ,Ó-ˆDØ—l‘l�^ 2¤c¨!¬U°3¸µ:Ó->Ó&?Ð%@ÀÌcÐRSÔUZÐ[_ÓU`ÓNaÐMbÐbiÐjˆDØ�?�?ˆ?Ø�l¤=°·±Ó#AÐ"BÐCÕC‰DØ�]�]ˆ]Ø�e˜FŸM™M˜?Ð+Õ+ˆDØ�‰�TÖñ #ð 
‡L�L�×!Ñ!Ô"Ø×"×"Ð"Ø�‰�} X×%@Ñ%@Ð$AÐBÔCØ€Lr   c               ó    € V ^8„  d   QhRRRR/# )r   r‹   r6   r   r�   r   )r   s   "r   r   r   —   s   € ÷ ñ Ð)=ð À)ñ r   c           
     ó  € V P                   '       d   V P                   .pMV P                  RV P                   2.p\        R V P                   4       ^ R7      pV P                   EF  pV'       d   VP
                  RV 2 MVP
                  pVP                  f   V R2pMc\        R\        R\        VP                  4      4      4      R,          p ^ RI	H
pHp V! V4      V! V4      r©V	'       d   V RV	 RV
 R2MV RV
 R2pVP                   '       d!   VR\#        VP                   4       2,          pM(VP$                  '       d   VRVP$                   2,          pVP'                  V4       EK  	  VP)                  V P*                  4       V P,                  '       d   VP'                  RV P,                   24       V#   \         d2    \        P                  R	R
R7       R\        T^d,          4       R2r© ELi ; i)uÃ   Usage-window plans: plain stacked bar lines for CLI ``/usage`` and the TUI panel. No emoji,
no ANSI, no markdown â€” Ink ``<Text>`` would otherwise count escape bytes as width and smear the wrap.r�   c              3  óL   "  € T F  p\        VP                  4      x € K  	  R # 5ir   )Úlenr&   )Ú.0rš   s   & r   Ú	<genexpr>Ú-_render_usage_window_lines.<locals>.<genexpr>ž   s   é € ÐDÑ3C¨”3�v—|‘|×$Ð$Ó3Cùs   ‚"$)ÚdefaultÚ<z  unavailableç        ç      Y@)Úformat_percent_usedÚ
render_barzUsage bar rendering failedTr€   rV   Ú%z  z usedu     Â·  r’   )r;   r:   r7   r”   r<   r&   r(   Úminrf   rƒ   r©   rª   r…   r†   r‡   re   r*   rˆ   r,   r–   r—   r>   r?   )r‹   r™   Úlabel_wrš   r&   r›   rœ   r©   rª   ÚbarÚpcts   &          r   r“   r“   —   s¾  € ð ‡}‡}€}Ø—‘�‰à—‘ :¨h×.?Ñ.?Ð-@Ð!AÐBˆÜÑD°8×3CÒ3CÓDÈaÔP€GØ×"Õ"ˆß07�6—<‘<  ' ˜{Ñ+¸V¿\¹\ˆØ×ÑÒ&Ø�W˜MÐ*‰Dä�sœC ¤u¨V×-@Ñ-@Ó'AÓBÓCÀeÕKˆDð5ßYÙ% dÓ+Ñ-@ÀÓ-F�S÷ 58�e�W˜B˜s˜e 2 c U¨%Ñ0À¸wÀbÈÈÈUÐ=SˆDØ�?�?ˆ?Ø�fœ]¨6¯?©?Ó;Ð<Ð=Õ=‰DØ�]�]ˆ]Ø�f˜VŸ]™]˜OÐ,Õ,ˆDØ�‰�T×ñ# #ð$ 
‡L�L�×!Ñ!Ô"Ø×"×"Ð"Ø�‰�} X×%@Ñ%@Ð$AÐBÔCØ€Løô ô 5Ü—‘Ð9ÀD�ÔIØ¤# d¨S¥j£/Ð!2°!Ð4“Sð5ús   ÃGÇ8G?Ç>G?c               ó    € V ^8„  d   QhRRRR/# )r   Údrf   r   r%   r   )r   s   "r   r   r   ·   s   € ÷ ñ �ð ˜#ñ r   c                ó   € R V R 2# )Ú$z,.2fr   )r±   s   &r   Ú_fmt_usdr´   ·   s   € Øˆq�ˆhˆ<Ðr   c               ó    € V ^8„  d   QhRRRR/# ©r   Úvr	   r   zTypeGuard[float]r   )r   s   "r   r   r   »   s   € ÷ 'ñ 'ˆsð 'Ð'ñ 'r   c                ó.   € \        V \        \        34      # r   )rd   re   rf   ©r·   s   &r   Ú_is_numrº   »   s   € Ü�aœ#œu˜Ó&Ð&r   c               ó    € V ^8„  d   QhRRRR/# r¶   r   )r   s   "r   r   r   ¿   s   € ÷ Gñ G�cð GÐ.ñ Gr   c                óŽ   € \        V 4      ;'       d4    \        V \        4      '       * ;'       d    \        P                  ! V 4      # )zgTrue iff v is a real number (int/float, not bool, not NaN/Inf); TypeGuard so callers can do arithmetic.)rº   rd   rB   ÚmathÚisfiniter¹   s   &r   Ú_is_finite_numr¿   ¿   s/   € ä�1‹:×FÐFœj¨¬DÓ1Ô1×FÐF´d·m²mÀAÓ6FÐFr   r;   rC   c               ó4   € V ^8„  d   QhRRRRRRRRRRR	R
RR/# )r   r<   rN   r>   Útailr8   r%   r;   r+   rC   rB   r   rŒ   r   )r   s   "r   r   r   Ä   sI   € ÷ zñ z˜Dð z¨4ð z°tð zÈð zÐS`ð zØ!%ðzØ2Pñzr   c          
     óR   € V '       g   V'       g   R# \        RW0W,           RWER7      # )zPNous snapshot with *tail* lines appended, or None when there is nothing to show.NÚnouszNous credits)r:   r;   rC   )rR   )r<   r>   rÁ   r8   r;   rC   s   &&&$$$r   Ú_nous_snapshotrÄ   Ä   s"   € ÷ Ÿ7ÙÜ�V˜V¨g­nÀNÐY]ÔyÐyr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r&   r%   Úused_bpr	   Úresets_at_msr   zOptional[AccountUsageWindow]r   )r   s   "r   r   r   Ì   s)   € ÷ 	1ñ 	1�cð 	1 Cð 	1°sð 	1Ð?[ñ 	1r   c                óz  € \        V\        4      '       g   \        V\        4      '       g   R# \        V\        4      ;'       d    \        V\        4      '       * pV'       d$   \        P                  ! VR,          \
        R7      MRp\        V \        R\        RV\        ,          R,          4      4      VR7      # )zÐOne usage-window gauge row from basis points + an epoch-ms reset (already bounded by
``usage_gauges.parse_gauges``); None when the percent is not an int. An unknown reset keeps the row,
shown without a reset.Nr   r_   r§   r¨   )r&   r(   r*   )
rd   rB   re   r   rg   r   r$   r”   r¬   r   )r&   rÆ   rÇ   Úknownr*   s   &&&  r   Ú
_bp_windowrÊ   Ì   sˆ   € ô �'œ4× Ò ¬
°7¼C×(@Ò(@ÙÜ�|¤SÓ)×PÐP´*¸\Ì4Ó2PÔ.P€EßFKŒx×%Ò% l°TÕ&9¼cÕBÐQU€HÜ E¼¸CÄÀUÈGÔV]ÕL]Ð`eÕLeÓAfÓ8gØ'/ô1ð 1r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r*   r)   Úkeep_going_on_creditsr	   r   r%   r   )r   s   "r   r   r   Ø   s#   € ÷ 7ñ 7Ð$6ð 7Èsð 7Ð^añ 7r   c                ó¦   € Rp\        V \        4      '       d%   V P                  4       pRVR RVP                   R2pVRJ d   RMRp\         V V 2# )	zÙ``Monthly large-model usage is used up. Resets Nov 3. Past this, large models use your credits.`` (local
date). With Keep going on credits off, credits don't unlock it, so the line points at the other included models.rV   z Resets z%brX   Ú.Fz. Your other included usage is still available.z* Past this, large models use your credits.)rd   r   rs   ÚdayÚ_WINDOW_TOP_TIER_USED_UP)r*   rÌ   ÚresetsÚlocalrÁ   s   &&   r   Ú_window_top_tier_linerÓ   Ø   sg   € ð €FÜ�(œH×%Ò%Ø×#Ñ#Ó%ˆØ˜E "˜: Q u§y¡y k°Ð3ˆØ?TÐX]Ó?]Ñ;ð  dP€DÜ&Ð'¨ x°¨vÐ6Ð6r   zKKeep going on credits: off. Hermes waits for the reset (turn on in /topup).zJKeep going on credits: on. Uses your credits when included usage runs out.rÌ   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úgaugesr	   Úpaused_reasonrÌ   r   z*tuple[list[AccountUsageWindow], list[str]]r   )r   s   "r   r   r   ç   s*   € ÷ ñ ˜sð °cð Ø.1ðØ=gñr   c               óÀ  € ^ RI HpHpHpHp V! V 4      pV'       d   V! V4      '       g   . . 3# . pRp	Rp
V F`  p\        V! V4      VP                  VP                  4      pVf   K0  VP                  V4       VP                  V8X  g   KT  YËP                  r©Kb  	  . pV
'       d0   TP                  \        V	'       d   V	P                  MRV4      4       \        V\        4      '       d;   V'       d3   ^ RI Hp TP                  V! V4      '       d   \         M\"        4       W�3# VRJ d   VP                  \$        4       W�3# VRJ d   VP                  \&        4       W�3# )zóOne row per server allowance, in the server's order, plus the top-tier, payment-paused and top-up-off
lines. Empty unless the list has an allowance that stops every model. ``keep_going_on_credits``: the
account setting (None: an older server).)ÚSCOPE_TOP_TIERÚ	all_scopeÚgauge_titleÚparse_gaugesNF)Úpaused_for_paymentT)Úagent.usage_gaugesrØ   rÙ   rÚ   rÛ   rÊ   rÆ   rÇ   r–   r.   ÚfullrÓ   r*   rd   r%   rÜ   Ú_WINDOW_PAUSED_LINEÚ_WINDOW_PAUSED_OTHER_LINEÚ_WINDOW_KEEP_GOING_OFF_LINEÚ_WINDOW_KEEP_GOING_ON_LINE)rÕ   rÖ   rÌ   rØ   rÙ   rÚ   rÛ   ÚparsedÚoutÚtop_rowÚtop_fullÚgÚrowr™   rÜ   s   &$$            r   Ú_usage_window_rowsré   ç   s&  € ÷
 XÓWÙ˜&Ó!€Fß™ 6×*Ò*Ø�2ˆvˆØ$&€CØ,0€GØ€HÛˆÜ™ Q›¨¯©°A·N±NÓCˆØŠ;ÙØ�
‰
�3ŒØ�7‰7�nÖ$Ø #§V¡V’Xñ ð €EßØ�‰Ô*¿w¨7×+;Ò+;ÈDÐRgÓhÔiÜ�-¤×%Ò%¯-Ý9Ø�‰Ñ,>¸}×,MÒ,MÕ(ÔSlÔmð
 ˆ:Ðð	 
 %Ó	'Ø�‰Ô0Ô1ð ˆ:Ðð 
 $Ó	&Ø�‰Ô/Ô0Øˆ:Ðr   c               ó   € V ^8„  d   QhRR/# ©r   r   rŒ   r   )r   s   "r   r   r     s   € ÷ ;ñ ;Ð1Oñ ;r   c                ó„  €  ^ RI Hp V e   \        V RR4      '       g   R# \        V RR4      p\        V RR4      p. p. p\        V RR4      pVe2   \        \        VRR4      \        VR	R4      \        VR
R4      R7      w  rGV'       dæ   VP	                  X4       Ve   \        VRR4      MRp\        V4      '       d   VP                  R\        V4       24       \        V RR4      RJ d   V'       g   VP                  \        4       Ve@   \        VRR4      ;p	'       d+   ^ RI	H
p
 TP                  RV
! V	4      ;'       g    T	 24       \        YER.RVe   \        VRR4      MRRR7      # Ve§   \        VRR4      p\        VRR4      p\        V4      '       d|   V^ 8”  du   \        V4      '       dd   WË8:  d^   VP                  \        R\        R\        RW¼,
          V,          R,          4      4      \        V4       R\        V4       R2R7      4       VeJ   R% FC  w  rÞ\        W-R4      p\        V4      '       g   K$  VP                  V R\        V4       24       KE  	  Vel   \        VR R4      p\        V4      '       d%   V^ 8”  d   VP                  R!\        V4       24       \        VRR4      p	V	'       d   VP                  RV	 24       \        V RR4      RJ d   VP                  \        4       \        YER"V! V 4       2R#.RVe   \        VRR4      R$7      # RR$7      #   \        \         3 d     R# i ; i)&u@  NousPortalAccountInfo â†’ /usage snapshot: dollar magnitudes + renewal date + portal CTA, plus a ``% used``
gauge when the portal supplies ``monthly_credits``. A usage-window account (``usage_window`` present) shows
its allowances as percent used, the large-model line and its top-up balance instead. Fail-open â†’ None.©Únous_portal_topup_urlNÚ	logged_inFÚpaid_service_access_infoÚsubscriptionrC   rÕ   rÖ   rÌ   ©rÖ   rÌ   Úpurchased_credits_remainingzTop-up credits: Úpaid_service_accessÚcurrent_period_end)Úformat_renewszRenews: zTop up via /topupzportal-accountr;   T)r8   r;   rC   Úmonthly_creditsÚcredits_remainingÚSubscriptionr§   r¨   z of ú left©r&   r(   r,   r�   Úrollover_creditsz
Rollover: zTop up: z(or run /topup))r8   r;   ))Úsubscription_credits_remainingúSubscription credits)ró   úTop-up credits)Útotal_usable_creditsúTotal usable)Úhermes_cli.nous_accountrî   Úgetattrré   r—   r¿   r–   r´   Ú_DEPLETED_LINEÚagent.billing_usagerö   rÄ   r$   r”   r¬   ÚAttributeErrorÚ	TypeError)Úaccount_inforî   ÚaccessÚsubr<   r>   ÚuwÚwindow_linesÚtopupÚ
period_endrö   ÚcapÚsub_remainingÚattrr&   rT   Úrollovers   &                r   Úbuild_nous_credits_snapshotr    s/  € ð7ÝAØÒ¤w¨|¸[È%×'PÒ'PÙÜ˜Ð'AÀ4ÓHˆÜ�l N°DÓ9ˆØ,.ˆØˆÜ�\ >°4Ó8ˆØŠ>Ü$6Ü˜˜H dÓ+¼7À2ÀÐX\Ó;]Ü&-¨bÐ2IÈ4Ó&Pô%Ñ!ˆG÷ Ø�N‰N˜<Ô(ØLRÒL^”G˜FÐ$AÀ4ÔHÐdhˆEÜ˜e×$Ò$Ø—‘Ð!1´(¸5³/Ð1BÐCÔDÜ�|Ð%:¸DÓAÀUÓJ×S_Ø—‘œ~Ô.ØŠ´'¸#Ð?SÐUYÓ2ZÐ$Z JÖ$ZÝ=Ø—‘ ©-¸
Ó*C×*QÐ*QÀzÐ)RÐSÔTÜ! 'Ð5HÐ4IÐRbØEHÂ_¤w¨s°F¸DÔ'AÐZ^Ðmqôsð sð
 Š?Ü˜#Ð0°$Ó7ˆCÜ# CÐ)<¸dÓCˆMÜ˜c×"Ò" s¨Q¤w´>À-×3PÒ3PÐUbÔUiØ—‘Ô1Ø(´s¸3ÄÀEÈCÕL_ÐcfÕKfÐinÕKnÓ@oÓ7pÜ& }Ó5Ð6°d¼8ÀC»=¸/ÈÐOô ô ð Òó }‘�ä ¨dÓ3�Ü! %×(Ô(Ø—N‘N e W¨B¬x¸«Ð.?Ð#@ÖAñ	 }ð
 Š?Ü˜sÐ$6¸Ó=ˆHÜ˜h×'Ò'¨H°q¬LØ—‘ ¬H°XÓ,>Ð+?Ð@ÔAÜ  Ð&:¸DÓAˆJßØ—‘ ¨*¨Ð6Ô7Ü�<Ð!6¸Ó=ÀÓFØ�N‰Nœ>Ô*Ü˜g°8Ñ<QÐR^Ó<_Ð;`Ð1aÐctÐ0uØ%5ÐZ]ÒZi¼GÀCÈÐQUÓ<Vôuð 	uØosôuð 	uøäœIÐ&ô Úðús?   ‚L* ¡A'L* Â	A*L* Ã4AL* Å*L* Å.CL* ÉC L* Ì#L* Ì*L?Ì>L?c               ó   € V ^8„  d   QhRR/# rE   r   )r   s   "r   r   r   E  s   € ÷ ñ ˜ñ r   c                 óØ   €  ^ RI Hp  V ! R4      ;'       g    / P                  R4      p\        V\        4      ;'       d    \        VP                  4       4      #   \         d     R# i ; i)zNCheap local auth-state check: a Nous access token is present. Fail-open False.)Úget_provider_auth_staterÃ   Úaccess_tokenF)Úhermes_cli.authr  Úgetrd   r%   rB   rZ   r…   )r  Útoks     r   Ú_nous_logged_inr  E  sY   € ðÝ;Ù& vÓ.×4Ð4°"×9Ñ9¸.ÓIˆÜ˜#œsÓ#×9Ð9¬¨S¯Y©Y«[Ó(9Ð9øÜô Úðús   ‚A —(A Á A ÁA)Á(A)c               ó   € V ^8„  d   QhRR/# )r   Útimeoutrf   r   )r   s   "r   r   r   O  s   € ÷ "ñ " 5ñ "r   c                óL  € ^ RI p^ RIHp ^ RIHp VP                  4       pV! ^R7      pVP                  VP                  VRR7      p VP                  V R7      VP                  RR	7       #   \         d    TP                  R
 4       h i ; i  TP                  RR	7       i ; i)aú  Wall-clock-bounded fresh portal account fetch (raises on any failure/timeout).

No ``with`` block on purpose: ``Executor.__exit__`` joins the worker via
``shutdown(wait=True)``, so a portal that accepts the connection but never
answers would hold the caller until the provider's own timeout instead of
``timeout``. The abandoned daemon worker runs on to its own network timeout
and never blocks the caller or process exit; its eventual exception is
drained so GC never logs "exception was never retrieved".N)Úget_nous_portal_account_info)ÚDaemonThreadPoolExecutor)Úmax_workersT)Úforce_fresh©r  F)Úwaitc                ó"   € V P                  4       # r   )Ú	exception)Úfs   &r   Ú<lambda>Ú'_fetch_portal_account.<locals>.<lambda>b  s
   € ¨1¯;©;¬=r   )Úcontextvarsr  r  Útools.daemon_poolr   Úcopy_contextÚsubmitÚrunÚresultÚshutdownÚBaseExceptionÚadd_done_callback)r  r*  r  r   ÚcontextÚpoolÚfutures   &      r   Ú_fetch_portal_accountr6  O  s–   € ó ÝDÝ:à×&Ñ&Ó(€GÙ#°Ô2€DØ�[‰[˜Ÿ™Ð&BÐPTˆ[ÓU€Fð"Ø�}‰} Wˆ}Ó-ð
 	�‰˜5ˆÕ!øô	 ô Ø× Ñ Ñ!8Ô9Øðûð 	�‰˜5ˆÕ!ús   Á	A- Á-BÂB ÂB#c               ó    € V ^8„  d   QhRRRR/# )r   Úbpr	   r   r'   r   )r   s   "r   r   r   h  s   € ÷ 6ñ 6˜cð 6 oñ 6r   c                ó®   € \        V \        4      '       g   \        V \        4      '       g   R # \        R\	        RV \
        ,          R,          4      4      # )Nr§   r¨   )rd   rB   re   r”   r¬   r   )r8  s   &r   Ú_header_gauge_percentr:  h  s;   € Ü�"”d×Ò¤:¨b´#×#6Ò#6ÙÜˆs”C˜˜r¤G�|¨eÕ3Ó4Ó5Ð5r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r‹   rŒ   Úcredits_stater	   r   r   )r   s   "r   r   r   n  s)   € ÷ "Fñ "FÐ!?ð "FÐPSð "FÐXvñ "Fr   c           	     óÈ  aa€ V e   V P                   '       d   Vf   V # \        VRR4      '       d   \        VRR4      '       g   V # ^ RIHo \        VRR4      ;'       g    R Uu/ uF"  pS! V4      VP                  VP
                  3bK$  	  pp\        \        P                  ! 4       R,          4      p. pRpV P                   FÃ  pVP                  VP                  R4      w  r‰\        V	\        4      ;'       d"    \        V	\        4      '       * ;'       d    WI8¬  p
V
'       d   RM
\        V4      pVP                  pVe   Ve   V\        V4      8:  d   VP!                  V4       K¦  RpVP!                  \#        W{R	7      4       KÅ  	  V'       g   V # V P$                  p\        VR
R4      o\'        VV3R lV 4       R4      pVe   VP                  ;'       g    ^ ^d8¼  dd   \(        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       g*   V\+        VP,                  \        VRR4      4      3,           p\#        V \/        V4      VR7      # u upi )a  Raise window percents to the last response headers when those are ahead of the portal.

The portal counter waits on spend-log ingestion. The headers already include finished included
calls, and a large-model call that drew top-up reports that allowance full.NÚfrom_headerFÚis_usage_window)rÚ   rÕ   r   T)r(   Útop_tier_gaugec              3  óf   <"  € T F&  pSf   K	  VP                   S! S4      8X  g   K"  Vx € K(  	  R # 5ir   ©r&   )r¢   ÚwrÚ   Ú	top_gauges   & €€r   r£   Ú%apply_header_gauge.<locals>.<genexpr>Œ  s(   øé € Ðb™7�a i”ÀÇÁÉ;ÐW`ÓKaÑ@a—’›7ùs   ƒ1Ž1§
1c              3  óJ   "  € T F  qP                  \        4      x € K  	  R # 5ir   )Ú
startswithrÐ   )r¢   Úlines   & r   r£   rE  Ž  s   é € ÐQÉÀ—?‘?Ô#;×<Ð<Ëùs   ‚!#rÌ   )r<   r>   r   ©NN)rC   r  rÝ   rÚ   rÆ   rÇ   re   Útimer<   r  r&   rd   rB   r:  r(   rf   r–   r   r>   ÚnextÚanyrÓ   r*   rQ   )r‹   r<  rç   ÚmappingÚnow_msr<   Úchangedrš   r8  rÇ   ÚstaleÚheaderÚcurrentr>   ÚtoprÚ   rD  s   &&             @@r   Úapply_header_gaugerT  n  sþ  ù€ ð
 Ò˜x×4×4Ð4¸Ò8MØˆÜ�= -°×7Ò7¼wÀ}ÐVgÐin×?oÒ?oØˆõ /ÜDKÈMÐ[cÐegÓDh×DnÐDnÐlnÐDnÓoÑDn¸q‰{˜1‹~ §	¡	¨1¯>©>Ð:Ò:ÑDn€GÐoÜ”—’“˜tÕ#Ó$€FØ(*€GØ€GØ×"Ô"ˆØ"Ÿ;™; v§|¡|°\ÓBÑˆÜ˜<¬Ó-×oÐo´jÀÌtÓ6TÔ2T×oÐoÐY_ÑYoˆß‘Ô$9¸"Ó$=ˆØ×%Ñ%ˆØŠ>˜Wš_°¼%À».Ô0HØ�N‰N˜6Ô"ÙØˆØ�‰”w˜vÔ;Ö<ñ #÷ ØˆØ×Ñ€GÜ˜Ð'7¸Ó>€IÜ
Õb™7ÓbÐdhÓ
i€CØ
‚˜C×,Ñ,×1Ð1°°cÔ9ß‹sÑQÉÓQ�s�sŠsÑQÉÓQ×QÒQØÔ!6°s·|±|ÄWÈ]Ð\sÐuyÓEzÓ!{Ð }Õ}ˆGÜ�8¤U¨7£^¸WÔEÐEùò- ps   Á&(Ir  ç      $@r<  c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   r‰   rB   r  rf   r<  r	   r   r�   r   )r   s   "r   r   r   “  s0   € ÷ añ a Dð a¸5ð aÐX[ð aÐgpñ ar   c                ó*   € \        WVR7      ^ ,          # )u±  Rendered Nous-credits /usage lines, or [] when there's nothing to show. Independent of any live agent
(logged-in gate, then a bounded portal fetch); shared by CLI ``_show_usage`` and the TUI ``session.usage`` RPC.
Fail-open: any hiccup or timeout â†’ []. HERMES_DEV_CREDITS_FIXTURE renders from the fixture instead of the portal.
``credits_state`` is the last response's header gauge; when it is ahead of the portal, the bars use it.©r‰   r  r<  )Únous_credits_viewrX  s   $$$r   Únous_credits_linesrZ  “  s   € ô
  hÈ}Ô]Ð^_Õ`Ð`r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   r‰   rB   r  rf   r<  r	   r   ztuple[list[str], bool]r   )r   s   "r   r   r   ›  s*   € ÷ ñ  4ð ¸%ð ÐWZð Ðf|ñ r   c                óú  €  ^ RI Hp V! 4       pVe7   \        V4      p\        WPR7      \        T;'       d    VP                  4      3# \        4       '       g   . R3#  \        \        \        V4      4      V4      p\        WPR7      \        T;'       d    VP                  4      3#   \         d    \        P	                  RRR7       Rp L¾i ; i  \         d    \        P	                  RRR7       . R3u # i ; i)	uš   ``nous_credits_lines`` plus whether they are the usage-window layout (callers keep today's
presentation for everyone else). Fail-open â†’ ``([], False)``.)Údev_fixture_credits_statezDev credits fixture unavailableTr€   N©r‰   Fu9   credits â–¸ /usage portal fetch/render failed (fail-open))Úagent.credits_trackerr]  r…   r†   r‡   Ú_snapshot_from_credits_stater�   rB   rC   r  rT  r  r6  )r‰   r  r<  r]  Úfixturer‹   s   $$$   r   rY  rY  ›  só   € ðÝCÙ+Ó-ˆð ÒÜ/°Ó8ˆÜ)¨(ÔFÌÈX×MoÐMoÐZb×ZoÑZoÓHpÐpÐpÜ×ÒØ�5ˆyÐðÜ%Ü'Ô(=¸gÓ(FÓGÈó
ˆô *¨(ÔFÌÈX×MoÐMoÐZb×ZoÑZoÓHpÐpÐpøô ô Ü�‰Ð6ÀˆÔFØŠðûô ô ä�‰ÐPÐ[_ˆÔ`Ø�5ˆyÒðús$   ‚B' ÁAC Â'$CÃCÃ&C:Ã9C:c               ó    € V ^8„  d   QhRRRR/# )r   Úagentr	   r   zdict[str, Any]r   )r   s   "r   r   r   ´  s   € ÷ oñ o Sð o°Nñ or   c                óì   €  \        V '       d   \        V RR4      MRR7      w  rT'       d   RT/T'       d   RR/,          # / ,          # / #   \         d    \        P	                  RRR7       / u # i ; i)	zÍThe ``session.usage`` fields for the Nous credits block: ``credits_lines`` (when there are any) and
``credits_usage_window`` for the usage-window layout. Reads *agent*'s live credits headers. Never raises.Ú_credits_stateN)r<  u%   credits â–¸ /usage fields unavailableTr€   Úcredits_linesÚcredits_usage_window)rY  r  r…   r†   r‡   )rc  r™   Ú	is_windows   &  r   Únous_credits_usage_fieldsri  ´  sy   € ðÜ,×ej¼7À5ÐJZÐ\`Ô;aÐptÔuÑˆ÷ bgˆ_˜eÐ$Ï)Ð)?ÀÐ(FÕ\ÐnÐY[Õ\ÐnÐlnÐnøô ô Ü�‰Ð<ÀtˆÔLØŠ	ðús   ‚#A Á$A3Á2A3c               ó   € V ^8„  d   QhRR/# rë   r   )r   s   "r   r   r   ¿  s   € ÷ $ñ $Ð+Iñ $r   c                ó  €  V f   R# . p. p\        V RR4      '       d°   \        V P                  V P                  \        V RR4      R7      w  rVP	                  V4       \        V RR4      '       d   VP                  RV P                   24       \        V RR	4      RJ d   V'       g   VP                  \        4       \        WR
.RR	R7      # \        V RR4      p\        V RR4      p\        V RR4      p\        V4      '       dn   \        P                  ! V4      '       dR   TP                  \        R\        R\        RVR,          4      4      V'       d   V'       d
   RV RV R2MRR7      4       VR3\        V RR4      R3\        V RR4      R33 F%  w  rxV'       g   K  VP                  V RV 24       K'  	  \        V RR	4      RJ d   VP                  \        4       \        WR
.RR7      #   \        \         3 d     R# i ; i)u½   Header-shaped CreditsState (dev fixture) â†’ /usage snapshot, same shape as the portal path. *_usd strings
are display-only; the % comes from CreditsState.used_fraction. Fail-open â†’ None.Nr?  FrÌ   rò   Úpurchased_usdzTop-up credits: $Úpaid_accessTu,   (dev fixture â€” HERMES_DEV_CREDITS_FIXTURE)zdev-fixture)r8   rC   Úused_fractionÚsubscription_usdÚsubscription_limit_usdrù   r§   r¨   r³   ú of $rú   rû   rþ   rÿ   Úremaining_usdr  z: $)r8   )r  ré   rÕ   rÖ   r—   r–   rl  r  rÄ   rº   r½   r¾   r$   r”   r¬   r  r  )	Ústater<   r>   r  ÚufÚsub_usdÚcap_usdrT   r&   s	   &        r   r`  r`  ¿  sð  € ð!ØŠ=ÙØ,.ˆØˆÜ�5Ð+¨U×3Ò3Ü$6Ø—‘¨E×,?Ñ,?Ü&-¨eÐ5LÈdÓ&Sô%Ñ!ˆGð �N‰N˜<Ô(Ü�u˜o¨t×4Ò4Ø—‘Ð!2°5×3FÑ3FÐ2GÐHÔIÜ�u˜m¨TÓ2°eÓ;ÇLØ—‘œ~Ô.Ü! 'Ð5cÐ4dÐmzØ/3ô5ð 5ä�U˜O¨TÓ2ˆÜ˜%Ð!3°TÓ:ˆÜ˜%Ð!9¸4Ó@ˆÜ�2�;Š;œ4Ÿ=š=¨×,Ò,Ø�N‰NÔ-Ø$´3°s¼CÀÀrÈEÅzÓ<RÓ3Sß;BÇw˜˜7˜) 5¨¨	°Ñ7ÐTXôô ð &Ð'=Ð>ÄÈÐP_ÐaeÓAfÐhxÐ@yÜ% e¨_¸dÓCÀ^ÐTóV‰LˆEç‰uØ—‘ % ¨¨E¨7Ð3Ö4ñVô �5˜-¨Ó.°%Ó7Ø�N‰Nœ>Ô*Ü˜gÐ1_Ð0`ÐivÔwÐwøÜœIÐ&ô Úðús7   ‚G2 ˆB G2 Â)$G2 ÃAG2 Ä"<G2 Å?G2 Æ#AG2 Ç2HÈHc                  ó^   € ] tR tRt$ RtR]R&   RtR]R&   RtR]R	&   RtR]R
&   Rt	R]R&   Rt
R# )ÚCreditsViewiæ  uÃ   Surface-agnostic ``/topup`` balance view: one portal fetch, consumed identically by every money surface.
Fail-open: not logged in / portal unreachable â†’ ``logged_in`` False, ``topup_url`` None.rB   rï   r=   Úbalance_linesNr+   Úidentity_lineÚ	topup_urlFÚdepletedr   )r/   r0   r1   r2   Ú__doc__r3   ry  rz  r{  r|  r4   r   r   r   rx  rx  æ  s7   ‡ ñbð ƒOØ%'€M�?Ó'Ø#'€M�=Ó'Ø#€Iˆ}Ó#Ø€Hˆd×r   rx  c               ó$   € V ^8„  d   QhRRRRRR/# )r   r‰   rB   r  rf   r   rx  r   )r   s   "r   r   r   ò  s!   € ÷ ñ  Dð ¸5ð ÈKñ r   c                óÜ  € \        RR7      p\        4       '       g   V#  \        V4      pTe   \        TRR4      '       g   T# ^ RIHp \        \        T4      T R	7       Uu. uF,  pTP                  4       P                  R4      '       d   K*  TNK.  	  pp\        TR
R4      3 Uu. uF  qw'       g   K  \        T4      NK  	  pp\        TRR4      p	T	'       d   TP                  RT	 24       \        R\        T4      T'       d   RRP!                  T4      ,           MRT! T4      \        TRR4      RJ R7      #   \         d    \        P                  RRR7       Tu # i ; iu upi u upi )uõ   /topup view: balance block + identity line + top-up URL. Reuses the /usage fetch + snapshot so numbers
match; the balance block drops the trailing top-up/hint lines (/topup has its own affordance).
Fail-open â†’ ``CreditsView(logged_in=False)``.F)rï   u2   credits â–¸ /topup portal fetch failed (fail-open)Tr€   Nrï   rí   r^  ÚemailÚorg_namezorg zTopping up as ú / rô   )rï   ry  rz  r{  r|  )zTop up:z
Top up viaz(or run)rx  r  r6  r…   r†   r‡   r  r  rî   r�   r  ÚlstriprG  r%   r–   rQ   Újoin)
r‰   r  Únot_logged_inr-   rî   rH  ry  r·   Úwhor�  s
   $$        r   Úbuild_credits_viewr‡  ò  s[  € ô  ¨%Ô0€MÜ×ÒØÐðÜ'¨Ó0ˆð ‚œg g¨{¸E×BÒBØÐÝ=ô /Ô/JÈ7Ó/SÐ^fÕgóágˆDØ�{‰{‹}×'Ñ'Ð(L×M÷ 	ˆÙgð ð ô
 $ G¨W°dÓ;Ñ=Ó
CÑ=�aÃŒ6Œ3ˆqŽ6Ñ=€CÐ
CÜ�w 
¨DÓ1€HßØ�
‰
�T˜(˜Ð$Ô%ÜØ¤e¨MÓ&:ß>AÐ'¨%¯*©*°S«/Ö9ÀtÑWlÐmtÓWuÜ˜Ð"7¸Ó>À%ÐGôð øô ô Ü�‰ÐIÐTXˆÔYØÒðüòùò
 Ds)    D: Á"'E$ÂE$Â&	E)Â4E)Ä:$E!Å E!c               ó    € V ^8„  d   QhRRRR/# )r   Úbase_urlr%   r   ztuple[str, str, str]r   )r   s   "r   r   r     s   € ÷ sñ s #ð sÐ*>ñ sr   c                óâ   € T ;'       g    RP                  4       P                  R4      ;'       g    RpVP                  R4      pTRV9   d   RMR,           pVR,           VR	,           VR
,           3# )zÀCodex backend endpoints (usage, reset-credits list, consume). Mirrors the Codex CLI's PathStyle
split: ``/backend-api`` bases use the ChatGPT ``/wham/`` paths; everything else ``/api/codex/``.rV   Ú/z%https://chatgpt.com/backend-api/codexz/codexz/backend-apiz/whamz
/api/codexz/usagez/rate-limit-reset-creditsz!/rate-limit-reset-credits/consume)rZ   ÚrstripÚremovesuffix)r‰  Ú
normalizedÚprefixs   &  r   Ú_codex_backend_urlsr�    sm   € ð —.�.˜b×'Ñ'Ó)×0Ñ0°Ó5×`Ð`Ð9`€JØ×(Ñ(¨Ó2€JØ n¸
Ô&B™7ÈÕU€FØ�XÕ˜vÐ(CÕCÀVÐNqÕEqÐrÐrr   Úforce_refreshc               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r‰  r+   Úapi_keyr‘  rB   r   ztuple[str, str, Optional[str]]r   )r   s   "r   r   r     s2   € ÷ 2gñ 2gØð2gØ&3ð2gØGKð2gà#ñ2gr   c               ó  € \        T;'       g    R4      P                  4       pV'       d/   V'       g'   T\        T ;'       g    R4      P                  4       R3# V'       dµ    \        \        4       P                  R4      ;'       g    / P                  RR4      ;'       g    R4      P                  4       pWC8w  dZ   ^ RIHp V! R4      P                  VR7      pVf   \        R4      hVP                  \        VP                  ;'       g    T 4      R3#  R	R
/pV'       d   R
VR&   \        R/ VB pRp	 \        4       P                  R4      ;'       g    / p
\        V
P                  RR4      ;'       g    R4      P                  4       ;'       g    Rp	VR,          \        VP                  RR4      ;'       g    R4      P                  4       V	3#   \         d    Rp EL,i ; i  \         d    \        P                  RR
R7        Lui ; i  \         d    \        P                  RR
R7        Mi ; i^ RIHp T! R4      P                  4       pTf   \        R4      hTP                  \        TP                  ;'       g    T 4      R3# )uÚ   Codex quota credentials: explicit live-agent creds â†’ native runtime resolver (itself pool-aware) â†’ direct
pool select. Native OAuth stores device-code logins in the pool, so the singleton store alone is not enough.rV   NÚtokensr  )Ú	load_poolúopenai-codex)Úapi_key_hintz;Could not refresh the Codex credential this session runs onÚrefresh_if_expiringTr‘  Ú
account_idu5   codex â–¸ /usage account_id read failed (best-effort)r€   r“  r‰  u@   codex â–¸ /usage runtime resolver returned no creds; trying poolz7No available openai-codex credential in credential poolr   )r%   rZ   r   r  r   Úagent.credential_poolr–  Útry_refresh_matchingÚRuntimeErrorÚruntime_api_keyr   Úruntime_base_urlr   r†   r‡   Úselect)r‰  r“  r‘  Úexplicit_keyÚsingleton_keyr–  ÚentryÚresolve_kwargsÚcredsrš  r•  s   &&$        r   Ú _resolve_codex_usage_credentialsr¦    sO  € ô
 �w—}�} "Ó%×+Ñ+Ó-€LßŸMØœS § ¨RÓ0×6Ñ6Ó8¸$Ð>Ð>ßð	ÜÔ!3Ó!5×!9Ñ!9¸(Ó!C×!IÐ!IÀr× NÑ NÈ~Ð_aÓ b× hÐ hÐfhÓi×oÑoÓqˆMð Ô(Ý7Ù˜nÓ-×BÑBÐP\ÐBÓ]ˆEØŠ}Ü"Ð#`ÓaÐaØ×(Ñ(Ô*DÀU×E[ÑE[×EgÐEgÐ_gÓ*hÐjnÐnÐnðhð 0°Ð6ˆßØ.2ˆN˜?Ñ+Ü1ÑC°NÑCˆØ$(ˆ
ð	aÜ'Ó)×-Ñ-¨hÓ7×=Ð=¸2ˆFÜ˜VŸZ™Z¨°bÓ9×?Ð?¸RÓ@×FÑFÓH×PÐPÈDˆJð �YÕ¤ U§Y¡Y¨z¸2Ó%>×%DÐ%DÀ"Ó!E×!KÑ!KÓ!MÈzÐYÐYøô9 ô 	Ø‹Mð	ûô2 ô 	aä�L‰LÐPÐ[_ˆLÖ`ð	aûô ô hÜ�‰ÐWÐbfˆÖgðhúõ 0Ù�nÓ%×,Ñ,Ó.€EØ‚}ÜÐTÓUÐUà× Ñ Ô"<¸U×=SÑ=S×=_Ð=_ÐW_Ó"`ÐbfÐfÐfsr   Á#$G ÂG Â"G ÄH Ä#H Ä6G' Å G' Å7G' ÆG' Æ%H Æ<H ÇG$Ç#G$Ç'"HÈ	H ÈHÈH È"H4È3H4c               ó    € V ^8„  d   QhRRRR/# )r   ÚpayloadÚdictr   re   r   )r   s   "r   r   r   O  s   € ÷ +ñ + $ð +¨3ñ +r   c                ó’   € V P                  R 4      ;'       g    / P                  R4      p\        V4      '       d   \        V4      # ^ # )Úrate_limit_reset_creditsÚavailable_count)r  rº   re   )r¨  rA   s   & r   Ú_codex_banked_resetsr­  O  s<   € Ø�;‰;Ð1Ó2×8Ð8°b×
=Ñ
=Ð>OÓ
P€CÜ˜s—|’|Œ3ˆs‹8Ð*¨Ð*r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Útokenr%   rš  r+   r   údict[str, str]r   )r   s   "r   r   r   T  s&   € ÷ jñ j˜#ð j¨=ð j¸^ñ jr   c                óR   € ^ RI Hp RRV  2RRRR/V! V 4      CV'       d   RV/C# / C# )	z`auth.json's ``account_id`` wins over the JWT claim; the JWT still supplies the residency header.)Úcodex_account_headersÚAuthorizationúBearer ÚAcceptúapplication/jsonú
User-Agentz	codex-clizChatGPT-Account-ID)Úagent.codex_headersr²  )r¯  rš  r²  s   && r   Ú_codex_headersr¹  T  sU   € å9Ø˜w u gÐ.°Ð:LÈlÐ\gð jÙ# EÓ*ðjßU_Ð0DÀjÐ/Qðjð jØegðjð jr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   Úurlr%   Úheadersr°  r  rf   r   r©  r   )r   s   "r   r   r   [  s(   € ÷ !ñ !�3ð ! ð !¸Uð !Àtñ !r   c               óð   € \         P                  ! VR 7      ;_uu_ 4       pVP                  WR7      pVP                  4        RRR4       XP	                  4       ;'       g    / #   + '       g   i     L*; i)r#  ©r¼  N)ÚhttpxÚClientr  Úraise_for_statusÚjson)r»  r¼  r  ÚclientÚresponses   &&$  r   Ú	_get_jsonrÅ  [  sS   € Ü	�Š˜g×	&Õ	&¨&Ø—:‘:˜c�:Ó3ˆØ×!Ñ!Ô#÷ 
'ð �=‰=‹?× Ð ˜bÐ ÷ 
'×	&ús    #A%Á%A5	ÚfractionÚmodel_scopedc               ó4   € V ^8„  d   QhRRRRRRRRRR	R
RRR/# )r   r8   r©  rM  útuple[tuple[str, str], ...]Úused_keyr%   Ú	reset_keyrÆ  rB   rÇ  zfrozenset[str] | set[str]r   zlist[AccountUsageWindow]r   )r   s   "r   r   r   b  sF   € ÷ ñ ØðØ6ðØBEðØRUðØdhðà+ðð ñr   c               óD  € . pV F—  w  rxV P                  V4      ;'       g    / p	V	P                  V4      p
V
f   K7  \        V
4      p
V'       d   V
^8:  d
   V
^d,          p
TP                  \        YŠ\	        V	P                  V4      4      Wu9   d   RMRR7      4       K™  	  V# )z®Build windows from ``source[key][used_key]``; ``fraction`` scales values <= 1 to percent.
``model_scoped`` keys build windows that cap only a model family, never the account.Úmodelr-   )r&   r(   r*   r.   )r  rf   r–   r$   rm   )r8   rM  rÊ  rË  rÆ  rÇ  r<   Úkeyr&   rš   rœ   s   &&&&$$     r   Ú_usage_windowsrÏ  b  s“   € ð )+€GÛ‰
ˆØ—‘˜C“×&Ð& BˆØ�z‰z˜(Ó#ˆØŠ<ÙÜ�T‹{ˆß˜ œ	Ø�C�KˆDØ�‰Ô)Ø´Y¸v¿z¹zÈ)Ó?TÓ5UØ Ô0‘'°iô
ö 	ñ ð €Nr   iPF  ÚSessioni€:	 ÚWeeklyc               ó    € V ^8„  d   QhRRRR/# )r   Ú
rate_limitr©  r   rÉ  r   )r   s   "r   r   r   }  s   € ÷ ñ  Tð Ð.Iñ r   c                óJ  € . p\          F�  w  r#V P                  V4      ;'       g    / p\        V\        4      '       d   VP                  R4      MRp\	        V4      '       d    \
        P                  \        V4      V4      MTpVP                  W&34       K�  	  \        V4      # )aµ  Label Codex windows by their published duration, not response position (#65387).

The usage API keys windows ``primary_window``/``secondary_window`` by position; when only the
weekly limit is returned it occupies ``primary_window`` and the positional mapping mislabeled it
``Session``. Windows whose ``limit_window_seconds`` is missing or unrecognized keep the legacy
positional label so duration-less payloads render exactly as before.
Úlimit_window_secondsN)	Ú_CODEX_WINDOW_POSITIONAL_LABELSr  rd   r©  rº   Ú_CODEX_WINDOW_LABELS_BY_SECONDSre   r–   rQ   )rÓ  ÚlabelsrÎ  Úfallbackrš   Úsecondsr&   s   &      r   Ú_codex_window_labelsrÛ  }  sˆ   € ð €Fß8‰ˆØ—‘ Ó$×*Ð*¨ˆÜ8BÀ6Ì4×8PÒ8P�&—*‘*Ð3Ô4ÐVZˆÜOVÐW^×O_ÒO_Ô/×3Ñ3´C¸³LÀ(ÔKÐemˆØ�‰�s�lÖ#ñ	 9ô
 �‹=Ðr   c               ó    € V ^8„  d   QhRRRR/# )r   Úcountre   r   r%   r   )r   s   "r   r   r   Ž  s   € ÷ %ñ %�3ð %˜3ñ %r   c                ó   € V ^8w  d   R# R# )é   ÚsrV   r   )rÝ  s   &r   Ú_pluralrá  Ž  s   € Ø˜1”*ˆ3Ð$ "Ð$r   c               ó$   € V ^8„  d   QhRRRRRR/# ©r   r‰  r+   r“  r   rŒ   r   )r   s   "r   r   r   ’  s)   € ÷ Oñ OØðOØ-:ðOà#ñOr   c                ó   € \        WR R7      # )F©Ú	read_only©Ú_fetch_codex_account_usage_impl©r‰  r“  s   &&r   Ú_fetch_codex_account_usagerê  ’  s   € ô +¨8ÈÔNÐNr   c               ó$   € V ^8„  d   QhRRRRRR/# rã  r   )r   s   "r   r   r   ˜  s)   € ÷ Nñ NØðNØ-:ðNà#ñNr   c                ó   € \        WRR7      # )u?  Picker-cache variant: a 401 is reported, never repaired. The live-agent path
(``_fetch_codex_account_usage``) retries via a forced credential refresh because the
session it serves owns that credential; a per-credential read of the pool must NOT
rotate, refresh or mutate anything â€” it just marks that account unknown.Trå  rç  ré  s   &&r   Ú$_fetch_codex_account_usage_read_onlyrí  ˜  s   € ô +¨8ÈÔMÐMr   ræ  c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r‰  r+   r“  ræ  rB   r   rŒ   r   )r   s   "r   r   r   ¢  s2   € ÷  Lñ  LØð LØ-:ð LØQUð Là#ñ Lr   c               ó2  € \        W4      w  r4p \        \        V4      ^ ,          \        W54      RR7      pVP                  R4      ;'       g    / p\        V\        V4      RR	4      p	. p
\        V4      pV^ 8”  d"   V
P                  R
V R\        V4       R24       VP                  R4      ;'       g    / VP                  R4      ;'       g    / P                  R4      rÜVP                  R4      '       d1   \        V4      '       d    V
P                  R\        V4      R 24       M?VP                  R4      '       d)   VP                  R4      '       d   V
P                  R4       \!        RRWš\#        VP                  R4      4      \%        V4      VR7      #   \        P
                   dh   pTP                  P                  R8w  d   h T'       d   h \        YRR7      w  r4p\        \        T4      ^ ,          \        Y54      RR7      p Rp?ELÚRp?ii ; i)r   ç      .@r#  é‘  T©r‘  NrÓ  r(   r*   z	You have ú resetz& banked - use /usage reset to activateÚcreditsÚbalanceÚhas_creditsúCredits balance: $ú.2fÚ	unlimitedzCredits balance: unlimitedr—  Ú	usage_apiÚ	plan_type)r;   r@   rA   )r¦  rÅ  r�  r¹  r¿  ÚHTTPStatusErrorrÄ  Ústatus_coder  rÏ  rÛ  r­  r–   rá  rº   rf   rR   r\   Ú_codex_snapshot_identity)r‰  r“  ræ  r¯  Úresolved_base_urlrš  r¨  ÚexcrÓ  r<   r>   rÝ  rô  rõ  s   &&$           r   rè  rè  ¢  sÔ  € ô ,LÈHÓ+^Ñ(€E˜jð
ÜÜÐ 1Ó2°1Õ5´~ÀeÓ7XÐbfô
ˆð —‘˜\Ó*×0Ð0¨b€JÜ˜ZÔ)=¸jÓ)IÈ>Ð[eÓf€GØ€GÜ  Ó)€EØˆq„yØ�‰˜ 5 '¨´¸³Ð/?Ð?eÐfÔgØ—{‘{ 9Ó-×3Ð3°°g·k±kÀ)Ó6L×6RÐ6RÐPR×5WÑ5WÐXaÓ5bˆWØ‡{�{�=×!Ò!¤g¨g×&6Ò&6Ø�‰Ð+¬E°'«N¸3Ð+?Ð@ÕAØ	�‰�]×	#Ò	#¨¯©°K×(@Ò(@Ø�‰Ð3Ô4Ü�^ [°'ÔIYÐZa×ZeÑZeÐfqÓZrÓIsÜ6°uÓ=À7ôLð Løô/ × Ñ ô 
Ø�<‰<×#Ñ# sÔ*ØßàÜ/OØ¨Tô0
Ñ,ˆ *ô ÜÐ 1Ó2°1Õ5´~ÀeÓ7XÐbfô
Žûð
ús   �'F ÆHÆ/#HÇ8HÈHc               ó    € V ^8„  d   QhRRRR/# )r   r¯  r%   r   r+   r   )r   s   "r   r   r   Å  s   € ÷ Iñ I Cð I¨Mñ Ir   c                ó^   € ^ RI Hp V! V 4      pV'       d   RV^ ,           RV^,           2# R# )zéTrusted per-account identity of a Codex credential: the decoded JWT principal
(``chatgpt_account_id`` + ``sub``), never the token itself. Two credentials for one
workspace member share it, so pool accounts are counted once, honestly.)Ú_codex_principal_identityzcodex:Ú:N)r›  r  )r¯  r  Ú	principals   &  r   rþ  rþ  Å  s4   € õ @á)¨%Ó0€Iß5>ˆV�I˜a•L�>  9¨Q¥< .Ð1ÐHÀDÐHr   c                  ób   € ] tR tRt$ RtR]R&   R]R&   ^ tR]R&   ^ tR]R&   ]R	 R
 l4       t	Rt
R# )ÚCodexResetRedeemResultiÏ  z>Outcome of a `/usage reset` attempt against the Codex backend.r%   ÚstatusÚmessagere   r¬  Úwindows_resetc               ó   € V ^8„  d   QhRR/# rE   r   )r   s   "r   r   Ú#CodexResetRedeemResult.__annotate__Ù  s   € ÷ &ñ &˜$ñ &r   c                	ó    € V P                   R 8H  # )Úreset)r  rH   s   &r   ÚredeemedÚCodexResetRedeemResult.redeemedØ  s   € à�{‰{˜gÑ%Ð%r   r   N)r/   r0   r1   r2   r}  r3   r¬  r
  rL   r  r4   r   r   r   r  r  Ï  s5   ‡ áHàƒKØƒLØ€O�SÓØ€M�3Óàô&ó ô&r   r  r¨   c               ó    € V ^8„  d   QhRRRR/# )r   r	  r%   r   r  r   )r   s   "r   r   r   â  s   € ÷ Iñ I˜#ð IÐ"8ñ Ir   c                ó   € \        R V R7      # )Úunavailable©r  r	  )r  )r	  s   &r   Ú_unavailabler  â  s   € Ü!¨ÀÔHÐHr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   r¨  r©  rJ   re   ÚforcerB   r   z Optional[CodexResetRedeemResult]r   )r   s   "r   r   r   æ  s)   € ÷ ñ  ð °ð ¸Tð ÐFfñ r   c                ó–  a€ V^ 8:  d   \        RRR7      # V P                  R4      ;'       g    / oV3R lR 4        Uu. uF!  p\        V4      '       g   K  \        V4      NK#  	  ppV'       d   \	        R.VO5!  MRpV'       g   Ve   V\
        8¼  d   R# Ve   RVR	 R
2MRp\        RVRV RV R\        V4       R2R7      # u upi )zhRefuse a redemption that would be wasted (no banked credits, or no window fully used and not ``force``).Úno_credits_bankedu>   No banked reset credits on this account â€” nothing to redeem.r  rÓ  c              3  óx   <"  € T F/  pSP                  V4      ;'       g    / P                  R 4      x € K1  	  R# 5i)r(   N)r  )r¢   ÚkrÓ  s   & €r   r£   Ú%_codex_reset_guard.<locals>.<genexpr>ë  s>   øé € ð  $Cñ  \BÐVW Z§^¡^°AÓ%6×%<Ð%<¸"×$AÑ$AÀ.×$QÐ$Qó  \Bùs   ƒ: :r§   Nzyour busiest window is only z.0fz% usedz6your current usage could not be confirmed as exhaustedÚnot_exhaustedu   âš ï¸� Not redeeming: zl. A banked reset restores your FULL 5h + weekly limits, so spending it now would waste most of it. You have ró  z5 banked. Use `/usage reset --force` to redeem anyway.)r  r¬  r	  )Úprimary_windowÚsecondary_window)r  r  rº   rf   r”   Ú_CODEX_WINDOW_EXHAUSTED_PERCENTrá  )r¨  rJ   r  ÚuÚ	used_pctsÚ
worst_usedÚ
usage_noterÓ  s   &&&    @r   Ú_codex_reset_guardr%  æ  sþ   ø€ à�A„~Ü%Ð-@ð  KKô  Lð  	LØ—‘˜\Ó*×0Ð0¨b€Jô $Cñ  \Bô  $Có  ñ  $C˜aÜ˜A—Jô ”�q–ñ  $C€Ið  ç:C¤# cÐ"6¨IÔ"6È€Jß�Ò'¨JÔ:YÔ,YÙØKUÒKaÐ0°¸CÐ0@ÀÑGØOð ä!Ø°	Ø)¨*¨ð 69Ø9B¸À6Ì'ÐR[ÓJ\ÐI]ð ^@ðAôð ùò s   ¿CÁCc               ó$   € V ^8„  d   QhRRRRRR/# )r   Úbodyr©  rJ   re   r   r  r   )r   s   "r   r   r   ú  s'   € ÷ tñ t˜tð t°ð tÐ8Nñ tr   c           	     ó  € \        V P                  RR4      ;'       g    R4      P                  4       P                  4       p\	        ^ V^,
          4      pRRV R\        V4       R2V3RRV3R	RR
RV3/pW$9  d   \        RV : 24      # ^ pVR8X  d>    ^ RIHp V! 4        V P                  R4      p\        V4      '       d   \        V4      M^ pWB,          w  r‰\        W(W•R7      #   \         d    \        P                  RRR7        Lji ; i)z^Map the consume response ``code`` to a result (``reset`` also lifts persisted pool cooldowns).ÚcoderV   r  u:   âœ… Reset redeemed â€” your usage limits have been reset. z banked resetz remaining.Únothing_to_resetu\   Backend reports nothing to reset â€” your limits aren't exhausted. The credit was NOT spent.Ú	no_creditÚalready_redeemeduI   This redemption was already processed â€” no additional credit was spent.z,Unexpected response from the Codex backend: )Ú clear_codex_pool_quota_cooldownsz;Failed to clear Codex pool cooldowns after reset redemptionTr€   r
  )r  r	  r¬  r
  )z:Backend reports no available reset credit on this account.r   )r%   r  rZ   Úlowerr”   rá  r  r  r-  r…   r†   r‡   rº   re   r  )
r'  rJ   r)  Ú	remainingÚoutcomesr
  r-  rA   r	  rÝ  s
   &&        r   Ú_codex_reset_outcomer1  ú  s0  € äˆt�x‰x˜ Ó#×)Ð) rÓ*×0Ñ0Ó2×8Ñ8Ó:€DÜ�A�y 1•}Ó%€IàÐNÈyÈkÐYfÔgnÐoxÓgyÐfzð  {Fð  GØðàÐ{ð  ~Gð  HØÐVØÐhÐjsÐtð,€Hð ÔÜÐJÈ4É(ÐSÓTÐTØ€MØˆw„ð	gÝHÙ,Ô.ð �h‰h�Ó'ˆÜ$+¨C§L¢Lœ˜Cœ°aˆØ•^�N€GÜ!¨ÐPUÔsÐsøô ô 	gÜ�L‰LÐVÐaeˆLÖfð	gús   ÂC' Ã'"DÄDr‰  r“  r  c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r‰  r+   r“  r  rB   r   r  r   )r   s   "r   r   r     s,   € ÷ 31ñ 31Øð31Ø0=ð31ØMQð31àñ31r   c           	     ó®  € ^ RI p \        W4      w  rEp\	        TP                  4       4      p \        ^4       Fñ  p\        T4      w  ršp\        YF4      p \        P                  ! RR7      ;_uu_ 4       pTP                  YœR7      pTP                  4        TP                  4       ;'       g    / p\        T4      p\        TTT4      pTe   TuuRRR4       u # TP!                  T/ TCRR/CRT/R	7      pTP                  4        TP                  4       ;'       g    / pRRR4        M	   \)        XX4      #   \         d    \        R4      u # i ; i  + '       g   i     L=; i  \        P"                   dS   pTP$                  P&                  R
8w  g   T^ 8”  d   h  \        YRR7      w  rEp Rp?EK�    \         d    TRhi ; iRp?ii ; i  \        P"                   dK   pTP$                  P&                  pTR9   d   \        RT R24      u Rp?# \        RT R24      u Rp?# Rp?i\         d   p\        RT 24      u Rp?# Rp?ii ; i)u‰  Redeem one banked Codex rate-limit reset credit (`/usage reset`), mirroring the Codex CLI picker: GET usage â†’
guard (a reset restores the WHOLE 5h + weekly allowance, and the backend's own ``nothing_to_reset`` guard is
less clear) â†’ POST consume with a fresh UUID ``redeem_request_id`` and no ``credit_id`` (the backend picks the
next credit). Never raises: every failure returns a result.NzWNo Codex credentials available. Run `hermes auth` to sign in with your ChatGPT account.rð  r#  r¾  úContent-Typer¶  Úredeem_request_id)r¼  rÂ  rñ  Trò  z)Codex backend rejected the request (HTTP ur   ). Reset credits require ChatGPT-account (OAuth) auth â€” run `hermes auth` and sign in with your ChatGPT account.zCodex backend error (HTTP u   ) â€” try again shortly.z#Could not reach the Codex backend: )rñ  i“  )Úuuidr¦  r…   r  r%   Úuuid4Úranger�  r¹  r¿  rÀ  r  rÁ  rÂ  r­  r%  Úpostrü  rÄ  rý  r1  )r‰  r“  r  r6  r¯  rÿ  rš  r5  ÚattemptÚ	usage_urlÚ_credits_urlÚconsume_urlr¼  rÃ  Ú
usage_respr¨  rJ   ÚrefusedÚconsume_respr'  r   r)  s   $$$                   r   Úredeem_codex_reset_creditrA    sN  € ó ðwÜ/OÐPXÓ/bÑ,ˆ *ô ˜DŸJ™J›LÓ)Ðð%IÜ˜Q–xˆGÜ3FÐGXÓ3YÑ0ˆI [Ü$ UÓ7ˆGð(Ü—\’\¨$×/Õ/°6Ø!'§¡¨I Ó!G�JØ×/Ñ/Ô1Ø(Ÿo™oÓ/×5Ð5°2�GÜ 4°WÓ =�IÜ0°¸)ÀUÓK�GØÒ*Ø&÷ 0Ô/ð $*§;¡;Ø#Ð-\°Ð-\¸ÐI[Ñ-\Ø1Ð3DÐEð $/ó $�Lð !×1Ñ1Ô3Ø'×,Ñ,Ó.×4Ð4°"�D÷ 0ñ ò%  ôJ    iÓ0Ð0øôS ô wÜÐuÓvÒvðwú÷ 0×/ûô ×(Ñ(ô 	(Ø—<‘<×+Ñ+¨sÔ2°gÀ´kØð(Ü;[Ø ¸ô<Ñ8�E¯jøô !ô (à 4Ð'ð(þð	(ûô × Ñ ô YØ�|‰|×'Ñ'ˆØ�:ÔÜÐ"KÈDÈ6ð Rlð !ló mõ mäÐ8¸¸Ð>VÐWÓXÕXûÜô IÜÐAÀ#ÀÐGÓHÕHûðIúsÆ   †D; ®'G ÁE*Á5AEÃ
E*ÃG ÃAEÄEÄ"E*Ä*G Ä,G Ä;EÅEÅE'Å"E*Å*GÅ?#GÆ#F:Æ3G Æ:G	Ç	GÇGÇG ÇIÇ)+H.ÈIÈH.È(IÈ.IÈ;IÈ<IÉ	IÉIc               ó$   € V ^8„  d   QhRRRRRR/# rã  r   )r   s   "r   r   r   L  s)   € ÷ Gñ GØðGØ-:ðGà#ñGr   c           
     óÈ  € \        T;'       g    R 4      P                  4       pT;'       g#    \        4       ;'       g    R P                  4       pV'       g   R# \        V4      '       g   \	        RR. . RR7      # RRV 2RR	R
R	RRRR/p\        RVRR7      p\        VR"RRRRR0R7      p. pVP                  R4      ;'       g    / pVP                  R4      VP                  R4      r©VP                  R4      '       dX   \        V	4      '       dG   \        V
4      '       d6   TP                  RV	R RV
R RVP                  R 4      ;'       g    R! 24       \	        RRWg4      # )#rV   NÚ	anthropicÚoauth_usage_apizMAnthropic account limits are only available for OAuth-backed Claude accounts.)r?   r³  r´  rµ  r¶  r4  zanthropic-betazoauth-2025-04-20r·  zclaude-code/2.1.0z)https://api.anthropic.com/api/oauth/usagerð  r#  Úseven_day_opusÚseven_day_sonnetÚutilizationÚ	resets_atT)rÆ  rÇ  Úextra_usageÚused_creditsÚmonthly_limitÚ
is_enabledzExtra usage: rø  r‚  rX   ÚcurrencyÚUSD))Ú	five_hourzCurrent session)Ú	seven_dayzCurrent week)rF  z	Opus week)rG  zSonnet week)
r%   rZ   r   r   rR   rÅ  rÏ  r  rº   r–   )r‰  r“  Úexplicitr¯  r¼  r¨  r<   r>   ÚextrarK  rL  s   &&         r   Ú_fetch_anthropic_account_usagerT  L  sm  € ô �7—=�=˜bÓ!×'Ñ'Ó)€HØ×AÐAÔ0Ó2×8Ð8°b×?Ñ?ÓA€EßÙÜ˜5×!Ò!Ü˜Ð&7¸¸RØ,{ô}ð 	}à '¨%¨Ð 1°8Ð=OÐQ_ÐasØÐ!3°\ÐCVðX€GäÐCÀWÐVZÔ[€GÜØð 7Ø8EÀ{Ð]aØ&Ð(:Ð;ô€Gð
 €GØ�K‰K˜Ó&×,Ð,¨"€EØ"'§)¡)¨NÓ";¸U¿Y¹YÀÓ=W�-Ø‡y�y�×Ò¤7¨<×#8Ò#8¼WÀ]×=SÒ=SØ�‰˜ |°CÐ&8¸¸MÈ#Ð;NÈaÐPU×PYÑPYÐZdÓPe×PnÐPnÐinÐOoÐpÔqÜ�[Ð"3°WÓFÐFr   c               ó$   € V ^8„  d   QhRRRRRR/# rã  r   )r   s   "r   r   r   j  s'   € ÷ "Dñ "D¨mð "DÀmð "DÐXvñ "Dr   c           	     óh  aaa€ \        R WR7      p\        VP                  RR4      ;'       g    R4      P                  4       pV'       g   R# \        VP                  RR4      ;'       g    R4      P	                  R4      oRRV 2R	R
/o\
        P                  ! RR7      ;_uu_ 4       oR VVV3R llpV! R4      p V! R4      pRRR4       \        XP                  R4      ;'       g    R4      \        VP                  R4      ;'       g    R4      ,
          pR\        RV4      R 2.p. p	XP                  R4      VP                  R4      VP                  R4      rËp
\        VP                  R4      ;'       g    R4      P                  4       p\        V
4      '       d·   \        V
4      ^ 8”  d§   \        V4      '       d–   ^ \        V4      u;8:  d   \        V
4      8:  du   M Mq\        V
4      \        V4      rþRVR RVR R2.V'       d   RV 2.M. OpV	P                  \        RWï,
          V,          ^d,          RP                  V4      R 7      4       \        V4      '       d•   R!\        V4      R R"2.pR% F]  w  ppVP                  V4      p\        V4      '       g   K*  \        V4      ^ 8”  g   K<  VP                  R\        V4      R R#V 24       K_  	  VP                  RP                  V4      4       \        R R$W˜4      #   \         d    / p ELUi ; i  + '       g   i     ELb; i)&Ú
openrouter)Ú	requestedÚexplicit_base_urlÚexplicit_api_keyr“  rV   Nr‰  r‹  r³  r´  rµ  r¶  rU  r#  c               ó    € V ^8„  d   QhRRRR/# )r   Úpathr%   r   r©  r   )r   s   "r   r   Ú5_fetch_openrouter_account_usage.<locals>.__annotate__r  s   € ÷ 	9ñ 	9˜ð 	9 ñ 	9r   c                óº   <€ SP                  S R V  2SR7      pVP                  4        VP                  4       ;'       g    / P                  R4      ;'       g    / # )r‹  r¾  Údata)r  rÁ  rÂ  )r\  ÚresprÃ  r¼  rŽ  s   & €€€r   Ú_dataÚ._fetch_openrouter_account_usage.<locals>._datar  sS   ø€ Ø—:‘:  ¨A¨d¨VÐ4¸g�:ÓFˆDØ×!Ñ!Ô#Ø—I‘I“K×%Ð% 2×*Ñ*¨6Ó2×8Ð8°bÐ8r   rô  rÎ  Útotal_creditsr§   Útotal_usager÷  rø  ÚlimitÚlimit_remainingÚusageÚlimit_resetr³   rq  z
 remainingr‚   zAPI key quotar‘   rû   zAPI key usage: $z totalrX   Úcredits_api))Úusage_dailyÚtoday)Úusage_weeklyz	this week)Úusage_monthlyz
this month)r   r%   r  rZ   rŒ  r¿  rÀ  r…   rf   r”   rº   r–   r$   r„  rR   )r‰  r“  Úruntimer¯  ra  rô  Úkey_datarõ  r>   r<   re  rf  rg  rh  Úlimit_valueÚremaining_valueÚdetail_partsÚusage_partsrÎ  r&   rT   rÃ  r¼  rŽ  s   &&                   @@@r   Ú_fetch_openrouter_account_usagert  j  sÛ  ú€ Ü&°ÐQYÔt€GÜ�—‘˜I rÓ*×0Ð0¨bÓ1×7Ñ7Ó9€EßÙÜ�W—[‘[ ¨RÓ0×6Ð6°BÓ7×>Ñ>¸sÓC€JØ '¨%¨Ð 1°8Ð=OÐP€GÜ	�Š˜d×	#Õ	# v÷	9ò 	9ñ ˜	Ó"ˆð	Ù˜U“|ˆH÷ 
$ô �G—K‘K Ó0×7Ð7°CÓ8¼5ÀÇÁÈ]ÓA[×AbÐAbÐ_bÓ;cÕc€GØ#¤C¨¨WÓ$5°cÐ#:Ð;Ð<€GØ(*€GØ$,§L¡L°Ó$9¸8¿<¹<ÐHYÓ;ZÐ\d×\hÑ\hÐipÓ\q˜E€EÜ�h—l‘l =Ó1×7Ð7°RÓ8×>Ñ>Ó@€KÜˆu‡~‚~œ% ›,¨Ô*¬w°×/GÒ/GÈAÔQVÐWfÓQgÖLwÔkpÐqvÓkw×LwÜ',¨U£|´U¸?Ó5K�_Ø˜O¨CÐ0°°kÀ#Ð5FÀjÐQð  H×r}ÐX_Ð`kÐ_lÐVmÑUnð  DFð  HˆØ�‰Ô)°ÐP[ÕPmÐq|ÕO|ð  ADõ  ODØ18·±¸lÓ1KôMô 	Näˆu‡~‚~Ø)¬%°«,°sÐ);¸6ÐBÐCˆÛt‰JˆC�Ø—L‘L Ó%ˆEÜ�u�~Œ~¤%¨£,°Ö"2Ø×"Ñ" Q¤u¨U£|°CÐ&8¸¸%¸Ð#AÖBñ uð 	�‰�w—|‘| KÓ0Ô1Ü�\ =°'ÓCÐCøô' ô 	Ø‹Hð	ú÷ 
$×	#Ð	#ús*   Â*L Â?LÌLÌL ÌLÌL Ì L1	r—  rD  rW  zSdict[str, Callable[[Optional[str], Optional[str]], Optional[AccountUsageSnapshot]]]Ú_USAGE_FETCHERSÚ_READ_ONLY_USAGE_FETCHERSc               ó$   € V ^8„  d   QhRRRRRR/# rã  r   )r   s   "r   r   r   ¢  s"   € ÷ 8ñ 8¨}ð 8À}ð 8ÐYwñ 8r   c                óÔ   a aa€ ^ RI Hp ^ RIHp \	        S 4      P
                  VP
                  J d   R# V! VVV 3R l\        RR7      pVP                  '       d   R# VP                  # )uº   Run the profile hook under the shared deadline; past it â†’ None. Exceptions re-raise in the
caller so ``fetch_account_usage`` fails open without a worker-thread traceback on ``/usage``.)Úrun_bounded_sync)ÚProviderProfileNc                 ó*   <€ SP                  SS R 7      # )ré  )Úfetch_account_usage)r“  r‰  Úprofiles   €€€r   r(  Ú)_call_plugin_usage_hook.<locals>.<lambda>«  s   ø€ �×+Ñ+°XÀwÐ+ÔOr   zplugin-account-usagerB  )	Úagent.deadlinery  Úproviders.baserz  Útyper|  ÚPLUGIN_USAGE_HOOK_DEADLINE_SÚ	timed_outrT   )r}  r‰  r“  ry  rz  Úboundeds   fff   r   Ú_call_plugin_usage_hookr…  ¢  sV   ú€ õ 0Ý.äˆGƒ}×(Ñ(¨O×,OÑ,OÓOÙÙÞOÜ$Ð,BôD€Gð ×$×$Ð$ˆ4Ð7¨'¯-©-Ð7r   Úidentity_idc               ó0   € V ^8„  d   QhRRRRRRRRRRRR	/# )
r   r7   r+   r‰  r“  ræ  rB   r†  r   rŒ   r   )r   s   "r   r   r   °  s>   € ÷ ñ ØðØ*7ðØIVðàðà*7ðð $ñr   c               ó´  € ^ RI Hp \        T ;'       g    R4      P                  4       P	                  4       pV'       d   \
        P                  V4      MRpVf   \        P                  V4      p^ RIpVP                  4       p	 V'       d
   V! W4      p
M%^ RI
Hp V! V4      pV'       d   \        WÁV4      MRp
 V! W
WAV	R7       V
#   \         d     R# i ; i)r   )Úremember_account_usagerV   N)Úget_provider_profile)r†  r‰  Ústarted_monotonic)Úagent.account_usage_cacher‰  r%   rZ   r.  rv  r  ru  rJ  Ú	monotonicÚ	providersrŠ  r…  r…   )r7   r‰  r“  ræ  r†  r‰  ÚslugÚfetcherÚ_timeÚstartedr‹   rŠ  r}  s   &$$$$        r   r|  r|  °  sÀ   € õ Aäˆx�~ˆ~˜2Ó×$Ñ$Ó&×,Ñ,Ó.€D÷ 6?Ô'×+Ñ+¨DÔ1ÀD€GØ‚Ü!×%Ñ% dÓ+ˆÛà�o‰oÓ€Gð	ßÙ˜xÓ1‰Hå6á*¨4Ó0ˆGßNUÔ.¨wÀ'ÔJÐ[_‰Hñ ˜8¸;Ø-4õ6à€Oøô ô Úðús$   ÂC ÂC ÂC Â,C ÃCÃCr   ))r  rÐ  )r  rÑ  rI  )cÚ__conditional_annotations__Ú
__future__r   Úloggingr½   rJ  Údataclassesr   r   r   r   Útypingr   r	   r
   r   r¿  Úagent.anthropic_credentialsr   r   r  r   r   r   Úhermes_cli.auth_codexr   Úhermes_cli.runtime_providerr   Úhermes_timer   rÝ   r   r   Ú	getLoggerr/   r†   r  rÐ   rß   rà   r!   r$   r6   rR   r\   rm   r{   rˆ   r�   r“   r´   rº   r¿   rÄ   rÊ   rÓ   rá   râ   ré   r  r  r6  r:  rT  rZ  rY  ri  r`  rx  r‡  r�  r¦  r­  r¹  rÅ  Ú	frozensetrÏ  r×  rÖ  rÛ  rá  rê  rí  rè  rþ  r  r   r  r%  r1  rA  rT  rt  ru  r3   rv  r‚  r…  r|  )r“  s   @r   Ú<module>rž     s  øðß "Ð "ã Û Û ß *ß "ß 9Ó 9ã ç Pß \Ñ \Ý <Ý @Ý %å &çÝ à	×	Ò	˜8Ó	$€à@€àBÐ ð?Ð à}Ð õñ �$Ô÷ð ó ðñ �$Ô÷Rð Ró ðRõ2OõTõ
õXõ	-ðÐ]b÷ õ2õ@õ'õGð
zÐcgð zØ(-÷zõ	1÷7ð lÐ ØiÐ ðØ48÷õ@;õ|õ"õ26õ"FðJa¨5ð aÀ4ð aÐ^b÷ að¨%ð À$ð Ð]a÷ ÷2oõ$ñN �$Ô÷ð ó ðð¨5ð À4÷ õ>sð2gØNS÷2gõj+õ
jõ!ðØkpðá.7«k÷ð. $)¨)°V¸XÐ"FÐ Ø"aÐ õõ"%÷O÷Nñ LØX]÷ Lð  LõFIñ �$Ô÷
&ð 
&ó ð
&ð #(Ð õIõõ(tð831Ø!%ð31Ø@Dð31ØTY÷31÷lGõ<"DðL Ð.°Ð=[ØÐ1ðh€Ðdó ð Ð8ðrÐ Ðnó ð  $Ð õ8ðØ:>ðØY]ðàðà:>÷ñ r   