@semboja/opencode-claude 0.1.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/LICENSE +21 -0
- package/README.md +552 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +145 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +182 -0
- package/dist/index.js.map +1 -0
- package/dist/processor.d.ts +38 -0
- package/dist/processor.d.ts.map +1 -0
- package/dist/processor.js +244 -0
- package/dist/processor.js.map +1 -0
- package/dist/prometheus.d.ts +65 -0
- package/dist/prometheus.d.ts.map +1 -0
- package/dist/prometheus.js +304 -0
- package/dist/prometheus.js.map +1 -0
- package/dist/storage.d.ts +31 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +197 -0
- package/dist/storage.js.map +1 -0
- package/dist/types.d.ts +127 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +28 -0
- package/dist/types.js.map +1 -0
- package/package.json +60 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CLI utility for viewing Claude usage statistics
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* npx opencode-plugin-claude-tracker report
|
|
7
|
+
* npx opencode-plugin-claude-tracker sessions [limit]
|
|
8
|
+
* npx opencode-plugin-claude-tracker export [format]
|
|
9
|
+
*/
|
|
10
|
+
import { FileStorage } from './storage.js';
|
|
11
|
+
const args = process.argv.slice(2);
|
|
12
|
+
const command = args[0] ?? 'report';
|
|
13
|
+
const storagePath = process.env.CLAUDE_TRACKER_PATH;
|
|
14
|
+
async function main() {
|
|
15
|
+
const storage = new FileStorage(storagePath);
|
|
16
|
+
switch (command) {
|
|
17
|
+
case 'report':
|
|
18
|
+
await showReport(storage);
|
|
19
|
+
break;
|
|
20
|
+
case 'sessions':
|
|
21
|
+
await showSessions(storage, parseInt(args[1] ?? '10', 10));
|
|
22
|
+
break;
|
|
23
|
+
case 'export':
|
|
24
|
+
await exportData(storage, args[1] ?? 'json');
|
|
25
|
+
break;
|
|
26
|
+
case 'help':
|
|
27
|
+
default:
|
|
28
|
+
showHelp();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async function showReport(storage) {
|
|
32
|
+
const stats = await storage.getUsageStats();
|
|
33
|
+
console.log('\n=== Claude Usage Report ===\n');
|
|
34
|
+
console.log(`Total Sessions: ${stats.totalSessions}`);
|
|
35
|
+
console.log(`Total API Requests: ${stats.totalApiRequests}`);
|
|
36
|
+
console.log(`Total Cost: $${stats.totalCostUsd.toFixed(4)}`);
|
|
37
|
+
console.log('\nToken Usage:');
|
|
38
|
+
console.log(` Input: ${stats.totalTokens.input.toLocaleString().padStart(12)}`);
|
|
39
|
+
console.log(` Output: ${stats.totalTokens.output.toLocaleString().padStart(12)}`);
|
|
40
|
+
console.log(` Cache Read: ${stats.totalTokens.cacheRead.toLocaleString().padStart(12)}`);
|
|
41
|
+
console.log(` Cache Creation: ${stats.totalTokens.cacheCreation.toLocaleString().padStart(12)}`);
|
|
42
|
+
console.log(` Total: ${stats.totalTokens.total.toLocaleString().padStart(12)}`);
|
|
43
|
+
if (stats.byModel.size > 0) {
|
|
44
|
+
console.log('\nUsage by Model:');
|
|
45
|
+
console.log(' Model'.padEnd(40) + 'Requests'.padStart(10) + 'Tokens'.padStart(15) + 'Cost'.padStart(12));
|
|
46
|
+
console.log(' ' + '-'.repeat(73));
|
|
47
|
+
for (const [model, data] of stats.byModel) {
|
|
48
|
+
console.log(` ${model.padEnd(38)}${data.requests.toString().padStart(10)}${data.tokens.total.toLocaleString().padStart(15)}$${data.costUsd.toFixed(4).padStart(11)}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (stats.byDay.size > 0) {
|
|
52
|
+
console.log('\nUsage by Day (last 7 days):');
|
|
53
|
+
console.log(' Date'.padEnd(15) + 'Requests'.padStart(10) + 'Tokens'.padStart(15) + 'Cost'.padStart(12));
|
|
54
|
+
console.log(' ' + '-'.repeat(48));
|
|
55
|
+
const days = Array.from(stats.byDay.entries())
|
|
56
|
+
.sort((a, b) => b[0].localeCompare(a[0]))
|
|
57
|
+
.slice(0, 7);
|
|
58
|
+
for (const [day, data] of days) {
|
|
59
|
+
console.log(` ${day.padEnd(13)}${data.requests.toString().padStart(10)}${data.tokens.total.toLocaleString().padStart(15)}$${data.costUsd.toFixed(4).padStart(11)}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (stats.topTools.length > 0) {
|
|
63
|
+
console.log('\nTop Tools:');
|
|
64
|
+
console.log(' Tool'.padEnd(25) + 'Calls'.padStart(8) + 'Success'.padStart(10) + 'Avg Time'.padStart(12));
|
|
65
|
+
console.log(' ' + '-'.repeat(51));
|
|
66
|
+
for (const tool of stats.topTools) {
|
|
67
|
+
const successRate = tool.invocations > 0
|
|
68
|
+
? ((tool.successCount / tool.invocations) * 100).toFixed(1) + '%'
|
|
69
|
+
: 'N/A';
|
|
70
|
+
console.log(` ${tool.name.padEnd(23)}${tool.invocations.toString().padStart(8)}${successRate.padStart(10)}${tool.avgDurationMs.toFixed(0).padStart(9)}ms`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
console.log('\n===========================\n');
|
|
74
|
+
}
|
|
75
|
+
async function showSessions(storage, limit) {
|
|
76
|
+
const sessions = await storage.getAllSessions(limit);
|
|
77
|
+
console.log(`\n=== Recent Sessions (${sessions.length}) ===\n`);
|
|
78
|
+
if (sessions.length === 0) {
|
|
79
|
+
console.log('No sessions found.');
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
console.log('Session ID'.padEnd(40) + 'Start Time'.padEnd(22) + 'Tokens'.padStart(12) + 'Cost'.padStart(10));
|
|
83
|
+
console.log('-'.repeat(84));
|
|
84
|
+
for (const session of sessions) {
|
|
85
|
+
const startTime = session.startTime.replace('T', ' ').substring(0, 19);
|
|
86
|
+
console.log(`${session.sessionId.substring(0, 38).padEnd(40)}${startTime.padEnd(22)}${session.tokens.total.toLocaleString().padStart(12)}$${session.totalCostUsd.toFixed(4).padStart(9)}`);
|
|
87
|
+
}
|
|
88
|
+
console.log('\n');
|
|
89
|
+
}
|
|
90
|
+
async function exportData(storage, format) {
|
|
91
|
+
const stats = await storage.getUsageStats();
|
|
92
|
+
const sessions = await storage.getAllSessions(1000);
|
|
93
|
+
const data = {
|
|
94
|
+
exportDate: new Date().toISOString(),
|
|
95
|
+
stats: {
|
|
96
|
+
...stats,
|
|
97
|
+
byModel: Object.fromEntries(stats.byModel),
|
|
98
|
+
byDay: Object.fromEntries(stats.byDay),
|
|
99
|
+
},
|
|
100
|
+
sessions: sessions.map(s => ({
|
|
101
|
+
...s,
|
|
102
|
+
toolCalls: Object.fromEntries(s.toolCalls),
|
|
103
|
+
models: Object.fromEntries(s.models),
|
|
104
|
+
})),
|
|
105
|
+
};
|
|
106
|
+
if (format === 'csv') {
|
|
107
|
+
// Export summary as CSV
|
|
108
|
+
console.log('date,sessions,requests,input_tokens,output_tokens,cache_read_tokens,cache_creation_tokens,total_tokens,cost_usd');
|
|
109
|
+
for (const [day, dayData] of stats.byDay) {
|
|
110
|
+
console.log(`${day},${stats.totalSessions},${dayData.requests},${dayData.tokens.input},${dayData.tokens.output},${dayData.tokens.cacheRead},${dayData.tokens.cacheCreation},${dayData.tokens.total},${dayData.costUsd}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
// Default to JSON
|
|
115
|
+
console.log(JSON.stringify(data, null, 2));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function showHelp() {
|
|
119
|
+
console.log(`
|
|
120
|
+
Claude Usage Tracker CLI
|
|
121
|
+
|
|
122
|
+
Usage:
|
|
123
|
+
claude-tracker <command> [options]
|
|
124
|
+
|
|
125
|
+
Commands:
|
|
126
|
+
report Show usage summary report (default)
|
|
127
|
+
sessions [limit] List recent sessions (default: 10)
|
|
128
|
+
export [format] Export data as JSON (default) or CSV
|
|
129
|
+
help Show this help message
|
|
130
|
+
|
|
131
|
+
Environment:
|
|
132
|
+
CLAUDE_TRACKER_PATH Custom storage path (default: ~/.opencode/claude-usage)
|
|
133
|
+
|
|
134
|
+
Examples:
|
|
135
|
+
claude-tracker report
|
|
136
|
+
claude-tracker sessions 20
|
|
137
|
+
claude-tracker export json > usage.json
|
|
138
|
+
claude-tracker export csv > usage.csv
|
|
139
|
+
`);
|
|
140
|
+
}
|
|
141
|
+
main().catch(err => {
|
|
142
|
+
console.error('Error:', err.message);
|
|
143
|
+
process.exit(1);
|
|
144
|
+
});
|
|
145
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { Plugin } from '@opencode-ai/plugin';
|
|
2
|
+
import type { UsageStats } from './types.js';
|
|
3
|
+
export type { ClaudeTrackerConfig, UsageStats, SessionUsage, TokenUsage, ApiRequestMetrics, ToolMetrics } from './types.js';
|
|
4
|
+
export { FileStorage, MemoryStorage } from './storage.js';
|
|
5
|
+
export { ClaudeUsageProcessor } from './processor.js';
|
|
6
|
+
export { PrometheusRegistry, ClaudeMetrics, PrometheusServer, PushgatewayClient } from './prometheus.js';
|
|
7
|
+
/**
|
|
8
|
+
* Claude Usage Tracker Plugin for OpenCode
|
|
9
|
+
*
|
|
10
|
+
* Tracks Claude API usage including:
|
|
11
|
+
* - Token usage (input, output, cache read, cache creation)
|
|
12
|
+
* - Costs in USD
|
|
13
|
+
* - API request latency
|
|
14
|
+
* - Tool invocations and success rates
|
|
15
|
+
* - Per-model and per-day aggregations
|
|
16
|
+
*
|
|
17
|
+
* Configuration via environment variables:
|
|
18
|
+
* - CLAUDE_TRACKER_STORAGE: 'file' (default) or 'memory'
|
|
19
|
+
* - CLAUDE_TRACKER_PATH: Storage path (default: ~/.opencode/claude-usage)
|
|
20
|
+
* - CLAUDE_TRACKER_VERBOSE: '1' to enable verbose logging
|
|
21
|
+
* - CLAUDE_TRACKER_FLUSH_INTERVAL: Flush interval in ms (default: 30000)
|
|
22
|
+
*
|
|
23
|
+
* Prometheus configuration:
|
|
24
|
+
* - CLAUDE_TRACKER_PROMETHEUS: '1' to enable Prometheus metrics
|
|
25
|
+
* - CLAUDE_TRACKER_PROMETHEUS_PORT: Port for /metrics endpoint (default: 9464)
|
|
26
|
+
* - CLAUDE_TRACKER_PUSHGATEWAY_URL: Pushgateway URL for pushing metrics
|
|
27
|
+
* - CLAUDE_TRACKER_PUSHGATEWAY_JOB: Job name for Pushgateway (default: 'claude_tracker')
|
|
28
|
+
* - CLAUDE_TRACKER_PUSHGATEWAY_INTERVAL: Push interval in ms (default: 15000)
|
|
29
|
+
*/
|
|
30
|
+
export declare const ClaudeTrackerPlugin: Plugin;
|
|
31
|
+
export default ClaudeTrackerPlugin;
|
|
32
|
+
/**
|
|
33
|
+
* Utility function to get usage statistics
|
|
34
|
+
* Can be used outside the plugin context
|
|
35
|
+
*/
|
|
36
|
+
export declare function getUsageStats(storagePath?: string): Promise<UsageStats>;
|
|
37
|
+
/**
|
|
38
|
+
* Utility function to print a usage report to console
|
|
39
|
+
*/
|
|
40
|
+
export declare function printUsageReport(storagePath?: string): Promise<void>;
|
|
41
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAKlD,OAAO,KAAK,EAAuC,UAAU,EAAE,MAAM,YAAY,CAAC;AAElF,YAAY,EAAE,mBAAmB,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC5H,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzG;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAyHjC,CAAC;AAGF,eAAe,mBAAmB,CAAC;AAEnC;;;GAGG;AACH,wBAAsB,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAG7E;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgC1E"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { NodeSDK } from '@opentelemetry/sdk-node';
|
|
2
|
+
import { ClaudeUsageProcessor } from './processor.js';
|
|
3
|
+
import { FileStorage, MemoryStorage } from './storage.js';
|
|
4
|
+
import { PrometheusRegistry, ClaudeMetrics, PrometheusServer, PushgatewayClient } from './prometheus.js';
|
|
5
|
+
export { FileStorage, MemoryStorage } from './storage.js';
|
|
6
|
+
export { ClaudeUsageProcessor } from './processor.js';
|
|
7
|
+
export { PrometheusRegistry, ClaudeMetrics, PrometheusServer, PushgatewayClient } from './prometheus.js';
|
|
8
|
+
/**
|
|
9
|
+
* Claude Usage Tracker Plugin for OpenCode
|
|
10
|
+
*
|
|
11
|
+
* Tracks Claude API usage including:
|
|
12
|
+
* - Token usage (input, output, cache read, cache creation)
|
|
13
|
+
* - Costs in USD
|
|
14
|
+
* - API request latency
|
|
15
|
+
* - Tool invocations and success rates
|
|
16
|
+
* - Per-model and per-day aggregations
|
|
17
|
+
*
|
|
18
|
+
* Configuration via environment variables:
|
|
19
|
+
* - CLAUDE_TRACKER_STORAGE: 'file' (default) or 'memory'
|
|
20
|
+
* - CLAUDE_TRACKER_PATH: Storage path (default: ~/.opencode/claude-usage)
|
|
21
|
+
* - CLAUDE_TRACKER_VERBOSE: '1' to enable verbose logging
|
|
22
|
+
* - CLAUDE_TRACKER_FLUSH_INTERVAL: Flush interval in ms (default: 30000)
|
|
23
|
+
*
|
|
24
|
+
* Prometheus configuration:
|
|
25
|
+
* - CLAUDE_TRACKER_PROMETHEUS: '1' to enable Prometheus metrics
|
|
26
|
+
* - CLAUDE_TRACKER_PROMETHEUS_PORT: Port for /metrics endpoint (default: 9464)
|
|
27
|
+
* - CLAUDE_TRACKER_PUSHGATEWAY_URL: Pushgateway URL for pushing metrics
|
|
28
|
+
* - CLAUDE_TRACKER_PUSHGATEWAY_JOB: Job name for Pushgateway (default: 'claude_tracker')
|
|
29
|
+
* - CLAUDE_TRACKER_PUSHGATEWAY_INTERVAL: Push interval in ms (default: 15000)
|
|
30
|
+
*/
|
|
31
|
+
export const ClaudeTrackerPlugin = async ({ client }) => {
|
|
32
|
+
// Read configuration from environment
|
|
33
|
+
const storageType = (process.env.CLAUDE_TRACKER_STORAGE ?? 'file');
|
|
34
|
+
const storagePath = process.env.CLAUDE_TRACKER_PATH;
|
|
35
|
+
const verbose = process.env.CLAUDE_TRACKER_VERBOSE === '1';
|
|
36
|
+
const flushIntervalMs = parseInt(process.env.CLAUDE_TRACKER_FLUSH_INTERVAL ?? '30000', 10);
|
|
37
|
+
// Prometheus configuration
|
|
38
|
+
const prometheusEnabled = process.env.CLAUDE_TRACKER_PROMETHEUS === '1';
|
|
39
|
+
const prometheusPort = parseInt(process.env.CLAUDE_TRACKER_PROMETHEUS_PORT ?? '9464', 10);
|
|
40
|
+
const pushgatewayUrl = process.env.CLAUDE_TRACKER_PUSHGATEWAY_URL;
|
|
41
|
+
const pushgatewayJob = process.env.CLAUDE_TRACKER_PUSHGATEWAY_JOB ?? 'claude_tracker';
|
|
42
|
+
const pushgatewayInterval = parseInt(process.env.CLAUDE_TRACKER_PUSHGATEWAY_INTERVAL ?? '15000', 10);
|
|
43
|
+
const log = (level, message) => {
|
|
44
|
+
client.app.log({
|
|
45
|
+
body: { service: 'claude-tracker', level, message },
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
// Initialize storage backend
|
|
49
|
+
let storage;
|
|
50
|
+
if (storageType === 'memory') {
|
|
51
|
+
storage = new MemoryStorage();
|
|
52
|
+
log('info', 'Using in-memory storage (data will not persist)');
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
storage = new FileStorage(storagePath);
|
|
56
|
+
log('info', `Using file storage at ${storagePath ?? '~/.opencode/claude-usage'}`);
|
|
57
|
+
}
|
|
58
|
+
// Initialize Prometheus if enabled
|
|
59
|
+
let prometheusMetrics;
|
|
60
|
+
let prometheusServer;
|
|
61
|
+
let pushgatewayClient;
|
|
62
|
+
let pushInterval;
|
|
63
|
+
if (prometheusEnabled || pushgatewayUrl) {
|
|
64
|
+
const registry = new PrometheusRegistry();
|
|
65
|
+
prometheusMetrics = new ClaudeMetrics(registry);
|
|
66
|
+
if (prometheusEnabled) {
|
|
67
|
+
prometheusServer = new PrometheusServer(registry, prometheusPort);
|
|
68
|
+
try {
|
|
69
|
+
await prometheusServer.start();
|
|
70
|
+
log('info', `Prometheus metrics server started on port ${prometheusPort}`);
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
log('error', `Failed to start Prometheus server: ${err}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (pushgatewayUrl) {
|
|
77
|
+
pushgatewayClient = new PushgatewayClient(registry, pushgatewayUrl, pushgatewayJob);
|
|
78
|
+
pushInterval = setInterval(async () => {
|
|
79
|
+
try {
|
|
80
|
+
await pushgatewayClient.push({ instance: process.env.HOSTNAME ?? 'unknown' });
|
|
81
|
+
if (verbose) {
|
|
82
|
+
log('info', 'Pushed metrics to Pushgateway');
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
log('error', `Failed to push to Pushgateway: ${err}`);
|
|
87
|
+
}
|
|
88
|
+
}, pushgatewayInterval);
|
|
89
|
+
log('info', `Pushgateway client configured for ${pushgatewayUrl}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Create the processor
|
|
93
|
+
const processor = new ClaudeUsageProcessor(storage, log, {
|
|
94
|
+
verbose,
|
|
95
|
+
flushIntervalMs,
|
|
96
|
+
trackModels: true,
|
|
97
|
+
trackTools: true,
|
|
98
|
+
prometheusMetrics,
|
|
99
|
+
});
|
|
100
|
+
// Initialize OpenTelemetry SDK with our processor
|
|
101
|
+
const sdk = new NodeSDK({
|
|
102
|
+
spanProcessors: [processor],
|
|
103
|
+
});
|
|
104
|
+
sdk.start();
|
|
105
|
+
log('info', 'Claude usage tracking initialized');
|
|
106
|
+
return {
|
|
107
|
+
config: async (config) => {
|
|
108
|
+
if (!config.experimental?.openTelemetry) {
|
|
109
|
+
log('warn', 'OpenTelemetry experimental feature is disabled in OpenCode config - tracking may be limited');
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
event: async ({ event }) => {
|
|
113
|
+
// Flush on idle to ensure data is saved
|
|
114
|
+
if (event.type === 'session.idle') {
|
|
115
|
+
log('info', 'Flushing usage data before idle');
|
|
116
|
+
await processor.forceFlush();
|
|
117
|
+
// Push to Pushgateway on idle
|
|
118
|
+
if (pushgatewayClient) {
|
|
119
|
+
try {
|
|
120
|
+
await pushgatewayClient.push({ instance: process.env.HOSTNAME ?? 'unknown' });
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
log('error', `Failed to push to Pushgateway: ${err}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Clean shutdown
|
|
128
|
+
if (event.type === 'server.instance.disposed') {
|
|
129
|
+
if (pushInterval) {
|
|
130
|
+
clearInterval(pushInterval);
|
|
131
|
+
}
|
|
132
|
+
if (prometheusServer) {
|
|
133
|
+
await prometheusServer.stop();
|
|
134
|
+
}
|
|
135
|
+
await sdk.shutdown();
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
};
|
|
140
|
+
// Default export for easy importing
|
|
141
|
+
export default ClaudeTrackerPlugin;
|
|
142
|
+
/**
|
|
143
|
+
* Utility function to get usage statistics
|
|
144
|
+
* Can be used outside the plugin context
|
|
145
|
+
*/
|
|
146
|
+
export async function getUsageStats(storagePath) {
|
|
147
|
+
const storage = new FileStorage(storagePath);
|
|
148
|
+
return storage.getUsageStats();
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Utility function to print a usage report to console
|
|
152
|
+
*/
|
|
153
|
+
export async function printUsageReport(storagePath) {
|
|
154
|
+
const stats = await getUsageStats(storagePath);
|
|
155
|
+
console.log('\n=== Claude Usage Report ===\n');
|
|
156
|
+
console.log(`Total Sessions: ${stats.totalSessions}`);
|
|
157
|
+
console.log(`Total API Requests: ${stats.totalApiRequests}`);
|
|
158
|
+
console.log(`Total Cost: $${stats.totalCostUsd.toFixed(4)}`);
|
|
159
|
+
console.log('\nToken Usage:');
|
|
160
|
+
console.log(` Input: ${stats.totalTokens.input.toLocaleString()}`);
|
|
161
|
+
console.log(` Output: ${stats.totalTokens.output.toLocaleString()}`);
|
|
162
|
+
console.log(` Cache Read: ${stats.totalTokens.cacheRead.toLocaleString()}`);
|
|
163
|
+
console.log(` Cache Creation: ${stats.totalTokens.cacheCreation.toLocaleString()}`);
|
|
164
|
+
console.log(` Total: ${stats.totalTokens.total.toLocaleString()}`);
|
|
165
|
+
if (stats.byModel.size > 0) {
|
|
166
|
+
console.log('\nBy Model:');
|
|
167
|
+
for (const [model, data] of stats.byModel) {
|
|
168
|
+
console.log(` ${model}: ${data.requests} requests, ${data.tokens.total.toLocaleString()} tokens, $${data.costUsd.toFixed(4)}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (stats.topTools.length > 0) {
|
|
172
|
+
console.log('\nTop Tools:');
|
|
173
|
+
for (const tool of stats.topTools) {
|
|
174
|
+
const successRate = tool.invocations > 0
|
|
175
|
+
? ((tool.successCount / tool.invocations) * 100).toFixed(1)
|
|
176
|
+
: '0';
|
|
177
|
+
console.log(` ${tool.name}: ${tool.invocations} calls, ${successRate}% success, avg ${tool.avgDurationMs.toFixed(0)}ms`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
console.log('\n===========================\n');
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAIzG,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzG;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAW,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;IAC9D,sCAAsC;IACtC,MAAM,WAAW,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,MAAM,CAAsB,CAAC;IACxF,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IACpD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,GAAG,CAAC;IAC3D,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;IAE3F,2BAA2B;IAC3B,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,GAAG,CAAC;IACxE,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;IAC1F,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC;IAClE,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,gBAAgB,CAAC;IACtF,MAAM,mBAAmB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mCAAmC,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;IAErG,MAAM,GAAG,GAAG,CAAC,KAAgC,EAAE,OAAe,EAAE,EAAE;QAChE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;YACb,IAAI,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,OAAO,EAAE;SACpD,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,6BAA6B;IAC7B,IAAI,OAAuB,CAAC;IAC5B,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;QAC9B,GAAG,CAAC,MAAM,EAAE,iDAAiD,CAAC,CAAC;IACjE,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC;QACvC,GAAG,CAAC,MAAM,EAAE,yBAAyB,WAAW,IAAI,0BAA0B,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,mCAAmC;IACnC,IAAI,iBAA4C,CAAC;IACjD,IAAI,gBAA8C,CAAC;IACnD,IAAI,iBAAgD,CAAC;IACrD,IAAI,YAAwC,CAAC;IAE7C,IAAI,iBAAiB,IAAI,cAAc,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,kBAAkB,EAAE,CAAC;QAC1C,iBAAiB,GAAG,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC;QAEhD,IAAI,iBAAiB,EAAE,CAAC;YACtB,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;YAClE,IAAI,CAAC;gBACH,MAAM,gBAAgB,CAAC,KAAK,EAAE,CAAC;gBAC/B,GAAG,CAAC,MAAM,EAAE,6CAA6C,cAAc,EAAE,CAAC,CAAC;YAC7E,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,OAAO,EAAE,sCAAsC,GAAG,EAAE,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,IAAI,cAAc,EAAE,CAAC;YACnB,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,QAAQ,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;YACpF,YAAY,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;gBACpC,IAAI,CAAC;oBACH,MAAM,iBAAkB,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAC;oBAC/E,IAAI,OAAO,EAAE,CAAC;wBACZ,GAAG,CAAC,MAAM,EAAE,+BAA+B,CAAC,CAAC;oBAC/C,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,GAAG,CAAC,OAAO,EAAE,kCAAkC,GAAG,EAAE,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC,EAAE,mBAAmB,CAAC,CAAC;YACxB,GAAG,CAAC,MAAM,EAAE,qCAAqC,cAAc,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC,OAAO,EAAE,GAAG,EAAE;QACvD,OAAO;QACP,eAAe;QACf,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,IAAI;QAChB,iBAAiB;KAClB,CAAC,CAAC;IAEH,kDAAkD;IAClD,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC;QACtB,cAAc,EAAE,CAAC,SAAS,CAAC;KAC5B,CAAC,CAAC;IAEH,GAAG,CAAC,KAAK,EAAE,CAAC;IACZ,GAAG,CAAC,MAAM,EAAE,mCAAmC,CAAC,CAAC;IAEjD,OAAO;QACL,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACvB,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,aAAa,EAAE,CAAC;gBACxC,GAAG,CACD,MAAM,EACN,6FAA6F,CAC9F,CAAC;YACJ,CAAC;QACH,CAAC;QAED,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YACzB,wCAAwC;YACxC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBAClC,GAAG,CAAC,MAAM,EAAE,iCAAiC,CAAC,CAAC;gBAC/C,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC;gBAE7B,8BAA8B;gBAC9B,IAAI,iBAAiB,EAAE,CAAC;oBACtB,IAAI,CAAC;wBACH,MAAM,iBAAiB,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAC;oBAChF,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,GAAG,CAAC,OAAO,EAAE,kCAAkC,GAAG,EAAE,CAAC,CAAC;oBACxD,CAAC;gBACH,CAAC;YACH,CAAC;YAED,iBAAiB;YACjB,IAAI,KAAK,CAAC,IAAI,KAAK,0BAA0B,EAAE,CAAC;gBAC9C,IAAI,YAAY,EAAE,CAAC;oBACjB,aAAa,CAAC,YAAY,CAAC,CAAC;gBAC9B,CAAC;gBACD,IAAI,gBAAgB,EAAE,CAAC;oBACrB,MAAM,gBAAgB,CAAC,IAAI,EAAE,CAAC;gBAChC,CAAC;gBACD,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,oCAAoC;AACpC,eAAe,mBAAmB,CAAC;AAEnC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,WAAoB;IACtD,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC;IAC7C,OAAO,OAAO,CAAC,aAAa,EAAE,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,WAAoB;IACzD,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;IAE/C,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,CAAC,WAAW,CAAC,aAAa,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAEpE,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC3B,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,QAAQ,cAAc,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,aAAa,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClI,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC;gBACtC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC3D,CAAC,CAAC,GAAG,CAAC;YACR,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,WAAW,WAAW,kBAAkB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5H,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Context } from '@opentelemetry/api';
|
|
2
|
+
import type { SpanProcessor, ReadableSpan, Span } from '@opentelemetry/sdk-trace-base';
|
|
3
|
+
import type { StorageBackend } from './types.js';
|
|
4
|
+
import type { ClaudeMetrics } from './prometheus.js';
|
|
5
|
+
type LogFn = (level: 'info' | 'warn' | 'error', message: string) => void;
|
|
6
|
+
/**
|
|
7
|
+
* Custom span processor for tracking Claude API usage
|
|
8
|
+
*/
|
|
9
|
+
export declare class ClaudeUsageProcessor implements SpanProcessor {
|
|
10
|
+
private storage;
|
|
11
|
+
private log;
|
|
12
|
+
private verbose;
|
|
13
|
+
private trackModels;
|
|
14
|
+
private trackTools;
|
|
15
|
+
private currentSession;
|
|
16
|
+
private flushInterval;
|
|
17
|
+
private pendingRequests;
|
|
18
|
+
private prometheusMetrics;
|
|
19
|
+
constructor(storage: StorageBackend, log: LogFn, options?: {
|
|
20
|
+
verbose?: boolean;
|
|
21
|
+
flushIntervalMs?: number;
|
|
22
|
+
trackModels?: boolean;
|
|
23
|
+
trackTools?: boolean;
|
|
24
|
+
prometheusMetrics?: ClaudeMetrics;
|
|
25
|
+
});
|
|
26
|
+
onStart(_span: Span, _parentContext: Context): void;
|
|
27
|
+
onEnd(span: ReadableSpan): void;
|
|
28
|
+
private initSession;
|
|
29
|
+
private processApiRequest;
|
|
30
|
+
private processApiError;
|
|
31
|
+
private processToolResult;
|
|
32
|
+
private processLlmSpan;
|
|
33
|
+
forceFlush(): Promise<void>;
|
|
34
|
+
private flush;
|
|
35
|
+
shutdown(): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processor.d.ts","sourceRoot":"","sources":["../src/processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,+BAA+B,CAAC;AACvF,OAAO,KAAK,EACV,cAAc,EAKf,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AASzE;;GAEG;AACH,qBAAa,oBAAqB,YAAW,aAAa;IACxD,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,GAAG,CAAQ;IACnB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,eAAe,CAA2B;IAClD,OAAO,CAAC,iBAAiB,CAA8B;gBAGrD,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE,KAAK,EACV,OAAO,GAAE;QACP,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,iBAAiB,CAAC,EAAE,aAAa,CAAC;KAC9B;IAkBR,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,GAAG,IAAI;IAInD,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IA6B/B,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,iBAAiB;IAwEzB,OAAO,CAAC,eAAe;IA2BvB,OAAO,CAAC,iBAAiB;IAoCzB,OAAO,CAAC,cAAc;IAoBhB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAInB,KAAK;IAsBb,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAYhC"}
|