@owloops/claude-powerline 1.6.3 → 1.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/index.js +9 -23
- package/package.json +1 -2
- package/dist/index.d.ts +0 -17
- package/dist/index.js.map +0 -1
package/README.md
CHANGED
|
@@ -464,6 +464,10 @@ Contributions are welcome! Please feel free to submit issues or pull requests.
|
|
|
464
464
|
|
|
465
465
|
See [CONTRIBUTORS.md](CONTRIBUTORS.md) for people who have contributed outside of GitHub PRs.
|
|
466
466
|
|
|
467
|
+
### Library Usage
|
|
468
|
+
|
|
469
|
+
Claude-powerline is designed as a CLI tool for Claude Code statuslines. While the codebase contains reusable components like `PricingService` and `PowerlineRenderer`, we currently focus on the CLI use case to keep the project simple and maintainable.
|
|
470
|
+
|
|
467
471
|
## License
|
|
468
472
|
|
|
469
473
|
This project is licensed under the [MIT License](LICENSE).
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import
|
|
3
|
-
`);for(let a of
|
|
4
|
-
`).length:0}catch{return 0}}getUpstream(e){try{return execSync("git rev-parse --abbrev-ref @{u}",{cwd:e,encoding:"utf8",timeout:5e3}).trim()||null}catch{return null}}getRepoName(e){try{let t=execSync("git config --get remote.origin.url",{cwd:e,encoding:"utf8",timeout:5e3}).trim();return t?t.match(/\/([^/]+?)(\.git)?$/)?.[1]||
|
|
5
|
-
`),n=null;for(let s of t)if(s.trim())try{let
|
|
6
|
-
`).filter(s=>s.trim()),n=[];for(let s of t)try{let
|
|
7
|
-
`).filter(o=>o.trim()),i=[];for(let o of s)try{let c=JSON.parse(o);if(c.isSidechain===!0)continue;i.push(c);}catch(c){l(`Failed to parse JSONL line: ${c}`);continue}return l(`Loaded ${i.length} transcript entries`),i}catch(t){return l(`Error loading transcript for ${e}:`,t),[]}}calculateResponseTimes(e){let t=[],n=[],s=-1,i=null,o=null,c=-1;for(let g=0;g<e.length;g++){let d=e[g];if(!(!d||!d.timestamp))try{let m=new Date(d.timestamp),p=d.type||d.message?.role||d.message?.type,w=d.type==="user"&&d.message?.content?.[0]?.type==="tool_result";p==="user"&&!w?(t.push(m),i=m,s=g,o=null,c=-1,l(`Found user message at index ${g}, timestamp ${m.toISOString()}`)):s>=0&&(p==="assistant"||w||p==="system"||d.message?.usage)&&(o=m,c=g,p==="assistant"||d.message?.usage?(n.push(m),l(`Found assistant message at index ${g}, timestamp ${m.toISOString()}`)):w?l(`Found tool result at index ${g}, timestamp ${m.toISOString()}`):l(`Found ${p} message at index ${g}, timestamp ${m.toISOString()}`));}catch{continue}}if(t.length===0||n.length===0)return {average:null,last:null};let a=[];for(let g of n){let d=t.filter(m=>m<g);if(d.length>0){let m=new Date(Math.max(...d.map(w=>w.getTime()))),p=(g.getTime()-m.getTime())/1e3;p>.1&&p<300?(a.push(p),l(`Valid response time: ${p.toFixed(1)}s`)):l(`Rejected response time: ${p.toFixed(1)}s (outside 0.1s-5m range)`);}}let u=null;if(i&&o&&c>s){let g=o.getTime()-i.getTime(),d=c-s;g===0&&d>0?(u=d*.1,l(`Estimated last response time from position difference: ${u.toFixed(2)}s (${d} messages)`)):g>0&&(u=g/1e3,l(`Last response time from timestamps: ${u.toFixed(2)}s`)),l(`Last user message at index ${s}, timestamp ${i.toISOString()}`),l(`Last response end at index ${c}, timestamp ${o.toISOString()}`);}if(a.length===0&&u===null)return {average:null,last:null};let f=a.length>0?a.reduce((g,d)=>g+d,0)/a.length:null;return l(`Calculated average response time: ${f?.toFixed(2)||"null"}s from ${a.length} measurements`),l(`Last response time: ${u?.toFixed(2)||"null"}s`),{average:f,last:u}}calculateSessionDuration(e){let t=[];for(let o of e)if(o.timestamp)try{t.push(new Date(o.timestamp));}catch{continue}if(t.length<2)return null;t.sort((o,c)=>o.getTime()-c.getTime());let n=t[t.length-1],s=t[0];if(!n||!s)return null;let i=(n.getTime()-s.getTime())/1e3;return i>0?i:null}calculateBurnRateDuration(e){if(e.length===0)return null;let t=new Date,n=e.map(o=>o.timestamp).filter(Boolean).map(o=>new Date(o)).filter(o=>t.getTime()-o.getTime()<7200*1e3).sort((o,c)=>o.getTime()-c.getTime());if(n.length===0)return null;let s=n[0];return s?Math.max((t.getTime()-s.getTime())/1e3,1800):null}calculateMessageCount(e){return e.filter(t=>{let n=t.type||t.message?.role||t.message?.type,s=t.type==="user"&&t.message?.content?.[0]?.type==="tool_result";return n==="user"&&!s}).length}async calculateTotalCost(e){let t=0,n=new Set;for(let s of e){let i=`${s.timestamp}-${JSON.stringify(s.message?.usage||{})}`;if(n.has(i)){l(`Skipping duplicate entry at ${s.timestamp}`);continue}if(n.add(i),typeof s.costUSD=="number")t+=s.costUSD;else if(s.message?.usage){let o=await S.calculateCostForEntry(s);t+=o;}}return Math.round(t*1e4)/1e4}calculateTotalTokens(e){let t=new Set;return e.reduce((n,s)=>{let i=s.message?.usage;if(!i)return n;let o=`${s.timestamp}-${JSON.stringify(i)}`;return t.has(o)?(l(`Skipping duplicate token entry at ${s.timestamp}`),n):(t.add(o),n+(i.input_tokens||0)+(i.output_tokens||0)+(i.cache_creation_input_tokens||0)+(i.cache_read_input_tokens||0))},0)}async getMetricsInfo(e){try{l(`Starting metrics calculation for session: ${e}`);let t=await this.loadTranscriptEntries(e);if(t.length===0)return {responseTime:null,lastResponseTime:null,sessionDuration:null,messageCount:null,costBurnRate:null,tokenBurnRate:null};let n=this.calculateResponseTimes(t),s=this.calculateSessionDuration(t),i=this.calculateMessageCount(t),o=null,c=null,a=this.calculateBurnRateDuration(t);if(a&&a>60){let u=a/3600;if(u<=0)l(`Invalid hours elapsed: ${u}`);else {let f=await this.calculateTotalCost(t),g=this.calculateTotalTokens(t);f>0&&(o=Math.round(f/u*100)/100,l(`Cost burn rate: $${o}/h (total: $${f}, duration: ${u}h)`)),g>0&&(c=Math.round(g/u),l(`Token burn rate: ${c}/h (total: ${g}, duration: ${u}h)`));}}return l(`Metrics calculated: avgResponseTime=${n.average?.toFixed(2)||"null"}s, lastResponseTime=${n.last?.toFixed(2)||"null"}s, sessionDuration=${s?.toFixed(0)||"null"}s, messageCount=${i}`),{responseTime:n.average,lastResponseTime:n.last,sessionDuration:s,messageCount:i,costBurnRate:o,tokenBurnRate:c}}catch(t){return l(`Error calculating metrics for session ${e}:`,t),{responseTime:null,lastResponseTime:null,sessionDuration:null,messageCount:null,costBurnRate:null,tokenBurnRate:null}}}};var O=class{cachedVersion=null;cacheTimestamp=0;CACHE_TTL=3e4;getClaudeVersion(){let e=Date.now();if(this.cachedVersion!==null&&e-this.cacheTimestamp<this.CACHE_TTL)return this.cachedVersion;try{let t=execSync("claude --version",{encoding:"utf8",timeout:1e3}).trim(),n=t.match(/^([\d.]+)/);return n?(this.cachedVersion=`v${n[1]}`,this.cacheTimestamp=e,l(`Claude Code version: ${this.cachedVersion}`),this.cachedVersion):(l(`Could not parse version from: ${t}`),null)}catch(t){return l("Error getting Claude Code version:",t),null}}async getVersionInfo(){return {version:this.getClaudeVersion()}}};function $(r){return r===null?"$0.00":r<.01?"<$0.01":`$${r.toFixed(2)}`}function _(r){return r===null||r===0?"0 tokens":r>=1e6?`${(r/1e6).toFixed(1)}M tokens`:r>=1e3?`${(r/1e3).toFixed(1)}K tokens`:`${r} tokens`}function he(r){if(!r)return "0 tokens";let e=[];if(r.input>0&&e.push(`${_(r.input).replace(" tokens","")}in`),r.output>0&&e.push(`${_(r.output).replace(" tokens","")}out`),r.cacheCreation>0||r.cacheRead>0){let t=r.cacheCreation+r.cacheRead;e.push(`${_(t).replace(" tokens","")}cached`);}return e.length>0?e.join(" + "):"0 tokens"}function Fe(r,e){return !e||e<=0||r<0?null:Math.min(100,r/e*100)}function ye(r,e,t=80){let n=Fe(r,e);if(n===null)return {percentage:null,isWarning:false,displayText:""};let s=`${n.toFixed(0)}%`,i=n>=t,o="";return i?o=` !${s}`:n>=50?o=` +${s}`:o=` ${s}`,{percentage:n,isWarning:i,displayText:o}}var A=class{constructor(e,t){this.config=e;this.symbols=t;}renderDirectory(e,t,n){let s=e.workspace?.current_dir||e.cwd||"/",i=e.workspace?.project_dir;if(n?.showBasename)return {text:T.basename(s)||"root",bgColor:t.modeBg,fgColor:t.modeFg};let o=process.env.HOME||process.env.USERPROFILE,c=s,a=i;return o&&(s.startsWith(o)&&(c=s.replace(o,"~")),i&&i.startsWith(o)&&(a=i.replace(o,"~"))),{text:this.getDisplayDirectoryName(c,a),bgColor:t.modeBg,fgColor:t.modeFg}}renderGit(e,t,n){if(!e)return null;let s=[];if(n?.showRepoName&&e.repoName&&(s.push(e.repoName),e.isWorktree&&s.push(this.symbols.git_worktree)),n?.showOperation&&e.operation&&s.push(`[${e.operation}]`),s.push(`${this.symbols.branch} ${e.branch}`),n?.showTag&&e.tag&&s.push(`${this.symbols.git_tag} ${e.tag}`),n?.showSha&&e.sha&&s.push(`${this.symbols.git_sha} ${e.sha}`),n?.showAheadBehind!==false&&(e.ahead>0&&e.behind>0?s.push(`${this.symbols.git_ahead}${e.ahead}${this.symbols.git_behind}${e.behind}`):e.ahead>0?s.push(`${this.symbols.git_ahead}${e.ahead}`):e.behind>0&&s.push(`${this.symbols.git_behind}${e.behind}`)),n?.showWorkingTree){let o=[];e.staged&&e.staged>0&&o.push(`+${e.staged}`),e.unstaged&&e.unstaged>0&&o.push(`~${e.unstaged}`),e.untracked&&e.untracked>0&&o.push(`?${e.untracked}`),e.conflicts&&e.conflicts>0&&o.push(`!${e.conflicts}`),o.length>0&&s.push(`(${o.join(" ")})`);}if(n?.showUpstream&&e.upstream&&s.push(`${this.symbols.git_upstream}${e.upstream}`),n?.showStashCount&&e.stashCount&&e.stashCount>0&&s.push(`${this.symbols.git_stash} ${e.stashCount}`),n?.showTimeSinceCommit&&e.timeSinceCommit!==void 0){let o=this.formatTimeSince(e.timeSinceCommit);s.push(`${this.symbols.git_time} ${o}`);}let i=this.symbols.git_clean;return e.status==="conflicts"?i=this.symbols.git_conflicts:e.status==="dirty"&&(i=this.symbols.git_dirty),s.push(i),{text:s.join(" "),bgColor:t.gitBg,fgColor:t.gitFg}}formatTimeSince(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`}renderModel(e,t){let n=e.model?.display_name||"Claude";return {text:`${this.symbols.model} ${n}`,bgColor:t.modelBg,fgColor:t.modelFg}}renderSession(e,t,n="cost"){let s=this.config.budget?.session;return {text:`${this.symbols.session_cost} ${this.formatUsageWithBudget(e.session.cost,e.session.tokens,e.session.tokenBreakdown,n,s?.amount,s?.warningThreshold||80)}`,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){if(!e)return {text:`${this.symbols.context_time} 0 (100%)`,bgColor:t.contextBg,fgColor:t.contextFg};let n=e.inputTokens.toLocaleString(),s=`${e.contextLeftPercentage}%`;return {text:`${this.symbols.context_time} ${n} (${s})`,bgColor:t.contextBg,fgColor:t.contextFg}}renderMetrics(e,t,n,s){if(!e)return {text:`${this.symbols.metrics_response} new`,bgColor:t.metricsBg,fgColor:t.metricsFg};let i=[];if(s?.showLastResponseTime){let o=e.lastResponseTime===null?"0.0s":e.lastResponseTime<60?`${e.lastResponseTime.toFixed(1)}s`:`${(e.lastResponseTime/60).toFixed(1)}m`;i.push(`${this.symbols.metrics_last_response} ${o}`);}if(s?.showResponseTime!==false&&e.responseTime!==null){let o=e.responseTime<60?`${e.responseTime.toFixed(1)}s`:`${(e.responseTime/60).toFixed(1)}m`;i.push(`${this.symbols.metrics_response} ${o}`);}if(s?.showDuration!==false&&e.sessionDuration!==null){let o=this.formatDuration(e.sessionDuration);i.push(`${this.symbols.metrics_duration} ${o}`);}return s?.showMessageCount!==false&&e.messageCount!==null&&i.push(`${this.symbols.metrics_messages} ${e.messageCount}`),i.length===0?{text:`${this.symbols.metrics_response} active`,bgColor:t.metricsBg,fgColor:t.metricsFg}:{text:i.join(" "),bgColor:t.metricsBg,fgColor:t.metricsFg}}renderBlock(e,t,n){let s;if(e.cost===null&&e.tokens===null)s="No active block";else {let i=n?.type||"cost",o=n?.burnType,c=e.timeRemaining!==null?(()=>{let f=Math.floor(e.timeRemaining/60),g=e.timeRemaining%60;return f>0?`${f}h ${g}m`:`${g}m`})():null,a;switch(i){case "cost":a=$(e.cost);break;case "tokens":a=_(e.tokens);break;case "both":a=`${$(e.cost)} / ${_(e.tokens)}`;break;case "time":a=c||"N/A";break;default:a=$(e.cost);}let u="";if(o&&o!=="none")switch(o){case "cost":u=` | ${e.burnRate!==null?e.burnRate<1?`${(e.burnRate*100).toFixed(0)}\xA2/h`:`$${e.burnRate.toFixed(2)}/h`:"N/A"}`;break;case "tokens":u=` | ${e.tokenBurnRate!==null?`${_(Math.round(e.tokenBurnRate))}/h`:"N/A"}`;break;case "both":let d=e.burnRate!==null?e.burnRate<1?`${(e.burnRate*100).toFixed(0)}\xA2/h`:`$${e.burnRate.toFixed(2)}/h`:"N/A",m=e.tokenBurnRate!==null?`${_(Math.round(e.tokenBurnRate))}/h`:"N/A";u=` | ${d} / ${m}`;break}i==="time"?s=a:s=c?`${a}${u} (${c} left)`:`${a}${u}`;}return {text:`${this.symbols.block_cost} ${s}`,bgColor:t.blockBg,fgColor:t.blockFg}}renderToday(e,t,n="cost"){let s=this.config.budget?.today;return {text:`${this.symbols.today_cost} ${this.formatUsageWithBudget(e.cost,e.tokens,e.tokenBreakdown,n,s?.amount,s?.warningThreshold)}`,bgColor:t.todayBg,fgColor:t.todayFg}}formatDuration(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`}getDisplayDirectoryName(e,t){return e.startsWith("~")?e:t&&t!==e?e.startsWith(t)?e.slice(t.length+1)||T.basename(t)||"project":T.basename(e)||"root":T.basename(e)||"root"}formatUsageDisplay(e,t,n,s){switch(s){case "cost":return $(e);case "tokens":return _(t);case "both":return `${$(e)} (${_(t)})`;case "breakdown":return he(n);default:return $(e)}}formatUsageWithBudget(e,t,n,s,i,o=80){let c=this.formatUsageDisplay(e,t,n,s);if(i&&i>0&&e!==null){let a=ye(e,i,o);return c+a.displayText}return c}renderVersion(e,t,n){return !e||!e.version?null:{text:`${this.symbols.version} ${e.version}`,bgColor:t.versionBg,fgColor:t.versionFg}}};function Me(r){return {timestamp:r.timestamp,usage:{inputTokens:r.message?.usage?.input_tokens||0,outputTokens:r.message?.usage?.output_tokens||0,cacheCreationInputTokens:r.message?.usage?.cache_creation_input_tokens||0,cacheReadInputTokens:r.message?.usage?.cache_read_input_tokens||0},costUSD:r.costUSD||0,model:r.message?.model||"unknown"}}var Y=class{sessionDurationHours=5;floorToHour(e){let t=new Date(e);return t.setUTCMinutes(0,0,0),t}identifySessionBlocks(e){if(e.length===0)return [];let t=this.sessionDurationHours*60*60*1e3,n=[],s=[...e].sort((c,a)=>c.timestamp.getTime()-a.timestamp.getTime()),i=null,o=[];for(let c of s){let a=c.timestamp;if(i==null)i=this.floorToHour(a),o=[c];else {let u=a.getTime()-i.getTime(),f=o[o.length-1];if(f==null)continue;let g=f.timestamp,d=a.getTime()-g.getTime();u>t||d>t?(n.push(o),i=this.floorToHour(a),o=[c]):o.push(c);}}return i!=null&&o.length>0&&n.push(o),n}createBlockInfo(e,t){let n=new Date,s=this.sessionDurationHours*60*60*1e3,i=new Date(e.getTime()+s),o=t[t.length-1],c=o!=null?o.timestamp:e,a=n.getTime()-c.getTime()<s&&n<i;return {block:t,isActive:a}}findActiveBlock(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if(!n||n.length===0)continue;let s=n[0];if(!s)continue;let i=this.floorToHour(s.timestamp),o=this.createBlockInfo(i,n);if(o.isActive)return o.block}return null}async loadUsageEntries(){l("Block segment: Loading entries for dynamic session blocks");let e=new Date;e.setDate(e.getDate()-1);let n=await J(void 0,(c,a)=>a>=e,true),s=[];for(let c of n)if(c.message?.usage){let a=Me(c);!a.costUSD&&c.raw&&(a.costUSD=await S.calculateCostForEntry(c.raw)),s.push(a);}let i=this.identifySessionBlocks(s);l(`Block segment: Found ${i.length} session blocks`);let o=this.findActiveBlock(i);if(o&&o.length>0){l(`Block segment: Found active block with ${o.length} entries`);let c=o[0],a=o[o.length-1];return c&&a&&l(`Block segment: Active block from ${c.timestamp.toISOString()} to ${a.timestamp.toISOString()}`),o}else return l("Block segment: No active block found"),[]}async getActiveBlockInfo(){try{let e=await this.loadUsageEntries();if(e.length===0)return l("Block segment: No entries in current block"),{cost:null,tokens:null,timeRemaining:null,burnRate:null,tokenBurnRate:null};let t=e.reduce((a,u)=>a+u.costUSD,0),n=e.reduce((a,u)=>a+u.usage.inputTokens+u.usage.outputTokens+u.usage.cacheCreationInputTokens+u.usage.cacheReadInputTokens,0),s=new Date,i=null;if(e.length>0){let a=e[0];if(a){let u=this.sessionDurationHours*60*60*1e3,f=this.floorToHour(a.timestamp),g=new Date(f.getTime()+u);i=Math.max(0,Math.round((g.getTime()-s.getTime())/(1e3*60)));}}let o=null,c=null;if(e.length>=1&&(t>0||n>0)){let a=e.map(g=>g.timestamp).sort((g,d)=>g.getTime()-d.getTime()),u=a[0],f=a[a.length-1];if(u&&f){let g=(f.getTime()-u.getTime())/6e4;g>0&&(t>0&&(o=t/g*60),n>0&&(c=n/g*60));}}return l(`Block segment: $${t.toFixed(2)}, ${n} tokens, ${i}m remaining, burn rate: ${o?"$"+o.toFixed(2)+"/hr":"N/A"}`),{cost:t,tokens:n,timeRemaining:i,burnRate:o,tokenBurnRate:c}}catch(e){return l("Error getting active block info:",e),{cost:null,tokens:null,timeRemaining:null,burnRate:null,tokenBurnRate:null}}}};function N(r){let e=r.getFullYear(),t=String(r.getMonth()+1).padStart(2,"0"),n=String(r.getDate()).padStart(2,"0");return `${e}-${t}-${n}`}function Ie(r){return r.inputTokens+r.outputTokens+r.cacheCreationInputTokens+r.cacheReadInputTokens}function Le(r){return {timestamp:r.timestamp,usage:{inputTokens:r.message?.usage?.input_tokens||0,outputTokens:r.message?.usage?.output_tokens||0,cacheCreationInputTokens:r.message?.usage?.cache_creation_input_tokens||0,cacheReadInputTokens:r.message?.usage?.cache_read_input_tokens||0},costUSD:r.costUSD||0,model:r.message?.model||"unknown"}}var z=class{cache=new Map;CACHE_TTL=3e5;async loadTodayEntries(){let t=N(new Date);l(`Today segment: Loading entries for date ${t}`);let n=new Date;n.setDate(n.getDate()-7);let i=await J(void 0,(a,u)=>u>=n,true),o=[],c=0;for(let a of i)if(N(a.timestamp)===t&&a.message?.usage){let f=Le(a);!f.costUSD&&a.raw&&(f.costUSD=await S.calculateCostForEntry(a.raw)),o.push(f),c++;}return l(`Today segment: Found ${c} entries for today (${t})`),o}async getTodayEntries(){let e="today",t=this.cache.get(e),n=Date.now();if(t&&n-t.timestamp<this.CACHE_TTL)return t.data;this.cache.clear();try{let s=await this.loadTodayEntries();return this.cache.set(e,{data:s,timestamp:n}),s}catch(s){return l("Error loading today's entries:",s),[]}}async getTodayInfo(){try{let e=await this.getTodayEntries();if(e.length===0)return {cost:null,tokens:null,tokenBreakdown:null,date:N(new Date)};let t=e.reduce((i,o)=>i+o.costUSD,0),n=e.reduce((i,o)=>i+Ie(o.usage),0),s=e.reduce((i,o)=>({input:i.input+o.usage.inputTokens,output:i.output+o.usage.outputTokens,cacheCreation:i.cacheCreation+o.usage.cacheCreationInputTokens,cacheRead:i.cacheRead+o.usage.cacheReadInputTokens}),{input:0,output:0,cacheCreation:0,cacheRead:0});return l(`Today segment: $${t.toFixed(2)}, ${n} tokens total`),{cost:t,tokens:n,tokenBreakdown:s,date:N(new Date)}}catch(e){return l("Error getting today's info:",e),{cost:null,tokens:null,tokenBreakdown:null,date:N(new Date)}}}};var X=class{constructor(e){this.config=e;this.symbols=this.initializeSymbols(),this.usageProvider=new I,this.blockProvider=new Y,this.todayProvider=new z,this.contextProvider=new L,this.gitService=new U,this.tmuxService=new F,this.metricsProvider=new j,this.versionProvider=new O,this.segmentRenderer=new A(e,this.symbols);}symbols;usageProvider;blockProvider;todayProvider;contextProvider;gitService;tmuxService;metricsProvider;versionProvider;segmentRenderer;needsUsageInfo(){return this.config.display.lines.some(e=>e.segments.session?.enabled)}needsGitInfo(){return this.config.display.lines.some(e=>e.segments.git?.enabled)}needsTmuxInfo(){return this.config.display.lines.some(e=>e.segments.tmux?.enabled)}needsContextInfo(){return this.config.display.lines.some(e=>e.segments.context?.enabled)}needsMetricsInfo(){return this.config.display.lines.some(e=>e.segments.metrics?.enabled)}needsBlockInfo(){return this.config.display.lines.some(e=>e.segments.block?.enabled)}needsTodayInfo(){return this.config.display.lines.some(e=>e.segments.today?.enabled)}needsVersionInfo(){return this.config.display.lines.some(e=>e.segments.version?.enabled)}async generateStatusline(e){let t=this.needsUsageInfo()?await this.usageProvider.getUsageInfo(e.session_id):null,n=this.needsBlockInfo()?await this.blockProvider.getActiveBlockInfo():null,s=this.needsTodayInfo()?await this.todayProvider.getTodayInfo():null,i=this.needsContextInfo()?await this.contextProvider.calculateContextTokens(e.transcript_path,e.model?.id):null,o=this.needsMetricsInfo()?await this.metricsProvider.getMetricsInfo(e.session_id):null,c=this.needsVersionInfo()?await this.versionProvider.getVersionInfo():null;return this.config.display.lines.map(u=>this.renderLine(u,e,t,n,s,i,o,c)).filter(u=>u.length>0).join(`
|
|
8
|
-
`)}renderLine(e,t,n,s,
|
|
2
|
+
import y from'process';import C,{posix,join}from'path';import S,{readFileSync,existsSync,mkdirSync,writeFileSync}from'fs';import {execSync}from'child_process';import P,{homedir}from'os';import {json}from'stream/consumers';import {get}from'https';import {URL}from'url';import {readFile,readdir,stat}from'fs/promises';function h(i,e){if(e&&(i.toLowerCase()==="transparent"||i.toLowerCase()==="none"))return "\x1B[49m";let t=parseInt(i.slice(1,3),16),n=parseInt(i.slice(3,5),16),s=parseInt(i.slice(5,7),16);return `\x1B[${e?"48":"38"};2;${t};${n};${s}m`}function X(i){let e=i.match(/48;2;(\d+);(\d+);(\d+)/);return e?`\x1B[38;2;${e[1]};${e[2]};${e[3]}m`:i.replace("48","38")}var se={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"},metrics:{bg:"#374151",fg:"#d1d5db"},version:{bg:"#3a3a4a",fg:"#b8b8d0"}};var oe={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"},metrics:{bg:"#6b7280",fg:"#ffffff"},version:{bg:"#8b7dd8",fg:"#ffffff"}};var re={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"},metrics:{bg:"#b48ead",fg:"#2e3440"},version:{bg:"#434c5e",fg:"#88c0d0"}};var ie={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"},metrics:{bg:"#3d59a1",fg:"#c0caf5"},version:{bg:"#292e42",fg:"#bb9af7"}};var ae={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"},metrics:{bg:"#524f67",fg:"#e0def4"},version:{bg:"#2a273f",fg:"#c4a7e7"}};var Te={dark:se,light:oe,nord:re,"tokyo-night":ie,"rose-pine":ae};function N(i){return Te[i]||null}var c=(i,...e)=>{process.env.CLAUDE_POWERLINE_DEBUG&&console.error(`[DEBUG] ${i}`,...e);};var D=class{cache=new Map;CACHE_TTL=1e3;isGitRepo(e){try{return S.existsSync(C.join(e,".git"))}catch{return false}}getGitInfo(e,t={},n){let s=n&&this.isGitRepo(n)?n:e,r=JSON.stringify(t),o=`${s}:${r}`,l=this.cache.get(o),a=Date.now();if(l&&a-l.timestamp<this.CACHE_TTL)return l.data;if(!this.isGitRepo(s))return this.cache.set(o,{data:null,timestamp:a}),null;try{let u=this.getBranch(s),d=this.getStatus(s),{ahead:g,behind:f}=this.getAheadBehind(s),m={branch:u||"detached",status:d,ahead:g,behind:f};if(t.showSha&&(m.sha=this.getSha(s)||void 0),t.showWorkingTree){let p=this.getWorkingTreeCounts(s);m.staged=p.staged,m.unstaged=p.unstaged,m.untracked=p.untracked,m.conflicts=p.conflicts;}return t.showOperation&&(m.operation=this.getOngoingOperation(s)||void 0),t.showTag&&(m.tag=this.getNearestTag(s)||void 0),t.showTimeSinceCommit&&(m.timeSinceCommit=this.getTimeSinceLastCommit(s)||void 0),t.showStashCount&&(m.stashCount=this.getStashCount(s)),t.showUpstream&&(m.upstream=this.getUpstream(s)||void 0),t.showRepoName&&(m.repoName=this.getRepoName(s)||void 0,m.isWorktree=this.isWorktree(s)),this.cache.set(o,{data:m,timestamp:a}),m}catch{return this.cache.set(o,{data:null,timestamp:a}),null}}getBranch(e){try{return execSync("git branch --show-current",{cwd:e,encoding:"utf8",timeout:5e3}).trim()||null}catch(t){return c(`Git branch command failed in ${e}:`,t),null}}getStatus(e){try{let t=execSync("git status --porcelain",{cwd:e,encoding:"utf8",timeout:5e3}).trim();return t?t.includes("UU")||t.includes("AA")||t.includes("DD")?"conflicts":"dirty":"clean"}catch(t){return c(`Git status command failed in ${e}:`,t),"clean"}}getWorkingTreeCounts(e){try{let t=execSync("git status --porcelain=v1",{cwd:e,encoding:"utf8",timeout:5e3}),n=0,s=0,r=0,o=0;if(!t.trim())return {staged:n,unstaged:s,untracked:r,conflicts:o};let l=t.split(`
|
|
3
|
+
`);for(let a of l){if(!a||a.length<2)continue;let u=a.charAt(0),d=a.charAt(1);if(u==="?"&&d==="?"){r++;continue}let g=u+d;if(["DD","AU","UD","UA","DU","AA","UU"].includes(g)){o++;continue}u!==" "&&u!=="?"&&n++,d!==" "&&d!=="?"&&s++;}return {staged:n,unstaged:s,untracked:r,conflicts:o}}catch(t){return c(`Git working tree counts failed in ${e}:`,t),{staged:0,unstaged:0,untracked:0,conflicts:0}}}getAheadBehind(e){try{let t=execSync("git rev-list --count @{u}..HEAD",{cwd:e,encoding:"utf8",timeout:5e3}).trim(),n=execSync("git rev-list --count HEAD..@{u}",{cwd:e,encoding:"utf8",timeout:5e3}).trim();return {ahead:parseInt(t)||0,behind:parseInt(n)||0}}catch(t){return c(`Git ahead/behind command failed in ${e}:`,t),{ahead:0,behind:0}}}getSha(e){try{return execSync("git rev-parse --short=7 HEAD",{cwd:e,encoding:"utf8",timeout:5e3}).trim()||null}catch{return null}}getOngoingOperation(e){try{let t=C.join(e,".git");return S.existsSync(C.join(t,"MERGE_HEAD"))?"MERGE":S.existsSync(C.join(t,"CHERRY_PICK_HEAD"))?"CHERRY-PICK":S.existsSync(C.join(t,"REVERT_HEAD"))?"REVERT":S.existsSync(C.join(t,"BISECT_LOG"))?"BISECT":S.existsSync(C.join(t,"rebase-merge"))||S.existsSync(C.join(t,"rebase-apply"))?"REBASE":null}catch{return null}}getNearestTag(e){try{return execSync("git describe --tags --abbrev=0",{cwd:e,encoding:"utf8",timeout:5e3}).trim()||null}catch{return null}}getTimeSinceLastCommit(e){try{let t=execSync("git log -1 --format=%ct",{cwd:e,encoding:"utf8",timeout:5e3}).trim();if(!t)return null;let n=parseInt(t)*1e3,s=Date.now();return Math.floor((s-n)/1e3)}catch{return null}}getStashCount(e){try{let t=execSync("git stash list",{cwd:e,encoding:"utf8",timeout:5e3}).trim();return t?t.split(`
|
|
4
|
+
`).length:0}catch{return 0}}getUpstream(e){try{return execSync("git rev-parse --abbrev-ref @{u}",{cwd:e,encoding:"utf8",timeout:5e3}).trim()||null}catch{return null}}getRepoName(e){try{let t=execSync("git config --get remote.origin.url",{cwd:e,encoding:"utf8",timeout:5e3}).trim();return t?t.match(/\/([^/]+?)(\.git)?$/)?.[1]||C.basename(e):C.basename(e)}catch{return C.basename(e)}}isWorktree(e){try{let t=C.join(e,".git");return !!(S.existsSync(t)&&S.statSync(t).isFile())}catch{return false}}};var B=class{getSessionId(){try{if(!process.env.TMUX_PANE)return c("TMUX_PANE not set, not in tmux session"),null;c(`Getting tmux session ID, TMUX_PANE: ${process.env.TMUX_PANE}`);let e=execSync("tmux display-message -p '#S'",{encoding:"utf8",timeout:1e3}).trim();return c(`Tmux session ID: ${e||"empty"}`),e||null}catch(e){return c("Error getting tmux session ID:",e),null}}isInTmux(){return !!process.env.TMUX_PANE}};var le={"claude-3-haiku-20240307":{name:"Claude 3 Haiku",input:.25,output:1.25,cache_write_5m:.3,cache_write_1h:.5,cache_read:.03},"claude-3-5-haiku-20241022":{name:"Claude 3.5 Haiku",input:.8,output:4,cache_write_5m:1,cache_write_1h:1.6,cache_read:.08},"claude-3-5-haiku-latest":{name:"Claude 3.5 Haiku Latest",input:1,output:5,cache_write_5m:1.25,cache_write_1h:2,cache_read:.1},"claude-3-opus-latest":{name:"Claude 3 Opus Latest",input:15,output:75,cache_write_5m:18.75,cache_write_1h:30,cache_read:1.5},"claude-3-opus-20240229":{name:"Claude 3 Opus",input:15,output:75,cache_write_5m:18.75,cache_write_1h:30,cache_read:1.5},"claude-3-5-sonnet-latest":{name:"Claude 3.5 Sonnet Latest",input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"claude-3-5-sonnet-20240620":{name:"Claude 3.5 Sonnet",input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"claude-3-5-sonnet-20241022":{name:"Claude 3.5 Sonnet",input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"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-3-7-sonnet-latest":{name:"Claude 3.7 Sonnet Latest",input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"claude-3-7-sonnet-20250219":{name:"Claude 3.7 Sonnet",input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3}},T=class{static memoryCache=new Map;static CACHE_TTL=1440*60*1e3;static GITHUB_PRICING_URL="https://raw.githubusercontent.com/Owloops/claude-powerline/main/pricing.json";static getCacheFilePath(){let e=join(homedir(),".claude","cache");try{mkdirSync(e,{recursive:!0});}catch{}return join(e,"pricing.json")}static loadDiskCache(){try{let e=this.getCacheFilePath(),t=readFileSync(e,"utf-8"),n=JSON.parse(t);if(n&&n.data&&n.timestamp)return n}catch{}return null}static saveDiskCache(e){try{let t=this.getCacheFilePath(),n={data:e,timestamp:Date.now()};writeFileSync(t,JSON.stringify(n));}catch(t){c("Failed to save pricing cache to disk:",t);}}static async fetchPricingData(){return new Promise(e=>{let t=new URL(this.GITHUB_PRICING_URL),n=get({hostname:t.hostname,path:t.pathname,headers:{"User-Agent":"claude-powerline","Cache-Control":"no-cache"},timeout:5e3},s=>{if(s.statusCode!==200){c(`HTTP ${s.statusCode}: ${s.statusMessage}`),e(null);return}let r="",o=0,l=1024*1024;s.on("data",a=>{if(o+=a.length,o>l){c("Response too large"),n.destroy(),e(null);return}r+=a;}),s.on("end",()=>{try{let u=JSON.parse(r),d=u._meta,g={};for(let[f,m]of Object.entries(u))f!=="_meta"&&(g[f]=m);this.validatePricingData(g)?(c(`Fetched fresh pricing from GitHub for ${Object.keys(g).length} models`),c(`Pricing last updated: ${d?.updated||"unknown"}`),e(g)):(c("Invalid pricing data structure"),e(null));}catch(a){c("Failed to parse JSON:",a),e(null);}}),s.on("error",a=>{c("Response error:",a),e(null);});});n.on("error",s=>{c("Request error:",s),e(null);}),n.on("timeout",()=>{c("Request timeout"),n.destroy(),e(null);}),n.end();})}static async getCurrentPricing(){let e=Date.now(),t=this.memoryCache.get("pricing");if(t&&e-t.timestamp<this.CACHE_TTL)return c(`Using memory cached pricing data for ${Object.keys(t.data).length} models`),t.data;let n=this.loadDiskCache();if(n&&e-n.timestamp<this.CACHE_TTL)return this.memoryCache.clear(),this.memoryCache.set("pricing",n),c(`Using disk cached pricing data for ${Object.keys(n.data).length} models`),n.data;let s=await this.fetchPricingData();return s?(this.memoryCache.clear(),this.memoryCache.set("pricing",{data:s,timestamp:e}),this.saveDiskCache(s),s):n?(this.memoryCache.set("pricing",n),c(`Using stale cached pricing data for ${Object.keys(n.data).length} models`),n.data):(c(`Using offline pricing data for ${Object.keys(le).length} models`),le)}static validatePricingData(e){if(!e||typeof e!="object")return false;for(let[,t]of Object.entries(e)){if(!t||typeof t!="object")return false;let n=t;if(typeof n.input!="number"||typeof n.output!="number"||typeof n.cache_read!="number")return false}return true}static async getModelPricing(e){let t=await this.getCurrentPricing();return t[e]?t[e]:this.fuzzyMatchModel(e,t)}static fuzzyMatchModel(e,t){let n=e.toLowerCase();for(let[r,o]of Object.entries(t))if(r.toLowerCase()===n)return o;let s=[{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","claude-sonnet-4"],fallback:"claude-sonnet-4-20250514"},{pattern:["sonnet-3.7","3-7-sonnet"],fallback:"claude-3-7-sonnet-20250219"},{pattern:["3-5-sonnet","sonnet-3.5"],fallback:"claude-3-5-sonnet-20241022"},{pattern:["3-5-haiku","haiku-3.5"],fallback:"claude-3-5-haiku-20241022"},{pattern:["haiku","3-haiku"],fallback:"claude-3-haiku-20240307"},{pattern:["opus"],fallback:"claude-opus-4-20250514"},{pattern:["sonnet"],fallback:"claude-3-5-sonnet-20241022"}];for(let{pattern:r,fallback:o}of s)if(r.some(l=>n.includes(l))&&t[o])return t[o];return t["claude-3-5-sonnet-20241022"]||{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 n=e.message?.usage;if(!n)return 0;let s=this.extractModelId(e),r=await this.getModelPricing(s),o=n.input_tokens||0,l=n.output_tokens||0,a=n.cache_creation_input_tokens||0,u=n.cache_read_input_tokens||0,d=o/1e6*r.input,g=l/1e6*r.output,f=u/1e6*r.cache_read,m=a/1e6*r.cache_write_5m;return d+g+m+f}static extractModelId(e){if(e.model&&typeof e.model=="string")return e.model;let t=e.message;if(t?.model){let n=t.model;return typeof n=="string"?n:n?.id||"claude-3-5-sonnet-20241022"}return e.model_id&&typeof e.model_id=="string"?e.model_id:"claude-3-5-sonnet-20241022"}};function me(){let i=[],e=process.env.CLAUDE_CONFIG_DIR;if(e&&e.split(",").forEach(t=>{let n=t.trim();existsSync(n)&&i.push(n);}),i.length===0){let t=homedir(),n=join(t,".config","claude"),s=join(t,".claude");existsSync(n)?i.push(n):existsSync(s)&&i.push(s);}return i}async function de(i){let e=[];for(let t of i){let n=join(t,"projects");if(existsSync(n))try{let s=await readdir(n,{withFileTypes:!0});for(let r of s)if(r.isDirectory()){let o=posix.join(n,r.name);e.push(o);}}catch(s){c(`Failed to read projects directory ${n}:`,s);}}return e}async function H(i){let e=me(),t=await de(e);for(let n of t){let s=posix.join(n,`${i}.jsonl`);if(existsSync(s))return s}return null}async function Be(i){try{let t=(await readFile(i,"utf-8")).trim().split(`
|
|
5
|
+
`),n=null;for(let s of t)if(s.trim())try{let r=JSON.parse(s);if(r.timestamp&&typeof r.timestamp=="string"){let o=new Date(r.timestamp);isNaN(o.getTime())||(n===null||o<n)&&(n=o);}}catch{continue}return n}catch(e){return c(`Failed to get earliest timestamp for ${i}:`,e),null}}async function Re(i,e=true){return (await Promise.all(i.map(async n=>({file:n,timestamp:await Be(n)})))).sort((n,s)=>n.timestamp===null&&s.timestamp===null?0:n.timestamp===null?1:s.timestamp===null?-1:(e?1:-1)*(n.timestamp.getTime()-s.timestamp.getTime())).map(n=>n.file)}async function Ue(i){try{return (await stat(i)).mtime}catch{return null}}function Fe(i){let e=i.message?.id||(typeof i.raw.message=="object"&&i.raw.message!==null&&"id"in i.raw.message?i.raw.message.id:void 0),t="requestId"in i.raw?i.raw.requestId:void 0;return !e||!t?null:`${e}:${t}`}async function R(i){try{let t=(await readFile(i,"utf-8")).trim().split(`
|
|
6
|
+
`).filter(s=>s.trim()),n=[];for(let s of t)try{let r=JSON.parse(s);if(!r.timestamp)continue;let o={timestamp:new Date(r.timestamp),message:r.message,costUSD:typeof r.costUSD=="number"?r.costUSD:void 0,isSidechain:r.isSidechain===!0,raw:r};n.push(o);}catch(r){c(`Failed to parse JSONL line: ${r}`);continue}return n}catch(e){return c(`Failed to read file ${i}:`,e),[]}}async function G(i,e,t=false){let n=[],s=me(),r=await de(s),o=new Set,l=[];for(let a of r)try{let g=(await readdir(a)).filter(m=>m.endsWith(".jsonl")).map(async m=>{let p=posix.join(a,m);if(existsSync(p)){let b=await Ue(p);return {filePath:p,mtime:b}}return null}),f=await Promise.all(g);for(let m of f)m?.mtime&&(!e||e(m.filePath,m.mtime))&&l.push(m.filePath);}catch(u){c(`Failed to read project directory ${a}:`,u);continue}if(t){let a=await Re(l,false);l.length=0,l.push(...a);}for(let a of l){let u=await R(a);for(let d of u){let g=Fe(d);if(g&&o.has(g)){c(`Skipping duplicate entry: ${g}`);continue}g&&o.add(g),n.push(d);}}return n}function Me(i){return {timestamp:i.timestamp.toISOString(),message:{usage:{input_tokens:i.message?.usage?.input_tokens||0,output_tokens:i.message?.usage?.output_tokens||0,cache_creation_input_tokens:i.message?.usage?.cache_creation_input_tokens,cache_read_input_tokens:i.message?.usage?.cache_read_input_tokens}},costUSD:i.costUSD}}var V=class{async getSessionUsage(e){try{let t=await H(e);if(!t)return c(`No transcript found for session: ${e}`),null;c(`Found transcript at: ${t}`);let n=await R(t);if(n.length===0)return {totalCost:0,entries:[]};let s=[],r=0;for(let o of n)if(o.message?.usage){let l=Me(o);if(l.costUSD!==void 0)r+=l.costUSD;else {let a=await T.calculateCostForEntry(o.raw);l.costUSD=a,r+=a;}s.push(l);}return c(`Parsed ${s.length} usage entries, total cost: $${r.toFixed(4)}`),{totalCost:r,entries:s}}catch(t){return c(`Error reading session usage for ${e}:`,t),null}}calculateTokenBreakdown(e){return e.reduce((t,n)=>({input:t.input+(n.message.usage.input_tokens||0),output:t.output+(n.message.usage.output_tokens||0),cacheCreation:t.cacheCreation+(n.message.usage.cache_creation_input_tokens||0),cacheRead:t.cacheRead+(n.message.usage.cache_read_input_tokens||0)}),{input:0,output:0,cacheCreation:0,cacheRead:0})}async getSessionInfo(e){let t=await this.getSessionUsage(e);if(!t||t.entries.length===0)return {cost:null,tokens:null,tokenBreakdown:null};let n=this.calculateTokenBreakdown(t.entries),s=n.input+n.output+n.cacheCreation+n.cacheRead;return {cost:t.totalCost,tokens:s,tokenBreakdown:n}}},U=class{sessionProvider=new V;async getUsageInfo(e){try{return c(`Starting usage info retrieval for session: ${e}`),{session:await this.sessionProvider.getSessionInfo(e)}}catch(t){return c(`Error getting usage info for session ${e}:`,t),{session:{cost:null,tokens:null,tokenBreakdown:null}}}}};var F=class{thresholds={LOW:50,MEDIUM:80};getContextUsageThresholds(){return this.thresholds}getContextLimit(e){return 2e5}async calculateContextTokens(e,t){try{c(`Calculating context tokens from transcript: ${e}`);try{if(!readFileSync(e,"utf-8"))return c("Transcript file is empty"),null}catch{return c("Could not read transcript file"),null}let n=await R(e);if(n.length===0)return c("No entries in transcript"),null;let s=null;for(let r=n.length-1;r>=0;r--){let o=n[r];if(o&&o.message?.usage?.input_tokens&&o.isSidechain!==!0){s=o,c(`Context segment: Found most recent entry at ${o.timestamp.toISOString()}, stopping search`);break}}if(s?.message?.usage){let r=s.message.usage,o=(r.input_tokens||0)+(r.cache_read_input_tokens||0)+(r.cache_creation_input_tokens||0),l=t?this.getContextLimit(t):2e5;c(`Most recent main chain context: ${o} tokens (limit: ${l})`);let a=Math.min(100,Math.max(0,Math.round(o/l*100))),u=Math.round(l*.75),d=Math.min(100,Math.max(0,Math.round(o/u*100))),g=Math.max(0,100-d);return {inputTokens:o,percentage:a,usablePercentage:d,contextLeftPercentage:g,maxTokens:l,usableTokens:u}}return c("No main chain entries with usage data found"),null}catch(n){return c(`Error reading transcript: ${n instanceof Error?n.message:String(n)}`),null}}};var M=class{async loadTranscriptEntries(e){try{let t=await H(e);if(!t)return c(`No transcript found for session: ${e}`),[];c(`Loading transcript from: ${t}`);let s=(await readFile(t,"utf-8")).trim().split(`
|
|
7
|
+
`).filter(o=>o.trim()),r=[];for(let o of s)try{let l=JSON.parse(o);if(l.isSidechain===!0)continue;r.push(l);}catch(l){c(`Failed to parse JSONL line: ${l}`);continue}return c(`Loaded ${r.length} transcript entries`),r}catch(t){return c(`Error loading transcript for ${e}:`,t),[]}}calculateResponseTimes(e){let t=[],n=[],s=-1,r=null,o=null,l=-1;for(let g=0;g<e.length;g++){let f=e[g];if(!(!f||!f.timestamp))try{let m=new Date(f.timestamp),p=f.type||f.message?.role||f.message?.type,b=f.type==="user"&&f.message?.content?.[0]?.type==="tool_result";p==="user"&&!b?(t.push(m),r=m,s=g,o=null,l=-1,c(`Found user message at index ${g}, timestamp ${m.toISOString()}`)):s>=0&&(p==="assistant"||b||p==="system"||f.message?.usage)&&(o=m,l=g,p==="assistant"||f.message?.usage?(n.push(m),c(`Found assistant message at index ${g}, timestamp ${m.toISOString()}`)):b?c(`Found tool result at index ${g}, timestamp ${m.toISOString()}`):c(`Found ${p} message at index ${g}, timestamp ${m.toISOString()}`));}catch{continue}}if(t.length===0||n.length===0)return {average:null,last:null};let a=[];for(let g of n){let f=t.filter(m=>m<g);if(f.length>0){let m=new Date(Math.max(...f.map(b=>b.getTime()))),p=(g.getTime()-m.getTime())/1e3;p>.1&&p<300?(a.push(p),c(`Valid response time: ${p.toFixed(1)}s`)):c(`Rejected response time: ${p.toFixed(1)}s (outside 0.1s-5m range)`);}}let u=null;if(r&&o&&l>s){let g=o.getTime()-r.getTime(),f=l-s;g===0&&f>0?(u=f*.1,c(`Estimated last response time from position difference: ${u.toFixed(2)}s (${f} messages)`)):g>0&&(u=g/1e3,c(`Last response time from timestamps: ${u.toFixed(2)}s`)),c(`Last user message at index ${s}, timestamp ${r.toISOString()}`),c(`Last response end at index ${l}, timestamp ${o.toISOString()}`);}if(a.length===0&&u===null)return {average:null,last:null};let d=a.length>0?a.reduce((g,f)=>g+f,0)/a.length:null;return c(`Calculated average response time: ${d?.toFixed(2)||"null"}s from ${a.length} measurements`),c(`Last response time: ${u?.toFixed(2)||"null"}s`),{average:d,last:u}}calculateSessionDuration(e){let t=[];for(let o of e)if(o.timestamp)try{t.push(new Date(o.timestamp));}catch{continue}if(t.length<2)return null;t.sort((o,l)=>o.getTime()-l.getTime());let n=t[t.length-1],s=t[0];if(!n||!s)return null;let r=(n.getTime()-s.getTime())/1e3;return r>0?r:null}calculateBurnRateDuration(e){if(e.length===0)return null;let t=new Date,n=e.map(o=>o.timestamp).filter(Boolean).map(o=>new Date(o)).filter(o=>t.getTime()-o.getTime()<7200*1e3).sort((o,l)=>o.getTime()-l.getTime());if(n.length===0)return null;let s=n[0];return s?Math.max((t.getTime()-s.getTime())/1e3,1800):null}calculateMessageCount(e){return e.filter(t=>{let n=t.type||t.message?.role||t.message?.type,s=t.type==="user"&&t.message?.content?.[0]?.type==="tool_result";return n==="user"&&!s}).length}async calculateTotalCost(e){let t=0,n=new Set;for(let s of e){let r=`${s.timestamp}-${JSON.stringify(s.message?.usage||{})}`;if(n.has(r)){c(`Skipping duplicate entry at ${s.timestamp}`);continue}if(n.add(r),typeof s.costUSD=="number")t+=s.costUSD;else if(s.message?.usage){let o=await T.calculateCostForEntry(s);t+=o;}}return Math.round(t*1e4)/1e4}calculateTotalTokens(e){let t=new Set;return e.reduce((n,s)=>{let r=s.message?.usage;if(!r)return n;let o=`${s.timestamp}-${JSON.stringify(r)}`;return t.has(o)?(c(`Skipping duplicate token entry at ${s.timestamp}`),n):(t.add(o),n+(r.input_tokens||0)+(r.output_tokens||0)+(r.cache_creation_input_tokens||0)+(r.cache_read_input_tokens||0))},0)}async getMetricsInfo(e){try{c(`Starting metrics calculation for session: ${e}`);let t=await this.loadTranscriptEntries(e);if(t.length===0)return {responseTime:null,lastResponseTime:null,sessionDuration:null,messageCount:null,costBurnRate:null,tokenBurnRate:null};let n=this.calculateResponseTimes(t),s=this.calculateSessionDuration(t),r=this.calculateMessageCount(t),o=null,l=null,a=this.calculateBurnRateDuration(t);if(a&&a>60){let u=a/3600;if(u<=0)c(`Invalid hours elapsed: ${u}`);else {let d=await this.calculateTotalCost(t),g=this.calculateTotalTokens(t);d>0&&(o=Math.round(d/u*100)/100,c(`Cost burn rate: $${o}/h (total: $${d}, duration: ${u}h)`)),g>0&&(l=Math.round(g/u),c(`Token burn rate: ${l}/h (total: ${g}, duration: ${u}h)`));}}return c(`Metrics calculated: avgResponseTime=${n.average?.toFixed(2)||"null"}s, lastResponseTime=${n.last?.toFixed(2)||"null"}s, sessionDuration=${s?.toFixed(0)||"null"}s, messageCount=${r}`),{responseTime:n.average,lastResponseTime:n.last,sessionDuration:s,messageCount:r,costBurnRate:o,tokenBurnRate:l}}catch(t){return c(`Error calculating metrics for session ${e}:`,t),{responseTime:null,lastResponseTime:null,sessionDuration:null,messageCount:null,costBurnRate:null,tokenBurnRate:null}}}};var I=class{cachedVersion=null;cacheTimestamp=0;CACHE_TTL=3e4;getClaudeVersion(){let e=Date.now();if(this.cachedVersion!==null&&e-this.cacheTimestamp<this.CACHE_TTL)return this.cachedVersion;try{let t=execSync("claude --version",{encoding:"utf8",timeout:1e3}).trim(),n=t.match(/^([\d.]+)/);return n?(this.cachedVersion=`v${n[1]}`,this.cacheTimestamp=e,c(`Claude Code version: ${this.cachedVersion}`),this.cachedVersion):(c(`Could not parse version from: ${t}`),null)}catch(t){return c("Error getting Claude Code version:",t),null}}async getVersionInfo(){return {version:this.getClaudeVersion()}}};function x(i){return i===null?"$0.00":i<.01?"<$0.01":`$${i.toFixed(2)}`}function k(i){return i===null||i===0?"0 tokens":i>=1e6?`${(i/1e6).toFixed(1)}M tokens`:i>=1e3?`${(i/1e3).toFixed(1)}K tokens`:`${i} tokens`}function fe(i){if(!i)return "0 tokens";let e=[];if(i.input>0&&e.push(`${k(i.input).replace(" tokens","")}in`),i.output>0&&e.push(`${k(i.output).replace(" tokens","")}out`),i.cacheCreation>0||i.cacheRead>0){let t=i.cacheCreation+i.cacheRead;e.push(`${k(t).replace(" tokens","")}cached`);}return e.length>0?e.join(" + "):"0 tokens"}function Oe(i,e){return !e||e<=0||i<0?null:Math.min(100,i/e*100)}function pe(i,e,t=80){let n=Oe(i,e);if(n===null)return {percentage:null,isWarning:false,displayText:""};let s=`${n.toFixed(0)}%`,r=n>=t,o="";return r?o=` !${s}`:n>=50?o=` +${s}`:o=` ${s}`,{percentage:n,isWarning:r,displayText:o}}var L=class{constructor(e,t){this.config=e;this.symbols=t;}renderDirectory(e,t,n){let s=e.workspace?.current_dir||e.cwd||"/",r=e.workspace?.project_dir;if(n?.showBasename)return {text:C.basename(s)||"root",bgColor:t.modeBg,fgColor:t.modeFg};let o=process.env.HOME||process.env.USERPROFILE,l=s,a=r;return o&&(s.startsWith(o)&&(l=s.replace(o,"~")),r&&r.startsWith(o)&&(a=r.replace(o,"~"))),{text:this.getDisplayDirectoryName(l,a),bgColor:t.modeBg,fgColor:t.modeFg}}renderGit(e,t,n){if(!e)return null;let s=[];if(n?.showRepoName&&e.repoName&&(s.push(e.repoName),e.isWorktree&&s.push(this.symbols.git_worktree)),n?.showOperation&&e.operation&&s.push(`[${e.operation}]`),s.push(`${this.symbols.branch} ${e.branch}`),n?.showTag&&e.tag&&s.push(`${this.symbols.git_tag} ${e.tag}`),n?.showSha&&e.sha&&s.push(`${this.symbols.git_sha} ${e.sha}`),n?.showAheadBehind!==false&&(e.ahead>0&&e.behind>0?s.push(`${this.symbols.git_ahead}${e.ahead}${this.symbols.git_behind}${e.behind}`):e.ahead>0?s.push(`${this.symbols.git_ahead}${e.ahead}`):e.behind>0&&s.push(`${this.symbols.git_behind}${e.behind}`)),n?.showWorkingTree){let o=[];e.staged&&e.staged>0&&o.push(`+${e.staged}`),e.unstaged&&e.unstaged>0&&o.push(`~${e.unstaged}`),e.untracked&&e.untracked>0&&o.push(`?${e.untracked}`),e.conflicts&&e.conflicts>0&&o.push(`!${e.conflicts}`),o.length>0&&s.push(`(${o.join(" ")})`);}if(n?.showUpstream&&e.upstream&&s.push(`${this.symbols.git_upstream}${e.upstream}`),n?.showStashCount&&e.stashCount&&e.stashCount>0&&s.push(`${this.symbols.git_stash} ${e.stashCount}`),n?.showTimeSinceCommit&&e.timeSinceCommit!==void 0){let o=this.formatTimeSince(e.timeSinceCommit);s.push(`${this.symbols.git_time} ${o}`);}let r=this.symbols.git_clean;return e.status==="conflicts"?r=this.symbols.git_conflicts:e.status==="dirty"&&(r=this.symbols.git_dirty),s.push(r),{text:s.join(" "),bgColor:t.gitBg,fgColor:t.gitFg}}formatTimeSince(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`}renderModel(e,t){let n=e.model?.display_name||"Claude";return {text:`${this.symbols.model} ${n}`,bgColor:t.modelBg,fgColor:t.modelFg}}renderSession(e,t,n="cost"){let s=this.config.budget?.session;return {text:`${this.symbols.session_cost} ${this.formatUsageWithBudget(e.session.cost,e.session.tokens,e.session.tokenBreakdown,n,s?.amount,s?.warningThreshold||80)}`,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){if(!e)return {text:`${this.symbols.context_time} 0 (100%)`,bgColor:t.contextBg,fgColor:t.contextFg};let n=e.inputTokens.toLocaleString(),s=`${e.contextLeftPercentage}%`;return {text:`${this.symbols.context_time} ${n} (${s})`,bgColor:t.contextBg,fgColor:t.contextFg}}renderMetrics(e,t,n,s){if(!e)return {text:`${this.symbols.metrics_response} new`,bgColor:t.metricsBg,fgColor:t.metricsFg};let r=[];if(s?.showLastResponseTime){let o=e.lastResponseTime===null?"0.0s":e.lastResponseTime<60?`${e.lastResponseTime.toFixed(1)}s`:`${(e.lastResponseTime/60).toFixed(1)}m`;r.push(`${this.symbols.metrics_last_response} ${o}`);}if(s?.showResponseTime!==false&&e.responseTime!==null){let o=e.responseTime<60?`${e.responseTime.toFixed(1)}s`:`${(e.responseTime/60).toFixed(1)}m`;r.push(`${this.symbols.metrics_response} ${o}`);}if(s?.showDuration!==false&&e.sessionDuration!==null){let o=this.formatDuration(e.sessionDuration);r.push(`${this.symbols.metrics_duration} ${o}`);}return s?.showMessageCount!==false&&e.messageCount!==null&&r.push(`${this.symbols.metrics_messages} ${e.messageCount}`),r.length===0?{text:`${this.symbols.metrics_response} active`,bgColor:t.metricsBg,fgColor:t.metricsFg}:{text:r.join(" "),bgColor:t.metricsBg,fgColor:t.metricsFg}}renderBlock(e,t,n){let s;if(e.cost===null&&e.tokens===null)s="No active block";else {let r=n?.type||"cost",o=n?.burnType,l=e.timeRemaining!==null?(()=>{let d=Math.floor(e.timeRemaining/60),g=e.timeRemaining%60;return d>0?`${d}h ${g}m`:`${g}m`})():null,a;switch(r){case "cost":a=x(e.cost);break;case "tokens":a=k(e.tokens);break;case "both":a=`${x(e.cost)} / ${k(e.tokens)}`;break;case "time":a=l||"N/A";break;default:a=x(e.cost);}let u="";if(o&&o!=="none")switch(o){case "cost":u=` | ${e.burnRate!==null?e.burnRate<1?`${(e.burnRate*100).toFixed(0)}\xA2/h`:`$${e.burnRate.toFixed(2)}/h`:"N/A"}`;break;case "tokens":u=` | ${e.tokenBurnRate!==null?`${k(Math.round(e.tokenBurnRate))}/h`:"N/A"}`;break;case "both":let f=e.burnRate!==null?e.burnRate<1?`${(e.burnRate*100).toFixed(0)}\xA2/h`:`$${e.burnRate.toFixed(2)}/h`:"N/A",m=e.tokenBurnRate!==null?`${k(Math.round(e.tokenBurnRate))}/h`:"N/A";u=` | ${f} / ${m}`;break}r==="time"?s=a:s=l?`${a}${u} (${l} left)`:`${a}${u}`;}return {text:`${this.symbols.block_cost} ${s}`,bgColor:t.blockBg,fgColor:t.blockFg}}renderToday(e,t,n="cost"){let s=this.config.budget?.today;return {text:`${this.symbols.today_cost} ${this.formatUsageWithBudget(e.cost,e.tokens,e.tokenBreakdown,n,s?.amount,s?.warningThreshold)}`,bgColor:t.todayBg,fgColor:t.todayFg}}formatDuration(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`}getDisplayDirectoryName(e,t){return e.startsWith("~")?e:t&&t!==e?e.startsWith(t)?e.slice(t.length+1)||C.basename(t)||"project":C.basename(e)||"root":C.basename(e)||"root"}formatUsageDisplay(e,t,n,s){switch(s){case "cost":return x(e);case "tokens":return k(t);case "both":return `${x(e)} (${k(t)})`;case "breakdown":return fe(n);default:return x(e)}}formatUsageWithBudget(e,t,n,s,r,o=80){let l=this.formatUsageDisplay(e,t,n,s);if(r&&r>0&&e!==null){let a=pe(e,r,o);return l+a.displayText}return l}renderVersion(e,t,n){return !e||!e.version?null:{text:`${this.symbols.version} ${e.version}`,bgColor:t.versionBg,fgColor:t.versionFg}}};function Ae(i){return {timestamp:i.timestamp,usage:{inputTokens:i.message?.usage?.input_tokens||0,outputTokens:i.message?.usage?.output_tokens||0,cacheCreationInputTokens:i.message?.usage?.cache_creation_input_tokens||0,cacheReadInputTokens:i.message?.usage?.cache_read_input_tokens||0},costUSD:i.costUSD||0,model:i.message?.model||"unknown"}}var J=class{sessionDurationHours=5;floorToHour(e){let t=new Date(e);return t.setUTCMinutes(0,0,0),t}identifySessionBlocks(e){if(e.length===0)return [];let t=this.sessionDurationHours*60*60*1e3,n=[],s=[...e].sort((l,a)=>l.timestamp.getTime()-a.timestamp.getTime()),r=null,o=[];for(let l of s){let a=l.timestamp;if(r==null)r=this.floorToHour(a),o=[l];else {let u=a.getTime()-r.getTime(),d=o[o.length-1];if(d==null)continue;let g=d.timestamp,f=a.getTime()-g.getTime();u>t||f>t?(n.push(o),r=this.floorToHour(a),o=[l]):o.push(l);}}return r!=null&&o.length>0&&n.push(o),n}createBlockInfo(e,t){let n=new Date,s=this.sessionDurationHours*60*60*1e3,r=new Date(e.getTime()+s),o=t[t.length-1],l=o!=null?o.timestamp:e,a=n.getTime()-l.getTime()<s&&n<r;return {block:t,isActive:a}}findActiveBlock(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if(!n||n.length===0)continue;let s=n[0];if(!s)continue;let r=this.floorToHour(s.timestamp),o=this.createBlockInfo(r,n);if(o.isActive)return o.block}return null}async loadUsageEntries(){c("Block segment: Loading entries for dynamic session blocks");let e=new Date;e.setDate(e.getDate()-1);let n=await G(void 0,(l,a)=>a>=e,true),s=[];for(let l of n)if(l.message?.usage){let a=Ae(l);!a.costUSD&&l.raw&&(a.costUSD=await T.calculateCostForEntry(l.raw)),s.push(a);}let r=this.identifySessionBlocks(s);c(`Block segment: Found ${r.length} session blocks`);let o=this.findActiveBlock(r);if(o&&o.length>0){c(`Block segment: Found active block with ${o.length} entries`);let l=o[0],a=o[o.length-1];return l&&a&&c(`Block segment: Active block from ${l.timestamp.toISOString()} to ${a.timestamp.toISOString()}`),o}else return c("Block segment: No active block found"),[]}async getActiveBlockInfo(){try{let e=await this.loadUsageEntries();if(e.length===0)return c("Block segment: No entries in current block"),{cost:null,tokens:null,timeRemaining:null,burnRate:null,tokenBurnRate:null};let t=e.reduce((a,u)=>a+u.costUSD,0),n=e.reduce((a,u)=>a+u.usage.inputTokens+u.usage.outputTokens+u.usage.cacheCreationInputTokens+u.usage.cacheReadInputTokens,0),s=new Date,r=null;if(e.length>0){let a=e[0];if(a){let u=this.sessionDurationHours*60*60*1e3,d=this.floorToHour(a.timestamp),g=new Date(d.getTime()+u);r=Math.max(0,Math.round((g.getTime()-s.getTime())/(1e3*60)));}}let o=null,l=null;if(e.length>=1&&(t>0||n>0)){let a=e.map(g=>g.timestamp).sort((g,f)=>g.getTime()-f.getTime()),u=a[0],d=a[a.length-1];if(u&&d){let g=(d.getTime()-u.getTime())/6e4;g>0&&(t>0&&(o=t/g*60),n>0&&(l=n/g*60));}}return c(`Block segment: $${t.toFixed(2)}, ${n} tokens, ${r}m remaining, burn rate: ${o?"$"+o.toFixed(2)+"/hr":"N/A"}`),{cost:t,tokens:n,timeRemaining:r,burnRate:o,tokenBurnRate:l}}catch(e){return c("Error getting active block info:",e),{cost:null,tokens:null,timeRemaining:null,burnRate:null,tokenBurnRate:null}}}};function j(i){let e=i.getFullYear(),t=String(i.getMonth()+1).padStart(2,"0"),n=String(i.getDate()).padStart(2,"0");return `${e}-${t}-${n}`}function Ne(i){return i.inputTokens+i.outputTokens+i.cacheCreationInputTokens+i.cacheReadInputTokens}function He(i){return {timestamp:i.timestamp,usage:{inputTokens:i.message?.usage?.input_tokens||0,outputTokens:i.message?.usage?.output_tokens||0,cacheCreationInputTokens:i.message?.usage?.cache_creation_input_tokens||0,cacheReadInputTokens:i.message?.usage?.cache_read_input_tokens||0},costUSD:i.costUSD||0,model:i.message?.model||"unknown"}}var q=class{cache=new Map;CACHE_TTL=3e5;async loadTodayEntries(){let t=j(new Date);c(`Today segment: Loading entries for date ${t}`);let n=new Date;n.setDate(n.getDate()-7);let r=await G(void 0,(a,u)=>u>=n,true),o=[],l=0;for(let a of r)if(j(a.timestamp)===t&&a.message?.usage){let d=He(a);!d.costUSD&&a.raw&&(d.costUSD=await T.calculateCostForEntry(a.raw)),o.push(d),l++;}return c(`Today segment: Found ${l} entries for today (${t})`),o}async getTodayEntries(){let e="today",t=this.cache.get(e),n=Date.now();if(t&&n-t.timestamp<this.CACHE_TTL)return t.data;this.cache.clear();try{let s=await this.loadTodayEntries();return this.cache.set(e,{data:s,timestamp:n}),s}catch(s){return c("Error loading today's entries:",s),[]}}async getTodayInfo(){try{let e=await this.getTodayEntries();if(e.length===0)return {cost:null,tokens:null,tokenBreakdown:null,date:j(new Date)};let t=e.reduce((r,o)=>r+o.costUSD,0),n=e.reduce((r,o)=>r+Ne(o.usage),0),s=e.reduce((r,o)=>({input:r.input+o.usage.inputTokens,output:r.output+o.usage.outputTokens,cacheCreation:r.cacheCreation+o.usage.cacheCreationInputTokens,cacheRead:r.cacheRead+o.usage.cacheReadInputTokens}),{input:0,output:0,cacheCreation:0,cacheRead:0});return c(`Today segment: $${t.toFixed(2)}, ${n} tokens total`),{cost:t,tokens:n,tokenBreakdown:s,date:j(new Date)}}catch(e){return c("Error getting today's info:",e),{cost:null,tokens:null,tokenBreakdown:null,date:j(new Date)}}}};var K=class{constructor(e){this.config=e;this.symbols=this.initializeSymbols(),this.usageProvider=new U,this.blockProvider=new J,this.todayProvider=new q,this.contextProvider=new F,this.gitService=new D,this.tmuxService=new B,this.metricsProvider=new M,this.versionProvider=new I,this.segmentRenderer=new L(e,this.symbols);}symbols;usageProvider;blockProvider;todayProvider;contextProvider;gitService;tmuxService;metricsProvider;versionProvider;segmentRenderer;needsUsageInfo(){return this.config.display.lines.some(e=>e.segments.session?.enabled)}needsGitInfo(){return this.config.display.lines.some(e=>e.segments.git?.enabled)}needsTmuxInfo(){return this.config.display.lines.some(e=>e.segments.tmux?.enabled)}needsContextInfo(){return this.config.display.lines.some(e=>e.segments.context?.enabled)}needsMetricsInfo(){return this.config.display.lines.some(e=>e.segments.metrics?.enabled)}needsBlockInfo(){return this.config.display.lines.some(e=>e.segments.block?.enabled)}needsTodayInfo(){return this.config.display.lines.some(e=>e.segments.today?.enabled)}needsVersionInfo(){return this.config.display.lines.some(e=>e.segments.version?.enabled)}async generateStatusline(e){let t=this.needsUsageInfo()?await this.usageProvider.getUsageInfo(e.session_id):null,n=this.needsBlockInfo()?await this.blockProvider.getActiveBlockInfo():null,s=this.needsTodayInfo()?await this.todayProvider.getTodayInfo():null,r=this.needsContextInfo()?await this.contextProvider.calculateContextTokens(e.transcript_path,e.model?.id):null,o=this.needsMetricsInfo()?await this.metricsProvider.getMetricsInfo(e.session_id):null,l=this.needsVersionInfo()?await this.versionProvider.getVersionInfo():null;return this.config.display.lines.map(u=>this.renderLine(u,e,t,n,s,r,o,l)).filter(u=>u.length>0).join(`
|
|
8
|
+
`)}renderLine(e,t,n,s,r,o,l,a){let u=this.getThemeColors(),d=t.workspace?.current_dir||t.cwd||"/",g=Object.entries(e.segments).filter(([m,p])=>p?.enabled).map(([m,p])=>({type:m,config:p})),f=u.reset;for(let m=0;m<g.length;m++){let p=g[m];if(!p)continue;let b=m===g.length-1,E=b?null:g[m+1],A=E?this.getSegmentBgColor(E.type,u):"",v=this.renderSegment(p,t,n,s,r,o,l,a,u,d);v&&(f+=this.formatSegment(v.bgColor,v.fgColor,v.text,b?void 0:A));}return f}renderSegment(e,t,n,s,r,o,l,a,u,d){switch(e.type){case "directory":return this.segmentRenderer.renderDirectory(t,u,e.config);case "git":if(!this.needsGitInfo())return null;let g=e.config,f=this.gitService.getGitInfo(d,{showSha:g?.showSha,showWorkingTree:g?.showWorkingTree,showOperation:g?.showOperation,showTag:g?.showTag,showTimeSinceCommit:g?.showTimeSinceCommit,showStashCount:g?.showStashCount,showUpstream:g?.showUpstream,showRepoName:g?.showRepoName},t.workspace?.project_dir);return f?this.segmentRenderer.renderGit(f,u,g):null;case "model":return this.segmentRenderer.renderModel(t,u);case "session":if(!n)return null;let m=e.config?.type||"cost";return this.segmentRenderer.renderSession(n,u,m);case "tmux":if(!this.needsTmuxInfo())return null;let p=this.tmuxService.getSessionId();return this.segmentRenderer.renderTmux(p,u);case "context":return this.needsContextInfo()?this.segmentRenderer.renderContext(o,u):null;case "metrics":let b=e.config;return this.segmentRenderer.renderMetrics(l,u,s,b);case "block":if(!s)return null;let E=e.config;return this.segmentRenderer.renderBlock(s,u,E);case "today":if(!r)return null;let A=e.config?.type||"cost";return this.segmentRenderer.renderToday(r,u,A);case "version":if(!a)return null;let v=e.config;return this.segmentRenderer.renderVersion(a,u,v);default:return null}}initializeSymbols(){return {right:this.config.display.style==="minimal"?"":"\uE0B0",branch:"\u2387",model:"\u26A1",git_clean:"\u2713",git_dirty:"\u25CF",git_conflicts:"\u26A0",git_ahead:"\u2191",git_behind:"\u2193",git_worktree:"\u29C9",git_tag:"\u2302",git_sha:"\u266F",git_upstream:"\u2192",git_stash:"\u29C7",git_time:"\u25F7",session_cost:"\xA7",block_cost:"\u25F1",today_cost:"\u2609",context_time:"\u25D4",metrics_response:"\u29D6",metrics_last_response:"\u0394",metrics_duration:"\u29D7",metrics_messages:"\u27D0",metrics_burn:"\u27E2",version:"\u25C8"}}getThemeColors(){let e=this.config.theme,t;if(e==="custom"){if(t=this.config.colors?.custom,!t)throw new Error("Custom theme selected but no colors provided in configuration")}else t=N(e),t||(console.warn(`Built-in theme '${e}' not found, falling back to 'dark' theme`),t=N("dark"));let n=N("dark");return {reset:"\x1B[0m",modeBg:h(t.directory?.bg||n.directory.bg,true),modeFg:h(t.directory?.fg||n.directory.fg,false),gitBg:h(t.git?.bg||n.git.bg,true),gitFg:h(t.git?.fg||n.git.fg,false),modelBg:h(t.model?.bg||n.model.bg,true),modelFg:h(t.model?.fg||n.model.fg,false),sessionBg:h(t.session?.bg||n.session.bg,true),sessionFg:h(t.session?.fg||n.session.fg,false),blockBg:h(t.block?.bg||n.block.bg,true),blockFg:h(t.block?.fg||n.block.fg,false),todayBg:h(t.today?.bg||n.today.bg,true),todayFg:h(t.today?.fg||n.today.fg,false),tmuxBg:h(t.tmux?.bg||n.tmux.bg,true),tmuxFg:h(t.tmux?.fg||n.tmux.fg,false),contextBg:h(t.context?.bg||n.context.bg,true),contextFg:h(t.context?.fg||n.context.fg,false),metricsBg:h(t.metrics?.bg||n.metrics.bg,true),metricsFg:h(t.metrics?.fg||n.metrics.fg,false),versionBg:h(t.version?.bg||n.version.bg,true),versionFg:h(t.version?.fg||n.version.fg,false)}}getSegmentBgColor(e,t){switch(e){case "directory":return t.modeBg;case "git":return t.gitBg;case "model":return t.modelBg;case "session":return t.sessionBg;case "block":return t.blockBg;case "today":return t.todayBg;case "tmux":return t.tmuxBg;case "context":return t.contextBg;case "metrics":return t.metricsBg;case "version":return t.versionBg;default:return t.modeBg}}formatSegment(e,t,n,s){let r=`${e}${t} ${n} `,o="\x1B[0m";if(s){let l=X(e);r+=`${o}${s}${l}${this.symbols.right}`;}else r+=`${o}${X(e)}${this.symbols.right}${o}`;return r}};var he={theme:"dark",display:{style:"minimal",lines:[{segments:{directory:{enabled:true,showBasename:true},git:{enabled:true,showSha:false,showWorkingTree:false,showOperation:false,showTag:false,showTimeSinceCommit:false,showStashCount:false,showUpstream:false,showRepoName:false},model:{enabled:true},session:{enabled:true,type:"tokens"},today:{enabled:false,type:"cost"},block:{enabled:true,type:"cost",burnType:"cost"},version:{enabled:false},tmux:{enabled:false},context:{enabled:true},metrics:{enabled:false,showResponseTime:true,showLastResponseTime:false,showDuration:true,showMessageCount:true}}}]},budget:{session:{warningThreshold:80},today:{warningThreshold:80,amount:50}}};function te(i){return ["light","dark","nord","tokyo-night","rose-pine","custom"].includes(i)}function ne(i){return i==="minimal"||i==="powerline"}function Y(i,e){let t={...i};for(let n in e){let s=e[n];if(s!==void 0)if(typeof s=="object"&&s!==null&&!Array.isArray(s)){let r=t[n]||{};t[n]=Y(r,s);}else t[n]=s;}return t}function Ge(i,e){return i?S.existsSync(i)?i:null:[...e?[C.join(e,".claude-powerline.json")]:[],C.join(process.cwd(),".claude-powerline.json"),C.join(P.homedir(),".claude","claude-powerline.json"),C.join(P.homedir(),".config","claude-powerline","config.json")].find(S.existsSync)||null}function Ve(i){try{let e=S.readFileSync(i,"utf-8");return JSON.parse(e)}catch(e){throw new Error(`Failed to load config file ${i}: ${e instanceof Error?e.message:String(e)}`)}}function We(){let i={},e={},t=process.env.CLAUDE_POWERLINE_THEME;t&&te(t)&&(i.theme=t);let n=process.env.CLAUDE_POWERLINE_STYLE;return n&&(ne(n)?e.style=n:(console.warn(`Invalid display style '${n}' from environment variable, falling back to 'minimal'`),e.style="minimal")),Object.keys(e).length>0&&(i.display=e),i}function Je(){return process.env.CLAUDE_POWERLINE_CONFIG}function qe(i){let e={},t={},n=i.find(r=>r.startsWith("--theme="))?.split("=")[1];n&&te(n)&&(e.theme=n);let s=i.find(r=>r.startsWith("--style="))?.split("=")[1];return s&&(ne(s)?t.style=s:(console.warn(`Invalid display style '${s}' from CLI argument, falling back to 'minimal'`),t.style="minimal")),Object.keys(t).length>0&&(e.display=t),e}function Ke(i=process.argv,e){let t=JSON.parse(JSON.stringify(he)),n=i.find(l=>l.startsWith("--config="))?.split("=")[1]||Je(),s=Ge(n,e);if(s)try{let l=Ve(s);t=Y(t,l);}catch(l){console.warn(`Warning: ${l instanceof Error?l.message:String(l)}`);}t.display?.style&&!ne(t.display.style)&&(console.warn(`Invalid display style '${t.display.style}' in config file, falling back to 'minimal'`),t.display.style="minimal"),t.theme&&!te(t.theme)&&(console.warn(`Invalid theme '${t.theme}' in config file, falling back to 'dark'`),t.theme="dark");let r=We();t=Y(t,r);let o=qe(i);return t=Y(t,o),t}var be=Ke;async function Ye(){try{let i=P.platform(),e;if(i==="darwin")e=C.join(P.homedir(),"Library","Fonts");else if(i==="linux")e=C.join(P.homedir(),".local","share","fonts");else if(i==="win32")e=C.join(P.homedir(),"AppData","Local","Microsoft","Windows","Fonts");else {console.log("Unsupported platform for font installation");return}S.existsSync(e)||S.mkdirSync(e,{recursive:!0}),console.log("Installing Powerline Fonts..."),console.log("Downloading from https://github.com/powerline/fonts");let t=C.join(P.tmpdir(),"powerline-fonts"),n=()=>{S.existsSync(t)&&S.rmSync(t,{recursive:!0,force:!0});};y.on("SIGINT",n),y.on("SIGTERM",n);try{S.existsSync(t)&&S.rmSync(t,{recursive:!0,force:!0}),console.log("Cloning powerline fonts repository..."),execSync("git clone --depth=1 https://github.com/powerline/fonts.git powerline-fonts",{stdio:"inherit",cwd:P.tmpdir()}),console.log("Installing fonts...");let s=C.join(t,"install.sh");if(S.existsSync(s))S.chmodSync(s,493),execSync("./install.sh",{stdio:"inherit",cwd:t});else throw new Error("Install script not found in powerline fonts repository");console.log("Powerline fonts installation complete!"),console.log("Please restart your terminal and set your terminal font to a powerline font."),console.log("Popular choices: Source Code Pro Powerline, DejaVu Sans Mono Powerline, Ubuntu Mono Powerline");}finally{n(),y.removeListener("SIGINT",n),y.removeListener("SIGTERM",n);}}catch(i){console.error("Error installing fonts:",i instanceof Error?i.message:String(i)),console.log("You can manually install fonts from: https://github.com/powerline/fonts");}}function we(){console.log(`
|
|
9
9
|
claude-powerline - Beautiful powerline statusline for Claude Code
|
|
10
10
|
|
|
11
11
|
Usage: claude-powerline [options]
|
|
@@ -24,7 +24,7 @@ Claude Code Options (for settings.json):
|
|
|
24
24
|
|
|
25
25
|
See example config at: https://github.com/Owloops/claude-powerline/blob/main/.claude-powerline.json
|
|
26
26
|
|
|
27
|
-
`),
|
|
27
|
+
`);}async function Xe(){try{let i=y.argv.includes("--help")||y.argv.includes("-h");y.argv.includes("--install-fonts")&&(await Ye(),y.exit(0)),i&&(we(),y.exit(0)),y.stdin.isTTY===!0&&(console.error(`Error: This tool requires input from Claude Code
|
|
28
28
|
|
|
29
29
|
claude-powerline is designed to be used as a Claude Code statusLine command.
|
|
30
30
|
It reads hook data from stdin and outputs formatted statusline.
|
|
@@ -40,18 +40,4 @@ Add to ~/.claude/settings.json:
|
|
|
40
40
|
Run with --help for more options.
|
|
41
41
|
|
|
42
42
|
To test output manually:
|
|
43
|
-
echo '{"session_id":"test-session","workspace":{"project_dir":"/path/to/project"},"model":{"id":"claude-3-5-sonnet","display_name":"Claude"}}' | claude-powerline --style=powerline`),
|
|
44
|
-
claude-powerline - Beautiful powerline statusline for Claude Code
|
|
45
|
-
|
|
46
|
-
Usage: claude-powerline [options]
|
|
47
|
-
|
|
48
|
-
Options:
|
|
49
|
-
--theme=THEME Set theme: dark, light, nord, tokyo-night, rose-pine, custom
|
|
50
|
-
--style=STYLE Set separator style: minimal, powerline
|
|
51
|
-
--config=PATH Use custom config file path
|
|
52
|
-
--install-fonts Install powerline fonts to system
|
|
53
|
-
-h, --help Show this help
|
|
54
|
-
|
|
55
|
-
See example config at: https://github.com/Owloops/claude-powerline/blob/main/.claude-powerline.json
|
|
56
|
-
`),C.exit(1));let n=t.workspace?.project_dir,s=we(C.argv,n),o=await new X(s).generateStatusline(t);console.log(o);}catch(r){let e=r instanceof Error?r.message:String(r);console.error("Error generating statusline:",e),C.exit(1);}}Je();//# sourceMappingURL=index.js.map
|
|
57
|
-
//# sourceMappingURL=index.js.map
|
|
43
|
+
echo '{"session_id":"test-session","workspace":{"project_dir":"/path/to/project"},"model":{"id":"claude-3-5-sonnet","display_name":"Claude"}}' | claude-powerline --style=powerline`),y.exit(1)),c(`Working directory: ${y.cwd()}`),c("Process args:",y.argv);let t=await json(y.stdin);c("Received hook data:",JSON.stringify(t,null,2)),t||(console.error("Error: No input data received from stdin"),we(),y.exit(1));let n=t.workspace?.project_dir,s=be(y.argv,n),o=await new K(s).generateStatusline(t);console.log(o);}catch(i){let e=i instanceof Error?i.message:String(i);console.error("Error generating statusline:",e),y.exit(1);}}Xe();
|
package/package.json
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@owloops/claude-powerline",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.4",
|
|
4
4
|
"description": "Beautiful vim-style powerline statusline for Claude Code with real-time cost tracking, git integration, and custom themes",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"module": "./dist/index.js",
|
|
8
|
-
"types": "./dist/index.d.ts",
|
|
9
8
|
"bin": {
|
|
10
9
|
"claude-powerline": "./dist/index.js"
|
|
11
10
|
},
|
package/dist/index.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
interface ClaudeHookData {
|
|
3
|
-
hook_event_name: string;
|
|
4
|
-
session_id: string;
|
|
5
|
-
transcript_path: string;
|
|
6
|
-
cwd: string;
|
|
7
|
-
model: {
|
|
8
|
-
id: string;
|
|
9
|
-
display_name: string;
|
|
10
|
-
};
|
|
11
|
-
workspace: {
|
|
12
|
-
current_dir: string;
|
|
13
|
-
project_dir: string;
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export type { ClaudeHookData };
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/colors.ts","../src/themes/dark.ts","../src/themes/light.ts","../src/themes/nord.ts","../src/themes/tokyo-night.ts","../src/themes/rose-pine.ts","../src/themes/index.ts","../src/utils/logger.ts","../src/segments/git.ts","../src/segments/tmux.ts","../src/segments/pricing.ts","../src/utils/claude.ts","../src/segments/session.ts","../src/segments/context.ts","../src/segments/metrics.ts","../src/segments/version.ts","../src/utils/formatters.ts","../src/utils/budget.ts","../src/segments/renderer.ts","../src/segments/block.ts","../src/segments/today.ts","../src/powerline.ts","../src/config/defaults.ts","../src/config/loader.ts","../src/index.ts"],"names":["hexToAnsi","hex","isBackground","r","g","b","extractBgToFg","ansiCode","match","darkTheme","lightTheme","nordTheme","tokyoNightTheme","rosePineTheme","BUILT_IN_THEMES","getTheme","themeName","debug","message","args","GitService","workingDir","fs","path","options","projectDir","gitDir","optionsKey","cacheKey","cached","now","branch","status","ahead","behind","result","counts","execSync","error","gitStatus","staged","unstaged","untracked","conflicts","lines","line","indexStatus","worktreeStatus","statusPair","aheadResult","behindResult","timestamp","commitTime","stashList","remoteUrl","TmuxService","sessionId","OFFLINE_PRICING_DATA","PricingService","homedir","join","mkdirSync","cacheDir","readFileSync","cacheFile","content","data","writeFileSync","cacheData","memCached","diskCached","response","dataObj","meta","pricingData","key","value","pricing","modelId","allPricing","lowerModelId","patterns","pattern","fallback","p","entry","usage","inputTokens","outputTokens","cacheCreationTokens","cacheReadTokens","inputCost","outputCost","cacheReadCost","cacheCreationCost","model","getClaudePaths","paths","envPath","trimmedPath","existsSync","homeDir","configPath","claudePath","findProjectPaths","claudePaths","projectPaths","projectsDir","entries","readdir","projectPath","posix","findTranscriptFile","transcriptPath","getEarliestTimestamp","filePath","readFile","earliestDate","json","date","sortFilesByTimestamp","files","oldestFirst","file","a","item","getFileModificationDate","stat","createUniqueHash","messageId","requestId","parseJsonlFile","raw","parseError","loadEntriesFromProjects","timeFilter","fileFilter","sortFiles","processedHashes","allFiles","fileStatsPromises","mtime","fileStats","dirError","sortedFiles","fileEntries","uniqueHash","convertToSessionEntry","SessionProvider","parsedEntries","totalCost","sessionEntry","cost","breakdown","sessionUsage","tokenBreakdown","totalTokens","UsageProvider","ContextProvider","_modelId","mostRecentEntry","contextLength","contextLimit","percentage","usableLimit","usablePercentage","contextLeftPercentage","MetricsProvider","userMessages","assistantMessages","lastUserMessageIndex","lastUserMessageTime","lastResponseEndTime","lastResponseEndIndex","i","messageType","isToolResult","responseTimes","assistantTime","priorUsers","userTime","d","responseTime","lastResponseTime","timeDiff","positionDiff","avgResponseTime","sum","time","timestamps","lastTimestamp","firstTimestamp","duration","ts","sessionStart","total","processedEntries","entryKey","sessionDuration","messageCount","costBurnRate","tokenBurnRate","burnRateDuration","hoursElapsed","VersionProvider","output","formatCost","formatTokens","tokens","formatTokenBreakdown","parts","totalCached","calculateBudgetPercentage","budget","getBudgetStatus","warningThreshold","percentStr","isWarning","displayText","SegmentRenderer","config","symbols","hookData","colors","currentDir","displayDir","displayProjectDir","gitInfo","gitStatusIcon","seconds","modelName","usageInfo","type","sessionBudget","contextInfo","tokenDisplay","contextLeft","metricsInfo","_blockInfo","blockInfo","burnType","timeStr","hours","minutes","mainContent","burnContent","costBurn","tokenBurn","todayInfo","todayBudget","baseDisplay","budgetStatus","versionInfo","_config","convertToUsageEntry","BlockProvider","floored","sessionDurationMs","blocks","sortedEntries","currentBlockStart","currentBlockEntries","entryTime","timeSinceBlockStart","lastEntry","lastEntryTime","timeSinceLastEntry","startTime","endTime","actualEndTime","isActive","block","firstEntry","blockStartTime","dayAgo","_filePath","modTime","allUsageEntries","usageEntry","sessionBlocks","activeBlock","blockStart","blockEnd","timeRemaining","sessionEndTime","burnRate","durationMinutes","formatDate","year","month","day","getTotalTokens","convertToTodayEntry","TodayProvider","todayDateString","weekAgo","todayEntries","entriesFound","todayEntry","PowerlineRenderer","lineConfig","segments","_","segment","isLast","nextSegment","nextBgColor","segmentData","gitConfig","usageType","tmuxSessionId","metricsConfig","blockConfig","todayType","versionConfig","theme","colorTheme","fallbackTheme","segmentType","bgColor","fgColor","text","reset","arrowFgColor","DEFAULT_CONFIG","isValidTheme","isValidStyle","style","deepMerge","target","source","sourceValue","targetValue","findConfigFile","customPath","os","loadConfigFile","loadEnvConfig","display","getConfigPathFromEnv","parseCLIOverrides","arg","loadConfig","configFile","fileConfig","err","envConfig","cliOverrides","loadConfigFromCLI","installFonts","platform","fontDir","tempDir","cleanup","process","installScript","main","showHelp","statusline","errorMessage"],"mappings":"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","file":"index.js","sourcesContent":["export function hexToAnsi(hex: string, isBackground: boolean): string {\n if (isBackground && (hex.toLowerCase() === \"transparent\" || hex.toLowerCase() === \"none\")) {\n return \"\\x1b[49m\";\n }\n \n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n return `\\x1b[${isBackground ? \"48\" : \"38\"};2;${r};${g};${b}m`;\n}\n\nexport function extractBgToFg(ansiCode: string): string {\n const match = ansiCode.match(/48;2;(\\d+);(\\d+);(\\d+)/);\n if (match) {\n return `\\x1b[38;2;${match[1]};${match[2]};${match[3]}m`;\n }\n return ansiCode.replace(\"48\", \"38\");\n}\n","import type { ColorTheme } from \"./index\";\n\nexport const darkTheme: ColorTheme = {\n directory: { bg: \"#8b4513\", fg: \"#ffffff\" },\n git: { bg: \"#404040\", fg: \"#ffffff\" },\n model: { bg: \"#2d2d2d\", fg: \"#ffffff\" },\n session: { bg: \"#202020\", fg: \"#00ffff\" },\n block: { bg: \"#2a2a2a\", fg: \"#87ceeb\" },\n today: { bg: \"#1a1a1a\", fg: \"#98fb98\" },\n tmux: { bg: \"#2f4f2f\", fg: \"#90ee90\" },\n context: { bg: \"#4a5568\", fg: \"#cbd5e0\" },\n metrics: { bg: \"#374151\", fg: \"#d1d5db\" },\n version: { bg: \"#3a3a4a\", fg: \"#b8b8d0\" },\n};\n","import type { ColorTheme } from \"./index\";\n\nexport const lightTheme: ColorTheme = {\n directory: { bg: \"#ff6b47\", fg: \"#ffffff\" },\n git: { bg: \"#4fb3d9\", fg: \"#ffffff\" },\n model: { bg: \"#87ceeb\", fg: \"#000000\" },\n session: { bg: \"#da70d6\", fg: \"#ffffff\" },\n block: { bg: \"#6366f1\", fg: \"#ffffff\" },\n today: { bg: \"#10b981\", fg: \"#ffffff\" },\n tmux: { bg: \"#32cd32\", fg: \"#ffffff\" },\n context: { bg: \"#718096\", fg: \"#ffffff\" },\n metrics: { bg: \"#6b7280\", fg: \"#ffffff\" },\n version: { bg: \"#8b7dd8\", fg: \"#ffffff\" },\n};\n","import type { ColorTheme } from \"./index\";\n\nexport const nordTheme: ColorTheme = {\n directory: { bg: \"#434c5e\", fg: \"#d8dee9\" },\n git: { bg: \"#3b4252\", fg: \"#a3be8c\" },\n model: { bg: \"#4c566a\", fg: \"#81a1c1\" },\n session: { bg: \"#2e3440\", fg: \"#88c0d0\" },\n block: { bg: \"#3b4252\", fg: \"#81a1c1\" },\n today: { bg: \"#2e3440\", fg: \"#8fbcbb\" },\n tmux: { bg: \"#2e3440\", fg: \"#8fbcbb\" },\n context: { bg: \"#5e81ac\", fg: \"#eceff4\" },\n metrics: { bg: \"#b48ead\", fg: \"#2e3440\" },\n version: { bg: \"#434c5e\", fg: \"#88c0d0\" },\n};\n","import type { ColorTheme } from \"./index\";\n\nexport const tokyoNightTheme: ColorTheme = {\n directory: { bg: \"#2f334d\", fg: \"#82aaff\" },\n git: { bg: \"#1e2030\", fg: \"#c3e88d\" },\n model: { bg: \"#191b29\", fg: \"#fca7ea\" },\n session: { bg: \"#222436\", fg: \"#86e1fc\" },\n block: { bg: \"#2d3748\", fg: \"#7aa2f7\" },\n today: { bg: \"#1a202c\", fg: \"#4fd6be\" },\n tmux: { bg: \"#191b29\", fg: \"#4fd6be\" },\n context: { bg: \"#414868\", fg: \"#c0caf5\" },\n metrics: { bg: \"#3d59a1\", fg: \"#c0caf5\" },\n version: { bg: \"#292e42\", fg: \"#bb9af7\" },\n};\n","import type { ColorTheme } from \"./index\";\n\nexport const rosePineTheme: ColorTheme = {\n directory: { bg: \"#26233a\", fg: \"#c4a7e7\" },\n git: { bg: \"#1f1d2e\", fg: \"#9ccfd8\" },\n model: { bg: \"#191724\", fg: \"#ebbcba\" },\n session: { bg: \"#26233a\", fg: \"#f6c177\" },\n block: { bg: \"#2a273f\", fg: \"#eb6f92\" },\n today: { bg: \"#232136\", fg: \"#9ccfd8\" },\n tmux: { bg: \"#26233a\", fg: \"#908caa\" },\n context: { bg: \"#393552\", fg: \"#e0def4\" },\n metrics: { bg: \"#524f67\", fg: \"#e0def4\" },\n version: { bg: \"#2a273f\", fg: \"#c4a7e7\" },\n};\n","import { darkTheme } from \"./dark\";\nimport { lightTheme } from \"./light\";\nimport { nordTheme } from \"./nord\";\nimport { tokyoNightTheme } from \"./tokyo-night\";\nimport { rosePineTheme } from \"./rose-pine\";\n\nexport interface SegmentColor {\n bg: string;\n fg: string;\n}\n\nexport interface ColorTheme {\n directory: SegmentColor;\n git: SegmentColor;\n model: SegmentColor;\n session: SegmentColor;\n block: SegmentColor;\n today: SegmentColor;\n tmux: SegmentColor;\n context: SegmentColor;\n metrics: SegmentColor;\n version: SegmentColor;\n}\n\nexport interface PowerlineColors {\n reset: string;\n modeBg: string;\n modeFg: string;\n gitBg: string;\n gitFg: string;\n modelBg: string;\n modelFg: string;\n sessionBg: string;\n sessionFg: string;\n blockBg: string;\n blockFg: string;\n todayBg: string;\n todayFg: string;\n tmuxBg: string;\n tmuxFg: string;\n contextBg: string;\n contextFg: string;\n metricsBg: string;\n metricsFg: string;\n versionBg: string;\n versionFg: string;\n}\n\nexport const BUILT_IN_THEMES: Record<string, ColorTheme> = {\n dark: darkTheme,\n light: lightTheme,\n nord: nordTheme,\n \"tokyo-night\": tokyoNightTheme,\n \"rose-pine\": rosePineTheme,\n};\n\nexport function getTheme(themeName: string): ColorTheme | null {\n return BUILT_IN_THEMES[themeName] || null;\n}\n\nexport { darkTheme, lightTheme, nordTheme, tokyoNightTheme, rosePineTheme };\n","const debug = (message: string, ...args: any[]): void => {\n if (process.env.CLAUDE_POWERLINE_DEBUG) {\n console.error(`[DEBUG] ${message}`, ...args);\n }\n};\n\nexport { debug };\n","import { execSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { debug } from \"../utils/logger\";\n\nexport interface GitInfo {\n branch: string;\n status: \"clean\" | \"dirty\" | \"conflicts\";\n ahead: number;\n behind: number;\n sha?: string;\n staged?: number;\n unstaged?: number;\n untracked?: number;\n conflicts?: number;\n operation?: string;\n tag?: string;\n timeSinceCommit?: number;\n stashCount?: number;\n upstream?: string;\n repoName?: string;\n isWorktree?: boolean;\n}\n\nexport class GitService {\n private cache: Map<string, { data: GitInfo | null; timestamp: number }> =\n new Map();\n private readonly CACHE_TTL = 1000;\n\n private isGitRepo(workingDir: string): boolean {\n try {\n return fs.existsSync(path.join(workingDir, \".git\"));\n } catch {\n return false;\n }\n }\n\n getGitInfo(\n workingDir: string,\n options: {\n showSha?: boolean;\n showWorkingTree?: boolean;\n showOperation?: boolean;\n showTag?: boolean;\n showTimeSinceCommit?: boolean;\n showStashCount?: boolean;\n showUpstream?: boolean;\n showRepoName?: boolean;\n } = {},\n projectDir?: string\n ): GitInfo | null {\n const gitDir =\n projectDir && this.isGitRepo(projectDir) ? projectDir : workingDir;\n\n const optionsKey = JSON.stringify(options);\n const cacheKey = `${gitDir}:${optionsKey}`;\n const cached = this.cache.get(cacheKey);\n const now = Date.now();\n\n if (cached && now - cached.timestamp < this.CACHE_TTL) {\n return cached.data;\n }\n\n if (!this.isGitRepo(gitDir)) {\n this.cache.set(cacheKey, { data: null, timestamp: now });\n return null;\n }\n\n try {\n const branch = this.getBranch(gitDir);\n const status = this.getStatus(gitDir);\n const { ahead, behind } = this.getAheadBehind(gitDir);\n\n const result: GitInfo = {\n branch: branch || \"detached\",\n status,\n ahead,\n behind,\n };\n\n if (options.showSha) {\n result.sha = this.getSha(gitDir) || undefined;\n }\n\n if (options.showWorkingTree) {\n const counts = this.getWorkingTreeCounts(gitDir);\n result.staged = counts.staged;\n result.unstaged = counts.unstaged;\n result.untracked = counts.untracked;\n result.conflicts = counts.conflicts;\n }\n\n if (options.showOperation) {\n result.operation = this.getOngoingOperation(gitDir) || undefined;\n }\n\n if (options.showTag) {\n result.tag = this.getNearestTag(gitDir) || undefined;\n }\n\n if (options.showTimeSinceCommit) {\n result.timeSinceCommit =\n this.getTimeSinceLastCommit(gitDir) || undefined;\n }\n\n if (options.showStashCount) {\n result.stashCount = this.getStashCount(gitDir);\n }\n\n if (options.showUpstream) {\n result.upstream = this.getUpstream(gitDir) || undefined;\n }\n\n if (options.showRepoName) {\n result.repoName = this.getRepoName(gitDir) || undefined;\n result.isWorktree = this.isWorktree(gitDir);\n }\n\n this.cache.set(cacheKey, { data: result, timestamp: now });\n return result;\n } catch {\n this.cache.set(cacheKey, { data: null, timestamp: now });\n return null;\n }\n }\n\n private getBranch(workingDir: string): string | null {\n try {\n return (\n execSync(\"git branch --show-current\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 5000,\n }).trim() || null\n );\n } catch (error) {\n debug(`Git branch command failed in ${workingDir}:`, error);\n return null;\n }\n }\n\n private getStatus(workingDir: string): \"clean\" | \"dirty\" | \"conflicts\" {\n try {\n const gitStatus = execSync(\"git status --porcelain\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 5000,\n }).trim();\n\n if (!gitStatus) return \"clean\";\n\n if (\n gitStatus.includes(\"UU\") ||\n gitStatus.includes(\"AA\") ||\n gitStatus.includes(\"DD\")\n ) {\n return \"conflicts\";\n }\n\n return \"dirty\";\n } catch (error) {\n debug(`Git status command failed in ${workingDir}:`, error);\n return \"clean\";\n }\n }\n\n private getWorkingTreeCounts(workingDir: string): {\n staged: number;\n unstaged: number;\n untracked: number;\n conflicts: number;\n } {\n try {\n const gitStatus = execSync(\"git status --porcelain=v1\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 5000,\n });\n\n let staged = 0;\n let unstaged = 0;\n let untracked = 0;\n let conflicts = 0;\n\n if (!gitStatus.trim()) {\n return { staged, unstaged, untracked, conflicts };\n }\n\n const lines = gitStatus.split(\"\\n\");\n for (const line of lines) {\n if (!line || line.length < 2) continue;\n const indexStatus = line.charAt(0);\n const worktreeStatus = line.charAt(1);\n\n if (indexStatus === \"?\" && worktreeStatus === \"?\") {\n untracked++;\n continue;\n }\n\n const statusPair = indexStatus + worktreeStatus;\n if ([\"DD\", \"AU\", \"UD\", \"UA\", \"DU\", \"AA\", \"UU\"].includes(statusPair)) {\n conflicts++;\n continue;\n }\n\n if (indexStatus !== \" \" && indexStatus !== \"?\") {\n staged++;\n }\n if (worktreeStatus !== \" \" && worktreeStatus !== \"?\") {\n unstaged++;\n }\n }\n\n return { staged, unstaged, untracked, conflicts };\n } catch (error) {\n debug(`Git working tree counts failed in ${workingDir}:`, error);\n return { staged: 0, unstaged: 0, untracked: 0, conflicts: 0 };\n }\n }\n\n private getAheadBehind(workingDir: string): {\n ahead: number;\n behind: number;\n } {\n try {\n const aheadResult = execSync(\"git rev-list --count @{u}..HEAD\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 5000,\n }).trim();\n\n const behindResult = execSync(\"git rev-list --count HEAD..@{u}\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 5000,\n }).trim();\n\n return {\n ahead: parseInt(aheadResult) || 0,\n behind: parseInt(behindResult) || 0,\n };\n } catch (error) {\n debug(`Git ahead/behind command failed in ${workingDir}:`, error);\n return { ahead: 0, behind: 0 };\n }\n }\n\n private getSha(workingDir: string): string | null {\n try {\n const sha = execSync(\"git rev-parse --short=7 HEAD\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 5000,\n }).trim();\n\n return sha || null;\n } catch {\n return null;\n }\n }\n\n private getOngoingOperation(workingDir: string): string | null {\n try {\n const gitDir = path.join(workingDir, \".git\");\n\n if (fs.existsSync(path.join(gitDir, \"MERGE_HEAD\"))) return \"MERGE\";\n if (fs.existsSync(path.join(gitDir, \"CHERRY_PICK_HEAD\")))\n return \"CHERRY-PICK\";\n if (fs.existsSync(path.join(gitDir, \"REVERT_HEAD\"))) return \"REVERT\";\n if (fs.existsSync(path.join(gitDir, \"BISECT_LOG\"))) return \"BISECT\";\n if (\n fs.existsSync(path.join(gitDir, \"rebase-merge\")) ||\n fs.existsSync(path.join(gitDir, \"rebase-apply\"))\n )\n return \"REBASE\";\n\n return null;\n } catch {\n return null;\n }\n }\n\n private getNearestTag(workingDir: string): string | null {\n try {\n const tag = execSync(\"git describe --tags --abbrev=0\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 5000,\n }).trim();\n\n return tag || null;\n } catch {\n return null;\n }\n }\n\n private getTimeSinceLastCommit(workingDir: string): number | null {\n try {\n const timestamp = execSync(\"git log -1 --format=%ct\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 5000,\n }).trim();\n\n if (!timestamp) return null;\n\n const commitTime = parseInt(timestamp) * 1000;\n const now = Date.now();\n return Math.floor((now - commitTime) / 1000);\n } catch {\n return null;\n }\n }\n\n private getStashCount(workingDir: string): number {\n try {\n const stashList = execSync(\"git stash list\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 5000,\n }).trim();\n\n if (!stashList) return 0;\n return stashList.split(\"\\n\").length;\n } catch {\n return 0;\n }\n }\n\n private getUpstream(workingDir: string): string | null {\n try {\n const upstream = execSync(\"git rev-parse --abbrev-ref @{u}\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 5000,\n }).trim();\n\n return upstream || null;\n } catch {\n return null;\n }\n }\n\n private getRepoName(workingDir: string): string | null {\n try {\n const remoteUrl = execSync(\"git config --get remote.origin.url\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 5000,\n }).trim();\n\n if (!remoteUrl) return path.basename(workingDir);\n\n const match = remoteUrl.match(/\\/([^/]+?)(\\.git)?$/);\n return match?.[1] || path.basename(workingDir);\n } catch {\n return path.basename(workingDir);\n }\n }\n\n private isWorktree(workingDir: string): boolean {\n try {\n const gitDir = path.join(workingDir, \".git\");\n if (fs.existsSync(gitDir) && fs.statSync(gitDir).isFile()) {\n return true;\n }\n return false;\n } catch {\n return false;\n }\n }\n}\n","import { execSync } from \"node:child_process\";\nimport { debug } from \"../utils/logger\";\n\nexport class TmuxService {\n getSessionId(): string | null {\n try {\n if (!process.env.TMUX_PANE) {\n debug(`TMUX_PANE not set, not in tmux session`);\n return null;\n }\n\n debug(`Getting tmux session ID, TMUX_PANE: ${process.env.TMUX_PANE}`);\n\n const sessionId = execSync(\"tmux display-message -p '#S'\", {\n encoding: \"utf8\",\n timeout: 1000,\n }).trim();\n\n debug(`Tmux session ID: ${sessionId || \"empty\"}`);\n\n return sessionId || null;\n } catch (error) {\n debug(`Error getting tmux session ID:`, error);\n return null;\n }\n }\n\n isInTmux(): boolean {\n return !!process.env.TMUX_PANE;\n }\n}","import { debug } from \"../utils/logger\";\n\nexport interface ModelPricing {\n name: string;\n input: number;\n cache_write_5m: number;\n cache_write_1h: number;\n cache_read: number;\n output: number;\n}\nconst OFFLINE_PRICING_DATA: Record<string, ModelPricing> = {\n \"claude-3-haiku-20240307\": {\n name: \"Claude 3 Haiku\",\n input: 0.25,\n output: 1.25,\n cache_write_5m: 0.3,\n cache_write_1h: 0.5,\n cache_read: 0.03,\n },\n \"claude-3-5-haiku-20241022\": {\n name: \"Claude 3.5 Haiku\",\n input: 0.8,\n output: 4.0,\n cache_write_5m: 1.0,\n cache_write_1h: 1.6,\n cache_read: 0.08,\n },\n \"claude-3-5-haiku-latest\": {\n name: \"Claude 3.5 Haiku Latest\",\n input: 1.0,\n output: 5.0,\n cache_write_5m: 1.25,\n cache_write_1h: 2.0,\n cache_read: 0.1,\n },\n \"claude-3-opus-latest\": {\n name: \"Claude 3 Opus Latest\",\n input: 15.0,\n output: 75.0,\n cache_write_5m: 18.75,\n cache_write_1h: 30.0,\n cache_read: 1.5,\n },\n \"claude-3-opus-20240229\": {\n name: \"Claude 3 Opus\",\n input: 15.0,\n output: 75.0,\n cache_write_5m: 18.75,\n cache_write_1h: 30.0,\n cache_read: 1.5,\n },\n \"claude-3-5-sonnet-latest\": {\n name: \"Claude 3.5 Sonnet Latest\",\n input: 3.0,\n output: 15.0,\n cache_write_5m: 3.75,\n cache_write_1h: 6.0,\n cache_read: 0.3,\n },\n \"claude-3-5-sonnet-20240620\": {\n name: \"Claude 3.5 Sonnet\",\n input: 3.0,\n output: 15.0,\n cache_write_5m: 3.75,\n cache_write_1h: 6.0,\n cache_read: 0.3,\n },\n \"claude-3-5-sonnet-20241022\": {\n name: \"Claude 3.5 Sonnet\",\n input: 3.0,\n output: 15.0,\n cache_write_5m: 3.75,\n cache_write_1h: 6.0,\n cache_read: 0.3,\n },\n \"claude-opus-4-20250514\": {\n name: \"Claude Opus 4\",\n input: 15.0,\n output: 75.0,\n cache_write_5m: 18.75,\n cache_write_1h: 30.0,\n cache_read: 1.5,\n },\n \"claude-opus-4-1\": {\n name: \"Claude Opus 4.1\",\n input: 15.0,\n output: 75.0,\n cache_write_5m: 18.75,\n cache_write_1h: 30.0,\n cache_read: 1.5,\n },\n \"claude-opus-4-1-20250805\": {\n name: \"Claude Opus 4.1\",\n input: 15.0,\n output: 75.0,\n cache_write_5m: 18.75,\n cache_write_1h: 30.0,\n cache_read: 1.5,\n },\n \"claude-sonnet-4-20250514\": {\n name: \"Claude Sonnet 4\",\n input: 3.0,\n output: 15.0,\n cache_write_5m: 3.75,\n cache_write_1h: 6.0,\n cache_read: 0.3,\n },\n \"claude-4-opus-20250514\": {\n name: \"Claude 4 Opus\",\n input: 15.0,\n output: 75.0,\n cache_write_5m: 18.75,\n cache_write_1h: 30.0,\n cache_read: 1.5,\n },\n \"claude-4-sonnet-20250514\": {\n name: \"Claude 4 Sonnet\",\n input: 3.0,\n output: 15.0,\n cache_write_5m: 3.75,\n cache_write_1h: 6.0,\n cache_read: 0.3,\n },\n \"claude-3-7-sonnet-latest\": {\n name: \"Claude 3.7 Sonnet Latest\",\n input: 3.0,\n output: 15.0,\n cache_write_5m: 3.75,\n cache_write_1h: 6.0,\n cache_read: 0.3,\n },\n \"claude-3-7-sonnet-20250219\": {\n name: \"Claude 3.7 Sonnet\",\n input: 3.0,\n output: 15.0,\n cache_write_5m: 3.75,\n cache_write_1h: 6.0,\n cache_read: 0.3,\n },\n};\n\nexport class PricingService {\n private static memoryCache: Map<\n string,\n { data: Record<string, ModelPricing>; timestamp: number }\n > = new Map();\n private static readonly CACHE_TTL = 24 * 60 * 60 * 1000;\n private static readonly GITHUB_PRICING_URL =\n \"https://raw.githubusercontent.com/Owloops/claude-powerline/main/pricing.json\";\n\n private static getCacheFilePath(): string {\n const { homedir } = require(\"os\");\n const { join } = require(\"path\");\n const { mkdirSync } = require(\"fs\");\n\n const cacheDir = join(homedir(), \".claude\", \"cache\");\n try {\n mkdirSync(cacheDir, { recursive: true });\n } catch {}\n\n return join(cacheDir, \"pricing.json\");\n }\n\n private static loadDiskCache(): {\n data: Record<string, ModelPricing>;\n timestamp: number;\n } | null {\n try {\n const { readFileSync } = require(\"fs\");\n const cacheFile = this.getCacheFilePath();\n const content = readFileSync(cacheFile, \"utf-8\");\n const cached = JSON.parse(content);\n\n if (cached && cached.data && cached.timestamp) {\n return cached;\n }\n } catch {}\n return null;\n }\n\n private static saveDiskCache(data: Record<string, ModelPricing>): void {\n try {\n const { writeFileSync } = require(\"fs\");\n const cacheFile = this.getCacheFilePath();\n const cacheData = { data, timestamp: Date.now() };\n writeFileSync(cacheFile, JSON.stringify(cacheData));\n } catch (error) {\n debug(\"Failed to save pricing cache to disk:\", error);\n }\n }\n\n static async getCurrentPricing(): Promise<Record<string, ModelPricing>> {\n const now = Date.now();\n\n const memCached = this.memoryCache.get(\"pricing\");\n if (memCached && now - memCached.timestamp < this.CACHE_TTL) {\n debug(\n `Using memory cached pricing data for ${Object.keys(memCached.data).length} models`\n );\n return memCached.data;\n }\n\n const diskCached = this.loadDiskCache();\n if (diskCached && now - diskCached.timestamp < this.CACHE_TTL) {\n this.memoryCache.clear();\n this.memoryCache.set(\"pricing\", diskCached);\n debug(\n `Using disk cached pricing data for ${Object.keys(diskCached.data).length} models`\n );\n return diskCached.data;\n }\n\n try {\n const response = await globalThis.fetch(this.GITHUB_PRICING_URL, {\n headers: {\n \"User-Agent\": \"claude-powerline\",\n \"Cache-Control\": \"no-cache\",\n },\n });\n\n if (response.ok) {\n const data = await response.json();\n\n const dataObj = data as Record<string, unknown>;\n const meta = dataObj._meta as { updated?: string } | undefined;\n\n const pricingData: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(dataObj)) {\n if (key !== \"_meta\") {\n pricingData[key] = value;\n }\n }\n\n if (this.validatePricingData(pricingData)) {\n this.memoryCache.clear();\n this.memoryCache.set(\"pricing\", {\n data: pricingData,\n timestamp: now,\n });\n this.saveDiskCache(pricingData);\n debug(\n `Fetched fresh pricing from GitHub for ${Object.keys(pricingData).length} models`\n );\n debug(`Pricing last updated: ${meta?.updated || \"unknown\"}`);\n return pricingData;\n }\n }\n } catch (error) {\n debug(\"Failed to fetch pricing from GitHub, using fallback:\", error);\n }\n\n if (diskCached) {\n this.memoryCache.set(\"pricing\", diskCached);\n debug(\n `Using stale cached pricing data for ${Object.keys(diskCached.data).length} models`\n );\n return diskCached.data;\n }\n\n debug(\n `Using offline pricing data for ${Object.keys(OFFLINE_PRICING_DATA).length} models`\n );\n return OFFLINE_PRICING_DATA;\n }\n\n private static validatePricingData(\n data: unknown\n ): data is Record<string, ModelPricing> {\n if (!data || typeof data !== \"object\") return false;\n\n for (const [, value] of Object.entries(data)) {\n if (!value || typeof value !== \"object\") return false;\n const pricing = value as Record<string, unknown>;\n\n if (\n typeof pricing.input !== \"number\" ||\n typeof pricing.output !== \"number\" ||\n typeof pricing.cache_read !== \"number\"\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n static async getModelPricing(modelId: string): Promise<ModelPricing> {\n const allPricing = await this.getCurrentPricing();\n\n if (allPricing[modelId]) {\n return allPricing[modelId];\n }\n\n return this.fuzzyMatchModel(modelId, allPricing);\n }\n\n private static fuzzyMatchModel(\n modelId: string,\n allPricing: Record<string, ModelPricing>\n ): ModelPricing {\n const lowerModelId = modelId.toLowerCase();\n\n for (const [key, pricing] of Object.entries(allPricing)) {\n if (key.toLowerCase() === lowerModelId) {\n return pricing;\n }\n }\n const patterns = [\n {\n pattern: [\"opus-4-1\", \"claude-opus-4-1\"],\n fallback: \"claude-opus-4-1-20250805\",\n },\n {\n pattern: [\"opus-4\", \"claude-opus-4\"],\n fallback: \"claude-opus-4-20250514\",\n },\n {\n pattern: [\"sonnet-4\", \"claude-sonnet-4\"],\n fallback: \"claude-sonnet-4-20250514\",\n },\n {\n pattern: [\"sonnet-3.7\", \"3-7-sonnet\"],\n fallback: \"claude-3-7-sonnet-20250219\",\n },\n {\n pattern: [\"3-5-sonnet\", \"sonnet-3.5\"],\n fallback: \"claude-3-5-sonnet-20241022\",\n },\n {\n pattern: [\"3-5-haiku\", \"haiku-3.5\"],\n fallback: \"claude-3-5-haiku-20241022\",\n },\n { pattern: [\"haiku\", \"3-haiku\"], fallback: \"claude-3-haiku-20240307\" },\n { pattern: [\"opus\"], fallback: \"claude-opus-4-20250514\" },\n { pattern: [\"sonnet\"], fallback: \"claude-3-5-sonnet-20241022\" },\n ];\n\n for (const { pattern, fallback } of patterns) {\n if (pattern.some((p) => lowerModelId.includes(p))) {\n if (allPricing[fallback]) {\n return allPricing[fallback];\n }\n }\n }\n\n return (\n allPricing[\"claude-3-5-sonnet-20241022\"] || {\n name: `${modelId} (Unknown Model)`,\n input: 3.0,\n cache_write_5m: 3.75,\n cache_write_1h: 6.0,\n cache_read: 0.3,\n output: 15.0,\n }\n );\n }\n\n static async calculateCostForEntry(entry: any): Promise<number> {\n const message = entry.message;\n const usage = message?.usage;\n if (!usage) return 0;\n\n const modelId = this.extractModelId(entry);\n const pricing = await this.getModelPricing(modelId);\n\n const inputTokens = usage.input_tokens || 0;\n const outputTokens = usage.output_tokens || 0;\n const cacheCreationTokens = usage.cache_creation_input_tokens || 0;\n const cacheReadTokens = usage.cache_read_input_tokens || 0;\n\n const inputCost = (inputTokens / 1_000_000) * pricing.input;\n const outputCost = (outputTokens / 1_000_000) * pricing.output;\n const cacheReadCost = (cacheReadTokens / 1_000_000) * pricing.cache_read;\n const cacheCreationCost =\n (cacheCreationTokens / 1_000_000) * pricing.cache_write_5m;\n\n return inputCost + outputCost + cacheCreationCost + cacheReadCost;\n }\n\n private static extractModelId(entry: any): string {\n if (entry.model && typeof entry.model === \"string\") {\n return entry.model;\n }\n\n const message = entry.message;\n if (message?.model) {\n const model = message.model;\n if (typeof model === \"string\") {\n return model;\n }\n return model?.id || \"claude-3-5-sonnet-20241022\";\n }\n\n if (entry.model_id && typeof entry.model_id === \"string\") {\n return entry.model_id;\n }\n\n return \"claude-3-5-sonnet-20241022\";\n }\n}\n","import { readdir, readFile, stat } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join, posix } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { debug } from \"./logger\";\n\nexport function getClaudePaths(): string[] {\n const paths: string[] = [];\n\n const envPath = process.env.CLAUDE_CONFIG_DIR;\n if (envPath) {\n envPath.split(\",\").forEach((path) => {\n const trimmedPath = path.trim();\n if (existsSync(trimmedPath)) {\n paths.push(trimmedPath);\n }\n });\n }\n\n if (paths.length === 0) {\n const homeDir = homedir();\n const configPath = join(homeDir, \".config\", \"claude\");\n const claudePath = join(homeDir, \".claude\");\n\n if (existsSync(configPath)) {\n paths.push(configPath);\n } else if (existsSync(claudePath)) {\n paths.push(claudePath);\n }\n }\n\n return paths;\n}\n\nexport async function findProjectPaths(\n claudePaths: string[]\n): Promise<string[]> {\n const projectPaths: string[] = [];\n\n for (const claudePath of claudePaths) {\n const projectsDir = join(claudePath, \"projects\");\n\n if (existsSync(projectsDir)) {\n try {\n const entries = await readdir(projectsDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const projectPath = posix.join(projectsDir, entry.name);\n projectPaths.push(projectPath);\n }\n }\n } catch (error) {\n debug(`Failed to read projects directory ${projectsDir}:`, error);\n }\n }\n }\n\n return projectPaths;\n}\n\nexport async function findTranscriptFile(\n sessionId: string\n): Promise<string | null> {\n const claudePaths = getClaudePaths();\n const projectPaths = await findProjectPaths(claudePaths);\n\n for (const projectPath of projectPaths) {\n const transcriptPath = posix.join(projectPath, `${sessionId}.jsonl`);\n if (existsSync(transcriptPath)) {\n return transcriptPath;\n }\n }\n\n return null;\n}\n\nexport async function getEarliestTimestamp(\n filePath: string\n): Promise<Date | null> {\n try {\n const content = await readFile(filePath, \"utf-8\");\n const lines = content.trim().split(\"\\n\");\n\n let earliestDate: Date | null = null;\n for (const line of lines) {\n if (!line.trim()) continue;\n\n try {\n const json = JSON.parse(line);\n if (json.timestamp && typeof json.timestamp === \"string\") {\n const date = new Date(json.timestamp);\n if (!isNaN(date.getTime())) {\n if (earliestDate === null || date < earliestDate) {\n earliestDate = date;\n }\n }\n }\n } catch {\n continue;\n }\n }\n return earliestDate;\n } catch (error) {\n debug(`Failed to get earliest timestamp for ${filePath}:`, error);\n return null;\n }\n}\n\nexport async function sortFilesByTimestamp(\n files: string[],\n oldestFirst = true\n): Promise<string[]> {\n const filesWithTimestamps = await Promise.all(\n files.map(async (file) => ({\n file,\n timestamp: await getEarliestTimestamp(file),\n }))\n );\n\n return filesWithTimestamps\n .sort((a, b) => {\n if (a.timestamp === null && b.timestamp === null) return 0;\n if (a.timestamp === null) return 1;\n if (b.timestamp === null) return -1;\n const sortOrder = oldestFirst ? 1 : -1;\n return sortOrder * (a.timestamp.getTime() - b.timestamp.getTime());\n })\n .map((item) => item.file);\n}\n\nexport async function getFileModificationDate(\n filePath: string\n): Promise<Date | null> {\n try {\n const stats = await stat(filePath);\n return stats.mtime;\n } catch {\n return null;\n }\n}\n\nexport interface ParsedEntry {\n timestamp: Date;\n message?: {\n id?: string;\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n };\n model?: string;\n };\n costUSD?: number;\n isSidechain?: boolean;\n raw: Record<string, unknown>;\n}\n\nexport function createUniqueHash(entry: ParsedEntry): string | null {\n const messageId =\n entry.message?.id ||\n (typeof entry.raw.message === \"object\" &&\n entry.raw.message !== null &&\n \"id\" in entry.raw.message\n ? (entry.raw.message.id as string)\n : undefined);\n const requestId =\n \"requestId\" in entry.raw ? (entry.raw.requestId as string) : undefined;\n\n if (!messageId || !requestId) {\n return null;\n }\n\n return `${messageId}:${requestId}`;\n}\n\nexport async function parseJsonlFile(filePath: string): Promise<ParsedEntry[]> {\n try {\n const content = await readFile(filePath, \"utf-8\");\n const lines = content\n .trim()\n .split(\"\\n\")\n .filter((line) => line.trim());\n const entries: ParsedEntry[] = [];\n\n for (const line of lines) {\n try {\n const raw = JSON.parse(line);\n if (!raw.timestamp) continue;\n\n const entry: ParsedEntry = {\n timestamp: new Date(raw.timestamp),\n message: raw.message,\n costUSD: typeof raw.costUSD === \"number\" ? raw.costUSD : undefined,\n isSidechain: raw.isSidechain === true,\n raw,\n };\n\n entries.push(entry);\n } catch (parseError) {\n debug(`Failed to parse JSONL line: ${parseError}`);\n continue;\n }\n }\n\n return entries;\n } catch (error) {\n debug(`Failed to read file ${filePath}:`, error);\n return [];\n }\n}\n\nexport async function loadEntriesFromProjects(\n timeFilter?: (entry: ParsedEntry) => boolean,\n fileFilter?: (filePath: string, modTime: Date) => boolean,\n sortFiles = false\n): Promise<ParsedEntry[]> {\n const entries: ParsedEntry[] = [];\n const claudePaths = getClaudePaths();\n const projectPaths = await findProjectPaths(claudePaths);\n const processedHashes = new Set<string>();\n\n const allFiles: string[] = [];\n for (const projectPath of projectPaths) {\n try {\n const files = await readdir(projectPath);\n const jsonlFiles = files.filter((file) => file.endsWith(\".jsonl\"));\n\n const fileStatsPromises = jsonlFiles.map(async (file) => {\n const filePath = posix.join(projectPath, file);\n if (existsSync(filePath)) {\n const mtime = await getFileModificationDate(filePath);\n return { filePath, mtime };\n }\n return null;\n });\n\n const fileStats = await Promise.all(fileStatsPromises);\n\n for (const stat of fileStats) {\n if (\n stat?.mtime &&\n (!fileFilter || fileFilter(stat.filePath, stat.mtime))\n ) {\n allFiles.push(stat.filePath);\n }\n }\n } catch (dirError) {\n debug(`Failed to read project directory ${projectPath}:`, dirError);\n continue;\n }\n }\n\n if (sortFiles) {\n const sortedFiles = await sortFilesByTimestamp(allFiles, false);\n allFiles.length = 0;\n allFiles.push(...sortedFiles);\n }\n\n for (const filePath of allFiles) {\n const fileEntries = await parseJsonlFile(filePath);\n for (const entry of fileEntries) {\n const uniqueHash = createUniqueHash(entry);\n if (uniqueHash && processedHashes.has(uniqueHash)) {\n debug(`Skipping duplicate entry: ${uniqueHash}`);\n continue;\n }\n\n if (uniqueHash) {\n processedHashes.add(uniqueHash);\n }\n\n if (!timeFilter || timeFilter(entry)) {\n entries.push(entry);\n }\n }\n }\n\n return entries;\n}\n","import { debug } from \"../utils/logger\";\nimport { PricingService } from \"./pricing\";\nimport {\n findTranscriptFile,\n parseJsonlFile,\n type ParsedEntry,\n} from \"../utils/claude\";\n\nexport interface SessionUsageEntry {\n timestamp: string;\n message: {\n usage: {\n input_tokens: number;\n output_tokens: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n };\n };\n costUSD?: number;\n}\n\nexport interface SessionUsage {\n totalCost: number;\n entries: SessionUsageEntry[];\n}\n\nexport interface TokenBreakdown {\n input: number;\n output: number;\n cacheCreation: number;\n cacheRead: number;\n}\n\nexport interface SessionInfo {\n cost: number | null;\n tokens: number | null;\n tokenBreakdown: TokenBreakdown | null;\n}\n\nexport interface UsageInfo {\n session: SessionInfo;\n}\n\nfunction convertToSessionEntry(entry: ParsedEntry): SessionUsageEntry {\n return {\n timestamp: entry.timestamp.toISOString(),\n message: {\n usage: {\n input_tokens: entry.message?.usage?.input_tokens || 0,\n output_tokens: entry.message?.usage?.output_tokens || 0,\n cache_creation_input_tokens:\n entry.message?.usage?.cache_creation_input_tokens,\n cache_read_input_tokens: entry.message?.usage?.cache_read_input_tokens,\n },\n },\n costUSD: entry.costUSD,\n };\n}\n\nexport class SessionProvider {\n async getSessionUsage(sessionId: string): Promise<SessionUsage | null> {\n try {\n const transcriptPath = await findTranscriptFile(sessionId);\n if (!transcriptPath) {\n debug(`No transcript found for session: ${sessionId}`);\n return null;\n }\n\n debug(`Found transcript at: ${transcriptPath}`);\n\n const parsedEntries = await parseJsonlFile(transcriptPath);\n\n if (parsedEntries.length === 0) {\n return { totalCost: 0, entries: [] };\n }\n\n const entries: SessionUsageEntry[] = [];\n let totalCost = 0;\n\n for (const entry of parsedEntries) {\n if (entry.message?.usage) {\n const sessionEntry = convertToSessionEntry(entry);\n\n if (sessionEntry.costUSD !== undefined) {\n totalCost += sessionEntry.costUSD;\n } else {\n const cost = await PricingService.calculateCostForEntry(entry.raw);\n sessionEntry.costUSD = cost;\n totalCost += cost;\n }\n\n entries.push(sessionEntry);\n }\n }\n\n debug(\n `Parsed ${entries.length} usage entries, total cost: $${totalCost.toFixed(4)}`\n );\n return { totalCost, entries };\n } catch (error) {\n debug(`Error reading session usage for ${sessionId}:`, error);\n return null;\n }\n }\n\n calculateTokenBreakdown(entries: SessionUsageEntry[]): TokenBreakdown {\n return entries.reduce(\n (breakdown, entry) => ({\n input: breakdown.input + (entry.message.usage.input_tokens || 0),\n output: breakdown.output + (entry.message.usage.output_tokens || 0),\n cacheCreation:\n breakdown.cacheCreation +\n (entry.message.usage.cache_creation_input_tokens || 0),\n cacheRead:\n breakdown.cacheRead +\n (entry.message.usage.cache_read_input_tokens || 0),\n }),\n { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 }\n );\n }\n\n async getSessionInfo(sessionId: string): Promise<SessionInfo> {\n const sessionUsage = await this.getSessionUsage(sessionId);\n\n if (!sessionUsage || sessionUsage.entries.length === 0) {\n return { cost: null, tokens: null, tokenBreakdown: null };\n }\n\n const tokenBreakdown = this.calculateTokenBreakdown(sessionUsage.entries);\n const totalTokens =\n tokenBreakdown.input +\n tokenBreakdown.output +\n tokenBreakdown.cacheCreation +\n tokenBreakdown.cacheRead;\n\n return {\n cost: sessionUsage.totalCost,\n tokens: totalTokens,\n tokenBreakdown,\n };\n }\n}\n\nexport class UsageProvider {\n private sessionProvider = new SessionProvider();\n\n async getUsageInfo(sessionId: string): Promise<UsageInfo> {\n try {\n debug(`Starting usage info retrieval for session: ${sessionId}`);\n\n const sessionInfo = await this.sessionProvider.getSessionInfo(sessionId);\n\n return {\n session: sessionInfo,\n };\n } catch (error) {\n debug(`Error getting usage info for session ${sessionId}:`, error);\n return {\n session: { cost: null, tokens: null, tokenBreakdown: null },\n };\n }\n }\n}\n","import { readFileSync } from \"node:fs\";\nimport { debug } from \"../utils/logger\";\nimport { parseJsonlFile, type ParsedEntry } from \"../utils/claude\";\n\nexport interface ContextInfo {\n inputTokens: number;\n percentage: number;\n usablePercentage: number;\n contextLeftPercentage: number;\n maxTokens: number;\n usableTokens: number;\n}\n\ninterface ContextUsageThresholds {\n LOW: number;\n MEDIUM: number;\n}\n\nexport class ContextProvider {\n private readonly thresholds: ContextUsageThresholds = {\n LOW: 50,\n MEDIUM: 80,\n };\n\n getContextUsageThresholds(): ContextUsageThresholds {\n return this.thresholds;\n }\n\n private getContextLimit(_modelId: string): number {\n return 200000;\n }\n\n async calculateContextTokens(\n transcriptPath: string,\n modelId?: string\n ): Promise<ContextInfo | null> {\n try {\n debug(`Calculating context tokens from transcript: ${transcriptPath}`);\n\n try {\n const content = readFileSync(transcriptPath, \"utf-8\");\n if (!content) {\n debug(\"Transcript file is empty\");\n return null;\n }\n } catch {\n debug(\"Could not read transcript file\");\n return null;\n }\n\n const parsedEntries = await parseJsonlFile(transcriptPath);\n\n if (parsedEntries.length === 0) {\n debug(\"No entries in transcript\");\n return null;\n }\n\n let mostRecentEntry: ParsedEntry | null = null;\n\n for (let i = parsedEntries.length - 1; i >= 0; i--) {\n const entry = parsedEntries[i];\n if (!entry) continue;\n\n if (!entry.message?.usage?.input_tokens) continue;\n if (entry.isSidechain === true) continue;\n\n mostRecentEntry = entry;\n debug(\n `Context segment: Found most recent entry at ${entry.timestamp.toISOString()}, stopping search`\n );\n break;\n }\n\n if (mostRecentEntry?.message?.usage) {\n const usage = mostRecentEntry.message.usage;\n const contextLength =\n (usage.input_tokens || 0) +\n (usage.cache_read_input_tokens || 0) +\n (usage.cache_creation_input_tokens || 0);\n\n const contextLimit = modelId ? this.getContextLimit(modelId) : 200000;\n\n debug(\n `Most recent main chain context: ${contextLength} tokens (limit: ${contextLimit})`\n );\n\n const percentage = Math.min(\n 100,\n Math.max(0, Math.round((contextLength / contextLimit) * 100))\n );\n\n const usableLimit = Math.round(contextLimit * 0.75);\n const usablePercentage = Math.min(\n 100,\n Math.max(0, Math.round((contextLength / usableLimit) * 100))\n );\n\n const contextLeftPercentage = Math.max(0, 100 - usablePercentage);\n\n return {\n inputTokens: contextLength,\n percentage,\n usablePercentage,\n contextLeftPercentage,\n maxTokens: contextLimit,\n usableTokens: usableLimit,\n };\n }\n\n debug(\"No main chain entries with usage data found\");\n return null;\n } catch (error) {\n debug(\n `Error reading transcript: ${error instanceof Error ? error.message : String(error)}`\n );\n return null;\n }\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { debug } from \"../utils/logger\";\nimport { PricingService } from \"./pricing\";\nimport { findTranscriptFile } from \"../utils/claude\";\n\nexport interface MetricsInfo {\n responseTime: number | null;\n lastResponseTime: number | null;\n sessionDuration: number | null;\n messageCount: number | null;\n costBurnRate: number | null;\n tokenBurnRate: number | null;\n}\n\ninterface TranscriptEntry {\n timestamp: string;\n type?: string;\n message?: {\n role?: string;\n type?: string;\n content?: Array<{\n type?: string;\n [key: string]: any;\n }>;\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n };\n };\n costUSD?: number;\n isSidechain?: boolean;\n}\n\nexport class MetricsProvider {\n private async loadTranscriptEntries(\n sessionId: string\n ): Promise<TranscriptEntry[]> {\n try {\n const transcriptPath = await findTranscriptFile(sessionId);\n if (!transcriptPath) {\n debug(`No transcript found for session: ${sessionId}`);\n return [];\n }\n\n debug(`Loading transcript from: ${transcriptPath}`);\n\n const content = await readFile(transcriptPath, \"utf-8\");\n const lines = content\n .trim()\n .split(\"\\n\")\n .filter((line) => line.trim());\n\n const entries: TranscriptEntry[] = [];\n\n for (const line of lines) {\n try {\n const entry = JSON.parse(line) as TranscriptEntry;\n\n if (entry.isSidechain === true) {\n continue;\n }\n\n entries.push(entry);\n } catch (parseError) {\n debug(`Failed to parse JSONL line: ${parseError}`);\n continue;\n }\n }\n\n debug(`Loaded ${entries.length} transcript entries`);\n return entries;\n } catch (error) {\n debug(`Error loading transcript for ${sessionId}:`, error);\n return [];\n }\n }\n\n private calculateResponseTimes(entries: TranscriptEntry[]): {\n average: number | null;\n last: number | null;\n } {\n const userMessages: Date[] = [];\n const assistantMessages: Date[] = [];\n let lastUserMessageIndex = -1;\n let lastUserMessageTime: Date | null = null;\n let lastResponseEndTime: Date | null = null;\n let lastResponseEndIndex = -1;\n\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i];\n if (!entry || !entry.timestamp) continue;\n\n try {\n const timestamp = new Date(entry.timestamp);\n const messageType =\n entry.type || entry.message?.role || entry.message?.type;\n\n const isToolResult =\n entry.type === \"user\" &&\n entry.message?.content?.[0]?.type === \"tool_result\";\n\n const isRealUserMessage = messageType === \"user\" && !isToolResult;\n\n if (isRealUserMessage) {\n userMessages.push(timestamp);\n lastUserMessageTime = timestamp;\n lastUserMessageIndex = i;\n lastResponseEndTime = null;\n lastResponseEndIndex = -1;\n debug(\n `Found user message at index ${i}, timestamp ${timestamp.toISOString()}`\n );\n } else if (lastUserMessageIndex >= 0) {\n const isPartOfResponse =\n messageType === \"assistant\" ||\n isToolResult ||\n messageType === \"system\" ||\n entry.message?.usage;\n\n if (isPartOfResponse) {\n lastResponseEndTime = timestamp;\n lastResponseEndIndex = i;\n\n if (messageType === \"assistant\" || entry.message?.usage) {\n assistantMessages.push(timestamp);\n debug(\n `Found assistant message at index ${i}, timestamp ${timestamp.toISOString()}`\n );\n } else if (isToolResult) {\n debug(\n `Found tool result at index ${i}, timestamp ${timestamp.toISOString()}`\n );\n } else {\n debug(\n `Found ${messageType} message at index ${i}, timestamp ${timestamp.toISOString()}`\n );\n }\n }\n }\n } catch {\n continue;\n }\n }\n\n if (userMessages.length === 0 || assistantMessages.length === 0) {\n return { average: null, last: null };\n }\n\n const responseTimes: number[] = [];\n\n for (const assistantTime of assistantMessages) {\n const priorUsers = userMessages.filter(\n (userTime) => userTime < assistantTime\n );\n\n if (priorUsers.length > 0) {\n const userTime = new Date(\n Math.max(...priorUsers.map((d) => d.getTime()))\n );\n const responseTime =\n (assistantTime.getTime() - userTime.getTime()) / 1000;\n\n if (responseTime > 0.1 && responseTime < 300) {\n responseTimes.push(responseTime);\n debug(`Valid response time: ${responseTime.toFixed(1)}s`);\n } else {\n debug(\n `Rejected response time: ${responseTime.toFixed(1)}s (outside 0.1s-5m range)`\n );\n }\n }\n }\n\n let lastResponseTime: number | null = null;\n if (\n lastUserMessageTime &&\n lastResponseEndTime &&\n lastResponseEndIndex > lastUserMessageIndex\n ) {\n const timeDiff =\n lastResponseEndTime.getTime() - lastUserMessageTime.getTime();\n const positionDiff = lastResponseEndIndex - lastUserMessageIndex;\n\n if (timeDiff === 0 && positionDiff > 0) {\n lastResponseTime = positionDiff * 0.1;\n debug(\n `Estimated last response time from position difference: ${lastResponseTime.toFixed(2)}s (${positionDiff} messages)`\n );\n } else if (timeDiff > 0) {\n lastResponseTime = timeDiff / 1000;\n debug(\n `Last response time from timestamps: ${lastResponseTime.toFixed(2)}s`\n );\n }\n\n debug(\n `Last user message at index ${lastUserMessageIndex}, timestamp ${lastUserMessageTime.toISOString()}`\n );\n debug(\n `Last response end at index ${lastResponseEndIndex}, timestamp ${lastResponseEndTime.toISOString()}`\n );\n }\n\n if (responseTimes.length === 0 && lastResponseTime === null) {\n return { average: null, last: null };\n }\n\n const avgResponseTime =\n responseTimes.length > 0\n ? responseTimes.reduce((sum, time) => sum + time, 0) /\n responseTimes.length\n : null;\n\n debug(\n `Calculated average response time: ${avgResponseTime?.toFixed(2) || \"null\"}s from ${responseTimes.length} measurements`\n );\n debug(`Last response time: ${lastResponseTime?.toFixed(2) || \"null\"}s`);\n\n return { average: avgResponseTime, last: lastResponseTime };\n }\n\n private calculateSessionDuration(entries: TranscriptEntry[]): number | null {\n const timestamps: Date[] = [];\n\n for (const entry of entries) {\n if (!entry.timestamp) continue;\n\n try {\n timestamps.push(new Date(entry.timestamp));\n } catch {\n continue;\n }\n }\n\n if (timestamps.length < 2) {\n return null;\n }\n\n timestamps.sort((a, b) => a.getTime() - b.getTime());\n\n const lastTimestamp = timestamps[timestamps.length - 1];\n const firstTimestamp = timestamps[0];\n\n if (!lastTimestamp || !firstTimestamp) {\n return null;\n }\n\n const duration =\n (lastTimestamp.getTime() - firstTimestamp.getTime()) / 1000;\n return duration > 0 ? duration : null;\n }\n\n private calculateBurnRateDuration(entries: TranscriptEntry[]): number | null {\n if (entries.length === 0) return null;\n\n const now = new Date();\n const timestamps = entries\n .map((entry) => entry.timestamp)\n .filter(Boolean)\n .map((ts) => new Date(ts))\n .filter((ts) => now.getTime() - ts.getTime() < 2 * 60 * 60 * 1000)\n .sort((a, b) => a.getTime() - b.getTime());\n\n if (timestamps.length === 0) return null;\n\n const sessionStart = timestamps[0];\n if (!sessionStart) return null;\n\n const durationFromStart = Math.max(\n (now.getTime() - sessionStart.getTime()) / 1000,\n 30 * 60\n );\n\n return durationFromStart;\n }\n\n private calculateMessageCount(entries: TranscriptEntry[]): number {\n return entries.filter((entry) => {\n const messageType =\n entry.type || entry.message?.role || entry.message?.type;\n const isToolResult =\n entry.type === \"user\" &&\n entry.message?.content?.[0]?.type === \"tool_result\";\n return messageType === \"user\" && !isToolResult;\n }).length;\n }\n\n private async calculateTotalCost(\n entries: TranscriptEntry[]\n ): Promise<number> {\n let total = 0;\n const processedEntries = new Set<string>();\n\n for (const entry of entries) {\n const entryKey = `${entry.timestamp}-${JSON.stringify(entry.message?.usage || {})}`;\n\n if (processedEntries.has(entryKey)) {\n debug(`Skipping duplicate entry at ${entry.timestamp}`);\n continue;\n }\n processedEntries.add(entryKey);\n\n if (typeof entry.costUSD === \"number\") {\n total += entry.costUSD;\n } else if (entry.message?.usage) {\n const cost = await PricingService.calculateCostForEntry(entry);\n total += cost;\n }\n }\n\n return Math.round(total * 10000) / 10000;\n }\n\n private calculateTotalTokens(entries: TranscriptEntry[]): number {\n const processedEntries = new Set<string>();\n\n return entries.reduce((total, entry) => {\n const usage = entry.message?.usage;\n if (!usage) return total;\n\n const entryKey = `${entry.timestamp}-${JSON.stringify(usage)}`;\n\n if (processedEntries.has(entryKey)) {\n debug(`Skipping duplicate token entry at ${entry.timestamp}`);\n return total;\n }\n processedEntries.add(entryKey);\n\n return (\n total +\n (usage.input_tokens || 0) +\n (usage.output_tokens || 0) +\n (usage.cache_creation_input_tokens || 0) +\n (usage.cache_read_input_tokens || 0)\n );\n }, 0);\n }\n\n async getMetricsInfo(sessionId: string): Promise<MetricsInfo> {\n try {\n debug(`Starting metrics calculation for session: ${sessionId}`);\n\n const entries = await this.loadTranscriptEntries(sessionId);\n\n if (entries.length === 0) {\n return {\n responseTime: null,\n lastResponseTime: null,\n sessionDuration: null,\n messageCount: null,\n costBurnRate: null,\n tokenBurnRate: null,\n };\n }\n\n const responseTimes = this.calculateResponseTimes(entries);\n const sessionDuration = this.calculateSessionDuration(entries);\n const messageCount = this.calculateMessageCount(entries);\n\n let costBurnRate: number | null = null;\n let tokenBurnRate: number | null = null;\n\n const burnRateDuration = this.calculateBurnRateDuration(entries);\n if (burnRateDuration && burnRateDuration > 60) {\n const hoursElapsed = burnRateDuration / 3600;\n\n if (hoursElapsed <= 0) {\n debug(`Invalid hours elapsed: ${hoursElapsed}`);\n } else {\n const totalCost = await this.calculateTotalCost(entries);\n const totalTokens = this.calculateTotalTokens(entries);\n\n if (totalCost > 0) {\n costBurnRate = Math.round((totalCost / hoursElapsed) * 100) / 100;\n debug(\n `Cost burn rate: $${costBurnRate}/h (total: $${totalCost}, duration: ${hoursElapsed}h)`\n );\n }\n\n if (totalTokens > 0) {\n tokenBurnRate = Math.round(totalTokens / hoursElapsed);\n debug(\n `Token burn rate: ${tokenBurnRate}/h (total: ${totalTokens}, duration: ${hoursElapsed}h)`\n );\n }\n }\n }\n\n debug(\n `Metrics calculated: avgResponseTime=${responseTimes.average?.toFixed(2) || \"null\"}s, lastResponseTime=${responseTimes.last?.toFixed(2) || \"null\"}s, sessionDuration=${sessionDuration?.toFixed(0) || \"null\"}s, messageCount=${messageCount}`\n );\n\n return {\n responseTime: responseTimes.average,\n lastResponseTime: responseTimes.last,\n sessionDuration,\n messageCount,\n costBurnRate,\n tokenBurnRate,\n };\n } catch (error) {\n debug(`Error calculating metrics for session ${sessionId}:`, error);\n return {\n responseTime: null,\n lastResponseTime: null,\n sessionDuration: null,\n messageCount: null,\n costBurnRate: null,\n tokenBurnRate: null,\n };\n }\n }\n}\n","import { execSync } from \"node:child_process\";\nimport { debug } from \"../utils/logger\";\n\nexport interface VersionInfo {\n version: string | null;\n}\n\nexport class VersionProvider {\n private cachedVersion: string | null = null;\n private cacheTimestamp: number = 0;\n private readonly CACHE_TTL = 30000;\n\n getClaudeVersion(): string | null {\n const now = Date.now();\n if (\n this.cachedVersion !== null &&\n now - this.cacheTimestamp < this.CACHE_TTL\n ) {\n return this.cachedVersion;\n }\n\n try {\n const output = execSync(\"claude --version\", {\n encoding: \"utf8\",\n timeout: 1000,\n }).trim();\n\n const match = output.match(/^([\\d.]+)/);\n if (match) {\n this.cachedVersion = `v${match[1]}`;\n this.cacheTimestamp = now;\n debug(`Claude Code version: ${this.cachedVersion}`);\n return this.cachedVersion;\n }\n\n debug(`Could not parse version from: ${output}`);\n return null;\n } catch (error) {\n debug(`Error getting Claude Code version:`, error);\n return null;\n }\n }\n\n async getVersionInfo(): Promise<VersionInfo> {\n const version = this.getClaudeVersion();\n return { version };\n }\n}\n","interface TokenBreakdown {\n input: number;\n output: number;\n cacheCreation: number;\n cacheRead: number;\n}\n\nexport function formatCost(cost: number | null): string {\n if (cost === null) return \"$0.00\";\n if (cost < 0.01) return \"<$0.01\";\n return `$${cost.toFixed(2)}`;\n}\n\nexport function formatTokens(tokens: number | null): string {\n if (tokens === null) return \"0 tokens\";\n if (tokens === 0) return \"0 tokens\";\n if (tokens >= 1_000_000) {\n return `${(tokens / 1_000_000).toFixed(1)}M tokens`;\n } else if (tokens >= 1_000) {\n return `${(tokens / 1_000).toFixed(1)}K tokens`;\n }\n return `${tokens} tokens`;\n}\n\nexport function formatTokenBreakdown(breakdown: TokenBreakdown | null): string {\n if (!breakdown) return \"0 tokens\";\n\n const parts: string[] = [];\n\n if (breakdown.input > 0) {\n parts.push(`${formatTokens(breakdown.input).replace(\" tokens\", \"\")}in`);\n }\n\n if (breakdown.output > 0) {\n parts.push(`${formatTokens(breakdown.output).replace(\" tokens\", \"\")}out`);\n }\n\n if (breakdown.cacheCreation > 0 || breakdown.cacheRead > 0) {\n const totalCached = breakdown.cacheCreation + breakdown.cacheRead;\n parts.push(`${formatTokens(totalCached).replace(\" tokens\", \"\")}cached`);\n }\n\n return parts.length > 0 ? parts.join(\" + \") : \"0 tokens\";\n}\n","export interface BudgetStatus {\n percentage: number | null;\n isWarning: boolean;\n displayText: string;\n}\n\nexport function calculateBudgetPercentage(\n cost: number,\n budget: number | undefined\n): number | null {\n if (!budget || budget <= 0 || cost < 0) return null;\n return Math.min(100, (cost / budget) * 100);\n}\n\nexport function getBudgetStatus(\n cost: number,\n budget: number | undefined,\n warningThreshold = 80\n): BudgetStatus {\n const percentage = calculateBudgetPercentage(cost, budget);\n\n if (percentage === null) {\n return {\n percentage: null,\n isWarning: false,\n displayText: \"\",\n };\n }\n\n const percentStr = `${percentage.toFixed(0)}%`;\n const isWarning = percentage >= warningThreshold;\n\n let displayText = \"\";\n if (isWarning) {\n displayText = ` !${percentStr}`;\n } else if (percentage >= 50) {\n displayText = ` +${percentStr}`;\n } else {\n displayText = ` ${percentStr}`;\n }\n\n return {\n percentage,\n isWarning,\n displayText,\n };\n}\n","import path from \"node:path\";\nimport type { ClaudeHookData } from \"../index\";\nimport type { PowerlineColors } from \"../themes\";\nimport type { PowerlineConfig } from \"../config/loader\";\nimport type { BlockInfo } from \"./block\";\n\nexport interface SegmentConfig {\n enabled: boolean;\n}\n\nexport interface DirectorySegmentConfig extends SegmentConfig {\n showBasename?: boolean;\n}\n\nexport interface GitSegmentConfig extends SegmentConfig {\n showSha?: boolean;\n showAheadBehind?: boolean;\n showWorkingTree?: boolean;\n showOperation?: boolean;\n showTag?: boolean;\n showTimeSinceCommit?: boolean;\n showStashCount?: boolean;\n showUpstream?: boolean;\n showRepoName?: boolean;\n}\n\nexport interface UsageSegmentConfig extends SegmentConfig {\n type: \"cost\" | \"tokens\" | \"both\" | \"breakdown\";\n}\n\nexport interface TmuxSegmentConfig extends SegmentConfig {}\n\nexport interface ContextSegmentConfig extends SegmentConfig {}\n\nexport interface MetricsSegmentConfig extends SegmentConfig {\n showResponseTime?: boolean;\n showLastResponseTime?: boolean;\n showDuration?: boolean;\n showMessageCount?: boolean;\n}\n\nexport interface BlockSegmentConfig extends SegmentConfig {\n type: \"cost\" | \"tokens\" | \"both\" | \"time\";\n burnType?: \"cost\" | \"tokens\" | \"both\" | \"none\";\n}\n\nexport interface TodaySegmentConfig extends SegmentConfig {\n type: \"cost\" | \"tokens\" | \"both\" | \"breakdown\";\n}\n\nexport interface VersionSegmentConfig extends SegmentConfig {}\n\nexport type AnySegmentConfig =\n | SegmentConfig\n | DirectorySegmentConfig\n | GitSegmentConfig\n | UsageSegmentConfig\n | TmuxSegmentConfig\n | ContextSegmentConfig\n | MetricsSegmentConfig\n | BlockSegmentConfig\n | TodaySegmentConfig\n | VersionSegmentConfig;\n\nimport {\n formatCost,\n formatTokens,\n formatTokenBreakdown,\n} from \"../utils/formatters\";\nimport { getBudgetStatus } from \"../utils/budget\";\nimport type {\n UsageInfo,\n TokenBreakdown,\n GitInfo,\n ContextInfo,\n MetricsInfo,\n VersionInfo,\n} from \".\";\nimport type { TodayInfo } from \"./today\";\n\nexport interface PowerlineSymbols {\n right: string;\n branch: string;\n model: string;\n git_clean: string;\n git_dirty: string;\n git_conflicts: string;\n git_ahead: string;\n git_behind: string;\n git_worktree: string;\n git_tag: string;\n git_sha: string;\n git_upstream: string;\n git_stash: string;\n git_time: string;\n session_cost: string;\n block_cost: string;\n today_cost: string;\n context_time: string;\n metrics_response: string;\n metrics_last_response: string;\n metrics_duration: string;\n metrics_messages: string;\n metrics_burn: string;\n version: string;\n}\n\nexport interface SegmentData {\n text: string;\n bgColor: string;\n fgColor: string;\n}\n\nexport class SegmentRenderer {\n constructor(\n private readonly config: PowerlineConfig,\n private readonly symbols: PowerlineSymbols\n ) {}\n\n renderDirectory(\n hookData: ClaudeHookData,\n colors: PowerlineColors,\n config?: DirectorySegmentConfig\n ): SegmentData {\n const currentDir = hookData.workspace?.current_dir || hookData.cwd || \"/\";\n const projectDir = hookData.workspace?.project_dir;\n\n if (config?.showBasename) {\n const basename = path.basename(currentDir) || \"root\";\n return {\n text: basename,\n bgColor: colors.modeBg,\n fgColor: colors.modeFg,\n };\n }\n\n const homeDir = process.env.HOME || process.env.USERPROFILE;\n let displayDir = currentDir;\n let displayProjectDir = projectDir;\n\n if (homeDir) {\n if (currentDir.startsWith(homeDir)) {\n displayDir = currentDir.replace(homeDir, \"~\");\n }\n if (projectDir && projectDir.startsWith(homeDir)) {\n displayProjectDir = projectDir.replace(homeDir, \"~\");\n }\n }\n\n const dirName = this.getDisplayDirectoryName(displayDir, displayProjectDir);\n\n return {\n text: dirName,\n bgColor: colors.modeBg,\n fgColor: colors.modeFg,\n };\n }\n\n renderGit(\n gitInfo: GitInfo,\n colors: PowerlineColors,\n config?: GitSegmentConfig\n ): SegmentData | null {\n if (!gitInfo) return null;\n\n const parts: string[] = [];\n\n if (config?.showRepoName && gitInfo.repoName) {\n parts.push(gitInfo.repoName);\n if (gitInfo.isWorktree) {\n parts.push(this.symbols.git_worktree);\n }\n }\n\n if (config?.showOperation && gitInfo.operation) {\n parts.push(`[${gitInfo.operation}]`);\n }\n\n parts.push(`${this.symbols.branch} ${gitInfo.branch}`);\n\n if (config?.showTag && gitInfo.tag) {\n parts.push(`${this.symbols.git_tag} ${gitInfo.tag}`);\n }\n\n if (config?.showSha && gitInfo.sha) {\n parts.push(`${this.symbols.git_sha} ${gitInfo.sha}`);\n }\n\n if (config?.showAheadBehind !== false) {\n if (gitInfo.ahead > 0 && gitInfo.behind > 0) {\n parts.push(\n `${this.symbols.git_ahead}${gitInfo.ahead}${this.symbols.git_behind}${gitInfo.behind}`\n );\n } else if (gitInfo.ahead > 0) {\n parts.push(`${this.symbols.git_ahead}${gitInfo.ahead}`);\n } else if (gitInfo.behind > 0) {\n parts.push(`${this.symbols.git_behind}${gitInfo.behind}`);\n }\n }\n\n if (config?.showWorkingTree) {\n const counts: string[] = [];\n if (gitInfo.staged && gitInfo.staged > 0)\n counts.push(`+${gitInfo.staged}`);\n if (gitInfo.unstaged && gitInfo.unstaged > 0)\n counts.push(`~${gitInfo.unstaged}`);\n if (gitInfo.untracked && gitInfo.untracked > 0)\n counts.push(`?${gitInfo.untracked}`);\n if (gitInfo.conflicts && gitInfo.conflicts > 0)\n counts.push(`!${gitInfo.conflicts}`);\n if (counts.length > 0) {\n parts.push(`(${counts.join(\" \")})`);\n }\n }\n\n if (config?.showUpstream && gitInfo.upstream) {\n parts.push(`${this.symbols.git_upstream}${gitInfo.upstream}`);\n }\n\n if (\n config?.showStashCount &&\n gitInfo.stashCount &&\n gitInfo.stashCount > 0\n ) {\n parts.push(`${this.symbols.git_stash} ${gitInfo.stashCount}`);\n }\n\n if (config?.showTimeSinceCommit && gitInfo.timeSinceCommit !== undefined) {\n const time = this.formatTimeSince(gitInfo.timeSinceCommit);\n parts.push(`${this.symbols.git_time} ${time}`);\n }\n\n let gitStatusIcon = this.symbols.git_clean;\n if (gitInfo.status === \"conflicts\") {\n gitStatusIcon = this.symbols.git_conflicts;\n } else if (gitInfo.status === \"dirty\") {\n gitStatusIcon = this.symbols.git_dirty;\n }\n parts.push(gitStatusIcon);\n\n return {\n text: parts.join(\" \"),\n bgColor: colors.gitBg,\n fgColor: colors.gitFg,\n };\n }\n\n private formatTimeSince(seconds: number): string {\n if (seconds < 60) return `${seconds}s`;\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m`;\n if (seconds < 86400) return `${Math.floor(seconds / 3600)}h`;\n if (seconds < 604800) return `${Math.floor(seconds / 86400)}d`;\n return `${Math.floor(seconds / 604800)}w`;\n }\n\n renderModel(hookData: ClaudeHookData, colors: PowerlineColors): SegmentData {\n const modelName = hookData.model?.display_name || \"Claude\";\n\n return {\n text: `${this.symbols.model} ${modelName}`,\n bgColor: colors.modelBg,\n fgColor: colors.modelFg,\n };\n }\n\n renderSession(\n usageInfo: UsageInfo,\n colors: PowerlineColors,\n type = \"cost\"\n ): SegmentData {\n const sessionBudget = this.config.budget?.session;\n const text = `${this.symbols.session_cost} ${this.formatUsageWithBudget(\n usageInfo.session.cost,\n usageInfo.session.tokens,\n usageInfo.session.tokenBreakdown,\n type,\n sessionBudget?.amount,\n sessionBudget?.warningThreshold || 80\n )}`;\n\n return {\n text,\n bgColor: colors.sessionBg,\n fgColor: colors.sessionFg,\n };\n }\n\n renderTmux(\n sessionId: string | null,\n colors: PowerlineColors\n ): SegmentData | null {\n if (!sessionId) {\n return {\n text: `tmux:none`,\n bgColor: colors.tmuxBg,\n fgColor: colors.tmuxFg,\n };\n }\n\n return {\n text: `tmux:${sessionId}`,\n bgColor: colors.tmuxBg,\n fgColor: colors.tmuxFg,\n };\n }\n\n renderContext(\n contextInfo: ContextInfo | null,\n colors: PowerlineColors\n ): SegmentData | null {\n if (!contextInfo) {\n return {\n text: `${this.symbols.context_time} 0 (100%)`,\n bgColor: colors.contextBg,\n fgColor: colors.contextFg,\n };\n }\n\n const tokenDisplay = contextInfo.inputTokens.toLocaleString();\n\n const contextLeft = `${contextInfo.contextLeftPercentage}%`;\n\n return {\n text: `${this.symbols.context_time} ${tokenDisplay} (${contextLeft})`,\n bgColor: colors.contextBg,\n fgColor: colors.contextFg,\n };\n }\n\n renderMetrics(\n metricsInfo: MetricsInfo | null,\n colors: PowerlineColors,\n _blockInfo: BlockInfo | null,\n config?: MetricsSegmentConfig\n ): SegmentData | null {\n if (!metricsInfo) {\n return {\n text: `${this.symbols.metrics_response} new`,\n bgColor: colors.metricsBg,\n fgColor: colors.metricsFg,\n };\n }\n\n const parts: string[] = [];\n\n if (config?.showLastResponseTime) {\n const lastResponseTime =\n metricsInfo.lastResponseTime === null\n ? \"0.0s\"\n : metricsInfo.lastResponseTime < 60\n ? `${metricsInfo.lastResponseTime.toFixed(1)}s`\n : `${(metricsInfo.lastResponseTime / 60).toFixed(1)}m`;\n parts.push(`${this.symbols.metrics_last_response} ${lastResponseTime}`);\n }\n\n if (\n config?.showResponseTime !== false &&\n metricsInfo.responseTime !== null\n ) {\n const responseTime =\n metricsInfo.responseTime < 60\n ? `${metricsInfo.responseTime.toFixed(1)}s`\n : `${(metricsInfo.responseTime / 60).toFixed(1)}m`;\n parts.push(`${this.symbols.metrics_response} ${responseTime}`);\n }\n\n if (\n config?.showDuration !== false &&\n metricsInfo.sessionDuration !== null\n ) {\n const duration = this.formatDuration(metricsInfo.sessionDuration);\n parts.push(`${this.symbols.metrics_duration} ${duration}`);\n }\n\n if (\n config?.showMessageCount !== false &&\n metricsInfo.messageCount !== null\n ) {\n parts.push(\n `${this.symbols.metrics_messages} ${metricsInfo.messageCount}`\n );\n }\n\n if (parts.length === 0) {\n return {\n text: `${this.symbols.metrics_response} active`,\n bgColor: colors.metricsBg,\n fgColor: colors.metricsFg,\n };\n }\n\n return {\n text: parts.join(\" \"),\n bgColor: colors.metricsBg,\n fgColor: colors.metricsFg,\n };\n }\n\n renderBlock(\n blockInfo: BlockInfo,\n colors: PowerlineColors,\n config?: BlockSegmentConfig\n ): SegmentData {\n let displayText: string;\n\n if (blockInfo.cost === null && blockInfo.tokens === null) {\n displayText = \"No active block\";\n } else {\n const type = config?.type || \"cost\";\n const burnType = config?.burnType;\n\n const timeStr =\n blockInfo.timeRemaining !== null\n ? (() => {\n const hours = Math.floor(blockInfo.timeRemaining / 60);\n const minutes = blockInfo.timeRemaining % 60;\n return hours > 0 ? `${hours}h ${minutes}m` : `${minutes}m`;\n })()\n : null;\n\n let mainContent: string;\n switch (type) {\n case \"cost\":\n mainContent = formatCost(blockInfo.cost);\n break;\n case \"tokens\":\n mainContent = formatTokens(blockInfo.tokens);\n break;\n case \"both\":\n mainContent = `${formatCost(blockInfo.cost)} / ${formatTokens(blockInfo.tokens)}`;\n break;\n case \"time\":\n mainContent = timeStr || \"N/A\";\n break;\n default:\n mainContent = formatCost(blockInfo.cost);\n }\n\n let burnContent = \"\";\n if (burnType && burnType !== \"none\") {\n switch (burnType) {\n case \"cost\":\n const costBurnRate =\n blockInfo.burnRate !== null\n ? blockInfo.burnRate < 1\n ? `${(blockInfo.burnRate * 100).toFixed(0)}¢/h`\n : `$${blockInfo.burnRate.toFixed(2)}/h`\n : \"N/A\";\n burnContent = ` | ${costBurnRate}`;\n break;\n case \"tokens\":\n const tokenBurnRate =\n blockInfo.tokenBurnRate !== null\n ? `${formatTokens(Math.round(blockInfo.tokenBurnRate))}/h`\n : \"N/A\";\n burnContent = ` | ${tokenBurnRate}`;\n break;\n case \"both\":\n const costBurn =\n blockInfo.burnRate !== null\n ? blockInfo.burnRate < 1\n ? `${(blockInfo.burnRate * 100).toFixed(0)}¢/h`\n : `$${blockInfo.burnRate.toFixed(2)}/h`\n : \"N/A\";\n const tokenBurn =\n blockInfo.tokenBurnRate !== null\n ? `${formatTokens(Math.round(blockInfo.tokenBurnRate))}/h`\n : \"N/A\";\n burnContent = ` | ${costBurn} / ${tokenBurn}`;\n break;\n }\n }\n\n if (type === \"time\") {\n displayText = mainContent;\n } else {\n displayText = timeStr\n ? `${mainContent}${burnContent} (${timeStr} left)`\n : `${mainContent}${burnContent}`;\n }\n }\n\n return {\n text: `${this.symbols.block_cost} ${displayText}`,\n bgColor: colors.blockBg,\n fgColor: colors.blockFg,\n };\n }\n\n renderToday(\n todayInfo: TodayInfo,\n colors: PowerlineColors,\n type = \"cost\"\n ): SegmentData {\n const todayBudget = this.config.budget?.today;\n const text = `${this.symbols.today_cost} ${this.formatUsageWithBudget(\n todayInfo.cost,\n todayInfo.tokens,\n todayInfo.tokenBreakdown,\n type,\n todayBudget?.amount,\n todayBudget?.warningThreshold\n )}`;\n\n return {\n text,\n bgColor: colors.todayBg,\n fgColor: colors.todayFg,\n };\n }\n\n private formatDuration(seconds: number): string {\n if (seconds < 60) {\n return `${seconds.toFixed(0)}s`;\n } else if (seconds < 3600) {\n return `${(seconds / 60).toFixed(0)}m`;\n } else if (seconds < 86400) {\n return `${(seconds / 3600).toFixed(1)}h`;\n } else {\n return `${(seconds / 86400).toFixed(1)}d`;\n }\n }\n\n private getDisplayDirectoryName(\n currentDir: string,\n projectDir?: string\n ): string {\n if (currentDir.startsWith(\"~\")) {\n return currentDir;\n }\n\n if (projectDir && projectDir !== currentDir) {\n if (currentDir.startsWith(projectDir)) {\n const relativePath = currentDir.slice(projectDir.length + 1);\n return relativePath || path.basename(projectDir) || \"project\";\n }\n return path.basename(currentDir) || \"root\";\n }\n\n return path.basename(currentDir) || \"root\";\n }\n\n private formatUsageDisplay(\n cost: number | null,\n tokens: number | null,\n tokenBreakdown: TokenBreakdown | null,\n type: string\n ): string {\n switch (type) {\n case \"cost\":\n return formatCost(cost);\n case \"tokens\":\n return formatTokens(tokens);\n case \"both\":\n return `${formatCost(cost)} (${formatTokens(tokens)})`;\n case \"breakdown\":\n return formatTokenBreakdown(tokenBreakdown);\n default:\n return formatCost(cost);\n }\n }\n\n private formatUsageWithBudget(\n cost: number | null,\n tokens: number | null,\n tokenBreakdown: TokenBreakdown | null,\n type: string,\n budget: number | undefined,\n warningThreshold = 80\n ): string {\n const baseDisplay = this.formatUsageDisplay(\n cost,\n tokens,\n tokenBreakdown,\n type\n );\n\n if (budget && budget > 0 && cost !== null) {\n const budgetStatus = getBudgetStatus(cost, budget, warningThreshold);\n return baseDisplay + budgetStatus.displayText;\n }\n\n return baseDisplay;\n }\n\n renderVersion(\n versionInfo: VersionInfo | null,\n colors: PowerlineColors,\n _config?: VersionSegmentConfig\n ): SegmentData | null {\n if (!versionInfo || !versionInfo.version) {\n return null;\n }\n\n return {\n text: `${this.symbols.version} ${versionInfo.version}`,\n bgColor: colors.versionBg,\n fgColor: colors.versionFg,\n };\n }\n}\n","import { debug } from \"../utils/logger\";\nimport { PricingService } from \"./pricing\";\nimport { loadEntriesFromProjects, type ParsedEntry } from \"../utils/claude\";\n\nexport interface UsageEntry {\n timestamp: Date;\n usage: {\n inputTokens: number;\n outputTokens: number;\n cacheCreationInputTokens: number;\n cacheReadInputTokens: number;\n };\n costUSD: number;\n model: string;\n}\n\nexport interface BlockInfo {\n cost: number | null;\n tokens: number | null;\n timeRemaining: number | null;\n burnRate: number | null;\n tokenBurnRate: number | null;\n}\n\nfunction convertToUsageEntry(entry: ParsedEntry): UsageEntry {\n return {\n timestamp: entry.timestamp,\n usage: {\n inputTokens: entry.message?.usage?.input_tokens || 0,\n outputTokens: entry.message?.usage?.output_tokens || 0,\n cacheCreationInputTokens:\n entry.message?.usage?.cache_creation_input_tokens || 0,\n cacheReadInputTokens: entry.message?.usage?.cache_read_input_tokens || 0,\n },\n costUSD: entry.costUSD || 0,\n model: entry.message?.model || \"unknown\",\n };\n}\n\nexport class BlockProvider {\n private readonly sessionDurationHours = 5;\n\n private floorToHour(timestamp: Date): Date {\n const floored = new Date(timestamp);\n floored.setUTCMinutes(0, 0, 0);\n return floored;\n }\n\n private identifySessionBlocks(entries: UsageEntry[]): UsageEntry[][] {\n if (entries.length === 0) return [];\n\n const sessionDurationMs = this.sessionDurationHours * 60 * 60 * 1000;\n const blocks: UsageEntry[][] = [];\n const sortedEntries = [...entries].sort(\n (a, b) => a.timestamp.getTime() - b.timestamp.getTime()\n );\n\n let currentBlockStart: Date | null = null;\n let currentBlockEntries: UsageEntry[] = [];\n\n for (const entry of sortedEntries) {\n const entryTime = entry.timestamp;\n\n if (currentBlockStart == null) {\n currentBlockStart = this.floorToHour(entryTime);\n currentBlockEntries = [entry];\n } else {\n const timeSinceBlockStart =\n entryTime.getTime() - currentBlockStart.getTime();\n const lastEntry = currentBlockEntries[currentBlockEntries.length - 1];\n if (lastEntry == null) {\n continue;\n }\n const lastEntryTime = lastEntry.timestamp;\n const timeSinceLastEntry =\n entryTime.getTime() - lastEntryTime.getTime();\n\n if (\n timeSinceBlockStart > sessionDurationMs ||\n timeSinceLastEntry > sessionDurationMs\n ) {\n blocks.push(currentBlockEntries);\n\n currentBlockStart = this.floorToHour(entryTime);\n currentBlockEntries = [entry];\n } else {\n currentBlockEntries.push(entry);\n }\n }\n }\n\n if (currentBlockStart != null && currentBlockEntries.length > 0) {\n blocks.push(currentBlockEntries);\n }\n\n return blocks;\n }\n\n private createBlockInfo(\n startTime: Date,\n entries: UsageEntry[]\n ): { block: UsageEntry[]; isActive: boolean } {\n const now = new Date();\n const sessionDurationMs = this.sessionDurationHours * 60 * 60 * 1000;\n const endTime = new Date(startTime.getTime() + sessionDurationMs);\n const lastEntry = entries[entries.length - 1];\n const actualEndTime = lastEntry != null ? lastEntry.timestamp : startTime;\n\n const isActive =\n now.getTime() - actualEndTime.getTime() < sessionDurationMs &&\n now < endTime;\n\n return { block: entries, isActive };\n }\n\n private findActiveBlock(blocks: UsageEntry[][]): UsageEntry[] | null {\n for (let i = blocks.length - 1; i >= 0; i--) {\n const block = blocks[i];\n if (!block || block.length === 0) continue;\n\n const firstEntry = block[0];\n if (!firstEntry) continue;\n\n const blockStartTime = this.floorToHour(firstEntry.timestamp);\n const blockInfo = this.createBlockInfo(blockStartTime, block);\n\n if (blockInfo.isActive) {\n return blockInfo.block;\n }\n }\n\n return null;\n }\n\n private async loadUsageEntries(): Promise<UsageEntry[]> {\n debug(`Block segment: Loading entries for dynamic session blocks`);\n\n const dayAgo = new Date();\n dayAgo.setDate(dayAgo.getDate() - 1);\n\n const fileFilter = (_filePath: string, modTime: Date): boolean => {\n return modTime >= dayAgo;\n };\n\n const parsedEntries = await loadEntriesFromProjects(\n undefined,\n fileFilter,\n true\n );\n\n const allUsageEntries: UsageEntry[] = [];\n\n for (const entry of parsedEntries) {\n if (entry.message?.usage) {\n const usageEntry = convertToUsageEntry(entry);\n\n if (!usageEntry.costUSD && entry.raw) {\n usageEntry.costUSD = await PricingService.calculateCostForEntry(\n entry.raw\n );\n }\n\n allUsageEntries.push(usageEntry);\n }\n }\n\n const sessionBlocks = this.identifySessionBlocks(allUsageEntries);\n debug(`Block segment: Found ${sessionBlocks.length} session blocks`);\n\n const activeBlock = this.findActiveBlock(sessionBlocks);\n\n if (activeBlock && activeBlock.length > 0) {\n debug(\n `Block segment: Found active block with ${activeBlock.length} entries`\n );\n const blockStart = activeBlock[0];\n const blockEnd = activeBlock[activeBlock.length - 1];\n if (blockStart && blockEnd) {\n debug(\n `Block segment: Active block from ${blockStart.timestamp.toISOString()} to ${blockEnd.timestamp.toISOString()}`\n );\n }\n return activeBlock;\n } else {\n debug(`Block segment: No active block found`);\n return [];\n }\n }\n\n async getActiveBlockInfo(): Promise<BlockInfo> {\n try {\n const entries = await this.loadUsageEntries();\n\n if (entries.length === 0) {\n debug(\"Block segment: No entries in current block\");\n return {\n cost: null,\n tokens: null,\n timeRemaining: null,\n burnRate: null,\n tokenBurnRate: null,\n };\n }\n\n const totalCost = entries.reduce((sum, entry) => sum + entry.costUSD, 0);\n const totalTokens = entries.reduce((sum, entry) => {\n return (\n sum +\n entry.usage.inputTokens +\n entry.usage.outputTokens +\n entry.usage.cacheCreationInputTokens +\n entry.usage.cacheReadInputTokens\n );\n }, 0);\n\n const now = new Date();\n let timeRemaining: number | null = null;\n\n if (entries.length > 0) {\n const firstEntry = entries[0];\n if (firstEntry) {\n const sessionDurationMs = this.sessionDurationHours * 60 * 60 * 1000;\n const blockStartTime = this.floorToHour(firstEntry.timestamp);\n const sessionEndTime = new Date(\n blockStartTime.getTime() + sessionDurationMs\n );\n\n timeRemaining = Math.max(\n 0,\n Math.round((sessionEndTime.getTime() - now.getTime()) / (1000 * 60))\n );\n }\n }\n\n let burnRate: number | null = null;\n let tokenBurnRate: number | null = null;\n\n if (entries.length >= 1 && (totalCost > 0 || totalTokens > 0)) {\n const timestamps = entries\n .map((entry) => entry.timestamp)\n .sort((a, b) => a.getTime() - b.getTime());\n const firstEntry = timestamps[0];\n const lastEntry = timestamps[timestamps.length - 1];\n\n if (firstEntry && lastEntry) {\n const durationMinutes =\n (lastEntry.getTime() - firstEntry.getTime()) / (1000 * 60);\n\n if (durationMinutes > 0) {\n if (totalCost > 0) {\n burnRate = (totalCost / durationMinutes) * 60;\n }\n if (totalTokens > 0) {\n tokenBurnRate = (totalTokens / durationMinutes) * 60;\n }\n }\n }\n }\n\n debug(\n `Block segment: $${totalCost.toFixed(2)}, ${totalTokens} tokens, ${timeRemaining}m remaining, burn rate: ${burnRate ? \"$\" + burnRate.toFixed(2) + \"/hr\" : \"N/A\"}`\n );\n\n return {\n cost: totalCost,\n tokens: totalTokens,\n timeRemaining,\n burnRate,\n tokenBurnRate,\n };\n } catch (error) {\n debug(\"Error getting active block info:\", error);\n return {\n cost: null,\n tokens: null,\n timeRemaining: null,\n burnRate: null,\n tokenBurnRate: null,\n };\n }\n }\n}\n","import { debug } from \"../utils/logger\";\nimport { PricingService } from \"./pricing\";\nimport { loadEntriesFromProjects, type ParsedEntry } from \"../utils/claude\";\nimport type { TokenBreakdown } from \"./session\";\n\nexport interface TodayUsageEntry {\n timestamp: Date;\n usage: {\n inputTokens: number;\n outputTokens: number;\n cacheCreationInputTokens: number;\n cacheReadInputTokens: number;\n };\n costUSD: number;\n model: string;\n}\n\nexport interface TodayInfo {\n cost: number | null;\n tokens: number | null;\n tokenBreakdown: TokenBreakdown | null;\n date: string;\n}\n\nfunction formatDate(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n}\n\nfunction getTotalTokens(usage: TodayUsageEntry[\"usage\"]): number {\n return (\n usage.inputTokens +\n usage.outputTokens +\n usage.cacheCreationInputTokens +\n usage.cacheReadInputTokens\n );\n}\n\nfunction convertToTodayEntry(entry: ParsedEntry): TodayUsageEntry {\n return {\n timestamp: entry.timestamp,\n usage: {\n inputTokens: entry.message?.usage?.input_tokens || 0,\n outputTokens: entry.message?.usage?.output_tokens || 0,\n cacheCreationInputTokens:\n entry.message?.usage?.cache_creation_input_tokens || 0,\n cacheReadInputTokens: entry.message?.usage?.cache_read_input_tokens || 0,\n },\n costUSD: entry.costUSD || 0,\n model: entry.message?.model || \"unknown\",\n };\n}\n\nexport class TodayProvider {\n private cache: Map<string, { data: TodayUsageEntry[]; timestamp: number }> =\n new Map();\n private readonly CACHE_TTL = 300000;\n\n private async loadTodayEntries(): Promise<TodayUsageEntry[]> {\n const today = new Date();\n const todayDateString = formatDate(today);\n\n debug(`Today segment: Loading entries for date ${todayDateString}`);\n\n const weekAgo = new Date();\n weekAgo.setDate(weekAgo.getDate() - 7);\n\n const fileFilter = (_filePath: string, modTime: Date): boolean => {\n return modTime >= weekAgo;\n };\n\n const parsedEntries = await loadEntriesFromProjects(\n undefined,\n fileFilter,\n true\n );\n const todayEntries: TodayUsageEntry[] = [];\n\n let entriesFound = 0;\n\n for (const entry of parsedEntries) {\n const entryDateString = formatDate(entry.timestamp);\n\n if (entryDateString === todayDateString && entry.message?.usage) {\n const todayEntry = convertToTodayEntry(entry);\n\n if (!todayEntry.costUSD && entry.raw) {\n todayEntry.costUSD = await PricingService.calculateCostForEntry(\n entry.raw\n );\n }\n\n todayEntries.push(todayEntry);\n entriesFound++;\n }\n }\n\n debug(\n `Today segment: Found ${entriesFound} entries for today (${todayDateString})`\n );\n return todayEntries;\n }\n\n private async getTodayEntries(): Promise<TodayUsageEntry[]> {\n const cacheKey = \"today\";\n const cached = this.cache.get(cacheKey);\n const now = Date.now();\n\n if (cached && now - cached.timestamp < this.CACHE_TTL) {\n return cached.data;\n }\n\n this.cache.clear();\n\n try {\n const entries = await this.loadTodayEntries();\n\n this.cache.set(cacheKey, { data: entries, timestamp: now });\n return entries;\n } catch (error) {\n debug(\"Error loading today's entries:\", error);\n return [];\n }\n }\n\n async getTodayInfo(): Promise<TodayInfo> {\n try {\n const entries = await this.getTodayEntries();\n\n if (entries.length === 0) {\n return {\n cost: null,\n tokens: null,\n tokenBreakdown: null,\n date: formatDate(new Date()),\n };\n }\n\n const totalCost = entries.reduce((sum, entry) => sum + entry.costUSD, 0);\n const totalTokens = entries.reduce(\n (sum, entry) => sum + getTotalTokens(entry.usage),\n 0\n );\n\n const tokenBreakdown = entries.reduce(\n (breakdown, entry) => ({\n input: breakdown.input + entry.usage.inputTokens,\n output: breakdown.output + entry.usage.outputTokens,\n cacheCreation:\n breakdown.cacheCreation + entry.usage.cacheCreationInputTokens,\n cacheRead: breakdown.cacheRead + entry.usage.cacheReadInputTokens,\n }),\n {\n input: 0,\n output: 0,\n cacheCreation: 0,\n cacheRead: 0,\n }\n );\n\n debug(\n `Today segment: $${totalCost.toFixed(2)}, ${totalTokens} tokens total`\n );\n\n return {\n cost: totalCost,\n tokens: totalTokens,\n tokenBreakdown,\n date: formatDate(new Date()),\n };\n } catch (error) {\n debug(\"Error getting today's info:\", error);\n return {\n cost: null,\n tokens: null,\n tokenBreakdown: null,\n date: formatDate(new Date()),\n };\n }\n }\n}\n","import type { ClaudeHookData } from \"./index\";\nimport type { PowerlineColors } from \"./themes\";\nimport type { PowerlineConfig, LineConfig } from \"./config/loader\";\nimport { hexToAnsi, extractBgToFg } from \"./utils/colors\";\nimport { getTheme } from \"./themes\";\nimport {\n UsageProvider,\n UsageInfo,\n ContextProvider,\n ContextInfo,\n GitService,\n TmuxService,\n MetricsProvider,\n MetricsInfo,\n VersionProvider,\n VersionInfo,\n SegmentRenderer,\n PowerlineSymbols,\n AnySegmentConfig,\n DirectorySegmentConfig,\n GitSegmentConfig,\n UsageSegmentConfig,\n MetricsSegmentConfig,\n BlockSegmentConfig,\n TodaySegmentConfig,\n VersionSegmentConfig,\n} from \"./segments\";\nimport { BlockProvider, BlockInfo } from \"./segments/block\";\nimport { TodayProvider, TodayInfo } from \"./segments/today\";\n\nexport class PowerlineRenderer {\n private readonly symbols: PowerlineSymbols;\n private readonly usageProvider: UsageProvider;\n private readonly blockProvider: BlockProvider;\n private readonly todayProvider: TodayProvider;\n private readonly contextProvider: ContextProvider;\n private readonly gitService: GitService;\n private readonly tmuxService: TmuxService;\n private readonly metricsProvider: MetricsProvider;\n private readonly versionProvider: VersionProvider;\n private readonly segmentRenderer: SegmentRenderer;\n\n constructor(private readonly config: PowerlineConfig) {\n this.symbols = this.initializeSymbols();\n this.usageProvider = new UsageProvider();\n this.blockProvider = new BlockProvider();\n this.todayProvider = new TodayProvider();\n this.contextProvider = new ContextProvider();\n this.gitService = new GitService();\n this.tmuxService = new TmuxService();\n this.metricsProvider = new MetricsProvider();\n this.versionProvider = new VersionProvider();\n this.segmentRenderer = new SegmentRenderer(config, this.symbols);\n }\n\n private needsUsageInfo(): boolean {\n return this.config.display.lines.some(\n (line) => line.segments.session?.enabled\n );\n }\n\n private needsGitInfo(): boolean {\n return this.config.display.lines.some((line) => line.segments.git?.enabled);\n }\n\n private needsTmuxInfo(): boolean {\n return this.config.display.lines.some(\n (line) => line.segments.tmux?.enabled\n );\n }\n\n private needsContextInfo(): boolean {\n return this.config.display.lines.some(\n (line) => line.segments.context?.enabled\n );\n }\n\n private needsMetricsInfo(): boolean {\n return this.config.display.lines.some(\n (line) => line.segments.metrics?.enabled\n );\n }\n\n private needsBlockInfo(): boolean {\n return this.config.display.lines.some(\n (line) => line.segments.block?.enabled\n );\n }\n\n private needsTodayInfo(): boolean {\n return this.config.display.lines.some(\n (line) => line.segments.today?.enabled\n );\n }\n\n private needsVersionInfo(): boolean {\n return this.config.display.lines.some(\n (line) => line.segments.version?.enabled\n );\n }\n\n async generateStatusline(hookData: ClaudeHookData): Promise<string> {\n const usageInfo = this.needsUsageInfo()\n ? await this.usageProvider.getUsageInfo(hookData.session_id)\n : null;\n\n const blockInfo = this.needsBlockInfo()\n ? await this.blockProvider.getActiveBlockInfo()\n : null;\n\n const todayInfo = this.needsTodayInfo()\n ? await this.todayProvider.getTodayInfo()\n : null;\n\n const contextInfo = this.needsContextInfo()\n ? await this.contextProvider.calculateContextTokens(\n hookData.transcript_path,\n hookData.model?.id\n )\n : null;\n\n const metricsInfo = this.needsMetricsInfo()\n ? await this.metricsProvider.getMetricsInfo(hookData.session_id)\n : null;\n\n const versionInfo = this.needsVersionInfo()\n ? await this.versionProvider.getVersionInfo()\n : null;\n\n const lines = this.config.display.lines\n .map((lineConfig) =>\n this.renderLine(\n lineConfig,\n hookData,\n usageInfo,\n blockInfo,\n todayInfo,\n contextInfo,\n metricsInfo,\n versionInfo\n )\n )\n .filter((line) => line.length > 0);\n\n return lines.join(\"\\n\");\n }\n\n private renderLine(\n lineConfig: LineConfig,\n hookData: ClaudeHookData,\n usageInfo: UsageInfo | null,\n blockInfo: BlockInfo | null,\n todayInfo: TodayInfo | null,\n contextInfo: ContextInfo | null,\n metricsInfo: MetricsInfo | null,\n versionInfo: VersionInfo | null\n ): string {\n const colors = this.getThemeColors();\n const currentDir = hookData.workspace?.current_dir || hookData.cwd || \"/\";\n\n const segments = Object.entries(lineConfig.segments)\n .filter(\n ([_, config]: [string, AnySegmentConfig | undefined]) => config?.enabled\n )\n .map(([type, config]: [string, AnySegmentConfig]) => ({ type, config }));\n\n let line = colors.reset;\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n if (!segment) continue;\n\n const isLast = i === segments.length - 1;\n const nextSegment = !isLast ? segments[i + 1] : null;\n const nextBgColor = nextSegment\n ? this.getSegmentBgColor(nextSegment.type, colors)\n : \"\";\n\n const segmentData = this.renderSegment(\n segment,\n hookData,\n usageInfo,\n blockInfo,\n todayInfo,\n contextInfo,\n metricsInfo,\n versionInfo,\n colors,\n currentDir\n );\n\n if (segmentData) {\n line += this.formatSegment(\n segmentData.bgColor,\n segmentData.fgColor,\n segmentData.text,\n isLast ? undefined : nextBgColor\n );\n }\n }\n\n return line;\n }\n\n private renderSegment(\n segment: { type: string; config: AnySegmentConfig },\n hookData: ClaudeHookData,\n usageInfo: UsageInfo | null,\n blockInfo: BlockInfo | null,\n todayInfo: TodayInfo | null,\n contextInfo: ContextInfo | null,\n metricsInfo: MetricsInfo | null,\n versionInfo: VersionInfo | null,\n colors: PowerlineColors,\n currentDir: string\n ) {\n switch (segment.type) {\n case \"directory\":\n return this.segmentRenderer.renderDirectory(\n hookData,\n colors,\n segment.config as DirectorySegmentConfig\n );\n\n case \"git\":\n if (!this.needsGitInfo()) return null;\n const gitConfig = segment.config as GitSegmentConfig;\n const gitInfo = this.gitService.getGitInfo(\n currentDir,\n {\n showSha: gitConfig?.showSha,\n showWorkingTree: gitConfig?.showWorkingTree,\n showOperation: gitConfig?.showOperation,\n showTag: gitConfig?.showTag,\n showTimeSinceCommit: gitConfig?.showTimeSinceCommit,\n showStashCount: gitConfig?.showStashCount,\n showUpstream: gitConfig?.showUpstream,\n showRepoName: gitConfig?.showRepoName,\n },\n hookData.workspace?.project_dir\n );\n return gitInfo\n ? this.segmentRenderer.renderGit(gitInfo, colors, gitConfig)\n : null;\n\n case \"model\":\n return this.segmentRenderer.renderModel(hookData, colors);\n\n case \"session\":\n if (!usageInfo) return null;\n const usageType =\n (segment.config as UsageSegmentConfig)?.type || \"cost\";\n return this.segmentRenderer.renderSession(usageInfo, colors, usageType);\n\n case \"tmux\":\n if (!this.needsTmuxInfo()) return null;\n const tmuxSessionId = this.tmuxService.getSessionId();\n return this.segmentRenderer.renderTmux(tmuxSessionId, colors);\n\n case \"context\":\n if (!this.needsContextInfo()) return null;\n return this.segmentRenderer.renderContext(contextInfo, colors);\n\n case \"metrics\":\n const metricsConfig = segment.config as MetricsSegmentConfig;\n return this.segmentRenderer.renderMetrics(\n metricsInfo,\n colors,\n blockInfo,\n metricsConfig\n );\n\n case \"block\":\n if (!blockInfo) return null;\n const blockConfig = segment.config as BlockSegmentConfig;\n return this.segmentRenderer.renderBlock(blockInfo, colors, blockConfig);\n\n case \"today\":\n if (!todayInfo) return null;\n const todayType =\n (segment.config as TodaySegmentConfig)?.type || \"cost\";\n return this.segmentRenderer.renderToday(todayInfo, colors, todayType);\n\n case \"version\":\n if (!versionInfo) return null;\n const versionConfig = segment.config as VersionSegmentConfig;\n return this.segmentRenderer.renderVersion(\n versionInfo,\n colors,\n versionConfig\n );\n\n default:\n return null;\n }\n }\n\n private initializeSymbols(): PowerlineSymbols {\n const isMinimalStyle = this.config.display.style === \"minimal\";\n\n return {\n right: isMinimalStyle ? \"\" : \"\\uE0B0\",\n branch: \"⎇\",\n model: \"⚡\",\n git_clean: \"✓\",\n git_dirty: \"●\",\n git_conflicts: \"⚠\",\n git_ahead: \"↑\",\n git_behind: \"↓\",\n git_worktree: \"⧉\",\n git_tag: \"⌂\",\n git_sha: \"♯\",\n git_upstream: \"→\",\n git_stash: \"⧇\",\n git_time: \"◷\",\n session_cost: \"§\",\n block_cost: \"◱\",\n today_cost: \"☉\",\n context_time: \"◔\",\n metrics_response: \"⧖\",\n metrics_last_response: \"Δ\",\n metrics_duration: \"⧗\",\n metrics_messages: \"⟐\",\n metrics_burn: \"⟢\",\n version: \"◈\",\n };\n }\n\n private getThemeColors(): PowerlineColors {\n const theme = this.config.theme;\n let colorTheme;\n\n if (theme === \"custom\") {\n colorTheme = this.config.colors?.custom;\n if (!colorTheme) {\n throw new Error(\n \"Custom theme selected but no colors provided in configuration\"\n );\n }\n } else {\n colorTheme = getTheme(theme);\n if (!colorTheme) {\n console.warn(\n `Built-in theme '${theme}' not found, falling back to 'dark' theme`\n );\n colorTheme = getTheme(\"dark\")!;\n }\n }\n\n const fallbackTheme = getTheme(\"dark\")!;\n\n return {\n reset: \"\\x1b[0m\",\n modeBg: hexToAnsi(\n colorTheme.directory?.bg || fallbackTheme.directory.bg,\n true\n ),\n modeFg: hexToAnsi(\n colorTheme.directory?.fg || fallbackTheme.directory.fg,\n false\n ),\n gitBg: hexToAnsi(colorTheme.git?.bg || fallbackTheme.git.bg, true),\n gitFg: hexToAnsi(colorTheme.git?.fg || fallbackTheme.git.fg, false),\n modelBg: hexToAnsi(colorTheme.model?.bg || fallbackTheme.model.bg, true),\n modelFg: hexToAnsi(colorTheme.model?.fg || fallbackTheme.model.fg, false),\n sessionBg: hexToAnsi(\n colorTheme.session?.bg || fallbackTheme.session.bg,\n true\n ),\n sessionFg: hexToAnsi(\n colorTheme.session?.fg || fallbackTheme.session.fg,\n false\n ),\n blockBg: hexToAnsi(colorTheme.block?.bg || fallbackTheme.block.bg, true),\n blockFg: hexToAnsi(colorTheme.block?.fg || fallbackTheme.block.fg, false),\n todayBg: hexToAnsi(colorTheme.today?.bg || fallbackTheme.today.bg, true),\n todayFg: hexToAnsi(colorTheme.today?.fg || fallbackTheme.today.fg, false),\n tmuxBg: hexToAnsi(colorTheme.tmux?.bg || fallbackTheme.tmux.bg, true),\n tmuxFg: hexToAnsi(colorTheme.tmux?.fg || fallbackTheme.tmux.fg, false),\n contextBg: hexToAnsi(\n colorTheme.context?.bg || fallbackTheme.context.bg,\n true\n ),\n contextFg: hexToAnsi(\n colorTheme.context?.fg || fallbackTheme.context.fg,\n false\n ),\n metricsBg: hexToAnsi(\n colorTheme.metrics?.bg || fallbackTheme.metrics.bg,\n true\n ),\n metricsFg: hexToAnsi(\n colorTheme.metrics?.fg || fallbackTheme.metrics.fg,\n false\n ),\n versionBg: hexToAnsi(\n colorTheme.version?.bg || fallbackTheme.version.bg,\n true\n ),\n versionFg: hexToAnsi(\n colorTheme.version?.fg || fallbackTheme.version.fg,\n false\n ),\n };\n }\n\n private getSegmentBgColor(\n segmentType: string,\n colors: PowerlineColors\n ): string {\n switch (segmentType) {\n case \"directory\":\n return colors.modeBg;\n case \"git\":\n return colors.gitBg;\n case \"model\":\n return colors.modelBg;\n case \"session\":\n return colors.sessionBg;\n case \"block\":\n return colors.blockBg;\n case \"today\":\n return colors.todayBg;\n case \"tmux\":\n return colors.tmuxBg;\n case \"context\":\n return colors.contextBg;\n case \"metrics\":\n return colors.metricsBg;\n case \"version\":\n return colors.versionBg;\n default:\n return colors.modeBg;\n }\n }\n\n private formatSegment(\n bgColor: string,\n fgColor: string,\n text: string,\n nextBgColor?: string\n ): string {\n let output = `${bgColor}${fgColor} ${text} `;\n\n const reset = \"\\x1b[0m\";\n\n if (nextBgColor) {\n const arrowFgColor = extractBgToFg(bgColor);\n output += `${reset}${nextBgColor}${arrowFgColor}${this.symbols.right}`;\n } else {\n output += `${reset}${extractBgToFg(bgColor)}${this.symbols.right}${reset}`;\n }\n\n return output;\n }\n}\n","import type { PowerlineConfig } from \"./loader\";\n\nexport const DEFAULT_CONFIG: PowerlineConfig = {\n theme: \"dark\",\n display: {\n style: \"minimal\",\n lines: [\n {\n segments: {\n directory: { \n enabled: true,\n showBasename: true\n },\n git: {\n enabled: true,\n showSha: false,\n showWorkingTree: false,\n showOperation: false,\n showTag: false,\n showTimeSinceCommit: false,\n showStashCount: false,\n showUpstream: false,\n showRepoName: false,\n },\n model: { enabled: true },\n session: { enabled: true, type: \"tokens\" },\n today: { enabled: false, type: \"cost\" },\n block: { enabled: true, type: \"cost\", burnType: \"cost\" },\n version: { enabled: false },\n tmux: { enabled: false },\n context: { enabled: true },\n metrics: { \n enabled: false,\n showResponseTime: true,\n showLastResponseTime: false,\n showDuration: true,\n showMessageCount: true,\n },\n },\n },\n ],\n },\n budget: {\n session: {\n warningThreshold: 80,\n },\n today: {\n warningThreshold: 80,\n amount: 50,\n },\n },\n};\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { DEFAULT_CONFIG } from \"./defaults\";\nimport type { ColorTheme } from \"../themes\";\nimport type {\n SegmentConfig,\n DirectorySegmentConfig,\n GitSegmentConfig,\n UsageSegmentConfig,\n TmuxSegmentConfig,\n ContextSegmentConfig,\n MetricsSegmentConfig,\n BlockSegmentConfig,\n TodaySegmentConfig,\n VersionSegmentConfig,\n} from \"../segments/renderer\";\n\nexport interface LineConfig {\n segments: {\n directory?: DirectorySegmentConfig;\n git?: GitSegmentConfig;\n model?: SegmentConfig;\n session?: UsageSegmentConfig;\n block?: BlockSegmentConfig;\n today?: TodaySegmentConfig;\n tmux?: TmuxSegmentConfig;\n context?: ContextSegmentConfig;\n metrics?: MetricsSegmentConfig;\n version?: VersionSegmentConfig;\n };\n}\n\nexport interface DisplayConfig {\n lines: LineConfig[];\n style?: \"minimal\" | \"powerline\";\n}\n\nexport interface BudgetItemConfig {\n amount?: number;\n warningThreshold?: number;\n}\n\nexport interface BudgetConfig {\n session?: BudgetItemConfig;\n today?: BudgetItemConfig;\n}\n\nexport interface PowerlineConfig {\n theme: \"light\" | \"dark\" | \"nord\" | \"tokyo-night\" | \"rose-pine\" | \"custom\";\n display: DisplayConfig;\n colors?: {\n custom: ColorTheme;\n };\n budget?: BudgetConfig;\n}\n\nfunction isValidTheme(theme: string): theme is PowerlineConfig[\"theme\"] {\n return [\n \"light\",\n \"dark\",\n \"nord\",\n \"tokyo-night\",\n \"rose-pine\",\n \"custom\",\n ].includes(theme);\n}\n\nfunction isValidStyle(style: string): style is \"minimal\" | \"powerline\" {\n return style === \"minimal\" || style === \"powerline\";\n}\n\nfunction deepMerge<T extends Record<string, any>>(\n target: T,\n source: Partial<T>\n): T {\n const result = { ...target };\n\n for (const key in source) {\n const sourceValue = source[key];\n if (sourceValue !== undefined) {\n if (\n typeof sourceValue === \"object\" &&\n sourceValue !== null &&\n !Array.isArray(sourceValue)\n ) {\n const targetValue = result[key] || {};\n result[key] = deepMerge(\n targetValue as Record<string, any>,\n sourceValue as Record<string, any>\n ) as T[Extract<keyof T, string>];\n } else {\n result[key] = sourceValue as T[Extract<keyof T, string>];\n }\n }\n }\n\n return result;\n}\n\nfunction findConfigFile(\n customPath?: string,\n projectDir?: string\n): string | null {\n if (customPath) {\n return fs.existsSync(customPath) ? customPath : null;\n }\n\n const locations = [\n ...(projectDir ? [path.join(projectDir, \".claude-powerline.json\")] : []),\n path.join(process.cwd(), \".claude-powerline.json\"),\n path.join(os.homedir(), \".claude\", \"claude-powerline.json\"),\n path.join(os.homedir(), \".config\", \"claude-powerline\", \"config.json\"),\n ];\n\n return locations.find(fs.existsSync) || null;\n}\n\nfunction loadConfigFile(filePath: string): Partial<PowerlineConfig> {\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n return JSON.parse(content);\n } catch (error) {\n throw new Error(\n `Failed to load config file ${filePath}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nfunction loadEnvConfig(): Partial<PowerlineConfig> {\n const config: Partial<PowerlineConfig> = {};\n const display: Partial<DisplayConfig> = {};\n\n const theme = process.env.CLAUDE_POWERLINE_THEME;\n if (theme && isValidTheme(theme)) {\n config.theme = theme;\n }\n\n const style = process.env.CLAUDE_POWERLINE_STYLE;\n if (style) {\n if (isValidStyle(style)) {\n display.style = style;\n } else {\n console.warn(\n `Invalid display style '${style}' from environment variable, falling back to 'minimal'`\n );\n display.style = \"minimal\";\n }\n }\n\n if (Object.keys(display).length > 0) {\n config.display = display as DisplayConfig;\n }\n\n return config;\n}\n\nfunction getConfigPathFromEnv(): string | undefined {\n return process.env.CLAUDE_POWERLINE_CONFIG;\n}\n\nfunction parseCLIOverrides(args: string[]): Partial<PowerlineConfig> {\n const config: Partial<PowerlineConfig> = {};\n const display: Partial<DisplayConfig> = {};\n\n const theme = args.find((arg) => arg.startsWith(\"--theme=\"))?.split(\"=\")[1];\n if (theme && isValidTheme(theme)) {\n config.theme = theme;\n }\n\n const style = args.find((arg) => arg.startsWith(\"--style=\"))?.split(\"=\")[1];\n if (style) {\n if (isValidStyle(style)) {\n display.style = style;\n } else {\n console.warn(\n `Invalid display style '${style}' from CLI argument, falling back to 'minimal'`\n );\n display.style = \"minimal\";\n }\n }\n\n if (Object.keys(display).length > 0) {\n config.display = display as DisplayConfig;\n }\n\n return config;\n}\n\nexport function loadConfig(\n args: string[] = process.argv,\n projectDir?: string\n): PowerlineConfig {\n let config: PowerlineConfig = JSON.parse(JSON.stringify(DEFAULT_CONFIG));\n\n const configPath =\n args.find((arg) => arg.startsWith(\"--config=\"))?.split(\"=\")[1] ||\n getConfigPathFromEnv();\n\n const configFile = findConfigFile(configPath, projectDir);\n if (configFile) {\n try {\n const fileConfig = loadConfigFile(configFile);\n config = deepMerge(config, fileConfig);\n } catch (err) {\n console.warn(\n `Warning: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n }\n\n if (config.display?.style && !isValidStyle(config.display.style)) {\n console.warn(\n `Invalid display style '${config.display.style}' in config file, falling back to 'minimal'`\n );\n config.display.style = \"minimal\";\n }\n\n if (config.theme && !isValidTheme(config.theme)) {\n console.warn(\n `Invalid theme '${config.theme}' in config file, falling back to 'dark'`\n );\n config.theme = \"dark\";\n }\n\n const envConfig = loadEnvConfig();\n config = deepMerge(config, envConfig);\n\n const cliOverrides = parseCLIOverrides(args);\n config = deepMerge(config, cliOverrides);\n\n return config;\n}\n\nexport const loadConfigFromCLI = loadConfig;\n","#!/usr/bin/env node\n\nimport process from \"node:process\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport os from \"node:os\";\nimport { json } from \"node:stream/consumers\";\nimport { PowerlineRenderer } from \"./powerline\";\nimport { loadConfigFromCLI } from \"./config/loader\";\nimport { debug } from \"./utils/logger\";\nexport interface ClaudeHookData {\n hook_event_name: string;\n session_id: string;\n transcript_path: string;\n cwd: string;\n model: {\n id: string;\n display_name: string;\n };\n workspace: {\n current_dir: string;\n project_dir: string;\n };\n}\n\nasync function installFonts(): Promise<void> {\n try {\n const platform = os.platform();\n let fontDir: string;\n\n if (platform === \"darwin\") {\n fontDir = path.join(os.homedir(), \"Library\", \"Fonts\");\n } else if (platform === \"linux\") {\n fontDir = path.join(os.homedir(), \".local\", \"share\", \"fonts\");\n } else if (platform === \"win32\") {\n fontDir = path.join(\n os.homedir(),\n \"AppData\",\n \"Local\",\n \"Microsoft\",\n \"Windows\",\n \"Fonts\"\n );\n } else {\n console.log(\"Unsupported platform for font installation\");\n return;\n }\n\n if (!fs.existsSync(fontDir)) {\n fs.mkdirSync(fontDir, { recursive: true });\n }\n\n console.log(\"📦 Installing Powerline Fonts...\");\n console.log(\"Downloading from https://github.com/powerline/fonts\");\n\n const tempDir = path.join(os.tmpdir(), \"powerline-fonts\");\n\n const cleanup = () => {\n if (fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n };\n\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n try {\n if (fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n\n console.log(\"Cloning powerline fonts repository...\");\n execSync(\n \"git clone --depth=1 https://github.com/powerline/fonts.git powerline-fonts\",\n {\n stdio: \"inherit\",\n cwd: os.tmpdir(),\n }\n );\n\n console.log(\"Installing fonts...\");\n const installScript = path.join(tempDir, \"install.sh\");\n\n if (fs.existsSync(installScript)) {\n fs.chmodSync(installScript, 0o755);\n execSync(\"./install.sh\", { stdio: \"inherit\", cwd: tempDir });\n } else {\n throw new Error(\n \"Install script not found in powerline fonts repository\"\n );\n }\n\n console.log(\"✅ Powerline fonts installation complete!\");\n console.log(\n \"Please restart your terminal and set your terminal font to a powerline font.\"\n );\n console.log(\n \"Popular choices: Source Code Pro Powerline, DejaVu Sans Mono Powerline, Ubuntu Mono Powerline\"\n );\n } finally {\n cleanup();\n process.removeListener(\"SIGINT\", cleanup);\n process.removeListener(\"SIGTERM\", cleanup);\n }\n } catch (error) {\n console.error(\n \"Error installing fonts:\",\n error instanceof Error ? error.message : String(error)\n );\n console.log(\n \"💡 You can manually install fonts from: https://github.com/powerline/fonts\"\n );\n }\n}\n\nasync function main(): Promise<void> {\n try {\n const showHelp =\n process.argv.includes(\"--help\") || process.argv.includes(\"-h\");\n const installFontsFlag = process.argv.includes(\"--install-fonts\");\n\n if (installFontsFlag) {\n await installFonts();\n process.exit(0);\n }\n\n if (showHelp) {\n console.log(`\nclaude-powerline - Beautiful powerline statusline for Claude Code\n\nUsage: claude-powerline [options]\n\nStandalone Commands:\n --install-fonts Install powerline fonts to system\n -h, --help Show this help\n\nDebugging:\n CLAUDE_POWERLINE_DEBUG=1 Enable debug logging for troubleshooting\n\nClaude Code Options (for settings.json):\n --theme=THEME Set theme: dark, light, nord, tokyo-night, rose-pine, custom\n --style=STYLE Set separator style: minimal, powerline\n --config=PATH Use custom config file path\n\nSee example config at: https://github.com/Owloops/claude-powerline/blob/main/.claude-powerline.json\n\n`);\n process.exit(0);\n }\n\n if (process.stdin.isTTY === true) {\n console.error(`Error: This tool requires input from Claude Code\n\nclaude-powerline is designed to be used as a Claude Code statusLine command.\nIt reads hook data from stdin and outputs formatted statusline.\n\nAdd to ~/.claude/settings.json:\n{\n \"statusLine\": {\n \"type\": \"command\",\n \"command\": \"claude-powerline --style=powerline\"\n }\n}\n\nRun with --help for more options.\n\nTo test output manually:\necho '{\"session_id\":\"test-session\",\"workspace\":{\"project_dir\":\"/path/to/project\"},\"model\":{\"id\":\"claude-3-5-sonnet\",\"display_name\":\"Claude\"}}' | claude-powerline --style=powerline`);\n process.exit(1);\n }\n\n debug(`Working directory: ${process.cwd()}`);\n debug(`Process args:`, process.argv);\n\n const hookData = (await json(process.stdin)) as ClaudeHookData;\n debug(`Received hook data:`, JSON.stringify(hookData, null, 2));\n\n if (!hookData) {\n console.error(\"Error: No input data received from stdin\");\n console.log(`\nclaude-powerline - Beautiful powerline statusline for Claude Code\n\nUsage: claude-powerline [options]\n\nOptions:\n --theme=THEME Set theme: dark, light, nord, tokyo-night, rose-pine, custom\n --style=STYLE Set separator style: minimal, powerline\n --config=PATH Use custom config file path\n --install-fonts Install powerline fonts to system\n -h, --help Show this help\n\nSee example config at: https://github.com/Owloops/claude-powerline/blob/main/.claude-powerline.json\n`);\n process.exit(1);\n }\n\n const projectDir = hookData.workspace?.project_dir;\n const config = loadConfigFromCLI(process.argv, projectDir);\n const renderer = new PowerlineRenderer(config);\n const statusline = await renderer.generateStatusline(hookData);\n\n console.log(statusline);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(\"Error generating statusline:\", errorMessage);\n process.exit(1);\n }\n}\n\nmain();\n"]}
|