UNPKG

@owloops/claude-powerline

Version:

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

8 lines 107 kB
#!/usr/bin/env node import e from"node:process";import{json as t}from"node:stream/consumers";import n from"node:tty";import{exec as r,execSync as i}from"node:child_process";import{promisify as a}from"node:util";import o,{createReadStream as s,existsSync as c}from"node:fs";import l,{dirname as u,join as d}from"node:path";import{get as f}from"node:https";import{URL as p}from"node:url";import m,{homedir as h}from"node:os";import{createHash as g}from"node:crypto";import{setTimeout as _}from"node:timers/promises";import{readFile as v,readdir as y,stat as b}from"node:fs/promises";import{createInterface as x}from"node:readline";function S(e,t){if(t&&(e.toLowerCase()===`transparent`||e.toLowerCase()===`none`))return`\x1B[49m`;let n=parseInt(e.slice(1,3),16),r=parseInt(e.slice(3,5),16),i=parseInt(e.slice(5,7),16);return`\x1b[${t?`48`:`38`};2;${n};${r};${i}m`}function C(e,t=!1){if(!e||e===``)return``;let n=e.match(/48;2;(\d+);(\d+);(\d+)/);if(n)return`\x1b[38;2;${n[1]};${n[2]};${n[3]}m`;if(t)return`\x1B[37m`;if(e.includes(`\x1B[`)&&e.includes(`m`)){let t=e.match(/\[(\d+)m/);if(t&&t[1]){let e=parseInt(t[1],10);if(e>=40&&e<=47||e>=100&&e<=107)return`\x1b[${e-10}m`}}return e.replace(`48`,`38`)}function w(e,t){if(t&&(e.toLowerCase()===`transparent`||e.toLowerCase()===`none`))return`\x1B[49m`;let n=((e,t,n)=>e===t&&t===n?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(t/255*5)+Math.round(n/255*5))(parseInt(e.slice(1,3),16),parseInt(e.slice(3,5),16),parseInt(e.slice(5,7),16));return`\x1b[${t?`48`:`38`};5;${n}m`}function ee(e,t){if(t&&(e.toLowerCase()===`transparent`||e.toLowerCase()===`none`))return`\x1B[49m`;if(t)return``;let n=parseInt(e.slice(1,3),16),r=parseInt(e.slice(3,5),16),i=parseInt(e.slice(5,7),16);return r>n&&r>i&&r>120?`\x1B[32m`:n>r&&n>i&&n>120?`\x1B[31m`:i>n&&i>r&&i>120?`\x1B[34m`:(n+r+i)/3>150?`\x1B[37m`:`\x1B[90m`}function T(e,t){let n=parseInt(e.slice(1,3),16),r=parseInt(e.slice(3,5),16),i=parseInt(e.slice(5,7),16),a=parseInt(t.slice(1,3),16),o=parseInt(t.slice(3,5),16),s=parseInt(t.slice(5,7),16);return Math.sqrt((n-a)**2+(r-o)**2+(i-s)**2)}function E(){let{env:t}=e,r=!0;t.NO_COLOR&&t.NO_COLOR!==``&&(r=!1);let i=t.FORCE_COLOR;if(i&&i!==``)return i===`false`||i===`0`?`none`:i===`true`||i===`1`?`ansi`:i===`2`?`ansi256`:i===`3`?`truecolor`:`ansi`;if(!r||t.TERM===`dumb`)return`none`;if(t.CI)return[`GITHUB_ACTIONS`,`GITEA_ACTIONS`,`CIRCLECI`].some(e=>e in t)?`truecolor`:`ansi`;if(t.COLORTERM===`truecolor`||[`xterm-kitty`,`xterm-ghostty`,`wezterm`,`alacritty`,`foot`,`contour`].includes(t.TERM||``))return`truecolor`;if(t.TERM_PROGRAM)switch(t.TERM_PROGRAM){case`iTerm.app`:return`truecolor`;case`Apple_Terminal`:return`ansi256`;case`vscode`:return`truecolor`;case`Tabby`:return`truecolor`}if(/-256(color)?$/i.test(t.TERM||``))return`ansi256`;if(/-truecolor$/i.test(t.TERM||``))return`truecolor`;if(/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(t.TERM||``)||t.COLORTERM)return`ansi`;if(n?.WriteStream?.prototype?.hasColors)try{if(!n.WriteStream.prototype.hasColors())return`none`;let e=n.WriteStream.prototype.hasColors(256);return n.WriteStream.prototype.hasColors(16777216)?`truecolor`:e?`ansi256`:`ansi`}catch{}return`ansi`}const D={directory:{bg:`#8b4513`,fg:`#ffffff`},git:{bg:`#404040`,fg:`#ffffff`},model:{bg:`#2d2d2d`,fg:`#ffffff`},session:{bg:`#202020`,fg:`#00ffff`},block:{bg:`#2a2a2a`,fg:`#87ceeb`},today:{bg:`#1a1a1a`,fg:`#98fb98`},tmux:{bg:`#2f4f2f`,fg:`#90ee90`},context:{bg:`#4a5568`,fg:`#cbd5e0`},contextWarning:{bg:`#92400e`,fg:`#fbbf24`},contextCritical:{bg:`#991b1b`,fg:`#fca5a5`},metrics:{bg:`#374151`,fg:`#d1d5db`},version:{bg:`#3a3a4a`,fg:`#b8b8d0`},env:{bg:`#2d2d3d`,fg:`#d0a0d0`},weekly:{bg:`#2a2a3a`,fg:`#a0c4e8`},agent:{bg:`#2a2a4a`,fg:`#b0a8e0`},thinking:{bg:`#2a2a3a`,fg:`#c792ea`},cacheTimer:{bg:`#1f3a1f`,fg:`#90ee90`}},O={directory:{bg:`#af5f00`,fg:`#ffffff`},git:{bg:`#444444`,fg:`#ffffff`},model:{bg:`#3a3a3a`,fg:`#ffffff`},session:{bg:`#262626`,fg:`#00ffff`},block:{bg:`#303030`,fg:`#87ceeb`},today:{bg:`#1c1c1c`,fg:`#87ff87`},tmux:{bg:`#444444`,fg:`#87ff87`},context:{bg:`#585858`,fg:`#d0d0d0`},contextWarning:{bg:`#af5f00`,fg:`#ffaf00`},contextCritical:{bg:`#870000`,fg:`#ff8787`},metrics:{bg:`#4e4e4e`,fg:`#d0d0d0`},version:{bg:`#444444`,fg:`#d7afff`},env:{bg:`#3a3a3a`,fg:`#d787d7`},weekly:{bg:`#303030`,fg:`#87afd7`},agent:{bg:`#3a3a5f`,fg:`#afafd7`},thinking:{bg:`#2a2a3a`,fg:`#d787ff`},cacheTimer:{bg:`#1c2e1c`,fg:`#87ff87`}},k={directory:{bg:`#d75f00`,fg:`#ffffff`},git:{bg:`#585858`,fg:`#ffffff`},model:{bg:`#444444`,fg:`#ffffff`},session:{bg:`#303030`,fg:`#00ffff`},block:{bg:`#3a3a3a`,fg:`#5fafff`},today:{bg:`#262626`,fg:`#00ff00`},tmux:{bg:`#585858`,fg:`#00ff00`},context:{bg:`#808080`,fg:`#ffffff`},contextWarning:{bg:`#d75f00`,fg:`#ffff00`},contextCritical:{bg:`#af0000`,fg:`#ff0000`},metrics:{bg:`#666666`,fg:`#ffffff`},version:{bg:`#585858`,fg:`#af87ff`},env:{bg:`#444444`,fg:`#ff87ff`},weekly:{bg:`#3a3a3a`,fg:`#5fafff`},agent:{bg:`#444444`,fg:`#af87ff`},thinking:{bg:`#444444`,fg:`#ff87ff`},cacheTimer:{bg:`#2f4f2f`,fg:`#00ff00`}},te={directory:{bg:`#ff6b47`,fg:`#ffffff`},git:{bg:`#4fb3d9`,fg:`#ffffff`},model:{bg:`#87ceeb`,fg:`#000000`},session:{bg:`#da70d6`,fg:`#ffffff`},block:{bg:`#6366f1`,fg:`#ffffff`},today:{bg:`#10b981`,fg:`#ffffff`},tmux:{bg:`#32cd32`,fg:`#ffffff`},context:{bg:`#718096`,fg:`#ffffff`},contextWarning:{bg:`#d97706`,fg:`#ffffff`},contextCritical:{bg:`#dc2626`,fg:`#ffffff`},metrics:{bg:`#6b7280`,fg:`#ffffff`},version:{bg:`#8b7dd8`,fg:`#ffffff`},env:{bg:`#d45dbf`,fg:`#ffffff`},weekly:{bg:`#4f46e5`,fg:`#ffffff`},agent:{bg:`#7c3aed`,fg:`#ffffff`},thinking:{bg:`#7c3aed`,fg:`#ffffff`},cacheTimer:{bg:`#059669`,fg:`#ffffff`}},ne={directory:{bg:`#ff5f5f`,fg:`#ffffff`},git:{bg:`#5fafff`,fg:`#ffffff`},model:{bg:`#87d7ff`,fg:`#000000`},session:{bg:`#ff5fff`,fg:`#ffffff`},block:{bg:`#5f5fff`,fg:`#ffffff`},today:{bg:`#00d787`,fg:`#ffffff`},tmux:{bg:`#00ff5f`,fg:`#ffffff`},context:{bg:`#808080`,fg:`#ffffff`},contextWarning:{bg:`#d78700`,fg:`#ffffff`},contextCritical:{bg:`#d70000`,fg:`#ffffff`},metrics:{bg:`#767676`,fg:`#ffffff`},version:{bg:`#af87ff`,fg:`#ffffff`},env:{bg:`#d787af`,fg:`#ffffff`},weekly:{bg:`#5f5fff`,fg:`#ffffff`},agent:{bg:`#8787d7`,fg:`#ffffff`},thinking:{bg:`#8700d7`,fg:`#ffffff`},cacheTimer:{bg:`#00875f`,fg:`#ffffff`}},re={directory:{bg:`#ff5f5f`,fg:`#ffffff`},git:{bg:`#5fafff`,fg:`#ffffff`},model:{bg:`#87d7ff`,fg:`#000000`},session:{bg:`#ff5fff`,fg:`#ffffff`},block:{bg:`#5f5fff`,fg:`#ffffff`},today:{bg:`#00d787`,fg:`#ffffff`},tmux:{bg:`#00ff5f`,fg:`#ffffff`},context:{bg:`#808080`,fg:`#ffffff`},contextWarning:{bg:`#d78700`,fg:`#ffffff`},contextCritical:{bg:`#d70000`,fg:`#ffffff`},metrics:{bg:`#767676`,fg:`#ffffff`},version:{bg:`#af87ff`,fg:`#ffffff`},env:{bg:`#d787af`,fg:`#ffffff`},weekly:{bg:`#5f5fff`,fg:`#ffffff`},agent:{bg:`#5f5fff`,fg:`#ffffff`},thinking:{bg:`#8700d7`,fg:`#ffffff`},cacheTimer:{bg:`#00875f`,fg:`#ffffff`}},ie={directory:{bg:`#434c5e`,fg:`#d8dee9`},git:{bg:`#3b4252`,fg:`#a3be8c`},model:{bg:`#4c566a`,fg:`#81a1c1`},session:{bg:`#2e3440`,fg:`#88c0d0`},block:{bg:`#3b4252`,fg:`#81a1c1`},today:{bg:`#2e3440`,fg:`#8fbcbb`},tmux:{bg:`#2e3440`,fg:`#8fbcbb`},context:{bg:`#5e81ac`,fg:`#eceff4`},contextWarning:{bg:`#d08770`,fg:`#2e3440`},contextCritical:{bg:`#bf616a`,fg:`#eceff4`},metrics:{bg:`#b48ead`,fg:`#2e3440`},version:{bg:`#434c5e`,fg:`#88c0d0`},env:{bg:`#3b4252`,fg:`#b48ead`},weekly:{bg:`#3b4252`,fg:`#88c0d0`},agent:{bg:`#4c566a`,fg:`#b48ead`},thinking:{bg:`#3b4252`,fg:`#b48ead`},cacheTimer:{bg:`#3b4252`,fg:`#a3be8c`}},ae={directory:{bg:`#5f87af`,fg:`#e4e4e4`},git:{bg:`#4e4e4e`,fg:`#87d787`},model:{bg:`#6c6c6c`,fg:`#87afd7`},session:{bg:`#3a3a3a`,fg:`#5fafaf`},block:{bg:`#4e4e4e`,fg:`#87afd7`},today:{bg:`#3a3a3a`,fg:`#5fd7d7`},tmux:{bg:`#3a3a3a`,fg:`#5fd7d7`},context:{bg:`#5f87d7`,fg:`#ffffff`},contextWarning:{bg:`#d7875f`,fg:`#3a3a3a`},contextCritical:{bg:`#d75f5f`,fg:`#ffffff`},metrics:{bg:`#d787af`,fg:`#3a3a3a`},version:{bg:`#5f87af`,fg:`#5fafaf`},env:{bg:`#4e4e4e`,fg:`#d787af`},weekly:{bg:`#4e4e4e`,fg:`#5fafaf`},agent:{bg:`#6c6c6c`,fg:`#d787af`},thinking:{bg:`#4e4e4e`,fg:`#d787af`},cacheTimer:{bg:`#4e4e4e`,fg:`#87af87`}},oe={directory:{bg:`#0087af`,fg:`#ffffff`},git:{bg:`#585858`,fg:`#87d700`},model:{bg:`#808080`,fg:`#87afff`},session:{bg:`#444444`,fg:`#00d7d7`},block:{bg:`#585858`,fg:`#87afff`},today:{bg:`#444444`,fg:`#00ffff`},tmux:{bg:`#444444`,fg:`#00ffff`},context:{bg:`#0087ff`,fg:`#ffffff`},contextWarning:{bg:`#d78700`,fg:`#000000`},contextCritical:{bg:`#d75f5f`,fg:`#ffffff`},metrics:{bg:`#ff87d7`,fg:`#444444`},version:{bg:`#0087af`,fg:`#00d7d7`},env:{bg:`#585858`,fg:`#ff87af`},weekly:{bg:`#585858`,fg:`#00d7d7`},agent:{bg:`#808080`,fg:`#ff87af`},thinking:{bg:`#585858`,fg:`#ff87d7`},cacheTimer:{bg:`#585858`,fg:`#87d787`}},se={directory:{bg:`#2f334d`,fg:`#82aaff`},git:{bg:`#1e2030`,fg:`#c3e88d`},model:{bg:`#191b29`,fg:`#fca7ea`},session:{bg:`#222436`,fg:`#86e1fc`},block:{bg:`#2d3748`,fg:`#7aa2f7`},today:{bg:`#1a202c`,fg:`#4fd6be`},tmux:{bg:`#191b29`,fg:`#4fd6be`},context:{bg:`#414868`,fg:`#c0caf5`},contextWarning:{bg:`#ff9e64`,fg:`#1a1b26`},contextCritical:{bg:`#f7768e`,fg:`#1a1b26`},metrics:{bg:`#3d59a1`,fg:`#c0caf5`},version:{bg:`#292e42`,fg:`#bb9af7`},env:{bg:`#24283b`,fg:`#fca7ea`},weekly:{bg:`#24283b`,fg:`#7dcfff`},agent:{bg:`#2d2b55`,fg:`#bb9af7`},thinking:{bg:`#2f2a3d`,fg:`#bb9af7`},cacheTimer:{bg:`#1f2e2a`,fg:`#9ece6a`}},ce={directory:{bg:`#444478`,fg:`#87afff`},git:{bg:`#262640`,fg:`#afff87`},model:{bg:`#1c1c30`,fg:`#ff87ff`},session:{bg:`#3a3a50`,fg:`#5fd7ff`},block:{bg:`#4e4e68`,fg:`#5f87ff`},today:{bg:`#262640`,fg:`#00d7af`},tmux:{bg:`#1c1c30`,fg:`#00d7af`},context:{bg:`#5f5f87`,fg:`#d7d7ff`},contextWarning:{bg:`#ffaf5f`,fg:`#262626`},contextCritical:{bg:`#ff5f87`,fg:`#262626`},metrics:{bg:`#5f5faf`,fg:`#d7d7ff`},version:{bg:`#444460`,fg:`#d787ff`},env:{bg:`#303050`,fg:`#ff87ff`},weekly:{bg:`#303050`,fg:`#5fd7ff`},agent:{bg:`#5f5f87`,fg:`#af87ff`},thinking:{bg:`#444460`,fg:`#d787ff`},cacheTimer:{bg:`#1c3a30`,fg:`#87d787`}},le={directory:{bg:`#5f5faf`,fg:`#87afff`},git:{bg:`#303050`,fg:`#87ff87`},model:{bg:`#262640`,fg:`#ff87ff`},session:{bg:`#444470`,fg:`#00d7ff`},block:{bg:`#666680`,fg:`#5f87ff`},today:{bg:`#303050`,fg:`#00d787`},tmux:{bg:`#262640`,fg:`#00d787`},context:{bg:`#808080`,fg:`#ffffff`},contextWarning:{bg:`#ffaf00`,fg:`#000000`},contextCritical:{bg:`#ff5f5f`,fg:`#000000`},metrics:{bg:`#8787d7`,fg:`#ffffff`},version:{bg:`#585870`,fg:`#d787ff`},env:{bg:`#444470`,fg:`#ff87ff`},weekly:{bg:`#444470`,fg:`#00d7ff`},agent:{bg:`#5f5faf`,fg:`#d787ff`},thinking:{bg:`#585870`,fg:`#d787ff`},cacheTimer:{bg:`#305050`,fg:`#00d787`}},ue={directory:{bg:`#26233a`,fg:`#c4a7e7`},git:{bg:`#1f1d2e`,fg:`#9ccfd8`},model:{bg:`#191724`,fg:`#ebbcba`},session:{bg:`#26233a`,fg:`#f6c177`},block:{bg:`#2a273f`,fg:`#eb6f92`},today:{bg:`#232136`,fg:`#9ccfd8`},tmux:{bg:`#26233a`,fg:`#908caa`},context:{bg:`#393552`,fg:`#e0def4`},contextWarning:{bg:`#f6c177`,fg:`#191724`},contextCritical:{bg:`#eb6f92`,fg:`#191724`},metrics:{bg:`#524f67`,fg:`#e0def4`},version:{bg:`#2a273f`,fg:`#c4a7e7`},env:{bg:`#21202e`,fg:`#eb6f92`},weekly:{bg:`#21202e`,fg:`#c4a7e7`},agent:{bg:`#2a273f`,fg:`#c4a7e7`},thinking:{bg:`#26223a`,fg:`#c4a7e7`},cacheTimer:{bg:`#1f2d2e`,fg:`#9ccfd8`}},de={directory:{bg:`#444444`,fg:`#d787d7`},git:{bg:`#262626`,fg:`#87d7d7`},model:{bg:`#1c1c1c`,fg:`#ffaf87`},session:{bg:`#444444`,fg:`#d7af5f`},block:{bg:`#4e4e4e`,fg:`#ff5f87`},today:{bg:`#3a3a3a`,fg:`#87d7d7`},tmux:{bg:`#444444`,fg:`#9e9e9e`},context:{bg:`#585858`,fg:`#e4e4e4`},contextWarning:{bg:`#d7af5f`,fg:`#1c1c1c`},contextCritical:{bg:`#ff5f87`,fg:`#1c1c1c`},metrics:{bg:`#767676`,fg:`#e4e4e4`},version:{bg:`#4e4e4e`,fg:`#d787d7`},env:{bg:`#303030`,fg:`#ff5f87`},weekly:{bg:`#303030`,fg:`#d787d7`},agent:{bg:`#4e4e4e`,fg:`#d787d7`},thinking:{bg:`#303030`,fg:`#d787d7`},cacheTimer:{bg:`#303030`,fg:`#87d7d7`}},fe={directory:{bg:`#585858`,fg:`#ff87ff`},git:{bg:`#303030`,fg:`#00d7d7`},model:{bg:`#262626`,fg:`#ffaf87`},session:{bg:`#585858`,fg:`#d7af00`},block:{bg:`#666666`,fg:`#ff5f87`},today:{bg:`#444444`,fg:`#00d7d7`},tmux:{bg:`#585858`,fg:`#bcbcbc`},context:{bg:`#808080`,fg:`#ffffff`},contextWarning:{bg:`#d7af00`,fg:`#000000`},contextCritical:{bg:`#ff5f5f`,fg:`#000000`},metrics:{bg:`#a8a8a8`,fg:`#000000`},version:{bg:`#666666`,fg:`#ff87ff`},env:{bg:`#444444`,fg:`#ff5f87`},weekly:{bg:`#444444`,fg:`#ff87ff`},agent:{bg:`#666666`,fg:`#ff87ff`},thinking:{bg:`#444444`,fg:`#ff87ff`},cacheTimer:{bg:`#444444`,fg:`#00d7d7`}},pe={directory:{bg:`#504945`,fg:`#ebdbb2`},git:{bg:`#3c3836`,fg:`#b8bb26`},model:{bg:`#665c54`,fg:`#83a598`},session:{bg:`#282828`,fg:`#8ec07c`},block:{bg:`#3c3836`,fg:`#83a598`},today:{bg:`#282828`,fg:`#fabd2f`},tmux:{bg:`#282828`,fg:`#fe8019`},context:{bg:`#458588`,fg:`#ebdbb2`},contextWarning:{bg:`#d79921`,fg:`#282828`},contextCritical:{bg:`#cc241d`,fg:`#ebdbb2`},metrics:{bg:`#d3869b`,fg:`#282828`},version:{bg:`#504945`,fg:`#8ec07c`},env:{bg:`#3c3836`,fg:`#d3869b`},weekly:{bg:`#3c3836`,fg:`#8ec07c`},agent:{bg:`#504945`,fg:`#d3869b`},thinking:{bg:`#3c3046`,fg:`#d3869b`},cacheTimer:{bg:`#3c3836`,fg:`#b8bb26`}},me={directory:{bg:`#585858`,fg:`#ffffaf`},git:{bg:`#444444`,fg:`#afaf00`},model:{bg:`#6c6c6c`,fg:`#87afaf`},session:{bg:`#303030`,fg:`#87af87`},block:{bg:`#444444`,fg:`#87afaf`},today:{bg:`#303030`,fg:`#ffaf00`},tmux:{bg:`#303030`,fg:`#ff8700`},context:{bg:`#5f8787`,fg:`#ffffaf`},contextWarning:{bg:`#d7af00`,fg:`#303030`},contextCritical:{bg:`#d70000`,fg:`#ffffaf`},metrics:{bg:`#d787af`,fg:`#303030`},version:{bg:`#585858`,fg:`#87af87`},env:{bg:`#444444`,fg:`#d787af`},weekly:{bg:`#444444`,fg:`#87af87`},agent:{bg:`#6c6c6c`,fg:`#d787af`},thinking:{bg:`#444444`,fg:`#d787af`},cacheTimer:{bg:`#444444`,fg:`#afaf00`}},he={directory:{bg:`#808080`,fg:`#ffff00`},git:{bg:`#585858`,fg:`#00ff00`},model:{bg:`#808080`,fg:`#00afff`},session:{bg:`#444444`,fg:`#00d787`},block:{bg:`#585858`,fg:`#00afff`},today:{bg:`#444444`,fg:`#ffaf00`},tmux:{bg:`#444444`,fg:`#ff8700`},context:{bg:`#008787`,fg:`#ffffff`},contextWarning:{bg:`#d7af00`,fg:`#000000`},contextCritical:{bg:`#d70000`,fg:`#ffffff`},metrics:{bg:`#ff87af`,fg:`#444444`},version:{bg:`#808080`,fg:`#00d787`},env:{bg:`#585858`,fg:`#ff87af`},weekly:{bg:`#585858`,fg:`#00d787`},agent:{bg:`#808080`,fg:`#ff87af`},thinking:{bg:`#808080`,fg:`#ff87af`},cacheTimer:{bg:`#585858`,fg:`#ffff00`}},ge={dark:D,"dark-ansi256":O,"dark-ansi":k,light:te,"light-ansi256":ne,"light-ansi":re,nord:ie,"nord-ansi256":ae,"nord-ansi":oe,"tokyo-night":se,"tokyo-night-ansi256":ce,"tokyo-night-ansi":le,"rose-pine":ue,"rose-pine-ansi256":de,"rose-pine-ansi":fe,gruvbox:pe,"gruvbox-ansi256":me,"gruvbox-ansi":he};function _e(e,t){let n=ge[e];if(!n)return null;if(t===`none`||t===`ansi`){let t=ge[`${e}-ansi`];if(t)return t}if(t===`ansi256`){let t=ge[`${e}-ansi256`];if(t)return t}return n}function A(e,...t){process.env.CLAUDE_POWERLINE_DEBUG&&console.error(`[DEBUG] ${e}`,...t)}const ve=a(r);var ye=class{isGitRepo(e){try{return o.existsSync(l.join(e,`.git`))}catch{return!1}}async execGitAsync(e,t){return ve(e,{...t,env:{...process.env,GIT_OPTIONAL_LOCKS:`0`}})}async findGitRoot(e){try{return(await this.execGitAsync(`git rev-parse --show-toplevel`,{cwd:e,encoding:`utf8`,timeout:2e3})).stdout.trim()||null}catch{return null}}async getGitInfo(e,t={},n){let r,i=this.isWorktree(e);if(i)r=e;else if(n&&this.isGitRepo(n))r=n;else if(this.isGitRepo(e))r=e;else{let t=await this.findGitRoot(e);if(!t)return null;r=t}try{let e=await this.getStatusWithBranchAsync(r),n=await this.getAheadBehindAsync(r),a={branch:e.branch||`detached`,status:e.status,ahead:n.ahead,behind:n.behind};t.showWorkingTree&&e.workingTree&&(a.staged=e.workingTree.staged,a.unstaged=e.workingTree.unstaged,a.untracked=e.workingTree.untracked,a.conflicts=e.workingTree.conflicts);let o={},s={};t.showSha&&(o.sha=this.getShaAsync(r)),t.showTag&&(o.tag=this.getNearestTagAsync(r)),t.showTimeSinceCommit&&(o.timeSinceCommit=this.getTimeSinceLastCommitAsync(r)),t.showStashCount&&(s.stashCount=this.getStashCountAsync(r)),t.showUpstream&&(s.upstream=this.getUpstreamAsync(r)),t.showRepoName&&(s.repoName=this.getRepoNameAsync(r));let c=new Map;for(let[e,t]of Object.entries(o))try{let n=await t;c.set(e,n)}catch{}return Object.keys(s).length>0&&(await Promise.allSettled(Object.entries(s).map(async([e,t])=>({key:e,value:await t})))).forEach(e=>{e.status===`fulfilled`&&c.set(e.value.key,e.value.value)}),t.showSha&&(a.sha=c.get(`sha`)||void 0),t.showOperation&&(a.operation=this.getOngoingOperation(r)||void 0),t.showTag&&(a.tag=c.get(`tag`)||void 0),t.showTimeSinceCommit&&(a.timeSinceCommit=c.get(`timeSinceCommit`)||void 0),t.showStashCount&&(a.stashCount=c.get(`stashCount`)||0),t.showUpstream&&(a.upstream=c.get(`upstream`)||void 0),t.showRepoName&&(a.repoName=c.get(`repoName`)||void 0,a.isWorktree=i),a}catch{return null}}async getShaAsync(e){try{return(await this.execGitAsync(`git rev-parse --short=7 HEAD`,{cwd:e,encoding:`utf8`,timeout:2e3})).stdout.trim()||null}catch{return null}}resolveGitDir(e){let t=l.join(e,`.git`);if(o.existsSync(t)&&o.statSync(t).isFile()){let n=o.readFileSync(t,`utf-8`).match(/^gitdir:\s*(.+)$/m);if(n?.[1])return l.resolve(e,n[1].trim())}return t}getOngoingOperation(e){try{let t=this.resolveGitDir(e);return o.existsSync(l.join(t,`MERGE_HEAD`))?`MERGE`:o.existsSync(l.join(t,`CHERRY_PICK_HEAD`))?`CHERRY-PICK`:o.existsSync(l.join(t,`REVERT_HEAD`))?`REVERT`:o.existsSync(l.join(t,`BISECT_LOG`))?`BISECT`:o.existsSync(l.join(t,`rebase-merge`))||o.existsSync(l.join(t,`rebase-apply`))?`REBASE`:null}catch{return null}}async getNearestTagAsync(e){try{return(await this.execGitAsync(`git describe --tags --abbrev=0`,{cwd:e,encoding:`utf8`,timeout:2e3})).stdout.trim()||null}catch{return null}}async getTimeSinceLastCommitAsync(e){try{let t=(await this.execGitAsync(`git log -1 --format=%ct`,{cwd:e,encoding:`utf8`,timeout:2e3})).stdout.trim();if(!t)return null;let n=parseInt(t)*1e3;return Math.floor((Date.now()-n)/1e3)}catch{return null}}async getStashCountAsync(e){try{let t=(await this.execGitAsync(`git stash list`,{cwd:e,encoding:`utf8`,timeout:2e3})).stdout.trim();return t?t.split(` `).length:0}catch{return 0}}async getUpstreamAsync(e){try{return(await this.execGitAsync(`git rev-parse --abbrev-ref @{u}`,{cwd:e,encoding:`utf8`,timeout:2e3})).stdout.trim()||null}catch{return null}}async getRepoNameAsync(e){try{let t=(await this.execGitAsync(`git config --get remote.origin.url`,{cwd:e,encoding:`utf8`,timeout:2e3})).stdout.trim();return t&&t.match(/\/([^/]+?)(\.git)?$/)?.[1]||l.basename(e)}catch{return l.basename(e)}}isWorktree(e){try{let t=l.join(e,`.git`);return!!(o.existsSync(t)&&o.statSync(t).isFile())}catch{return!1}}async getStatusWithBranchAsync(e){try{A(`[GIT-EXEC] Running git status in ${e}`);let t=(await this.execGitAsync(`git status --porcelain -b`,{cwd:e,encoding:`utf8`,timeout:2e3})).stdout.split(` `),n=null,r=`clean`,i=0,a=0,o=0,s=0;for(let e of t)if(e){if(e.startsWith(`## `)){let t=e.substring(3).split(`...`)[0];t&&t!==`HEAD (no branch)`&&(n=t);continue}if(e.length>=2){let t=e.charAt(0),n=e.charAt(1);if(t===`?`&&n===`?`){o++,r===`clean`&&(r=`dirty`);continue}let c=t+n;if([`DD`,`AU`,`UD`,`UA`,`DU`,`AA`,`UU`].includes(c)){s++,r=`conflicts`;continue}t!==` `&&t!==`?`&&(i++,r===`clean`&&(r=`dirty`)),n!==` `&&n!==`?`&&(a++,r===`clean`&&(r=`dirty`))}}return{branch:n||await this.getFallbackBranch(e),status:r,workingTree:{staged:i,unstaged:a,untracked:o,conflicts:s}}}catch(t){return A(`Git status with branch command failed in ${e}:`,t),{branch:await this.getFallbackBranch(e),status:`clean`}}}async getFallbackBranch(e){try{let t=(await this.execGitAsync(`git branch --show-current`,{cwd:e,encoding:`utf8`,timeout:2e3})).stdout.trim();if(t)return t}catch{try{let t=(await this.execGitAsync(`git symbolic-ref --short HEAD`,{cwd:e,encoding:`utf8`,timeout:2e3})).stdout.trim();if(t)return t}catch{return null}}return null}async getAheadBehindAsync(e){try{A(`[GIT-EXEC] Running git ahead/behind in ${e}`);let[t,n]=await Promise.all([this.execGitAsync(`git rev-list --count @{u}..HEAD`,{cwd:e,encoding:`utf8`,timeout:2e3}),this.execGitAsync(`git rev-list --count HEAD..@{u}`,{cwd:e,encoding:`utf8`,timeout:2e3})]);return{ahead:parseInt(t.stdout.trim())||0,behind:parseInt(n.stdout.trim())||0}}catch(t){return A(`Git ahead/behind command failed in ${e}:`,t),{ahead:0,behind:0}}}};const be=a(r);var xe=class{async getSessionId(){try{if(!process.env.TMUX_PANE)return A(`TMUX_PANE not set, not in tmux session`),null;A(`Getting tmux session ID, TMUX_PANE: ${process.env.TMUX_PANE}`);let e=(await be(`tmux display-message -p '#S'`,{encoding:`utf8`,timeout:1e3})).stdout.trim();return A(`Tmux session ID: ${e||`empty`}`),e||null}catch(e){return A(`Error getting tmux session ID:`,e),null}}isInTmux(){return!!process.env.TMUX_PANE}};function Se(e){let t=e.effort?.level;return typeof t==`string`&&t.trim()||null}function Ce(e){let t=e.thinking?.enabled;return typeof t==`boolean`?t:null}function we(){let e=[],t=process.env.CLAUDE_CONFIG_DIR;if(t&&t.split(`,`).forEach(t=>{let n=t.trim();c(n)&&e.push(n)}),e.length===0){let t=h(),n=d(t,`.config`,`claude`),r=d(t,`.claude`);c(n)&&e.push(n),c(r)&&e.push(r)}return e}async function Te(e){let t=[];for(let n of e){let e=d(n,`projects`);if(c(e))try{let n=await y(e,{withFileTypes:!0});for(let r of n)if(r.isDirectory()){let n=d(e,r.name);t.push(n)}}catch(t){A(`Failed to read projects directory ${e}:`,t)}}return t}async function Ee(e){let t=await Te(we());for(let n of t){let t=d(n,`${e}.jsonl`);if(c(t))return t}return null}async function De(e,t){let n=[],r=d(t,e,`subagents`);try{let t=(await y(r)).filter(e=>e.startsWith(`agent-`)&&e.endsWith(`.jsonl`));for(let i of t){let t=d(r,i);try{let r=(await v(t,`utf-8`)).split(` `)[0];r&&JSON.parse(r).sessionId===e&&n.push(t)}catch{A(`Failed to check agent file ${t}`)}}}catch(e){A(`Failed to read subagents directory ${r}:`,e)}return n}async function Oe(e){try{return(await b(e)).mtime}catch{return null}}function ke(e){let t=e.message?.id||(typeof e.raw.message==`object`&&e.raw.message!==null&&`id`in e.raw.message?e.raw.message.id:void 0),n=`requestId`in e.raw?e.raw.requestId:void 0;return!t||!n?null:`${t}:${n}`}async function j(e){try{let t=(await b(e)).size,n;return t>1048576?(A(`Using streaming parser for large file ${e} (${Math.round(t/1024)}KB)`),n=await je(e)):n=await Ae(e),A(`Parsed ${n.length} entries from ${e}`),n}catch(t){return A(`Failed to read file ${e}:`,t),[]}}async function Ae(e){let t=(await v(e,`utf-8`)).trim().split(` `).filter(e=>e.trim()),n=[];for(let e of t)try{let t=JSON.parse(e);if(!t.timestamp)continue;let r={timestamp:new Date(t.timestamp),message:t.message,costUSD:typeof t.costUSD==`number`?t.costUSD:void 0,isSidechain:t.isSidechain===!0,raw:t};n.push(r)}catch(e){A(`Failed to parse JSONL line: ${e}`);continue}return n}async function je(e){return new Promise((t,n)=>{let r=[],i=s(e,{encoding:`utf8`}),a=x({input:i,crlfDelay:1/0});a.on(`line`,e=>{let t=e.trim();if(t)try{let e=JSON.parse(t);if(!e.timestamp)return;let n={timestamp:new Date(e.timestamp),message:e.message,costUSD:typeof e.costUSD==`number`?e.costUSD:void 0,isSidechain:e.isSidechain===!0,raw:e};r.push(n)}catch(e){A(`Failed to parse JSONL line: ${e}`)}}),a.on(`close`,()=>{t(r)}),a.on(`error`,t=>{A(`Streaming parser error for ${e}:`,t),n(t)}),i.on(`error`,t=>{A(`File stream error for ${e}:`,t),n(t)})})}async function Me(e){try{let t=await Oe(e);return t?{filePath:e,mtime:t}:null}catch{return null}}async function Ne(e,t){try{let n=await y(e,{withFileTypes:!0}),r=n.filter(e=>!e.isDirectory()&&e.name.endsWith(`.jsonl`)).map(t=>Me(d(e,t.name))),i=n.filter(e=>e.isDirectory()).map(async t=>{let n=d(e,t.name,`subagents`);try{return(await y(n)).filter(e=>e.startsWith(`agent-`)&&e.endsWith(`.jsonl`)).map(e=>Me(d(n,e)))}catch{return[]}}),[a,o]=await Promise.all([Promise.all(r),Promise.all(i).then(e=>Promise.all(e.flat()))]);return[...a,...o].filter(e=>e!==null&&(!t||t(e.filePath,e.mtime)))}catch(t){return A(`Failed to read project directory ${e}:`,t),[]}}async function Pe(e,t,n=!1){let r=await Te(we()),i=new Set,a=r.map(e=>Ne(e,t)),o=(await Promise.all(a)).flat().filter(e=>e!==null);n&&o.sort((e,t)=>t.mtime.getTime()-e.mtime.getTime());let s=o.map(e=>e.filePath),c=[],l=s.map(async t=>(await j(t)).filter(t=>!e||e(t))),u=await Promise.all(l);for(let e of u)c.push(...e);c.sort((e,t)=>e.timestamp.getTime()-t.timestamp.getTime());let d=[];for(let e of c){let t=ke(e);t&&i.has(t)||(t&&i.add(t),d.push(e))}return d}var M=class{static CACHE_DIR=l.join(h(),`.claude`,`powerline`);static USAGE_CACHE_DIR=l.join(this.CACHE_DIR,`usage`);static LOCKS_DIR=l.join(this.CACHE_DIR,`locks`);static isLocked(e){let t=l.join(this.LOCKS_DIR,e);if(!o.existsSync(t))return!1;try{let n=o.readFileSync(t,`utf-8`),r=parseInt(n.trim(),10);if(isNaN(r))return A(`Invalid PID in lock file ${e}, removing stale lock`),o.unlinkSync(t),!1;try{return process.kill(r,0),!0}catch(n){return n.code===`ESRCH`?(A(`Removing stale lock file ${e} for dead process ${r}`),o.unlinkSync(t),!1):(A(`Error checking process ${r} for lock ${e}:`,n),!0)}}catch(t){return A(`Error reading lock file ${e}:`,t),!0}}static async acquireLock(e,t=5e3){await this.ensureCacheDirectories();let n=l.join(this.LOCKS_DIR,e),r=Date.now(),i=String(process.pid);for(;Date.now()-r<t;)try{return await o.promises.writeFile(n,i,{flag:`wx`}),A(`Lock acquired for ${e}`),!0}catch(e){if(e.code===`EEXIST`)await _(50);else throw e}return A(`Failed to acquire lock for ${e} within ${t}ms`),!1}static async releaseLock(e){let t=l.join(this.LOCKS_DIR,e);try{await o.promises.unlink(t),A(`Lock released for ${e}`)}catch(t){t.code!==`ENOENT`&&A(`Error releasing lock for ${e}:`,t)}}static async ensureCacheDirectories(){try{await Promise.all([o.promises.mkdir(this.CACHE_DIR,{recursive:!0}),o.promises.mkdir(this.USAGE_CACHE_DIR,{recursive:!0}),o.promises.mkdir(this.LOCKS_DIR,{recursive:!0})])}catch(e){A(`Failed to create cache directories:`,e)}}static createProjectHash(e){return g(`md5`).update(e).digest(`hex`).substring(0,8)}static async getUsageCache(e,t){await this.ensureCacheDirectories();let n=l.join(this.USAGE_CACHE_DIR,`${e}.json`),r=`${e}.usage.lock`;for(let i=0;i<3;i++){if(this.isLocked(r)){A(`Cache for ${e} is locked, waiting...`),await _(75);continue}try{let r=await o.promises.readFile(n,`utf-8`),i=JSON.parse(r);return!t||i.timestamp>=t?(A(`[CACHE-HIT] ${e} disk cache: found`),this.deserializeDates(i.data)):(A(`${e} cache outdated: cache=${i.timestamp}, latest=${t}`),null)}catch(t){if(t.code===`ENOENT`)return A(`No shared ${e} usage cache found`),null;A(`Attempt ${i+1} failed to read ${e} cache: ${t.message}. Retrying...`),await _(75)}}return A(`Failed to read ${e} cache after 3 attempts.`),null}static deserializeDates(e){return Array.isArray(e)?e.map(e=>({...e,timestamp:new Date(e.timestamp)})):e}static async setUsageCache(e,t,n){let r=`${e}.usage.lock`;if(!await this.acquireLock(r)){A(`Could not acquire lock to set usage cache for ${e}`);return}try{await this.ensureCacheDirectories();let r=l.join(this.USAGE_CACHE_DIR,`${e}.json`),i=JSON.stringify({data:t,timestamp:n||Date.now()});await o.promises.writeFile(r,i,`utf-8`),A(`[CACHE-SET] ${e} disk cache stored`)}catch(t){A(`Failed to save ${e} usage cache:`,t)}finally{await this.releaseLock(r)}}static async getLatestTranscriptMtime(){try{let e=await Te(we()),t=0;for(let n of e)try{let e=(await o.promises.readdir(n)).filter(e=>e.endsWith(`.jsonl`));for(let r of e){let e=await Oe(l.join(n,r));e&&e.getTime()>t&&(t=e.getTime())}}catch(e){A(`Failed to read project directory ${n}:`,e);continue}return t}catch(e){return A(`Failed to get latest transcript mtime:`,e),Date.now()}}};const N={"claude-haiku-4-5-20251001":{name:`Claude Haiku 4.5`,input:1,output:5,cache_write_5m:1.25,cache_write_1h:2,cache_read:.1},"claude-haiku-4-5":{name:`Claude Haiku 4.5`,input:1,output:5,cache_write_5m:1.25,cache_write_1h:2,cache_read:.1},"claude-opus-4-20250514":{name:`Claude Opus 4`,input:15,output:75,cache_write_5m:18.75,cache_write_1h:30,cache_read:1.5},"claude-opus-4-1":{name:`Claude Opus 4.1`,input:15,output:75,cache_write_5m:18.75,cache_write_1h:30,cache_read:1.5},"claude-opus-4-1-20250805":{name:`Claude Opus 4.1`,input:15,output:75,cache_write_5m:18.75,cache_write_1h:30,cache_read:1.5},"claude-sonnet-4-20250514":{name:`Claude Sonnet 4`,input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"claude-4-opus-20250514":{name:`Claude 4 Opus`,input:15,output:75,cache_write_5m:18.75,cache_write_1h:30,cache_read:1.5},"claude-4-sonnet-20250514":{name:`Claude 4 Sonnet`,input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"claude-sonnet-4-5":{name:`Claude Sonnet 4.5`,input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"claude-sonnet-4-5-20250929":{name:`Claude Sonnet 4.5`,input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"claude-opus-4-5":{name:`Claude Opus 4.5`,input:5,output:25,cache_write_5m:6.25,cache_write_1h:10,cache_read:.5},"claude-opus-4-5-20251101":{name:`Claude Opus 4.5`,input:5,output:25,cache_write_5m:6.25,cache_write_1h:10,cache_read:.5},"claude-opus-4-6":{name:`Claude Opus 4.6`,input:5,output:25,cache_write_5m:6.25,cache_write_1h:10,cache_read:.5},"claude-opus-4-6-20260205":{name:`Claude Opus 4.6`,input:5,output:25,cache_write_5m:6.25,cache_write_1h:10,cache_read:.5},"claude-sonnet-4-6":{name:`Claude Sonnet 4.6`,input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3}};var Fe=class{static executionCache=null;static modelPricingCache=new Map;static GITHUB_PRICING_URL=`https://raw.githubusercontent.com/Owloops/claude-powerline/main/pricing.json`;static async loadDiskCache(){let e=Date.now()-1440*60*1e3;return await M.getUsageCache(`pricing`,e)}static async saveDiskCache(e){await M.setUsageCache(`pricing`,e)}static async fetchPricingData(){return new Promise(e=>{let t=new p(this.GITHUB_PRICING_URL),n=f({hostname:t.hostname,path:t.pathname,headers:{"User-Agent":`claude-powerline`,"Cache-Control":`no-cache`},timeout:5e3},t=>{if(t.statusCode!==200){A(`HTTP ${t.statusCode}: ${t.statusMessage}`),e(null);return}let r=``,i=0;t.on(`data`,t=>{if(i+=t.length,i>1048576){A(`Response too large`),n.destroy(),e(null);return}r+=t}),t.on(`end`,()=>{try{let t=JSON.parse(r),n=t._meta,i={};for(let[e,n]of Object.entries(t))e!==`_meta`&&(i[e]=n);this.validatePricingData(i)?(A(`Fetched fresh pricing from GitHub for ${Object.keys(i).length} models`),A(`Pricing last updated: ${n?.updated||`unknown`}`),e(i)):(A(`Invalid pricing data structure`),e(null))}catch(t){A(`Failed to parse JSON:`,t),e(null)}}),t.on(`error`,t=>{A(`Response error:`,t),e(null)})});n.on(`error`,t=>{A(`Request error:`,t),e(null)}),n.on(`timeout`,()=>{A(`Request timeout`),n.destroy(),e(null)}),n.end()})}static async getCurrentPricing(){if(this.executionCache!==null)return A(`[CACHE-HIT] Pricing execution cache: ${Object.keys(this.executionCache).length} models`),this.executionCache;let e=await this.loadDiskCache();if(e)return A(`[CACHE-HIT] Pricing disk cache: ${Object.keys(e).length} models`),this.executionCache=e,A(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(e).length} models`),e;let t=await this.fetchPricingData();return t?(await this.saveDiskCache(t),A(`[CACHE-SET] Pricing disk cache stored: ${Object.keys(t).length} models`),this.executionCache=t,A(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(t).length} models`),t):(A(`[CACHE-FALLBACK] Using offline pricing data: ${Object.keys(N).length} models`),this.executionCache=N,A(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(N).length} models`),N)}static validatePricingData(e){if(!e||typeof e!=`object`)return!1;for(let[,t]of Object.entries(e)){if(!t||typeof t!=`object`)return!1;let e=t;if(typeof e.input!=`number`||typeof e.output!=`number`||typeof e.cache_read!=`number`)return!1}return!0}static async getModelPricing(e){if(this.modelPricingCache.has(e))return A(`[CACHE-HIT] Model pricing cache: ${e}`),this.modelPricingCache.get(e);let t=await this.getCurrentPricing(),n;return n=t[e]?t[e]:this.fuzzyMatchModel(e,t),this.modelPricingCache.set(e,n),A(`[CACHE-SET] Model pricing cache: ${e}`),n}static fuzzyMatchModel(e,t){let n=e.toLowerCase();for(let[e,r]of Object.entries(t))if(e.toLowerCase()===n)return r;for(let{pattern:e,fallback:r}of[{pattern:[`opus-4-6`,`claude-opus-4-6`],fallback:`claude-opus-4-6-20260205`},{pattern:[`opus-4-5`,`claude-opus-4-5`],fallback:`claude-opus-4-5-20251101`},{pattern:[`opus-4-1`,`claude-opus-4-1`],fallback:`claude-opus-4-1-20250805`},{pattern:[`opus-4`,`claude-opus-4`],fallback:`claude-opus-4-20250514`},{pattern:[`sonnet-4-6`,`sonnet-4.6`,`claude-sonnet-4-6`],fallback:`claude-sonnet-4-6`},{pattern:[`sonnet-4.5`,`4-5-sonnet`,`sonnet-4-5`],fallback:`claude-sonnet-4-5-20250929`},{pattern:[`sonnet-4`,`claude-sonnet-4`],fallback:`claude-sonnet-4-20250514`},{pattern:[`haiku-4.5`,`4-5-haiku`,`haiku-4-5`],fallback:`claude-haiku-4-5-20251001`},{pattern:[`haiku`],fallback:`claude-haiku-4-5-20251001`},{pattern:[`opus`],fallback:`claude-opus-4-20250514`},{pattern:[`sonnet`],fallback:`claude-sonnet-4-5-20250929`}])if(e.some(e=>n.includes(e))&&t[r])return t[r];return t[`claude-sonnet-4-5-20250929`]||{name:`${e} (Unknown Model)`,input:3,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3,output:15}}static async calculateCostForEntry(e){let t=e.message?.usage;if(!t)return 0;let n=this.extractModelId(e),r=await this.getModelPricing(n),i=t.input_tokens||0,a=t.output_tokens||0,o=t.cache_creation_input_tokens||0,s=t.cache_read_input_tokens||0,c=i/1e6*r.input,l=a/1e6*r.output,u=s/1e6*r.cache_read,d=o/1e6*r.cache_write_5m;return c+l+d+u}static extractModelId(e){if(e.model&&typeof e.model==`string`)return e.model;let t=e.message;if(t?.model){let e=t.model;if(typeof e==`string`)return e;let n=e;return(typeof n?.id==`string`?n.id:null)||`claude-sonnet-4-5-20250929`}return e.model_id&&typeof e.model_id==`string`?e.model_id:`claude-sonnet-4-5-20250929`}};function Ie(e){return{timestamp:e.timestamp.toISOString(),message:{usage:{input_tokens:e.message?.usage?.input_tokens||0,output_tokens:e.message?.usage?.output_tokens||0,cache_creation_input_tokens:e.message?.usage?.cache_creation_input_tokens,cache_read_input_tokens:e.message?.usage?.cache_read_input_tokens}},costUSD:e.costUSD}}var Le=class{async getSessionUsage(e){try{let t=await Ee(e);if(!t)return A(`No transcript found for session: ${e}`),null;A(`Found transcript at: ${t}`);let n=await j(t),r=await De(e,u(t));A(`Found ${r.length} agent transcripts for session`);for(let e of r){let t=await j(e);n.push(...t)}if(n.length===0)return{totalCost:0,entries:[]};let i=[],a=0;for(let e of n)if(e.message?.usage){let t=Ie(e);if(t.costUSD!==void 0)a+=t.costUSD;else{let n=await Fe.calculateCostForEntry(e.raw);t.costUSD=n,a+=n}i.push(t)}return A(`Parsed ${i.length} usage entries, total cost: $${a.toFixed(4)}`),{totalCost:a,entries:i}}catch(t){return A(`Error reading session usage for ${e}:`,t),null}}calculateTokenBreakdown(e){return e.reduce((e,t)=>({input:e.input+(t.message.usage.input_tokens||0),output:e.output+(t.message.usage.output_tokens||0),cacheCreation:e.cacheCreation+(t.message.usage.cache_creation_input_tokens||0),cacheRead:e.cacheRead+(t.message.usage.cache_read_input_tokens||0)}),{input:0,output:0,cacheCreation:0,cacheRead:0})}async getSessionInfo(e,t){let n=await this.getSessionUsage(e);if(!n||n.entries.length===0)return{cost:null,calculatedCost:null,officialCost:null,tokens:null,tokenBreakdown:null};let r=this.calculateTokenBreakdown(n.entries),i=r.input+r.output+r.cacheCreation+r.cacheRead,a=n.totalCost,o=t?.cost?.total_cost_usd??null;return{cost:a??o,calculatedCost:a,officialCost:o,tokens:i,tokenBreakdown:r}}},Re=class{sessionProvider=new Le;async getUsageInfo(e,t){try{return A(`Starting usage info retrieval for session: ${e}`),{session:await this.sessionProvider.getSessionInfo(e,t)}}catch(t){return A(`Error getting usage info for session ${e}:`,t),{session:{cost:null,calculatedCost:null,officialCost:null,tokens:null,tokenBreakdown:null}}}}},ze=class{thresholds={LOW:50,MEDIUM:80};config;constructor(e){this.config=e}getContextUsageThresholds(){return this.thresholds}getContextLimit(e){let t=this.config.modelContextLimits||{default:2e5};return t[this.getModelType(e)]||t.default||2e5}getModelType(e){let t=e.toLowerCase();return t.includes(`sonnet`)?`sonnet`:t.includes(`opus`)?`opus`:`default`}calculatePercentages(e,t,n=33e3){let r=Math.min(100,Math.max(0,Math.round(e/t*100))),i=Math.max(1,t-n),a=Math.min(100,Math.max(0,Math.round(e/i*100)));return{percentage:r,usablePercentage:a,contextLeftPercentage:Math.max(0,100-a),usableTokens:i}}calculateContextFromHookData(e,t=33e3){let n=e.context_window?.current_usage;if(!n)return A(`No current_usage in hook data, falling back to transcript parsing`),null;let r=e.context_window?.context_window_size||2e5,i=(n.input_tokens||0)+(n.cache_creation_input_tokens||0)+(n.cache_read_input_tokens||0);A(`Native current_usage: input=${n.input_tokens}, cache_create=${n.cache_creation_input_tokens}, cache_read=${n.cache_read_input_tokens}, total=${i} (limit: ${r})`);let a=e.context_window?.used_percentage,o=this.calculatePercentages(i,r,t);return a!=null&&(o.percentage=Math.round(a),A(`Using native used_percentage: ${a}%`)),{totalTokens:i,maxTokens:r,...o}}async calculateContextTokensFromTranscript(e,t,n=33e3){try{A(`Calculating context tokens from transcript: ${e}`);let r=await j(e);if(r.length===0)return A(`No entries in transcript`),null;let i=null;for(let e=r.length-1;e>=0;e--){let t=r[e];if(t&&t.message?.usage?.input_tokens&&t.isSidechain!==!0){i=t,A(`Context segment: Found most recent entry at ${t.timestamp.toISOString()}, stopping search`);break}}if(i?.message?.usage){let e=i.message.usage,r=(e.input_tokens||0)+(e.cache_read_input_tokens||0)+(e.cache_creation_input_tokens||0),a=t?this.getContextLimit(t):2e5;return A(`Most recent main chain context: ${r} tokens (limit: ${a})`),{totalTokens:r,maxTokens:a,...this.calculatePercentages(r,a,n)}}return A(`No main chain entries with usage data found`),null}catch(e){return A(`Error reading transcript: ${e instanceof Error?e.message:String(e)}`),null}}async getContextInfo(e,t=33e3){return this.calculateContextFromHookData(e,t)||this.calculateContextTokensFromTranscript(e.transcript_path,e.model?.id,t)}},Be=class{async loadTranscriptEntries(e){try{let t=await Ee(e);if(!t)return A(`No transcript found for session: ${e}`),[];A(`Loading transcript from: ${t}`);let n=(await v(t,`utf-8`)).trim().split(` `).filter(e=>e.trim()),r=[];for(let e of n)try{let t=JSON.parse(e);if(t.isSidechain===!0)continue;r.push(t)}catch(e){A(`Failed to parse JSONL line: ${e}`);continue}return A(`Loaded ${r.length} transcript entries`),r}catch(t){return A(`Error loading transcript for ${e}:`,t),[]}}calculateMessageCount(e){return e.filter(e=>{let t=e.type||e.message?.role||e.message?.type,n=e.type===`user`&&e.message?.content?.[0]?.type===`tool_result`;return t===`user`&&!n}).length}calculateLastResponseTime(e){if(e.length===0)return null;let t=e.slice(-20),n=null,r=null;for(let e of t)if(e.timestamp)try{let t=new Date(e.timestamp),i=e.type||e.message?.role||e.message?.type,a=e.type===`user`&&e.message?.content?.[0]?.type===`tool_result`;if(i===`user`&&!a)n=t;else if(i===`assistant`&&n){let e=(t.getTime()-n.getTime())/1e3;e>.1&&e<300&&(r=e)}}catch{continue}return r}async getMetricsInfo(e,t){try{if(A(`Getting metrics from hook data for session: ${e}`),!t.cost)return A(`No cost data available in hook data`),{responseTime:null,lastResponseTime:null,sessionDuration:null,messageCount:null,linesAdded:null,linesRemoved:null};let n=await this.loadTranscriptEntries(e),r=this.calculateMessageCount(n),i=this.calculateLastResponseTime(n);return{responseTime:t.cost.total_api_duration_ms/1e3,lastResponseTime:i,sessionDuration:t.cost.total_duration_ms/1e3,messageCount:r,linesAdded:t.cost.total_lines_added,linesRemoved:t.cost.total_lines_removed}}catch(t){return A(`Error getting metrics from hook data for session ${e}:`,t),{responseTime:null,lastResponseTime:null,sessionDuration:null,messageCount:null,linesAdded:null,linesRemoved:null}}}},Ve=class{async getCacheTimerInfo(e){let t=e?.transcript_path;if(!t)return A(`CacheTimer: no transcript_path in hookData`),null;let n=await this.lastUserTimestamp(t)??await this.fileMtime(t);return n===null?null:{elapsedSeconds:Math.max(0,Math.floor((Date.now()-n)/1e3))}}async lastUserTimestamp(e){try{let t=(await v(e,`utf-8`)).split(` `);for(let e=t.length-1;e>=0;e--){let n=t[e]?.trim();if(n)try{let e=JSON.parse(n);if((e.type||e.message?.role||e.message?.type)!==`user`||!e.timestamp)continue;let t=Date.parse(e.timestamp);if(Number.isNaN(t))continue;return t}catch{continue}}return null}catch(t){return A(`CacheTimer: readFile failed for ${e}: ${String(t)}`),null}}async fileMtime(e){try{let{mtime:t}=await b(e);return t.getTime()}catch(t){return A(`CacheTimer: stat failed for ${e}: ${String(t)}`),null}}};function P(e){return e===null?`$0.00`:e<.01?`<$0.01`:`$${e.toFixed(2)}`}function He(e){return e===null||e===0?`0 tokens`:e>=1e6?`${(e/1e6).toFixed(1)}M tokens`:e>=1e3?`${(e/1e3).toFixed(1)}K tokens`:`${e} tokens`}function Ue(e){if(!e)return`0 tokens`;let t=[];if(e.input>0&&t.push(`${F(e.input)} in`),e.output>0&&t.push(`${F(e.output)} out`),e.cacheCreation>0||e.cacheRead>0){let n=e.cacheCreation+e.cacheRead;t.push(`${F(n)} cached`)}return t.length>0?t.join(` + `):`0 tokens`}function We(e){return e<60?`${e}s`:e<3600?`${Math.floor(e/60)}m`:e<86400?`${Math.floor(e/3600)}h`:e<604800?`${Math.floor(e/86400)}d`:`${Math.floor(e/604800)}w`}function Ge(e){return e<60?`${e.toFixed(0)}s`:e<3600?`${(e/60).toFixed(0)}m`:e<86400?`${(e/3600).toFixed(1)}h`:`${(e/86400).toFixed(1)}d`}const Ke=/^(?:(?:global|apac|au|eu|us|us-east-\d|us-west-\d|eu-west-\d|eu-central-\d)\.)?(?:anthropic\.|azure_ai\/|bedrock\/|vertex_ai\/)?claude-(?:(?<family>opus|sonnet|haiku)-(?<newMajor>\d+)(?:-(?<newMinor>\d))?|(?<oldMajor>\d+)(?:-(?<oldMinor>\d))?-(?<oldFamily>opus|sonnet|haiku))(?:[-@]\d{8})?(?:-v\d+:\d+)?(?:-latest)?$/i;function qe(e){if(!e)return`Claude`;let t=e.trim().match(Ke);if(!t?.groups)return e;let{family:n,newMajor:r,newMinor:i,oldMajor:a,oldMinor:o,oldFamily:s}=t.groups,c=n||s,l=r||a,u=i||o;return c&&l?`${c.charAt(0).toUpperCase()+c.slice(1).toLowerCase()} ${u?`${l}.${u}`:l}`:e}function Je(e){let t=e.includes(`/`)?`/`:`\\`,n=e.split(t);return n.map((e,t)=>t===n.length-1||e===`~`||e===``?e:e.charAt(0)).join(t)}function Ye(e){return e<60?`${e.toFixed(1)}s`:`${(e/60).toFixed(1)}m`}function F(e){return He(e).replace(` tokens`,``)}function Xe(e,t){let n=t??globalThis.process?.env?.HOME??globalThis.process?.env?.USERPROFILE;return n&&e.startsWith(n)?e.replace(n,`~`):e}function Ze(e){let t=Math.floor(e/60),n=e%60;return t>0?`${t}h ${n}m left`:`${n}m left`}function Qe(e){if(e>=1440){let t=Math.floor(e/1440),n=Math.floor(e%1440/60);return n>0?`${t}d ${n}h`:`${t}d`}else if(e>=60){let t=Math.floor(e/60),n=e%60;return n>0?`${t}h ${n}m`:`${t}h`}return`${e}m`}function $e(e){return Math.round(Math.max(0,e*1e3-Date.now())/6e4)}function et(e){return e>=3600?`1h+`:e>=300?`${Math.floor(e/60)}m`:`${Math.floor(e/60)}:${Math.floor(e%60).toString().padStart(2,`0`)}`}function tt(e,t){return!t||t<=0||e<0?null:Math.min(100,e/t*100)}function nt(e,t,n=80){let r=tt(e,t);if(r===null)return{percentage:null,isWarning:!1,displayText:``};let i=`${r.toFixed(0)}%`,a=r>=n,o=``;return o=a?` !${i}`:r>=50?` +${i}`:` ${i}`,{percentage:r,isWarning:a,displayText:o}}function rt(e,t,n){return n===`tokens`?t:e}function I(e,t,n){if(!n?.amount||n.amount<=0)return{suppressAll:!1,showBase:!0,percentText:``,percentageOnly:!1};let r=n.showValue??!0,i=n.showPercentage??!0,a=rt(e,t,n.type);return a===null?{suppressAll:!1,showBase:!0,percentText:``,percentageOnly:!1}:!r&&!i?{suppressAll:!0,showBase:!1,percentText:``,percentageOnly:!1}:{suppressAll:!1,showBase:r,percentText:i?nt(a,n.amount,n.warningThreshold).displayText.trimStart():``,percentageOnly:!r}}function it(e,t){return t??e??!0}function at(e,t){for(let n of e.display.lines){let e=n.segments[t];if(e?.showIcon!==void 0)return e.showIcon}}function L(e,t){return it(e.display?.showIcons,at(e,t))}const ot={ball:{filled:`─`,empty:`─`,marker:`●`},blocks:{filled:`█`,empty:`░`},"blocks-line":{filled:`█`,empty:`─`},capped:{filled:`━`,empty:`┄`,cap:`╸`},dots:{filled:`●`,empty:`○`},filled:{filled:`■`,empty:`□`},geometric:{filled:`▰`,empty:`▱`},line:{filled:`━`,empty:`┄`},squares:{filled:`◼`,empty:`◻`}};var st=class{constructor(e,t){this.config=e,this.symbols=t}leadingIcon(e,t){return it(this.config.display?.showIcons,t?.showIcon)?`${e} `:``}renderDirectory(e,t,n){let r=e.worktree?.original_cwd||void 0,i=r??(e.workspace?.current_dir||e.cwd||`/`),a=r??e.workspace?.project_dir,o=n?.style??(n?.showBasename?`basename`:`full`);if(o===`basename`)return{text:i.split(/[\\/]/).pop()||`root`,bgColor:t.modeBg,fgColor:t.modeFg};let s=Xe(i),c=a&&Xe(a),l=this.getDisplayDirectoryName(s,c);return o===`fish`&&(l=Je(l)),{text:l,bgColor:t.modeBg,fgColor:t.modeFg}}renderGit(e,t,n){if(!e)return null;let r=[];n?.showRepoName&&e.repoName&&(r.push(e.repoName),e.isWorktree&&r.push(this.symbols.git_worktree)),n?.showOperation&&e.operation&&r.push(`[${e.operation}]`);let i=it(this.config.display?.showIcons,n?.showIcon);if(r.push(i?`${this.symbols.branch} ${e.branch}`:e.branch),n?.showTag&&e.tag&&r.push(`${this.symbols.git_tag} ${e.tag}`),n?.showSha&&e.sha&&r.push(`${this.symbols.git_sha} ${e.sha}`),n?.showAheadBehind!==!1&&(e.ahead>0&&e.behind>0?r.push(`${this.symbols.git_ahead}${e.ahead}${this.symbols.git_behind}${e.behind}`):e.ahead>0?r.push(`${this.symbols.git_ahead}${e.ahead}`):e.behind>0&&r.push(`${this.symbols.git_behind}${e.behind}`)),n?.showWorkingTree){let t=[];e.staged&&e.staged>0&&t.push(`+${e.staged}`),e.unstaged&&e.unstaged>0&&t.push(`~${e.unstaged}`),e.untracked&&e.untracked>0&&t.push(`?${e.untracked}`),e.conflicts&&e.conflicts>0&&t.push(`!${e.conflicts}`),t.length>0&&r.push(`(${t.join(` `)})`)}if(n?.showUpstream&&e.upstream&&r.push(`${this.symbols.git_upstream}${e.upstream}`),n?.showStashCount&&e.stashCount&&e.stashCount>0&&r.push(`${this.symbols.git_stash} ${e.stashCount}`),n?.showTimeSinceCommit&&e.timeSinceCommit!==void 0){let t=We(e.timeSinceCommit);r.push(`${this.symbols.git_time} ${t}`)}let a=this.symbols.git_clean;return e.status===`conflicts`?a=this.symbols.git_conflicts:e.status===`dirty`&&(a=this.symbols.git_dirty),r.push(a),{text:r.join(` `),bgColor:t.gitBg,fgColor:t.gitFg}}renderModel(e,t,n){let r=qe(e.model?.display_name||`Claude`);return{text:`${this.leadingIcon(this.symbols.model,n)}${r}`,bgColor:t.modelBg,fgColor:t.modelFg}}renderSession(e,t,n){let r=n?.type||`cost`,i=n?.costSource,a=this.config.budget?.session,o=this.formatUsageWithBudget(i===`calculated`?e.session.calculatedCost:i===`official`?e.session.officialCost:e.session.cost,e.session.tokens,e.session.tokenBreakdown,r,a);return o===null?null:{text:`${this.leadingIcon(this.symbols.session_cost,n)}${o}`,bgColor:t.sessionBg,fgColor:t.sessionFg}}renderSessionId(e,t,n){return{text:n?.showIdLabel===!1?e:`${this.leadingIcon(this.symbols.session_id,n)}${e}`,bgColor:t.sessionBg,fgColor:t.sessionFg}}renderTmux(e,t){return e?{text:`tmux:${e}`,bgColor:t.tmuxBg,fgColor:t.tmuxFg}:{text:`tmux:none`,bgColor:t.tmuxBg,fgColor:t.tmuxFg}}renderContext(e,t,n){let r=n?.displayStyle??`text`,i=r===`text`?`remaining`:`used`,a=n?.percentageMode??i,o=this.resolveBarStyleDef(r),s=a===`remaining`?`100%`:`0%`;if(!e)return o?{text:`${o.empty.repeat(10)} ${s}`,bgColor:t.contextBg,fgColor:t.contextFg}:{text:`${this.leadingIcon(this.symbols.context_time,n)}0 (${s})`,bgColor:t.contextBg,fgColor:t.contextFg};let c=t.contextBg,l=t.contextFg,u=t.contextBold;e.contextLeftPercentage<=20?(c=t.contextCriticalBg,l=t.contextCriticalFg,u=t.contextCriticalBold):e.contextLeftPercentage<=40&&(c=t.contextWarningBg,l=t.contextWarningFg,u=t.contextWarningBold);let d=a===`remaining`?e.contextLeftPercentage:e.usablePercentage,f=Math.round(e.usablePercentage/100*10),p=10-f;if(o){let t=this.buildBar(o,f,p,10);return{text:n?.showPercentageOnly?`${t} ${d}%`:`${t} ${e.totalTokens.toLocaleString()} (${d}%)`,bgColor:c,fgColor:l,bold:u}}let m=this.leadingIcon(this.symbols.context_time,n);return{text:n?.showPercentageOnly?`${m}${d}%`:`${m}${e.totalTokens.toLocaleString()} (${d}%)`,bgColor:c,fgColor:l,bold:u}}buildBar(e,t,n,r){if(e.marker){let n=Math.min(t,r-1);return e.filled.repeat(n)+e.marker+e.empty.repeat(r-n-1)}return e.cap?t===0?e.cap+e.empty.repeat(r-1):t>=r?e.filled.repeat(r):e.filled.repeat(t-1)+e.cap+e.empty.repeat(n):e.filled.repeat(t)+e.empty.repeat(n)}resolveBarStyleDef(e){return e===`bar`?{filled:this.symbols.bar_filled,empty:this.symbols.bar_empty}:ot[e]??null}formatPercentageWithBar(e,t,n){let r=t??`text`,i=this.resolveBarStyleDef(r);if(i){let t=Math.round(e/100*10),r=10-t,a=this.buildBar(i,t,r,10);return n?`${a} ${e}% (${n})`:`${a} ${e}%`}return n?`${e}% (${n})`:`${e}%`}renderMetrics(e,t,n){if(!e)return{text:`${this.symbols.metrics_response} new`,bgColor:t.metricsBg,fgColor:t.metricsFg};let r=[];if(n?.showLastResponseTime&&e.lastResponseTime!==null){let t=e.lastResponseTime<60?`${e.lastResponseTime.toFixed(1)}s`:`${(e.lastResponseTime/60).toFixed(1)}m`;r.push(`${this.symbols.metrics_last_response} ${t}`)}if(n?.showResponseTime!==!1&&e.responseTime!==null){let t=e.responseTime<60?`${e.responseTime.toFixed(1)}s`:`${(e.responseTime/60).toFixed(1)}m`;r.push(`${this.symbols.metrics_response} ${t}`)}if(n?.showDuration!==!1&&e.sessionDuration!==null){let t=Ge(e.sessionDuration);r.push(`${this.symbols.metrics_duration} ${t}`)}return n?.showMessageCount!==!1&&e.messageCount!==null&&r.push(`${this.symbols.metrics_messages} ${e.messageCount}`),n?.showLinesAdded!==!1&&e.linesAdded!==null&&e.linesAdded>0&&r.push(`${this.symbols.metrics_lines_added} ${e.linesAdded}`),n?.showLinesRemoved!==!1&&e.linesRemoved!==null&&e.linesRemoved>0&&r.push(`${this.symbols.metrics_lines_removed} ${e.linesRem