Ë
    tPêjÏš  ã                   ó  — U d dl Z d dl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lZd dlZd dlmZ d dlmZ d dlmZmZmZmZ d dlm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$ d d
l%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1m2Z2m3Z3m4Z4 ddl5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<  G d„ de«      Z= G d„ ded¬«      Z> G d„ de«      Z? G d„ ded¬«      Z@ G d„ de«      ZA G d„ de«      ZBdZCeeDd<   dZEeeDd<   d ZFeeDd!<   d"ZGeeDd#<   d$e*d%eHfd&„ZId'e$d%eHfd(„ZJd)ej–                  d%e$fd*„ZLed+œd'e$d%eeHeMf   dz  fd,„ZNed+œd-e=d'e$d%e*fd.„ZOd'e$d%ee=gdf   fd/„ZPd'e$d%eg eeHeMf   dz  f   fd0„ZQ	 dzed+œd1eHdz  d'e$d%eHdz  fd2„ZRd3eHd%dfd4„ZSd5eTd%eHfd6„ZUd7eVe>   d%dfd8„ZWd9„ ZXd{d7eVeYeHef      d:eZd%dfd;„Z[d7eVeYeHef      d%eYeHef   dz  fd<„Z\d7eVeYeHef      d%eYeHef   dz  fd=„Z]d>ej¼                  d%eHdz  fd?„Z_d>ej¼                  d%eHfd@„Z`dAeZd%eTfdB„ZaddCdDdEddEddEdEdEdFœ
dGeHdHeYeHeHf   dz  dIeZdJeZdKeZdLeHdz  dMeZdNeHdz  dOeZdPeZdQeZd%e@dz  fdR„Zbd7eMdSeMd%eVe>   fdT„ZcdUeHd%eAfdV„ZddWeHd%eYeHeHf   fdX„ZedUeHdYeHdWeHd%eBdz  fdZ„ZfdUeHdYeHdWeHd7eVe>   d%eHdz  f
d[„Zgd7eVe>   d%eHdz  fd\„ZhdUeHd%dfd]„ZidUeHd^eHd_eTd`e*d%df
da„Zjd-e=dbe6d'e$d%e*fdc„ZkdUeHd_eTd'e$d%dfdd„Zl ejÚ                  de¬f«       ejÜ                  dgdhddi¬j«       ejÜ                  dkdhddl¬j«      ejÞ                  d)ej–                  d_eTdmeTd%dfdn„«       «       «       «       Zp ejÚ                  do¬f«      ejÞ                  d)ej–                  fdp„«       «       Zq ejÚ                  dq¬f«      ejÞ                  d)ej–                  fdr„«       «       Zr ejÚ                  ds¬f«      ejÞ                  d)ej–                  fdt„«       «       Zsduetd5eTd%eHfdv„Zu ejì                  dw¬f«      dx„ «       Zwewjñ                  er«       g dy¢Zyy)|é    N)ÚCallableÚMapping)ÚAnyÚFinal)Ú	urlencode)ÚConsole)ÚTable)ÚNotRequiredÚReadOnlyÚ	TypedDictÚassert_never)ÚCLI_JWT_EXPIRATION_HOURS)ÚDISABLE_KEYRING_ENV_VARÚSYSTEM_KEYRINGÚKeyringDisabledÚKeyringDiscardsWritesÚKeyringNotInstalledÚKeyringUnreachableÚSecretErasedÚSecretFoundÚSecretMissingÚSecretStoredÚSecretStrandedÚSecretVault)
ÚCliTokenRecordÚCredentialNotClearedÚCredentialNotRecordedÚCredentialNotSavedÚ
SecretSaveÚclear_cli_tokenÚget_cli_token_file_pathÚis_cli_token_freshÚload_cli_tokenÚsave_cli_tokené   )ÚCLAUDE_SETTINGS_PATHÚSETTINGS_FILE_OWNERSÚClaudeSettingsErrorÚwrite_claude_settings)ÚHttpÚPkceFailureÚRevocationUnavailableÚfresh_api_keyÚpkce_token_recordÚrevoke_stored_credentialÚrun_pkce_loginc                   óþ   — e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eee      ed	<   eee      ed
<   eee      ed<   eee      ed<   eee      ed<   eee      ed<   eeedz        ed<   y)ÚCliTokenDataÚbase_urlÚkeyÚuser_idÚ
user_emailÚ	user_roleÚauth_header_nameÚ	jwt_tokenÚ	timestampÚ
expires_atÚrefresh_tokenÚ	client_idÚtoken_endpointÚrevocation_endpointÚresourceNÚteam_id)Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__Úfloatr   r
   © ó    úk/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/client/cli/commands/auth.pyr2   r2   ;   s    … ØƒMØ	ƒHØƒLØƒOØƒNØÓØƒNØÓØ˜ UÑ+Ñ,Ó,Ø˜K¨Ñ,Ñ-Ó-Ø˜ CÑ(Ñ)Ó)Ø˜[¨Ñ-Ñ.Ó.Ø! +¨cÑ"2Ñ3Ó3Ø�{ 3Ñ'Ñ(Ó(Ø�k #¨¡*Ñ-Ñ.Ô.rI   r2   c                   óN   — e Zd ZU edz  ed<   edz  ed<   ee   ed<   edz  ed<   y)ÚCliTeamNrA   Ú
team_aliasÚmodelsÚ
max_budget)rB   rC   rD   rE   rF   ÚlistrG   rH   rI   rJ   rL   rL   M   s*   … Ø�4‰ZÓØ�d‘
ÓØ�‰IÓØ˜‘ÔrI   rL   F)Útotalc                   óp   — e Zd ZU eed<   ee   ed<   eee      ed<   eeedz        ed<   eee      ed<   y)ÚCliContextObjr3   Úbase_url_explicitÚsecret_vaultNÚapi_keyÚapi_key_from_token_file)	rB   rC   rD   rE   rF   r
   Úboolr   r   rH   rI   rJ   rS   rS   T   sF   … ØƒMØ" 4Ñ(Ó(Ø˜h {Ñ3Ñ4Ó4Ø�k #¨¡*Ñ-Ñ.Ó.Ø% k°$Ñ&7Ñ8Ô8rI   rS   c                   óZ   — e Zd ZU eed<   eed<   eed<   ee   ed<   eed<   eed<   eed<   y)	ÚCliPollDataÚstatusr4   r5   ÚteamsÚteam_detailsÚrequires_team_selectionrA   N)rB   rC   rD   rE   rF   rP   ÚobjectrX   rH   rI   rJ   rZ   rZ   \   s,   … ØƒKØ	ƒHØƒLØ�‰9ÓØÓØ!Ó!Ø„LrI   rZ   c                   ó,   — e Zd ZU eed<   eed<   eed<   y)ÚCliSsoStartDataÚlogin_idÚpoll_secretÚ	user_codeN)rB   rC   rD   rE   rF   rH   rI   rJ   ra   ra   f   s   … ØƒMØÓØ„NrI   ra   c                   óH   — e Zd ZU eed<   edz  ed<   ee   ed<   edz  ed<   y)ÚCliAuthResultrV   Nr5   r\   rA   )rB   rC   rD   rE   rF   rP   rH   rI   rJ   rf   rf   l   s%   … ØƒLØ�4‰ZÓØ�‰9ÓØ�4‰ZÔrI   rf   zpip install 'litellm[cli]'ÚKEYRING_INSTALL_HINTz2keyring --enable (or unset PYTHON_KEYRING_BACKEND)ÚKEYRING_ENABLE_HINTz]Logged out locally, but your credential is still in the OS keychain and could not be removed.ÚSTRANDED_CREDENTIAL_MESSAGEz„Logged out locally, but your OS keychain could not be checked, so a credential stored there by an earlier login may still be usable.ÚUNCHECKED_KEYCHAIN_MESSAGEÚoutcomeÚreturnc                 óR  — t        «       }| xt        d˜ x�\    y xt        d˜ x�\    d|› dt        › �S  xt        d˜ x�\    dt
        › d|› d�S  xt        d˜ x�	\    d	|› d�S  xt        d˜ x�\    d
|› dt        › �S  xt        d˜ x�\  } d|› d|› d�S  t        d˜ x�\   d|› d�S  y)z[Tell the user where the credential ended up, and how to get keychain storage if it did not.rH   Nz&Credential stored in your OS keychain.zCredential stored in zJ (owner-only). For OS keychain storage, install the keyring package with: zKeychain storage is off (z). Credential stored in z (owner-only).z/No OS keychain available. Credential stored in zPYour keyring backend keeps nothing it is given, so the credential was stored in z5 (owner-only) instead. For OS keychain storage, run: ©Údetailz4Signed in, but the credential could not be saved to ú: zŽ. Any login you already had is untouched. Run 'lite login' again once that path is writable, or 'lite logout' to clear whatever is stored now.z:Signed in, and the credential is in your OS keychain, but z· could not be replaced, so it still describes your previous login and may still hold its credential. Run 'lite login' again once that path is writable, or 'lite logout' to clear both.)r!   r   r   rg   r   r   r   r   rh   r   r   )rk   Úpathro   s      rJ   Ústorage_noticerr   �   s  € ä)Ó+€DØ
ØŒ\Ž^Ø;ð à"Ô Ö"à'¨ vð .NÜNbÐMcðeðð #ð
 Œ_ÖØ.Ô/FÐ.GÐG_Ð`dÐ_eÐesÐtÐtð à!ÔÖ!ØDÀTÀFÈ.ÐYÐYð "à$Ô"Ö$àbÐcgÐbhð iGÜGZÐF[ð]ðð %ð
 /Ô×.àFÀtÀfÈBÈvÈhð WNð Nðð /ô #Õ$àLÈTÈFð S!ð !ðñ %rI   Úvaultc                 óà   — | j                  «       xt        d˜ x�\    dt        › d�S  xt        d˜ x�\    dt        › d�S  xt
        d˜ x�\    	 y xt        d˜ x�\    y xt        d˜ x�\    y  y)	zSExplain why the secret half of a stored login cannot be produced, and what fixes itrH   NzuYour credential is in your OS keychain, which this install cannot read without the keyring package. Install it with: z$, or run 'lite login' to start over.z.Your credential is in your OS keychain, which z: is blocking. Unset it, or run 'lite login' to start over.znYour credential is in your OS keychain, which could not be read. Unlock it, or run 'lite login' to start over.zXYour credential could not be read from your OS keychain. Run 'lite login' to start over.)Úreadr   rg   r   r   r   r   r   ©rs   s    rJ   Úkeychain_unreadable_noticerw   ¤   sœ   € à
�*‰*‹,Ø"Ô Ö"ð5Ü5IÐ4JÐJnðpðð #ð
 Œ_Öà@ÔAXÐ@Yð Z?ð ?ðð ð
 "ÔÖ!ð.ðð "ð
 Œ[�]Ð,Ømð ˜_œ]�_Ð,Ømð -Ñ,rI   Úctxc                 ó\   — | j                   }|€t        S |j                  d«      xs t        S )z\Where this invocation reads and writes secret material; injectable through ctx.obj for testsrU   )Úobjr   Úget)rx   Úctx_objs     rJ   Úcontext_secret_vaultr}   º   s*   € à+.¯7©7€GØ€ÜÐØ�;‰;�~Ó&Ò8¬.Ð8rI   rv   c                 óF   — t        | ¬«      }|€dS |j                  d¬«      S )zÿThe stored credential as a plain mapping, with the secret resolved out of the vault.

    The PKCE renewal and revocation helpers read records by field name, so this is the
    shape they get; the keychain split lives underneath, in `load_cli_token`.
    rv   NT)Úexclude_none)r#   Ú
model_dump)rs   Úrecords     rJ   Ú
load_tokenr‚   Â   s+   € ô #¨Ô/€FØ�>ˆ4ÐK v×'8Ñ'8ÀdÐ'8Ó'KÐKrI   r�   c                ó.   — t        t        di | ¤Ž|¬«      S )zTStore a credential the PKCE layer produced, secret in the vault and the rest on diskrv   rH   )r$   r   )r�   rs   s     rJ   Ú
save_tokenr„   Ì   s   € äœ.Ñ2¨6Ñ2¸%Ô@Ð@rI   c                 ó$   ‡ — dt         ddfˆ fd„}|S )a  Persist a silently renewed credential, and say on stderr when no store would keep it.

    A renewal rotates the refresh token, so a rotation that is never stored logs this
    machine out on the next command; the user hears about it rather than guessing.
    r�   rl   Nc                 óv   •— t        | ‰¬«      }t        |t        t        f«      rt	        t        |«      «       y y ©Nrv   )r„   Ú
isinstancer   r   Ú_warnrr   )r�   rk   rs   s     €rJ   Úsavez_renewal_saver.<locals>.saveØ   s3   ø€ Ü# F°%Ô8ˆÜ�gÔ 2Ô4IÐJÔKÜ”. Ó)Õ*ð LrI   )r2   )rs   rŠ   s   ` rJ   Ú_renewal_saverr‹   Ñ   s   ø€ ð+”\ð + dõ +ð
 €KrI   c                 ó@   ‡ — dt         t        t        f   dz  fˆ fd„}|S )zTRe-read the record mid-renewal, so a rotation a sibling `lite` process saved is seenrl   Nc                  ó   •— t        ‰ ¬«      S r‡   )r‚   rv   s   €rJ   Úreloadz_renewal_reader.<locals>.reloadã   s   ø€ Ü Ô&Ð&rI   )r   rE   r_   )rs   rŽ   s   ` rJ   Ú_renewal_readerr�   à   s$   ø€ ð'”GœC¤˜KÑ(¨4Ñ/õ 'ð €MrI   Úexpected_base_urlc                óÜ   — t        |¬«      }|€y| �$|j                  d«      | j                  d«      k7  ryt        |t	        |«      t        j                  «       t        |«      t        ¬«      S )aI  Get the stored API key.

    If expected_base_url is provided, the key is only returned when it was
    originally issued for that URL. This prevents credential leakage when the
    CLI is pointed at a different (possibly malicious) server. A key obtained by
    ``lite login --pkce`` is refreshed here once it nears expiry.
    rv   Nr3   ú/©rŽ   Úwarn)	r‚   r{   Úrstripr-   r‹   ÚrequestsÚSessionr�   r‰   )r�   rs   Ú
token_datas      rJ   Úget_stored_api_keyr™   é   sl   € ô #¨Ô/€JØÐØØÐ$¨¯©¸
Ó)CÐGX×G_ÑG_Ð`cÓGdÒ)dØÜØÜ�uÓÜ×ÑÓÜ˜uÓ%Üôð rI   Úmessagec                 ó2   — t        j                  | d¬«       y )NT©Úerr)ÚclickÚecho)rš   s    rJ   r‰   r‰     s   € Ü	‡J�Jˆw˜DÖ!rI   Úrenewsc                 ó   — | rdS dS )Nzlite login --pkcez
lite loginrH   ©r    s    rJ   Ú_login_commandr£     s   € Ù"(ÐÐ:¨lÐ:rI   r\   c                 óà  — t        «       }| s|j                  d«       yt        d¬«      }|j                  ddd¬«       |j                  d	d
¬«       |j                  dd¬«       |j                  dd¬«       |j                  dd¬«       t	        | «      D ]Å  \  }}|j                  d«      xs d}|j                  dd«      }|j                  dg «      }|j                  d«      }|rHt        |«      dkD  r(dj                  |dd «      dt        |«      dz
  › d�z   }	ndj                  |«      }	nd}	|rd|› �nd}
|j                  t        |dz   «      |||	|
«       ŒÇ |j                  |«       y)z"Display teams in a formatted tablezNo teams found for your user.NúAvailable Teams©ÚtitleÚIndexÚcyanT©ÚstyleÚno_wrapz
Team AliasÚmagenta©r«   úTeam IDÚgreenÚModelsÚyellowz
Max BudgetÚbluerM   úN/ArA   rN   rO   é   ú, ú (+ú more)ú
All modelsú$Ú	Unlimitedr%   )
r   Úprintr	   Ú
add_columnÚ	enumerater{   ÚlenÚjoinÚadd_rowrE   )r\   ÚconsoleÚtableÚiÚteamrM   rA   rN   rO   Ú
models_strÚ
budget_strs              rJ   Údisplay_teams_tablerÈ     sm  € ä“Y€GáØ�‰Ð5Ô6ØäÐ0Ô1€EØ	×Ñ�W F°DÐÔ9Ø	×Ñ�\¨ÐÔ3Ø	×Ñ�Y gÐÔ.Ø	×Ñ�X XÐÔ.Ø	×Ñ�\¨ÐÔ0ä˜UÓ#ò O‰ˆˆ4Ø—X‘X˜lÓ+Ò4¨uˆ
Ø—(‘(˜9 eÓ,ˆØ—‘˜( BÓ'ˆØ—X‘X˜lÓ+ˆ
ñ Ü�6‹{˜QŠØ!ŸY™Y v¨b¨q zÓ2°s¼3¸v»;È¹?Ð:KÈ6Ð5RÑR‘
à!ŸY™Y vÓ.‘
à%ˆJñ *4�q˜˜Ñ%¸ˆ
à�‰”c˜!˜a™%“j *¨g°zÀ:ÕNð%Oð( ‡M�M�%ÕrI   c                  ó$  — 	 t         j                  dk(  rIddl} | j                  «       }|dk(  r| j                  «       }|dk(  ry|dk(  ryy|d	k(  ry
|dk(  ry|dk(  ryyddl}ddl}t         j                  j                  «       }|j                  |«      }	 |j                  t         j                  j                  «       «       t         j                  j                  d«      }|dk(  rŽ|t         j                  j                  d«      z  }|dk(  r	 |j                  ||j                  |«       y|dk(  r	 |j                  ||j                  |«       y|dk(  rl	 |j                  ||j                  |«       y|dk(  s|dk(  r	 |j                  ||j                  |«       y
|dk(  r	 |j                  ||j                  |«       y	 |j                  ||j                  |«       y# |j                  ||j                  |«       w xY w# t        $ r Y yw xY w)z5Get a single key input from the user (cross-platform)Úwin32r   Nó   àó   HÚupó   PÚdownó   Úenteró   Úescapeó   qÚquitr%   úé   z[Az[Búú
Úq)ÚsysÚplatformÚmsvcrtÚgetchÚtermiosÚttyÚstdinÚfilenoÚ	tcgetattrÚsetrawru   Ú	tcsetattrÚ	TCSADRAINÚImportError)rÝ   r4   rß   rà   ÚfdÚold_settingss         rJ   Úget_key_inputrê   2  sï  € ð-Ü�<‰<˜7Ò"Ûà—,‘,“.ˆCØ�gŠ~Ø—l‘l“n�Ø˜$’;ØØ˜D’[Ø!ð ð ˜’ØØ˜’ØØ˜’ØØãÛäŸ	™	×(Ñ(Ó*ˆBØ")×"3Ñ"3°BÓ"7ˆLðGØ—
‘
œ3Ÿ9™9×+Ñ+Ó-Ô.Ü—i‘i—n‘n QÓ'�à˜&’=Øœ3Ÿ9™9Ÿ>™>¨!Ó,Ñ,�CØ˜h’Ø#ð ×!Ñ! " g×&7Ñ&7¸ÕFð  šØ%ð ×!Ñ! " g×&7Ñ&7¸ÕFð  šØ'ð ×!Ñ! " g×&7Ñ&7¸ÕFð ˜D’[ C¨4¢KØ"ð
 ×!Ñ! " g×&7Ñ&7¸ÕFð	 ˜C’ZØ!ð ×!Ñ! " g×&7Ñ&7¸ÕFð à×!Ñ! " g×&7Ñ&7¸ÕFø�×!Ñ! " g×&7Ñ&7¸ÕFûÜò áðús   ‚AH ÁH ÁH ÁH ÁH Á7H ÂA8G! ÄH Ä-G! Ä3H ÅG! ÅH Å5
G! Æ H ÆG! Æ$H ÇH Ç!H È H È	HÈHÚselected_indexc                 óÖ  — t        «       }|j                  «        |j                  d«       t        | «      D �]/  \  }}|j	                  d«      xs d}|j	                  dd«      }|j	                  dg «      }|j	                  d«      }|rHt        |«      dkD  r(dj                  |d	d «      d
t        |«      dz
  › d�z   }	ndj                  |«      }	nd}	|rd|› �nd}
||k(  rC|j                  d|› d|› d�«       |j                  d|	› d�«       |j                  d|
› d�«       Œî|j                  d|› d|› d�«       |j                  d|	› d�«       |j                  d|
› d�«       �Œ2 y	)z0Display teams with one highlighted for selectionzBSelect a Team (Use up/down arrows, Enter to select, 'q' to skip):
rM   r´   rA   rN   rO   rµ   r¶   Nr·   r¸   r¹   rº   r»   z> [bold cyan]z[/bold cyan] (ú)z   Models: [yellow]z	[/yellow]z   Budget: [blue]z[/blue]
z  [dim]z[/dim] (z   Models: [dim]z[/dim]z   Budget: [dim]z[/dim]
)r   Úclearr¼   r¾   r{   r¿   rÀ   )r\   rë   rÂ   rÄ   rÅ   rM   rA   rN   rO   rÆ   rÇ   s              rJ   Ú"display_interactive_team_selectionrï   d  st  € ä“Y€Gð ‡M�M„Oà‡M�MÐWÔXä˜UÓ#ó C‰ˆˆ4Ø—X‘X˜lÓ+Ò4¨uˆ
Ø—(‘(˜9 eÓ,ˆØ ŸH™H X¨rÓ2ˆØ—X‘X˜lÓ+ˆ
ñ Ü�6‹{˜QŠØ!ŸY™Y v¨b¨q zÓ2°s¼3¸v»;È¹?Ð:KÈ6Ð5RÑR‘
à!ŸY™Y vÓ.‘
à%ˆJñ *4�q˜˜Ñ%¸ˆ
ð �ÒØ�M‰M˜M¨*¨°^ÀGÀ9ÈAÐNÔOØ�M‰MÐ/°
¨|¸9ÐEÔFØ�M‰MÐ-¨j¨\¸ÐCÕDà�M‰M˜G J <¨x¸°yÀÐBÔCØ�M‰MÐ,¨Z¨L¸Ð?Ô@Ø�M‰MÐ,¨Z¨L¸ÐAÖBñ5CrI   c                 óâ  — | syd}	 t         j                  j                  «       st        | «      S 	 t	        | |«       t        «       }|dk(  r|dz
  t        | «      z  }n¿|dk(  r|dz   t        | «      z  }n¨|dk(  r\| |   }t        «       }|j                  «        t        j                  d|j                  dd	«      › d
|j                  d«      › d�«       |S |dk(  s|dk(  r0t        «       }|j                  «        t        j                  d«       y|€t        | «      S Œí# t        $ r2 t        «       }|j                  «        t        j                  d«       Y yt        $ r t        | «      cY S w xY w)z*Interactive team selection with arrow keysNr   rÍ   r%   rÏ   rÑ   zSelected team: rM   r´   ú (rA   rí   rÕ   rÓ   zTeam selection skipped.ú
Team selection cancelled.)rÛ   rá   ÚisattyÚprompt_team_selection_fallbackrï   rê   r¿   r   rî   rž   rŸ   r{   ÚKeyboardInterruptÚ	Exception)r\   rë   r4   Úselected_teamrÂ   s        rJ   Úprompt_team_selectionrø   Š  s[  € áØà€Nð'5ä�y‰y×ÑÔ!ä1°%Ó8Ð8àÜ.¨u°nÔEä“/ˆCà�dŠ{Ø"0°1Ñ"4¼¸E»
Ñ!B‘Ø˜’Ø"0°1Ñ"4¼¸E»
Ñ!B‘Ø˜’Ø % nÑ 5�ä!›)�Ø—‘”Ü—
‘
˜_¨]×->Ñ->¸|ÈUÓ-SÐ,TÐTVÐWd×WhÑWhÐirÓWsÐVtÐtuÐvÔwØ$Ð$Ø˜’ #¨¢/ä!›)�Ø—‘”Ü—
‘
Ð4Ô5ØØ�ä5°eÓ<Ð<ð1 øô4 ò Ü“)ˆØ�‰ŒÜ�
‰
Ð0Ô1ÙÜò 5ä-¨eÓ4Ò4ð5ús/   ‡(D °B%D Ã9D ÄD ÄD Ä8E.ÅE.Å-E.c                 ó$  — | sy	 	 t        j                  dt        ¬«      }|j                  «       }|j	                  «       dk(  ryt        |«      dz
  }d|cxk  rt        | «      k  rEn nB| |   }t        j                  d|j                  dd	«      › d
|j                  d«      › d�«       |S t        j                  dt        | «      › �«       	 ŒÊ# t        $ r t        j                  d«       Y Œ!t        $ r t        j                  d«       Y yw xY w)z8Fallback team selection for non-interactive environmentsNzR
Select a team by entering the index number (or 'skip' to continue without a team)©ÚtypeÚskipr%   r   ú
Selected team: rM   r´   rñ   rA   rí   ú7Invalid selection. Please enter a number between 1 and ú.Invalid input. Please enter a number or 'skip'rò   )rž   ÚpromptrE   ÚstripÚlowerÚintr¿   rŸ   r{   Ú
ValueErrorrõ   )r\   Úprompt_responseÚchoiceÚindexr÷   s        rJ   rô   rô   »  s	  € ñ Øà
ð	Ü#(§<¡<ØeÜô$ˆOð %×*Ñ*Ó,ˆFà�|‰|‹~ Ò'Øä˜“K !‘OˆEØ�EÔ&œC ›JÕ&Ø % e¡�Ü—
‘
Ø'¨×(9Ñ(9¸,ÈÓ(NÐ'OÈrÐR_×RcÑRcÐdmÓRnÐQoÐopÐqôð %Ð$ä—
‘
ÐTÔUXÐY^ÓU_ÐT`ÐaÕbð' øô( ò 	IÜ�J‰JÐGÖHÜ ò 	Ü�J‰JÐ4Ô5Ùð	ús$   †>C ÁA&C Â,!C ÃDÃ/DÄDÚresponsec                 ó²   — 	 | j                  «       }t        |t        «      r|j	                  d«      nd }t        |t
        «      r|r|S y # t        $ r Y y w xY w)Nro   )Újsonr  rˆ   Údictr{   rE   )r  Úbodyro   s      rJ   Ú_response_error_detailr  Ý  sX   € ðØZb×ZgÑZgÓZiˆô +5°T¼4Ô*@�D—H‘H˜XÔ&Àd€FÜ�&œ#Ô¡6ØˆØøô ò Ùðús   ‚A
 Á
	AÁAc                 ó^   — t        | «      }|rd| j                  › d|› �S d| j                  › �S )NzPolling error: HTTP rp   )r  Ústatus_code)r  ro   s     rJ   Ú_polling_error_messager  è  s=   € Ü*¨8Ó4€FÙØ% h×&:Ñ&:Ð%;¸2¸f¸XÐFÐFØ! (×"6Ñ"6Ð!7Ð8Ð8rI   r  c                 ó0   — d| cxk  xr dk  nc xr | dk7  S )Ni�  iô  i­  rH   )r  s    rJ   Ú_is_permanent_polling_errorr  ï  s   € Ø�+Ö# Ô#Ò:¨°sÑ(:Ð:rI   i,  r×   é
   )
ÚheadersÚtotal_timeoutÚpoll_intervalÚrequest_timeoutÚpending_messageÚpending_log_everyÚother_status_messageÚother_status_log_everyÚhttp_error_log_everyÚconnection_error_log_everyÚurlr  r  r  r  r  r  r  r  r  r  c       
         ó  — t        ||z  «      D �]0  }	 t        j                  | ||¬«      }|j                  dk(  ry|j	                  «       }|j                  d«      }|dk(  r|c S |dk(  r%|r¿|dkD  rº||z  dk(  r²t        j                  |«       nœ|rš|dkD  r•||z  dk(  r�t        j                  |«       nwt        |j                  «      r7t        |«      }t        d|j                  › �|rd|› �z   «      ‚d	| › d
�z   «      ‚|	dkD  r&||	z  dk(  rt        j                  t        |«      «       t        j                  |«       �Œ3 y # t        j                  $ r/}|
dkD  r ||
z  dk(  rt        j                  d|› �«       Y d }~ŒVd }~ww xY w)N)r  ÚtimeoutéÈ   r[   ÚreadyÚpendingr   z/The proxy rejected the login session with HTTP rp   z and no error detail (from rí   zConnection error (will retry): )Úranger–   r{   r  r
  rž   rŸ   r  r  r  r  ÚRequestExceptionÚtimeÚsleep)r  r  r  r  r  r  r  r  r  r  r  Úattemptr  Údatar[   ro   Úes                    rJ   Ú_poll_for_ready_datar+  ô  s¤  € ô ˜¨-Ñ7Ó8ó "ˆð	BÜ—|‘| C°À/ÔRˆHØ×#Ñ# sÒ*Ø$,§M¡M£O�ØŸ™ (Ó+�Ø˜WÒ$Ø’KØ˜YÒ&Ù&Ð+<¸qÒ+@ÀWÐO`ÑE`ÐdeÒEeÜŸ
™
 ?Õ3Ù)Ð.DÀqÒ.HÈWÐWmÑMmÐqrÒMrÜ—J‘JÐ3Õ4Ü,¨X×-AÑ-AÔBÜ/°Ó9�Ü ØEÀh×FZÑFZÐE[Ð\Ù(.˜˜F˜8�}ñZóð à6QÐRUÐQVÐVWÐ4XñZóð ð &¨Ò)¨gÐ8LÑ.LÐPQÒ.QÜ—
‘
Ô1°(Ó;Ô<ô 	�
‰
�=Ö!ð1"ð2 øô	 ×(Ñ(ò 	BØ)¨AÒ-°'Ð<VÑ2VÐZ[Ò2[Ü—
‘
Ð<¸Q¸CÐ@ÔAÿøð	Bús   ”AEÁ%CEÅFÅ%FÆFr]   c                 ó‚  — t        |t        «      rx|rv|D �cg c]j  }t        |t        «      rX|j                  d«      s|j                  d«      r6|j                  d«      xs |j                  d«      |j                  d«      dœ‘Œl c}S t        | t        «      r| D �cg c]  }t	        |«      ddœ‘Œ c}S g S c c}w c c}w )z¤If team_details are a

    Args:
        teams (_type_): _description_
        team_details (_type_): _description_

    Returns:
        _type_: _description_
    rA   ÚidrM   )rA   rM   N)rˆ   rP   r  r{   rE   )r\   r]   rÄ   Úts       rJ   Ú_normalize_teamsr/    s«   € ô �,¤Ô%©,ð "ö
ð
 Ü˜!œTÔ"¨¯©¨iÔ(8¸A¿E¹EÀ$¼Kð	 Ÿ5™5 Ó+Ò:¨q¯u©u°T«{ØŸe™e LÓ1óò
ð 	
ô �%œÔØAFÖG¸AœC ›F°$Ó7ÒGÐGØ€Iùò
ùò Hs   —A/B7ÂB<r3   c                 ó¤  ‡— | › d�}	 t        j                  |d¬«      }|j                  dv rt        d|› d	|j                  › d
�«      ‚|j                  dk7  r6t        |«      }t        d|j                  › d|› �|rd|› �z   «      ‚dz   «      ‚	 |j                  «       Šd}t        ˆfd„|D «       «      }|r!t        d|› ddj                  |«      › d�«      ‚‰S # t         j                  $ r}t        d|› d|› d�«      |‚d }~ww xY w# t        $ r> |j                  j                  dd«      }t        d|› d|› d|j                  d d ›�«      ‚w xY w)Nz/sso/cli/startr  )r   zCould not reach the proxy at rp   zC. Check that the proxy is running and that --base-url points at it.)i”  i•  zPOST z returned HTTP z¦. Either --base-url is wrong, or the proxy is older than this CLI and does not support the CLI SSO login flow; upgrade the proxy or use a CLI version that matches it.r!  z Starting CLI login failed: HTTP z from Ú zcontent-typeÚunknownz,The proxy returned a non-JSON response from z (content-type: zv). A proxy, load balancer, or auth gateway in front of LiteLLM may be intercepting the request. Response starts with: )rb   rc   rd   c              3   ób   •K  — | ]&  }t        ‰j                  |«      t        «      rŒ#|–— Œ( y ­w©N)rˆ   r{   rE   )Ú.0Úfieldr)  s     €rJ   ú	<genexpr>z&_start_cli_sso_flow.<locals>.<genexpr>X  s(   øè ø€ Ò!m¨EÌJÐW[×W_ÑW_Ð`eÓWfÔhkÕLl¤%Ñ!mùs   ƒ$/¨/zThe response from z is missing required field(s): r¶   zG. The proxy version may not match this CLI; upgrade whichever is older.)r–   Úpostr%  r  r  r  r
  r  r{   ÚtextÚtuplerÀ   )	r3   Ú	start_urlr  r*  ro   Úcontent_typeÚrequired_fieldsÚmissing_fieldsr)  s	           @rJ   Ú_start_cli_sso_flowr?  6  sÌ  ø€ Ø"˜ >Ð2€IðÜ"Ÿ-™-¨	¸2Ô>ˆð ×Ñ˜zÑ)ÜØ�I�;˜o¨h×.BÑ.BÐ-Cð D^ð ^ó
ð 	
ð
 ×Ñ˜sÒ"Ü.¨xÓ8ˆÜØ.¨x×/CÑ/CÐ.DÀFÈ9È+ÐVÙ &��F�8ˆ}ñ0ó
ð 	
à,.ñ0ó
ð 	
ð

Ø'/§}¡}£ˆð /W€OÜ!Ó!m°_Ô!mÓm€NÙÜØ   Ð+JÈ4Ï9É9ÐUcÓKdÐJeð fTð Tó
ð 	
ð €KøôI ×$Ñ$ò ÜØ+¨I¨;°b¸¸ð <Pð Pó
ð ð	ûðûô* ò 
Ø&×.Ñ.×2Ñ2°>À9ÓMˆÜØ:¸9¸+ÐEUÐVbÐUcð d%à%-§]¡]°4°CÐ%8Ð$;ð=ó
ð 	
ð
ús$   ˆC ÂD ÃDÃ-D Ä DÄAErc   c                 ó
   — d| iS )Nzx-litellm-cli-poll-secretrH   )rc   s    rJ   Ú_get_cli_sso_poll_headersrA  a  s   € Ø'¨Ð5Ð5rI   Úkey_idc                 ó`  — | › d|› �}t        |t        |«      d¬«      }|sy|j                  d«      r†|j                  dg «      }|j                  d«      }|j                  d«      }t        ||«      }|st	        j
                  d	«       yt        | |||¬
«      }	|	r|	||ddœS t	        j
                  d«       y|j                  d«      }
|j                  d«      }|j                  dg «      }|j                  d«      }|r&t        |«      dk(  rt	        j
                  d|› �«       |
r|
|||dœS y)zª
    Poll the server for authentication completion and handle team selection.

    Returns:
        Dictionary with authentication data if successful, None otherwise
    ú/sso/cli/poll/z#Still waiting for authentication...)r  r  Nr^   r\   r]   r5   z*Warning: No teams available for selection.)r3   rB  rc   r\   )rV   r5   r\   rA   z2Team selection cancelled or JWT generation failed.r4   rA   r%   z!
Automatically assigned to team: )r+  rA  r{   r/  rž   rŸ   Ú%_handle_team_selection_during_pollingr¿   )r3   rB  rc   Úpoll_urlr)  r\   r]   r5   Únormalized_teamsÚjwt_with_teamrV   rA   s               rJ   Ú_poll_for_authenticationrI  e  sO  € ð "˜
 .°°Ð9€HÜ&ØÜ)¨+Ó6Ø=ô€Dñ
 ØØ‡x�xÐ)Ô*Ø—‘˜ "Ó%ˆØ"Ÿh™h ~Ó6ˆØ—(‘(˜9Ó%ˆÜ1AÀ%ÈÓ1VÐÙÜ�J‰JÐCÔDØô  EØØØ#Ø"ô	 
ˆñ à(Ø"ØØñ	ð ô 	�
‰
ÐGÔHØð —X‘X˜e“_€GØ�h‰h�yÓ!€GØ�H‰H�W˜bÓ!€EØ—X‘X˜iÓ(€Gñ ”3�u“: ’?Ü�
‰
Ð7¸°yÐAÔBáàØØØñ	
ð 	
ð rI   c                 ó¤  — |st        j                  d«       yt        j                  d«       t        j                  d«       t        |«      }|st        j                  d«       yt        j                  d|› �«       | › d|› d|› �}t        |t	        |«      d	d
d¬«      }|sy|j                  d«      }|rt        j                  d|› �«       |S y)zÔ
    Handle team selection and re-poll with selected team_id.

    Args:
        teams: List of team IDs (strings)

    Returns:
        The JWT token with the selected team, or None if selection was skipped
    zENo teams found. You can create or join teams using the web interface.Nú=
============================================================z%Select a team for your CLI session...zNo team selected.z
Generating JWT for team: rD  z	?team_id=z(Still waiting for team authentication...z.Waiting for team authentication to complete...r  )r  r  r  r  r4   z%Successfully generated JWT for team: )rž   rŸ   Ú%_render_and_prompt_for_team_selectionr+  rA  r{   )r3   rB  rc   r\   rA   rF  r)  r9   s           rJ   rE  rE  ¦  sÊ   € ñ Ü�
‰
ÐZÔ[Øä	‡J�JˆÔÜ	‡J�JÐ6Ô7ä:¸5ÓA€GáÜ�
‰
Ð&Ô'Øä	‡J�JÐ,¨W¨IÐ6Ô7à!˜
 .°°¸	À'ÀÐK€HÜ&ØÜ)¨+Ó6ØBØMØô€Dñ ØØ—x‘x “€IÙÜ�
‰
Ð:¸7¸)ÐDÔEØÐàrI   c                 ó  — t        «       }t        d¬«      }|j                  ddd¬«       |j                  dd¬	«       |j                  d
d¬	«       t        | «      D ]S  \  }}t	        |j                  d«      «      }|j                  d«      xs |}|j                  t	        |dz   «      ||«       ŒU |j                  |«       	 	 t        j                  dt        ¬«      }|j                  «       }|j                  «       dk(  r"| r| d   }	t	        |	j                  d«      «      S yt        |«      dz
  }
d|
cxk  rt        | «      k  rUn nR| |
   }t	        |j                  d«      «      }|j                  d«      xs |}t        j                  d|› d|› d�«       |S t        j                  dt        | «      › �«       Œú# t        $ r t        j                  d«       Y Œ!t         $ r t        j                  d«       Y yw xY w)z»Render teams table and prompt user for a team selection.

    Returns the selected team_id as a string, or None if selection was
    cancelled or skipped without any teams available.
    r¥   r¦   r¨   r©   Trª   z	Team Namer­   r®   r¯   r°   rA   rM   r%   zI
Select a team by entering the index number (or 'skip' to use first team)rú   rü   r   Nrý   rñ   rí   rþ   rÿ   rò   )r   r	   r½   r¾   rE   r{   rÁ   r¼   rž   r   r  r  r  r¿   rŸ   r  rõ   )r\   rÂ   rÃ   rÄ   rÅ   rA   rM   r  r  Ú
first_teamr  r÷   s               rJ   rL  rL  Ó  sà  € ô “Y€GÜÐ0Ô1€EØ	×Ñ�W F°DÐÔ9Ø	×Ñ�[¨	ÐÔ2Ø	×Ñ�Y gÐÔ.ä˜UÓ#ò 7‰ˆˆ4Ü�d—h‘h˜yÓ)Ó*ˆØ—X‘X˜lÓ+Ò6¨wˆ
Ø�‰”c˜!˜a™%“j *¨gÕ6ð7ð
 ‡M�M�%Ôð ð	Ü#(§<¡<Ø\Üô$ˆOð %×*Ñ*Ó,ˆFà�|‰|‹~ Ò'ñ Ø!& q¡�JÜ˜zŸ~™~¨iÓ8Ó9Ð9Øä˜“K !‘OˆEØ�EÔ&œC ›JÕ&Ø % e¡�Ü˜m×/Ñ/°	Ó:Ó;�Ø*×.Ñ.¨|Ó<ÒGÀ�
Ü—
‘
Ð.¨z¨l¸"¸W¸IÀQÐGÔHØ�ä�J‰JÐPÔQTÐUZÓQ[ÐP\Ð]Ô^ð1 øô2 ò 	IÜ�J‰JÐGÖHÜ ò 	Ü�J‰JÐ4Ô5Ùð	ús&   ÃAF> Ä%A6F> Æ!F> Æ>G>ÇG>Ç=G>c                 ó
  — 	 t        | t        t        «       t	        j                  dt        › d| j                  d«      › d�«       t	        j                  d«       y# t        $ r}t	        j
                  d|› �«      ‚d}~ww xY w)zBPoint Claude Code at base_url by patching ~/.claude/settings.json.z0Logged in, but could not configure Claude Code: Nz
Configured Claude Code: z now routes through r’   ú.zYYour other Claude Code settings were left untouched. Restart Claude Code to pick this up.)r)   r&   r'   r(   rž   ÚClickExceptionrŸ   r•   )r3   r*  s     rJ   Ú_configure_claude_coderR  	  s‚   € ð[Ü˜hÔ(<Ô>RÔSô 
‡J�JÐ+Ô,@Ð+AÐAUÐV^×VeÑVeÐfiÓVjÐUkÐklÐmÔnÜ	‡J�JÐjÕkøô ò [Ü×"Ñ"Ð%UÐVWÐUXÐ#YÓZÐZûð[ús   ‚A Á	BÁ%A=Á=BrV   Úconfig_claudeÚstoredc                 óX  — ddl m} t        j                  d«       t        j                  d|d d › d�«       t        j                  t	        |«      «       t        |t        t        f«      ry t        j                  d«       |rt        | «       t        j                  d«        |«        y )	Nr   )Úshow_commandsz
Login successful!zJWT Token: é   z...z4You can now use the CLI without specifying --api-keyrK  )	Ú"litellm.proxy.client.cli.interfacerV  rž   rŸ   rr   rˆ   r   r   rR  )r3   rV   rS  rT  rV  s        rJ   Ú_finish_loginrY    s{   € Ý@ä	‡J�JÐ$Ô%Ü	‡J�J�˜W S b˜\˜N¨#Ð.Ô/Ü	‡J�JŒ~˜fÓ%Ô&Ü�&Ô-Ô/DÐEÔFØÜ	‡J�JÐEÔFÙÜ˜xÔ(Ü	‡J�JˆÔÙ…OrI   Úhttpc                 óÂ   — t        |¬«      }t        | |¬«      }|�t        |t        «      r|S t	        ||«      }|�#t        j                  d|j                  › d�«       |S )Nrv   zBCould not revoke the previous login's refresh token on the proxy (ú); it expires on its own.)r‚   r„   rˆ   r   r/   rž   rŸ   Úreason)r�   rZ  rs   ÚpreviousrT  Ú
revocations         rJ   Ú_replace_stored_tokenr`  "  sl   € Ü  uÔ-€HÜ˜v¨UÔ3€FØÐœ: fÔ.@ÔAØˆÜ0°¸4Ó@€JØÐÜ�
‰
ØPÐQ[×QbÑQbÐPcð d%ð %ô	
ð €MrI   c                 ó(  — t        j                  «       }t        | |t        j                  ¬«      }t        |t        «      r#t        j                  d|j                  › �«       y t        t        | |«      ||«      }t        | |j                  ||«       y )N)rŸ   úAuthentication failed: )r–   r—   r0   rž   rŸ   rˆ   r+   r]  r`  r.   rY  Úaccess_token)r3   rS  rs   rZ  Ú
credentialrT  s         rJ   Ú_pkce_loginre  0  sv   € Ü×"Ñ"Ó$€DÜ& x°¼E¿J¹JÔG€JÜ�*œkÔ*Ü�
‰
Ð,¨Z×->Ñ->Ð,?Ð@ÔAØÜ)Ô*;¸HÀjÓ*QÐSWÐY^Ó_€FÜ�(˜J×3Ñ3°]ÀFÕKrI   Úlogin)Únamez--config-claudeTz|After logging in, update ~/.claude/settings.json so Claude Code routes through this proxy. Unrelated settings are preserved.)Úis_flagÚdefaultÚhelpz--pkcezÑSign in with OAuth authorization code + PKCE through your system browser (loopback redirect), with a refresh token that renews the key automatically. Requires a proxy that serves /.well-known/litellm-cli-auth.Úpkcec                 óä  — ddl m} | j                  }|d   }	 |rt        ||t	        | «      «       yt        |¬«      }|d   }|d   }|d   }	|› d	�t        ||d
œ«      z   }
t        j                  d|
› �«       t        j                  d«       t        j                  d|	› �«       t        j                  d|› �«       t        j                  |
«       t        j                  d«       t        |||¬«      }|ro|d   }|d   }t        |j                  d«      ||xs dddddt        j                  «       dœt        j                   «       t	        | «      «      }t#        ||||«       yt        j                  d«       t        j                  d«       y# t$        $ r t        j                  d«       Y yt        j&                  $ r ‚ t(        $ r"}t        j                  d|› �«       Y d}~yd}~ww xY w)z/Login to LiteLLM proxy using SSO authenticationr   )ÚLITELLM_CLI_SOURCE_IDENTIFIERr3   N)r3   rb   rc   rd   z/sso/key/generate?)Úsourcer4   zOpening browser to: z9Please complete the SSO authentication in your browser...zVerification code: zSession ID: zWaiting for authentication...)r3   rB  rc   rV   r5   r’   zcli-userr2  ÚcliÚAuthorizationr1  )r3   r4   r5   r6   r7   r8   r9   r:   z+Authentication timed out. Please try again.z«The proxy never reported the browser sign-in as finished. If you did complete it, check the proxy logs for /sso/callback errors and confirm SSO is configured on the proxy.z"
Authentication cancelled by user.rb  )Úlitellm.constantsrm  rz   re  r}   r?  r   rž   rŸ   Ú
webbrowserÚopenrI  r`  r•   r&  r–   r—   rY  rõ   rQ  rö   )rx   rS  rk  rm  r|   r3   Úcli_sso_flowrB  rc   rd   Ússo_urlÚauth_resultrV   r5   rT  r*  s                   rJ   rf  rf  :  sç  € õ. @à$'§G¡G€GØ˜jÑ)€Hð@ÙÜ˜ -Ô1EÀcÓ1JÔKØÜ1¸8ÔDˆØ$ ZÑ0ˆØ)¨-Ñ8ˆØ'¨Ñ4ˆ	à�JÐ0Ð1´IÐIfÐouÑ>vÓ4wÑwˆä�
‰
Ð)¨'¨Ð3Ô4Ü�
‰
ÐNÔOÜ�
‰
Ð(¨¨Ð4Ô5Ü�
‰
�\ & Ð*Ô+ô 	�‰˜Ô ô 	�
‰
Ð2Ô3ä5¸xÐPVÐdoÔpˆáØ(¨Ñ3ˆGØ(¨Ñ3ˆGô 2à (§¡°Ó 4Ø"Ø&Ò4¨*Ø"+Ø!&Ø(7Ø!#Ü!%§¡£ñ	ô × Ñ Ó"Ü$ SÓ)óˆFô ˜( G¨]¸FÔCØä�J‰JÐDÔEÜ�J‰Jðlôð øäò Ü�
‰
Ð8Ô9ÙÜ×Ñò ð 	Üò Ü�
‰
Ð,¨Q¨CÐ0Ô1Üûðús)   ™F ²D4F Å'*F ÆG/Æ2G/ÇG*Ç*G/Úlogoutc                 ó.  — t        | «      }t        |¬«      }|�t        |t        j                  «       «      nd}|xt
        d˜ x�\  } t        j                  d|› d�«      ‚ xt        d˜ x�\  } t        j                  d|› d�«       n €n	 t        |«       t        «       }t        |¬«      xt        d˜ x�\    t        j                  d	«       y xt        d
˜ x�6\  } t        j                  d|› d|› d�«       t        j                  d«       y xt        d˜ x�2\    t        j                  t         «       t        j                  d«       y xt"        d˜ x�:\    t        j                  t$        «       t        j                  dt&        › d�«       y xt(        d˜ x�:\    t        j                  t$        «       t        j                  dt*        › d�«       y t,        d˜ x�1\   t        j                  t$        «       t        j                  d«       y y)z&Logout and clear stored authenticationrv   N)r]  z+The proxy could not record the revocation (z8). Nothing was cleared; run `lite logout` again shortly.z1Could not revoke the refresh token on the proxy (r\  rH   z6Logged out successfully. Authentication token cleared.rn   zYour credential is still in z, which could not be removed: rP  zMDelete that file, or make the directory writable and run 'lite logout' again.z=Unlock your keychain and run 'lite logout' again to clear it.z"Install the keyring package with: z, then run 'lite logout' again.zUnset z) and run 'lite logout' again to clear it.)r}   r‚   r/   r–   r—   r,   rž   rQ  r+   rŸ   r   r!   r    r   r   r   ri   r   rj   rg   r   r   r   )rx   rs   r˜   r_  r]  rq   ro   s          rJ   rw  rw  ™  sÁ  € ô (¨Ó,€EÜ"¨Ô/€JØT^ÐTjÔ0°¼X×=MÑ=MÓ=OÔPÐpt€JØ
Ø1Ô"×1Ü×&Ñ&Ø=¸f¸Xð F3ð 3óð ð 2ð
 (Œ[×'Ü�J‰JÐJÈ6È(ÐRkÐlÕmð (àØØÜ˜Ô$ä)Ó+€DÜ
 Ô
&ØŒ\Ž^Ü�J‰JÐOÕPð à0Ô!×0Ü�J‰JÐ5°d°VÐ;YÐZ`ÐYaÐabÐcÔdÜ�J‰JÐfÕgð 1ð Œ^ÖÜ�J‰JÔ2Ô3Ü�J‰JÐVÕWð ð #Ô Ö"Ü�J‰JÔ1Ô2Ü�J‰JÐ;Ô<PÐ;QÐQpÐqÕrð #ð Œ_ÖÜ�J‰JÔ1Ô2Ü�J‰J˜Ô 7Ð8Ð8aÐbÕcð ô  Õ!Ü�J‰JÔ1Ô2Ü�J‰JÐVÕWñ "rI   zprint-tokenc                 óè  — t        | «      }t        |¬«      }|s,t        j                  dd¬«       t	        j
                  d«       | j                  }|j                  d«      |j                  dd«      j                  d«      k(  }|j                  d	«      r.|s,t        j                  d
d¬«       t	        j
                  d«       d|v }t        |«      s.|s,t        j                  dd¬«       t	        j
                  d«       |j                  d«      €5t        j                  t        |«      d¬«       t	        j
                  d«       |r"|j                  d«      r|j                  d«      n7t        |t        |«      t        j                  «       t        |«      t         ¬«      }|s9t        j                  dt#        |«      › d�d¬«       t	        j
                  d«       t        j                  |«       y)aÆ  Print a valid API token for this proxy.

    Designed to be used as Claude Code's `apiKeyHelper`
    (https://docs.claude.com/en/docs/claude-code/settings): stdout must
    contain only the token, so all diagnostics go to stderr. The token
    expires after `LITELLM_CLI_JWT_EXPIRATION_HOURS` (default 24h); a
    `lite login --pkce` token renews itself here first, and once a token
    has expired for good, run the same `lite login` command again.
    rv   z$Not authenticated. Run 'lite login'.Trœ   r%   r3   r1  r’   rT   z4Not authenticated for this server. Run 'lite login'.r<   z&Token expired. Run 'lite login' again.r4   NrW   rV   r“   úKey expired. Run 'z' again.)r}   r‚   rž   rŸ   rÛ   Úexitrz   r{   r•   r"   rw   r-   r‹   r–   r—   r�   r‰   r£   )rx   rs   r˜   r|   Úissued_for_this_serverr    rV   s          rJ   Úprint_tokenr}  Â  sz  € ô (¨Ó,€EÜ"¨Ô/€JÙÜ�
‰
Ð9¸tÕDÜ�‰�Œð %(§G¡G€GØ$.§N¡N°:Ó$>À'Ç+Á+ÈjÐZ\ÓB]×BdÑBdÐehÓBiÑ$iÐØ‡{�{Ð&Ô'Ñ0FÜ�
‰
ÐIÈtÕTÜ�‰�Œà# zÐ1€FÜ˜jÔ)±&Ü�
‰
Ð;ÀÕFÜ�‰�Œà‡~�~�eÓÐ$Ü�
‰
Ô-¨eÓ4¸$Õ?Ü�‰�Œñ " g§k¡kÐ2KÔ&Lð 	�‰�IÔäØÜ˜5Ó!Ü×ÑÓÜ" 5Ó)Üô
ð ñ Ü�
‰
Ð'¬°vÓ(>Ð'?¸xÐHÈdÕSÜ�‰�Œä	‡J�JˆwÕrI   Úwhoamic                 óî  — t        | «      }t        |¬«      }|st        j                  d«       y|j	                  d«      du}t        j                  |rdnd«       t        j                  d|j	                  d«      xs d	› �«       t        j                  d
|j	                  d«      xs d	› �«       t        j                  d|j	                  d«      xs d	› �«       |j	                  d«      }|rt        j                  d|› �«       |j	                  d«      }t        j
                  «       t        |t        t        f«      r|ndz
  dz  }t        j                  d|d›d�«       |st        j                  t        |«      «       |j	                  d«      }t        |t        t        f«      r#t        j                  t        |d|v ¬«      «       y|t        kD  rt        j                  dt        › d�«       yy)z"Show current authentication statusrv   z4Not authenticated. Run 'lite login' to authenticate.Nr4   ÚAuthenticatedz,Signed in, but the credential cannot be readzUser Email: r6   ÚUnknownz	User ID: r5   zUser Role: r7   rA   z	Team ID: r:   g        é  zToken age: ú.1fú hoursr;   r<   r¢   zWarning: Token is more than z  hours old and may have expired.)r}   r‚   rž   rŸ   r{   r&  rˆ   r  rG   rw   Ú_key_expiry_liner   )rx   rs   r˜   Úkey_readablerA   ÚstampedÚ	age_hoursr;   s           rJ   r~  r~  ù  s•  € ô (¨Ó,€EÜ"¨Ô/€JáÜ�
‰
ÐIÔJØà$Ÿ.™.¨Ó/°tÐ;€LÜ	‡J�J¡,‰Ð4bÔcÜ	‡J�J�˜jŸn™n¨\Ó:ÒG¸iÐHÐIÔJÜ	‡J�J�˜:Ÿ>™>¨)Ó4ÒA¸	ÐBÐCÔDÜ	‡J�J�˜ZŸ^™^¨KÓ8ÒE¸IÐFÐGÔHØ—^‘^ IÓ.€GÙÜ�
‰
�Y˜w˜iÐ(Ô)à—^‘^ KÓ0€GÜŸ	™	›´*¸WÄsÌEÀlÔ2S¡wÐY\Ñ]ÐaeÑe€IÜ	‡J�J�˜Y s˜O¨6Ð2Ô3áÜ�
‰
Ô-¨eÓ4Ô5à"Ÿ™ |Ó4€JÜ�*œs¤E˜lÔ+Ü�
‰
Ô# J°È*Ð7TÔUÕVØ	Ô-Ò	-Ü�
‰
Ð1Ô2JÐ1KÐKkÐlÕmð 
.rI   r;   c                 ó~   — | t        j                   «       z
  dz  }|dk  rdt        |«      › d�S d|d›d�}|r|› d�S |S )	Nr‚  r   rz  z' againzKey expires in: rƒ  r„  z, renewed on next use)r&  r£   )r;   r    Úremaining_hoursr[   s       rJ   r…  r…    sZ   € Ø(¬4¯9©9«;Ñ6¸$Ñ>€OØ˜!ÒØ#¤N°6Ó$:Ð#;¸7ÐCÐCØ& °sÐ&;¸6ÐB€FÙ/5ˆfˆXÐ*Ð+ÐA¸6ÐArI   Úauthc                   ó   — y)z6Manage CLI authentication (apiKeyHelper support, etc.)NrH   rH   rI   rJ   Ú
auth_groupr�  #  s   � rI   )r�  rf  rw  r}  rø   r~  r4  )r   )zrÛ   r&  rr  Úcollections.abcr   r   Útypingr   r   Úurllib.parser   rž   r–   Úrich.consoler   Ú
rich.tabler	   Útyping_extensionsr
   r   r   r   rq  r   Ú&litellm.litellm_core_utils.cli_keyringr   r   r   r   r   r   r   r   r   r   r   r   Ú*litellm.litellm_core_utils.cli_token_utilsr   r   r   r   r   r    r!   r"   r#   r$   Úclaude_settingsr&   r'   r(   r)   Ú
pkce_loginr*   r+   r,   r-   r.   r/   r0   r2   rL   rS   rZ   ra   rf   rg   rF   rh   ri   rj   rE   rr   rw   ÚContextr}   r_   r‚   r„   r‹   r�   r™   r‰   rX   r£   rP   rÈ   rê   r  r  rï   rø   rô   ÚResponser  r  r  r+  r/  r?  rA  rI  rE  rL  rR  rY  r`  re  ÚcommandÚoptionÚpass_contextrf  rw  r}  r~  rG   r…  Úgroupr�  Úadd_commandÚ__all__rH   rI   rJ   ú<module>r      sÀ  ðÜ 
Û Û ß -ß Ý "ã Û Ý  Ý ß LÓ Lå 6÷÷ ÷ ó ÷÷ ÷ ÷ó ÷÷ ñ ô/�9ô /ô$ˆi˜uõ ô9�Iô 9ô�) 5õ ô�iô ô�Iô ð ;Ð �eÓ :àQÐ �UÓ Qð dð ˜Uó ð
,ð ˜Eó ð ˜Jð  ¨3ó  ðFn kð n°có nð,9˜eŸm™mð 9°ó 9ð (6ò L˜ð L¸'À#ÀvÀ+Ñ:NÐQUÑ:Uó Lð >Lò A�|ð A¨{ð AÐPZó Að
˜+ð ¨(°L°>À4Ð3GÑ*Hó ð˜;ð ¨8°B¸ÀÀVÀÑ8LÈtÑ8SÐ4SÑ+Tó ð %)ðð (òØ˜T‘zðð ðð 	ˆ4�Zó	ð4"�3ð "˜4ó "ð;˜4ð ; Có ;ð
#˜t G™}ð #°ó #òL/ñd#C¨d°4¸¸S¸±>Ñ.Bð #CÐTWð #CÐ`dó #CðL.5  d¨3°¨8¡nÑ!5ð .5¸$¸sÀC¸x¹.È4Ñ:Oó .5ðbØ��S˜#�X‘Ñðà	ˆ#ˆsˆ(�^�dÑóðD X×%6Ñ%6ð ¸3À¹:ó ð9 X×%6Ñ%6ð 9¸3ó 9ð;¨Sð ;°Tó ;ð &*ØØØØ"&ØØ'+Ø"$Ø "Ø&(ò'Ø	ð'ð �#�s�(‰^˜dÑ"ð'ð ð	'ð
 ð'ð ð'ð ˜4‘Zð'ð ð'ð  ™*ð'ð  ð'ð ð'ð !$ð'ð �4Ñó'ðT˜Fð °&ð ¸TÀ'¹]ó ð0( #ð (¨/ó (ðV6¨3ð 6°4¸¸S¸±>ó 6ð> sð >°Cð >Àcð >ÈmÐ^bÑNbó >ðB*Øð*Øð*Ø-0ð*Ø9=¸g¹ð*àˆ4�Zó*ðZ3°°g±ð 3À3ÈÁ:ó 3ðll Sð l¨Tó lð˜Cð ¨#ð ¸dð ÈJð Ð[_ó ð ,ð °dð À;ð ÐS]ó ðL˜#ð L¨dð L¸;ð LÈ4ó Lð €‡��GÔØ€‡�ØØØð	,ôð €‡�ØØØð	)ô	ð ×ÑðGˆu�}‰}ð G¨Tð G¸ð GÀ$ò Gó ó	óó ð*GðT €‡��HÔØ×Ñð$X�—‘ò $Xó ó ð$XðN €‡��MÔ"Ø×Ñð2�U—]‘]ò 2ó ó #ð2ðj €‡��HÔØ×Ñðn�—‘ò nó ó ðnð@B ð B°ð B¸ó Bð €‡��&ÔñAó ðAð × Ñ �{Ô #ò ^�rI   