UNPKG

claude-statusline-powerline

Version:

Beautiful powerline-style statusline for Claude Code with git integration, session tracking, and cost monitoring

79 lines 3.35 kB
"use strict"; 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