UNPKG

@owloops/claude-powerline

Version:

Beautiful vim-style powerline statusline for Claude Code with real-time usage tracking, git integration, and custom themes

117 lines (101 loc) 2.49 kB
import type { BudgetItemConfig } from "../config/loader"; export interface BudgetStatus { percentage: number | null; isWarning: boolean; displayText: string; } export interface BudgetDisplayState { suppressAll: boolean; showBase: boolean; percentText: string; percentageOnly: boolean; } export function calculateBudgetPercentage( cost: number, budget: number | undefined, ): number | null { if (!budget || budget <= 0 || cost < 0) return null; return Math.min(100, (cost / budget) * 100); } export function getBudgetStatus( cost: number, budget: number | undefined, warningThreshold = 80, ): BudgetStatus { const percentage = calculateBudgetPercentage(cost, budget); if (percentage === null) { return { percentage: null, isWarning: false, displayText: "", }; } const percentStr = `${percentage.toFixed(0)}%`; const isWarning = percentage >= warningThreshold; let displayText = ""; if (isWarning) { displayText = ` !${percentStr}`; } else if (percentage >= 50) { displayText = ` +${percentStr}`; } else { displayText = ` ${percentStr}`; } return { percentage, isWarning, displayText, }; } export function pickBudgetValue( cost: number | null, tokens: number | null, budgetType: "cost" | "tokens" | undefined, ): number | null { return budgetType === "tokens" ? tokens : cost; } export function resolveBudgetDisplay( cost: number | null, tokens: number | null, budget?: BudgetItemConfig, ): BudgetDisplayState { if (!budget?.amount || budget.amount <= 0) { return { suppressAll: false, showBase: true, percentText: "", percentageOnly: false, }; } const showValue = budget.showValue ?? true; const showPercentage = budget.showPercentage ?? true; const budgetValue = pickBudgetValue(cost, tokens, budget.type); if (budgetValue === null) { return { suppressAll: false, showBase: true, percentText: "", percentageOnly: false, }; } if (!showValue && !showPercentage) { return { suppressAll: true, showBase: false, percentText: "", percentageOnly: false, }; } const percentText = showPercentage ? getBudgetStatus( budgetValue, budget.amount, budget.warningThreshold, ).displayText.trimStart() : ""; return { suppressAll: false, showBase: showValue, percentText, percentageOnly: !showValue, }; }