ccusage
Version:
Usage analysis tool for Claude Code
471 lines (469 loc) • 15.4 kB
TypeScript
import { CostMode, PricingFetcher, SortOrder } from "./pricing-fetcher-BZe7AafW.js";
import { z } from "zod";
//#region src/_session-blocks.d.ts
/**
* Represents a single usage data entry loaded from JSONL files
*/
type LoadedUsageEntry = {
timestamp: Date;
usage: {
inputTokens: number;
outputTokens: number;
cacheCreationInputTokens: number;
cacheReadInputTokens: number;
};
costUSD: number | null;
model: string;
version?: string;
};
/**
* Aggregated token counts for different token types
*/
type TokenCounts = {
inputTokens: number;
outputTokens: number;
cacheCreationInputTokens: number;
cacheReadInputTokens: number;
};
/**
* Represents a session block (typically 5-hour billing period) with usage data
*/
type SessionBlock = {
id: string; // ISO string of block start time
startTime: Date;
endTime: Date; // startTime + 5 hours (for normal blocks) or gap end time (for gap blocks)
actualEndTime?: Date; // Last activity in block
isActive: boolean;
isGap?: boolean; // True if this is a gap block
entries: LoadedUsageEntry[];
tokenCounts: TokenCounts;
costUSD: number;
models: string[];
};
/**
* Represents usage burn rate calculations
*/
//#endregion
//#region src/data-loader.d.ts
/**
* Get all Claude data directories to search for usage data
* Supports multiple paths: environment variable (comma-separated), new default, and old default
* @returns Array of valid Claude data directory paths
*/
declare function getClaudePaths(): string[];
/**
* Default path for Claude data directory
* Uses environment variable CLAUDE_CONFIG_DIR if set, otherwise defaults to ~/.claude
* @deprecated Use getClaudePaths() instead for multiple path support
*/
declare function getDefaultClaudePath(): string;
/**
* Zod schema for validating Claude usage data from JSONL files
*/
declare const usageDataSchema: z.ZodObject<{
timestamp: z.ZodBranded<z.ZodString, "ISOTimestamp">;
version: z.ZodOptional<z.ZodBranded<z.ZodString, "Version">>;
message: z.ZodObject<{
usage: z.ZodObject<{
input_tokens: z.ZodNumber;
output_tokens: z.ZodNumber;
cache_creation_input_tokens: z.ZodOptional<z.ZodNumber>;
cache_read_input_tokens: z.ZodOptional<z.ZodNumber>;
}, "strip", z.ZodTypeAny, {
input_tokens: number;
output_tokens: number;
cache_creation_input_tokens?: number | undefined;
cache_read_input_tokens?: number | undefined;
}, {
input_tokens: number;
output_tokens: number;
cache_creation_input_tokens?: number | undefined;
cache_read_input_tokens?: number | undefined;
}>;
model: z.ZodOptional<z.ZodBranded<z.ZodString, "ModelName">>;
id: z.ZodOptional<z.ZodBranded<z.ZodString, "MessageId">>;
}, "strip", z.ZodTypeAny, {
usage: {
input_tokens: number;
output_tokens: number;
cache_creation_input_tokens?: number | undefined;
cache_read_input_tokens?: number | undefined;
};
model?: (string & z.BRAND<"ModelName">) | undefined;
id?: (string & z.BRAND<"MessageId">) | undefined;
}, {
usage: {
input_tokens: number;
output_tokens: number;
cache_creation_input_tokens?: number | undefined;
cache_read_input_tokens?: number | undefined;
};
model?: string | undefined;
id?: string | undefined;
}>;
costUSD: z.ZodOptional<z.ZodNumber>;
requestId: z.ZodOptional<z.ZodBranded<z.ZodString, "RequestId">>;
}, "strip", z.ZodTypeAny, {
timestamp: string & z.BRAND<"ISOTimestamp">;
version?: (string & z.BRAND<"Version">) | undefined;
message: {
usage: {
input_tokens: number;
output_tokens: number;
cache_creation_input_tokens?: number | undefined;
cache_read_input_tokens?: number | undefined;
};
model?: (string & z.BRAND<"ModelName">) | undefined;
id?: (string & z.BRAND<"MessageId">) | undefined;
};
costUSD?: number | undefined;
requestId?: (string & z.BRAND<"RequestId">) | undefined;
}, {
timestamp: string;
version?: string | undefined;
message: {
usage: {
input_tokens: number;
output_tokens: number;
cache_creation_input_tokens?: number | undefined;
cache_read_input_tokens?: number | undefined;
};
model?: string | undefined;
id?: string | undefined;
};
costUSD?: number | undefined;
requestId?: string | undefined;
}>;
/**
* Type definition for Claude usage data entries from JSONL files
*/
type UsageData = z.infer<typeof usageDataSchema>;
/**
* Zod schema for model-specific usage breakdown data
*/
declare const modelBreakdownSchema: z.ZodObject<{
modelName: z.ZodBranded<z.ZodString, "ModelName">;
inputTokens: z.ZodNumber;
outputTokens: z.ZodNumber;
cacheCreationTokens: z.ZodNumber;
cacheReadTokens: z.ZodNumber;
cost: z.ZodNumber;
}, "strip", z.ZodTypeAny, {
modelName: string & z.BRAND<"ModelName">;
inputTokens: number;
outputTokens: number;
cacheCreationTokens: number;
cacheReadTokens: number;
cost: number;
}, {
modelName: string;
inputTokens: number;
outputTokens: number;
cacheCreationTokens: number;
cacheReadTokens: number;
cost: number;
}>;
/**
* Type definition for model-specific usage breakdown
*/
type ModelBreakdown = z.infer<typeof modelBreakdownSchema>;
/**
* Zod schema for daily usage aggregation data
*/
declare const dailyUsageSchema: z.ZodObject<{
date: z.ZodBranded<z.ZodString, "DailyDate">;
inputTokens: z.ZodNumber;
outputTokens: z.ZodNumber;
cacheCreationTokens: z.ZodNumber;
cacheReadTokens: z.ZodNumber;
totalCost: z.ZodNumber;
modelsUsed: z.ZodArray<z.ZodBranded<z.ZodString, "ModelName">, "many">;
modelBreakdowns: z.ZodArray<z.ZodObject<{
modelName: z.ZodBranded<z.ZodString, "ModelName">;
inputTokens: z.ZodNumber;
outputTokens: z.ZodNumber;
cacheCreationTokens: z.ZodNumber;
cacheReadTokens: z.ZodNumber;
cost: z.ZodNumber;
}, "strip", z.ZodTypeAny, {
modelName: string & z.BRAND<"ModelName">;
inputTokens: number;
outputTokens: number;
cacheCreationTokens: number;
cacheReadTokens: number;
cost: number;
}, {
modelName: string;
inputTokens: number;
outputTokens: number;
cacheCreationTokens: number;
cacheReadTokens: number;
cost: number;
}>, "many">;
}, "strip", z.ZodTypeAny, {
date: string & z.BRAND<"DailyDate">;
inputTokens: number;
outputTokens: number;
cacheCreationTokens: number;
cacheReadTokens: number;
totalCost: number;
modelsUsed: (string & z.BRAND<"ModelName">)[];
modelBreakdowns: {
modelName: string & z.BRAND<"ModelName">;
inputTokens: number;
outputTokens: number;
cacheCreationTokens: number;
cacheReadTokens: number;
cost: number;
}[];
}, {
date: string;
inputTokens: number;
outputTokens: number;
cacheCreationTokens: number;
cacheReadTokens: number;
totalCost: number;
modelsUsed: string[];
modelBreakdowns: {
modelName: string;
inputTokens: number;
outputTokens: number;
cacheCreationTokens: number;
cacheReadTokens: number;
cost: number;
}[];
}>;
/**
* Type definition for daily usage aggregation
*/
type DailyUsage = z.infer<typeof dailyUsageSchema>;
/**
* Zod schema for session-based usage aggregation data
*/
declare const sessionUsageSchema: z.ZodObject<{
sessionId: z.ZodBranded<z.ZodString, "SessionId">;
projectPath: z.ZodBranded<z.ZodString, "ProjectPath">;
inputTokens: z.ZodNumber;
outputTokens: z.ZodNumber;
cacheCreationTokens: z.ZodNumber;
cacheReadTokens: z.ZodNumber;
totalCost: z.ZodNumber;
lastActivity: z.ZodBranded<z.ZodString, "ActivityDate">;
versions: z.ZodArray<z.ZodBranded<z.ZodString, "Version">, "many">;
modelsUsed: z.ZodArray<z.ZodBranded<z.ZodString, "ModelName">, "many">;
modelBreakdowns: z.ZodArray<z.ZodObject<{
modelName: z.ZodBranded<z.ZodString, "ModelName">;
inputTokens: z.ZodNumber;
outputTokens: z.ZodNumber;
cacheCreationTokens: z.ZodNumber;
cacheReadTokens: z.ZodNumber;
cost: z.ZodNumber;
}, "strip", z.ZodTypeAny, {
modelName: string & z.BRAND<"ModelName">;
inputTokens: number;
outputTokens: number;
cacheCreationTokens: number;
cacheReadTokens: number;
cost: number;
}, {
modelName: string;
inputTokens: number;
outputTokens: number;
cacheCreationTokens: number;
cacheReadTokens: number;
cost: number;
}>, "many">;
}, "strip", z.ZodTypeAny, {
sessionId: string & z.BRAND<"SessionId">;
projectPath: string & z.BRAND<"ProjectPath">;
inputTokens: number;
outputTokens: number;
cacheCreationTokens: number;
cacheReadTokens: number;
totalCost: number;
lastActivity: string & z.BRAND<"ActivityDate">;
versions: (string & z.BRAND<"Version">)[];
modelsUsed: (string & z.BRAND<"ModelName">)[];
modelBreakdowns: {
modelName: string & z.BRAND<"ModelName">;
inputTokens: number;
outputTokens: number;
cacheCreationTokens: number;
cacheReadTokens: number;
cost: number;
}[];
}, {
sessionId: string;
projectPath: string;
inputTokens: number;
outputTokens: number;
cacheCreationTokens: number;
cacheReadTokens: number;
totalCost: number;
lastActivity: string;
versions: string[];
modelsUsed: string[];
modelBreakdowns: {
modelName: string;
inputTokens: number;
outputTokens: number;
cacheCreationTokens: number;
cacheReadTokens: number;
cost: number;
}[];
}>;
/**
* Type definition for session-based usage aggregation
*/
type SessionUsage = z.infer<typeof sessionUsageSchema>;
/**
* Zod schema for monthly usage aggregation data
*/
declare const monthlyUsageSchema: z.ZodObject<{
month: z.ZodBranded<z.ZodString, "MonthlyDate">;
inputTokens: z.ZodNumber;
outputTokens: z.ZodNumber;
cacheCreationTokens: z.ZodNumber;
cacheReadTokens: z.ZodNumber;
totalCost: z.ZodNumber;
modelsUsed: z.ZodArray<z.ZodBranded<z.ZodString, "ModelName">, "many">;
modelBreakdowns: z.ZodArray<z.ZodObject<{
modelName: z.ZodBranded<z.ZodString, "ModelName">;
inputTokens: z.ZodNumber;
outputTokens: z.ZodNumber;
cacheCreationTokens: z.ZodNumber;
cacheReadTokens: z.ZodNumber;
cost: z.ZodNumber;
}, "strip", z.ZodTypeAny, {
modelName: string & z.BRAND<"ModelName">;
inputTokens: number;
outputTokens: number;
cacheCreationTokens: number;
cacheReadTokens: number;
cost: number;
}, {
modelName: string;
inputTokens: number;
outputTokens: number;
cacheCreationTokens: number;
cacheReadTokens: number;
cost: number;
}>, "many">;
}, "strip", z.ZodTypeAny, {
month: string & z.BRAND<"MonthlyDate">;
inputTokens: number;
outputTokens: number;
cacheCreationTokens: number;
cacheReadTokens: number;
totalCost: number;
modelsUsed: (string & z.BRAND<"ModelName">)[];
modelBreakdowns: {
modelName: string & z.BRAND<"ModelName">;
inputTokens: number;
outputTokens: number;
cacheCreationTokens: number;
cacheReadTokens: number;
cost: number;
}[];
}, {
month: string;
inputTokens: number;
outputTokens: number;
cacheCreationTokens: number;
cacheReadTokens: number;
totalCost: number;
modelsUsed: string[];
modelBreakdowns: {
modelName: string;
inputTokens: number;
outputTokens: number;
cacheCreationTokens: number;
cacheReadTokens: number;
cost: number;
}[];
}>;
/**
* Type definition for monthly usage aggregation
*/
type MonthlyUsage = z.infer<typeof monthlyUsageSchema>;
/**
* Formats a date string to YYYY-MM-DD format
* @param dateStr - Input date string
* @returns Formatted date string in YYYY-MM-DD format
*/
declare function formatDate(dateStr: string): string;
/**
* Formats a date string to compact format with year on first line and month-day on second
* @param dateStr - Input date string
* @returns Formatted date string with newline separator (YYYY\nMM-DD)
*/
declare function formatDateCompact(dateStr: string): string;
/**
* Create a unique identifier for deduplication using message ID and request ID
*/
declare function createUniqueHash(data: UsageData): string | null;
/**
* Extract the earliest timestamp from a JSONL file
* Scans through the file until it finds a valid timestamp
*/
declare function getEarliestTimestamp(filePath: string): Promise<Date | null>;
/**
* Sort files by their earliest timestamp
* Files without valid timestamps are placed at the end
*/
declare function sortFilesByTimestamp(files: string[]): Promise<string[]>;
/**
* Calculates cost for a single usage data entry based on the specified cost calculation mode
* @param data - Usage data entry
* @param mode - Cost calculation mode (auto, calculate, or display)
* @param fetcher - Pricing fetcher instance for calculating costs from tokens
* @returns Calculated cost in USD
*/
declare function calculateCostForEntry(data: UsageData, mode: CostMode, fetcher: PricingFetcher): Promise<number>;
/**
* Date range filter for limiting usage data by date
*/
type DateFilter = {
since?: string; // YYYYMMDD format
until?: string; // YYYYMMDD format
};
/**
* Configuration options for loading usage data
*/
type LoadOptions = {
claudePath?: string; // Custom path to Claude data directory
mode?: CostMode; // Cost calculation mode
order?: SortOrder; // Sort order for dates
offline?: boolean; // Use offline mode for pricing
sessionDurationHours?: number; // Session block duration in hours
} & DateFilter;
/**
* Loads and aggregates Claude usage data by day
* Processes all JSONL files in the Claude projects directory and groups usage by date
* @param options - Optional configuration for loading and filtering data
* @returns Array of daily usage summaries sorted by date
*/
declare function loadDailyUsageData(options?: LoadOptions): Promise<DailyUsage[]>;
/**
* Loads and aggregates Claude usage data by session
* Groups usage data by project path and session ID based on file structure
* @param options - Optional configuration for loading and filtering data
* @returns Array of session usage summaries sorted by last activity
*/
declare function loadSessionData(options?: LoadOptions): Promise<SessionUsage[]>;
/**
* Loads and aggregates Claude usage data by month
* Uses daily usage data as the source and groups by month
* @param options - Optional configuration for loading and filtering data
* @returns Array of monthly usage summaries sorted by month
*/
declare function loadMonthlyUsageData(options?: LoadOptions): Promise<MonthlyUsage[]>;
/**
* Loads usage data and organizes it into session blocks (typically 5-hour billing periods)
* Processes all usage data and groups it into time-based blocks for billing analysis
* @param options - Optional configuration including session duration and filtering
* @returns Array of session blocks with usage and cost information
*/
declare function loadSessionBlockData(options?: LoadOptions): Promise<SessionBlock[]>;
//#endregion
export { DailyUsage, DateFilter, LoadOptions, ModelBreakdown, MonthlyUsage, SessionUsage, UsageData, calculateCostForEntry, createUniqueHash, dailyUsageSchema, formatDate, formatDateCompact, getClaudePaths, getDefaultClaudePath, getEarliestTimestamp, loadDailyUsageData, loadMonthlyUsageData, loadSessionBlockData, loadSessionData, modelBreakdownSchema, monthlyUsageSchema, sessionUsageSchema, sortFilesByTimestamp, usageDataSchema };