
    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dgZ!e"e#eef      ed<   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-d0d.Z.e/d/k(  r e.        yy)1zFToken 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cwd_projectmcp_used)z/home/jay/projects/InsuRoInsuRo)z/home/jay/projects/insuwikiinsuwiki_CWD_PROJECTS)zcode-review-graph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-2514-dev3/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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   s|j                  dd      d<   d   st$        D ]  \  }}	||v s|	d<    n d   r,t&        D ]  }
|
|v sdd<    B E|dk(  sL|j                  di       }|j                  dd      }t        |      }d   st$        D ]  \  }}	||v s|	d<    n d   st&        D ]  }
|
|v sdd<    n d   sjt)        |t*              rZ|D ]U  }t)        |t               r<|j                  d	      dk(  r(|j                  dd      }t&        D ]  }
|
|v sdd<    n d   sU n |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!   F)	r   modelr   task_idr   r   r   r   r   utf-8encodingr   	sessionIdtypeusermessagecontentr1   r      r   r   r   T	assistanttool_usenameusager   r   cache_creation_input_tokensr   cache_read_input_tokensr   r   r0   c              3   (   K   | ]	  }|     y w)N )r%   krs     r'   r(   z parse_session.<locals>.<genexpr>{   s     /QAaD/s   r   )r#   fromkeys_TOKupdater   exists	read_text
splitlinesstripjsonloadsJSONDecodeErrorr$   r,   TASK_REsearchgroupTEAM_REr   _MCP_TOOL_MARKERSr"   r*   sum)r.   pathrawobjtyptxtmtmpath_prefixslugmarkermsgr9   txt_aitemr=   urD   s                    @r'   parse_sessionrc   -   s   dA.AHH  
 
D;;=~~w~/::< =.iik	**S/C 377;#7!+.AlOggfb!&=	2.229bABCY<'..*=%=Q%= wwqz)Y<7>>#+>%>R%>!xx{)[>!$b!9+]#)6 %K"c)+/-( Z=/ F}(,* K'')R(Cggi,G'NE]#)6 %K"e++/-( Z=/ F(,* Z=Z%># D!$-$((62Bj2P#xx3&7 &F%~04* %& } $A.!QUU>1%==!)*aee4QST.UU*%&!%%0I1*MM&/"aeeOQ&??"/"a'"zcggg&6!$WAgJ{=.| /$//AnHs ## 		s   M//NNudr0   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$   )rd   r0   pMs       r'   compute_costrh      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*r1   r0   r      )r0   cost_estimate_usdc              3   &   K   | ]	  }|d      yw)r   NrB   r%   vs     r'   r(   zscan.<locals>.<genexpr>   s     8Aa8   c                     | d   d   S )Nr:   r   rB   )xs    r'   <lambda>zscan.<locals>.<lambda>   s    ad>.B r-   T)keyreverse   r   c              3   &   K   | ]	  }|d      yw)rn   NrB   rp   s     r'   r(   zscan.<locals>.<genexpr>   s     'W1*=(>'Wrr   r   )r1   r   )r   total_tasksavg_tokens_per_tasktotal_cost_usdtop_consumersseconds)timespec)taskssummary	last_scan)parentsexist_okF   ensure_asciiindentr2   r3   zScanned z files, recorded z
 tasks -> )globBOT_GLOB
COKAC_GLOBrc   _EKrG   roundrh   rT   valueslensorteditemsr   now	isoformatr   parentmkdir
write_textrL   dumpsprint)ri   rj   gpffilesr   smdlrC   entrytotntoprq   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 )Nr2   r3   )r   r   )r   rH   rL   rM   rI   )rj   rf   s     r'   _loadr      s:    [A89
4::akk7k34dRTacHddr-   r1   c                 <    t        |      d   j                  |       S )Nr   r   r$   )r1   rj   s     r'   get_taskr      s    g&**733r-   c                 8    t        |       j                  di       S )Nr   r   )rj   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 )Nr   r{   r   r   r   r   )r1   r   ratio)r   r$   r   )rj   ldavgrC   rq   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<   |j                  d      r|d   |d   d<   |j                  d	      r|d	   |d	<   |j                  d
d      |d
<   |dz  } |j                  t        j                  |dd      d       t        d| d|         y c c}
w )Nztask-timers.json not found: r2   r3   r   r   )r   r   r   r   r   rn   token_usager0   r   r   Fr:   r   r   z	Enriched z
 tasks in )r   rH   r   rL   rM   rI   r   r$   r   r   r   )r   rj   tptimerstlchangedtidtdr   keys2rC   s              r'   enrichr      sQ   	k	B99;,[M:;ZZg67F	{				,BG::gr*002 R"9CBE ;@ @QBFF1aL @B}vvg-/[=!'*vvm$$&}$5=!VVJ6BzNqLG#$ MM$**V%BWMU	IgYj
67 !As   #E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)requiredr   anomalyr   Fr   r   z	Not foundr:   )argparseArgumentParseradd_subparsers
add_parseradd_argument
parse_argsr   r   r   taskr   rL   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)0__doc__r   r   rL   osrer   r   pathlibr   typingr   r   environr$   r)   __file__resolver   _WORKSPACE_ROOTLEDGER_PATHTIMERS_PATHr   r   r   r#   float__annotations__compilerO   rR   rF   r   r   r*   tuplerS   r,   rc   rh   r   r   r   r   r   r   r   __name__rB   r-   r'   <module>r      s   L    	 	 
    **..!13tH~7M7M7O7V7V7]7]3^_$'(25HHI$'(25GGHCQ
!%6#&$7+/3!?'S$sEz""# 
 "***
+
"**p W x ,/(tE#s(O$  + hS hS hOc Od38n Od
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-   