+
    (j                    
  a  0 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HtHtHt ^ RIHtHt ^ RIHtHt Rt^t]P,                  P/                  RR4      P1                  4       t]P,                  P/                  R	R
4      P1                  4       t]P,                  P/                  RR4      P1                  4       t]P,                  P/                  R]P,                  P/                  RR4      4      P1                  4       t]P,                  P/                  RR4      P1                  4       P;                  4       R9  t]P,                  P/                  RR4      P1                  4       P;                  4       R9  tR^R^R^R^R^R^/t RRRRRRRRRRRRRRR RR!R/	t!RR"RR#RR$RR%R^ /t"RR$/t#R&t$R#t%]PL                  ! 4       t'/ t(R'])R(&   ^ s*Rt+Rt,R) R* lt-R+ R, lt.R- R. lt/R/ R0 lt0RR1 R2 llt1R3 R4 lt2RR5 R6 llt3R7R/R8 R9 llt4R: R; lt5R< R= lt6R> R? lt7R@ RA lt8RB RC lt9RD RE lt:RFt;RGt<RHt=RI RJ lt>RK RL lt?RM RN lt@RO RP ltARQ RR ltBRS RT ltCRUtDRVtERWtFRX RY ltGRZ R[ ltHR\ R] ltIRR^ R_ lltJR` Ra ltKRb Rc ltLRdtMRetNRftORgtPRh Ri ltQRj Rk ltRRl Rm ltSRn Ro ltTRp Rq ltURr Rs ltVRt Ru ltWRv Rw ltXRx Ry ltYRz R{ ltZ][! ]P,                  P/                  R|R}4      4      t\][! ]P,                  P/                  R~]]! R4      4      4      t^][! ]P,                  P/                  RR4      4      t_]P,                  P/                  RR4      P1                  4       t`]PL                  ! 4       ta^ sbR])R&   ][! ]P,                  P/                  RR4      4      tc][! ]P,                  P/                  RR4      4      td][! ]P,                  P/                  RR4      4      te][! ]P,                  P/                  R]]! R4      4      4      tf][! ]P,                  P/                  RR4      4      tg]PL                  ! 4       th/ tiR])R&   R R ltjR R ltkRR R lltlRR R lltmRR R lltnR R ltoR R ltpR R ltqR R ltrR R ltsR R lttR R ltuRR R lltv]PL                  ! 4       tw]PL                  ! 4       txRsyR])R&   ^ szR])R&   RR R llt{R R lt| ! R R]4      t} ! R R]4      t~R R ltR R ltR t]R8X  d
   ]! 4        R# R# )    )annotationsN)quote	urlencodeurlparse)datetimetimezone)BaseHTTPRequestHandlerThreadingHTTPServeri  CODEXBAR_NTFY_TOPICcodingAgentWaitingOnYouCODEXBAR_USAGE_RESET_NTFY_TOPICcodexbarUsageResetsCODEXBAR_SSH_HOST CODEXBAR_SSH_USERUSERCODEXBAR_NOTIFY_DONE1CODEXBAR_QUESTION_HEURISTIC
needs_usererrordonerunningidleunknownSessionStart
PreToolUsePostToolUsePermissionRequestNotificationnotificationElicitationStopUserPromptSubmit
SessionEnd  i  i,  i  iX  dict[str, dict]_attention_recordsc                    V ^8  d   QhRRRR/#    text
str | Nonereturnbool )formats   "companion/server.py__annotate__r3   f   s     F F: F$ F    c                   a V '       g   R # \        V 4      P                  4       o\        ;QJ d#    V3R l\         4       F  '       g   K   R# 	  R # ! V3R l\         4       4      # )Fc              3  ,   <"   T F	  qS9   x  K  	  R # 5iNr0   .0phraselowereds   & r2   	<genexpr>+looks_like_auto_approval.<locals>.<genexpr>j   s     E/DV /D   T)strloweranyAUTO_APPROVAL_PHRASES)r,   r;   s   &@r2   looks_like_auto_approvalrC   f   sD    $iooG3E/DE33E3E3E/DEEEr4   c                    V ^8  d   QhRRRR/# )r+   valuer?   r.   r-   r0   )r1   s   "r2   r3   r3   m   s      s z r4   c                    T ;'       g    R P                  4       P                  4       pVR8X  d   R# VR8X  d   R# VR8X  d   R# R# )r   claudeClaudecodexCodexgeminiGeminiN)stripr@   )rE   vs   & r2   _normalize_providerrO   m   s@    	"##%AH}G|H}r4   c                    V ^8  d   QhRRRR/# )r+   cwdr?   r.   r0   )r1   s   "r2   r3   r3   x   s        r4   c                
   \         P                  P                  \         P                  P                  V 4      4      p\         P                  P	                  VP                  \         P                  4      4      pT;'       g    T# r7   )ospathabspath
expanduserbasenamerstripsep)rQ   rT   names   &  r2   _project_name_from_cwdr[   x   sP    77??277--c23D77DKK/0D<<4r4   c               (    V ^8  d   QhRRRRRRRR/# )r+   providerr?   
session_idrQ   r.   r0   )r1   s   "r2   r3   r3   ~   s(     3 3S 3c 3 3 3r4   c                *    T  R T;'       g    T R V 2# ):r0   )r]   r^   rQ   s   &&&r2   _attention_keyra   ~   s"    Zq**s+1SE22r4   c                    V ^8  d   QhRRRR/# )r+   now
int | Noner.   dictr0   )r1   s   "r2   r3   r3      s     	 	* 	 	r4   c                f    V f   \        \        P                  ! 4       4      MT pRRR^ RRR. RRRV/# )	Nstater   countprimary_projectr   projectsreason
updated_at)inttime)rc   tss   & r2   _empty_attentionrp      s@     [TYY[	cB2B"b r4   c                   V ^8  d   QhRR/# r+   r.   Noner0   )r1   s   "r2   r3   r3      s       r4   c                 d    \         ;_uu_ 4        R s^ sR R R 4       R #   + '       g   i     R # ; ir7   )_cache_lock_cached_response_cache_expires_atr0   r4   r2   _invalidate_usage_cacherx      s    	 
s   /	c                    V ^8  d   QhRRRR/# )r+   labelr?   r.   r-   r0   )r1   s   "r2   r3   r3      s     C CS Cz Cr4   c                \    \         '       d   \        '       g   R# RV  R\         R\          2# )z\Return an ntfy Actions header value that opens an SSH connection, or None if not configured.Nzview, z, ssh://@)NTFY_SSH_HOSTNTFY_SSH_USER)rz   s   &r2   _build_ssh_actionr      s'    =E7(=/=/BBr4   kindc          
     ,    V ^8  d   QhRRRRRRRRRR/# )r+   r]   r?   project_namerk   r   r.   rs   r0   )r1   s   "r2   r3   r3      s0     $9 $9s $9# $9s $9S $9dh $9r4   c                  a aaa \         '       g   R # R VVV V3R llp\        P                  ! VRR7      P                  4        R # )Nc                   V ^8  d   QhRR/# rr   r0   )r1   s   "r2   r3   &_send_ntfy_async.<locals>.__annotate__   s     6 6D 6r4   c                   <  SR 8X  d   S RS 2p RRRRRR/pM:S RS 2p S'       d   V R	S R
2,          p RRRRRR/p\        4       pV'       d   W!R&   \        P                  P                  R\	        \
        RR7       2V P                  4       VRR7      p\        P                  P                  V^R7      ;_uu_ 4         RRR4       R#   + '       g   i     R# ; i  \         d   p\        RT 24        Rp?R# Rp?ii ; i)r   z finished: TitlezAgent task completePrioritylowTagswhite_check_markz
 waiting: z ()zAgent waiting for youhighbellActionshttps://ntfy.sh/r   safePOSTdataheadersmethodtimeoutNz[ntfy] notification failed: )
r   urllibrequestRequestr   
NTFY_TOPICencodeurlopen	Exceptionprint)	messager   actionreqer   r   r]   rk   s	        r2   worker _send_ntfy_async.<locals>.worker   s   	6v~%Jk,@2.+ &Jj?F81~-G4F
 +,)/I&..(("5"#=">?^^%	 ) C ''Q'77 8777 	60455	6s@   C  C  BC   CC  C	C  C   D+C??DTtargetdaemonr   	threadingThreadstart)r]   r   rk   r   r   s   fffd r2   _send_ntfy_asyncr      s1    :6 6@ F40668r4   c                    V ^8  d   QhRRRR/# r*   r0   )r1   s   "r2   r3   r3      s      : $ r4   c                  a V '       g   R # RP                  \        V 4      P                  4       P                  4       4      o\        ;QJ d#    V3R l\
         4       F  '       g   K   RM	  R M! V3R l\
         4       4      '       d   R# RS9   d   R# \        V 4      P                  4        Uu. uF8  qP                  4       '       g   K  VP                  4       P                  4       NK:  	  pp^ pVRR  F~  p\        V4      ^8  g   K  V^ ,          P                  4       '       d   V^,          R	9   g6   V^ ,          R9   d   V^,          R	9   g   VP                  R4      '       g   Ku  V^,          pK  	  V^8  # u upi )
F c              3  ,   <"   T F	  qS9   x  K  	  R # 5ir7   r0   r8   s   & r2   r<   +looks_like_user_question.<locals>.<genexpr>   s     
<+;W+;r>   T?Nabcdefghijklmnopqrstuvwxyzz- i).r   )joinr?   r@   splitrA   QUESTION_PHRASES
splitlinesrM   lenisdigit
startswith)r,   linelineschoice_linesr;   s   &   @r2   looks_like_user_questionr      s   hhs4y(..01G
s
<+;
<sss
<+;
<<<
g~.1$i.B.B.DU.Dd

!TZZ\!.DEULbc
t9>!W__47j#8Q77DGz<Qt$$AL  1 Vs   0E>"E>c                    V ^8  d   QhRRRR/# )r+   rc   rm   r.   rs   r0   )r1   s   "r2   r3   r3      s     * *# *$ *r4   c                   . p\         P                  4        EF?  w  r#VP                  R R4      p\        VP                  RV 4      4      pW,
          pVR8X  dR   V\        8  d   VP                  V4       M2V\        8  d(   RVR &   RVR&   VP                  RV\        ,           4       K  VR8X  dG   \        VP                  RV4      4      pW,
          \        R,          8  d   VP                  V4       K  \        P                  VP                  RR4      4      pVf   \        P                  V4      pVf   EK%  Wh8  g   EK.  VP                  V4       EKB  	  V F  p\         P                  VR4       K  	  R# )	rg   r   rl   r   stale_runningrk   stale_atr   N)r(   itemsgetrm   RUNNING_REMOVE_SECappendRUNNING_TO_UNKNOWN_SEC
setdefaultATTENTION_TIMEOUTS_SECATTENTION_REASON_TIMEOUTS_SECpop)	rc   remove_keyskeyrecrg   rl   ager   r   s	   &        r2   _expire_attention_lockedr      s<   K&,,.+s34
I((""3'..(G /Hz:8N+NOI377:z:;H~!7	!BB""3'/33CGGHb4IJ?,007G3>s#1 /4 sD) r4   c                    V ^8  d   QhRRRR/# )r+   payloadre   r.   ztuple[bool, dict]r0   )r1   s   "r2   r3   r3      s     H HD H-> Hr4   c                   \        \        P                  ! 4       4      p\        \        V P	                  R R4      4      4      pVf	   RRRRR/3# \        V P	                  RR4      4      P                  4       pV\        9  d	   RRRRR/3# \        V P	                  R	R4      4      P                  4       pV'       g	   RRRRR
/3# \        V P	                  RR4      4      P                  4       ;'       g    V RV 2p\        V,          w  rgVR8X  d%   \        V P	                  R4      4      '       d   RRrvM6VR8X  d0   \        '       d$   \        V P	                  R4      4      '       d   RRrv\        V4      p\        W%V4      p	Rp
Rp\        ;_uu_ 4        \        V4       \        ^,          s\        pVR8X  dm   \        \         P#                  4       4       FK  w  rVP	                  R 4      V8X  g   K  VP	                  R	4      V8X  g   K5  \         P%                  VR4       KM  	  \         P	                  V	/ 4      P	                  R4      pVR8X  d   \         P%                  V	R4       MR TRTR	TRTRTRTRTRTRVR8X  d   TM$\         P	                  V	/ 4      P	                  R4      /	\         V	&   VR8H  ;'       d    VR8g  ;'       d    VR8g  p
\&        ;'       d    VR8H  ;'       d    VR!9   pRRR4       \)        4        V
'       d   \+        W(V4       V'       d   \+        W(VRR7       R RR /3#   + '       g   i     LJ; i)"r]   r   NFokr   zunknown providereventzunknown eventrQ   zmissing cwdr^   r`   r    r   r   tool_user#   last_assistant_messager   possible_questionr   rg   r   r   rk   rl   seqlast_running_atpermission_requestr   )r   T)r   r   r   )rm   rn   rO   r?   r   rM   	EVENT_MAPrC   QUESTION_HEURISTIC_ENABLEDr   r[   ra   _attention_lockr   _attention_seqlistr(   r   r   NTFY_NOTIFY_DONErx   r   )r   rc   r]   r   rQ   r^   rg   rk   r   r   should_notifyshould_notify_doner   old_keyr   
prev_states   &               r2   ingest_attention_eventr      s   
diik
C"3w{{:r'B#CDHtUG-?@@@GR()//1EItUG_===
gkk%$
%
+
+
-CtUG];;;W[[r2399;RR(1SE?RJe$ME#;GKK	<R#S#S!:v	&77<TU\U`U`ayUz<{<{$&9v)#.L
s
3CM	 %!N" $%7%=%=%? @77:&(2swwu~7L&**7D9 !A (++C488A
F?""3- Hjs&cs!%9*<3BTBXBXY\^`BaBeBefwBx
's# % 3 3,.3 322  ! G GVOG G"FF C 
N 8fE$] 
s2   AL25L2B/L2=L2
L2L2*L22M	c                    V ^8  d   QhRRRR/# )r+   records
list[dict]r.   r0   )r1   s   "r2   r3   r3   B  s     ! !j !Z !r4   c           	     0   / pV  F  pVP                  R R4      pVP                  V4      pVf   W!V&   K0  \        P                  VP                  RR4      ^c4      \        VP                  R^ 4      4      ) \        VP                  R^ 4      4      ) 3p\        P                  VP                  RR4      ^c4      \        VP                  R^ 4      4      ) \        VP                  R^ 4      4      ) 3pWe8  g   K  W!V&   K  	  \        VP	                  4       4      # )rQ   r   rg   r   rl   r   )r   STATE_PRIORITYrm   r   values)r   by_cwdr   rQ   curcur_rankrec_ranks   &      r2   _dedupe_provider_recordsr   B  s     FggeR jjo;3Kswww	:B?q)**"##
 swww	:B?q)**"##

 3K# $   r4   c                   V ^8  d   QhRR/# )r+   r.   r'   r0   )r1   s   "r2   r3   r3   Y  s     . .? .r4   c                    \        \        P                  ! 4       4      p \        ;_uu_ 4        \        V 4       \	        \
        P                  4       4      pR R R 4       R. R. R. /pX F3  pVP                  R4      pWB9   g   K  W$,          P                  V4       K5  	  / pVP                  4        EF#  w  rF\        V4      pV'       g   \        V 4      WT&   K(  \        R V 4       R R7      pV Uu. uF  q3P                  RR	4      V8X  g   K  VNK  	  ppVP                  R
 RR7       V^ ,          p	. p
V FF  pVP                  RR4      pV'       d   W9  d   V
P                  V4       \        V
4      ^8  g   KF   M	  RVR\        V4      RV	P                  RR4      RV
RV	P                  RR4      R\        V	P                  RV 4      4      /WT&   EK&  	  V#   + '       g   i     EL; iu upi )NrH   rJ   rL   r]   c              3  D   "   T F  qP                  R R4      x  K  	  R# 5i)rg   r   Nr   )r9   r   s   & r2   r<   ,get_attention_by_provider.<locals>.<genexpr>m  s     <GSWWWi((Gs    c                .    \         P                  V ^c4      # )c   )r   r   )ss   &r2   <lambda>+get_attention_by_provider.<locals>.<lambda>n  s    .,,Q3r4   r   rg   r   c                n    \        V P                  R ^ 4      4      \        V P                  R^ 4      4      3# rl   r   rm   r   r   s   &r2   r   r   r  s)    Sq!9:Cq@Q<RSr4   T)r   reverser   r   rh   ri   rj   rk   rl   )rm   rn   r   r   r   r(   r   r   r   r   r   rp   minsortr   )rc   snapshotgroupedr   r]   resultr   
best_stateselectedprimaryrj   rZ   s               r2   get_attention_by_providerr  Y  s   
diik
C	 %*1134 
 !)"gr8RHG77:&$$S) 
 F$]]_*73/4F<G<3

 $+X7Cgggy.IZ.WCC7XS 	 	
 1+C77>2.D,%8}!  ZS]w{{>2>gkk(B/#gkk,<=
1 -B MY 
* Ys   )G2G/G/G,	c                   V ^8  d   QhRR/# r+   r.   re   r0   )r1   s   "r2   r3   r3     s      D r4   c                    \        \        P                  ! 4       4      p \        4       pR RRV RRRRVP                  R\	        V 4      4      /RRRVP                  R\	        V 4      4      /RRRVP                  R\	        V 4      4      /./# )	r   Trl   	providersrZ   rH   	attentionrJ   rL   )rm   rn   r  r   rp   )rc   r  s     r2   get_status_payloadr    s    
diik
C)+IdcX{IMM(DTUXDY,Z[Wk9==BRSVBW+XYX{IMM(DTUXDY,Z[
 r4   z)https://api.anthropic.com/api/oauth/usagez*https://platform.claude.com/v1/oauth/tokenz$9d1c250a-e61b-44d9-88ed-5944d1962f5ec                   V ^8  d   QhRR/# r  r0   )r1   s   "r2   r3   r3     s     - -$ -r4   c                     \         P                  ! . RORR^
R7      p V P                  ^ 8w  d   \        R4      hV P                  P                  4       p\        P                  ! V4      pVP                  RV4      # )z6Read Claude CLI OAuth credentials from macOS keychain.Tcapture_outputr,   r   zkCould not read Claude credentials from keychain.
Make sure you're logged in: run `claude` and authenticate.claudeAiOauth)securityzfind-generic-passwordz-szClaude Code-credentialsz-w)	
subprocessrun
returncodeRuntimeErrorstdoutrM   jsonloadsr   )r
  rawcredss      r2   read_credentialsr$    so    ^^T$F AI
 	
 --


CJJsOE99_e,,r4   c                   V ^8  d   QhRR/# )r+   r.   ztuple[str, str | None]r0   )r1   s   "r2   r3   r3     s     ; ;0 ;r4   c                 J    \        4       p V R ,          V P                  R4      3# )accessTokenrefreshToken)r$  r   )r#  s    r2   get_access_tokenr)    s#    E>!:::r4   c                    V ^8  d   QhRRRR/# r+   refresh_tokenr?   r.   r0   )r1   s   "r2   r3   r3                 r4   c                   \         P                  ! R RRV R\        /4      P                  4       p\        P
                  P                  \        VRR/RR7      p\        P
                  P                  V^R7      ;_uu_ 4       p\         P                  ! VP                  4       4      pRRR4       VR	,          #   + '       g   i     XR	,          # ; i)

grant_typer,  	client_idContent-Typeapplication/jsonr   r   r   Naccess_token)r   dumpsOAUTH_CLIENT_IDr   r   r   r   TOKEN_REFRESH_URLr   r!  readr,  r   r   respr   s   &    r2   refresh_access_tokenr:    s    jjo_  vx	 
 ..
 
 !34	 ! C 
		R		0	0Dzz$))+& 
1 
1	0s   %B77C	c                    V ^8  d   QhRRRR/# r+   r3  r?   r.   re   r0   )r1   s   "r2   r3   r3     s     ' 'S 'T 'r4   c                >   \         P                  P                  \        R RV  2RRRRRRRR/R	7      p\         P                  P	                  V^R
7      ;_uu_ 4       p\
        P                  ! VP                  4       4      uuRRR4       #   + '       g   i     R# ; i)AuthorizationBearer Acceptr2  r1  zanthropic-betazoauth-2025-04-20
User-Agentzclaude-code/2.1.0r   r   N)r   r   r   ANTHROPIC_USAGE_URLr   r   r!  r7  )r3  r   r9  s   &  r2   fetch_claude_usagerD    s    
..
 
 w|n5(.0-
 ! 	C 
		R		0	0Dzz$))+& 
1	0	0	0s   $BB	c                    V ^8  d   QhRRRR/# )r+   resets_at_isor-   r.   rm   r0   )r1   s   "r2   r3   r3     s      z c r4   c                &   V '       g   R#  \         P                  ! V P                  RR4      4      pV\         P                  ! \        P
                  4      ,
          P                  4       p\        ^ \        V4      4      #   \         d    Ru # i ; i)   Zz+00:00)
r   fromisoformatreplacerc   r   utctotal_secondsmaxrm   r   )rF  dtdeltas   &  r2   parse_resets_in_secrR    sq    	##M$9$9#x$HIhll8<<00??A1c%j!! 	s   A3B   BBc                    V ^8  d   QhRRRR/# r+   r"  re   r.   r   r0   )r1   s   "r2   r3   r3     s      d t r4   c                (   . p. ROpV F  w  r4pV P                  V4      pVf   K  VP                  R4      pVe   \        V4      MRp\        V^d4      pV^8X  d   ^ pVP                  RVRVR\	        VP                  R4      4      RV/4       K  	  V# )		five_hourutilizationrz   pctresets_in_sec	resets_atduration_sec))rV  5hPF  )	seven_day7d:	 )seven_day_opusOpusr`  rJ  )r   rm   r  r   rR  )	r"  windows
window_mapr   rz   r[  wrW  rX  s	   &        r2   build_claude_windowsrf    s    GJ
 %/ LGGCL9eeM* #."9c+r#sm!8CU30{1CDL	
 	 %/$ Nr4   z*https://chatgpt.com/backend-api/wham/usagez#https://auth.openai.com/oauth/tokenapp_EMoamEEZ73f0CkXaXp7hrannc                   V ^8  d   QhRR/# r+   r.   r?   r0   )r1   s   "r2   r3   r3     s     1 1# 1r4   c                     \         P                  P                  R R4      P                  4       p V '       g    \         P                  P                  R4      p \         P                  P                  V R4      # )
CODEX_HOMEr   z~/.codexz	auth.jsonrS   environr   rM   rT   rV   r   )
codex_homes    r2   _codex_auth_pathro    sK    b1779JWW''
3
77<<
K00r4   c                   V ^8  d   QhRR/# r+   r.   dict | Noner0   )r1   s   "r2   r3   r3     s     " " "r4   c                    \        4       p \        P                  P                  V 4      '       g   R#  \	        V 4      ;_uu_ 4       p\
        P                  ! V4      pRRR4       XP                  R4      ;'       g    RP                  4       pT'       d	   RTRRRR/# TP                  R/ 4      pTP                  R4      ;'       g    TP                  RR4      P                  4       pTP                  R4      ;'       g    TP                  R	R4      P                  4       pTP                  R4      ;'       g    TP                  R
4      pT'       d	   RTRTRT/# R#   + '       g   i     EL
; i  \         d     R# i ; i)zRRead Codex OAuth credentials from ~/.codex/auth.json. Returns None if unavailable.NOPENAI_API_KEYr   r3  r,  
account_idtokensr'  r(  	accountId)
ro  rS   rT   existsopenr   loadr   r   rM   )rT   fr   api_keyrv  r3  r,  ru  s           r2   read_codex_credentialsr}    s=   D77>>$$ZZ199Q<D  xx()//R668G"lDQQXXh#FZZ/RRFJJ}r4RYY[LZZ0RRFJJ~r4RYY[MZZ-KKFJJ{4KJ  L/=,Xbc "!" ZZ s/   E2 EE2 E/	)E2 /E2 2F Fc                    V ^8  d   QhRRRR/# r+  r0   )r1   s   "r2   r3   r3   !  s        s  s  r4   c           
        \         P                  ! R \        RRRV RR/4      P                  4       p\        P
                  P                  \        VRR/RR7      p\        P
                  P                  V^R	7      ;_uu_ 4       p\         P                  ! VP                  4       4      pR
R
R
4       VR,          #   + '       g   i     XR,          # ; i)r0  r/  r,  scopezopenid profile emailr1  r2  r   r   r   Nr3  )r   r4  CODEX_CLIENT_IDr   r   r   r   CODEX_REFRESH_URLr   r!  r7  r8  s   &    r2   refresh_codex_tokenr  !  s    jj_o'	 
 vx  ..
 
 !34	 ! C 
		R		0	0Dzz$))+& 
1 
1	0s   %B99C	c               $    V ^8  d   QhRRRRRR/# )r+   r3  r?   ru  r-   r.   re   r0   )r1   s   "r2   r3   r3   3  s!     
' 
'C 
'Z 
'4 
'r4   c                R   R RV  2RRRR/pV'       d   WR&   \         P                  P                  \        VR7      p\         P                  P	                  V^R7      ;_uu_ 4       p\
        P                  ! VP                  4       4      uuR	R	R	4       #   + '       g   i     R	# ; i)
r>  r?  r@  r2  rA  CodexBarzChatGPT-Account-IdrB  r   N)r   r   r   CODEX_USAGE_URLr   r   r!  r7  )r3  ru  r   r   r9  s   &&   r2   fetch_codex_usager  3  s    7<.1$jG
 (2$%
..
 
 '
 
BC			R		0	0Dzz$))+& 
1	0	0	0s   &$BB&	c                    V ^8  d   QhRRRR/# )r+   limit_window_secondsrm   r.   r?   r0   )r1   s   "r2   r3   r3   @  s     / / / /r4   c                d    V R 8X  d   R# V R8X  d   R# V R8  d   V R,           R2# V R,           R2# )	r]  r\  r`  r_  i   r&   hQ dr0   )r  s   &r2   _window_labelr  @  sD    u$tv%td"2F$2N1Oq/Q(Q"e+,A..r4   c                    V ^8  d   QhRRRR/# rT  r0   )r1   s   "r2   r3   r3   G  s      T d r4   c                   V P                  R4      ;'       g    / p. pR	 F  pVP                  V4      pV'       g   K  VP                  RR
4      pV^ 8  d   K9  \        \        V4      ^d4      pV^8X  d   ^ pVP                  R^ 4      pV'       d0   \        ^ \        V\        P                  ! 4       ,
          4      4      MR
pVP                  R\        VP                  R^ 4      4      RVRVRVP                  R^ 4      /4       K  	  V# )z0Convert Codex API response to ESP32 window list.
rate_limitused_percentreset_atrz   r  rX  rY  r[  )primary_windowsecondary_windowrJ  )r   r  rm   rO  rn   r   r  )r"  r  rc  r   re  rX  r  rY  s   &       r2   build_codex_windowsr  G  s    &,,"JG5NN3eeNB'7#c(C !8C55Q'?GAs8diik#9:;R]155)?#CD3]AEE"8!<	
 	 6$ Nr4   z/https://cloudcode-pa.googleapis.com/v1internal:z#https://oauth2.googleapis.com/tokenzH681255809395-oo8ft2oprdrnp9e3aqf6av3hmdib135j.apps.googleusercontent.comr  c                   V ^8  d   QhRR/# ri  r0   )r1   s   "r2   r3   r3   h  s     9 93 9r4   c                     \         P                  P                  R R4      P                  4       p V '       g    \         P                  P                  R4      p \         P                  P                  V R4      # )GEMINI_HOMEr   z	~/.geminizoauth_creds.jsonrl  )gemini_homes    r2   _gemini_auth_pathr  h  sL    **..399;Kgg((577<<%788r4   c                   V ^8  d   QhRR/# rq  r0   )r1   s   "r2   r3   r3   o  s     ; ; ;r4   c                    \        4       p \        P                  P                  V 4      '       g   R #  \	        V 4      ;_uu_ 4       p\
        P                  ! V4      pR R R 4       XP                  R4      ;'       g    RP                  4       pTP                  R4      ;'       g    RP                  4       pT'       g	   T'       d   T# R #   + '       g   i     Lv; i  \         d     R # i ; i)Nr3  r   r,  )
r  rS   rT   rx  ry  r   rz  r   r   rM   )rT   r{  r   r3  r,  s        r2   read_gemini_credentialsr  o  s    D77>>$$ZZ199Q<D  HH^,2299;LXXo.44";;=M=4:d: Z s/   C CC C	C C C-,C-c                    V ^8  d   QhRRRR/# )r+   r#  re   r.   rs   r0   )r1   s   "r2   r3   r3   }  s      T d r4   c                    \        4       p \        VR 4      ;_uu_ 4       p\        P                  ! W^R7       RRR4       R#   + '       g   i     R# ; i  \         d     R# i ; i)re  )indentN)r  ry  r   dumpr   )r#  rT   r{  s   &  r2   _write_gemini_credentialsr  }  sG    D$__IIeq) ___ s-   A AA A	A A A&%A&c                    V ^8  d   QhRRRR/# r+  r0   )r1   s   "r2   r3   r3     r-  r4   c                   \        R \        RRRV /4      P                  4       p\        P                  P                  \        VRR/RR7      p\        P                  P                  V^R7      ;_uu_ 4       p\        P                  ! VP                  4       4      pRRR4       VR	,          #   + '       g   i     XR	,          # ; i)
r0  r/  r,  r1  z!application/x-www-form-urlencodedr   r   r   Nr3  )r   GEMINI_CLIENT_IDr   r   r   r   GEMINI_REFRESH_URLr   r   r!  r7  r8  s   &    r2   refresh_gemini_tokenr    s    %o  vx	 
 ..
 
 !DE	 ! C 
		R		0	0Dzz$))+& 
1 
1	0s   6%B,,C	c                    V ^8  d   QhRRRR/# )r+   r#  re   r.   r-   r0   )r1   s   "r2   r3   r3     s      4 J r4   c                   V P                  R 4      ;'       g    RP                  4       pV P                  R4      ;'       g    RP                  4       p\        V P                  R4      ;'       g    ^ 4      pV'       d+   V\        P                  ! 4       ^<,           R,          8  d   V# V'       g   T;'       g    R# \	        V4      pWR &   \        P                  ! 4       R,          R,           V R&   \        V 4       V# )r3  r   r,  expiry_datei  Ni6 )r   rM   floatrn   r  r  )r#  r3  r,  	expiry_mss   &   r2   get_gemini_access_tokenr    s    IIn-33::<LYY/552<<>Meii.33!4I	TYY[2%5$==##t#'6L(.99;-;E-e$r4   c               (    V ^8  d   QhRRRRRRRR/# )r+   r   r?   r   re   r3  r.   r0   )r1   s   "r2   r3   r3     s(     ' 'S '4 's 't 'r4   c                   \         P                  P                  \         V  2\        P
                  ! V4      P                  4       R RV 2RRRRRR/RR7      p\         P                  P                  V^R	7      ;_uu_ 4       p\        P                  ! VP                  4       4      uuR
R
R
4       #   + '       g   i     R
# ; i)r>  r?  r1  r2  r@  rA  r  r   r   r   N)
r   r   r   GEMINI_CODE_ASSIST_URLr   r4  r   r   r!  r7  )r   r   r3  r   r9  s   &&&  r2   _gemini_code_assist_postr    s    
..
 
 !
"6(+ZZ '')w|n5.(*	
  ! 
C 
		R		0	0Dzz$))+& 
1	0	0	0s   $B11C	c                    V ^8  d   QhRRRR/# r<  r0   )r1   s   "r2   r3   r3     s     ] ]S ]T ]r4   c           	        \         P                  P                  R 4      ;'       g*    \         P                  P                  R4      ;'       g    RpRRRRRR/p\        R	R
TRV'       d	   / VCRV/CMT/V 4      pVP                  R
4      p\	        V\
        4      '       d   VP                  R4      pT;'       g    TpV'       g   \        R4      h\        RRV/V 4      # )GOOGLE_CLOUD_PROJECTGOOGLE_CLOUD_PROJECT_IDNideTypeIDE_UNSPECIFIEDplatformPLATFORM_UNSPECIFIED
pluginTypeGEMINIloadCodeAssistcloudaicompanionProjectmetadataduetProjectidz(Gemini Code Assist project not availableretrieveUserQuotaproject)rS   rm  r   r  
isinstancere   r  )r3  
project_idr  rz  r  s   &    r2   fetch_gemini_usager    s     67ll2::>>Jc;dllhlJ$*hH
 $%z:?8?]J?S[	
 	D hh01G'4  ++d###GEFF#$7)W9M|\\r4   c                    V ^8  d   QhRRRR/# )r+   model_idr?   r.   r0   )r1   s   "r2   r3   r3     s      3 3 r4   c                ~    T ;'       g    R P                  4       pRV9   d   R# RV9   g   RV9   d   R# RV9   d   R# R# )	r   proProz
flash-lite
flash_liteLiteflashFlashrL   )r@   )r  models   & r2   _gemini_bucket_labelr    s@    ^^""$E~u 5%r4   c                    V ^8  d   QhRRRR/# )r+   
reset_timer-   r.   rm   r0   )r1   s   "r2   r3   r3     s     ( (J (3 (r4   c                .    \        V 4      pV^ 8  d   V# R# )r   rJ  )rR  )r  resetss   & r2   _parse_gemini_resetr    s     ,FaZ6'R'r4   c                    V ^8  d   QhRRRR/# rT  r0   )r1   s   "r2   r3   r3     s      d t r4   c                   / pV P                  R 4      ;'       g    .  F  p\        VP                  R4      ;'       g    R4      pV'       g   K1  VP                  R4      pVf   KH   \        R\        R\	        V4      4      4      p\        T4      p\        ^d\        ^ \        RT,
          ^d,          4      4      4      pRTRTR\        TP                  R	4      4      R
\        /pTP                  T4      pTe   YhR,          8  g   K  YqT&   K  	  . p	R F"  pWQ9   g   K  V	P                  W,          4       K$  	  V	R,          #   \
         d     EK4  i ; i)bucketsmodelIdr   remainingFractiong        g      ?rz   rX  rY  	resetTimer[  :Nr+   N)r  r  r  rL   )r   r?   rO  r  r  r   r  rm   r  GEMINI_DAILY_DURATION_SECr   )
r"  r	  bucketr  remaining_fractionrz   rX  windowpreviousordereds
   &         r2   build_gemini_windowsr    sC   !G'')$***vzz),223#ZZ(;<%	!$S#c59K3L*M!N %X.#s1c3);#;s"BCDEU30K1HI5	
 ;;u%se_4#EN+ +. G3NN7>* 4 2;%  		s   'EEE CODEXBAR_UNDERPACE_PCT_THRESHOLD25$CODEXBAR_UNDERPACE_MIN_REMAINING_SECCODEXBAR_UNDERPACE_COOLDOWN_SEC1800CODEXBAR_UNDERPACE_WINDOWr_  r  _underpace_last_fired%CODEXBAR_RESET_5H_REMAINING_THRESHOLD40CODEXBAR_RESET_SLEEP_START_HOUR23CODEXBAR_RESET_SLEEP_END_HOUR6$CODEXBAR_RESET_LONG_MIN_DURATION_SEC#CODEXBAR_RESET_TIMER_JUMP_GRACE_SEC600z dict[tuple[str, str, int], dict]_usage_reset_windowsc               (    V ^8  d   QhRRRRRRRR/# )r+   rX  rm   rY  r[  r.   zfloat | Noner0   )r1   s   "r2   r3   r3     s(     ( (s (3 (c (l (r4   c                p    V^ 8:  g   V^ 8  d   R# W!,
          V,          pV^ 8:  d   R# WR,          ,          # )r   Ng      Y@r0   )rX  rY  r[  elapsed_fracs   &&& r2   _compute_pacer    s:    qMA- 0L@Lq&''r4   c                   V ^8  d   QhRR/# )r+   r.   ztuple[str, str]r0   )r1   s   "r2   r3   r3     s     ; ;_ ;r4   c                    \         ;_uu_ 4        \        '       g   RuuRRR4       # \        \        P                  4       R R7      p RRR4       X P	                  RR4      V P	                  RR4      3#   + '       g   i     L4; i)zVReturn (cwd, project_name) of the most recently updated attention record, or ('', '').r   Nc                n    \        V P                  R ^ 4      4      \        V P                  R^ 4      4      3# r  r  )rs   &r2   r   %_active_session_cwd.<locals>.<lambda>#  s0    c!%%VWBX>Y[^_`_d_dejlm_n[o=pr4   r   rQ   r   )r   r   )r   r(   rO  r   r   r  s    r2   _active_session_cwdr    s`    	!! 
 $++-3pq 
 775"sww~r:::	 
s   A4 A44B	c               (    V ^8  d   QhRRRRRRRR/# )r+   rY  rm   r   r?   rX  r.   rs   r0   )r1   s   "r2   r3   r3   '  s)     9 9c 9 93 9W[ 9r4   c                   a aa \         '       g   R # R VVV 3R llp\        P                  ! VRR7      P                  4        R # )Nc                   V ^8  d   QhRR/# rr   r0   )r1   s   "r2   r3   0_send_underpace_ntfy_async.<locals>.__annotate__+  s     @ @D @r4   c            
       <  SR ,          p S'       d   RS 2MRpRS RV RV  R2p\         P                  P                  R\        \        RR7       2VP                  4       R	R
RRRR/RR7      p\         P                  P                  V^R7      ;_uu_ 4         RRR4       R#   + '       g   i     R# ; i  \         d   p\        RT 24        Rp?R# Rp?ii ; i)r  z in r   z7d window at %, u(   d remaining — good time for /smell-fixr   r   r   zCodexBar: idle quotar   r   r   hourglass_flowing_sandr   r   r   Nz&[ntfy] underpace notification failed: )	r   r   r   r   r   r   r   r   r   )	days_leftprojr   r   r   rX  r   rY  s        r2   r   *_send_underpace_ntfy_async.<locals>.worker+  s    	@%.I,8T,(bD%cU!D6I;>fgG..(("5"#=">?^^%34
  ) 	C ''Q'77 8777 	@:1#>??	@s;   B9 BB9 B%B9 %B6	0B9 6B9 9CCCTr   r   )rY  r   rX  r   s   fff r2   _send_underpace_ntfy_asyncr  '  s2    :@ @( F40668r4   c               0    V ^8  d   QhRRRRRRRRRR	R
R/# )r+   r]   r?   rz   r[  rm   previous_remainingrd   earlyr/   r.   rs   r0   )r1   s   "r2   r3   r3   B  sD     '9 '9'9'9 '9 #	'9
 '9 
'9r4   c                   a aaaa \         '       g   R # R VVVVV 3R llp\        P                  ! VRR7      P                  4        R # )Nc                   V ^8  d   QhRR/# rr   r0   )r1   s   "r2   r3   2_send_usage_reset_ntfy_async.<locals>.__annotate__L  s     < <D <r4   c            
       <  S
;'       g    \        S4      p S	'       d   S R V  R2pRpRpRpMSe   RS R2MRpS R V  R	V 2pR
pRpRp\        P                  P                  R\	        \
        RR7       2VP                  4       RVRVRV/RR7      p\        P                  P                  V^R7      ;_uu_ 4         RRR4       R#   + '       g   i     R# ; i  \         d   p\        RT 24        Rp?R# Rp?ii ; i)r   u     usage reset early surprise 🎁zCodexBar: quota resetztada,gift,partying_facedefaultNz	 You had z% remaining.r   u    usage refreshed 🔄zCodexBar: usage refreshedarrows_counterclockwiser   r   r   r   r   r   r   r   r   z"[ntfy] reset notification failed: )
r  r   r   r   r   NTFY_USAGE_RESET_TOPICr   r   r   r   )r  r   titletagspriorityprevr   r   r[  r  rz   r  r]   s           r2   r   ,_send_usage_reset_ntfy_async.<locals>.workerL  s   	<99mL9F%Jax/OP/0$GYGe#5"6lCkm%Jax/DTFK30 ..(("5)?b#I"JK^^%UD
  ) 	C ''Q'77 8777 	<6qc:;;	<s@   C C BC =C	?C 	C	C C D(C<<DTr   )r  r   r   r   )r]   rz   r[  r  r  r   s   fffff r2   _send_usage_reset_ntfy_asyncr  B  s3     "!< <: F40668r4   c                    V ^8  d   QhRRRR/# )r+   rc   zdatetime | Noner.   r/   r0   )r1   s   "r2   r3   r3   l  s     ' '? 'd 'r4   c                    T ;'       g    \         P                  ! 4       P                  p\        p\        pW#8X  d   R # W#8  d   Y!u;8*  ;'       d    V8  # u # W8  ;'       g    W8  # )T)r   rc   hourUSAGE_RESET_SLEEP_START_HOURUSAGE_RESET_SLEEP_END_HOUR)rc   r  r   ends   &   r2   _is_sleeping_hourr"  l  s[    !!8<<>''D(E
$C|{""s""""=&&DJ&r4   c                    V ^8  d   QhRRRR/# r+   r  re   r.   r/   r0   )r1   s   "r2   r3   r3   w  s     N N N$ Nr4   c                b    V P                  R 4      R8H  ;'       g    V P                  R4      R8H  # )r[  r]  rz   r\  r   )r  s   &r2   _is_five_hour_windowr&  w  s,    ::n%.MM&**W2E2MMr4   c                    V ^8  d   QhRRRR/# r$  r0   )r1   s   "r2   r3   r3   {  s     9 9$ 94 9r4   c                ^    \        V P                  R ^ 4      ;'       g    ^ 4      pV\        8  # )r[  )rm   r   !USAGE_RESET_LONG_MIN_DURATION_SEC)r  durations   & r2   _is_long_reset_windowr+  {  s+    6::na055A6H888r4   c               $    V ^8  d   QhRRRRRR/# r+   r  re   currentr.   r/   r0   )r1   s   "r2   r3   r3     s&     ] ]T ]D ]T ]r4   c                   \        V P                  R R4      4      p\        VP                  R R4      4      pV^ 8  d   R# \        V P                  RR4      4      p\        VP                  RR4      4      pV^ 8  d   R# V^ 8  d#   W2\        ,           8  d   WT8*  ;'       g    V^8*  # V^28  ;'       d    V^8*  ;'       d
    V\        8  # )rY  FrX  rJ  rm   r    USAGE_RESET_TIMER_JUMP_GRACE_SEC)r  r.  prev_resets
cur_resetsprev_pctcur_pcts   &&    r2   _window_reset_detectedr6    s    hll?B78KW[["56JA~8<<r*+H'++eR()G!|aJ7W)WW"22gl2r>\\gl\\z<\/\\r4   c                    V ^8  d   QhRRRR/# )r+   r  re   r.   r/   r0   )r1   s   "r2   r3   r3     s     : :d :t :r4   c                J    \        V P                  R R4      4      pV\        8  # )rY  rJ  r0  )r  r2  s   & r2   _is_early_resetr9    s#    hll?B78K999r4   c               $    V ^8  d   QhRRRRRR/# r-  r0   )r1   s   "r2   r3   r3     s&     T Td TT Td Tr4   c                x   \        VP                  R ^ 4      ;'       g    ^ 4      p\        VP                  RR4      4      pV^ 8:  g   W2\        ,
          8  d   R# \        V P                  RR4      4      p\        VP                  RR4      4      pV^ 8  ;'       d    V^ 8  ;'       d    WT8*  ;'       g    V^8*  # )r[  rY  FrX  rJ  r0  )r  r.  r*  r3  r4  r5  s   &&    r2   _window_looks_fresh_after_resetr<    s    7;;~q166Q7HW[["56J1}
0P%PP8<<r*+H'++eR()Gq=SSW\SSw/B/R/RgQRlSr4   c                    V ^8  d   QhRRRR/# r+   r  r   r.   rs   r0   )r1   s   "r2   r3   r3     s     *d *d: *d$ *dr4   c                   . p\         P                  ! 4       p\        ;_uu_ 4        V  EF  pVP                  R R4      p. pVP                  R. 4       F  pT\	        VP                  RR4      4      \        VP                  R^ 4      ;'       g    ^ 4      3p\        P                  V4      pR\        VP                  RR4      4      R\        VP                  RR4      4      /\        V&   Vf   K  VP                  W\        W4      34       K  	  \        ;QJ d    R V 4       F  '       g   K   R	M	  R
M! R V 4       4      p	V EF  w  rp
T	;'       d    \        V4      ;'       d    \        W4      pV
'       g   V'       g   KA  \        ^ \        ^d^d\        VP                  R^d4      4      ,
          4      4      p\        V4      ;'       g    TpVR8X  dT   TP                  T\	        VP                  RR4      4      \        VP                  R^ 4      ;'       g    ^ 4      W34       K  \        V4      '       dU   TP                  T\	        VP                  RR4      4      \        VP                  R^ 4      ;'       g    ^ 4      W34       EKK  \        V4      '       g   EK_  V\         8  g   EKm  \#        V4      '       d   EK  TP                  T\	        VP                  RR4      4      \        VP                  R^ 4      ;'       g    ^ 4      W34       EK  	  EK  	  RRR4       V F  w  rNrp\%        WNWV4       K  	  R#   + '       g   i     L,; i)rZ   r   rc  rz   r[  rX  rY  Nc              3  R   "   T F  w  rp\        V4      ;'       d    Tx  K  	  R # 5ir7   )r&  )r9   _re  detecteds   &   r2   r<   &_check_usage_resets.<locals>.<genexpr>  s(     !n]m>1QY"6q"9"F"Fh"F]ms   ''TFrL   rJ  )r   rc   _usage_reset_lockr   r?   rm   r  r   r6  rA   r+  r<  rO  r  r9  r&  "USAGE_RESET_5H_REMAINING_THRESHOLDr"  r  )r  notificationsrc   provprovider_nameprovider_windowsre  r   r  five_hour_resetrB  simultaneous_long_resetr  r  rz   r[  s   &               r2   _check_usage_resetsrL    s   BDM
,,.C		D HHVR0M>@XXi,$c!%%*<&=s155YZC[C`C`_`?ab/33C83quuUB/0#S)C%D-$S) # ''6LX6Y(Z[ - "c!n]m!nccc!n]m!nnO)9%X# E E-a0E E7D (
  (?%(CS3x||ESV?W;X5X,Y%Z"'1LL5L H,!((-QUU7B=O9PRUVWV[V[\jlmVnVsVsrsRt  wI  *Q  R*1--!((-QUU7B=O9PRUVWV[V[\jlmVnVsVsrsRt  wI  *Q  R(++*-OO-c22!((-QUU7B=O9PRUVWV[V[\jlmVnVsVsrsRt  wI  *Q  R' *:  
J JWEl$]<]bc JWK 
	sW   C5MM0&MM*M>MBMA#MM&M4MAMMM	c                    V ^8  d   QhRRRR/# r>  r0   )r1   s   "r2   r3   r3     s     Z Z
 Zt Zr4   c                d   \         P                   ! 4       pR pR pV  F  pVP                  R4      R8w  d   K  VP                  R. 4       Fi  pVP                  R4      \        8X  g   K  VP                  RR4      pVP                  RR4      p^ Tu;8:  d   \        8  d   M MV\        8  d   TpTp K  	  K  	  Vf   R # \
        ;_uu_ 4        V\        ,
          \        8  d    R R R 4       R # Vs\        4       w  rR R R 4       \        TX	T;'       g    ^ 4       R #   + '       g   i     L); i)NrZ   rH   rc  rz   rX  rY  rJ  )
rn   r   UNDERPACE_WINDOWUNDERPACE_PCT_THRESHOLDUNDERPACE_MIN_REMAINING_SEC_underpace_lockr  UNDERPACE_COOLDOWN_SECr  r  )
r  rc   triggered_pcttriggered_resets_in_secrG  re  rX  rY  rA  r   s
   &         r2   _check_underpacerV    s    
))+C $M*.88Fx')R(AuuW~!11eeE2& !or :555-Kf:f$'M.;+ )  &	''+AA 
 !$-/	 
 6mFXFXWXY 
s   D0DD/	c                    V ^8  d   QhRRRR/# )r+   r  zlist[dict] | Noner.   re   r0   )r1   s   "r2   r3   r3     s     ) ) 1 )T )r4   c                   V f)   \        RR7      pV'       d   VP                  R. 4      M. p . pV  EF  pVP                  R4      R8w  d   K  VP                  R. 4       F  p\        VP                  RR4      VP                  R	R4      VP                  R
^ 4      4      pVP                  RR4      pVP                  R	R4      pVP                  R4      \        8H  ;'       d,    ^ Tu;8*  ;'       d
    \        8  Mu ;'       d
    V\
        8  pTP                  RVP                  R4      RTRVe   \        V^4      MRRV/4       K  	  EK  	  \        ;_uu_ 4        \        p	RRR4       RRR\        \        P                  ! 4       4      R\        R\        R\
        RX	'       d   \        V	4      RV/# RRV/#   + '       g   i     L^; i)z@Return current pace per window, computed from cached usage data.NTallow_staler  rZ   rH   rc  rX  rY  r[  rz   paceidle_triggerr   rl   monitor_windowpct_thresholdmin_remaining_sec
last_firedrJ  )_get_cached_responser   r  rO  rP  rQ  r   roundrR  r  rm   rn   )
r  cachedwindows_outrG  re  prX  rY  r\  r`  s
   &         r2   get_pace_payloadrf    s   %$739FJJ{B/r	K88Fx')R(AeR or*na(A
 %%r"CEE/26Mg"22 A A6666A A!%@@ 
 wsq}a$	   ) . 
*
 
 	dc$))+&*08c*o;  :>;  
s   F::G
	rr  rv   rw   c                    V ^8  d   QhRRRR/# )r+   rZ  r/   r.   rr  r0   )r1   s   "r2   r3   r3     s      d { r4   c                    \         ;_uu_ 4        \        '       d7   V '       g   \        P                  ! 4       \        8  d   \        uuR R R 4       # R R R 4       R #   + '       g   i     R # ; ir7   )ru   rv   rn   rw   rY  s   &r2   ra  ra    s;    			>O0O# 
  
 s   A#AA-	c                   V ^8  d   QhRR/# r  r0   )r1   s   "r2   r3   r3   %  s     s$ s$$ s$r4   c                 
   \        4       p V '       d   V # \        P                  R R7      '       g+   \        RR7      p V '       d   V # \        P                  4         \        4       p V '       d   V \        P                  4        #  \	        4       w  r \        T4      pR	p\        4       pT'       d$    \!        TR,          TP#                  R4      4      pR	p	\'        4       p
T
'       d     \)        T
4      pT'       d   \+        T4      p	. p\-        4       p\/        T4      pT'       d0   TP1                  RRRTP#                  R\3        4       4      RT/4       TeC   \5        T4      pT'       d0   TP1                  RRRTP#                  R\3        4       4      RT/4       T	eC   \7        T	4      pT'       d0   TP1                  RRRTP#                  R\3        4       4      RT/4       T Uu0 uF  pTR,          kK  	  ppR FU  pTP#                  T\3        4       4      pTT9  g   K&  TP#                  R4      R8w  g   K>  TP1                  RTRTR. /4       KW  	  RRR\        \        P                  ! 4       4      RT/p\8        ;_uu_ 4        Ts\        P                  ! 4       \<        ,           sR	R	R	4       \A        T4       \C        T4       T\        P                  4        #   \
         dH   pRR RRT 2R\        \        P                  ! 4       4      R. /u R	p?\        P                  4        # R	p?ii ; i  \        P                  P                   d   pTP                  R
8X  d   T'       dx    \        T4      p\        T4      p R	p?EL  \
         dM   pRR RRT 2R\        \        P                  ! 4       4      R. /u R	p?u R	p?\        P                  4        # R	p?ii ; iRR RRTP                   2R\        \        P                  ! 4       4      R. /u R	p?\        P                  4        # R	p?i\
         dN   pRR R\        T4      R\        \        P                  ! 4       4      R. /u R	p?\        P                  4        # R	p?ii ; i  \        P                  P                   d}   pTP                  R9   da   TP#                  R4      '       dJ    \%        TR,          4      p\!        YP#                  R4      4      p R	p?EL1  \
         d	      R	p?ELCi ; i R	p?ELMR	p?i\
         d     EL^i ; i  \
         d     EL=i ; iu upi   + '       g   i     EL; i  \        P                  4        i ; i)F)blockingTrY  r   r   z
keychain: rl   r  N  zrefresh failed: zHTTP r3  ru  r,  rZ   rH   r  rc  rJ   rL   rg   r   )rl  i  )rH   rJ   rL   )"ra  _usage_fetch_lockacquirereleaser)  r   rm   rn   rD  r   r   	HTTPErrorcoder:  r?   r}  r  r   r  r  r  r  r  rf  r   rp   r  r  ru   rv   CACHE_TTL_SECrw   rL  rV  )rc  r3  r,  r   
claude_rawe2	codex_rawr#  	new_token
gemini_rawgemini_credsgemini_tokenr  r  claude_windowscodex_windowsgemini_windowsrG  shownrZ   attnr   s                         r2   get_usage_cachedr  %  s    "#F$$e$44%$7M!!#f$%'F 	!!#A	m*:*<'L	c+L9J 	&(
-eN.CUYY|E\]	 
.06|D!3L!AJ
 	-/	-j9Y]]85E5GH>   /	:M  Gw8H8J!K}"  !1*=N  Hx9I9K!L~"  +44)$f)41D=='7'9:D5 TXXg%6&%@  &$T9b!QR 2 $#diik*
 [& $		m ;  	I&#!!#}  	m%Jqc*:L#diikJZ\gikllz 	!!#}	m
 ||%% 	qvv}|#7#FL!3L!AJ  | %4DRD2I<Y\]a]f]f]hYikvxz{{{f 	!!#i| eWaffX.>cRVR[R[R]N^`kmoppb 	!!#a  	c%#a&,DIIK@PR]_abb^ 	!!#a	c <<)) 66Z'EIIo,F,F$7o8N$O	$5i<AX$Y	$    B 5 [[ 	!!#s|  U! K L2 U! 2"R U! )T6 CU! %U7%U! !U! 9AU! #U)U! L/((L*L/U! *L//U! 2RP-+NU! O(O:O;P-?R U! O5P-RU! -R:R;.R)R*U! RU! T3*'T!,T?U! TT!U! TT!U! !T3.T3/U! 2T33U! 6UU! UU! U		U! !U7c                  8    ] tR tRtR tR	R R lltR tR tRtR# )
Handleri  c                	|    \         P                  ! 4       P                  R 4      p\        RV RW,           24       R# )z%H:%M:%S[z] N)r   rc   strftimer   )selffmtargsro   s   &&* r2   log_messageHandler.log_message  s/    \\^$$Z0"R
|$%r4   c                    V ^8  d   QhRRRR/# )r+   r   re   statusrm   r0   )r1   s   "r2   r3   Handler.__annotate__  s      $  r4   c                	V   \         P                  ! V4      P                  4       pV P                  V4       V P	                  R R4       V P	                  R\        \        V4      4      4       V P	                  RR4       V P                  4        V P                  P                  V4       R# )r1  r2  Content-LengthzAccess-Control-Allow-Origin*N)
r   r4  r   send_responsesend_headerr?   r   end_headerswfilewrite)r  r   r  bodys   &&& r2   
_send_jsonHandler._send_json  s    zz'"))+6");<)3s4y>:6<

r4   c                	   \        V P                  4      P                  pVR 8X  d   \        4       pV P                  V4       R# VR8X  d   V P                  \	        4       4       R# VR8X  d   V P                  \        4       4       R# VR8X  d?   V P                  ^4       V P                  4        V P                  P                  R4       R# V P                  R4       V P                  4        R# )/usagez/statusz/pace/healths   ok  N)
r   rT   r  r  r  rf  r  r  r  r  )r  rT   r   s   &  r2   do_GETHandler.do_GET  s    		"''8&(GOOG$YOO.01W_OO,./Ys#JJU#s#r4   c                	\   \        V P                  4      P                  pVR 8w  d$   V P                  R4       V P                  4        R#  \	        V P
                  P                  RR4      4      pV^ 8  d   V P                  P                  V4      MRp\        P                  ! V4      p\        V\        4      '       g   \        R4      h \!        T4      w  rgT P                  Yv'       d	   ^4       R# R4       R#   \         d%   pT P                  RRR	R
T 2/R4        Rp?R# Rp?ii ; i)z
/attentionr  Nr  0s   {}zexpected JSON objectr   Fr   zinvalid JSON: i  )r   rT   r  r  rm   r   r   rfiler7  r   r!  r  re   
ValueErrorr   r  r   )r  rT   lengthr"  r   r   r   responses   &       r2   do_POSTHandler.do_POST  s    		"''<s#	))*:C@AF-3aZ$**//&)UCjjoGgt,, !788 - .g6#55  	OOT5'^A33GH#N	s   B C< <D+D&&D+r0   N)   )	__name__
__module____qualname____firstlineno__r  r  r  r  __static_attributes__r0   r4   r2   r  r    s    &"6r4   r  c                      ] tR tRtRtRtRtR# )CodexBarHTTPServeri  Tr0   N)r  r  r  r  allow_reuse_addressdaemon_threadsr  r0   r4   r2   r  r    s    Nr4   r  c                   V ^8  d   QhRR/# )r+   r.   z	list[int]r0   )r1   s   "r2   r3   r3     s     	 	y 	r4   c                     \         P                  ! RRR\         2.RR^R7      p V P                  P	                  4        Uu. uF%  qP                  4       '       g   K  \        V4      NK'  	  up# u upi   \         d    . u # i ; i)z(Return PIDs currently listening on PORT.lsofz-tiztcp:Tr  )r  r  PORTr  r   rM   rm   r   )r
  pids     r2   _pids_on_portr    su    Ud4&M*dA
 %+MM$7$7$9I$9SYY[C$9III 	s*   A A5 A0A0-A5 0A5 5BBc                   V ^8  d   QhRR/# )r+   r.   r/   r0   )r1   s   "r2   r3   r3     s       r4   c            	     0   ^ RI p \        P                  ! 4       p\        4        Uu. uF  q"V8w  g   K  VNK  	  ppV'       g   R# \        P                  P                  RR4      P                  4       P                  4       R9   pV'       Ed   V F8  p\        P                  ! W P                  4       \        RV R\         24       K:  	  \        P                  ! 4       ^,           p\        P                  ! 4       V8  dD   \        4        Uu. uF  q"V8w  g   K  VNK  	  ppV'       g   R# \        P                  ! R4       K]  \        4        Uu. uF  q"V8w  g   K  VNK  	  pp\        R\         R	R
P                  R V 4       4       24       \        R4       \        R4       R# \        R\         RR
P                  R V 4       4       24       \        R4       \        R\         R24       \        R4       \        R4       R# u upi u upi u upi )z'Return True if startup should continue.NTCODEXBAR_REPLACE_EXISTINGr   zKilled existing process z	 on port g?Port z is still in use by PID(s): r  c              3  8   "   T F  p\        V4      x  K  	  R # 5ir7   r?   r9   r  s   & r2   r<   1_replace_existing_if_requested.<locals>.<genexpr>  s     A`V_s#c((V_   _If launchd is managing CodexBar, unload or update the LaunchAgent before replacing it manually:T  launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/com.codexbar.companion.plistFz is already in use by PID(s): c              3  8   "   T F  p\        V4      x  K  	  R # 5ir7   r  r  s   & r2   r<   r    s     ?YTXSCTXr  zHAnother CodexBar companion may already be running, possibly via launchd.zCheck: curl http://127.0.0.1:r  zTo replace it explicitly, run:z9  CODEXBAR_REPLACE_EXISTING=1 python3 companion/server.py)r   trueyes)signalrS   getpidr  rm  r   rM   r@   killSIGTERMr   r  rn   sleepr   )r  my_pidr  pidsrL  deadline	remainings          r2   _replace_existing_if_requestedr    s   YY[F(?<?CVmCC?D<jjnn8"=CCEKKMQeeGwCGGC(,SE4&AB  99;?iikH$(5I&=IIJJsO$1OEOSf}SSO	EdV7		A`V_A`8`7abcopde	E$5dii?YTX?Y6Y5Z
[\	
TU	)$w
78	
*+	EG5 = J Fs"   H	H	HHHHc                 v   ^ RI p \        4       '       g   R#  V P                  V P                  V P                  4      pVP	                  R)4       VP                  4       ^ ,          pVP                  4        \        R\         24       \        RV R24       \        RV R\         R24       \        4         \        R\        3\        4      p\        R4       \)        4       pTR,          '       dm   TP+                  R. 4       FU  p	\        RT	R,           R24       T	R,           F/  p
\        RT
R,          R RT
R,          R  R!T
R",           R#24       K1  	  KW  	  M\        R$TP+                  R%4       24       \        4        \        R&\         R'24        TP-                  4        R#   \         d$    T P                  T P                  4       4      p ELbi ; i  \         d   p\        TR	R4      ^08X  d   \!        4        Uu. uF   qU\"        P$                  ! 4       8w  g   K  TNK"  	  Mu upi ppT'       d   R
RP'                  R T 4       4       2MRp\        R\         RT R24       \        R4       \        R4       \        R4        Rp?R# h Rp?ii ; i  \.         d    \        R(4        R# i ; i)*r   Nz*CodexBar companion proxy starting on port zESP32 PROXY_HOST = ""zEndpoint: http://r`   r  z0.0.0.0errnoz by PID(s): r  c              3  8   "   T F  p\        V4      x  K  	  R # 5ir7   r  r  s   & r2   r<   main.<locals>.<genexpr>  s     -G$3c#hh$r  r   r  z is already in user   r  r  zBThen start again, or reinstall the plist from companion/README.md.u   Fetching initial usage data…r   r  z  [rZ   ]rc  z    rz   6sr   rX  3dz%  resets in rY  r   z	  Error: r   zServing on http://0.0.0.0:u    — Ctrl-C to stop
z	
Stopped.)z8.8.8.8P   )socketr  AF_INET
SOCK_DGRAMconnectgetsocknamecloser   gethostbynamegethostnamer   r  r  r  OSErrorgetattrr  rS   r  r   r  r   serve_foreverKeyboardInterrupt)r  r   local_ipserverr   r  r  suffixr   rG  re  s              r2   mainr    s[   )++>MM&..&*;*;<			/"==?1%		 
6tf
=>	!(2
./	hZqf
56	G#Y$5w? 

*+ Gt}}KKR0DCV~Q'()__QwZO1QuXbMqGYFZZ[\] % 1
 		'++g./01	G	&tf,A
BCE  >''(:(:(<=>  	1gt$*#0?I?CRYY[6HCC?IDIMQ|DII-G$-G$G#HIWYFE$1&;<sthiVW	2  lsU   AF+ 8G J +*GGJ'JH,%H,+A$JJJJ87J8__main__)r  falsenooff)r   session_start)r   r   )r   r   )r   r!   )r   elicitation)r   stop)r   user_prompt)r   session_end)zwhich optionzwhich approachzwhat would you likezwhat do you wantzdo you want me tozwould you like me tozshould iz	should wezplease confirmzneed your inputzwaiting for your)zautomatic approvalzauto-approvedzauto approvedzapproved by autor7   )zOpen Terminali  i )r   )F)__conditional_annotations__
__future__r   r   rS   r  r   rn   urllib.requestr   urllib.errorurllib.parser   r   r   r   r   http.serverr	   r
   r  rr  rm  r   rM   r   r  r}   r~   r@   r   r   r   r   r   r   r   r   Lockr   r(   __annotations__r   r   rB   rC   rO   r[   ra   rp   rx   r   r   r   r   r   r   r  r  rC  r6  r5  r$  r)  r:  rD  rR  rf  r  r  r  ro  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rm   rP  r?   rQ  rS  rO  rR  r  rE  r  r   r)  r1  rD  r  r  r  r  r  r"  r&  r+  r6  r9  r<  rL  rV  rf  ru   rm  rv   rw   ra  r  r  r  r  r  r  r  )r  s   @r2   <module>r     s   " "
  	      3 3 ' C (=?XY__a
(IK`aggi (;R@FFH(;RZZ^^FTV=WX^^`(>DJJLRRT\ww ZZ^^,I3OUUW]]_&'  !Q
Aq
Aq 0)*=20
2)
	 $T
Ct
A  C! 
   .."&( O (  F3	C$9S_ $9N(*@HV!..b B B <- ;
 "'< A9 21"2 $
'/6 K > c ! 9; "' ]0(H ""**..1SY]"^_ !"**..1WY\]fYg"hi !"**..1RY_"`a "$**..1LY]"^"d"d"f .."  u  %(8_ae)f%g "%(8Yae)f%g %(8Wad)e%f %(8^adenao)p%q !%(8]af)g%h  NN$ 9; 6 ;(;96'9T'N9
]:
T*dZZ<)\ nnNN$  $ + $ 5 s$p16$ 16h, 
	B-` zF r4   