+
    jHàj¿  ã                  ó  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RI	H
t
Ht ^ RIHtHtHtHtHtHtHtHt ]P*                  ! R4      tRtR R	 ltR
 R ltR R lt]3R R lltRR R lltR R ltRRRRR]/R R lltR R ltR# )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               ó   € V ^8„  d   QhRR/# )é   Úreturnr   © )Úformats   "Ú9/home/ubuntu/.hermes/hermes-agent/hermes_cli/auth_qwen.pyÚ__annotate__r      s   € ÷ 6ñ 6˜Tñ 6ó    c                 óH   € \         P                  ! 4       R ,          R,          # )z.qwenzoauth_creds.json)r   Úhomer   r   r   Ú_qwen_cli_auth_pathr      s   € Ü�9Š9‹;˜Õ Ð#5Õ5Ð5r   c               ó   € V ^8„  d   QhRR/# ©r   r   údict[str, Any]r   )r   s   "r   r   r      s   € ÷ ñ ˜~ñ r   c                 óJ  € ^ RI Hp  V ! 4       pVP                  4       '       g   \        RR4      h \        P
                  ! VP                  RR7      4      p\        T\        4      '       g   \        R
T R2R4      hT#   \         d   p\        RT RT 2R4      ThR	p?ii ; i)é    )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_failedNz 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   ±&A? Á?B"Â
BÂB"c               ó    € V ^8„  d   QhRRRR/# )r   Útokensr   r   r   r   )r   s   "r   r   r   -   s   € ÷ ñ  .ð °Tñ r   c                ó8   € ^ RI HpHp V! 4       pV! W0RR7       V# )r   )r   Ú_save_private_jsonT)Ú	sort_keys)r#   r   r2   )r0   r   r2   r+   s   &   r   Ú_save_qwen_cli_tokensr4   -   s   € ßGÙ#Ó%€IÙ�y°DÕ9ØÐr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úexpiry_date_msr   Úskew_secondsÚintr   Úboolr   )r   s   "r   r   r   4   s'   € ÷ Iñ I°3ð IÀcð IÐw{ñ Ir   c                ó°   €  \        V 4      p\        P                  ! 4       \        ^ \        T4      4      ,           R,          T8¬  #   \         d     R # i ; i)Téè  )r8   r(   ÚtimeÚmax)r6   r7   Ú	expiry_mss   && r   Ú_qwen_access_token_is_expiringr?   4   sN   € ðÜ˜Ó'ˆ	ô �IŠI‹Kœ#˜a¤ \Ó!2Ó3Õ3°tÕ;¸yÑHÐHøô ô Úðús   ‚A ÁAÁAc               ó$   € V ^8„  d   QhRRRRRR/# )r   r0   r   Útimeout_secondsÚfloatr   r   )r   s   "r   r   r   <   s"   € ÷ )ñ ) ^ð )Àeð )ÐWeñ )r   c                óø  € \        V P                  R R4      ;'       g    R4      P                  4       pV'       g   \        R\         2R4      h \
        P                  ! \        \        RR R VR\        /VR7      pTP                  R
8¼  dM   TP                  P                  4       p\        R\         2T'       d   RT 2,           R4      hR,           R4      h TP                  4       p\        T\        4      '       d:   \        TP                  RR4      ;'       g    R4      P                  4       '       g   \        RR4      h \!        TP                  R4      4      pR\        TP                  RR4      ;'       g    R4      P                  4       R \        TP                  R T4      ;'       g    T4      P                  4       R\        TP                  RT P                  RR4      4      ;'       g    R4      P                  4       ;'       g    RR\        TP                  RT P                  RR4      4      ;'       g    R4      P                  4       R\!        \"        P"                  ! 4       R,          4      \%        ^T4      R,          ,           /p\'        T4       T#   \         d   p\        RT 2R4      ThR	p?ii ; i  \         d   p\        RT 2R4      ThR	p?ii ; i  \         d    Rp EL˜i ; i)Úrefresh_tokenÚ z"Qwen OAuth refresh token missing. Úqwen_refresh_token_missingÚ
grant_typeÚ	client_id)Úheadersr,   ÚtimeoutzQwen OAuth refresh failed: Úqwen_refresh_failedNi�  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_inÚ
token_typeÚBearerÚresource_urlzportal.qwen.aiÚexpiry_dater;   i`T  )ÚstrÚgetÚstripr   Ú_RERUNr   Úpostr
   r   r	   r(   Ústatus_codeÚtextr%   r)   r*   r8   r<   r=   r4   )	r0   rA   rD   Úresponser-   ÚbodyÚpayloadÚexpires_in_secondsÚ	refresheds	   &&       r   Ú_refresh_qwen_cli_tokensr`   <   s®  € Ü˜Ÿ
™
 ?°BÓ7×=Ð=¸2Ó>×DÑDÓF€MßÜÐ<¼V¸HÐEÐGcÓdÐdð]Ü—:’:Ü Ô*<Ø °À-ÐQ\Ô^rÐsØ#ô
ˆð ×Ñ˜sÔ"Ø�}‰}×"Ñ"Ó$ˆÜØ)¬&¨Ð2Ïd¸ÀDÀ6Ð6JÕ[Ð]ró
ð 	
ØXZÕ[Ð]ró
ð 	
ðrØ—-‘-“/ˆô �gœt×$Ò$¬C°·±¸NÈBÓ0O×0UÐ0UÐSUÓ,V×,\Ñ,\×,^Ò,^ÜÐKÐMlÓmÐmð)Ü  §¡¨\Ó!:Ó;Ðð
 	œ˜GŸK™K¨¸Ó;×AÐA¸rÓB×HÑHÓJØœ˜WŸ[™[¨¸-ÓH×YÐYÈMÓZ×`Ñ`ÓbØ”c˜'Ÿ+™+ l°F·J±J¸|ÈXÓ4VÓW×cÐcÐ[cÓd×jÑjÓl×xÐxÐpxØœ˜GŸK™K¨¸¿
¹
À>ÐScÓ8dÓe×yÐyÐiyÓz÷  Añ  Aó  CØ”sœ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   Á,J" ÃK ÅK( Ê"KÊ-J=Ê=KËK%ËK Ë K%Ë(K9Ë8K9c               ó    € V ^8„  d   QhRRRR/# )r   Úcredsr   r   ÚNoner   )r   s   "r   r   r   h   s   € ÷ %ñ % >ð %°dñ %r   c                ó  € ^ RI HpHpHpHp V! 4       ;_uu_ 4        V! 4       pV P                  R4      '       d   R\        V R,          4      /M/ pV! VRV4       V! V4       RRR4       R#   + '       g   i     R# ; i)z`Set active_provider to qwen-oauth with a minimal state entry (tokens stay in the Qwen CLI file).)Ú_auth_store_lockÚ_load_auth_storeÚ_save_auth_storeÚ_save_provider_stateÚbase_urlú
qwen-oauthN)r#   re   rf   rg   rh   rU   rT   )rb   re   rf   rg   rh   Ú
auth_storeÚstates   &      r   Ú_mark_qwen_oauth_activerm   h   sb   € çjÓjÙ	×	Õ	Ù%Ó'ˆ
ØHMÏ	É	ÐR\×H]ÒH] ¬S°°zÕ1BÓ-CÑ DÐceˆÙ˜Z¨°uÔ=Ù˜Ô$÷	 
×	×	Ò	ús   œAA-Á-A>	Úforce_refreshFÚrefresh_if_expiringTÚrefresh_skew_secondsc               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rn   r9   ro   rp   r8   r   r   r   )r   s   "r   r   r   r   s.   € ÷ ñ ØðØ9=ðàðð ñr   c                ó$  € ^ RI HpHp \        4       p\	        V 4      pV'       g$   V'       d   \        VP                  R4      V4      pV'       d	   V! V4      p\        VP                  RR4      ;'       g    R4      P                  4       pV'       g   \        R\         2R4      hRRR	\        P                  ! R
R4      P                  4       P                  R4      ;'       g    \        RVRRRVP                  R4      R\        V! 4       4      /# )r   )r   r`   rS   rM   rE   z!Qwen OAuth access token missing. Úqwen_access_token_missingÚproviderrj   ri   ÚHERMES_QWEN_BASE_URLÚ/Úapi_keyÚsourcezqwen-cliÚexpires_at_msÚ	auth_file)r#   r   r`   r.   r9   r?   rU   rT   rV   r   rW   ÚosÚgetenvÚrstripr   )rn   ro   rp   r   r`   r0   Úshould_refreshrM   s   $$$     r   Ú resolve_qwen_runtime_credentialsr   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ð 	�LØ”B—I’IÐ4°bÓ9×?Ñ?ÓA×HÑHÈÓM×fÐfÔQfØ�< ¨:°ÈÏ
É
ÐS`ÓHaØ”SÑ,Ó.Ó/ð	ð r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   ‰   s   € ÷ Tñ T˜nñ Tr   c                 ó  € ^ RI Hp Hp V ! 4       p V! RR7      pRRR\        V4      RVP	                  R4      RVP	                  R4      RVP	                  R4      /#   \
         d%   pRR	R\        T4      R
\        T4      /u Rp?# Rp?ii ; i)r   )r   r   T)ro   Ú	logged_inrz   rx   rw   ry   FÚerrorN)r#   r   r   rT   rU   r   )r   r   r+   rb   r-   s        r   Úget_qwen_auth_statusr„   ‰   sŒ   € ßUÙ#Ó%€IðTá0ÀTÔJˆà˜˜{¬C°	«N¸HÀeÇiÁiÐPXÓFYØ�u—y‘y Ó+¨_¸e¿i¹iÈÓ>Xð
ð 	
øô ô TØ˜U K´°Y³ÀÌ#ÈcË(ÐSÕSûðTús   ‘A
A ÁBÁ'BÂ BÂB)g      4@) Ú__doc__Ú
__future__r   Úloggingr%   r{   r<   Úpathlibr   Útypingr   r   Úhermes_cli.auth_constantsr   r   r   r	   r
   r   r   r   Ú	getLoggerÚloggerrW   r   r.   r4   r?   r`   rm   r   r„   r   r   r   Ú<module>r�      s’   ðñõ #ã Û Û 	Û Ý ß ÷÷ ó ð
 
×	Ò	Ð,Ó	-€à	)€õ6õõ ð Ms÷ I÷)õX%ðØ"ðØ@Dðà F÷÷.Tr   