@owloops/claude-powerline 1.10.0 → 1.11.0

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.
Files changed (3) hide show
  1. package/README.md +33 -22
  2. package/dist/index.js +9 -8
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -58,37 +58,48 @@ _Live demonstration: real-time usage tracking, git integration, and theme showca
58
58
  <tr>
59
59
  <td width="50%">
60
60
 
61
- ### Usage Tracking
61
+ **Real-time usage tracking**
62
62
 
63
- - Real-time session costs
64
- - 5-hour billing window monitoring
65
- - Daily budget alerts with percentages
66
- - Token breakdown (input/output/cached)
63
+ Monitor session costs, 5-hour billing windows, and daily budgets with percentage alerts.
67
64
 
68
- ### Git Integration
65
+ </td>
66
+ <td width="50%">
67
+
68
+ **Git integration**
69
+
70
+ Branch status, commits ahead/behind, working tree changes, and repository info at a glance.
71
+
72
+ </td>
73
+ </tr>
74
+ <tr>
75
+ <td width="50%">
76
+
77
+ **6 built-in themes**
69
78
 
70
- - Branch status with clean/dirty indicators
71
- - Commits ahead/behind remote tracking
72
- - Repository info (SHA, tags, stash count)
73
- - Working tree staged/unstaged/untracked counts
79
+ Dark, light, nord, tokyo-night, rose-pine, and gruvbox themes with full custom color support.
74
80
 
75
81
  </td>
76
82
  <td width="50%">
77
83
 
78
- ### Customization
84
+ **Multiple styles**
79
85
 
80
- - 5 built-in themes (dark, light, nord, tokyo-night, rose-pine)
81
- - Custom color configuration
82
- - Three separator styles: minimal, powerline, and capsule
83
- - Two character sets: unicode (Nerd Font) and text (ASCII)
84
- - Multi-line layouts to prevent cutoff
86
+ Minimal, powerline, and capsule separators with unicode or ASCII character sets.
87
+
88
+ </td>
89
+ </tr>
90
+ <tr>
91
+ <td width="50%">
92
+
93
+ **Auto-wrap layout**
94
+
95
+ Segments automatically wrap to new lines based on terminal width. No more cutoff.
96
+
97
+ </td>
98
+ <td width="50%">
85
99
 
86
- ### Performance Metrics
100
+ **Zero dependencies**
87
101
 
88
- - Average and last response times
89
- - Session duration tracking
90
- - Message count monitoring
91
- - Context usage with auto-compact threshold
102
+ Lightweight and fast with no external dependencies to install.
92
103
 
93
104
  </td>
94
105
  </tr>
@@ -123,7 +134,7 @@ Once added to Claude Code settings, the statusline runs automatically. For custo
123
134
 
124
135
  **CLI Options:**
125
136
 
126
- - `--theme` - `dark` (default), `light`, `nord`, `tokyo-night`, `rose-pine`, `custom`
137
+ - `--theme` - `dark` (default), `light`, `nord`, `tokyo-night`, `rose-pine`, `gruvbox`, `custom`
127
138
  - `--style` - `minimal` (default), `powerline`, `capsule`
128
139
  - `--charset` - `unicode` (default), `text`
129
140
  - `--config` - Custom config file path
package/dist/index.js CHANGED
@@ -1,11 +1,12 @@
1
1
  #!/usr/bin/env node
2
- import S from'process';import {json}from'stream/consumers';import I from'tty';import {exec,execSync}from'child_process';import {promisify}from'util';import w,{existsSync,readFileSync,createReadStream}from'fs';import _,{join,posix}from'path';import {get}from'https';import {URL}from'url';import je,{homedir}from'os';import {createHash}from'crypto';import {setTimeout}from'timers/promises';import {readdir,stat,readFile}from'fs/promises';import {createInterface}from'readline';function re(o,e){if(e&&(o.toLowerCase()==="transparent"||o.toLowerCase()==="none"))return "\x1B[49m";let t=parseInt(o.slice(1,3),16),n=parseInt(o.slice(3,5),16),r=parseInt(o.slice(5,7),16);return `\x1B[${e?"48":"38"};2;${t};${n};${r}m`}function O(o,e=false){if(!o||o==="")return "";let t=o.match(/48;2;(\d+);(\d+);(\d+)/);if(t)return `\x1B[38;2;${t[1]};${t[2]};${t[3]}m`;if(e)return "\x1B[37m";if(o.includes("\x1B[")&&o.includes("m")){let n=o.match(/\[(\d+)m/);if(n&&n[1]){let r=parseInt(n[1],10);if(r>=40&&r<=47)return `\x1B[${r-10}m`;if(r>=100&&r<=107)return `\x1B[${r-10}m`}}return o.replace("48","38")}function N(){let{env:o}=S,e=true;o.NO_COLOR&&o.NO_COLOR!==""&&(e=false);let t=o.FORCE_COLOR;if(t&&t!=="")return t==="false"||t==="0"?"none":t==="true"||t==="1"?"ansi":t==="2"?"ansi256":t==="3"?"truecolor":"ansi";if(!e||o.TERM==="dumb")return "none";if(o.CI)return ["GITHUB_ACTIONS","GITEA_ACTIONS","CIRCLECI"].some(r=>r in o)?"truecolor":"ansi";if(o.COLORTERM==="truecolor"||["xterm-kitty","xterm-ghostty","wezterm","alacritty","foot","contour"].includes(o.TERM||""))return "truecolor";if(o.TERM_PROGRAM)switch(o.TERM_PROGRAM){case "iTerm.app":return "truecolor";case "Apple_Terminal":return "ansi256";case "vscode":return "truecolor";case "Tabby":return "truecolor"}if(/-256(color)?$/i.test(o.TERM||""))return "ansi256";if(/-truecolor$/i.test(o.TERM||""))return "truecolor";if(/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(o.TERM||"")||o.COLORTERM)return "ansi";if(I?.WriteStream?.prototype?.hasColors)try{if(!I.WriteStream.prototype.hasColors())return "none";let s=I.WriteStream.prototype.hasColors(256);return I.WriteStream.prototype.hasColors(16777216)?"truecolor":s?"ansi256":"ansi"}catch{}return "ansi"}function se(o,e){if(e&&(o.toLowerCase()==="transparent"||o.toLowerCase()==="none"))return "\x1B[49m";let t=parseInt(o.slice(1,3),16),n=parseInt(o.slice(3,5),16),r=parseInt(o.slice(5,7),16),i=((a,c,u)=>a===c&&c===u?a<8?16:a>248?231:Math.round((a-8)/247*24)+232:16+36*Math.round(a/255*5)+6*Math.round(c/255*5)+Math.round(u/255*5))(t,n,r);return `\x1B[${e?"48":"38"};5;${i}m`}function oe(o,e){if(e&&(o.toLowerCase()==="transparent"||o.toLowerCase()==="none"))return "\x1B[49m";if(e)return "";let t=parseInt(o.slice(1,3),16),n=parseInt(o.slice(3,5),16),r=parseInt(o.slice(5,7),16);return n>t&&n>r&&n>120?"\x1B[32m":t>n&&t>r&&t>120?"\x1B[31m":r>t&&r>n&&r>120?"\x1B[34m":(t+n+r)/3>150?"\x1B[37m":"\x1B[90m"}var he={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"}},pe={directory:{bg:"#af5f00",fg:"#ffffff"},git:{bg:"#444444",fg:"#ffffff"},model:{bg:"#3a3a3a",fg:"#ffffff"},session:{bg:"#262626",fg:"#00ffff"},block:{bg:"#303030",fg:"#87ceeb"},today:{bg:"#1c1c1c",fg:"#87ff87"},tmux:{bg:"#444444",fg:"#87ff87"},context:{bg:"#585858",fg:"#d0d0d0"},metrics:{bg:"#4e4e4e",fg:"#d0d0d0"},version:{bg:"#444444",fg:"#d7afff"}},be={directory:{bg:"#d75f00",fg:"#ffffff"},git:{bg:"#585858",fg:"#ffffff"},model:{bg:"#444444",fg:"#ffffff"},session:{bg:"#303030",fg:"#00ffff"},block:{bg:"#3a3a3a",fg:"#5fafff"},today:{bg:"#262626",fg:"#00ff00"},tmux:{bg:"#585858",fg:"#00ff00"},context:{bg:"#808080",fg:"#ffffff"},metrics:{bg:"#666666",fg:"#ffffff"},version:{bg:"#585858",fg:"#af87ff"}};var ye={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"}},Ce={directory:{bg:"#ff5f5f",fg:"#ffffff"},git:{bg:"#5fafff",fg:"#ffffff"},model:{bg:"#87d7ff",fg:"#000000"},session:{bg:"#ff5fff",fg:"#ffffff"},block:{bg:"#5f5fff",fg:"#ffffff"},today:{bg:"#00d787",fg:"#ffffff"},tmux:{bg:"#00ff5f",fg:"#ffffff"},context:{bg:"#808080",fg:"#ffffff"},metrics:{bg:"#767676",fg:"#ffffff"},version:{bg:"#af87ff",fg:"#ffffff"}},_e={directory:{bg:"#ff5f5f",fg:"#ffffff"},git:{bg:"#5fafff",fg:"#ffffff"},model:{bg:"#87d7ff",fg:"#000000"},session:{bg:"#ff5fff",fg:"#ffffff"},block:{bg:"#5f5fff",fg:"#ffffff"},today:{bg:"#00d787",fg:"#ffffff"},tmux:{bg:"#00ff5f",fg:"#ffffff"},context:{bg:"#808080",fg:"#ffffff"},metrics:{bg:"#767676",fg:"#ffffff"},version:{bg:"#af87ff",fg:"#ffffff"}};var we={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"}},Se={directory:{bg:"#5f87af",fg:"#e4e4e4"},git:{bg:"#4e4e4e",fg:"#87d787"},model:{bg:"#6c6c6c",fg:"#87afd7"},session:{bg:"#3a3a3a",fg:"#5fafaf"},block:{bg:"#4e4e4e",fg:"#87afd7"},today:{bg:"#3a3a3a",fg:"#5fd7d7"},tmux:{bg:"#3a3a3a",fg:"#5fd7d7"},context:{bg:"#5f87d7",fg:"#ffffff"},metrics:{bg:"#d787af",fg:"#3a3a3a"},version:{bg:"#5f87af",fg:"#5fafaf"}},ke={directory:{bg:"#0087af",fg:"#ffffff"},git:{bg:"#585858",fg:"#87d700"},model:{bg:"#808080",fg:"#87afff"},session:{bg:"#444444",fg:"#00d7d7"},block:{bg:"#585858",fg:"#87afff"},today:{bg:"#444444",fg:"#00ffff"},tmux:{bg:"#444444",fg:"#00ffff"},context:{bg:"#0087ff",fg:"#ffffff"},metrics:{bg:"#ff87d7",fg:"#444444"},version:{bg:"#0087af",fg:"#00d7d7"}};var Te={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"}},xe={directory:{bg:"#444478",fg:"#87afff"},git:{bg:"#262640",fg:"#afff87"},model:{bg:"#1c1c30",fg:"#ff87ff"},session:{bg:"#3a3a50",fg:"#5fd7ff"},block:{bg:"#4e4e68",fg:"#5f87ff"},today:{bg:"#262640",fg:"#00d7af"},tmux:{bg:"#1c1c30",fg:"#00d7af"},context:{bg:"#5f5f87",fg:"#d7d7ff"},metrics:{bg:"#5f5faf",fg:"#d7d7ff"},version:{bg:"#444460",fg:"#d787ff"}},ve={directory:{bg:"#5f5faf",fg:"#87afff"},git:{bg:"#303050",fg:"#87ff87"},model:{bg:"#262640",fg:"#ff87ff"},session:{bg:"#444470",fg:"#00d7ff"},block:{bg:"#666680",fg:"#5f87ff"},today:{bg:"#303050",fg:"#00d787"},tmux:{bg:"#262640",fg:"#00d787"},context:{bg:"#808080",fg:"#ffffff"},metrics:{bg:"#8787d7",fg:"#ffffff"},version:{bg:"#585870",fg:"#d787ff"}};var Ee={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"}},Pe={directory:{bg:"#444444",fg:"#d787d7"},git:{bg:"#262626",fg:"#87d7d7"},model:{bg:"#1c1c1c",fg:"#ffaf87"},session:{bg:"#444444",fg:"#d7af5f"},block:{bg:"#4e4e4e",fg:"#ff5f87"},today:{bg:"#3a3a3a",fg:"#87d7d7"},tmux:{bg:"#444444",fg:"#9e9e9e"},context:{bg:"#585858",fg:"#e4e4e4"},metrics:{bg:"#767676",fg:"#e4e4e4"},version:{bg:"#4e4e4e",fg:"#d787d7"}},$e={directory:{bg:"#585858",fg:"#ff87ff"},git:{bg:"#303030",fg:"#00d7d7"},model:{bg:"#262626",fg:"#ffaf87"},session:{bg:"#585858",fg:"#d7af00"},block:{bg:"#666666",fg:"#ff5f87"},today:{bg:"#444444",fg:"#00d7d7"},tmux:{bg:"#585858",fg:"#bcbcbc"},context:{bg:"#808080",fg:"#ffffff"},metrics:{bg:"#a8a8a8",fg:"#000000"},version:{bg:"#666666",fg:"#ff87ff"}};var ie={dark:he,"dark-ansi256":pe,"dark-ansi":be,light:ye,"light-ansi256":Ce,"light-ansi":_e,nord:we,"nord-ansi256":Se,"nord-ansi":ke,"tokyo-night":Te,"tokyo-night-ansi256":xe,"tokyo-night-ansi":ve,"rose-pine":Ee,"rose-pine-ansi256":Pe,"rose-pine-ansi":$e};function j(o,e){let t=ie[o];if(!t)return null;if(e==="none"||e==="ansi"){let n=ie[`${o}-ansi`];if(n)return n}if(e==="ansi256"){let n=ie[`${o}-ansi256`];if(n)return n}return t}var l=(o,...e)=>{process.env.CLAUDE_POWERLINE_DEBUG&&console.error(`[DEBUG] ${o}`,...e);};var ze=promisify(exec),R=class{isGitRepo(e){try{return w.existsSync(_.join(e,".git"))}catch{return false}}async execGitAsync(e,t){return ze(e,{...t,env:{...process.env,GIT_OPTIONAL_LOCKS:"0"}})}async findGitRoot(e){try{return (await this.execGitAsync("git rev-parse --show-toplevel",{cwd:e,encoding:"utf8",timeout:2e3})).stdout.trim()||null}catch{return null}}async getGitInfo(e,t={},n){let r;if(n&&this.isGitRepo(n))r=n;else if(this.isGitRepo(e))r=e;else {let s=await this.findGitRoot(e);if(!s)return null;r=s;}try{let s=await this.getStatusWithBranchAsync(r),i=await this.getAheadBehindAsync(r),a={branch:s.branch||"detached",status:s.status,ahead:i.ahead,behind:i.behind};t.showWorkingTree&&s.workingTree&&(a.staged=s.workingTree.staged,a.unstaged=s.workingTree.unstaged,a.untracked=s.workingTree.untracked,a.conflicts=s.workingTree.conflicts);let c={},u={};t.showSha&&(c.sha=this.getShaAsync(r)),t.showTag&&(c.tag=this.getNearestTagAsync(r)),t.showTimeSinceCommit&&(c.timeSinceCommit=this.getTimeSinceLastCommitAsync(r)),t.showStashCount&&(u.stashCount=this.getStashCountAsync(r)),t.showUpstream&&(u.upstream=this.getUpstreamAsync(r)),t.showRepoName&&(u.repoName=this.getRepoNameAsync(r));let g=new Map;for(let[m,f]of Object.entries(c))try{let d=await f;g.set(m,d);}catch{}return Object.keys(u).length>0&&(await Promise.allSettled(Object.entries(u).map(async([f,d])=>({key:f,value:await d})))).forEach(f=>{f.status==="fulfilled"&&g.set(f.value.key,f.value.value);}),t.showSha&&(a.sha=g.get("sha")||void 0),t.showOperation&&(a.operation=this.getOngoingOperation(r)||void 0),t.showTag&&(a.tag=g.get("tag")||void 0),t.showTimeSinceCommit&&(a.timeSinceCommit=g.get("timeSinceCommit")||void 0),t.showStashCount&&(a.stashCount=g.get("stashCount")||0),t.showUpstream&&(a.upstream=g.get("upstream")||void 0),t.showRepoName&&(a.repoName=g.get("repoName")||void 0,a.isWorktree=this.isWorktree(r)),a}catch{return null}}async getShaAsync(e){try{return (await this.execGitAsync("git rev-parse --short=7 HEAD",{cwd:e,encoding:"utf8",timeout:2e3})).stdout.trim()||null}catch{return null}}getOngoingOperation(e){try{let t=_.join(e,".git");return w.existsSync(_.join(t,"MERGE_HEAD"))?"MERGE":w.existsSync(_.join(t,"CHERRY_PICK_HEAD"))?"CHERRY-PICK":w.existsSync(_.join(t,"REVERT_HEAD"))?"REVERT":w.existsSync(_.join(t,"BISECT_LOG"))?"BISECT":w.existsSync(_.join(t,"rebase-merge"))||w.existsSync(_.join(t,"rebase-apply"))?"REBASE":null}catch{return null}}async getNearestTagAsync(e){try{return (await this.execGitAsync("git describe --tags --abbrev=0",{cwd:e,encoding:"utf8",timeout:2e3})).stdout.trim()||null}catch{return null}}async getTimeSinceLastCommitAsync(e){try{let n=(await this.execGitAsync("git log -1 --format=%ct",{cwd:e,encoding:"utf8",timeout:2e3})).stdout.trim();if(!n)return null;let r=parseInt(n)*1e3,s=Date.now();return Math.floor((s-r)/1e3)}catch{return null}}async getStashCountAsync(e){try{let n=(await this.execGitAsync("git stash list",{cwd:e,encoding:"utf8",timeout:2e3})).stdout.trim();return n?n.split(`
2
+ import S from'process';import {json}from'stream/consumers';import I from'tty';import {exec,execSync}from'child_process';import {promisify}from'util';import w,{existsSync,readFileSync,createReadStream}from'fs';import _,{join,posix,dirname}from'path';import {get}from'https';import {URL}from'url';import Ye,{homedir}from'os';import {createHash}from'crypto';import {setTimeout}from'timers/promises';import {readdir,stat,readFile}from'fs/promises';import {createInterface}from'readline';function se(o,e){if(e&&(o.toLowerCase()==="transparent"||o.toLowerCase()==="none"))return "\x1B[49m";let t=parseInt(o.slice(1,3),16),n=parseInt(o.slice(3,5),16),r=parseInt(o.slice(5,7),16);return `\x1B[${e?"48":"38"};2;${t};${n};${r}m`}function O(o,e=false){if(!o||o==="")return "";let t=o.match(/48;2;(\d+);(\d+);(\d+)/);if(t)return `\x1B[38;2;${t[1]};${t[2]};${t[3]}m`;if(e)return "\x1B[37m";if(o.includes("\x1B[")&&o.includes("m")){let n=o.match(/\[(\d+)m/);if(n&&n[1]){let r=parseInt(n[1],10);if(r>=40&&r<=47)return `\x1B[${r-10}m`;if(r>=100&&r<=107)return `\x1B[${r-10}m`}}return o.replace("48","38")}function N(){let{env:o}=S,e=true;o.NO_COLOR&&o.NO_COLOR!==""&&(e=false);let t=o.FORCE_COLOR;if(t&&t!=="")return t==="false"||t==="0"?"none":t==="true"||t==="1"?"ansi":t==="2"?"ansi256":t==="3"?"truecolor":"ansi";if(!e||o.TERM==="dumb")return "none";if(o.CI)return ["GITHUB_ACTIONS","GITEA_ACTIONS","CIRCLECI"].some(r=>r in o)?"truecolor":"ansi";if(o.COLORTERM==="truecolor"||["xterm-kitty","xterm-ghostty","wezterm","alacritty","foot","contour"].includes(o.TERM||""))return "truecolor";if(o.TERM_PROGRAM)switch(o.TERM_PROGRAM){case "iTerm.app":return "truecolor";case "Apple_Terminal":return "ansi256";case "vscode":return "truecolor";case "Tabby":return "truecolor"}if(/-256(color)?$/i.test(o.TERM||""))return "ansi256";if(/-truecolor$/i.test(o.TERM||""))return "truecolor";if(/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(o.TERM||"")||o.COLORTERM)return "ansi";if(I?.WriteStream?.prototype?.hasColors)try{if(!I.WriteStream.prototype.hasColors())return "none";let s=I.WriteStream.prototype.hasColors(256);return I.WriteStream.prototype.hasColors(16777216)?"truecolor":s?"ansi256":"ansi"}catch{}return "ansi"}function oe(o,e){if(e&&(o.toLowerCase()==="transparent"||o.toLowerCase()==="none"))return "\x1B[49m";let t=parseInt(o.slice(1,3),16),n=parseInt(o.slice(3,5),16),r=parseInt(o.slice(5,7),16),i=((a,c,u)=>a===c&&c===u?a<8?16:a>248?231:Math.round((a-8)/247*24)+232:16+36*Math.round(a/255*5)+6*Math.round(c/255*5)+Math.round(u/255*5))(t,n,r);return `\x1B[${e?"48":"38"};5;${i}m`}function ie(o,e){if(e&&(o.toLowerCase()==="transparent"||o.toLowerCase()==="none"))return "\x1B[49m";if(e)return "";let t=parseInt(o.slice(1,3),16),n=parseInt(o.slice(3,5),16),r=parseInt(o.slice(5,7),16);return n>t&&n>r&&n>120?"\x1B[32m":t>n&&t>r&&t>120?"\x1B[31m":r>t&&r>n&&r>120?"\x1B[34m":(t+n+r)/3>150?"\x1B[37m":"\x1B[90m"}var pe={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"}},be={directory:{bg:"#af5f00",fg:"#ffffff"},git:{bg:"#444444",fg:"#ffffff"},model:{bg:"#3a3a3a",fg:"#ffffff"},session:{bg:"#262626",fg:"#00ffff"},block:{bg:"#303030",fg:"#87ceeb"},today:{bg:"#1c1c1c",fg:"#87ff87"},tmux:{bg:"#444444",fg:"#87ff87"},context:{bg:"#585858",fg:"#d0d0d0"},metrics:{bg:"#4e4e4e",fg:"#d0d0d0"},version:{bg:"#444444",fg:"#d7afff"}},ye={directory:{bg:"#d75f00",fg:"#ffffff"},git:{bg:"#585858",fg:"#ffffff"},model:{bg:"#444444",fg:"#ffffff"},session:{bg:"#303030",fg:"#00ffff"},block:{bg:"#3a3a3a",fg:"#5fafff"},today:{bg:"#262626",fg:"#00ff00"},tmux:{bg:"#585858",fg:"#00ff00"},context:{bg:"#808080",fg:"#ffffff"},metrics:{bg:"#666666",fg:"#ffffff"},version:{bg:"#585858",fg:"#af87ff"}};var Ce={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"}},_e={directory:{bg:"#ff5f5f",fg:"#ffffff"},git:{bg:"#5fafff",fg:"#ffffff"},model:{bg:"#87d7ff",fg:"#000000"},session:{bg:"#ff5fff",fg:"#ffffff"},block:{bg:"#5f5fff",fg:"#ffffff"},today:{bg:"#00d787",fg:"#ffffff"},tmux:{bg:"#00ff5f",fg:"#ffffff"},context:{bg:"#808080",fg:"#ffffff"},metrics:{bg:"#767676",fg:"#ffffff"},version:{bg:"#af87ff",fg:"#ffffff"}},we={directory:{bg:"#ff5f5f",fg:"#ffffff"},git:{bg:"#5fafff",fg:"#ffffff"},model:{bg:"#87d7ff",fg:"#000000"},session:{bg:"#ff5fff",fg:"#ffffff"},block:{bg:"#5f5fff",fg:"#ffffff"},today:{bg:"#00d787",fg:"#ffffff"},tmux:{bg:"#00ff5f",fg:"#ffffff"},context:{bg:"#808080",fg:"#ffffff"},metrics:{bg:"#767676",fg:"#ffffff"},version:{bg:"#af87ff",fg:"#ffffff"}};var Se={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"}},Te={directory:{bg:"#5f87af",fg:"#e4e4e4"},git:{bg:"#4e4e4e",fg:"#87d787"},model:{bg:"#6c6c6c",fg:"#87afd7"},session:{bg:"#3a3a3a",fg:"#5fafaf"},block:{bg:"#4e4e4e",fg:"#87afd7"},today:{bg:"#3a3a3a",fg:"#5fd7d7"},tmux:{bg:"#3a3a3a",fg:"#5fd7d7"},context:{bg:"#5f87d7",fg:"#ffffff"},metrics:{bg:"#d787af",fg:"#3a3a3a"},version:{bg:"#5f87af",fg:"#5fafaf"}},ke={directory:{bg:"#0087af",fg:"#ffffff"},git:{bg:"#585858",fg:"#87d700"},model:{bg:"#808080",fg:"#87afff"},session:{bg:"#444444",fg:"#00d7d7"},block:{bg:"#585858",fg:"#87afff"},today:{bg:"#444444",fg:"#00ffff"},tmux:{bg:"#444444",fg:"#00ffff"},context:{bg:"#0087ff",fg:"#ffffff"},metrics:{bg:"#ff87d7",fg:"#444444"},version:{bg:"#0087af",fg:"#00d7d7"}};var xe={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"}},ve={directory:{bg:"#444478",fg:"#87afff"},git:{bg:"#262640",fg:"#afff87"},model:{bg:"#1c1c30",fg:"#ff87ff"},session:{bg:"#3a3a50",fg:"#5fd7ff"},block:{bg:"#4e4e68",fg:"#5f87ff"},today:{bg:"#262640",fg:"#00d7af"},tmux:{bg:"#1c1c30",fg:"#00d7af"},context:{bg:"#5f5f87",fg:"#d7d7ff"},metrics:{bg:"#5f5faf",fg:"#d7d7ff"},version:{bg:"#444460",fg:"#d787ff"}},Ee={directory:{bg:"#5f5faf",fg:"#87afff"},git:{bg:"#303050",fg:"#87ff87"},model:{bg:"#262640",fg:"#ff87ff"},session:{bg:"#444470",fg:"#00d7ff"},block:{bg:"#666680",fg:"#5f87ff"},today:{bg:"#303050",fg:"#00d787"},tmux:{bg:"#262640",fg:"#00d787"},context:{bg:"#808080",fg:"#ffffff"},metrics:{bg:"#8787d7",fg:"#ffffff"},version:{bg:"#585870",fg:"#d787ff"}};var Pe={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"}},$e={directory:{bg:"#444444",fg:"#d787d7"},git:{bg:"#262626",fg:"#87d7d7"},model:{bg:"#1c1c1c",fg:"#ffaf87"},session:{bg:"#444444",fg:"#d7af5f"},block:{bg:"#4e4e4e",fg:"#ff5f87"},today:{bg:"#3a3a3a",fg:"#87d7d7"},tmux:{bg:"#444444",fg:"#9e9e9e"},context:{bg:"#585858",fg:"#e4e4e4"},metrics:{bg:"#767676",fg:"#e4e4e4"},version:{bg:"#4e4e4e",fg:"#d787d7"}},Re={directory:{bg:"#585858",fg:"#ff87ff"},git:{bg:"#303030",fg:"#00d7d7"},model:{bg:"#262626",fg:"#ffaf87"},session:{bg:"#585858",fg:"#d7af00"},block:{bg:"#666666",fg:"#ff5f87"},today:{bg:"#444444",fg:"#00d7d7"},tmux:{bg:"#585858",fg:"#bcbcbc"},context:{bg:"#808080",fg:"#ffffff"},metrics:{bg:"#a8a8a8",fg:"#000000"},version:{bg:"#666666",fg:"#ff87ff"}};var Be={directory:{bg:"#504945",fg:"#ebdbb2"},git:{bg:"#3c3836",fg:"#b8bb26"},model:{bg:"#665c54",fg:"#83a598"},session:{bg:"#282828",fg:"#8ec07c"},block:{bg:"#3c3836",fg:"#83a598"},today:{bg:"#282828",fg:"#fabd2f"},tmux:{bg:"#282828",fg:"#fe8019"},context:{bg:"#458588",fg:"#ebdbb2"},metrics:{bg:"#d3869b",fg:"#282828"},version:{bg:"#504945",fg:"#8ec07c"}},Ae={directory:{bg:"#585858",fg:"#ffffaf"},git:{bg:"#444444",fg:"#afaf00"},model:{bg:"#6c6c6c",fg:"#87afaf"},session:{bg:"#303030",fg:"#87af87"},block:{bg:"#444444",fg:"#87afaf"},today:{bg:"#303030",fg:"#ffaf00"},tmux:{bg:"#303030",fg:"#ff8700"},context:{bg:"#5f8787",fg:"#ffffaf"},metrics:{bg:"#d787af",fg:"#303030"},version:{bg:"#585858",fg:"#87af87"}},De={directory:{bg:"#808080",fg:"#ffff00"},git:{bg:"#585858",fg:"#00ff00"},model:{bg:"#808080",fg:"#00afff"},session:{bg:"#444444",fg:"#00d787"},block:{bg:"#585858",fg:"#00afff"},today:{bg:"#444444",fg:"#ffaf00"},tmux:{bg:"#444444",fg:"#ff8700"},context:{bg:"#008787",fg:"#ffffff"},metrics:{bg:"#ff87af",fg:"#444444"},version:{bg:"#808080",fg:"#00d787"}};var ae={dark:pe,"dark-ansi256":be,"dark-ansi":ye,light:Ce,"light-ansi256":_e,"light-ansi":we,nord:Se,"nord-ansi256":Te,"nord-ansi":ke,"tokyo-night":xe,"tokyo-night-ansi256":ve,"tokyo-night-ansi":Ee,"rose-pine":Pe,"rose-pine-ansi256":$e,"rose-pine-ansi":Re,gruvbox:Be,"gruvbox-ansi256":Ae,"gruvbox-ansi":De};function j(o,e){let t=ae[o];if(!t)return null;if(e==="none"||e==="ansi"){let n=ae[`${o}-ansi`];if(n)return n}if(e==="ansi256"){let n=ae[`${o}-ansi256`];if(n)return n}return t}var l=(o,...e)=>{process.env.CLAUDE_POWERLINE_DEBUG&&console.error(`[DEBUG] ${o}`,...e);};var et=promisify(exec),B=class{isGitRepo(e){try{return w.existsSync(_.join(e,".git"))}catch{return false}}async execGitAsync(e,t){return et(e,{...t,env:{...process.env,GIT_OPTIONAL_LOCKS:"0"}})}async findGitRoot(e){try{return (await this.execGitAsync("git rev-parse --show-toplevel",{cwd:e,encoding:"utf8",timeout:2e3})).stdout.trim()||null}catch{return null}}async getGitInfo(e,t={},n){let r;if(n&&this.isGitRepo(n))r=n;else if(this.isGitRepo(e))r=e;else {let s=await this.findGitRoot(e);if(!s)return null;r=s;}try{let s=await this.getStatusWithBranchAsync(r),i=await this.getAheadBehindAsync(r),a={branch:s.branch||"detached",status:s.status,ahead:i.ahead,behind:i.behind};t.showWorkingTree&&s.workingTree&&(a.staged=s.workingTree.staged,a.unstaged=s.workingTree.unstaged,a.untracked=s.workingTree.untracked,a.conflicts=s.workingTree.conflicts);let c={},u={};t.showSha&&(c.sha=this.getShaAsync(r)),t.showTag&&(c.tag=this.getNearestTagAsync(r)),t.showTimeSinceCommit&&(c.timeSinceCommit=this.getTimeSinceLastCommitAsync(r)),t.showStashCount&&(u.stashCount=this.getStashCountAsync(r)),t.showUpstream&&(u.upstream=this.getUpstreamAsync(r)),t.showRepoName&&(u.repoName=this.getRepoNameAsync(r));let g=new Map;for(let[m,f]of Object.entries(c))try{let d=await f;g.set(m,d);}catch{}return Object.keys(u).length>0&&(await Promise.allSettled(Object.entries(u).map(async([f,d])=>({key:f,value:await d})))).forEach(f=>{f.status==="fulfilled"&&g.set(f.value.key,f.value.value);}),t.showSha&&(a.sha=g.get("sha")||void 0),t.showOperation&&(a.operation=this.getOngoingOperation(r)||void 0),t.showTag&&(a.tag=g.get("tag")||void 0),t.showTimeSinceCommit&&(a.timeSinceCommit=g.get("timeSinceCommit")||void 0),t.showStashCount&&(a.stashCount=g.get("stashCount")||0),t.showUpstream&&(a.upstream=g.get("upstream")||void 0),t.showRepoName&&(a.repoName=g.get("repoName")||void 0,a.isWorktree=this.isWorktree(r)),a}catch{return null}}async getShaAsync(e){try{return (await this.execGitAsync("git rev-parse --short=7 HEAD",{cwd:e,encoding:"utf8",timeout:2e3})).stdout.trim()||null}catch{return null}}getOngoingOperation(e){try{let t=_.join(e,".git");return w.existsSync(_.join(t,"MERGE_HEAD"))?"MERGE":w.existsSync(_.join(t,"CHERRY_PICK_HEAD"))?"CHERRY-PICK":w.existsSync(_.join(t,"REVERT_HEAD"))?"REVERT":w.existsSync(_.join(t,"BISECT_LOG"))?"BISECT":w.existsSync(_.join(t,"rebase-merge"))||w.existsSync(_.join(t,"rebase-apply"))?"REBASE":null}catch{return null}}async getNearestTagAsync(e){try{return (await this.execGitAsync("git describe --tags --abbrev=0",{cwd:e,encoding:"utf8",timeout:2e3})).stdout.trim()||null}catch{return null}}async getTimeSinceLastCommitAsync(e){try{let n=(await this.execGitAsync("git log -1 --format=%ct",{cwd:e,encoding:"utf8",timeout:2e3})).stdout.trim();if(!n)return null;let r=parseInt(n)*1e3,s=Date.now();return Math.floor((s-r)/1e3)}catch{return null}}async getStashCountAsync(e){try{let n=(await this.execGitAsync("git stash list",{cwd:e,encoding:"utf8",timeout:2e3})).stdout.trim();return n?n.split(`
3
3
  `).length:0}catch{return 0}}async getUpstreamAsync(e){try{return (await this.execGitAsync("git rev-parse --abbrev-ref @{u}",{cwd:e,encoding:"utf8",timeout:2e3})).stdout.trim()||null}catch{return null}}async getRepoNameAsync(e){try{let n=(await this.execGitAsync("git config --get remote.origin.url",{cwd:e,encoding:"utf8",timeout:2e3})).stdout.trim();return n?n.match(/\/([^/]+?)(\.git)?$/)?.[1]||_.basename(e):_.basename(e)}catch{return _.basename(e)}}isWorktree(e){try{let t=_.join(e,".git");return !!(w.existsSync(t)&&w.statSync(t).isFile())}catch{return false}}async getStatusWithBranchAsync(e){try{l(`[GIT-EXEC] Running git status in ${e}`);let r=(await this.execGitAsync("git status --porcelain -b",{cwd:e,encoding:"utf8",timeout:2e3})).stdout.split(`
4
- `),s=null,i="clean",a=0,c=0,u=0,g=0;for(let m of r)if(m){if(m.startsWith("## ")){let d=m.substring(3).split("...")[0];d&&d!=="HEAD (no branch)"&&(s=d);continue}if(m.length>=2){let f=m.charAt(0),d=m.charAt(1);if(f==="?"&&d==="?"){u++,i==="clean"&&(i="dirty");continue}let h=f+d;if(["DD","AU","UD","UA","DU","AA","UU"].includes(h)){g++,i="conflicts";continue}f!==" "&&f!=="?"&&(a++,i==="clean"&&(i="dirty")),d!==" "&&d!=="?"&&(c++,i==="clean"&&(i="dirty"));}}return {branch:s||await this.getFallbackBranch(e),status:i,workingTree:{staged:a,unstaged:c,untracked:u,conflicts:g}}}catch(t){return l(`Git status with branch command failed in ${e}:`,t),{branch:await this.getFallbackBranch(e),status:"clean"}}}async getFallbackBranch(e){try{let n=(await this.execGitAsync("git branch --show-current",{cwd:e,encoding:"utf8",timeout:2e3})).stdout.trim();if(n)return n}catch{try{let n=(await this.execGitAsync("git symbolic-ref --short HEAD",{cwd:e,encoding:"utf8",timeout:2e3})).stdout.trim();if(n)return n}catch{return null}}return null}async getAheadBehindAsync(e){try{l(`[GIT-EXEC] Running git ahead/behind in ${e}`);let[t,n]=await Promise.all([this.execGitAsync("git rev-list --count @{u}..HEAD",{cwd:e,encoding:"utf8",timeout:2e3}),this.execGitAsync("git rev-list --count HEAD..@{u}",{cwd:e,encoding:"utf8",timeout:2e3})]);return {ahead:parseInt(t.stdout.trim())||0,behind:parseInt(n.stdout.trim())||0}}catch(t){return l(`Git ahead/behind command failed in ${e}:`,t),{ahead:0,behind:0}}}};var Ze=promisify(exec),B=class{async getSessionId(){try{if(!process.env.TMUX_PANE)return l("TMUX_PANE not set, not in tmux session"),null;l(`Getting tmux session ID, TMUX_PANE: ${process.env.TMUX_PANE}`);let t=(await Ze("tmux display-message -p '#S'",{encoding:"utf8",timeout:1e3})).stdout.trim();return l(`Tmux session ID: ${t||"empty"}`),t||null}catch(e){return l("Error getting tmux session ID:",e),null}}isInTmux(){return !!process.env.TMUX_PANE}};function H(){let o=[],e=process.env.CLAUDE_CONFIG_DIR;if(e&&e.split(",").forEach(t=>{let n=t.trim();existsSync(n)&&o.push(n);}),o.length===0){let t=homedir(),n=join(t,".config","claude"),r=join(t,".claude");existsSync(n)?o.push(n):existsSync(r)&&o.push(r);}return o}async function G(o){let e=[];for(let t of o){let n=join(t,"projects");if(existsSync(n))try{let r=await readdir(n,{withFileTypes:!0});for(let s of r)if(s.isDirectory()){let i=posix.join(n,s.name);e.push(i);}}catch(r){l(`Failed to read projects directory ${n}:`,r);}}return e}async function W(o){let e=H(),t=await G(e);for(let n of t){let r=posix.join(n,`${o}.jsonl`);if(existsSync(r))return r}return null}async function le(o){try{return (await stat(o)).mtime}catch{return null}}function rt(o){let e=o.message?.id||(typeof o.raw.message=="object"&&o.raw.message!==null&&"id"in o.raw.message?o.raw.message.id:void 0),t="requestId"in o.raw?o.raw.requestId:void 0;return !e||!t?null:`${e}:${t}`}var st=1024*1024;async function D(o){try{let t=(await stat(o)).size,n;return t>st?(l(`Using streaming parser for large file ${o} (${Math.round(t/1024)}KB)`),n=await it(o)):n=await ot(o),l(`Parsed ${n.length} entries from ${o}`),n}catch(e){return l(`Failed to read file ${o}:`,e),[]}}async function ot(o){let t=(await readFile(o,"utf-8")).trim().split(`
5
- `).filter(r=>r.trim()),n=[];for(let r of t)try{let s=JSON.parse(r);if(!s.timestamp)continue;let i={timestamp:new Date(s.timestamp),message:s.message,costUSD:typeof s.costUSD=="number"?s.costUSD:void 0,isSidechain:s.isSidechain===!0,raw:s};n.push(i);}catch(s){l(`Failed to parse JSONL line: ${s}`);continue}return n}async function it(o){return new Promise((e,t)=>{let n=[],r=createReadStream(o,{encoding:"utf8"}),s=createInterface({input:r,crlfDelay:1/0});s.on("line",i=>{let a=i.trim();if(a)try{let c=JSON.parse(a);if(!c.timestamp)return;let u={timestamp:new Date(c.timestamp),message:c.message,costUSD:typeof c.costUSD=="number"?c.costUSD:void 0,isSidechain:c.isSidechain===!0,raw:c};n.push(u);}catch(c){l(`Failed to parse JSONL line: ${c}`);}}),s.on("close",()=>{e(n);}),s.on("error",i=>{l(`Streaming parser error for ${o}:`,i),t(i);}),r.on("error",i=>{l(`File stream error for ${o}:`,i),t(i);});})}async function V(o,e,t=false){let n=H(),r=await G(n),s=new Set,i=r.map(async h=>{try{let b=(await readdir(h)).filter(C=>C.endsWith(".jsonl")).map(async C=>{let ne=posix.join(h,C);if(existsSync(ne)){let Ve=await le(ne);return {filePath:ne,mtime:Ve}}return null});return (await Promise.all(b)).filter(C=>C?.mtime&&(!e||e(C.filePath,C.mtime)))}catch(p){return l(`Failed to read project directory ${h}:`,p),[]}}),c=(await Promise.all(i)).flat().filter(h=>h!==null);t&&c.sort((h,p)=>p.mtime.getTime()-h.mtime.getTime());let u=c.map(h=>h.filePath),g=[],m=u.map(async h=>(await D(h)).filter(y=>!o||o(y))),f=await Promise.all(m);for(let h of f)g.push(...h);g.sort((h,p)=>h.timestamp.getTime()-p.timestamp.getTime());let d=[];for(let h of g){let p=rt(h);p&&s.has(p)||(p&&s.add(p),d.push(h));}return d}var v=class{static CACHE_DIR=_.join(homedir(),".claude","powerline");static USAGE_CACHE_DIR=_.join(this.CACHE_DIR,"usage");static LOCKS_DIR=_.join(this.CACHE_DIR,"locks");static isLocked(e){let t=_.join(this.LOCKS_DIR,e);if(!w.existsSync(t))return false;try{let n=w.readFileSync(t,"utf-8"),r=parseInt(n.trim(),10);if(isNaN(r))return l(`Invalid PID in lock file ${e}, removing stale lock`),w.unlinkSync(t),!1;try{return process.kill(r,0),!0}catch(s){return s.code==="ESRCH"?(l(`Removing stale lock file ${e} for dead process ${r}`),w.unlinkSync(t),!1):(l(`Error checking process ${r} for lock ${e}:`,s),!0)}}catch(n){return l(`Error reading lock file ${e}:`,n),true}}static async acquireLock(e,t=5e3){await this.ensureCacheDirectories();let s=_.join(this.LOCKS_DIR,e),i=Date.now(),a=String(process.pid);for(;Date.now()-i<t;)try{return await w.promises.writeFile(s,a,{flag:"wx"}),l(`Lock acquired for ${e}`),!0}catch(c){if(c.code==="EEXIST")await setTimeout(50);else throw c}return l(`Failed to acquire lock for ${e} within ${t}ms`),false}static async releaseLock(e){let t=_.join(this.LOCKS_DIR,e);try{await w.promises.unlink(t),l(`Lock released for ${e}`);}catch(n){n.code!=="ENOENT"&&l(`Error releasing lock for ${e}:`,n);}}static async ensureCacheDirectories(){try{await Promise.all([w.promises.mkdir(this.CACHE_DIR,{recursive:!0}),w.promises.mkdir(this.USAGE_CACHE_DIR,{recursive:!0}),w.promises.mkdir(this.LOCKS_DIR,{recursive:!0})]);}catch(e){l("Failed to create cache directories:",e);}}static createProjectHash(e){return createHash("md5").update(e).digest("hex").substring(0,8)}static async getUsageCache(e,t){let s="utf-8";await this.ensureCacheDirectories();let i=_.join(this.USAGE_CACHE_DIR,`${e}.json`),a=`${e}.usage.lock`;for(let c=0;c<3;c++){if(this.isLocked(a)){l(`Cache for ${e} is locked, waiting...`),await setTimeout(75);continue}try{let g=await w.promises.readFile(i,s),m=JSON.parse(g);return !t||m.timestamp>=t?(l(`[CACHE-HIT] ${e} disk cache: found`),this.deserializeDates(m.data)):(l(`${e} cache outdated: cache=${m.timestamp}, latest=${t}`),null)}catch(g){if(g.code==="ENOENT")return l(`No shared ${e} usage cache found`),null;let m=c+1;l(`Attempt ${m} failed to read ${e} cache: ${g.message}. Retrying...`),await setTimeout(75);}}return l(`Failed to read ${e} cache after 3 attempts.`),null}static deserializeDates(e){return Array.isArray(e)?e.map(t=>({...t,timestamp:new Date(t.timestamp)})):e}static async setUsageCache(e,t,n){let r=`${e}.usage.lock`;if(!await this.acquireLock(r)){l(`Could not acquire lock to set usage cache for ${e}`);return}try{await this.ensureCacheDirectories();let i=_.join(this.USAGE_CACHE_DIR,`${e}.json`),a=n||Date.now(),u=JSON.stringify({data:t,timestamp:a});await w.promises.writeFile(i,u,"utf-8"),l(`[CACHE-SET] ${e} disk cache stored`);}catch(i){l(`Failed to save ${e} usage cache:`,i);}finally{await this.releaseLock(r);}}static async getLatestTranscriptMtime(){try{let e=H(),t=await G(e),n=0;for(let r of t)try{let i=(await w.promises.readdir(r)).filter(a=>a.endsWith(".jsonl"));for(let a of i){let c=_.join(r,a),u=await le(c);u&&u.getTime()>n&&(n=u.getTime());}}catch(s){l(`Failed to read project directory ${r}:`,s);continue}return n}catch(e){return l("Failed to get latest transcript mtime:",e),Date.now()}}};var Y={"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-haiku-4-5-20251001":{name:"Claude Haiku 4.5",input:1,output:5,cache_write_5m:1.25,cache_write_1h:2,cache_read:.1},"claude-haiku-4-5":{name:"Claude Haiku 4.5",input:1,output:5,cache_write_5m:1.25,cache_write_1h:2,cache_read:.1},"claude-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-sonnet-4-5":{name:"Claude Sonnet 4.5",input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"claude-sonnet-4-5-20250929":{name:"Claude Sonnet 4.5",input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"claude-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}},P=class{static executionCache=null;static modelPricingCache=new Map;static GITHUB_PRICING_URL="https://raw.githubusercontent.com/Owloops/claude-powerline/main/pricing.json";static async loadDiskCache(){let t=Date.now()-864e5;return await v.getUsageCache("pricing",t)}static async saveDiskCache(e){await v.setUsageCache("pricing",e);}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},r=>{if(r.statusCode!==200){l(`HTTP ${r.statusCode}: ${r.statusMessage}`),e(null);return}let s="",i=0,a=1024*1024;r.on("data",c=>{if(i+=c.length,i>a){l("Response too large"),n.destroy(),e(null);return}s+=c;}),r.on("end",()=>{try{let u=JSON.parse(s),g=u._meta,m={};for(let[f,d]of Object.entries(u))f!=="_meta"&&(m[f]=d);this.validatePricingData(m)?(l(`Fetched fresh pricing from GitHub for ${Object.keys(m).length} models`),l(`Pricing last updated: ${g?.updated||"unknown"}`),e(m)):(l("Invalid pricing data structure"),e(null));}catch(c){l("Failed to parse JSON:",c),e(null);}}),r.on("error",c=>{l("Response error:",c),e(null);});});n.on("error",r=>{l("Request error:",r),e(null);}),n.on("timeout",()=>{l("Request timeout"),n.destroy(),e(null);}),n.end();})}static async getCurrentPricing(){if(this.executionCache!==null)return l(`[CACHE-HIT] Pricing execution cache: ${Object.keys(this.executionCache).length} models`),this.executionCache;let e=await this.loadDiskCache();if(e)return l(`[CACHE-HIT] Pricing disk cache: ${Object.keys(e).length} models`),this.executionCache=e,l(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(e).length} models`),e;let t=await this.fetchPricingData();return t?(await this.saveDiskCache(t),l(`[CACHE-SET] Pricing disk cache stored: ${Object.keys(t).length} models`),this.executionCache=t,l(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(t).length} models`),t):(l(`[CACHE-FALLBACK] Using offline pricing data: ${Object.keys(Y).length} models`),this.executionCache=Y,l(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(Y).length} models`),Y)}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){if(this.modelPricingCache.has(e))return l(`[CACHE-HIT] Model pricing cache: ${e}`),this.modelPricingCache.get(e);let t=await this.getCurrentPricing(),n;return t[e]?n=t[e]:n=this.fuzzyMatchModel(e,t),this.modelPricingCache.set(e,n),l(`[CACHE-SET] Model pricing cache: ${e}`),n}static fuzzyMatchModel(e,t){let n=e.toLowerCase();for(let[s,i]of Object.entries(t))if(s.toLowerCase()===n)return i;let r=[{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.5","4-5-sonnet","sonnet-4-5"],fallback:"claude-sonnet-4-5-20250929"},{pattern:["sonnet-4","claude-sonnet-4"],fallback:"claude-sonnet-4-20250514"},{pattern:["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:["haiku-4.5","4-5-haiku","haiku-4-5"],fallback:"claude-haiku-4-5-20251001"},{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:s,fallback:i}of r)if(s.some(a=>n.includes(a))&&t[i])return t[i];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 r=this.extractModelId(e),s=await this.getModelPricing(r),i=n.input_tokens||0,a=n.output_tokens||0,c=n.cache_creation_input_tokens||0,u=n.cache_read_input_tokens||0,g=i/1e6*s.input,m=a/1e6*s.output,f=u/1e6*s.cache_read,d=c/1e6*s.cache_write_5m;return g+m+d+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 gt(o){return {timestamp:o.timestamp.toISOString(),message:{usage:{input_tokens:o.message?.usage?.input_tokens||0,output_tokens:o.message?.usage?.output_tokens||0,cache_creation_input_tokens:o.message?.usage?.cache_creation_input_tokens,cache_read_input_tokens:o.message?.usage?.cache_read_input_tokens}},costUSD:o.costUSD}}var J=class{async getSessionUsage(e){try{let t=await W(e);if(!t)return l(`No transcript found for session: ${e}`),null;l(`Found transcript at: ${t}`);let n=await D(t);if(n.length===0)return {totalCost:0,entries:[]};let r=[],s=0;for(let i of n)if(i.message?.usage){let a=gt(i);if(a.costUSD!==void 0)s+=a.costUSD;else {let c=await P.calculateCostForEntry(i.raw);a.costUSD=c,s+=c;}r.push(a);}return l(`Parsed ${r.length} usage entries, total cost: $${s.toFixed(4)}`),{totalCost:s,entries:r}}catch(t){return l(`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,t){let n=await this.getSessionUsage(e);if(!n||n.entries.length===0)return {cost:null,calculatedCost:null,officialCost:null,tokens:null,tokenBreakdown:null};let r=this.calculateTokenBreakdown(n.entries),s=r.input+r.output+r.cacheCreation+r.cacheRead,i=n.totalCost,a=t?.cost?.total_cost_usd??null;return {cost:i??a,calculatedCost:i,officialCost:a,tokens:s,tokenBreakdown:r}}},A=class{sessionProvider=new J;async getUsageInfo(e,t){try{return l(`Starting usage info retrieval for session: ${e}`),{session:await this.sessionProvider.getSessionInfo(e,t)}}catch(n){return l(`Error getting usage info for session ${e}:`,n),{session:{cost:null,calculatedCost:null,officialCost:null,tokens:null,tokenBreakdown:null}}}}};var U=class{thresholds={LOW:50,MEDIUM:80};config;constructor(e){this.config=e;}getContextUsageThresholds(){return this.thresholds}getContextLimit(e){let t=this.config.modelContextLimits||{default:2e5},n=this.getModelType(e);return t[n]||t.default||2e5}getModelType(e){let t=e.toLowerCase();return t.includes("sonnet")?"sonnet":t.includes("opus")?"opus":"default"}async calculateContextTokens(e,t){try{l(`Calculating context tokens from transcript: ${e}`);try{if(!readFileSync(e,"utf-8"))return l("Transcript file is empty"),null}catch{return l("Could not read transcript file"),null}let n=await D(e);if(n.length===0)return l("No entries in transcript"),null;let r=null;for(let s=n.length-1;s>=0;s--){let i=n[s];if(i&&i.message?.usage?.input_tokens&&i.isSidechain!==!0){r=i,l(`Context segment: Found most recent entry at ${i.timestamp.toISOString()}, stopping search`);break}}if(r?.message?.usage){let s=r.message.usage,i=(s.input_tokens||0)+(s.cache_read_input_tokens||0)+(s.cache_creation_input_tokens||0),a=t?this.getContextLimit(t):2e5;l(`Most recent main chain context: ${i} tokens (limit: ${a})`);let c=Math.min(100,Math.max(0,Math.round(i/a*100))),u=Math.round(a*.75),g=Math.min(100,Math.max(0,Math.round(i/u*100))),m=Math.max(0,100-g);return {inputTokens:i,percentage:c,usablePercentage:g,contextLeftPercentage:m,maxTokens:a,usableTokens:u}}return l("No main chain entries with usage data found"),null}catch(n){return l(`Error reading transcript: ${n instanceof Error?n.message:String(n)}`),null}}};var M=class{async loadTranscriptEntries(e){try{let t=await W(e);if(!t)return l(`No transcript found for session: ${e}`),[];l(`Loading transcript from: ${t}`);let r=(await readFile(t,"utf-8")).trim().split(`
6
- `).filter(i=>i.trim()),s=[];for(let i of r)try{let a=JSON.parse(i);if(a.isSidechain===!0)continue;s.push(a);}catch(a){l(`Failed to parse JSONL line: ${a}`);continue}return l(`Loaded ${s.length} transcript entries`),s}catch(t){return l(`Error loading transcript for ${e}:`,t),[]}}calculateMessageCount(e){return e.filter(t=>{let n=t.type||t.message?.role||t.message?.type,r=t.type==="user"&&t.message?.content?.[0]?.type==="tool_result";return n==="user"&&!r}).length}calculateLastResponseTime(e){if(e.length===0)return null;let t=e.slice(-20),n=null,r=null;for(let s of t)if(s.timestamp)try{let i=new Date(s.timestamp),a=s.type||s.message?.role||s.message?.type,c=s.type==="user"&&s.message?.content?.[0]?.type==="tool_result";if(a==="user"&&!c)n=i;else if(a==="assistant"&&n){let g=(i.getTime()-n.getTime())/1e3;g>.1&&g<300&&(r=g);}}catch{continue}return r}async getMetricsInfo(e,t){try{if(l(`Getting metrics from hook data for session: ${e}`),!t.cost)return l("No cost data available in hook data"),{responseTime:null,lastResponseTime:null,sessionDuration:null,messageCount:null,linesAdded:null,linesRemoved:null};let n=await this.loadTranscriptEntries(e),r=this.calculateMessageCount(n),s=this.calculateLastResponseTime(n);return {responseTime:t.cost.total_api_duration_ms/1e3,lastResponseTime:s,sessionDuration:t.cost.total_duration_ms/1e3,messageCount:r,linesAdded:t.cost.total_lines_added,linesRemoved:t.cost.total_lines_removed}}catch(n){return l(`Error getting metrics from hook data for session ${e}:`,n),{responseTime:null,lastResponseTime:null,sessionDuration:null,messageCount:null,linesAdded:null,linesRemoved:null}}}};function q(o){return o===null?"$0.00":o<.01?"<$0.01":`$${o.toFixed(2)}`}function E(o){return o===null||o===0?"0 tokens":o>=1e6?`${(o/1e6).toFixed(1)}M tokens`:o>=1e3?`${(o/1e3).toFixed(1)}K tokens`:`${o} tokens`}function De(o){if(!o)return "0 tokens";let e=[];if(o.input>0&&e.push(`${E(o.input).replace(" tokens","")}in`),o.output>0&&e.push(`${E(o.output).replace(" tokens","")}out`),o.cacheCreation>0||o.cacheRead>0){let t=o.cacheCreation+o.cacheRead;e.push(`${E(t).replace(" tokens","")}cached`);}return e.length>0?e.join(" + "):"0 tokens"}function Ae(o){return o<60?`${o}s`:o<3600?`${Math.floor(o/60)}m`:o<86400?`${Math.floor(o/3600)}h`:o<604800?`${Math.floor(o/86400)}d`:`${Math.floor(o/604800)}w`}function Ue(o){return o<60?`${o.toFixed(0)}s`:o<3600?`${(o/60).toFixed(0)}m`:o<86400?`${(o/3600).toFixed(1)}h`:`${(o/86400).toFixed(1)}d`}function dt(o,e){return !e||e<=0||o<0?null:Math.min(100,o/e*100)}function ge(o,e,t=80){let n=dt(o,e);if(n===null)return {percentage:null,isWarning:false,displayText:""};let r=`${n.toFixed(0)}%`,s=n>=t,i="";return s?i=` !${r}`:n>=50?i=` +${r}`:i=` ${r}`,{percentage:n,isWarning:s,displayText:i}}var F=class{constructor(e,t){this.config=e;this.symbols=t;}renderDirectory(e,t,n){let r=e.workspace?.current_dir||e.cwd||"/",s=e.workspace?.project_dir;if(n?.showBasename)return {text:_.basename(r)||"root",bgColor:t.modeBg,fgColor:t.modeFg};let i=process.env.HOME||process.env.USERPROFILE,a=r,c=s;return i&&(r.startsWith(i)&&(a=r.replace(i,"~")),s&&s.startsWith(i)&&(c=s.replace(i,"~"))),{text:this.getDisplayDirectoryName(a,c),bgColor:t.modeBg,fgColor:t.modeFg}}renderGit(e,t,n){if(!e)return null;let r=[];if(n?.showRepoName&&e.repoName&&(r.push(e.repoName),e.isWorktree&&r.push(this.symbols.git_worktree)),n?.showOperation&&e.operation&&r.push(`[${e.operation}]`),r.push(`${this.symbols.branch} ${e.branch}`),n?.showTag&&e.tag&&r.push(`${this.symbols.git_tag} ${e.tag}`),n?.showSha&&e.sha&&r.push(`${this.symbols.git_sha} ${e.sha}`),n?.showAheadBehind!==false&&(e.ahead>0&&e.behind>0?r.push(`${this.symbols.git_ahead}${e.ahead}${this.symbols.git_behind}${e.behind}`):e.ahead>0?r.push(`${this.symbols.git_ahead}${e.ahead}`):e.behind>0&&r.push(`${this.symbols.git_behind}${e.behind}`)),n?.showWorkingTree){let i=[];e.staged&&e.staged>0&&i.push(`+${e.staged}`),e.unstaged&&e.unstaged>0&&i.push(`~${e.unstaged}`),e.untracked&&e.untracked>0&&i.push(`?${e.untracked}`),e.conflicts&&e.conflicts>0&&i.push(`!${e.conflicts}`),i.length>0&&r.push(`(${i.join(" ")})`);}if(n?.showUpstream&&e.upstream&&r.push(`${this.symbols.git_upstream}${e.upstream}`),n?.showStashCount&&e.stashCount&&e.stashCount>0&&r.push(`${this.symbols.git_stash} ${e.stashCount}`),n?.showTimeSinceCommit&&e.timeSinceCommit!==void 0){let i=Ae(e.timeSinceCommit);r.push(`${this.symbols.git_time} ${i}`);}let s=this.symbols.git_clean;return e.status==="conflicts"?s=this.symbols.git_conflicts:e.status==="dirty"&&(s=this.symbols.git_dirty),r.push(s),{text:r.join(" "),bgColor:t.gitBg,fgColor:t.gitFg}}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){let r=n?.type||"cost",s=n?.costSource,i=this.config.budget?.session,a=()=>s==="calculated"?e.session.calculatedCost:s==="official"?e.session.officialCost:e.session.cost,c=this.formatUsageWithBudget(a(),e.session.tokens,e.session.tokenBreakdown,r,i?.amount,i?.warningThreshold||80,i?.type);return {text:`${this.symbols.session_cost} ${c}`,bgColor:t.sessionBg,fgColor:t.sessionFg}}renderTmux(e,t){return e?{text:`tmux:${e}`,bgColor:t.tmuxBg,fgColor:t.tmuxFg}:{text:"tmux:none",bgColor:t.tmuxBg,fgColor:t.tmuxFg}}renderContext(e,t,n){if(!e)return {text:`${this.symbols.context_time} 0 (100%)`,bgColor:t.contextBg,fgColor:t.contextFg};let r=`${e.contextLeftPercentage}%`;return {text:n?.showPercentageOnly?`${this.symbols.context_time} ${r}`:`${this.symbols.context_time} ${e.inputTokens.toLocaleString()} (${r})`,bgColor:t.contextBg,fgColor:t.contextFg}}renderMetrics(e,t,n,r){if(!e)return {text:`${this.symbols.metrics_response} new`,bgColor:t.metricsBg,fgColor:t.metricsFg};let s=[];if(r?.showLastResponseTime&&e.lastResponseTime!==null){let i=e.lastResponseTime<60?`${e.lastResponseTime.toFixed(1)}s`:`${(e.lastResponseTime/60).toFixed(1)}m`;s.push(`${this.symbols.metrics_last_response} ${i}`);}if(r?.showResponseTime!==false&&e.responseTime!==null){let i=e.responseTime<60?`${e.responseTime.toFixed(1)}s`:`${(e.responseTime/60).toFixed(1)}m`;s.push(`${this.symbols.metrics_response} ${i}`);}if(r?.showDuration!==false&&e.sessionDuration!==null){let i=Ue(e.sessionDuration);s.push(`${this.symbols.metrics_duration} ${i}`);}return r?.showMessageCount!==false&&e.messageCount!==null&&s.push(`${this.symbols.metrics_messages} ${e.messageCount}`),r?.showLinesAdded!==false&&e.linesAdded!==null&&e.linesAdded>0&&s.push(`${this.symbols.metrics_lines_added} ${e.linesAdded}`),r?.showLinesRemoved!==false&&e.linesRemoved!==null&&e.linesRemoved>0&&s.push(`${this.symbols.metrics_lines_removed} ${e.linesRemoved}`),s.length===0?{text:`${this.symbols.metrics_response} active`,bgColor:t.metricsBg,fgColor:t.metricsFg}:{text:s.join(" "),bgColor:t.metricsBg,fgColor:t.metricsFg}}renderBlock(e,t,n){let r;if(e.cost===null&&e.tokens===null)r="No active block";else {let s=n?.type||"cost",i=n?.burnType,a=this.config.budget?.block,c=e.timeRemaining!==null?(()=>{let m=Math.floor(e.timeRemaining/60),f=e.timeRemaining%60;return m>0?`${m}h ${f}m`:`${f}m`})():null,u;switch(s){case "cost":u=this.formatUsageWithBudget(e.cost,null,null,"cost",a?.amount,a?.warningThreshold,a?.type);break;case "tokens":u=this.formatUsageWithBudget(null,e.tokens,null,"tokens",a?.amount,a?.warningThreshold,a?.type);break;case "weighted":let m=a?.type==="tokens"?a.amount:void 0,f=E(e.weightedTokens);if(m&&e.weightedTokens!==null){let d=ge(e.weightedTokens,m,a?.warningThreshold||80);u=`${f}${d.displayText}`;}else u=`${f} (weighted)`;break;case "both":u=this.formatUsageWithBudget(e.cost,e.tokens,null,"both",a?.amount,a?.warningThreshold,a?.type);break;case "time":u=c||"N/A";break;default:u=this.formatUsageWithBudget(e.cost,null,null,"cost",a?.amount,a?.warningThreshold,a?.type);}let g="";if(i&&i!=="none")switch(i){case "cost":g=` | ${e.burnRate!==null?e.burnRate<1?`${(e.burnRate*100).toFixed(0)}\xA2/h`:`$${e.burnRate.toFixed(2)}/h`:"N/A"}`;break;case "tokens":g=` | ${e.tokenBurnRate!==null?`${E(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",h=e.tokenBurnRate!==null?`${E(Math.round(e.tokenBurnRate))}/h`:"N/A";g=` | ${d} / ${h}`;break}s==="time"?r=u:r=c?`${u}${g} (${c} left)`:`${u}${g}`;}return {text:`${this.symbols.block_cost} ${r}`,bgColor:t.blockBg,fgColor:t.blockFg}}renderToday(e,t,n="cost"){let r=this.config.budget?.today;return {text:`${this.symbols.today_cost} ${this.formatUsageWithBudget(e.cost,e.tokens,e.tokenBreakdown,n,r?.amount,r?.warningThreshold,r?.type)}`,bgColor:t.todayBg,fgColor:t.todayFg}}getDisplayDirectoryName(e,t){return e.startsWith("~")?e:t&&t!==e?e.startsWith(t)?e.slice(t.length+1)||_.basename(t)||"project":_.basename(e)||"root":_.basename(e)||"root"}formatUsageDisplay(e,t,n,r){switch(r){case "cost":return q(e);case "tokens":return E(t);case "both":return `${q(e)} (${E(t)})`;case "breakdown":return De(n);default:return q(e)}}formatUsageWithBudget(e,t,n,r,s,i=80,a){let c=this.formatUsageDisplay(e,t,n,r);if(s&&s>0){let u=null;if(a==="tokens"&&t!==null?u=t:(a==="cost"&&e!==null||!a&&e!==null)&&(u=e),u!==null){let g=ge(u,s,i);return c+g.displayText}}return c}renderVersion(e,t,n){return e.version?{text:`${this.symbols.version} v${e.version}`,bgColor:t.versionBg,fgColor:t.versionFg}:null}};function ht(o){return o.includes("opus")?5:(o.includes("sonnet")||o.includes("haiku"),1)}function pt(o){return {timestamp:o.timestamp,usage:{inputTokens:o.message?.usage?.input_tokens||0,outputTokens:o.message?.usage?.output_tokens||0,cacheCreationInputTokens:o.message?.usage?.cache_creation_input_tokens||0,cacheReadInputTokens:o.message?.usage?.cache_read_input_tokens||0},costUSD:o.costUSD||0,model:o.message?.model||"unknown"}}var X=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=[],r=[...e].sort((a,c)=>a.timestamp.getTime()-c.timestamp.getTime()),s=null,i=[];for(let a of r){let c=a.timestamp;if(s==null)s=this.floorToHour(c),i=[a];else {let u=c.getTime()-s.getTime(),g=i[i.length-1];if(g==null)continue;let m=g.timestamp,f=c.getTime()-m.getTime();u>t||f>t?(n.push(i),s=this.floorToHour(c),i=[a]):i.push(a);}}return s!=null&&i.length>0&&n.push(i),n}createBlockInfo(e,t){let n=new Date,r=this.sessionDurationHours*60*60*1e3,s=new Date(e.getTime()+r),i=t[t.length-1],a=i!=null?i.timestamp:e,c=n.getTime()-a.getTime()<r&&n<s;return {block:t,isActive:c}}findActiveBlock(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if(!n||n.length===0)continue;let r=n[0];if(!r)continue;let s=this.floorToHour(r.timestamp),i=this.createBlockInfo(s,n);if(i.isActive)return i.block}return null}async loadUsageEntries(){try{l("Block segment: Loading entries for dynamic session blocks");let e=new Date;e.setDate(e.getDate()-1);let n=await V(void 0,(c,u)=>u>=e,!0),r=[];for(let c of n)if(c.message?.usage){let u=pt(c);!u.costUSD&&c.raw&&(u.costUSD=await P.calculateCostForEntry(c.raw)),r.push(u);}let s=this.identifySessionBlocks(r);l(`Block segment: Found ${s.length} session blocks`);let i=this.findActiveBlock(s),a=[];if(i&&i.length>0){l(`Block segment: Found active block with ${i.length} entries`);let c=i[0],u=i[i.length-1];c&&u&&l(`Block segment: Active block from ${c.timestamp.toISOString()} to ${u.timestamp.toISOString()}`),a=i;}else l("Block segment: No active block found"),a=[];return a}catch(e){return l("Error loading block entries:",e),[]}}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,weightedTokens:null,timeRemaining:null,burnRate:null,tokenBurnRate:null};let t=e.reduce((u,g)=>u+g.costUSD,0),n=e.reduce((u,g)=>u+g.usage.inputTokens+g.usage.outputTokens+g.usage.cacheCreationInputTokens+g.usage.cacheReadInputTokens,0),r=e.reduce((u,g)=>{let m=g.usage.inputTokens+g.usage.outputTokens+g.usage.cacheCreationInputTokens+g.usage.cacheReadInputTokens,f=ht(g.model);return u+m*f},0),s=new Date,i=null;if(e.length>0){let u=e[0];if(u){let g=this.sessionDurationHours*60*60*1e3,m=this.floorToHour(u.timestamp),f=new Date(m.getTime()+g);i=Math.max(0,Math.round((f.getTime()-s.getTime())/(1e3*60)));}}let a=null,c=null;if(e.length>=1&&(t>0||n>0)){let u=e.map(f=>f.timestamp).sort((f,d)=>f.getTime()-d.getTime()),g=u[0],m=u[u.length-1];if(g&&m){let f=(m.getTime()-g.getTime())/6e4;f>0&&(t>0&&(a=t/f*60),n>0&&(c=n/f*60));}}return l(`Block segment: $${t.toFixed(2)}, ${n} tokens, ${i}m remaining, burn rate: ${a?"$"+a.toFixed(2)+"/hr":"N/A"}`),{cost:t,tokens:n,weightedTokens:r,timeRemaining:i,burnRate:a,tokenBurnRate:c}}catch(e){return l("Error getting active block info:",e),{cost:null,tokens:null,weightedTokens:null,timeRemaining:null,burnRate:null,tokenBurnRate:null}}}};function L(o){let e=o.getFullYear(),t=String(o.getMonth()+1).padStart(2,"0"),n=String(o.getDate()).padStart(2,"0");return `${e}-${t}-${n}`}function bt(o){return o.inputTokens+o.outputTokens+o.cacheCreationInputTokens+o.cacheReadInputTokens}function yt(o){return {timestamp:o.timestamp,usage:{inputTokens:o.message?.usage?.input_tokens||0,outputTokens:o.message?.usage?.output_tokens||0,cacheCreationInputTokens:o.message?.usage?.cache_creation_input_tokens||0,cacheReadInputTokens:o.message?.usage?.cache_read_input_tokens||0},costUSD:o.costUSD||0,model:o.message?.model||"unknown"}}var K=class{async loadTodayEntries(){let t=L(new Date);l(`Today segment: Loading entries for date ${t}`);let n=await v.getLatestTranscriptMtime(),r=await v.getUsageCache("today",n);if(r)return l("Using shared today usage cache"),r;let s=new Date;s.setDate(s.getDate()-1),s.setHours(0,0,0,0);let i=(f,d)=>d>=s,a=new Date;a.setHours(0,0,0,0);let u=await V(f=>f.timestamp>=a,i,true),g=[],m=0;for(let f of u)if(L(f.timestamp)===t&&f.message?.usage){let h=yt(f);!h.costUSD&&f.raw&&(h.costUSD=await P.calculateCostForEntry(f.raw)),g.push(h),m++;}return l(`Today segment: Found ${m} entries for today (${t})`),await v.setUsageCache("today",g,n),g}async getTodayEntries(){try{return await this.loadTodayEntries()}catch(e){return l("Error loading today's entries:",e),[]}}async getTodayInfo(){try{let e=await this.getTodayEntries();if(e.length===0)return {cost:null,tokens:null,tokenBreakdown:null,date:L(new Date)};let t=e.reduce((s,i)=>s+i.costUSD,0),n=e.reduce((s,i)=>s+bt(i.usage),0),r=e.reduce((s,i)=>({input:s.input+i.usage.inputTokens,output:s.output+i.usage.outputTokens,cacheCreation:s.cacheCreation+i.usage.cacheCreationInputTokens,cacheRead:s.cacheRead+i.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:r,date:L(new Date)}}catch(e){return l("Error getting today's info:",e),{cost:null,tokens:null,tokenBreakdown:null,date:L(new Date)}}}};var Me="\x1B[0m",Fe={right:"\uE0B0",left_rounded:"\uE0B6",right_rounded:"\uE0B4",branch:"\u2387",model:"\u2731",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_lines_added:"+",metrics_lines_removed:"-",metrics_burn:"\u27E2",version:"\u25C8"},Le={right:"\uE0B0",left_rounded:"\uE0B6",right_rounded:"\uE0B4",branch:"~",model:"M",git_clean:"=",git_dirty:"*",git_conflicts:"!",git_ahead:"^",git_behind:"v",git_worktree:"W",git_tag:"T",git_sha:"#",git_upstream:">>",git_stash:"S",git_time:"@",session_cost:"$",block_cost:"B",today_cost:"D",context_time:"C",metrics_response:"R",metrics_last_response:"L",metrics_duration:"T",metrics_messages:"#",metrics_lines_added:"+",metrics_lines_removed:"-",metrics_burn:"~/h",version:"v"};var Ct="\x1B",_t=new RegExp(`${Ct}\\[[0-9;]*m`,"g"),wt=/^[a-zA-Z0-9/]+$/;function St(){if(process.platform==="win32")return null;let o=process.pid.toString();for(let e=0;e<10;e++)try{let n=execSync(`ps -o ppid=,tty= -p ${o}`,{encoding:"utf8",stdio:["pipe","pipe","ignore"]}).trim().split(/\s+/),r=n[0],s=n[1];if(s&&s!=="?"&&s!=="??"&&wt.test(s))return s;if(!r||r==="1"||r==="0")break;o=r;}catch{break}return null}function kt(){try{let e=execSync("mode con",{encoding:"utf8",stdio:["pipe","pipe","ignore"],windowsHide:!0}).match(/Columns:\s*(\d+)/i);if(e?.[1]){let t=parseInt(e[1],10);if(!isNaN(t)&&t>0)return t}}catch{}return null}function Tt(){let o=St();if(o)try{let t=execSync(`stty size < /dev/${o}`,{encoding:"utf8",stdio:["pipe","pipe","ignore"],shell:"/bin/sh"}).trim().split(" ")[1];if(t){let n=parseInt(t,10);if(!isNaN(n)&&n>0)return n}}catch{}try{let e=execSync("tput cols 2>/dev/null",{encoding:"utf8",stdio:["pipe","pipe","ignore"]}).trim(),t=parseInt(e,10);if(!isNaN(t)&&t>0)return t}catch{}return null}function Ie(){let o=process.env.COLUMNS;if(o){let e=parseInt(o,10);if(!isNaN(e)&&e>0)return e}return process.stdout.columns&&process.stdout.columns>0?process.stdout.columns:process.platform==="win32"?kt():Tt()}function xt(o){return o.replace(_t,"")}function Oe(o){return xt(o).length}var Q=class{constructor(e){this.config=e;this.symbols=this.initializeSymbols();}symbols;_usageProvider;_blockProvider;_todayProvider;_contextProvider;_gitService;_tmuxService;_metricsProvider;_segmentRenderer;get usageProvider(){return this._usageProvider||(this._usageProvider=new A),this._usageProvider}get blockProvider(){return this._blockProvider||(this._blockProvider=new X),this._blockProvider}get todayProvider(){return this._todayProvider||(this._todayProvider=new K),this._todayProvider}get contextProvider(){return this._contextProvider||(this._contextProvider=new U(this.config)),this._contextProvider}get gitService(){return this._gitService||(this._gitService=new R),this._gitService}get tmuxService(){return this._tmuxService||(this._tmuxService=new B),this._tmuxService}get metricsProvider(){return this._metricsProvider||(this._metricsProvider=new M),this._metricsProvider}get segmentRenderer(){return this._segmentRenderer||(this._segmentRenderer=new F(this.config,this.symbols)),this._segmentRenderer}needsSegmentInfo(e){return this.config.display.lines.some(t=>t.segments[e]?.enabled)}async generateStatusline(e){let t=this.needsSegmentInfo("session")?await this.usageProvider.getUsageInfo(e.session_id,e):null,n=this.needsSegmentInfo("block")?await this.blockProvider.getActiveBlockInfo():null,r=this.needsSegmentInfo("today")?await this.todayProvider.getTodayInfo():null,s=this.needsSegmentInfo("context")?await this.contextProvider.calculateContextTokens(e.transcript_path,e.model?.id):null,i=this.needsSegmentInfo("metrics")?await this.metricsProvider.getMetricsInfo(e.session_id,e):null;return this.config.display.autoWrap?this.generateAutoWrapStatusline(e,t,n,r,s,i):(await Promise.all(this.config.display.lines.map(c=>this.renderLine(c,e,t,n,r,s,i)))).filter(c=>c.length>0).join(`
7
- `)}async generateAutoWrapStatusline(e,t,n,r,s,i){let a=this.getThemeColors(),c=e.workspace?.current_dir||e.cwd||"/",u=Ie(),g=[];for(let m of this.config.display.lines){let f=Object.entries(m.segments).filter(([y,b])=>b?.enabled).map(([y,b])=>({type:y,config:b})),d=[];for(let y of f){let b=await this.renderSegment(y,e,t,n,r,s,i,a,c);b&&d.push({type:y.type,text:b.text,bgColor:b.bgColor,fgColor:b.fgColor});}if(d.length===0)continue;if(!u||u<=0){g.push(this.buildLineFromSegments(d,a));continue}let h=[],p=0;for(let y of d){let b=this.calculateSegmentWidth(y,h.length===0);h.length>0&&p+b>u&&(g.push(this.buildLineFromSegments(h,a)),h=[],p=0),h.push(y),p+=b;}h.length>0&&g.push(this.buildLineFromSegments(h,a));}return g.join(`
8
- `)}calculateSegmentWidth(e,t){let n=this.config.display.style==="capsule",r=Oe(e.text);if(n){let i=4+(t?0:1);return r+i}return r+3}buildLineFromSegments(e,t){let n=this.config.display.style==="capsule",r=t.reset;for(let s=0;s<e.length;s++){let i=e[s];if(!i)continue;let a=s===0,c=s===e.length-1,u=c?null:e[s+1],g=u?this.getSegmentBgColor(u.type,t):"";n&&!a&&(r+=" "),r+=this.formatSegment(i.bgColor,i.fgColor,i.text,c?void 0:g,t);}return r}async renderLine(e,t,n,r,s,i,a){let c=this.getThemeColors(),u=t.workspace?.current_dir||t.cwd||"/",g=Object.entries(e.segments).filter(([d,h])=>h?.enabled).map(([d,h])=>({type:d,config:h})),m=this.config.display.style==="capsule",f=c.reset;for(let d=0;d<g.length;d++){let h=g[d];if(!h)continue;let p=d===0,y=d===g.length-1,b=y?null:g[d+1],k=b?this.getSegmentBgColor(b.type,c):"",C=await this.renderSegment(h,t,n,r,s,i,a,c,u);C&&(m&&!p&&(f+=" "),f+=this.formatSegment(C.bgColor,C.fgColor,C.text,y?void 0:k,c));}return f}async renderSegment(e,t,n,r,s,i,a,c,u){return e.type==="directory"?this.segmentRenderer.renderDirectory(t,c,e.config):e.type==="model"?this.segmentRenderer.renderModel(t,c):e.type==="git"?await this.renderGitSegment(e.config,t,c,u):e.type==="session"?this.renderSessionSegment(e.config,n,c):e.type==="tmux"?await this.renderTmuxSegment(c):e.type==="context"?this.renderContextSegment(e.config,i,c):e.type==="metrics"?this.renderMetricsSegment(e.config,a,r,c):e.type==="block"?this.renderBlockSegment(e.config,r,c):e.type==="today"?this.renderTodaySegment(e.config,s,c):e.type==="version"?this.renderVersionSegment(e.config,t,c):null}async renderGitSegment(e,t,n,r){if(!this.needsSegmentInfo("git"))return null;let s=await this.gitService.getGitInfo(r,{showSha:e?.showSha,showWorkingTree:e?.showWorkingTree,showOperation:e?.showOperation,showTag:e?.showTag,showTimeSinceCommit:e?.showTimeSinceCommit,showStashCount:e?.showStashCount,showUpstream:e?.showUpstream,showRepoName:e?.showRepoName},t.workspace?.project_dir);return s?this.segmentRenderer.renderGit(s,n,e):null}renderSessionSegment(e,t,n){return t?this.segmentRenderer.renderSession(t,n,e):null}async renderTmuxSegment(e){if(!this.needsSegmentInfo("tmux"))return null;let t=await this.tmuxService.getSessionId();return this.segmentRenderer.renderTmux(t,e)}renderContextSegment(e,t,n){return this.needsSegmentInfo("context")?this.segmentRenderer.renderContext(t,n,e):null}renderMetricsSegment(e,t,n,r){return this.segmentRenderer.renderMetrics(t,r,n,e)}renderBlockSegment(e,t,n){return t?this.segmentRenderer.renderBlock(t,n,e):null}renderTodaySegment(e,t,n){if(!t)return null;let r=e?.type||"cost";return this.segmentRenderer.renderToday(t,n,r)}renderVersionSegment(e,t,n){return this.segmentRenderer.renderVersion(t,n,e)}initializeSymbols(){let e=this.config.display.style,t=this.config.display.charset||"unicode",n=e==="minimal",r=e==="capsule",s=t==="text"?Le:Fe;return {right:n?"":r?s.right_rounded:s.right,left:r?s.left_rounded:"",branch:s.branch,model:s.model,git_clean:s.git_clean,git_dirty:s.git_dirty,git_conflicts:s.git_conflicts,git_ahead:s.git_ahead,git_behind:s.git_behind,git_worktree:s.git_worktree,git_tag:s.git_tag,git_sha:s.git_sha,git_upstream:s.git_upstream,git_stash:s.git_stash,git_time:s.git_time,session_cost:s.session_cost,block_cost:s.block_cost,today_cost:s.today_cost,context_time:s.context_time,metrics_response:s.metrics_response,metrics_last_response:s.metrics_last_response,metrics_duration:s.metrics_duration,metrics_messages:s.metrics_messages,metrics_lines_added:s.metrics_lines_added,metrics_lines_removed:s.metrics_lines_removed,metrics_burn:s.metrics_burn,version:s.version}}getThemeColors(){let e=this.config.theme,t,n=this.config.display.colorCompatibility||"auto",r=n==="auto"?N():n;if(e==="custom"){if(t=this.config.colors?.custom,!t)throw new Error("Custom theme selected but no colors provided in configuration")}else t=j(e,r),t||(console.warn(`Built-in theme '${e}' not found, falling back to 'dark' theme`),t=j("dark",r));let s=j("dark",r),i=b=>{let k=t[b]||s[b];return r==="none"?{bg:"",fg:""}:r==="ansi"?{bg:oe(k.bg,true),fg:oe(k.fg,false)}:r==="ansi256"?{bg:se(k.bg,true),fg:se(k.fg,false)}:{bg:re(k.bg,true),fg:re(k.fg,false)}},a=i("directory"),c=i("git"),u=i("model"),g=i("session"),m=i("block"),f=i("today"),d=i("tmux"),h=i("context"),p=i("metrics"),y=i("version");return {reset:r==="none"?"":Me,modeBg:a.bg,modeFg:a.fg,gitBg:c.bg,gitFg:c.fg,modelBg:u.bg,modelFg:u.fg,sessionBg:g.bg,sessionFg:g.fg,blockBg:m.bg,blockFg:m.fg,todayBg:f.bg,todayFg:f.fg,tmuxBg:d.bg,tmuxFg:d.fg,contextBg:h.bg,contextFg:h.fg,metricsBg:p.bg,metricsFg:p.fg,versionBg:y.bg,versionFg:y.fg}}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,r,s){if(this.config.display.style==="capsule"){let m=this.config.display.colorCompatibility||"auto",d=(m==="auto"?N():m)==="ansi",h=O(e,d),p=`${h}${this.symbols.left}${s.reset}`,y=`${e}${t} ${n} ${s.reset}`,b=`${h}${this.symbols.right}${s.reset}`;return `${p}${y}${b}`}let a=`${e}${t} ${n} `,c=this.config.display.colorCompatibility||"auto",g=(c==="auto"?N():c)==="ansi";if(r){let m=O(e,g);a+=`${s.reset}${r}${m}${this.symbols.right}`;}else a+=`${s.reset}${O(e,g)}${this.symbols.right}${s.reset}`;return a}};var Ne={theme:"dark",display:{style:"minimal",charset:"unicode",colorCompatibility:"auto",autoWrap:true,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",costSource:"calculated"},today:{enabled:true,type:"cost"},block:{enabled:false,type:"cost",burnType:"cost"},version:{enabled:false},tmux:{enabled:false},context:{enabled:true,showPercentageOnly:false},metrics:{enabled:false,showResponseTime:true,showLastResponseTime:true,showDuration:true,showMessageCount:true,showLinesAdded:true,showLinesRemoved:true}}}]},budget:{session:{warningThreshold:80},today:{warningThreshold:80,amount:50},block:{warningThreshold:80,amount:15}},modelContextLimits:{default:2e5,sonnet:2e5,opus:2e5}};function me(o){return ["light","dark","nord","tokyo-night","rose-pine","custom"].includes(o)}function de(o){return o==="minimal"||o==="powerline"||o==="capsule"}function He(o){return o==="unicode"||o==="text"}function te(o,e){let t={...o};for(let n in e){let r=e[n];if(r!==void 0)if(typeof r=="object"&&r!==null&&!Array.isArray(r)){let s=t[n]||{};t[n]=te(s,r);}else t[n]=r;}return t}function vt(o,e){return o?w.existsSync(o)?o:null:[...e?[_.join(e,".claude-powerline.json")]:[],_.join(process.cwd(),".claude-powerline.json"),_.join(je.homedir(),".claude","claude-powerline.json"),_.join(je.homedir(),".config","claude-powerline","config.json")].find(w.existsSync)||null}function Et(o){try{let e=w.readFileSync(o,"utf-8");return JSON.parse(e)}catch(e){throw new Error(`Failed to load config file ${o}: ${e instanceof Error?e.message:String(e)}`)}}function Pt(){let o={},e={},t=process.env.CLAUDE_POWERLINE_THEME;t&&me(t)&&(o.theme=t);let n=process.env.CLAUDE_POWERLINE_STYLE;return n&&(de(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&&(o.display=e),o}function $t(){return process.env.CLAUDE_POWERLINE_CONFIG}function Rt(o){let e={},t={},n=o.find(i=>i.startsWith("--theme="))?.split("=")[1];n&&me(n)&&(e.theme=n);let r=o.find(i=>i.startsWith("--style="))?.split("=")[1];r&&(de(r)?t.style=r:(console.warn(`Invalid display style '${r}' from CLI argument, falling back to 'minimal'`),t.style="minimal"));let s=o.find(i=>i.startsWith("--charset="))?.split("=")[1];return s&&(He(s)?t.charset=s:(console.warn(`Invalid charset '${s}' from CLI argument, falling back to 'unicode'`),t.charset="unicode")),Object.keys(t).length>0&&(e.display=t),e}function Bt(o=process.argv,e){let t=JSON.parse(JSON.stringify(Ne)),n=o.find(a=>a.startsWith("--config="))?.split("=")[1]||$t(),r=vt(n,e);if(r)try{let a=Et(r);t=te(t,a);}catch(a){console.warn(`Warning: ${a instanceof Error?a.message:String(a)}`);}t.display?.style&&!de(t.display.style)&&(console.warn(`Invalid display style '${t.display.style}' in config file, falling back to 'minimal'`),t.display.style="minimal"),t.display?.charset&&!He(t.display.charset)&&(console.warn(`Invalid charset '${t.display.charset}' in config file, falling back to 'unicode'`),t.display.charset="unicode"),t.theme&&!me(t.theme)&&(console.warn(`Invalid theme '${t.theme}' in config file, falling back to 'dark'`),t.theme="dark");let s=Pt();t=te(t,s);let i=Rt(o);return t=te(t,i),t}var Ge=Bt;function We(){console.log(`
4
+ `),s=null,i="clean",a=0,c=0,u=0,g=0;for(let m of r)if(m){if(m.startsWith("## ")){let d=m.substring(3).split("...")[0];d&&d!=="HEAD (no branch)"&&(s=d);continue}if(m.length>=2){let f=m.charAt(0),d=m.charAt(1);if(f==="?"&&d==="?"){u++,i==="clean"&&(i="dirty");continue}let h=f+d;if(["DD","AU","UD","UA","DU","AA","UU"].includes(h)){g++,i="conflicts";continue}f!==" "&&f!=="?"&&(a++,i==="clean"&&(i="dirty")),d!==" "&&d!=="?"&&(c++,i==="clean"&&(i="dirty"));}}return {branch:s||await this.getFallbackBranch(e),status:i,workingTree:{staged:a,unstaged:c,untracked:u,conflicts:g}}}catch(t){return l(`Git status with branch command failed in ${e}:`,t),{branch:await this.getFallbackBranch(e),status:"clean"}}}async getFallbackBranch(e){try{let n=(await this.execGitAsync("git branch --show-current",{cwd:e,encoding:"utf8",timeout:2e3})).stdout.trim();if(n)return n}catch{try{let n=(await this.execGitAsync("git symbolic-ref --short HEAD",{cwd:e,encoding:"utf8",timeout:2e3})).stdout.trim();if(n)return n}catch{return null}}return null}async getAheadBehindAsync(e){try{l(`[GIT-EXEC] Running git ahead/behind in ${e}`);let[t,n]=await Promise.all([this.execGitAsync("git rev-list --count @{u}..HEAD",{cwd:e,encoding:"utf8",timeout:2e3}),this.execGitAsync("git rev-list --count HEAD..@{u}",{cwd:e,encoding:"utf8",timeout:2e3})]);return {ahead:parseInt(t.stdout.trim())||0,behind:parseInt(n.stdout.trim())||0}}catch(t){return l(`Git ahead/behind command failed in ${e}:`,t),{ahead:0,behind:0}}}};var rt=promisify(exec),A=class{async getSessionId(){try{if(!process.env.TMUX_PANE)return l("TMUX_PANE not set, not in tmux session"),null;l(`Getting tmux session ID, TMUX_PANE: ${process.env.TMUX_PANE}`);let t=(await rt("tmux display-message -p '#S'",{encoding:"utf8",timeout:1e3})).stdout.trim();return l(`Tmux session ID: ${t||"empty"}`),t||null}catch(e){return l("Error getting tmux session ID:",e),null}}isInTmux(){return !!process.env.TMUX_PANE}};function G(){let o=[],e=process.env.CLAUDE_CONFIG_DIR;if(e&&e.split(",").forEach(t=>{let n=t.trim();existsSync(n)&&o.push(n);}),o.length===0){let t=homedir(),n=join(t,".config","claude"),r=join(t,".claude");existsSync(n)?o.push(n):existsSync(r)&&o.push(r);}return o}async function W(o){let e=[];for(let t of o){let n=join(t,"projects");if(existsSync(n))try{let r=await readdir(n,{withFileTypes:!0});for(let s of r)if(s.isDirectory()){let i=posix.join(n,s.name);e.push(i);}}catch(r){l(`Failed to read projects directory ${n}:`,r);}}return e}async function V(o){let e=G(),t=await W(e);for(let n of t){let r=posix.join(n,`${o}.jsonl`);if(existsSync(r))return r}return null}async function Fe(o,e){let t=[];try{let r=(await readdir(e)).filter(s=>s.startsWith("agent-")&&s.endsWith(".jsonl"));for(let s of r){let i=posix.join(e,s);try{let c=(await readFile(i,"utf-8")).split(`
5
+ `)[0];c&&JSON.parse(c).sessionId===o&&t.push(i);}catch{l(`Failed to check agent file ${i}`);}}}catch(n){l(`Failed to read project directory ${e}:`,n);}return t}async function ue(o){try{return (await stat(o)).mtime}catch{return null}}function at(o){let e=o.message?.id||(typeof o.raw.message=="object"&&o.raw.message!==null&&"id"in o.raw.message?o.raw.message.id:void 0),t="requestId"in o.raw?o.raw.requestId:void 0;return !e||!t?null:`${e}:${t}`}var ct=1024*1024;async function R(o){try{let t=(await stat(o)).size,n;return t>ct?(l(`Using streaming parser for large file ${o} (${Math.round(t/1024)}KB)`),n=await ut(o)):n=await lt(o),l(`Parsed ${n.length} entries from ${o}`),n}catch(e){return l(`Failed to read file ${o}:`,e),[]}}async function lt(o){let t=(await readFile(o,"utf-8")).trim().split(`
6
+ `).filter(r=>r.trim()),n=[];for(let r of t)try{let s=JSON.parse(r);if(!s.timestamp)continue;let i={timestamp:new Date(s.timestamp),message:s.message,costUSD:typeof s.costUSD=="number"?s.costUSD:void 0,isSidechain:s.isSidechain===!0,raw:s};n.push(i);}catch(s){l(`Failed to parse JSONL line: ${s}`);continue}return n}async function ut(o){return new Promise((e,t)=>{let n=[],r=createReadStream(o,{encoding:"utf8"}),s=createInterface({input:r,crlfDelay:1/0});s.on("line",i=>{let a=i.trim();if(a)try{let c=JSON.parse(a);if(!c.timestamp)return;let u={timestamp:new Date(c.timestamp),message:c.message,costUSD:typeof c.costUSD=="number"?c.costUSD:void 0,isSidechain:c.isSidechain===!0,raw:c};n.push(u);}catch(c){l(`Failed to parse JSONL line: ${c}`);}}),s.on("close",()=>{e(n);}),s.on("error",i=>{l(`Streaming parser error for ${o}:`,i),t(i);}),r.on("error",i=>{l(`File stream error for ${o}:`,i),t(i);});})}async function Y(o,e,t=false){let n=G(),r=await W(n),s=new Set,i=r.map(async h=>{try{let b=(await readdir(h)).filter(C=>C.endsWith(".jsonl")).map(async C=>{let re=posix.join(h,C);if(existsSync(re)){let Xe=await ue(re);return {filePath:re,mtime:Xe}}return null});return (await Promise.all(b)).filter(C=>C?.mtime&&(!e||e(C.filePath,C.mtime)))}catch(p){return l(`Failed to read project directory ${h}:`,p),[]}}),c=(await Promise.all(i)).flat().filter(h=>h!==null);t&&c.sort((h,p)=>p.mtime.getTime()-h.mtime.getTime());let u=c.map(h=>h.filePath),g=[],m=u.map(async h=>(await R(h)).filter(y=>!o||o(y))),f=await Promise.all(m);for(let h of f)g.push(...h);g.sort((h,p)=>h.timestamp.getTime()-p.timestamp.getTime());let d=[];for(let h of g){let p=at(h);p&&s.has(p)||(p&&s.add(p),d.push(h));}return d}var v=class{static CACHE_DIR=_.join(homedir(),".claude","powerline");static USAGE_CACHE_DIR=_.join(this.CACHE_DIR,"usage");static LOCKS_DIR=_.join(this.CACHE_DIR,"locks");static isLocked(e){let t=_.join(this.LOCKS_DIR,e);if(!w.existsSync(t))return false;try{let n=w.readFileSync(t,"utf-8"),r=parseInt(n.trim(),10);if(isNaN(r))return l(`Invalid PID in lock file ${e}, removing stale lock`),w.unlinkSync(t),!1;try{return process.kill(r,0),!0}catch(s){return s.code==="ESRCH"?(l(`Removing stale lock file ${e} for dead process ${r}`),w.unlinkSync(t),!1):(l(`Error checking process ${r} for lock ${e}:`,s),!0)}}catch(n){return l(`Error reading lock file ${e}:`,n),true}}static async acquireLock(e,t=5e3){await this.ensureCacheDirectories();let s=_.join(this.LOCKS_DIR,e),i=Date.now(),a=String(process.pid);for(;Date.now()-i<t;)try{return await w.promises.writeFile(s,a,{flag:"wx"}),l(`Lock acquired for ${e}`),!0}catch(c){if(c.code==="EEXIST")await setTimeout(50);else throw c}return l(`Failed to acquire lock for ${e} within ${t}ms`),false}static async releaseLock(e){let t=_.join(this.LOCKS_DIR,e);try{await w.promises.unlink(t),l(`Lock released for ${e}`);}catch(n){n.code!=="ENOENT"&&l(`Error releasing lock for ${e}:`,n);}}static async ensureCacheDirectories(){try{await Promise.all([w.promises.mkdir(this.CACHE_DIR,{recursive:!0}),w.promises.mkdir(this.USAGE_CACHE_DIR,{recursive:!0}),w.promises.mkdir(this.LOCKS_DIR,{recursive:!0})]);}catch(e){l("Failed to create cache directories:",e);}}static createProjectHash(e){return createHash("md5").update(e).digest("hex").substring(0,8)}static async getUsageCache(e,t){let s="utf-8";await this.ensureCacheDirectories();let i=_.join(this.USAGE_CACHE_DIR,`${e}.json`),a=`${e}.usage.lock`;for(let c=0;c<3;c++){if(this.isLocked(a)){l(`Cache for ${e} is locked, waiting...`),await setTimeout(75);continue}try{let g=await w.promises.readFile(i,s),m=JSON.parse(g);return !t||m.timestamp>=t?(l(`[CACHE-HIT] ${e} disk cache: found`),this.deserializeDates(m.data)):(l(`${e} cache outdated: cache=${m.timestamp}, latest=${t}`),null)}catch(g){if(g.code==="ENOENT")return l(`No shared ${e} usage cache found`),null;let m=c+1;l(`Attempt ${m} failed to read ${e} cache: ${g.message}. Retrying...`),await setTimeout(75);}}return l(`Failed to read ${e} cache after 3 attempts.`),null}static deserializeDates(e){return Array.isArray(e)?e.map(t=>({...t,timestamp:new Date(t.timestamp)})):e}static async setUsageCache(e,t,n){let r=`${e}.usage.lock`;if(!await this.acquireLock(r)){l(`Could not acquire lock to set usage cache for ${e}`);return}try{await this.ensureCacheDirectories();let i=_.join(this.USAGE_CACHE_DIR,`${e}.json`),a=n||Date.now(),u=JSON.stringify({data:t,timestamp:a});await w.promises.writeFile(i,u,"utf-8"),l(`[CACHE-SET] ${e} disk cache stored`);}catch(i){l(`Failed to save ${e} usage cache:`,i);}finally{await this.releaseLock(r);}}static async getLatestTranscriptMtime(){try{let e=G(),t=await W(e),n=0;for(let r of t)try{let i=(await w.promises.readdir(r)).filter(a=>a.endsWith(".jsonl"));for(let a of i){let c=_.join(r,a),u=await ue(c);u&&u.getTime()>n&&(n=u.getTime());}}catch(s){l(`Failed to read project directory ${r}:`,s);continue}return n}catch(e){return l("Failed to get latest transcript mtime:",e),Date.now()}}};var J={"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-haiku-4-5-20251001":{name:"Claude Haiku 4.5",input:1,output:5,cache_write_5m:1.25,cache_write_1h:2,cache_read:.1},"claude-haiku-4-5":{name:"Claude Haiku 4.5",input:1,output:5,cache_write_5m:1.25,cache_write_1h:2,cache_read:.1},"claude-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-sonnet-4-5":{name:"Claude Sonnet 4.5",input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"claude-sonnet-4-5-20250929":{name:"Claude Sonnet 4.5",input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"claude-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}},P=class{static executionCache=null;static modelPricingCache=new Map;static GITHUB_PRICING_URL="https://raw.githubusercontent.com/Owloops/claude-powerline/main/pricing.json";static async loadDiskCache(){let t=Date.now()-864e5;return await v.getUsageCache("pricing",t)}static async saveDiskCache(e){await v.setUsageCache("pricing",e);}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},r=>{if(r.statusCode!==200){l(`HTTP ${r.statusCode}: ${r.statusMessage}`),e(null);return}let s="",i=0,a=1024*1024;r.on("data",c=>{if(i+=c.length,i>a){l("Response too large"),n.destroy(),e(null);return}s+=c;}),r.on("end",()=>{try{let u=JSON.parse(s),g=u._meta,m={};for(let[f,d]of Object.entries(u))f!=="_meta"&&(m[f]=d);this.validatePricingData(m)?(l(`Fetched fresh pricing from GitHub for ${Object.keys(m).length} models`),l(`Pricing last updated: ${g?.updated||"unknown"}`),e(m)):(l("Invalid pricing data structure"),e(null));}catch(c){l("Failed to parse JSON:",c),e(null);}}),r.on("error",c=>{l("Response error:",c),e(null);});});n.on("error",r=>{l("Request error:",r),e(null);}),n.on("timeout",()=>{l("Request timeout"),n.destroy(),e(null);}),n.end();})}static async getCurrentPricing(){if(this.executionCache!==null)return l(`[CACHE-HIT] Pricing execution cache: ${Object.keys(this.executionCache).length} models`),this.executionCache;let e=await this.loadDiskCache();if(e)return l(`[CACHE-HIT] Pricing disk cache: ${Object.keys(e).length} models`),this.executionCache=e,l(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(e).length} models`),e;let t=await this.fetchPricingData();return t?(await this.saveDiskCache(t),l(`[CACHE-SET] Pricing disk cache stored: ${Object.keys(t).length} models`),this.executionCache=t,l(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(t).length} models`),t):(l(`[CACHE-FALLBACK] Using offline pricing data: ${Object.keys(J).length} models`),this.executionCache=J,l(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(J).length} models`),J)}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){if(this.modelPricingCache.has(e))return l(`[CACHE-HIT] Model pricing cache: ${e}`),this.modelPricingCache.get(e);let t=await this.getCurrentPricing(),n;return t[e]?n=t[e]:n=this.fuzzyMatchModel(e,t),this.modelPricingCache.set(e,n),l(`[CACHE-SET] Model pricing cache: ${e}`),n}static fuzzyMatchModel(e,t){let n=e.toLowerCase();for(let[s,i]of Object.entries(t))if(s.toLowerCase()===n)return i;let r=[{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.5","4-5-sonnet","sonnet-4-5"],fallback:"claude-sonnet-4-5-20250929"},{pattern:["sonnet-4","claude-sonnet-4"],fallback:"claude-sonnet-4-20250514"},{pattern:["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:["haiku-4.5","4-5-haiku","haiku-4-5"],fallback:"claude-haiku-4-5-20251001"},{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:s,fallback:i}of r)if(s.some(a=>n.includes(a))&&t[i])return t[i];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 r=this.extractModelId(e),s=await this.getModelPricing(r),i=n.input_tokens||0,a=n.output_tokens||0,c=n.cache_creation_input_tokens||0,u=n.cache_read_input_tokens||0,g=i/1e6*s.input,m=a/1e6*s.output,f=u/1e6*s.cache_read,d=c/1e6*s.cache_write_5m;return g+m+d+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 pt(o){return {timestamp:o.timestamp.toISOString(),message:{usage:{input_tokens:o.message?.usage?.input_tokens||0,output_tokens:o.message?.usage?.output_tokens||0,cache_creation_input_tokens:o.message?.usage?.cache_creation_input_tokens,cache_read_input_tokens:o.message?.usage?.cache_read_input_tokens}},costUSD:o.costUSD}}var q=class{async getSessionUsage(e){try{let t=await V(e);if(!t)return l(`No transcript found for session: ${e}`),null;l(`Found transcript at: ${t}`);let n=await R(t),r=dirname(t),s=await Fe(e,r);l(`Found ${s.length} agent transcripts for session`);for(let c of s){let u=await R(c);n.push(...u);}if(n.length===0)return {totalCost:0,entries:[]};let i=[],a=0;for(let c of n)if(c.message?.usage){let u=pt(c);if(u.costUSD!==void 0)a+=u.costUSD;else {let g=await P.calculateCostForEntry(c.raw);u.costUSD=g,a+=g;}i.push(u);}return l(`Parsed ${i.length} usage entries, total cost: $${a.toFixed(4)}`),{totalCost:a,entries:i}}catch(t){return l(`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,t){let n=await this.getSessionUsage(e);if(!n||n.entries.length===0)return {cost:null,calculatedCost:null,officialCost:null,tokens:null,tokenBreakdown:null};let r=this.calculateTokenBreakdown(n.entries),s=r.input+r.output+r.cacheCreation+r.cacheRead,i=n.totalCost,a=t?.cost?.total_cost_usd??null;return {cost:i??a,calculatedCost:i,officialCost:a,tokens:s,tokenBreakdown:r}}},D=class{sessionProvider=new q;async getUsageInfo(e,t){try{return l(`Starting usage info retrieval for session: ${e}`),{session:await this.sessionProvider.getSessionInfo(e,t)}}catch(n){return l(`Error getting usage info for session ${e}:`,n),{session:{cost:null,calculatedCost:null,officialCost:null,tokens:null,tokenBreakdown:null}}}}};var U=class{thresholds={LOW:50,MEDIUM:80};config;constructor(e){this.config=e;}getContextUsageThresholds(){return this.thresholds}getContextLimit(e){let t=this.config.modelContextLimits||{default:2e5},n=this.getModelType(e);return t[n]||t.default||2e5}getModelType(e){let t=e.toLowerCase();return t.includes("sonnet")?"sonnet":t.includes("opus")?"opus":"default"}async calculateContextTokens(e,t){try{l(`Calculating context tokens from transcript: ${e}`);try{if(!readFileSync(e,"utf-8"))return l("Transcript file is empty"),null}catch{return l("Could not read transcript file"),null}let n=await R(e);if(n.length===0)return l("No entries in transcript"),null;let r=null;for(let s=n.length-1;s>=0;s--){let i=n[s];if(i&&i.message?.usage?.input_tokens&&i.isSidechain!==!0){r=i,l(`Context segment: Found most recent entry at ${i.timestamp.toISOString()}, stopping search`);break}}if(r?.message?.usage){let s=r.message.usage,i=(s.input_tokens||0)+(s.cache_read_input_tokens||0)+(s.cache_creation_input_tokens||0),a=t?this.getContextLimit(t):2e5;l(`Most recent main chain context: ${i} tokens (limit: ${a})`);let c=Math.min(100,Math.max(0,Math.round(i/a*100))),u=Math.round(a*.75),g=Math.min(100,Math.max(0,Math.round(i/u*100))),m=Math.max(0,100-g);return {inputTokens:i,percentage:c,usablePercentage:g,contextLeftPercentage:m,maxTokens:a,usableTokens:u}}return l("No main chain entries with usage data found"),null}catch(n){return l(`Error reading transcript: ${n instanceof Error?n.message:String(n)}`),null}}};var M=class{async loadTranscriptEntries(e){try{let t=await V(e);if(!t)return l(`No transcript found for session: ${e}`),[];l(`Loading transcript from: ${t}`);let r=(await readFile(t,"utf-8")).trim().split(`
7
+ `).filter(i=>i.trim()),s=[];for(let i of r)try{let a=JSON.parse(i);if(a.isSidechain===!0)continue;s.push(a);}catch(a){l(`Failed to parse JSONL line: ${a}`);continue}return l(`Loaded ${s.length} transcript entries`),s}catch(t){return l(`Error loading transcript for ${e}:`,t),[]}}calculateMessageCount(e){return e.filter(t=>{let n=t.type||t.message?.role||t.message?.type,r=t.type==="user"&&t.message?.content?.[0]?.type==="tool_result";return n==="user"&&!r}).length}calculateLastResponseTime(e){if(e.length===0)return null;let t=e.slice(-20),n=null,r=null;for(let s of t)if(s.timestamp)try{let i=new Date(s.timestamp),a=s.type||s.message?.role||s.message?.type,c=s.type==="user"&&s.message?.content?.[0]?.type==="tool_result";if(a==="user"&&!c)n=i;else if(a==="assistant"&&n){let g=(i.getTime()-n.getTime())/1e3;g>.1&&g<300&&(r=g);}}catch{continue}return r}async getMetricsInfo(e,t){try{if(l(`Getting metrics from hook data for session: ${e}`),!t.cost)return l("No cost data available in hook data"),{responseTime:null,lastResponseTime:null,sessionDuration:null,messageCount:null,linesAdded:null,linesRemoved:null};let n=await this.loadTranscriptEntries(e),r=this.calculateMessageCount(n),s=this.calculateLastResponseTime(n);return {responseTime:t.cost.total_api_duration_ms/1e3,lastResponseTime:s,sessionDuration:t.cost.total_duration_ms/1e3,messageCount:r,linesAdded:t.cost.total_lines_added,linesRemoved:t.cost.total_lines_removed}}catch(n){return l(`Error getting metrics from hook data for session ${e}:`,n),{responseTime:null,lastResponseTime:null,sessionDuration:null,messageCount:null,linesAdded:null,linesRemoved:null}}}};function z(o){return o===null?"$0.00":o<.01?"<$0.01":`$${o.toFixed(2)}`}function E(o){return o===null||o===0?"0 tokens":o>=1e6?`${(o/1e6).toFixed(1)}M tokens`:o>=1e3?`${(o/1e3).toFixed(1)}K tokens`:`${o} tokens`}function Le(o){if(!o)return "0 tokens";let e=[];if(o.input>0&&e.push(`${E(o.input).replace(" tokens","")}in`),o.output>0&&e.push(`${E(o.output).replace(" tokens","")}out`),o.cacheCreation>0||o.cacheRead>0){let t=o.cacheCreation+o.cacheRead;e.push(`${E(t).replace(" tokens","")}cached`);}return e.length>0?e.join(" + "):"0 tokens"}function Ie(o){return o<60?`${o}s`:o<3600?`${Math.floor(o/60)}m`:o<86400?`${Math.floor(o/3600)}h`:o<604800?`${Math.floor(o/86400)}d`:`${Math.floor(o/604800)}w`}function Oe(o){return o<60?`${o.toFixed(0)}s`:o<3600?`${(o/60).toFixed(0)}m`:o<86400?`${(o/3600).toFixed(1)}h`:`${(o/86400).toFixed(1)}d`}function Ct(o,e){return !e||e<=0||o<0?null:Math.min(100,o/e*100)}function fe(o,e,t=80){let n=Ct(o,e);if(n===null)return {percentage:null,isWarning:false,displayText:""};let r=`${n.toFixed(0)}%`,s=n>=t,i="";return s?i=` !${r}`:n>=50?i=` +${r}`:i=` ${r}`,{percentage:n,isWarning:s,displayText:i}}var F=class{constructor(e,t){this.config=e;this.symbols=t;}renderDirectory(e,t,n){let r=e.workspace?.current_dir||e.cwd||"/",s=e.workspace?.project_dir;if(n?.showBasename)return {text:_.basename(r)||"root",bgColor:t.modeBg,fgColor:t.modeFg};let i=process.env.HOME||process.env.USERPROFILE,a=r,c=s;return i&&(r.startsWith(i)&&(a=r.replace(i,"~")),s&&s.startsWith(i)&&(c=s.replace(i,"~"))),{text:this.getDisplayDirectoryName(a,c),bgColor:t.modeBg,fgColor:t.modeFg}}renderGit(e,t,n){if(!e)return null;let r=[];if(n?.showRepoName&&e.repoName&&(r.push(e.repoName),e.isWorktree&&r.push(this.symbols.git_worktree)),n?.showOperation&&e.operation&&r.push(`[${e.operation}]`),r.push(`${this.symbols.branch} ${e.branch}`),n?.showTag&&e.tag&&r.push(`${this.symbols.git_tag} ${e.tag}`),n?.showSha&&e.sha&&r.push(`${this.symbols.git_sha} ${e.sha}`),n?.showAheadBehind!==false&&(e.ahead>0&&e.behind>0?r.push(`${this.symbols.git_ahead}${e.ahead}${this.symbols.git_behind}${e.behind}`):e.ahead>0?r.push(`${this.symbols.git_ahead}${e.ahead}`):e.behind>0&&r.push(`${this.symbols.git_behind}${e.behind}`)),n?.showWorkingTree){let i=[];e.staged&&e.staged>0&&i.push(`+${e.staged}`),e.unstaged&&e.unstaged>0&&i.push(`~${e.unstaged}`),e.untracked&&e.untracked>0&&i.push(`?${e.untracked}`),e.conflicts&&e.conflicts>0&&i.push(`!${e.conflicts}`),i.length>0&&r.push(`(${i.join(" ")})`);}if(n?.showUpstream&&e.upstream&&r.push(`${this.symbols.git_upstream}${e.upstream}`),n?.showStashCount&&e.stashCount&&e.stashCount>0&&r.push(`${this.symbols.git_stash} ${e.stashCount}`),n?.showTimeSinceCommit&&e.timeSinceCommit!==void 0){let i=Ie(e.timeSinceCommit);r.push(`${this.symbols.git_time} ${i}`);}let s=this.symbols.git_clean;return e.status==="conflicts"?s=this.symbols.git_conflicts:e.status==="dirty"&&(s=this.symbols.git_dirty),r.push(s),{text:r.join(" "),bgColor:t.gitBg,fgColor:t.gitFg}}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){let r=n?.type||"cost",s=n?.costSource,i=this.config.budget?.session,a=()=>s==="calculated"?e.session.calculatedCost:s==="official"?e.session.officialCost:e.session.cost,c=this.formatUsageWithBudget(a(),e.session.tokens,e.session.tokenBreakdown,r,i?.amount,i?.warningThreshold||80,i?.type);return {text:`${this.symbols.session_cost} ${c}`,bgColor:t.sessionBg,fgColor:t.sessionFg}}renderTmux(e,t){return e?{text:`tmux:${e}`,bgColor:t.tmuxBg,fgColor:t.tmuxFg}:{text:"tmux:none",bgColor:t.tmuxBg,fgColor:t.tmuxFg}}renderContext(e,t,n){if(!e)return {text:`${this.symbols.context_time} 0 (100%)`,bgColor:t.contextBg,fgColor:t.contextFg};let r=`${e.contextLeftPercentage}%`;return {text:n?.showPercentageOnly?`${this.symbols.context_time} ${r}`:`${this.symbols.context_time} ${e.inputTokens.toLocaleString()} (${r})`,bgColor:t.contextBg,fgColor:t.contextFg}}renderMetrics(e,t,n,r){if(!e)return {text:`${this.symbols.metrics_response} new`,bgColor:t.metricsBg,fgColor:t.metricsFg};let s=[];if(r?.showLastResponseTime&&e.lastResponseTime!==null){let i=e.lastResponseTime<60?`${e.lastResponseTime.toFixed(1)}s`:`${(e.lastResponseTime/60).toFixed(1)}m`;s.push(`${this.symbols.metrics_last_response} ${i}`);}if(r?.showResponseTime!==false&&e.responseTime!==null){let i=e.responseTime<60?`${e.responseTime.toFixed(1)}s`:`${(e.responseTime/60).toFixed(1)}m`;s.push(`${this.symbols.metrics_response} ${i}`);}if(r?.showDuration!==false&&e.sessionDuration!==null){let i=Oe(e.sessionDuration);s.push(`${this.symbols.metrics_duration} ${i}`);}return r?.showMessageCount!==false&&e.messageCount!==null&&s.push(`${this.symbols.metrics_messages} ${e.messageCount}`),r?.showLinesAdded!==false&&e.linesAdded!==null&&e.linesAdded>0&&s.push(`${this.symbols.metrics_lines_added} ${e.linesAdded}`),r?.showLinesRemoved!==false&&e.linesRemoved!==null&&e.linesRemoved>0&&s.push(`${this.symbols.metrics_lines_removed} ${e.linesRemoved}`),s.length===0?{text:`${this.symbols.metrics_response} active`,bgColor:t.metricsBg,fgColor:t.metricsFg}:{text:s.join(" "),bgColor:t.metricsBg,fgColor:t.metricsFg}}renderBlock(e,t,n){let r;if(e.cost===null&&e.tokens===null)r="No active block";else {let s=n?.type||"cost",i=n?.burnType,a=this.config.budget?.block,c=e.timeRemaining!==null?(()=>{let m=Math.floor(e.timeRemaining/60),f=e.timeRemaining%60;return m>0?`${m}h ${f}m`:`${f}m`})():null,u;switch(s){case "cost":u=this.formatUsageWithBudget(e.cost,null,null,"cost",a?.amount,a?.warningThreshold,a?.type);break;case "tokens":u=this.formatUsageWithBudget(null,e.tokens,null,"tokens",a?.amount,a?.warningThreshold,a?.type);break;case "weighted":let m=a?.type==="tokens"?a.amount:void 0,f=E(e.weightedTokens);if(m&&e.weightedTokens!==null){let d=fe(e.weightedTokens,m,a?.warningThreshold||80);u=`${f}${d.displayText}`;}else u=`${f} (weighted)`;break;case "both":u=this.formatUsageWithBudget(e.cost,e.tokens,null,"both",a?.amount,a?.warningThreshold,a?.type);break;case "time":u=c||"N/A";break;default:u=this.formatUsageWithBudget(e.cost,null,null,"cost",a?.amount,a?.warningThreshold,a?.type);}let g="";if(i&&i!=="none")switch(i){case "cost":g=` | ${e.burnRate!==null?e.burnRate<1?`${(e.burnRate*100).toFixed(0)}\xA2/h`:`$${e.burnRate.toFixed(2)}/h`:"N/A"}`;break;case "tokens":g=` | ${e.tokenBurnRate!==null?`${E(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",h=e.tokenBurnRate!==null?`${E(Math.round(e.tokenBurnRate))}/h`:"N/A";g=` | ${d} / ${h}`;break}s==="time"?r=u:r=c?`${u}${g} (${c} left)`:`${u}${g}`;}return {text:`${this.symbols.block_cost} ${r}`,bgColor:t.blockBg,fgColor:t.blockFg}}renderToday(e,t,n="cost"){let r=this.config.budget?.today;return {text:`${this.symbols.today_cost} ${this.formatUsageWithBudget(e.cost,e.tokens,e.tokenBreakdown,n,r?.amount,r?.warningThreshold,r?.type)}`,bgColor:t.todayBg,fgColor:t.todayFg}}getDisplayDirectoryName(e,t){return e.startsWith("~")?e:t&&t!==e?e.startsWith(t)?e.slice(t.length+1)||_.basename(t)||"project":_.basename(e)||"root":_.basename(e)||"root"}formatUsageDisplay(e,t,n,r){switch(r){case "cost":return z(e);case "tokens":return E(t);case "both":return `${z(e)} (${E(t)})`;case "breakdown":return Le(n);default:return z(e)}}formatUsageWithBudget(e,t,n,r,s,i=80,a){let c=this.formatUsageDisplay(e,t,n,r);if(s&&s>0){let u=null;if(a==="tokens"&&t!==null?u=t:(a==="cost"&&e!==null||!a&&e!==null)&&(u=e),u!==null){let g=fe(u,s,i);return c+g.displayText}}return c}renderVersion(e,t,n){return e.version?{text:`${this.symbols.version} v${e.version}`,bgColor:t.versionBg,fgColor:t.versionFg}:null}};function _t(o){return o.includes("opus")?5:(o.includes("sonnet")||o.includes("haiku"),1)}function wt(o){return {timestamp:o.timestamp,usage:{inputTokens:o.message?.usage?.input_tokens||0,outputTokens:o.message?.usage?.output_tokens||0,cacheCreationInputTokens:o.message?.usage?.cache_creation_input_tokens||0,cacheReadInputTokens:o.message?.usage?.cache_read_input_tokens||0},costUSD:o.costUSD||0,model:o.message?.model||"unknown"}}var K=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=[],r=[...e].sort((a,c)=>a.timestamp.getTime()-c.timestamp.getTime()),s=null,i=[];for(let a of r){let c=a.timestamp;if(s==null)s=this.floorToHour(c),i=[a];else {let u=c.getTime()-s.getTime(),g=i[i.length-1];if(g==null)continue;let m=g.timestamp,f=c.getTime()-m.getTime();u>t||f>t?(n.push(i),s=this.floorToHour(c),i=[a]):i.push(a);}}return s!=null&&i.length>0&&n.push(i),n}createBlockInfo(e,t){let n=new Date,r=this.sessionDurationHours*60*60*1e3,s=new Date(e.getTime()+r),i=t[t.length-1],a=i!=null?i.timestamp:e,c=n.getTime()-a.getTime()<r&&n<s;return {block:t,isActive:c}}findActiveBlock(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if(!n||n.length===0)continue;let r=n[0];if(!r)continue;let s=this.floorToHour(r.timestamp),i=this.createBlockInfo(s,n);if(i.isActive)return i.block}return null}async loadUsageEntries(){try{l("Block segment: Loading entries for dynamic session blocks");let e=new Date;e.setDate(e.getDate()-1);let n=await Y(void 0,(c,u)=>u>=e,!0),r=[];for(let c of n)if(c.message?.usage){let u=wt(c);!u.costUSD&&c.raw&&(u.costUSD=await P.calculateCostForEntry(c.raw)),r.push(u);}let s=this.identifySessionBlocks(r);l(`Block segment: Found ${s.length} session blocks`);let i=this.findActiveBlock(s),a=[];if(i&&i.length>0){l(`Block segment: Found active block with ${i.length} entries`);let c=i[0],u=i[i.length-1];c&&u&&l(`Block segment: Active block from ${c.timestamp.toISOString()} to ${u.timestamp.toISOString()}`),a=i;}else l("Block segment: No active block found"),a=[];return a}catch(e){return l("Error loading block entries:",e),[]}}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,weightedTokens:null,timeRemaining:null,burnRate:null,tokenBurnRate:null};let t=e.reduce((u,g)=>u+g.costUSD,0),n=e.reduce((u,g)=>u+g.usage.inputTokens+g.usage.outputTokens+g.usage.cacheCreationInputTokens+g.usage.cacheReadInputTokens,0),r=e.reduce((u,g)=>{let m=g.usage.inputTokens+g.usage.outputTokens+g.usage.cacheCreationInputTokens+g.usage.cacheReadInputTokens,f=_t(g.model);return u+m*f},0),s=new Date,i=null;if(e.length>0){let u=e[0];if(u){let g=this.sessionDurationHours*60*60*1e3,m=this.floorToHour(u.timestamp),f=new Date(m.getTime()+g);i=Math.max(0,Math.round((f.getTime()-s.getTime())/(1e3*60)));}}let a=null,c=null;if(e.length>=1&&(t>0||n>0)){let u=e.map(f=>f.timestamp).sort((f,d)=>f.getTime()-d.getTime()),g=u[0],m=u[u.length-1];if(g&&m){let f=(m.getTime()-g.getTime())/6e4;f>0&&(t>0&&(a=t/f*60),n>0&&(c=n/f*60));}}return l(`Block segment: $${t.toFixed(2)}, ${n} tokens, ${i}m remaining, burn rate: ${a?"$"+a.toFixed(2)+"/hr":"N/A"}`),{cost:t,tokens:n,weightedTokens:r,timeRemaining:i,burnRate:a,tokenBurnRate:c}}catch(e){return l("Error getting active block info:",e),{cost:null,tokens:null,weightedTokens:null,timeRemaining:null,burnRate:null,tokenBurnRate:null}}}};function L(o){let e=o.getFullYear(),t=String(o.getMonth()+1).padStart(2,"0"),n=String(o.getDate()).padStart(2,"0");return `${e}-${t}-${n}`}function St(o){return o.inputTokens+o.outputTokens+o.cacheCreationInputTokens+o.cacheReadInputTokens}function Tt(o){return {timestamp:o.timestamp,usage:{inputTokens:o.message?.usage?.input_tokens||0,outputTokens:o.message?.usage?.output_tokens||0,cacheCreationInputTokens:o.message?.usage?.cache_creation_input_tokens||0,cacheReadInputTokens:o.message?.usage?.cache_read_input_tokens||0},costUSD:o.costUSD||0,model:o.message?.model||"unknown"}}var Z=class{async loadTodayEntries(){let t=L(new Date);l(`Today segment: Loading entries for date ${t}`);let n=await v.getLatestTranscriptMtime(),r=await v.getUsageCache("today",n);if(r)return l("Using shared today usage cache"),r;let s=new Date;s.setDate(s.getDate()-1),s.setHours(0,0,0,0);let i=(f,d)=>d>=s,a=new Date;a.setHours(0,0,0,0);let u=await Y(f=>f.timestamp>=a,i,true),g=[],m=0;for(let f of u)if(L(f.timestamp)===t&&f.message?.usage){let h=Tt(f);!h.costUSD&&f.raw&&(h.costUSD=await P.calculateCostForEntry(f.raw)),g.push(h),m++;}return l(`Today segment: Found ${m} entries for today (${t})`),await v.setUsageCache("today",g,n),g}async getTodayEntries(){try{return await this.loadTodayEntries()}catch(e){return l("Error loading today's entries:",e),[]}}async getTodayInfo(){try{let e=await this.getTodayEntries();if(e.length===0)return {cost:null,tokens:null,tokenBreakdown:null,date:L(new Date)};let t=e.reduce((s,i)=>s+i.costUSD,0),n=e.reduce((s,i)=>s+St(i.usage),0),r=e.reduce((s,i)=>({input:s.input+i.usage.inputTokens,output:s.output+i.usage.outputTokens,cacheCreation:s.cacheCreation+i.usage.cacheCreationInputTokens,cacheRead:s.cacheRead+i.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:r,date:L(new Date)}}catch(e){return l("Error getting today's info:",e),{cost:null,tokens:null,tokenBreakdown:null,date:L(new Date)}}}};var Ne="\x1B[0m",je={right:"\uE0B0",left_rounded:"\uE0B6",right_rounded:"\uE0B4",branch:"\u2387",model:"\u2731",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_lines_added:"+",metrics_lines_removed:"-",metrics_burn:"\u27E2",version:"\u25C8"},He={right:"\uE0B0",left_rounded:"\uE0B6",right_rounded:"\uE0B4",branch:"~",model:"M",git_clean:"=",git_dirty:"*",git_conflicts:"!",git_ahead:"^",git_behind:"v",git_worktree:"W",git_tag:"T",git_sha:"#",git_upstream:">>",git_stash:"S",git_time:"@",session_cost:"$",block_cost:"B",today_cost:"D",context_time:"C",metrics_response:"R",metrics_last_response:"L",metrics_duration:"T",metrics_messages:"#",metrics_lines_added:"+",metrics_lines_removed:"-",metrics_burn:"~/h",version:"v"};var kt="\x1B",xt=new RegExp(`${kt}\\[[0-9;]*m`,"g"),vt=/^[a-zA-Z0-9/]+$/;function Et(){if(process.platform==="win32")return null;let o=process.pid.toString();for(let e=0;e<10;e++)try{let n=execSync(`ps -o ppid=,tty= -p ${o}`,{encoding:"utf8",stdio:["pipe","pipe","ignore"]}).trim().split(/\s+/),r=n[0],s=n[1];if(s&&s!=="?"&&s!=="??"&&vt.test(s))return s;if(!r||r==="1"||r==="0")break;o=r;}catch{break}return null}function Pt(){try{let e=execSync("mode con",{encoding:"utf8",stdio:["pipe","pipe","ignore"],windowsHide:!0}).match(/Columns:\s*(\d+)/i);if(e?.[1]){let t=parseInt(e[1],10);if(!isNaN(t)&&t>0)return t}}catch{}return null}function $t(){let o=Et();if(o)try{let t=execSync(`stty size < /dev/${o}`,{encoding:"utf8",stdio:["pipe","pipe","ignore"],shell:"/bin/sh"}).trim().split(" ")[1];if(t){let n=parseInt(t,10);if(!isNaN(n)&&n>0)return n}}catch{}try{let e=execSync("tput cols 2>/dev/null",{encoding:"utf8",stdio:["pipe","pipe","ignore"]}).trim(),t=parseInt(e,10);if(!isNaN(t)&&t>0)return t}catch{}return null}function Ge(){let o=process.env.COLUMNS;if(o){let e=parseInt(o,10);if(!isNaN(e)&&e>0)return e}return process.stdout.columns&&process.stdout.columns>0?process.stdout.columns:process.platform==="win32"?Pt():$t()}function Rt(o){return o.replace(xt,"")}function We(o){return Rt(o).length}var ee=class{constructor(e){this.config=e;this.symbols=this.initializeSymbols();}symbols;_usageProvider;_blockProvider;_todayProvider;_contextProvider;_gitService;_tmuxService;_metricsProvider;_segmentRenderer;get usageProvider(){return this._usageProvider||(this._usageProvider=new D),this._usageProvider}get blockProvider(){return this._blockProvider||(this._blockProvider=new K),this._blockProvider}get todayProvider(){return this._todayProvider||(this._todayProvider=new Z),this._todayProvider}get contextProvider(){return this._contextProvider||(this._contextProvider=new U(this.config)),this._contextProvider}get gitService(){return this._gitService||(this._gitService=new B),this._gitService}get tmuxService(){return this._tmuxService||(this._tmuxService=new A),this._tmuxService}get metricsProvider(){return this._metricsProvider||(this._metricsProvider=new M),this._metricsProvider}get segmentRenderer(){return this._segmentRenderer||(this._segmentRenderer=new F(this.config,this.symbols)),this._segmentRenderer}needsSegmentInfo(e){return this.config.display.lines.some(t=>t.segments[e]?.enabled)}async generateStatusline(e){let t=this.needsSegmentInfo("session")?await this.usageProvider.getUsageInfo(e.session_id,e):null,n=this.needsSegmentInfo("block")?await this.blockProvider.getActiveBlockInfo():null,r=this.needsSegmentInfo("today")?await this.todayProvider.getTodayInfo():null,s=this.needsSegmentInfo("context")?await this.contextProvider.calculateContextTokens(e.transcript_path,e.model?.id):null,i=this.needsSegmentInfo("metrics")?await this.metricsProvider.getMetricsInfo(e.session_id,e):null;return this.config.display.autoWrap?this.generateAutoWrapStatusline(e,t,n,r,s,i):(await Promise.all(this.config.display.lines.map(c=>this.renderLine(c,e,t,n,r,s,i)))).filter(c=>c.length>0).join(`
8
+ `)}async generateAutoWrapStatusline(e,t,n,r,s,i){let a=this.getThemeColors(),c=e.workspace?.current_dir||e.cwd||"/",u=Ge(),g=[];for(let m of this.config.display.lines){let f=Object.entries(m.segments).filter(([y,b])=>b?.enabled).map(([y,b])=>({type:y,config:b})),d=[];for(let y of f){let b=await this.renderSegment(y,e,t,n,r,s,i,a,c);b&&d.push({type:y.type,text:b.text,bgColor:b.bgColor,fgColor:b.fgColor});}if(d.length===0)continue;if(!u||u<=0){g.push(this.buildLineFromSegments(d,a));continue}let h=[],p=0;for(let y of d){let b=this.calculateSegmentWidth(y,h.length===0);h.length>0&&p+b>u&&(g.push(this.buildLineFromSegments(h,a)),h=[],p=0),h.push(y),p+=b;}h.length>0&&g.push(this.buildLineFromSegments(h,a));}return g.join(`
9
+ `)}calculateSegmentWidth(e,t){let n=this.config.display.style==="capsule",r=We(e.text);if(n){let i=4+(t?0:1);return r+i}return r+3}buildLineFromSegments(e,t){let n=this.config.display.style==="capsule",r=t.reset;for(let s=0;s<e.length;s++){let i=e[s];if(!i)continue;let a=s===0,c=s===e.length-1,u=c?null:e[s+1],g=u?this.getSegmentBgColor(u.type,t):"";n&&!a&&(r+=" "),r+=this.formatSegment(i.bgColor,i.fgColor,i.text,c?void 0:g,t);}return r}async renderLine(e,t,n,r,s,i,a){let c=this.getThemeColors(),u=t.workspace?.current_dir||t.cwd||"/",g=Object.entries(e.segments).filter(([d,h])=>h?.enabled).map(([d,h])=>({type:d,config:h})),m=this.config.display.style==="capsule",f=c.reset;for(let d=0;d<g.length;d++){let h=g[d];if(!h)continue;let p=d===0,y=d===g.length-1,b=y?null:g[d+1],T=b?this.getSegmentBgColor(b.type,c):"",C=await this.renderSegment(h,t,n,r,s,i,a,c,u);C&&(m&&!p&&(f+=" "),f+=this.formatSegment(C.bgColor,C.fgColor,C.text,y?void 0:T,c));}return f}async renderSegment(e,t,n,r,s,i,a,c,u){return e.type==="directory"?this.segmentRenderer.renderDirectory(t,c,e.config):e.type==="model"?this.segmentRenderer.renderModel(t,c):e.type==="git"?await this.renderGitSegment(e.config,t,c,u):e.type==="session"?this.renderSessionSegment(e.config,n,c):e.type==="tmux"?await this.renderTmuxSegment(c):e.type==="context"?this.renderContextSegment(e.config,i,c):e.type==="metrics"?this.renderMetricsSegment(e.config,a,r,c):e.type==="block"?this.renderBlockSegment(e.config,r,c):e.type==="today"?this.renderTodaySegment(e.config,s,c):e.type==="version"?this.renderVersionSegment(e.config,t,c):null}async renderGitSegment(e,t,n,r){if(!this.needsSegmentInfo("git"))return null;let s=await this.gitService.getGitInfo(r,{showSha:e?.showSha,showWorkingTree:e?.showWorkingTree,showOperation:e?.showOperation,showTag:e?.showTag,showTimeSinceCommit:e?.showTimeSinceCommit,showStashCount:e?.showStashCount,showUpstream:e?.showUpstream,showRepoName:e?.showRepoName},t.workspace?.project_dir);return s?this.segmentRenderer.renderGit(s,n,e):null}renderSessionSegment(e,t,n){return t?this.segmentRenderer.renderSession(t,n,e):null}async renderTmuxSegment(e){if(!this.needsSegmentInfo("tmux"))return null;let t=await this.tmuxService.getSessionId();return this.segmentRenderer.renderTmux(t,e)}renderContextSegment(e,t,n){return this.needsSegmentInfo("context")?this.segmentRenderer.renderContext(t,n,e):null}renderMetricsSegment(e,t,n,r){return this.segmentRenderer.renderMetrics(t,r,n,e)}renderBlockSegment(e,t,n){return t?this.segmentRenderer.renderBlock(t,n,e):null}renderTodaySegment(e,t,n){if(!t)return null;let r=e?.type||"cost";return this.segmentRenderer.renderToday(t,n,r)}renderVersionSegment(e,t,n){return this.segmentRenderer.renderVersion(t,n,e)}initializeSymbols(){let e=this.config.display.style,t=this.config.display.charset||"unicode",n=e==="minimal",r=e==="capsule",s=t==="text"?He:je;return {right:n?"":r?s.right_rounded:s.right,left:r?s.left_rounded:"",branch:s.branch,model:s.model,git_clean:s.git_clean,git_dirty:s.git_dirty,git_conflicts:s.git_conflicts,git_ahead:s.git_ahead,git_behind:s.git_behind,git_worktree:s.git_worktree,git_tag:s.git_tag,git_sha:s.git_sha,git_upstream:s.git_upstream,git_stash:s.git_stash,git_time:s.git_time,session_cost:s.session_cost,block_cost:s.block_cost,today_cost:s.today_cost,context_time:s.context_time,metrics_response:s.metrics_response,metrics_last_response:s.metrics_last_response,metrics_duration:s.metrics_duration,metrics_messages:s.metrics_messages,metrics_lines_added:s.metrics_lines_added,metrics_lines_removed:s.metrics_lines_removed,metrics_burn:s.metrics_burn,version:s.version}}getThemeColors(){let e=this.config.theme,t,n=this.config.display.colorCompatibility||"auto",r=n==="auto"?N():n;if(e==="custom"){if(t=this.config.colors?.custom,!t)throw new Error("Custom theme selected but no colors provided in configuration")}else t=j(e,r),t||(console.warn(`Built-in theme '${e}' not found, falling back to 'dark' theme`),t=j("dark",r));let s=j("dark",r),i=b=>{let T=t[b]||s[b];return r==="none"?{bg:"",fg:""}:r==="ansi"?{bg:ie(T.bg,true),fg:ie(T.fg,false)}:r==="ansi256"?{bg:oe(T.bg,true),fg:oe(T.fg,false)}:{bg:se(T.bg,true),fg:se(T.fg,false)}},a=i("directory"),c=i("git"),u=i("model"),g=i("session"),m=i("block"),f=i("today"),d=i("tmux"),h=i("context"),p=i("metrics"),y=i("version");return {reset:r==="none"?"":Ne,modeBg:a.bg,modeFg:a.fg,gitBg:c.bg,gitFg:c.fg,modelBg:u.bg,modelFg:u.fg,sessionBg:g.bg,sessionFg:g.fg,blockBg:m.bg,blockFg:m.fg,todayBg:f.bg,todayFg:f.fg,tmuxBg:d.bg,tmuxFg:d.fg,contextBg:h.bg,contextFg:h.fg,metricsBg:p.bg,metricsFg:p.fg,versionBg:y.bg,versionFg:y.fg}}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,r,s){if(this.config.display.style==="capsule"){let m=this.config.display.colorCompatibility||"auto",d=(m==="auto"?N():m)==="ansi",h=O(e,d),p=`${h}${this.symbols.left}${s.reset}`,y=`${e}${t} ${n} ${s.reset}`,b=`${h}${this.symbols.right}${s.reset}`;return `${p}${y}${b}`}let a=`${e}${t} ${n} `,c=this.config.display.colorCompatibility||"auto",g=(c==="auto"?N():c)==="ansi";if(r){let m=O(e,g);a+=`${s.reset}${r}${m}${this.symbols.right}`;}else a+=`${s.reset}${O(e,g)}${this.symbols.right}${s.reset}`;return a}};var Ve={theme:"dark",display:{style:"minimal",charset:"unicode",colorCompatibility:"auto",autoWrap:true,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",costSource:"calculated"},today:{enabled:true,type:"cost"},block:{enabled:false,type:"cost",burnType:"cost"},version:{enabled:false},tmux:{enabled:false},context:{enabled:true,showPercentageOnly:false},metrics:{enabled:false,showResponseTime:true,showLastResponseTime:true,showDuration:true,showMessageCount:true,showLinesAdded:true,showLinesRemoved:true}}}]},budget:{session:{warningThreshold:80},today:{warningThreshold:80,amount:50},block:{warningThreshold:80,amount:15}},modelContextLimits:{default:2e5,sonnet:2e5,opus:2e5}};function de(o){return ["light","dark","nord","tokyo-night","rose-pine","gruvbox","custom"].includes(o)}function he(o){return o==="minimal"||o==="powerline"||o==="capsule"}function Je(o){return o==="unicode"||o==="text"}function ne(o,e){let t={...o};for(let n in e){let r=e[n];if(r!==void 0)if(typeof r=="object"&&r!==null&&!Array.isArray(r)){let s=t[n]||{};t[n]=ne(s,r);}else t[n]=r;}return t}function Bt(o,e){return o?w.existsSync(o)?o:null:[...e?[_.join(e,".claude-powerline.json")]:[],_.join(process.cwd(),".claude-powerline.json"),_.join(Ye.homedir(),".claude","claude-powerline.json"),_.join(Ye.homedir(),".config","claude-powerline","config.json")].find(w.existsSync)||null}function At(o){try{let e=w.readFileSync(o,"utf-8");return JSON.parse(e)}catch(e){throw new Error(`Failed to load config file ${o}: ${e instanceof Error?e.message:String(e)}`)}}function Dt(){let o={},e={},t=process.env.CLAUDE_POWERLINE_THEME;t&&de(t)&&(o.theme=t);let n=process.env.CLAUDE_POWERLINE_STYLE;return n&&(he(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&&(o.display=e),o}function Ut(){return process.env.CLAUDE_POWERLINE_CONFIG}function Mt(o){let e={},t={},n=o.find(i=>i.startsWith("--theme="))?.split("=")[1];n&&de(n)&&(e.theme=n);let r=o.find(i=>i.startsWith("--style="))?.split("=")[1];r&&(he(r)?t.style=r:(console.warn(`Invalid display style '${r}' from CLI argument, falling back to 'minimal'`),t.style="minimal"));let s=o.find(i=>i.startsWith("--charset="))?.split("=")[1];return s&&(Je(s)?t.charset=s:(console.warn(`Invalid charset '${s}' from CLI argument, falling back to 'unicode'`),t.charset="unicode")),Object.keys(t).length>0&&(e.display=t),e}function Ft(o=process.argv,e){let t=JSON.parse(JSON.stringify(Ve)),n=o.find(a=>a.startsWith("--config="))?.split("=")[1]||Ut(),r=Bt(n,e);if(r)try{let a=At(r);t=ne(t,a);}catch(a){console.warn(`Warning: ${a instanceof Error?a.message:String(a)}`);}t.display?.style&&!he(t.display.style)&&(console.warn(`Invalid display style '${t.display.style}' in config file, falling back to 'minimal'`),t.display.style="minimal"),t.display?.charset&&!Je(t.display.charset)&&(console.warn(`Invalid charset '${t.display.charset}' in config file, falling back to 'unicode'`),t.display.charset="unicode"),t.theme&&!de(t.theme)&&(console.warn(`Invalid theme '${t.theme}' in config file, falling back to 'dark'`),t.theme="dark");let s=Dt();t=ne(t,s);let i=Mt(o);return t=ne(t,i),t}var qe=Ft;function ze(){console.log(`
9
10
  claude-powerline - Beautiful powerline statusline for Claude Code
10
11
 
11
12
  Usage: claude-powerline [options]
@@ -24,7 +25,7 @@ Claude Code Options (for settings.json):
24
25
 
25
26
  See example config at: https://github.com/Owloops/claude-powerline/blob/main/.claude-powerline.json
26
27
 
27
- `);}async function At(){try{(S.argv.includes("--help")||S.argv.includes("-h"))&&(We(),S.exit(0)),S.stdin.isTTY===!0&&(console.error(`Error: This tool requires input from Claude Code
28
+ `);}async function It(){try{(S.argv.includes("--help")||S.argv.includes("-h"))&&(ze(),S.exit(0)),S.stdin.isTTY===!0&&(console.error(`Error: This tool requires input from Claude Code
28
29
 
29
30
  claude-powerline is designed to be used as a Claude Code statusLine command.
30
31
  It reads hook data from stdin and outputs formatted statusline.
@@ -40,4 +41,4 @@ Add to ~/.claude/settings.json:
40
41
  Run with --help for more options.
41
42
 
42
43
  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`),S.exit(1)),l(`Working directory: ${S.cwd()}`),l("Process args:",S.argv);let e=await json(S.stdin);l("Received hook data:",JSON.stringify(e,null,2)),e||(console.error("Error: No input data received from stdin"),We(),S.exit(1));let t=e.workspace?.project_dir,n=Ge(S.argv,t),s=await new Q(n).generateStatusline(e);console.log(s);}catch(o){let e=o instanceof Error?o.message:String(o);console.error("Error generating statusline:",e),S.exit(1);}}At();
44
+ echo '{"session_id":"test-session","workspace":{"project_dir":"/path/to/project"},"model":{"id":"claude-3-5-sonnet","display_name":"Claude"}}' | claude-powerline --style=powerline`),S.exit(1)),l(`Working directory: ${S.cwd()}`),l("Process args:",S.argv);let e=await json(S.stdin);l("Received hook data:",JSON.stringify(e,null,2)),e||(console.error("Error: No input data received from stdin"),ze(),S.exit(1));let t=e.workspace?.project_dir,n=qe(S.argv,t),s=await new ee(n).generateStatusline(e);console.log(s);}catch(o){let e=o instanceof Error?o.message:String(o);console.error("Error generating statusline:",e),S.exit(1);}}It();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@owloops/claude-powerline",
3
- "version": "1.10.0",
3
+ "version": "1.11.0",
4
4
  "description": "Beautiful vim-style powerline statusline for Claude Code with real-time usage tracking, git integration, and custom themes",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",