@@ -11,6 +11,7 @@ import { OpenCodeDataAccess } from '../../vscode-extension/src/opencode';
1111import { CrushDataAccess } from '../../vscode-extension/src/crush' ;
1212import { ContinueDataAccess } from '../../vscode-extension/src/continue' ;
1313import { VisualStudioDataAccess } from '../../vscode-extension/src/visualstudio' ;
14+ import { ClaudeCodeDataAccess } from '../../vscode-extension/src/claudecode' ;
1415import { parseSessionFileContent } from '../../vscode-extension/src/sessionParser' ;
1516import { estimateTokensFromText , getModelFromRequest , isJsonlContent , estimateTokensFromJsonlSession , calculateEstimatedCost , getModelTier } from '../../vscode-extension/src/tokenEstimation' ;
1617import type { DetailedStats , PeriodStats , ModelUsage , EditorUsage , SessionFileCache , UsageAnalysisStats , UsageAnalysisPeriod } from '../../vscode-extension/src/types' ;
@@ -60,15 +61,21 @@ function createVisualStudio(): VisualStudioDataAccess {
6061 return new VisualStudioDataAccess ( ) ;
6162}
6263
64+ /** Create Claude Code data access instance for CLI */
65+ function createClaudeCode ( ) : ClaudeCodeDataAccess {
66+ return new ClaudeCodeDataAccess ( ) ;
67+ }
68+
6369// Module-level singletons so sql.js WASM is only initialised once across all session files
6470const _openCodeInstance = createOpenCode ( ) ;
6571const _crushInstance = createCrush ( ) ;
6672const _continueInstance = createContinue ( ) ;
6773const _visualStudioInstance = createVisualStudio ( ) ;
74+ const _claudeCodeInstance = createClaudeCode ( ) ;
6875
6976/** Create session discovery instance for CLI */
7077function createSessionDiscovery ( ) : SessionDiscovery {
71- return new SessionDiscovery ( { log, warn, error, openCode : _openCodeInstance , crush : _crushInstance , continue_ : _continueInstance , visualStudio : _visualStudioInstance } ) ;
78+ return new SessionDiscovery ( { log, warn, error, openCode : _openCodeInstance , crush : _crushInstance , continue_ : _continueInstance , visualStudio : _visualStudioInstance , claudeCode : _claudeCodeInstance } ) ;
7279}
7380
7481/** Discover all session files on this machine */
@@ -136,6 +143,7 @@ function getEditorSourceFromPath(filePath: string): string {
136143 if ( normalized . includes ( '/.copilot/' ) ) { return 'copilot-cli' ; }
137144 if ( normalized . includes ( '/.crush/crush.db#' ) ) { return 'crush' ; }
138145 if ( normalized . includes ( '/opencode/' ) ) { return 'opencode' ; }
146+ if ( normalized . includes ( '/.claude/projects/' ) ) { return 'claude-code' ; }
139147 if ( normalized . includes ( '.vscode-server' ) ) { return 'vscode-remote' ; }
140148 if ( normalized . includes ( '/.vs/' ) && normalized . includes ( '/copilot-chat/' ) ) { return 'Visual Studio' ; }
141149 return 'vscode' ;
@@ -219,6 +227,24 @@ const crushResult: SessionData = {
219227 return vsResult ;
220228 }
221229
230+ // Handle Claude Code sessions (JSONL with actual Anthropic API token counts)
231+ if ( _claudeCodeInstance . isClaudeCodeSessionFile ( filePath ) ) {
232+ const result = _claudeCodeInstance . getTokensFromClaudeCodeSession ( filePath ) ;
233+ const interactions = _claudeCodeInstance . countClaudeCodeInteractions ( filePath ) ;
234+ const modelUsage = _claudeCodeInstance . getClaudeCodeModelUsage ( filePath ) ;
235+ const claudeResult : SessionData = {
236+ file : filePath ,
237+ tokens : result . tokens ,
238+ thinkingTokens : result . thinkingTokens ,
239+ interactions,
240+ modelUsage,
241+ lastModified : stats . mtime ,
242+ editorSource : getEditorSourceFromPath ( filePath ) ,
243+ } ;
244+ setCached ( filePath , stats . mtimeMs , stats . size , claudeResult ) ;
245+ return claudeResult ;
246+ }
247+
222248 const content = await fs . promises . readFile ( filePath , 'utf-8' ) ;
223249
224250 if ( ! content . trim ( ) ) {
@@ -411,6 +437,7 @@ export async function calculateUsageAnalysisStats(sessionFiles: string[]): Promi
411437 crush : _crushInstance ,
412438 continue_ : _continueInstance ,
413439 visualStudio : _visualStudioInstance ,
440+ claudeCode : _claudeCodeInstance ,
414441 tokenEstimators,
415442 modelPricing,
416443 toolNameMap,
0 commit comments