claude-statusline-powerline
Version:
Beautiful powerline-style statusline for Claude Code with git integration, session tracking, and cost monitoring
79 lines • 3.35 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SessionSegment = void 0;
const config_1 = require("../config");
const token_formatting_1 = require("../utils/token-formatting");
const usage_db_1 = require("../utils/usage-db");
const base_1 = require("./base");
class SessionSegment extends base_1.BaseSegment {
constructor() {
super(...arguments);
this.name = 'session';
}
build(data, config) {
// First try to get session data from database
const usage = this.get_session_usage(data);
if (!usage) {
return null; // Hide segment if no session data available
}
const total_tokens = usage.totalInputTokens + usage.totalOutputTokens;
const cost_str = usage.totalCost < 0.01
? '< $0.01'
: `$${usage.totalCost.toFixed(2)}`;
// Calculate context usage
const pricing = config_1.MODEL_PRICING[usage.modelUsed || ''] || config_1.DEFAULT_PRICING;
const context_used = total_tokens;
const context_remaining = pricing.context_window - context_used;
const context_percent = Math.round((context_used / pricing.context_window) * 100);
// Format context display
let context_display = '';
if (context_percent >= 90) {
context_display = ` !${context_percent}%`;
}
else if (context_percent >= 75) {
context_display = ` ${context_percent}%`;
}
else {
context_display = ` ${Math.round(context_remaining / 1000)}k left`;
}
const { style_override, get_icon } = this.setup_segment(config);
const theme = config.current_theme?.segments.session;
const cost_icon = get_icon('cost');
const content = `${cost_icon} ${(0, token_formatting_1.format_tokens)(total_tokens)} • ${cost_str}${context_display}`;
return this.create_segment_with_fallback(content, theme, 'session', config.separators.session, style_override);
}
get_session_usage(data) {
try {
// Query database for session data
const db = (0, usage_db_1.get_usage_db)();
const session = db.get_session(data.session_id);
if (session) {
// Convert database record to SessionUsage format
return {
totalInputTokens: session.input_tokens,
totalOutputTokens: session.output_tokens,
totalCacheTokens: session.cache_tokens,
totalCost: session.cost,
modelUsed: session.model,
sessionDuration: this.calculate_session_duration(session.start_time, session.end_time),
};
}
// No session found in database
return null;
}
catch (error) {
// Database error - don't show segment
return null;
}
}
calculate_session_duration(start_time, end_time) {
if (!start_time || !end_time) {
return 0;
}
const start = new Date(start_time);
const end = new Date(end_time);
return Math.round((end.getTime() - start.getTime()) / (1000 * 60)); // duration in minutes
}
}
exports.SessionSegment = SessionSegment;
//# sourceMappingURL=session.js.map