§
    øžyjž  ã                  ó   — U d Z ddlm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
mZmZmZmZmZ  ej        e¦  «        ZdZdZ ej        ¦   «         Z ej        ¦   «         Zdaded	<   d&d„Zd'd„Zd(d„Ze
ddœd)d„Zd*d „Zeee
dd!œd+d"„Z d,d-d%„Z!dS ).z9Background keepalive for long-lived Nous Portal sessions.é    )ÚannotationsN)ÚOptional)Ú!ACCESS_TOKEN_REFRESH_SKEW_SECONDSÚNOUS_INVOKE_JWT_MIN_TTL_SECONDSÚ	AuthErrorÚ_agent_key_is_usableÚ_is_expiringÚget_provider_auth_stateÚ resolve_nous_runtime_credentialsi`T  é<   úOptional[threading.Thread]Ú_keepalive_threadÚvalueúOptional[float]ÚreturnÚfloatc                óš   — | �t          | ¦  «        S 	 t          t          j        dd¦  «        ¦  «        S # t          t          f$ r Y dS w xY w)NÚHERMES_NOUS_TIMEOUT_SECONDSÚ15g      .@)r   ÚosÚgetenvÚ	TypeErrorÚ
ValueError)r   s    úD/home/ragecks/.hermes/hermes-agent/hermes_cli/nous_auth_keepalive.pyÚ_timeout_secondsr      s[   € ØÐÝ�U‰|Œ|ÐðÝ•R”YÐ<¸dÑCÔCÑDÔDÐDøÝ•zÐ"ð ð ð Øˆtˆtðøøøs   “!5 µA
Á	A
ÚentryÚobjectÚdictc                óh   — t          | dd ¦  «        t          | dd ¦  «        t          | dd ¦  «        dœS )NÚ	agent_keyÚagent_key_expires_atÚscope)r    r!   r"   )Úgetattr)r   s    r   Ú_entry_stater$   '   s?   € å˜U K°Ñ6Ô6Ý '¨Ð/EÀtÑ LÔ LÝ˜ ¨Ñ.Ô.ðð ð ó    Úmin_key_ttl_secondsÚintúOptional[bool]c                óN  — 	 ddl m}  |d¦  «        }n3# t          $ r&}t                               d|¦  «         Y d}~dS d}~ww xY w|r|                     ¦   «         sdS 	 |                     ¦   «         }n3# t          $ r&}t                               d|¦  «         Y d}~dS d}~ww xY w|€dS t          t          |dd¦  «        t          ¦  «        }t          t          |¦  «        | ¦  «        }|s|s4|                     ¦   «         }|€dS t                               d	¦  «         d
S d
S )zãRefresh the current Nous credential pool entry when it is stale.

    Returns True when a pool entry exists and is usable/refreshed, False when a
    pool exists but no entry can be used, and None when no Nous pool exists.
    r   )Ú	load_poolÚnousz4Nous auth keepalive: credential pool unavailable: %sNz9Nous auth keepalive: credential pool selection failed: %sFÚ
expires_atz4Nous auth keepalive: refreshed credential pool entryT)Úagent.credential_poolr*   Ú	ExceptionÚloggerÚdebugÚhas_credentialsÚselectr	   r#   r   r   r$   Útry_refresh_current)r&   r*   ÚpoolÚexcr   Úaccess_expiringÚ
key_usableÚ	refresheds           r   Ú_refresh_selected_pool_entryr9   /   sr  € ðØ3Ð3Ð3Ð3Ð3Ð3àˆy˜Ñ Ô ˆˆøÝð ð ð Ý�ŠÐKÈSÑQÔQÐQØˆtˆtˆtˆtˆtøøøøðøøøð ð �t×+Ò+Ñ-Ô-ð ØˆtðØ—’‘”ˆˆøÝð ð ð Ý�ŠÐPÐRUÑVÔVÐVØˆuˆuˆuˆuˆuøøøøðøøøð €}Øˆuå"Ý��| TÑ*Ô*Ý)ñô €Oõ &¥l°5Ñ&9Ô&9Ð;NÑOÔO€JØð ˜jð Ø×,Ò,Ñ.Ô.ˆ	ØÐØ�5Ý�ŠÐKÑLÔLÐLØˆtàˆ4s*   ‚ ”
Až?¿AÁ A5 Á5
B%Á?B Â B%©r&   Útimeout_secondsr;   Úboolc                ó  — t          dt          | ¦  «        ¦  «        } t          | ¬¦  «        }|�|S t          d¦  «        }|sdS 	 t	          t          |¦  «        ¬¦  «         t                               d¦  «         dS # t          $ rI}|j	        rt           
                    d	|¦  «         nt                               d
|¦  «         Y d}~dS d}~wt          $ r&}t                               d
|¦  «         Y d}~dS d}~ww xY w)z5Refresh Nous auth once if credentials are configured.r   )r&   Nr+   F)r;   z3Nous auth keepalive: refreshed singleton auth stateTz)Nous auth keepalive requires re-login: %szNous auth keepalive failed: %s)Úmaxr'   r9   r
   r   r   r/   r0   r   Úrelogin_requiredÚinfor.   )r&   r;   Úpool_resultÚstater5   s        r   Ú refresh_nous_auth_keepalive_oncerC   [   s:  € õ ˜b¥#Ð&9Ñ":Ô":Ñ;Ô;Ðå.Ø/ðñ ô €Kð ÐØÐå# FÑ+Ô+€EØð ØˆuðÝ(Ý,¨_Ñ=Ô=ð	
ñ 	
ô 	
ð 	
õ 	�ŠÐJÑKÔKÐKØˆtøÝð ð ð ØÔð 	@Ý�KŠKÐCÀSÑIÔIÐIÐIå�LŠLÐ9¸3Ñ?Ô?Ð?ØˆuˆuˆuˆuˆuøøøøÝð ð ð Ý�ŠÐ5°sÑ;Ô;Ð;Øˆuˆuˆuˆuˆuøøøøðøøøs$   Á7A? Á?
D Â	>CÃD ÃC;Ã;D Ú
stop_eventúthreading.EventÚinterval_secondsÚinitial_delay_secondsÚNonec               óà   — |dk    r|                       |¦  «        rd S |                      ¦   «         s<t          ||¬¦  «         |                       |¦  «         |                      ¦   «         ¯:d S d S )Nr   r:   )ÚwaitÚis_setrC   )rD   rF   rG   r&   r;   s        r   Ú_keepalive_looprL   ~   s–   € ð ˜qÒ Ð  Z§_¢_Ð5JÑ%KÔ%KÐ Øˆà×ÒÑ!Ô!ð *Ý(Ø 3Ø+ð	
ñ 	
ô 	
ð 	
ð 	�ŠÐ(Ñ)Ô)Ð)ð ×ÒÑ!Ô!ð *ð *ð *ð *ð *r%   ©rF   rG   r&   r;   c                ó8  — | dk    rdS t           5  t          �,t                               ¦   «         rt          cddd¦  «         S t                               ¦   «          t          j        t          t          ft          | ¦  «        t          dt          |¦  «        ¦  «        t          dt          |¦  «        ¦  «        |dœdd¬¦  «        at           
                    ¦   «          t                               d¦  «         t          cddd¦  «         S # 1 swxY w Y   dS )	z2Start the process-wide Nous auth keepalive thread.r   Nr   rM   Tznous-auth-keepalive)ÚtargetÚargsÚkwargsÚdaemonÚnamezNous auth keepalive started)Ú_keepalive_lockr   Úis_aliveÚ_keepalive_stopÚclearÚ	threadingÚThreadrL   r'   r>   Ústartr/   r0   rM   s       r   Ústart_nous_auth_keepaliver[   ‘   so  € ð ˜1ÒÐØˆtõ 
ð !ð !ÝÐ(Õ->×-GÒ-GÑ-IÔ-IÐ(Ý$ð!ð !ð !ð !ñ !ô !ð !ð !õ 	×ÒÑÔÐÝ%Ô,Ý"Ý!Ð#å$'Ð(8Ñ$9Ô$9Ý),¨QµÐ4IÑ0JÔ0JÑ)KÔ)KÝ'*¨2­sÐ3FÑ/GÔ/GÑ'HÔ'HØ#2ð	ð ð Ø&ð
ñ 
ô 
Ðõ 	×ÒÑ!Ô!Ð!Ý�ŠÐ2Ñ3Ô3Ð3Ý ð'!ð !ð !ð !ñ !ô !ð !ð !ð !ð !ð !ð !øøøð !ð !ð !ð !ð !ð !s   �'DÁB>DÄDÄDç      @Útimeoutc                ó2  — t           5  t          }t                               ¦   «          ddd¦  «         n# 1 swxY w Y   |�*|                     ¦   «         r|                     | ¬¦  «         t           5  t          |u rdaddd¦  «         dS # 1 swxY w Y   dS )z@Stop the keepalive thread. Intended for graceful shutdown/tests.N)r]   )rT   r   rV   ÚsetrU   Újoin)r]   Úthreads     r   Ústop_nous_auth_keepaliverb   ³   s  € õ 
ð ð Ý"ˆÝ×ÒÑÔÐðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð Ð˜fŸošoÑ/Ô/ÐØ�Š˜GˆÑ$Ô$Ð$Ý	ð %ð %Ý Ð&Ð&Ø $Ðð%ð %ð %ñ %ô %ð %ð %ð %ð %ð %ð %ð %øøøð %ð %ð %ð %ð %ð %s   ˆ!5µ9¼9Á3BÂBÂB)r   r   r   r   )r   r   r   r   )r&   r'   r   r(   )r&   r'   r;   r   r   r<   )rD   rE   rF   r'   rG   r'   r&   r'   r;   r   r   rH   )
rF   r'   rG   r'   r&   r'   r;   r   r   r   )r\   )r]   r   r   rH   )"Ú__doc__Ú
__future__r   Úloggingr   rX   Útypingr   Úhermes_cli.authr   r   r   r   r	   r
   r   Ú	getLoggerÚ__name__r/   Ú$NOUS_AUTH_KEEPALIVE_INTERVAL_SECONDSÚ)NOUS_AUTH_KEEPALIVE_INITIAL_DELAY_SECONDSÚLockrT   ÚEventrV   r   Ú__annotations__r   r$   r9   rC   rL   r[   rb   © r%   r   ú<module>rp      sÃ  ðØ ?Ð ?Ð ?à "Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 
ˆÔ	˜8Ñ	$Ô	$€à'2Ð $Ø,.Ð )à �)”.Ñ"Ô"€Ø!�)”/Ñ#Ô#€Ø04Ð Ð 4Ð 4Ð 4Ñ 4ðð ð ð ðð ð ð ð)ð )ð )ð )ð\  ?Ø'+ð ð  ð  ð  ð  ð  ðF*ð *ð *ð *ð* AØ!JØ>Ø'+ð!ð !ð !ð !ð !ð !ðD
%ð 
%ð 
%ð 
%ð 
%ð 
%ð 
%r%   