bugger-mcp
Version:
MCP Server for managing bugs, feature requests, and improvements
77 lines • 2.42 kB
JavaScript
// Token usage tracking system for MCP tool operations
export class TokenUsageTracker {
sessionUsage;
static instance;
constructor() {
this.sessionUsage = {
sessionId: this.generateSessionId(),
startTime: new Date().toISOString(),
operations: [],
totalTokens: 0
};
}
static getInstance() {
if (!TokenUsageTracker.instance) {
TokenUsageTracker.instance = new TokenUsageTracker();
}
return TokenUsageTracker.instance;
}
/**
* Estimate token count using the same method as context collection engine
*/
estimateTokenCount(text) {
// Rough estimation: ~4 characters per token for English text
return Math.ceil(text.length / 4);
}
/**
* Start tracking a new operation
*/
startOperation(operationName) {
this.sessionUsage.currentOperation = operationName;
}
/**
* Record token usage for the current operation
*/
recordUsage(input, output, operationName) {
const inputTokens = this.estimateTokenCount(input);
const outputTokens = this.estimateTokenCount(output);
const totalTokens = inputTokens + outputTokens;
const usage = {
input: inputTokens,
output: outputTokens,
total: totalTokens,
operation: operationName || this.sessionUsage.currentOperation || 'unknown',
timestamp: new Date().toISOString()
};
this.sessionUsage.operations.push(usage);
this.sessionUsage.totalTokens += totalTokens;
return usage;
}
/**
* Get current session usage
*/
getSessionUsage() {
return { ...this.sessionUsage };
}
generateSessionId() {
return `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
}
formatNumber(num) {
return num.toLocaleString();
}
formatDuration(ms) {
const seconds = Math.floor(ms / 1000);
const minutes = Math.floor(seconds / 60);
const hours = Math.floor(minutes / 60);
if (hours > 0) {
return `${hours}h ${minutes % 60}m ${seconds % 60}s`;
}
else if (minutes > 0) {
return `${minutes}m ${seconds % 60}s`;
}
else {
return `${seconds}s`;
}
}
}
//# sourceMappingURL=token-usage-tracker.js.map