Ë
    âß²j¿  ã                  óþ   — d Z ddlm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
mZ ddlmZmZmZmZmZmZmZmZ  ej*                  d«      ZdZdd	„Zdd
„Zdd„Zefdd„Zddd„Zdd„Zddedœ	 	 	 	 	 	 	 dd„Zdd„Zy)zãQwen OAuth (qwen-cli token file) runtime credentials and status.

Split out of ``hermes_cli/auth.py``; origin helpers are imported lazily per function so
``hermes_cli.auth.<helper>`` patches still intercept and no cycle forms.
é    )ÚannotationsN)ÚPath)ÚAnyÚDict)Ú	AuthErrorÚDEFAULT_QWEN_BASE_URLÚ&QWEN_ACCESS_TOKEN_REFRESH_SKEW_SECONDSÚQWEN_OAUTH_CLIENT_IDÚQWEN_OAUTH_TOKEN_URLÚ_FORM_JSON_HEADERSÚ	_qwen_errÚhttpxzhermes_cli.authzRe-run 'qwen auth qwen-oauth'.c                 ó6   — t        j                  «       dz  dz  S )Nz.qwenzoauth_creds.json)r   Úhome© ó    ú9/home/ubuntu/.hermes/hermes-agent/hermes_cli/auth_qwen.pyÚ_qwen_cli_auth_pathr      s   € Ü�9‰9‹;˜Ñ Ð#5Ñ5Ð5r   c                 ó,  — ddl m}   | «       }|j                  «       st        dd«      ‚	 t	        j
                  |j                  d¬«      «      }t        |t        «      st        d
|› d�d«      ‚|S # t        $ r}t        d|› d|› �d	«      |‚d }~ww xY w)Nr   )r   zAQwen CLI credentials not found. Run 'qwen auth qwen-oauth' first.Úqwen_auth_missingz	utf-8-sig)Úencodingz)Failed to read Qwen CLI credentials from z: Úqwen_auth_read_failedz Invalid Qwen CLI credentials in ú.Úqwen_auth_invalid)
Úhermes_cli.authr   Úexistsr   ÚjsonÚloadsÚ	read_textÚ	ExceptionÚ
isinstanceÚdict)r   Ú	auth_pathÚdataÚexcs       r   Ú_read_qwen_cli_tokensr&      s§   € Ý3Ù#Ó%€IØ×ÑÔÜÐ[Ð]pÓqÐqðÜ�z‰z˜)×-Ñ-°{Ð-ÓCÓDˆô
 �dœDÔ!ÜÐ:¸9¸+ÀQÐGÐI\Ó]Ð]Ø€Køô ò ÜØ7¸	°{À"ÀSÀEÐJÐLcó
àð	ûðús   «%A2 Á2	BÁ;BÂBc                ó:   — ddl m}m}  |«       } ||| d¬«       |S )Nr   )r   Ú_save_private_jsonT)Ú	sort_keys)r   r   r(   )Útokensr   r(   r#   s       r   Ú_save_qwen_cli_tokensr+   -   s   € ßGÙ#Ó%€IÙ�y &°DÕ9ØÐr   c                ó˜   — 	 t        | «      }t        j                  «       t        dt        |«      «      z   dz  |k\  S # t        $ r Y yw xY w)NTr   éè  )Úintr    ÚtimeÚmax)Úexpiry_date_msÚskew_secondsÚ	expiry_mss      r   Ú_qwen_access_token_is_expiringr4   4   sN   € ðÜ˜Ó'ˆ	ô �I‰I‹Kœ#˜a¤ \Ó!2Ó3Ñ3°tÑ;¸yÑHÐHøô ò Ùðús   ‚= ½	A	ÁA	c                ó,  — t        | j                  dd«      xs d«      j                  «       }|st        dt        › �d«      ‚	 t        j                  t        t        d|t        dœ|¬«      }|j                  d	k\  r>|j                  j                  «       }t        d
t        › �|rd|› �z   d«      ‚dz   d«      ‚	 |j                  «       }t        |t        «      r-t        |j                  dd«      xs d«      j                  «       st        dd«      ‚	 t!        |j                  d«      «      }t        |j                  dd«      xs d«      j                  «       t        |j                  d|«      xs |«      j                  «       t        |j                  d| j                  dd«      «      xs d«      j                  «       xs dt        |j                  d| j                  dd«      «      xs d«      j                  «       t!        t#        j"                  «       dz  «      t%        d|«      dz  z   dœ}t'        |«       |S # t        $ r}t        d|› �d«      |‚d }~ww xY w# t        $ r}t        d|› �d«      |‚d }~ww xY w# t        $ r d}Y �Œcw xY w)NÚrefresh_tokenÚ z"Qwen OAuth refresh token missing. Úqwen_refresh_token_missing)Ú
grant_typer6   Ú	client_id)Úheadersr$   ÚtimeoutzQwen OAuth refresh failed: Úqwen_refresh_failedi�  zQwen OAuth refresh failed. z Response: z*Qwen OAuth refresh returned invalid JSON: Úqwen_refresh_invalid_jsonÚaccess_tokenz1Qwen OAuth refresh response missing access_token.Úqwen_refresh_invalid_responseÚ
expires_ini`T  Ú
token_typeÚBearerÚresource_urlzportal.qwen.air-   é   )r?   r6   rB   rD   Úexpiry_date)ÚstrÚgetÚstripr   Ú_RERUNr   Úpostr   r   r
   r    Ústatus_codeÚtextr   r!   r"   r.   r/   r0   r+   )	r*   Útimeout_secondsr6   Úresponser%   ÚbodyÚpayloadÚexpires_in_secondsÚ	refresheds	            r   Ú_refresh_qwen_cli_tokensrT   <   s‚  € Ü˜Ÿ
™
 ?°BÓ7Ò=¸2Ó>×DÑDÓF€MÙÜÐ<¼V¸HÐEÐGcÓdÐdð]Ü—:‘:Ü Ô*<Ø /À-Ô^rÑsØ#ô
ˆð ×Ñ˜sÒ"Ø�}‰}×"Ñ"Ó$ˆÜØ)¬&¨Ð2Éd¸ÀDÀ6Ð6JÑ[Ð]ró
ð 	
ØXZÑ[Ð]ró
ð 	
ðrØ—-‘-“/ˆô �gœtÔ$¬C°·±¸NÈBÓ0OÒ0UÐSUÓ,V×,\Ñ,\Ô,^ÜÐKÐMlÓmÐmð)Ü  §¡¨\Ó!:Ó;Ðô
 ˜GŸK™K¨¸Ó;ÒA¸rÓB×HÑHÓJÜ˜WŸ[™[¨¸-ÓHÒYÈMÓZ×`Ñ`ÓbÜ˜'Ÿ+™+ l°F·J±J¸|ÈXÓ4VÓWÒcÐ[cÓd×jÑjÓlÒxÐpxÜ˜GŸK™K¨¸¿
¹
À>ÐScÓ8dÓeÒyÐiyÓz÷  Añ  Aó  CÜœ4Ÿ9™9›;¨Ñ-Ó.´°QÐ8JÓ1KÈdÑ1RÑRñ€Iô ˜)Ô$ØÐøô= ò ]ÜÐ5°c°UÐ;Ð=RÓSÐY\Ð\ûð]ûô ò rÜÐDÀSÀEÐJÐLgÓhÐnqÐqûðrûô ò )Ø(Óð)úsB   Á)I Â;I# ÄJ É	I ÉIÉI É#	JÉ,I<É<JÊJÊJc                óÌ   — ddl m}m}m}m}  |«       5   |«       }| j                  d«      rdt        | d   «      ini } ||d|«        ||«       ddd«       y# 1 sw Y   yxY w)z`Set active_provider to qwen-oauth with a minimal state entry (tokens stay in the Qwen CLI file).r   )Ú_auth_store_lockÚ_load_auth_storeÚ_save_auth_storeÚ_save_provider_stateÚbase_urlú
qwen-oauthN)r   rV   rW   rX   rY   rH   rG   )ÚcredsrV   rW   rX   rY   Ú
auth_storeÚstates          r   Ú_mark_qwen_oauth_activer_   h   sb   € çjÓjÙ	Ó	ñ %Ù%Ó'ˆ
ØHMÏ	É	ÐR\ÔH] ¬S°°zÑ1BÓ-CÑ DÐceˆÙ˜Z¨°uÔ=Ù˜Ô$÷	%÷ %ñ %ús   ”=AÁA#FT)Úforce_refreshÚrefresh_if_expiringÚrefresh_skew_secondsc           	     óÐ  — ddl m}m} t        «       }t	        | «      }|s|rt        |j                  d«      |«      }|r ||«      }t        |j                  dd«      xs d«      j                  «       }|st        dt        › �d«      ‚dt        j                  d	d«      j                  «       j                  d
«      xs t        |d|j                  d«      t         |«       «      dœS )Nr   )r   rT   rF   r?   r7   z!Qwen OAuth access token missing. Úqwen_access_token_missingr[   ÚHERMES_QWEN_BASE_URLú/zqwen-cli)ÚproviderrZ   Úapi_keyÚsourceÚexpires_at_msÚ	auth_file)r   r   rT   r&   Úboolr4   rH   rG   rI   r   rJ   ÚosÚgetenvÚrstripr   )r`   ra   rb   r   rT   r*   Úshould_refreshr?   s           r   Ú resolve_qwen_runtime_credentialsrq   r   sÔ   € ÷ NÜ"Ó$€FÜ˜-Ó(€NÙÑ1Ü7¸¿
¹
À=Ó8QÐSgÓhˆÙÙ)¨&Ó1ˆÜ�v—z‘z .°"Ó5Ò;¸Ó<×BÑBÓD€LÙÜÐ;¼F¸8ÐDÐFaÓbÐbð !Ü—I‘IÐ4°bÓ9×?Ñ?ÓA×HÑHÈÓMÒfÔQfØ¨:ÈÏ
É
ÐS`ÓHaÜÑ,Ó.Ó/ñ	ð r   c                 ó  — ddl m} m}  | «       }	  |d¬«      }dt        |«      |j	                  d«      |j	                  d«      |j	                  d«      dœS # t
        $ r"}d	t        |«      t        |«      d
œcY d }~S d }~ww xY w)Nr   )r   rq   T)ra   ri   rh   rj   )Ú	logged_inrk   ri   rh   rj   F)rs   rk   Úerror)r   r   rq   rG   rH   r   )r   rq   r#   r\   r%   s        r   Úget_qwen_auth_statusru   ‰   s|   € ßUÙ#Ó%€IðTá0ÀTÔJˆà¬C°	«NÀeÇiÁiÐPXÓFYØ—y‘y Ó+¸e¿i¹iÈÓ>Xñ
ð 	
øô ò TØ"´°Y³Ì#ÈcË(ÑSÕSûðTús   ‘AA Á	BÁ!A>Á8BÁ>B)Úreturnr   )rv   úDict[str, Any])r*   rw   rv   r   )r1   r   r2   r.   rv   rl   )g      4@)r*   rw   rN   Úfloatrv   rw   )r\   rw   rv   ÚNone)r`   rl   ra   rl   rb   r.   rv   rw   ) Ú__doc__Ú
__future__r   Úloggingr   rm   r/   Úpathlibr   Útypingr   r   Úhermes_cli.auth_constantsr   r   r	   r
   r   r   r   r   Ú	getLoggerÚloggerrJ   r   r&   r+   r4   rT   r_   rq   ru   r   r   r   ú<module>r‚      s¨   ðñõ #ã Û Û 	Û Ý ß ÷÷ ó ð
 
ˆ×	Ñ	Ð,Ó	-€à	)€ó6óó ð Msô Iô)óX%ð #ÀØ FñØðØ9=ðàðð óô.Tr   