+
    D#j1                      a  0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t^ RIt^ RIt^ RIHt ^ RIHt ^ RIHtHt RtR]R&   R	tR]R
&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   ] R] 2tR]R&   ^tR]R&    ! R R]4      t  ! R R] 4      t! ! R R] 4      t"]! RR 7       ! R! R"4      4       t# ! R# R$4      t$ ! R% R&4      t%R'RR(R/R) R* llt&R1R+ R, llt'R2R- R. llt(R/ R0 lt)R# )3a  Grok OAuth helpers for systray-ai.

HARD RULES:
- Never call the token endpoint unless access JWT is expired (or GET returns 401).
- On refresh, write tokens only into the single account auth.json under flock.
- Dual refresh of the same refresh token across homes revokes the session.
)annotationsN)	dataclass)Path)AnyFinalz*https://cli-chat-proxy.grok.com/v1/billingz
Final[str]BILLING_URLz'https://cli-chat-proxy.grok.com/v1/userUSER_URLzhttps://auth.x.ai/oauth2/token	TOKEN_URLz$https://auth.x.ai/oauth2/device/codeDEVICE_CODE_URLz$b1a00492-073a-47ea-816f-4c329264a828	CLIENT_IDzhttps://auth.x.aiISSUERz.openid profile email offline_access api:accessSCOPESz::	AUTH_SLOTz
Final[int]EXPIRY_SKEW_SECSc                      ] tR t^$tRtR# )GrokOAuthError N__name__
__module____qualname____firstlineno____static_attributes__r       [/home/user/overdeck-private-tests/subrouter-s5-systray-latest/modules/systray/grok_oauth.pyr   r   $       r   r   c                      ] tR t^(tRtR# )GrokOAuthAuthErrorr   Nr   r   r   r   r   r   (   r   r   r   c                      ] tR t^,tRtR# )GrokOAuthTransportErrorr   Nr   r   r   r   r   r   ,   r   r   r   T)frozenc                  J    ] tR t^0t$ R]R&   R]R&   R]R&   R]R&   R]R&   R	tR
# )
GrokTokensstraccessrefreshz
str | Noneexpires_at_isodict[str, Any]entryslotr   N)r   r   r   r   __annotations__r   r   r   r   r"   r"   0   s    KL
Ir   r"   c                      ] tR t^9tRR R lltRR/R R lltRR/R R lltRR/R	 R
 lltR R ltR R lt	R R lt
R R ltR R ltR R ltR R ltR tRtR# )GrokOAuthSessionc               $    V ^8  d   QhRRRRRR/# )   	auth_pathz
Path | strtimeout_secsfloatreturnNoner   )formats   "r   __annotate__GrokOAuthSession.__annotate__:   s!     * ** *E *T *r   c                	2    \        V4      V n        W n        R # N)r   r/   _timeout_secs)selfr/   r0   s   &&&r   __init__GrokOAuthSession.__init__:   s    i)r   allow_refreshTc                    V ^8  d   QhRRRR/# r.   r=   boolr2   r'   r   )r4   s   "r   r5   r6   >   s     O OD ON Or   c               	0    V P                  \        VR 7      # )r=   )_authorized_jsonr   r:   r=   s   &$r   get_billingGrokOAuthSession.get_billing>   s    $$[$NNr   c                    V ^8  d   QhRRRR/# r?   r   )r4   s   "r   r5   r6   A   s     L L L Lr   c               	0    V P                  \        VR 7      # rB   )rC   r   rD   s   &$r   get_userGrokOAuthSession.get_userA   s    $$X]$KKr   c               $    V ^8  d   QhRRRRRR/# )r.   urlr#   r=   r@   r2   r'   r   )r4   s   "r   r5   r6   D   s!     6 6C 64 6> 6r   c               	    V P                  4       p V P                  WP                  4      #   \         d;    T'       g   h T P	                  TR R7      pT P                  YP                  4      u # i ; i)T)force)_load_tokens	_get_jsonr$   r   _refresh_if_needed)r:   rL   r=   tokenss   &&$ r   rC   !GrokOAuthSession._authorized_jsonD   se    ""$	6>>#}}55! 	6 ,,V4,@F>>#}}55		6s   - A2 /A21A2c               $    V ^8  d   QhRRRRRR/# )r.   rL   r#   r$   r2   r'   r   )r4   s   "r   r5   r6   N   s!      S # . r   c           
     	J   \         P                  P                  VR RV 2RRRR/RR7      p \         P                  P                  W0P                  R7      ;_uu_ 4       p\
        P                  ! VP                  4       P                  R	4      4      pR
R
R
4       \#        X\$        4      '       g   \        RT R24      hT#   + '       g   i     L7; i  \         P                  P                   dz   pTP                  4       P                  R	RR7      pTP                  R9   d   \        RT RTP                   24      Th\        RT RTP                   RTR,           24      ThR
p?i\        \        \
        P                   3 d   p\        RT RT 24      ThR
p?ii ; i)AuthorizationzBearer Acceptzapplication/jsonz
User-Agentzsystray-ai-grokGET)headersmethodtimeoututf-8NreplaceerrorszGrok auth rejected for : z	Grok GET z	 failed:  N   Nz returned non-object)i  i  )urllibrequestRequesturlopenr9   jsonloadsreaddecodeerror	HTTPErrorcoder   r   OSErrorTimeoutErrorJSONDecodeError
isinstancedict)r:   rL   r$   rf   responsepayloadexcbodys   &&&     r   rP   GrokOAuthSession._get_jsonN   s}   ..((76(!3,/
  ) 
		T''9K9K'LLPX**X]]_%;%;G%DE M '4(()IcU:N*OPP ML||%% 	f88:$$WY$?Dxx:%(+B3%r#(()TU[^^)IcU)CHH:QtTXzl*[\beet';';< 	T)IcU)C5*IJPSS	TsH   2C 4CC C	C C F"4A4E((!F"
F"FF"c                   V ^8  d   QhRR/# )r.   r2   r"   r   )r4   s   "r   r5   r6   f   s     J Jj Jr   c           
     	    \         P                  ! V P                  P                  R R7      4      p\        T\        4      '       g   \        RT P                   24      hTP                  4        EF%  w  r4\        T\        4      '       g   K  \        TP                  R4      ;'       g    TP                  R4      ;'       g    R4      P                  4       p\        TP                  R	4      ;'       g    R4      P                  4       pT'       d	   T'       g   K  R
\        T4      9  d   TP                  R4      '       g   K  \        TT\        TP                  R4      \        4      '       d   \        TR,          4      MRT\        T4      R7      u # 	  \        RT P                   24      h  \        \         P
                  3 d"   p\        RT P                   RT 24      ThRp?ii ; i)r]   encodingzcannot read ra   Nzinvalid auth payload in keyaccess_token refresh_tokenz	auth.x.aioidc_client_id
expires_at)r$   r%   r&   r(   r)   zno Grok OAuth tokens in )ri   rj   r/   	read_textrp   rr   r   rs   rt   itemsr#   getstripr"   )r:   rv   rw   r)   r(   r$   r%   s   &      r   rO   GrokOAuthSession._load_tokensf   s   	Rjj!9!97!9!KLG '4(( #;DNN;K!LMM"==?KDeT**5)LLUYY~-FLL"MSSUF%))O4::;AACG#d)+EII>N4O4O;EeiiP\F]_b;c;cs5#67imY  +  77GHII+ --. 	R </?r#!GHcQ	Rs   0F2 2G.G))G.c                    V ^8  d   QhRRRR/# )r.   r$   r#   r2   r@   r   )r4   s   "r   r5   r6      s      c d r   c                	     \        V4      pVP                  R 4      p\        V\        \        34      '       g   R# \	        V4      \
        P
                  ! 4       \        ,           8*  #   \         d     R# i ; i)expF)_decode_jwt_payloadr   rs   intr1   timer   	Exception)r:   r$   claimsr   s   &&  r   _access_expired GrokOAuthSession._access_expired   s`    	(0F**U#CcC<00:/?!??? 		s   8A( +A( (A76A7c               $    V ^8  d   QhRRRRRR/# )r.   rR   r"   rN   r@   r2   r   )r4   s   "r   r5   r6      s!     ' ' 't '
 'r   c               	z   V'       g$   V P                  VP                  4      '       g   V# V P                  4       ;_uu_ 4        V P                  4       pV'       g.   V P                  VP                  4      '       g   VuuR R R 4       # VP                  VP                  8w  d.   V P                  VP                  4      '       g   VuuR R R 4       # V P                  VP                  4      pV P                  W44      pV P                  V4       V P                  4       uuR R R 4       #   + '       g   i     R # ; ir8   )r   r$   _adjacent_lockrO   r%   _refresh_tokens_merge_payload_atomic_write_payload)r:   rR   rN   latest	refreshednew_payloads   &&$   r   rQ   #GrokOAuthSession._refresh_if_needed   s    T11&--@@M  ""&&(F!5!5fmm!D!D #" ~~/8L8LV]]8[8[ #" ,,V^^<I--f@K&&{3$$& #"""s%   9D)>D)
;D)D)AD))D:	c                    V ^8  d   QhRRRR/# )r.   r   r#   r2   r'   r   )r4   s   "r   r5   r6      s      S ^ r   c                	v   \         P                  P                  R RRVR\        /4      P	                  R4      p\         P
                  P                  \        VRR/RR7      p \         P
                  P                  W0P                  R7      ;_uu_ 4       p\        P                  ! VP                  4       P                  R4      4      pR	R	R	4       \-        X\.        4      '       d   TP1                  R4      '       g   \!        R4      hT#   + '       g   i     LJ; i  \         P                  P                   dJ   pTP                  4       P                  RR
R7      p\!        RTP"                   RTR,           24      ThR	p?i\$        \&        \        P(                  3 d   p\+        RT 24      ThR	p?ii ; i)
grant_typer   	client_idr]   Content-Type!application/x-www-form-urlencodedPOSTdatarY   rZ   r[   Nr^   r_   zrefresh failed: rb   rc   zrefresh transport failed: r   z%refresh response missing access_token)re   parse	urlencoder   encoderf   rg   r	   rh   r9   ri   rj   rk   rl   rm   rn   r   ro   rp   rq   rr   r   rs   rt   r   )r:   r   rx   rf   ru   rv   rw   texts   &&      r   r    GrokOAuthSession._refresh_tokens   sp   ||%%oY
 &/ 	 ..((#%HI	 ) 
	W''9K9K'LLPX**X]]_%;%;G%DE M '4((N0K0K$%LMM ML||%% 	Z88:$$WY$?D$'7z4:,%OPVYYt';';< 	W),Fse*LMSVV	WsI   #2D 4D	D D	D D F8=AF!F8#F8$F33F8c               $    V ^8  d   QhRRRRRR/# )r.   r   r"   r   r'   r2   r   )r4   s   "r   r5   r6      s!      Z N ~ r   c           	     	    \         P                  ! V P                  P                  R R7      4      p\        V\        4      '       g   / p\        VP                  4      pVR,          VR&   VP                  R4      '       d   VR,          VR&   VP                  R4      p\        V\        \        34      '       dR   \        P                  ! R\        P                  ! \        P                  ! 4       \        V4      ,           4      4      VR&   VP                  RR	4       VP                  R
\         4       VP                  R\"        4       WCVP$                  &   V#   \        \         P
                  3 d    / p ELHi ; i)r]   r|   r   r~   r   
expires_in%Y-%m-%dT%H:%M:%SZr   	auth_modeoidcoidc_issuerr   )ri   rj   r/   r   rp   rr   rs   rt   r(   r   r   r1   r   strftimegmtime
setdefaultr   r   r)   )r:   r   r   rootr(   r   s   &&&   r   r   GrokOAuthSession._merge_payload   s+   	::dnn666HID $%%DV\\" 0e==))%.%?E/"]]<0
j3,//"&--$DIIK%
*;;<#E, 	f-/)95!V[[% --. 	D	s   0E E;:E;c                    V ^8  d   QhRRRR/# )r.   rv   r'   r2   r3   r   )r4   s   "r   r5   r6      s     . .^ . .r   c           	     	   V P                   P                  P                  R R R7       \        P                  ! RRV P                   P                  RR7      ;_uu_ 4       pVP                  \        P                  ! V^R7      R,           4       \        P                  ! VP                  4       R4       VP                  pR	R	R	4       \        P                  ! XV P                   4       R	#   + '       g   i     L3; i)
Tparentsexist_okwr]   Fr}   dirdeleteindent
  N)r/   parentmkdirtempfileNamedTemporaryFilewriteri   dumpsosfchmodfilenonamer^   )r:   rv   handle	temp_names   &&  r   r   &GrokOAuthSession._atomic_write_payload   s    ##D4#@((%%	
 

 LLGA6=>IIfmmou-I
 	

9dnn-
 
s   A C))C9	c                	J   V P                   P                  V P                   P                  R ,           4      pVP                  P	                  RRR7       VP                  RRR7      p\        P                  ! VP                  4       \        P                  4       \        V4      # )z.lockTr   za+r]   r|   )r/   with_suffixsuffixr   r   openfcntlflockr   LOCK_EX_LockHandle)r:   	lock_pathr   s   &  r   r   GrokOAuthSession._adjacent_lock   ss    NN..t~~/D/Dw/NO	td;w7FMMOU]]36""r   )r9   r/   N)g      $@)r   r   r   r   r;   rE   rI   rC   rP   rO   r   rQ   r   r   r   r   r   r   r   r   r,   r,   9   sX    *O4 OL L6$ 60J4'4..#r   r,   c                  :    ] tR t^tR R ltR R ltR R ltRtR# )	r   c                    V ^8  d   QhRRRR/# )r.   r   r   r2   r3   r   )r4   s   "r   r5   _LockHandle.__annotate__   s      s t r   c                	    Wn         R # r8   _handle)r:   r   s   &&r   r;   _LockHandle.__init__   s    r   c                   V ^8  d   QhRR/# )r.   r2   r   r   )r4   s   "r   r5   r      s      ; r   c                	    V # r8   r   )r:   s   &r   	__enter___LockHandle.__enter__   s    r   c                    V ^8  d   QhRRRR/# )r.   _argsobjectr2   r3   r   )r4   s   "r   r5   r      s     ! !v !$ !r   c                	     \         P                  ! V P                  P                  4       \         P                  4       V P                  P                  4        R #   T P                  P                  4        i ; ir8   )r   r   r   r   LOCK_UNclose)r:   r   s   &*r   __exit___LockHandle.__exit__   sG    	!KK++-u}}=LL DLL s   =A A7r   N)r   r   r   r   r;   r   r   r   r   r   r   r   r      s    ! !r   r   r   extrac               0    V ^8  d   QhRRRRRRRRRR	R
R/# )r.   pathr   r$   r#   r%   r   zfloat | Noner   zdict[str, Any] | Noner2   r3   r   )r4   s   "r   r5   r5      sF     #  # 
#  #  	# 
 #  !#  
# r   c          
        R VRVRRR\         R\        /pVeR   \        P                  ! R\        P                  ! \        P                  ! 4       \        V4      ,           4      4      VR&   V'       d$   VP                  4        F  w  rgVf   K  WuV&   K  	  \        V/pV P                  P                  R	R	R
7       \        P                  ! RRV P                  RR7      ;_uu_ 4       p	V	P                  \        P                  ! V^R7      R,           4       \        P                   ! V	P#                  4       R4       V	P$                  p
RRR4       \        P&                  ! X
V 4       R#   + '       g   i     L); i)r~   r   r   r   r   r   Nr   r   Tr   r   r]   Fr   r   r   r   )r   r   r   r   r   r1   r   r   r   r   r   r   r   ri   r   r   r   r   r   r^   )r   r$   r%   r   r   r(   r~   valuerv   r   r   s   &$$$$      r   write_auth_filer      s&    	vVv)E "mm KK		eJ&778
l ++-JC "c
 ( % GKKdT2		$	$KK	
 

 
TZZ2T9:
		&--/5)KK	
 JJy$
 
s   &A E''E7	c                    V ^8  d   QhRRRR/# )r.   r0   r1   r2   r'   r   )r4   s   "r   r5   r5     s      E ^ r   c                *   \         P                  P                  R \        R\        /4      P                  R4      p\         P                  P                  \        VRR/RR7      p\         P                  P                  W R7      ;_uu_ 4       p\        P                  ! VP                  4       P                  R4      4      pRRR4       \        X\        4      '       d   VP!                  R	4      '       g   \#        R
4      hV#   + '       g   i     LJ; i)r   scoper]   r   r   r   r   r[   Ndevice_codezdevice code start failed)re   r   r   r   r   r   rf   rg   r
   rh   ri   rj   rk   rl   rs   rt   r   r   )r0   rx   rf   ru   rv   s   &    r   start_device_coder     s    <<!!	i&1fWo 	 nn$$!DE	 % G 
				>	>(**X]]_33G<= 
?gt$$GKK,F,F788N	 
?	>s   4DD	c               $    V ^8  d   QhRRRRRR/# )r.   devicer'   r0   r1   r2   r   )r4   s   "r   r5   r5   #  s!     3 3^ 35 3^ 3r   c                   \        ^\        V P                  R4      ;'       g    ^4      4      p\        P                  ! 4       \	        \        V P                  R4      ;'       g    R4      V4      ,           p\        P                  ! 4       V8  d   \        P                  P                  RRRV R,          R\        /4      P                  R4      p\        P                  P                  \        VR	R
/RR7      p \        P                  P                  V^R7      ;_uu_ 4       p\        P                   ! VP#                  4       P%                  R4      4      uuRRR4       # \1        R4      h  + '       g   i     M; i  \        P&                  P(                   d   pTP#                  4       P%                  RRR7      p \        P                   ! T4      P                  RR4      p	M  \        P*                   d    Tp	 Mi ; iT	R9   d-   \        P,                  ! Y)R8X  d   ^M^,          4        Rp?EK  \/        RT	 24      ThRp?ii ; i\        P,                  ! T4       EK  )   intervalr   i  r   z,urn:ietf:params:oauth:grant-type:device_coder   r   r]   r   r   r   r   r[   Nr^   r_   rm   r   	slow_downzdevice poll failed: zdevice login timed out)authorization_pendingr   )maxr   r   r   minr1   re   r   r   r   r   rf   rg   r	   rh   ri   rj   rk   rl   rm   rn   rr   sleepr   r   )
r   r0   r   deadlinerx   rf   ru   rw   r   errs
   &&        r   poll_device_coder  #  s   1c&**Z055A67Hyy{Svzz,'?'G'G4!H,WWH
))+
 ||%%Lvm4Y
 &/ 	 ..((#%HI	 ) 
	L'''<<zz(--/"8"8"AB =< 1
22 =<||%% 		L88:$$WY$?Djj&**7B7'' <<

8;,>qAFG$';C5%ABK		L 	

8s`   :)E? #3E,
E? ,E<	7E? <E? ?I!I &G'&I'H>I H/I7IIc                    V ^8  d   QhRRRR/# )r.   r$   r#   r2   r'   r   )r4   s   "r   r5   r5   E  s     
 
 
 
r   c                h   V P                  R 4      p\        V4      ^8  d   \        R4      hV^,          pR\        V4      ) ^,          ,          p\        P                  ! W#,           4      p\
        P                  ! VP                  R4      4      p\        V\        4      '       g   \        R4      hV# ).z	not a jwt=r]   zjwt payload not object)
splitlen
ValueErrorbase64urlsafe_b64decoderi   rj   rl   rs   rt   )r$   partssegmentpaddingrawrv   s   &     r   r   r   E  s    LLE
5zA~%%AhGc'l]Q&'G

"
"7#4
5CjjG,-Ggt$$122Nr   )g      .@)g      @)*__conditional_annotations____doc__
__future__r   r  r   ri   r   r   r   urllib.errorre   urllib.parseurllib.requestdataclassesr   pathlibr   typingr   r   r   r*   r   r	   r
   r   r   r   r   r   RuntimeErrorr   r   r   r"   r,   r   r   r   r  r   )r  s   @r   <module>r     s    #    	      !   GZ F@* @8	: 8D D>	: >(
 (E
 E!("YK0	: 0! * !	\ 		 		n 	 $  b# b#J! !# 
  $#  $(# L"3D
r   