Ë
    tPêjM$  ã            	       ó&  — U d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZmZ d dlZd dlmZmZmZ d dlmZ d d	lmZ d d
lmZ ddlmZmZm Z  ddl!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-  G d„ de*«      Z. e
dd¬«       G d„ d«      «       Z/ ee/«      Z0ee1d<   ejd                  dedeee3      fd„«       Z4d/de/dedz  ddfd„Z5d/dedz  de/dz  fd„Z6d0dedz  dedz  de/dz  fd„Z7de3dz  d ede8fd!„Z9d"e"d#e3d ede3dz  fd$„Z:d ede8fd%„Z;d&ejx                  ddfd'„Z=d1d(„Z> ej~                  d)¬*«      ej€                  d&ejx                  ddfd+„«       «       ZA ej~                  d,¬*«      d1d-„«       ZBg d.¢ZCy)2é    N)ÚIterator)Ú	dataclass)ÚPath)Ú	FrameType)ÚIOÚFinal)Ú	JsonValueÚTypeAdapterÚValidationError)ÚSecretVault)Úis_cli_token_fresh)Úensure_private_diré   )ÚAgentRunErrorÚresolve_api_keyÚverify_proxy_key)ÚCliContextObjÚcontext_secret_vaultÚget_stored_api_keyÚ
load_tokenÚlogin)ÚBACKUP_PATHÚCLAUDE_SETTINGS_PATHÚClaudeSettingsErrorÚload_json_or_emptyÚmerge_claude_settingsÚresolve_api_key_helperc                   ó   — e Zd ZdZy)ÚUpErrorzLRaised for any user-actionable failure while starting/stopping interception.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úi/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/client/cli/commands/up.pyr   r   !   s   „ ÚVr%   r   T)ÚfrozenÚslotsc                   ó6   — e Zd ZU dZeed<   eeef   dz  ed<   y)ÚBackupRecordzLSnapshot of ~/.claude/settings.json taken right before `lite up` patches it.ÚexistedNÚcontent)	r    r!   r"   r#   ÚboolÚ__annotations__ÚdictÚstrr	   r$   r%   r&   r*   r*   %   s   … áVàƒMØ�#�y�.Ñ! DÑ(Ô(r%   r*   Ú_BACKUP_RECORD_ADAPTERÚpathÚreturnc              #   óF  K  — t        j                  | t         j                  t         j                  z  t         j                  z  d«      }t        j
                  |d«       t        j                  |d«      }	 |–— |j                  «        y# |j                  «        w xY w­w)a¯  Open path for writing with mode 0600 fixed up before any content is written.

    A plain `open(path, "w")` creates a *new* file at the umask-derived default (commonly 0644)
    and leaves it world- or group-readable until a later `chmod` call catches up -- a real window
    in which a file holding a credential is readable by another local account. Passing the mode to
    `os.open` closes that window for a brand-new file, but `O_CREAT`'s mode argument is only
    applied on creation: if the file already exists its old, broader permissions carry over
    untouched. `os.fchmod` right after opening -- before a single byte of the new content is
    written -- covers both cases.
    i€  ÚwN)ÚosÚopenÚO_WRONLYÚO_CREATÚO_TRUNCÚfchmodÚfdopenÚclose)r2   ÚfdÚfs      r&   Úsecure_creater@   0   sj   è ø€ ô —‘˜œbŸk™k¬B¯J©JÑ6¼¿¹ÑCÀUÓK€BÜ‡I�Iˆb�%ÔÜŸ	™	 " cÓ*€AðØŠà	�‰�	øˆ�‰�	üs   ‚A4B!Á7B Á;B!ÂBÂB!ÚrecordÚbackup_pathc                 óà   — |�|nt         }t        |j                  «       t        |«      5 }t	        j
                  | j                  | j                  dœ|d¬«       d d d «       y # 1 sw Y   y xY w)N©r+   r,   é   ©Úindent)r   r   Úparentr@   ÚjsonÚdumpr+   r,   )rA   rB   r2   r?   s       r&   Úwrite_backuprK   E   s[   € Ø!,Ð!8‘+¼k€DÜ�t—{‘{Ô#Ü	�tÓ	ð W Ü�	‰	˜fŸn™n¸¿¹ÑHÈ!ÐTUÕV÷W÷ Wñ Wús   «0A$Á$A-c                 óü   — | �| nt         }|j                  «       sy t        |d«      5 }|j                  «       }d d d «       	 t        j                  «      S # 1 sw Y   ŒxY w# t        $ r t        |› d�«      ‚w xY w)NÚrzD contains invalid or unexpected JSON; cannot restore from it safely.)r   Úexistsr7   Úreadr1   Úvalidate_jsonr   r   )rB   r2   r?   r,   s       r&   Úread_backuprQ   L   s�   € Ø!,Ð!8‘+¼k€DØ�;‰;Œ=ØÜ	ˆd�C‹ð "˜AØŸ™›ˆ÷"ðeÜ%×3Ñ3°GÓ<Ð<÷"ð "ûô ò eÜ˜˜ÐbÐcÓdÐdðeús   ¨AÁA# ÁA Á#A;Úsettings_pathc                 óœ  — | �| nt         }|�|nt        }t        |«      }|€y|j                  ra|j                  �U|j
                  j                  dd¬«       t        |d«      5 }t        j                  |j                  |d¬«       ddd«       n |j                  «       r|j                  «        |j                  «        |S # 1 sw Y   ŒxY w)z�Restore settings_path from the backup at backup_path, then delete the backup.

    Returns the restored record, or None if there was nothing to restore.
    NT)ÚparentsÚexist_okr5   rE   rF   )r   r   rQ   r+   r,   rH   Úmkdirr7   rI   rJ   rN   Úunlink)rR   rB   Úresolved_settings_pathÚresolved_backup_pathrA   r?   s         r&   Úrestore_claude_settingsrZ   X   sÀ   € ð
 6CÐ5N¡MÔThÐØ1<Ð1H¡+ÌkÐÜÐ 4Ó5€FØ€~ØØ‡~‚~˜&Ÿ.™.Ð4Ø×%Ñ%×+Ñ+°DÀ4Ð+ÔHÜÐ(¨#Ó.ð 	3°!Ü�I‰I�f—n‘n a°Õ2÷	3ð 	3à	×	&Ñ	&Ô	(Ø×%Ñ%Ô'Ø×ÑÔ!Ø€M÷	3ð 	3ús   Á$#CÃCÚapi_keyÚvaultc                 óB   — | €yt        |¬«      }|d uxr t        |«      S )NF©r\   )r   r   )r[   r\   Ú
token_datas      r&   Ú_usable_loginr`   l   s*   € Ø€ØÜ"¨Ô/€JØ˜TÐ!ÒDÔ&8¸Ó&DÐDr%   Úctx_objÚbase_urlc                 ó`   — | j                  d«      r| j                  d«      S t        ||¬«      S )NÚapi_key_from_token_filer[   ©Úexpected_base_urlr\   )Úgetr   )ra   rb   r\   s      r&   Ú_key_resolved_on_the_way_inrh   s   s+   € Ø‡{�{Ð,Ô-Ø�{‰{˜9Ó%Ð%Ü°ÀÔFÐFr%   c                 óL   — t        | ¬«      }|d uxr |j                  d«      d uS )Nr^   Úrefresh_token)r   rg   )r\   r_   s     r&   Ú_stored_login_is_pkcerk   y   s*   € Ü"¨Ô/€JØ˜TÐ!ÒQ j§n¡n°_Ó&EÈTÐ&QÐQr%   Úctxc                 ó¢  — | j                   }|d   j                  d«      }t        | «      }t        t	        |||«      |«      ry t        |«      }|rdnd}t        j                  j                  «       st        d|› d�«      ‚t        j                  d«       | j                  t        |¬«       t        t        ||¬	«      |«      st        d
«      ‚y )Nrb   ú/zlite login --pkcez
lite loginz2No fresh LiteLLM login found for this proxy. Run `zE` first (apiKeyHelper reads this token on every Claude Code request).z>No fresh LiteLLM login found for this proxy; starting login...)Úpkcere   z=Login did not produce a usable token; cannot start `lite up`.)ÚobjÚrstripr   r`   rh   rk   ÚsysÚstdinÚisattyr   ÚclickÚechoÚinvoker   r   )rl   ra   rb   r\   ro   Úlogin_commands         r&   Ú_ensure_fresh_loginry   ~   sÈ   € Ø$'§G¡G€GØ˜jÑ)×0Ñ0°Ó5€HÜ'¨Ó,€EÜÔ0°¸(ÀEÓJÈEÔRØä'¨Ó.€DÙ26Ñ.¸L€MÜ�9‰9×ÑÔÜØ@ÀÀð P>ð >ó
ð 	
ô
 
‡J�JÐOÔPØ‡J�JŒu˜4€JÔ ÜÔ+¸hÈeÔTÐV[Ô\ÜÐUÓVÐVð ]r%   c                  óÖ   — t        «       } | €t        j                  d«       y | j                  rt        j                  dt        › d�«       y t        j                  dt        › d�«       y )NzNothing to restore.z	Restored z to its original contents.zRemoved z% (it did not exist before `lite up`).)rZ   ru   rv   r+   r   )rA   s    r&   Ú_restore_and_reportr{   “   sV   € Ü+Ó-€FØ€~Ü�
‰
Ð(Ô)ØØ‡~‚~Ü�
‰
�YÔ3Ð4Ð4NÐOÕPä�
‰
�XÔ2Ð3Ð3XÐYÕZr%   Úup)Únamec                 óp  ‡‡— | j                   d   }	 t        | «       t        | «      }t        ||«       t	        j
                  «       rt        t        › d�«      ‚t        |«      }t        j
                  «       }t        t        «      }t        t        ||r|nd¬«      «       t        j                  j                  d¬«       t        |||«      }t        t        d«      5 }t!        j"                  ||d¬	«       ddd«       t)        j.                  d
|j1                  d«      › �«       t)        j.                  d«       t3        j4                  «       Št3        j6                  «       Šdt8        dt:        dz  ddfˆfd„}	dˆfd„}
t=        j<                  t<        j>                  |	«       t=        j<                  t<        j@                  |	«       tC        jD                  |
«       ‰jG                  «         |
«        y# 1 sw Y   ŒÿxY w# t$        t&        f$ r#}t)        j*                  t-        |«      «      ‚d}~ww xY w)aÃ  Route every Claude Code session through your LiteLLM proxy until stopped.

    Patches ~/.claude/settings.json so Claude Code picks up the proxy on its own
    next startup, from any terminal -- no need to launch it through `lite`.
    Press Ctrl-C to stop and restore your original settings. Assumes the proxy
    is already running (this does not start one for you). Cursor is not
    supported: it has no equivalent file-based config to patch.
    rb   zq already exists -- `lite up` looks like it's already running (or crashed without cleanup). Run `lite down` first.NrD   T)rU   r5   rE   rF   z.litellm: routing Claude Code through proxy at rn   z8Press Ctrl-C to stop and restore your original settings.Ú_signumÚ_framer3   c                 ó&   •— ‰j                  «        y ©N)Úset)r   r€   Ú
stop_events     €r&   Ú_handle_signalzup.<locals>._handle_signalÍ   s   ø€ Ø�‰Õr%   c                  ó®   •— ‰j                  d¬«      sy 	 t        «        y # t        $ r*} t        j                  t        | «      d¬«       Y d } ~ y d } ~ ww xY w)NF)ÚblockingT)Úerr)Úacquirer{   r   ru   rv   r0   )ÚeÚrestoreds    €r&   Ú_restore_oncezup.<locals>._restore_onceÐ   sI   ø€ Ø×Ñ¨ÐÔ/Øð	)ÜÕ!øÜ"ò 	)ô �J‰J”s˜1“v 4×(Ò(ûð		)ús   –
! ¡	Aª AÁA©r3   N)$rp   ry   r   r   r   rN   r   r   r   r   rK   r*   rH   rV   r   r7   rI   rJ   r   r   ru   ÚClickExceptionr0   rv   rq   Ú	threadingÚEventÚLockÚintr   ÚsignalÚSIGINTÚSIGTERMÚatexitÚregisterÚwait)rl   rb   r[   Úapi_key_helperÚoriginal_existedÚoriginal_settingsÚmergedr?   rŠ   r…   rŒ   r‹   r„   s              @@r&   r|   r|   ž   sÏ  ù€ ð —g‘g˜jÑ)€Hð+Ü˜CÔ Ü(¨Ó-ˆÜ˜ 7Ô+ä×ÑÔÜÜ�-ð  Oð Oóð ô
 !7°xÓ @ˆÜ"6×"=Ñ"=Ó"?ÐÜ#5Ô6JÓ#KÐÜÜØ(Ù-=Ñ)À4ôô	
ô 	×#Ñ#×)Ñ)°4Ð)Ô8Ü-Ð.?ÀÈ>ÓZˆÜÔ&¨Ó,ð 	+°Ü�I‰I�f˜a¨Õ*÷	+ô
 
‡J�JÐ?ÀÇÁÐPSÓ@TÐ?UÐVÔWÜ	‡J�JÐIÔJä!Ÿ™Ó)€JÜ—n‘nÓ&€Hð¤ð ¬Y¸Ñ-=ð À$õ õ	)ô ‡M�M”&—-‘- Ô0Ü
‡M�M”&—.‘. .Ô1Ü
‡O�O�MÔ"à‡O�OÔÙ…O÷=	+ð 	+ûäÔ.Ð/ò +Ü×"Ñ"¤3 q£6Ó*Ð*ûð+ús0   “CH Ã G7Ã9H Ç7H Ç<H ÈH5ÈH0È0H5Údownc                  óx   — 	 t        «        y# t        $ r#} t        j                  t	        | «      «      ‚d} ~ ww xY w)z¾Restore ~/.claude/settings.json if a `lite up` session left it patched.

    Use this after a `lite up` process was killed uncleanly (e.g. `kill -9`)
    instead of stopped with Ctrl-C.
    N)r{   r   ru   rŽ   r0   )rŠ   s    r&   r�   r�   ã   s2   € ð+ÜÕøÜò +Ü×"Ñ"¤3 q£6Ó*Ð*ûð+ús   ‚
 �	9–4´9)r   r   r*   r   r   r�   r   r   rQ   r   rZ   r|   rK   r‚   )NNr�   )Dr–   Ú
contextlibrI   r6   r“   rr   r�   Úcollections.abcr   Údataclassesr   Úpathlibr   Útypesr   Útypingr   r   ru   Úpydanticr	   r
   r   Ú&litellm.litellm_core_utils.cli_keyringr   Ú*litellm.litellm_core_utils.cli_token_utilsr   Ú'litellm.litellm_core_utils.private_jsonr   Úagentsr   r   r   Úauthr   r   r   r   r   Úclaude_settingsr   r   r   r   r   r   r   r*   r1   r.   Úcontextmanagerr0   r@   rK   rQ   rZ   r-   r`   rh   rk   ÚContextry   r{   ÚcommandÚpass_contextr|   r�   Ú__all__r$   r%   r&   ú<module>r±      s  ðÜ Û Û Û 	Û Û 
Û Ý $Ý !Ý Ý ß ã ß <Ñ <å >Ý IÝ Fç DÑ Dß \Õ \÷÷ ôWÐ!ô Wñ �$˜dÔ#÷)ð )ó $ð)ñ !,¨LÓ 9Ð ˜Ó 9ð ×Ñð˜ð  ¨"¨S©'Ñ!2ò ó ðñ(W˜ð W°D¸4±Kð WÈ4ó Wñ	e˜T D™[ð 	e°LÀ4Ñ4Gó 	eñ¨4°$©;ð ÈDÐSWÉKð ÐcoÐrvÑcvó ð(E˜3 ™:ð E¨kð E¸dó EðG¨ð GÀ#ð GÈkð GÐ^aÐdhÑ^hó GðR ð R°ó Rð
W˜UŸ]™]ð W¨tó Wó*[ð €‡��DÔØ×Ñð@ˆE�M‰Mð @˜dò @ó ó ð@ðF €‡��FÔò	+ó ð	+ò�r%   