
    i              
          U d Z ddlZddlZddlZddlZddlZddlZddlmZ ddlm	Z	 ddl
mZmZ ej                  j                  d e e	e      j#                         j$                  j$                              Z e e	e      dz  dz        Z e e	e      dz  d	z        Zd
ZdZddddddddddZeeeeef   f   ed<    ej8                  d      Z ej8                  d      ZdZdZ dedefdZ!dedeeef   fdZ"deeef   dedefdZ#defd ee$e      d!eddfd"Z%d!edeeef   fd#Z&efd$ed!edeeeef      fd%Z'efd!edeeef   fd&Z(efd!ede$eeef      fd'Z)eefd(ed!eddfd)Z*d,d*Z+e,d+k(  r e+        yy)-zFToken usage tracker: scans Claude JSONL sessions, builds token ledger.    N)datetime)Path)AnyOptionalWORKSPACE_ROOTmemoryztoken-ledger.jsonztask-timers.jsonz6/home/jay/.claude/projects/-home-jay-workspace/*.jsonlzB/home/jay/.claude/projects/-home-jay--cokacdir-workspace-*/*.jsonlg      .@g     R@)inputoutputg      @g?g      @)zclaude-opus-4-6claude-sonnet-4-6zclaude-haiku-4-5-20251001PRICESztask-\d+\.\d+ui   (?:팀|team_id|team)\s*[:：]\s*(dev\d+-team|marketing|anu-direct|[a-z][a-z0-9]*-[a-z][a-z0-9-]*[a-z0-9]))input_tokenscache_creation_tokenscache_read_tokensoutput_tokens)	
session_idteam_idr   r   r   r   total_tokensmessage_count	timestampcreturnc                 z    t        | t              r| S t        | t              rdj                  d | D              S dS )N c              3   b   K   | ]'  }t        |t              s|j                  d d       ) yw)text N)
isinstancedictget).0is     F/home/jay/workspace/.worktrees/task-2116-dev1/scripts/token-tracker.py	<genexpr>z_text.<locals>.<genexpr>%   s$     H!Jq$4GAEE&"%Hs   //r   )r   strlistjoin)r   s    r"   _textr'   "   s7    !SLVWXZ^L_388HqHHgegg    
jsonl_pathc           	        
 t         j                  t        d      

j                  ddddddd       t	        |       }|j                         s
S |j                  d      j                         D ]  }|j                         }|s	 t        j                  |      }
d   s|j                  d      r|d   
d<   |j                  dd      }|d	k(  rt        |j                  d
i       j                  dd            }
d   s+t        j                  |      x}r|j!                  d      
d<   
d   s+t"        j                  |      x}r|j!                  d      
d<   
d   r|j                  dd      
d<   
|dk(  s|j                  d
i       }|j                  di       }	|	s9
dxx   |	j                  dd      z  cc<   
dxx   |	j                  dd      z  cc<   
dxx   |	j                  dd      z  cc<   
dxx   |	j                  dd      z  cc<   
dxx   dz  cc<   
d   r|j                  d      s|d   
d<    t%        
fdt        D              
d<   
S # t        j                  $ r Y w xY w)Nr   r   )r   modelr   task_idr   r   r   utf-8encodingr   	sessionIdtypeusermessagecontentr,   r      r   	assistantusager   r   cache_creation_input_tokensr   cache_read_input_tokensr   r   r+   c              3   (   K   | ]	  }|     y w)N )r    krs     r"   r#   z parse_session.<locals>.<genexpr>L   s     /QAaD/s   r   )r   fromkeys_TOKupdater   exists	read_text
splitlinesstripjsonloadsJSONDecodeErrorr   r'   TASK_REsearchgroupTEAM_REsum)r)   pathrawobjtyptxtmtmmsgur=   s             @r"   parse_sessionrV   (   sZ   dA.AHH1B2r2Y[jkHl
D;;=~~w~/::< .iik	**S/C 377;#7!+.AlOggfb!&=	2.229bABCY<'..*=%=Q%= wwqz)Y<7>>#+>%>R%>!xx{)[>!$b!9+K'')R(C$A.!QUU>1%==!)*aee4QST.UU*%&!%%0I1*MM&/"aeeOQ&??"/"a'"zcggg&6!$WAgJ;.< /$//AnH3 ## 		s   	I--JJudr+   c                     t         j                  |      }|syd}| j                  dd      |d   z  |z  | j                  dd      |d   z  dz  |z  z   | j                  dd      |d   z  d	z  |z  z   | j                  d
d      |d   z  |z  z   S )Ng        g    .Ar   r   r	   r   g?r   g      ?r   r
   )r   r   )rW   r+   pMs       r"   compute_costr[   P   s    

5AA
~q!AgJ.2
&&$a
(1W:
5
;a
?	@
&&(!
,qz
9D
@1
D	E &&!
$q{
2Q
6	7r(   
glob_pathsledger_pathc                 4   | 3t        j                   t              t        j                   t              z   n2| D cg c]%  }d|v rt        j                   |      n|gD ]  }| ' c}}}i }|D ]b  }t        |      }|d   s|d   xs d}t        D ci c]  }|||   
 }	}|	j                  |t        t        ||      d             |	||d   <   d t        d |j                         D              }
t        |      }t        |j                         d d	
      d d }||
||r|
|z  ndt        t        d |j                         D              d      |D cg c]  \  }}||d   d c}}dt        j                         j                  d      d}t!        |      j"                  j%                  d	d	       t!        |      j'                  t)        j*                  |dd      d       t-        dt        |       d| d|        y c c}}w c c}w c c}}w )N*r,   r+   r      )r+   cost_estimate_usdc              3   &   K   | ]	  }|d      yw)r   Nr;   r    vs     r"   r#   zscan.<locals>.<genexpr>l   s     8Aa8   c                     | d   d   S )Nr5   r   r;   )xs    r"   <lambda>zscan.<locals>.<lambda>n   s    ad>.B r(   T)keyreverse   r   c              3   &   K   | ]	  }|d      yw)ra   Nr;   rc   s     r"   r#   zscan.<locals>.<genexpr>u   s     'W1*=(>'Wre   r   )r,   r   )r   total_tasksavg_tokens_per_tasktotal_cost_usdtop_consumersseconds)timespec)taskssummary	last_scan)parentsexist_okF   ensure_asciiindentr-   r.   zScanned z files, recorded z
 tasks -> )globBOT_GLOB
COKAC_GLOBrV   _EKr@   roundr[   rL   valueslensorteditemsr   now	isoformatr   parentmkdir
write_textrE   dumpsprint)r\   r]   gpffilesrs   smdlr<   entrytotntoprd   ledgers                  r"   scanr   ]   s     			(dii
33$UBr	tyy}PRtUaUaU 

 E $!|j//"%&QAaD&&3%Q8La2PQ#a	l$ 88
8CE
A
$BD
QRTST
UC/03!8a#C'W'W$WYZ[\_`TXTUWX!Q~=NO`
 \\^--y-A
F 	""4$"?  Fq!Q\c d	HSZL 1!J{m
LM7 V ' as   *H	HHc                     t        |       }|j                         r%t        j                  |j	                  d            S i i dS )Nr-   r.   )rs   rt   )r   rA   rE   rF   rB   )r]   rY   s     r"   _loadr      s:    [A89
4::akk7k34dRTacHddr(   r,   c                 <    t        |      d   j                  |       S )Nrs   r   r   )r,   r]   s     r"   get_taskr      s    g&**733r(   c                 8    t        |       j                  di       S )Nrt   r   )r]   s    r"   get_summaryr      s    !!)R00r(   c                    t        |       }|j                  di       j                  dd      }|sg S |j                  di       j                         D cg c]  \  }}|d   |dz  k\  r||d   |d   |z  d! c}}S c c}}w )Nrt   rn   r   rs   r   rx   )r,   r   ratio)r   r   r   )r]   ldavgr<   rd   s        r"   detect_anomalyr      s    	{	B
&&B

#
#$91
=C	 FF7B'--/Aq^a' q'81^CTWZCZ[  s   $A=timers_pathc           	         t        |       }|j                         st        d|         y t        j                  |j                  d            }t        |      j                  di       }d}|j                  di       j                         D ]:  \  }}||v s||   }d}	|	D 
ci c]  }
|
|j                  |
d       c}
|d<   |dz  }< |j                  t        j                  |d	d
      d       t        d| d|         y c c}
w )Nztask-timers.json not found: r-   r.   rs   r   )r   r   r   ra   token_usager5   Frx   ry   z	Enriched z
 tasks in )r   rA   r   rE   rF   rB   r   r   r   r   r   )r   r]   tptimerstlchangedtidtdr   keys2r<   s              r"   enrichr      s    	k	B99;,[M:;ZZg67F	{				,BG::gr*002 R"9CBZE:? @QBFF1aL @B}qLG MM$**V%BWMU	IgYj
67 !As   #Dc                  x   t        j                  d      } | j                  d      }|j                  d       |j                  d      }|j	                  dd	       |j                  d
       |j                  d       |j                  d       | j                         }|j                  dk(  rt                y |j                  dk(  r@t        |j                        }t        |rt        j                  |dd             y d       y |j                  d
k(  r*t        t        j                  t               dd             y |j                  dk(  r*t        t        j                  t               dd             y |j                  dk(  rt                y | j!                          t#        j$                  d       y )NzToken usage tracker)descriptioncmd)destr   r   z--taskT)requiredrt   anomalyr   Frx   ry   z	Not foundr5   )argparseArgumentParseradd_subparsers
add_parseradd_argument
parse_argsr   r   r   taskr   rE   r   r   r   r   
print_helpsysexit)parsersubp_getargsdatas        r"   mainr      s;   $$1FGF


U

+CNN6NN5!E	x$/NN9NN9NN8Dxx6	U			"djjE!<V+V	Y	djjU1EF	Y	djj)aHI	X	r(   __main__)r   N)-__doc__r   r|   rE   osrer   r   pathlibr   typingr   r   environr   r$   __file__resolver   _WORKSPACE_ROOTLEDGER_PATHTIMERS_PATHr}   r~   r   r   float__annotations__compilerH   rK   r?   r   r'   rV   r[   r%   r   r   r   r   r   r   r   __name__r;   r(   r"   <module>r      sQ   L    	 	 
    **..!13tH~7M7M7O7V7V7]7]3^_$'(25HHI$'(25GGHCQ
!%6#&$7+/3!?'S$sEz""# 
 "**%
&
"**p W ]hS hS h%c %d38n %P
T#s(^ 
C 
E 
 ,0K NXd3i( Nc NTX NDes etCH~ e
 /: 4c 4 4htCQTH~>V 4 $/ 1S 14S> 1 '2 	 	d4S>6J 	 *k 8 8 8d 8$4 zF r(   