ccreport 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,127 @@
1
+ # ccreport
2
+
3
+ Claude Code usage reporter - View official usage stats and OpenTelemetry metrics from the command line.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install -g ccreport
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```bash
14
+ # Show both official API and OTel data (default)
15
+ ccreport
16
+
17
+ # Show official usage only (same as Claude Code /usage)
18
+ ccreport usage
19
+
20
+ # Show cost report
21
+ ccreport cost
22
+
23
+ # JSON output
24
+ ccreport --json
25
+
26
+ # Verbose mode
27
+ ccreport -v
28
+
29
+ # Help
30
+ ccreport --help
31
+ ```
32
+
33
+ ## Output Example
34
+
35
+ ```
36
+ 📊 Claude Code Usage (Official API)
37
+ ────────────────────────────────────────
38
+
39
+ Session (5h): 71% used
40
+ Resets at: 5:00pm (Asia/Saigon)
41
+
42
+ Weekly (1W): 74% used
43
+ Resets at: Feb 5, 12:00pm (Asia/Saigon)
44
+
45
+ 📡 Data source: Official Anthropic API
46
+
47
+ 📊 OpenTelemetry Metrics
48
+ ────────────────────────────────────────
49
+
50
+ Sessions: 5
51
+ Total Tokens: 1.2M
52
+ Total Cost: $0.5432
53
+ Active Time: 120.5s
54
+ API Requests: 23
55
+
56
+ 🔢 Token Breakdown
57
+ Input: 500K
58
+ Output: 200K
59
+ Cache Read: 400K
60
+ Cache Create: 100K
61
+
62
+ 💰 Cost by Model
63
+ claude-sonnet-4-20250514: $0.5432
64
+
65
+ 📅 Collected: 2026-02-04T10:00:00Z
66
+ ```
67
+
68
+ ## Data Sources
69
+
70
+ ### Official API
71
+ - Requires Claude Code login
72
+ - Shows exact usage percentage (matches `/usage` command)
73
+ - Includes reset times
74
+
75
+ ### OpenTelemetry (OTel)
76
+ - Requires OTel collector setup
77
+ - Shows detailed token breakdown
78
+ - Shows cost by model
79
+ - Works offline
80
+
81
+ ## Environment Variables
82
+
83
+ | Variable | Description | Default |
84
+ |----------|-------------|---------|
85
+ | `OTEL_DATA_DIR` | OTel data directory | `~/.claude-otel/data` |
86
+ | `SYNC_API_URL` | Dashboard sync API URL | (public dashboard) |
87
+ | `SYNC_USER_ID` | User ID for sync | `$USER` |
88
+
89
+ ## OpenTelemetry Setup
90
+
91
+ To collect OTel metrics from Claude Code:
92
+
93
+ 1. Create OTel data directory:
94
+ ```bash
95
+ mkdir -p ~/.claude-otel/data
96
+ ```
97
+
98
+ 2. Start OTel collector (example with Docker):
99
+ ```bash
100
+ # See: https://github.com/ippei-matsuda/token-usage-dashboard/tree/main/otel
101
+ ```
102
+
103
+ 3. Run Claude Code with OTel environment variables:
104
+ ```bash
105
+ OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 claude
106
+ ```
107
+
108
+ ## Commands
109
+
110
+ | Command | Description |
111
+ |---------|-------------|
112
+ | `ccreport` | Show official API + OTel data |
113
+ | `ccreport usage` | Show official API only |
114
+ | `ccreport usage --push` | Sync official data to dashboard |
115
+ | `ccreport push` | Sync OTel data to dashboard |
116
+ | `ccreport cost` | Show cost report |
117
+ | `ccreport legacy` | Legacy mode (JSONL parsing) |
118
+
119
+ ## Requirements
120
+
121
+ - Node.js >= 18.0.0
122
+ - Claude Code login (for official API)
123
+ - OTel collector (optional, for detailed metrics)
124
+
125
+ ## License
126
+
127
+ MIT
@@ -0,0 +1,83 @@
1
+ export type Usage = {
2
+ input_tokens?: number;
3
+ output_tokens?: number;
4
+ cache_creation_input_tokens?: number;
5
+ cache_read_input_tokens?: number;
6
+ };
7
+ export type Entry = {
8
+ timestamp?: string;
9
+ requestId?: string;
10
+ message?: {
11
+ timestamp?: string;
12
+ model?: string;
13
+ usage?: Usage;
14
+ id?: string;
15
+ };
16
+ model?: string;
17
+ usage?: Usage;
18
+ };
19
+ export type EntryWithTimestamp = Entry & {
20
+ _ts: number;
21
+ };
22
+ export type SessionBlock = {
23
+ startTime: number;
24
+ endTime: number;
25
+ entries: EntryWithTimestamp[];
26
+ };
27
+ export type UsageResult = {
28
+ inputTokens: number;
29
+ outputTokens: number;
30
+ cacheCreationTokens: number;
31
+ cacheReadTokens: number;
32
+ totalTokens: number;
33
+ };
34
+ export type ActiveBlockResult = UsageResult & {
35
+ blockStartTime: Date | null;
36
+ blockEndTime: Date | null;
37
+ elapsedMinutes: number;
38
+ remainingMinutes: number;
39
+ };
40
+ export type ModelStats = {
41
+ inputTokens: number;
42
+ outputTokens: number;
43
+ cacheCreationTokens: number;
44
+ cacheReadTokens: number;
45
+ count: number;
46
+ };
47
+ export type DateStats = {
48
+ inputTokens: number;
49
+ outputTokens: number;
50
+ cacheCreationTokens: number;
51
+ cacheReadTokens: number;
52
+ count: number;
53
+ };
54
+ export type AggregatedUsage = {
55
+ summary: {
56
+ totalInputTokens: number;
57
+ totalOutputTokens: number;
58
+ totalTokens: number;
59
+ cacheCreationInputTokens: number;
60
+ cacheReadInputTokens: number;
61
+ messageCount: number;
62
+ };
63
+ rollingSession: ActiveBlockResult;
64
+ activeBlock: ActiveBlockResult;
65
+ limits: {
66
+ last5Hours: UsageResult;
67
+ last24Hours: UsageResult;
68
+ lastWeek: UsageResult;
69
+ };
70
+ byModel: Record<string, ModelStats>;
71
+ byDate: Record<string, DateStats>;
72
+ };
73
+ export declare function identifySessionBlocks(entries: Entry[], sessionDurationHours?: number): SessionBlock[];
74
+ export declare function calculateActiveBlockUsage(entries: Entry[], now?: Date): ActiveBlockResult;
75
+ export declare function calculateRollingSessionUsage(entries: Entry[], now?: Date): ActiveBlockResult;
76
+ export declare function calculateUsageForPeriod(entries: Entry[], hoursAgo: number, now?: Date): UsageResult;
77
+ export declare function getLastWeeklyReset(now?: Date): Date;
78
+ export declare function getNextWeeklyReset(now?: Date): Date;
79
+ export declare function getSessionResetTime(now?: Date): Date;
80
+ export declare function aggregateUsage(entries: Entry[], now?: Date): AggregatedUsage;
81
+ export declare function percent(used: number, limit: number): number;
82
+ export declare function formatTokens(n: number): string;
83
+ //# sourceMappingURL=calculations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculations.d.ts","sourceRoot":"","sources":["../src/calculations.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,KAAK,GAAG;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,2BAA2B,CAAC,EAAE,MAAM,CAAA;IACpC,uBAAuB,CAAC,EAAE,MAAM,CAAA;CACjC,CAAA;AAED,MAAM,MAAM,KAAK,GAAG;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,KAAK,CAAC,EAAE,KAAK,CAAA;QACb,EAAE,CAAC,EAAE,MAAM,CAAA;KACZ,CAAA;IACD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAuBD,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAA;AAExD,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,kBAAkB,EAAE,CAAA;CAC9B,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,eAAe,EAAE,MAAM,CAAA;IACvB,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG;IAC5C,cAAc,EAAE,IAAI,GAAG,IAAI,CAAA;IAC3B,YAAY,EAAE,IAAI,GAAG,IAAI,CAAA;IACzB,cAAc,EAAE,MAAM,CAAA;IACtB,gBAAgB,EAAE,MAAM,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,eAAe,EAAE,MAAM,CAAA;IACvB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,eAAe,EAAE,MAAM,CAAA;IACvB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE;QACP,gBAAgB,EAAE,MAAM,CAAA;QACxB,iBAAiB,EAAE,MAAM,CAAA;QACzB,WAAW,EAAE,MAAM,CAAA;QACnB,wBAAwB,EAAE,MAAM,CAAA;QAChC,oBAAoB,EAAE,MAAM,CAAA;QAC5B,YAAY,EAAE,MAAM,CAAA;KACrB,CAAA;IAED,cAAc,EAAE,iBAAiB,CAAA;IAEjC,WAAW,EAAE,iBAAiB,CAAA;IAC9B,MAAM,EAAE;QACN,UAAU,EAAE,WAAW,CAAA;QACvB,WAAW,EAAE,WAAW,CAAA;QACxB,QAAQ,EAAE,WAAW,CAAA;KACtB,CAAA;IACD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IACnC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;CAClC,CAAA;AAeD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,KAAK,EAAE,EAChB,oBAAoB,SAAI,GACvB,YAAY,EAAE,CA4ChB;AAGD,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,KAAK,EAAE,EAChB,GAAG,OAAa,GACf,iBAAiB,CA+DnB;AAGD,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,KAAK,EAAE,EAChB,GAAG,OAAa,GACf,iBAAiB,CAmEnB;AAGD,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,KAAK,EAAE,EAChB,QAAQ,EAAE,MAAM,EAChB,GAAG,OAAa,GACf,WAAW,CA2Cb;AAKD,wBAAgB,kBAAkB,CAAC,GAAG,OAAa,GAAG,IAAI,CAgBzD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,OAAa,GAAG,IAAI,CAKzD;AAGD,wBAAgB,mBAAmB,CAAC,GAAG,OAAa,GAAG,IAAI,CAM1D;AAkDD,wBAAgB,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,OAAa,GAAG,eAAe,CAmGlF;AAGD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG3D;AAGD,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAI9C"}
@@ -0,0 +1,378 @@
1
+ // requestIdで重複除去(最初のエントリを使用)
2
+ function deduplicateByRequestId(entries) {
3
+ const seen = new Set();
4
+ const result = [];
5
+ for (const entry of entries) {
6
+ const reqId = entry.requestId || entry.message?.id;
7
+ if (reqId) {
8
+ if (!seen.has(reqId)) {
9
+ seen.add(reqId);
10
+ result.push(entry);
11
+ }
12
+ }
13
+ else {
14
+ // requestIdがない場合はそのまま追加
15
+ result.push(entry);
16
+ }
17
+ }
18
+ return result;
19
+ }
20
+ // トークン合計計算(ccusage準拠)
21
+ // すべてのトークンを1.0倍で計算
22
+ function calculateTotalTokens(inputTokens, outputTokens, cacheCreationTokens, cacheReadTokens) {
23
+ return inputTokens + outputTokens + cacheCreationTokens + cacheReadTokens;
24
+ }
25
+ // セッションブロックを特定する
26
+ // Claude Codeは5時間ブロック方式: セッション開始から5時間でリセット
27
+ export function identifySessionBlocks(entries, sessionDurationHours = 5) {
28
+ // タイムスタンプでソート
29
+ const sorted = entries
30
+ .filter((e) => !!(e.timestamp || e.message?.timestamp))
31
+ .map((e) => ({
32
+ ...e,
33
+ _ts: new Date(e.timestamp || e.message?.timestamp || '').getTime(),
34
+ }))
35
+ .sort((a, b) => a._ts - b._ts);
36
+ const blocks = [];
37
+ let currentBlock = null;
38
+ for (const entry of sorted) {
39
+ const entryTime = entry._ts;
40
+ if (!currentBlock) {
41
+ // 最初のブロック開始
42
+ currentBlock = {
43
+ startTime: entryTime,
44
+ endTime: entryTime + sessionDurationHours * 60 * 60 * 1000,
45
+ entries: [entry],
46
+ };
47
+ }
48
+ else if (entryTime <= currentBlock.endTime) {
49
+ // 現在のブロック内
50
+ currentBlock.entries.push(entry);
51
+ }
52
+ else {
53
+ // 新しいブロック開始
54
+ blocks.push(currentBlock);
55
+ currentBlock = {
56
+ startTime: entryTime,
57
+ endTime: entryTime + sessionDurationHours * 60 * 60 * 1000,
58
+ entries: [entry],
59
+ };
60
+ }
61
+ }
62
+ if (currentBlock) {
63
+ blocks.push(currentBlock);
64
+ }
65
+ return blocks;
66
+ }
67
+ // 現在のアクティブブロックの使用量を計算(ブロック方式)
68
+ export function calculateActiveBlockUsage(entries, now = new Date()) {
69
+ const blocks = identifySessionBlocks(entries, 5);
70
+ const nowTime = now.getTime();
71
+ // アクティブブロックを探す(現在時刻がブロックの終了時刻前)
72
+ const activeBlock = blocks.find((b) => nowTime <= b.endTime && nowTime >= b.startTime);
73
+ if (!activeBlock) {
74
+ // アクティブブロックがない場合は0を返す
75
+ return {
76
+ inputTokens: 0,
77
+ outputTokens: 0,
78
+ cacheCreationTokens: 0,
79
+ cacheReadTokens: 0,
80
+ totalTokens: 0,
81
+ blockStartTime: null,
82
+ blockEndTime: null,
83
+ elapsedMinutes: 0,
84
+ remainingMinutes: 0,
85
+ };
86
+ }
87
+ // requestIdで重複除去
88
+ const dedupedEntries = deduplicateByRequestId(activeBlock.entries);
89
+ let inputTokens = 0;
90
+ let outputTokens = 0;
91
+ let cacheCreationTokens = 0;
92
+ let cacheReadTokens = 0;
93
+ for (const entry of dedupedEntries) {
94
+ const usage = entry.message?.usage || entry.usage;
95
+ if (!usage)
96
+ continue;
97
+ inputTokens += usage.input_tokens || 0;
98
+ outputTokens += usage.output_tokens || 0;
99
+ cacheCreationTokens += usage.cache_creation_input_tokens || 0;
100
+ cacheReadTokens += usage.cache_read_input_tokens || 0;
101
+ }
102
+ const totalTokens = calculateTotalTokens(inputTokens, outputTokens, cacheCreationTokens, cacheReadTokens);
103
+ const elapsedMinutes = Math.round((nowTime - activeBlock.startTime) / 60000);
104
+ const remainingMinutes = Math.round((activeBlock.endTime - nowTime) / 60000);
105
+ return {
106
+ inputTokens,
107
+ outputTokens,
108
+ cacheCreationTokens,
109
+ cacheReadTokens,
110
+ totalTokens,
111
+ blockStartTime: new Date(activeBlock.startTime),
112
+ blockEndTime: new Date(activeBlock.endTime),
113
+ elapsedMinutes,
114
+ remainingMinutes,
115
+ };
116
+ }
117
+ // ローリング5時間セッションの使用量を計算(Claude Code /usage準拠)
118
+ export function calculateRollingSessionUsage(entries, now = new Date()) {
119
+ // 直近5時間のエントリを取得
120
+ const fiveHoursAgo = new Date(now.getTime() - 5 * 60 * 60 * 1000);
121
+ const filteredEntries = entries.filter((entry) => {
122
+ const timestamp = entry.timestamp || entry.message?.timestamp;
123
+ if (!timestamp)
124
+ return false;
125
+ const entryTime = new Date(timestamp);
126
+ return entryTime >= fiveHoursAgo && entryTime <= now;
127
+ });
128
+ // requestIdで重複除去
129
+ const dedupedEntries = deduplicateByRequestId(filteredEntries);
130
+ // 最初と最後のエントリの時刻を取得
131
+ let earliestTime = null;
132
+ let latestTime = null;
133
+ let inputTokens = 0;
134
+ let outputTokens = 0;
135
+ let cacheCreationTokens = 0;
136
+ let cacheReadTokens = 0;
137
+ for (const entry of dedupedEntries) {
138
+ const timestamp = entry.timestamp || entry.message?.timestamp;
139
+ if (timestamp) {
140
+ const time = new Date(timestamp).getTime();
141
+ if (earliestTime === null || time < earliestTime)
142
+ earliestTime = time;
143
+ if (latestTime === null || time > latestTime)
144
+ latestTime = time;
145
+ }
146
+ const usage = entry.message?.usage || entry.usage;
147
+ if (!usage)
148
+ continue;
149
+ inputTokens += usage.input_tokens || 0;
150
+ outputTokens += usage.output_tokens || 0;
151
+ cacheCreationTokens += usage.cache_creation_input_tokens || 0;
152
+ cacheReadTokens += usage.cache_read_input_tokens || 0;
153
+ }
154
+ const totalTokens = calculateTotalTokens(inputTokens, outputTokens, cacheCreationTokens, cacheReadTokens);
155
+ // セッション開始時刻(最初のエントリ、なければ5時間前)
156
+ const sessionStart = earliestTime ? new Date(earliestTime) : fiveHoursAgo;
157
+ // セッション終了時刻(開始から5時間後)
158
+ const sessionEnd = new Date(sessionStart.getTime() + 5 * 60 * 60 * 1000);
159
+ const nowTime = now.getTime();
160
+ const elapsedMinutes = Math.round((nowTime - sessionStart.getTime()) / 60000);
161
+ const remainingMinutes = Math.max(0, Math.round((sessionEnd.getTime() - nowTime) / 60000));
162
+ return {
163
+ inputTokens,
164
+ outputTokens,
165
+ cacheCreationTokens,
166
+ cacheReadTokens,
167
+ totalTokens,
168
+ blockStartTime: sessionStart,
169
+ blockEndTime: sessionEnd,
170
+ elapsedMinutes,
171
+ remainingMinutes,
172
+ };
173
+ }
174
+ // 期間内の使用量を計算(後方互換性のため残す)
175
+ export function calculateUsageForPeriod(entries, hoursAgo, now = new Date()) {
176
+ const cutoff = new Date(now.getTime() - hoursAgo * 60 * 60 * 1000);
177
+ // 期間内のエントリをフィルタリング
178
+ const filteredEntries = entries.filter((entry) => {
179
+ const timestamp = entry.timestamp || entry.message?.timestamp;
180
+ if (!timestamp)
181
+ return false;
182
+ const entryTime = new Date(timestamp);
183
+ return entryTime >= cutoff;
184
+ });
185
+ // requestIdで重複除去
186
+ const dedupedEntries = deduplicateByRequestId(filteredEntries);
187
+ let inputTokens = 0;
188
+ let outputTokens = 0;
189
+ let cacheCreationTokens = 0;
190
+ let cacheReadTokens = 0;
191
+ for (const entry of dedupedEntries) {
192
+ const usage = entry.message?.usage || entry.usage;
193
+ if (!usage)
194
+ continue;
195
+ inputTokens += usage.input_tokens || 0;
196
+ outputTokens += usage.output_tokens || 0;
197
+ cacheCreationTokens += usage.cache_creation_input_tokens || 0;
198
+ cacheReadTokens += usage.cache_read_input_tokens || 0;
199
+ }
200
+ const totalTokens = calculateTotalTokens(inputTokens, outputTokens, cacheCreationTokens, cacheReadTokens);
201
+ return {
202
+ inputTokens,
203
+ outputTokens,
204
+ cacheCreationTokens,
205
+ cacheReadTokens,
206
+ totalTokens,
207
+ };
208
+ }
209
+ // Claude Code準拠: 金曜22:59リセット (Jan 24, 10:59pm = Friday)
210
+ const WEEKLY_RESET = { weekday: 5, hour: 22, minute: 59 }; // Friday 22:59 (local time)
211
+ export function getLastWeeklyReset(now = new Date()) {
212
+ const reset = new Date(now);
213
+ const day = reset.getDay();
214
+ // 金曜日(5)からの日数を計算
215
+ let diff = day - WEEKLY_RESET.weekday;
216
+ if (diff < 0)
217
+ diff += 7;
218
+ reset.setDate(reset.getDate() - diff);
219
+ reset.setHours(WEEKLY_RESET.hour, WEEKLY_RESET.minute, 0, 0);
220
+ // 現在時刻がリセット時刻より前なら、前週のリセットを返す
221
+ if (now < reset) {
222
+ reset.setDate(reset.getDate() - 7);
223
+ }
224
+ return reset;
225
+ }
226
+ export function getNextWeeklyReset(now = new Date()) {
227
+ const lastReset = getLastWeeklyReset(now);
228
+ const nextReset = new Date(lastReset);
229
+ nextReset.setDate(nextReset.getDate() + 7);
230
+ return nextReset;
231
+ }
232
+ // セッションリセット時刻を取得(5時間ローリングウィンドウ)
233
+ export function getSessionResetTime(now = new Date()) {
234
+ // 現在時刻から5時間後がリセット時刻
235
+ // ただし、セッションは最初のメッセージから開始
236
+ const resetTime = new Date(now);
237
+ resetTime.setHours(resetTime.getHours() + 5);
238
+ return resetTime;
239
+ }
240
+ function calculateUsageSince(entries, startTime, now = new Date()) {
241
+ // 期間内のエントリをフィルタリング
242
+ const filteredEntries = entries.filter((entry) => {
243
+ const timestamp = entry.timestamp || entry.message?.timestamp;
244
+ if (!timestamp)
245
+ return false;
246
+ const entryTime = new Date(timestamp);
247
+ return entryTime >= startTime && entryTime <= now;
248
+ });
249
+ // requestIdで重複除去
250
+ const dedupedEntries = deduplicateByRequestId(filteredEntries);
251
+ let inputTokens = 0;
252
+ let outputTokens = 0;
253
+ let cacheCreationTokens = 0;
254
+ let cacheReadTokens = 0;
255
+ for (const entry of dedupedEntries) {
256
+ const usage = entry.message?.usage || entry.usage;
257
+ if (!usage)
258
+ continue;
259
+ inputTokens += usage.input_tokens || 0;
260
+ outputTokens += usage.output_tokens || 0;
261
+ cacheCreationTokens += usage.cache_creation_input_tokens || 0;
262
+ cacheReadTokens += usage.cache_read_input_tokens || 0;
263
+ }
264
+ const totalTokens = calculateTotalTokens(inputTokens, outputTokens, cacheCreationTokens, cacheReadTokens);
265
+ return {
266
+ inputTokens,
267
+ outputTokens,
268
+ cacheCreationTokens,
269
+ cacheReadTokens,
270
+ totalTokens,
271
+ };
272
+ }
273
+ // 使用量を集計
274
+ export function aggregateUsage(entries, now = new Date()) {
275
+ let totalInputTokens = 0;
276
+ let totalOutputTokens = 0;
277
+ let totalCacheCreationInputTokens = 0;
278
+ let totalCacheReadInputTokens = 0;
279
+ let messageCount = 0;
280
+ const byModel = {};
281
+ const byDate = {};
282
+ // requestIdで重複除去
283
+ const dedupedEntries = deduplicateByRequestId(entries);
284
+ for (const entry of dedupedEntries) {
285
+ const usage = entry.message?.usage || entry.usage;
286
+ if (!usage)
287
+ continue;
288
+ const inputTokens = usage.input_tokens || 0;
289
+ const outputTokens = usage.output_tokens || 0;
290
+ const cacheCreation = usage.cache_creation_input_tokens || 0;
291
+ const cacheRead = usage.cache_read_input_tokens || 0;
292
+ totalInputTokens += inputTokens;
293
+ totalOutputTokens += outputTokens;
294
+ totalCacheCreationInputTokens += cacheCreation;
295
+ totalCacheReadInputTokens += cacheRead;
296
+ messageCount++;
297
+ // モデル別集計
298
+ const model = entry.message?.model || entry.model || 'unknown';
299
+ if (!byModel[model]) {
300
+ byModel[model] = {
301
+ inputTokens: 0,
302
+ outputTokens: 0,
303
+ cacheCreationTokens: 0,
304
+ cacheReadTokens: 0,
305
+ count: 0,
306
+ };
307
+ }
308
+ byModel[model].inputTokens += inputTokens;
309
+ byModel[model].outputTokens += outputTokens;
310
+ byModel[model].cacheCreationTokens += cacheCreation;
311
+ byModel[model].cacheReadTokens += cacheRead;
312
+ byModel[model].count++;
313
+ // 日別集計
314
+ const timestamp = entry.timestamp || entry.message?.timestamp;
315
+ if (timestamp) {
316
+ const date = new Date(timestamp).toISOString().split('T')[0];
317
+ if (!byDate[date]) {
318
+ byDate[date] = {
319
+ inputTokens: 0,
320
+ outputTokens: 0,
321
+ cacheCreationTokens: 0,
322
+ cacheReadTokens: 0,
323
+ count: 0,
324
+ };
325
+ }
326
+ byDate[date].inputTokens += inputTokens;
327
+ byDate[date].outputTokens += outputTokens;
328
+ byDate[date].cacheCreationTokens += cacheCreation;
329
+ byDate[date].cacheReadTokens += cacheRead;
330
+ byDate[date].count++;
331
+ }
332
+ }
333
+ // ローリング5時間セッション(Claude Code /usage準拠)
334
+ const rollingSession = calculateRollingSessionUsage(entries, now);
335
+ // ブロック方式のセッション(ccusage blocks準拠、後方互換性)
336
+ const activeBlock = calculateActiveBlockUsage(entries, now);
337
+ // ローリングウィンドウの使用量を計算
338
+ const last5Hours = calculateUsageForPeriod(entries, 5, now);
339
+ const last24Hours = calculateUsageForPeriod(entries, 24, now);
340
+ const lastWeek = calculateUsageSince(entries, getLastWeeklyReset(now), now);
341
+ return {
342
+ summary: {
343
+ totalInputTokens,
344
+ totalOutputTokens,
345
+ totalTokens: totalInputTokens + totalOutputTokens,
346
+ cacheCreationInputTokens: totalCacheCreationInputTokens,
347
+ cacheReadInputTokens: totalCacheReadInputTokens,
348
+ messageCount,
349
+ },
350
+ // ローリング5時間セッション(Claude Code /usage準拠)
351
+ rollingSession,
352
+ // セッションブロック(ccusage blocks準拠)
353
+ activeBlock,
354
+ // ローリングウィンドウ
355
+ limits: {
356
+ last5Hours,
357
+ last24Hours,
358
+ lastWeek,
359
+ },
360
+ byModel,
361
+ byDate,
362
+ };
363
+ }
364
+ // パーセント計算
365
+ export function percent(used, limit) {
366
+ if (limit <= 0)
367
+ return 0;
368
+ return Math.min(100, Math.max(0, Math.round((used / limit) * 100)));
369
+ }
370
+ // トークン数フォーマット
371
+ export function formatTokens(n) {
372
+ if (n >= 1_000_000)
373
+ return `${(n / 1_000_000).toFixed(1)}M`;
374
+ if (n >= 1_000)
375
+ return `${(n / 1_000).toFixed(0)}K`;
376
+ return n.toString();
377
+ }
378
+ //# sourceMappingURL=calculations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculations.js","sourceRoot":"","sources":["../src/calculations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}