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 +127 -0
- package/dist/calculations.d.ts +83 -0
- package/dist/calculations.d.ts.map +1 -0
- package/dist/calculations.js +378 -0
- package/dist/calculations.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +946 -0
- package/dist/index.js.map +1 -0
- package/package.json +46 -0
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":"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"}
|
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|