@owloops/claude-powerline 1.1.13 → 1.2.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.
package/README.md CHANGED
@@ -100,6 +100,13 @@ npx -y @owloops/claude-powerline --install-fonts
100
100
  > [!NOTE]
101
101
  > Using `npx` automatically downloads and runs the latest version, ensuring you always have the newest features and fixes without manual updates.
102
102
 
103
+ **Start a Claude session:** It appears at the bottom during conversations.
104
+
105
+ ![Claude Code with powerline](images/claude-interface-with-powerline.png)
106
+
107
+ > [!TIP]
108
+ > The statusline shows your **current directory name** (not "claude powerline") and updates with live usage data during Claude conversations.
109
+
103
110
  ## Usage
104
111
 
105
112
  ```bash
package/dist/index.js CHANGED
@@ -2,8 +2,8 @@
2
2
 
3
3
  // src/index.ts
4
4
  import process2 from "process";
5
- import path2 from "path";
6
- import fs2 from "fs";
5
+ import path3 from "path";
6
+ import fs3 from "fs";
7
7
  import { execSync as execSync3 } from "child_process";
8
8
  import os2 from "os";
9
9
  import { json } from "stream/consumers";
@@ -99,6 +99,15 @@ import {
99
99
  } from "ccusage/data-loader";
100
100
  import { calculateTotals, getTotalTokens } from "ccusage/calculate-cost";
101
101
  import { logger } from "ccusage/logger";
102
+
103
+ // src/lib/logger.ts
104
+ var debug = (message, ...args) => {
105
+ if (process.env.CLAUDE_POWERLINE_DEBUG) {
106
+ console.error(`[DEBUG] ${message}`, ...args);
107
+ }
108
+ };
109
+
110
+ // src/lib/usage-provider.ts
102
111
  var UsageProvider = class {
103
112
  async getSessionBlockInfo() {
104
113
  const originalLevel = logger.level;
@@ -141,7 +150,9 @@ var UsageProvider = class {
141
150
  logger.level = 0;
142
151
  try {
143
152
  const claudePaths = getClaudePaths();
153
+ debug(`Found ${claudePaths.length} Claude paths:`, claudePaths);
144
154
  if (claudePaths.length === 0) {
155
+ debug(`No Claude paths found, returning empty usage data`);
145
156
  return {
146
157
  session: { cost: null, tokens: null, tokenBreakdown: null },
147
158
  daily: { cost: 0, tokens: 0, tokenBreakdown: null }
@@ -166,10 +177,12 @@ var UsageProvider = class {
166
177
  }
167
178
  async getSessionData(sessionId) {
168
179
  try {
180
+ debug(`Loading session data for ID: ${sessionId}`);
169
181
  const sessionData = await loadSessionUsageById(sessionId, {
170
182
  mode: "auto"
171
183
  });
172
184
  if (!sessionData) {
185
+ debug(`No session data found for ID: ${sessionId}`);
173
186
  return { cost: null, tokens: null, tokenBreakdown: null };
174
187
  }
175
188
  const breakdown = sessionData.entries.reduce(
@@ -190,7 +203,8 @@ var UsageProvider = class {
190
203
  tokens: totalTokens,
191
204
  tokenBreakdown: breakdown
192
205
  };
193
- } catch {
206
+ } catch (error) {
207
+ debug(`Error loading session data for ID ${sessionId}:`, error);
194
208
  return { cost: null, tokens: null, tokenBreakdown: null };
195
209
  }
196
210
  }
@@ -198,6 +212,7 @@ var UsageProvider = class {
198
212
  try {
199
213
  const today = /* @__PURE__ */ new Date();
200
214
  const todayStr = today.toISOString().split("T")[0]?.replace(/-/g, "") ?? "";
215
+ debug(`Loading daily data for date: ${todayStr}`);
201
216
  const dailyData = await loadDailyUsageData({
202
217
  since: todayStr,
203
218
  until: todayStr,
@@ -223,7 +238,8 @@ var UsageProvider = class {
223
238
  tokens: getTotalTokens(totals),
224
239
  tokenBreakdown: breakdown
225
240
  };
226
- } catch {
241
+ } catch (error) {
242
+ debug(`Error loading daily usage data:`, error);
227
243
  return { cost: 0, tokens: 0, tokenBreakdown: null };
228
244
  }
229
245
  }
@@ -231,8 +247,26 @@ var UsageProvider = class {
231
247
 
232
248
  // src/lib/git-service.ts
233
249
  import { execSync } from "child_process";
250
+ import fs from "fs";
251
+ import path from "path";
234
252
  var GitService = class {
253
+ isGitRepo(workingDir) {
254
+ try {
255
+ return fs.existsSync(path.join(workingDir, ".git"));
256
+ } catch {
257
+ return false;
258
+ }
259
+ }
235
260
  getGitInfo(workingDir, showSha = false) {
261
+ if (!this.isGitRepo(workingDir)) {
262
+ return {
263
+ branch: "detached",
264
+ status: "clean",
265
+ ahead: 0,
266
+ behind: 0,
267
+ sha: void 0
268
+ };
269
+ }
236
270
  try {
237
271
  const branch = this.getBranch(workingDir);
238
272
  const status = this.getStatus(workingDir);
@@ -256,7 +290,8 @@ var GitService = class {
256
290
  encoding: "utf8",
257
291
  timeout: 1e3
258
292
  }).trim() || null;
259
- } catch {
293
+ } catch (error) {
294
+ debug(`Git branch command failed in ${workingDir}:`, error);
260
295
  return null;
261
296
  }
262
297
  }
@@ -272,7 +307,8 @@ var GitService = class {
272
307
  return "conflicts";
273
308
  }
274
309
  return "dirty";
275
- } catch {
310
+ } catch (error) {
311
+ debug(`Git status command failed in ${workingDir}:`, error);
276
312
  return "clean";
277
313
  }
278
314
  }
@@ -292,7 +328,8 @@ var GitService = class {
292
328
  ahead: parseInt(aheadResult) || 0,
293
329
  behind: parseInt(behindResult) || 0
294
330
  };
295
- } catch {
331
+ } catch (error) {
332
+ debug(`Git ahead/behind command failed in ${workingDir}:`, error);
296
333
  return { ahead: 0, behind: 0 };
297
334
  }
298
335
  }
@@ -316,14 +353,18 @@ var TmuxService = class {
316
353
  getSessionId() {
317
354
  try {
318
355
  if (!process.env.TMUX_PANE) {
356
+ debug(`TMUX_PANE not set, not in tmux session`);
319
357
  return null;
320
358
  }
359
+ debug(`Getting tmux session ID, TMUX_PANE: ${process.env.TMUX_PANE}`);
321
360
  const sessionId = execSync2("tmux display-message -p '#S'", {
322
361
  encoding: "utf8",
323
362
  timeout: 1e3
324
363
  }).trim();
364
+ debug(`Tmux session ID: ${sessionId || "empty"}`);
325
365
  return sessionId || null;
326
- } catch {
366
+ } catch (error) {
367
+ debug(`Error getting tmux session ID:`, error);
327
368
  return null;
328
369
  }
329
370
  }
@@ -749,8 +790,8 @@ var PowerlineRenderer = class {
749
790
  };
750
791
 
751
792
  // src/config/loader.ts
752
- import fs from "fs";
753
- import path from "path";
793
+ import fs2 from "fs";
794
+ import path2 from "path";
754
795
  import os from "os";
755
796
 
756
797
  // src/config/defaults.ts
@@ -814,19 +855,19 @@ function deepMerge(target, source) {
814
855
  }
815
856
  function findConfigFile(customPath, projectDir) {
816
857
  if (customPath) {
817
- return fs.existsSync(customPath) ? customPath : null;
858
+ return fs2.existsSync(customPath) ? customPath : null;
818
859
  }
819
860
  const locations = [
820
- ...projectDir ? [path.join(projectDir, ".claude-powerline.json")] : [],
821
- path.join(process.cwd(), ".claude-powerline.json"),
822
- path.join(os.homedir(), ".claude", "claude-powerline.json"),
823
- path.join(os.homedir(), ".config", "claude-powerline", "config.json")
861
+ ...projectDir ? [path2.join(projectDir, ".claude-powerline.json")] : [],
862
+ path2.join(process.cwd(), ".claude-powerline.json"),
863
+ path2.join(os.homedir(), ".claude", "claude-powerline.json"),
864
+ path2.join(os.homedir(), ".config", "claude-powerline", "config.json")
824
865
  ];
825
- return locations.find(fs.existsSync) || null;
866
+ return locations.find(fs2.existsSync) || null;
826
867
  }
827
868
  function loadConfigFile(filePath) {
828
869
  try {
829
- const content = fs.readFileSync(filePath, "utf-8");
870
+ const content = fs2.readFileSync(filePath, "utf-8");
830
871
  return JSON.parse(content);
831
872
  } catch (error) {
832
873
  throw new Error(
@@ -855,23 +896,9 @@ function loadEnvConfig() {
855
896
  }
856
897
  if (process.env.CLAUDE_POWERLINE_USAGE_TYPE) {
857
898
  const usageType = process.env.CLAUDE_POWERLINE_USAGE_TYPE;
858
- if (!config.display) {
859
- config.display = { lines: [] };
860
- }
861
- if (config.display.lines.length === 0) {
862
- config.display.lines = [{ segments: {} }];
899
+ if (["cost", "tokens", "both", "breakdown"].includes(usageType)) {
900
+ config.usageType = usageType;
863
901
  }
864
- config.display.lines.forEach((line) => {
865
- if (line.segments.session) {
866
- line.segments.session.type = usageType;
867
- }
868
- if (line.segments.today) {
869
- line.segments.today.type = usageType;
870
- }
871
- if (line.segments.block) {
872
- line.segments.block.type = usageType === "breakdown" || usageType === "both" ? "cost" : usageType;
873
- }
874
- });
875
902
  }
876
903
  return config;
877
904
  }
@@ -940,23 +967,7 @@ function parseCLIOverrides(args) {
940
967
  if (usageIndex !== -1) {
941
968
  const usageType = args[usageIndex]?.split("=")[1];
942
969
  if (usageType && ["cost", "tokens", "both", "breakdown"].includes(usageType)) {
943
- if (!config.display) {
944
- config.display = { lines: [] };
945
- }
946
- if (config.display.lines.length === 0) {
947
- config.display.lines = [{ segments: {} }];
948
- }
949
- config.display.lines.forEach((line) => {
950
- if (line.segments.session) {
951
- line.segments.session.type = usageType;
952
- }
953
- if (line.segments.today) {
954
- line.segments.today.type = usageType;
955
- }
956
- if (line.segments.block) {
957
- line.segments.block.type = usageType === "breakdown" || usageType === "both" ? "cost" : usageType;
958
- }
959
- });
970
+ config.usageType = usageType;
960
971
  }
961
972
  }
962
973
  return config;
@@ -991,6 +1002,20 @@ function loadConfig(options = {}) {
991
1002
  config = deepMerge(config, envConfig);
992
1003
  }
993
1004
  config = deepMerge(config, cliOverrides);
1005
+ if (config.usageType) {
1006
+ config.display.lines.forEach((line) => {
1007
+ if (line.segments.session) {
1008
+ line.segments.session.type = config.usageType;
1009
+ }
1010
+ if (line.segments.today) {
1011
+ line.segments.today.type = config.usageType;
1012
+ }
1013
+ if (line.segments.block) {
1014
+ line.segments.block.type = config.usageType === "breakdown" || config.usageType === "both" ? "cost" : config.usageType;
1015
+ }
1016
+ });
1017
+ delete config.usageType;
1018
+ }
994
1019
  return config;
995
1020
  }
996
1021
  function loadConfigFromCLI(args = process.argv, projectDir) {
@@ -1006,11 +1031,11 @@ async function installFonts() {
1006
1031
  const platform = os2.platform();
1007
1032
  let fontDir;
1008
1033
  if (platform === "darwin") {
1009
- fontDir = path2.join(os2.homedir(), "Library", "Fonts");
1034
+ fontDir = path3.join(os2.homedir(), "Library", "Fonts");
1010
1035
  } else if (platform === "linux") {
1011
- fontDir = path2.join(os2.homedir(), ".local", "share", "fonts");
1036
+ fontDir = path3.join(os2.homedir(), ".local", "share", "fonts");
1012
1037
  } else if (platform === "win32") {
1013
- fontDir = path2.join(
1038
+ fontDir = path3.join(
1014
1039
  os2.homedir(),
1015
1040
  "AppData",
1016
1041
  "Local",
@@ -1022,15 +1047,15 @@ async function installFonts() {
1022
1047
  console.log("Unsupported platform for font installation");
1023
1048
  return;
1024
1049
  }
1025
- if (!fs2.existsSync(fontDir)) {
1026
- fs2.mkdirSync(fontDir, { recursive: true });
1050
+ if (!fs3.existsSync(fontDir)) {
1051
+ fs3.mkdirSync(fontDir, { recursive: true });
1027
1052
  }
1028
1053
  console.log("\u{1F4E6} Installing Powerline Fonts...");
1029
1054
  console.log("Downloading from https://github.com/powerline/fonts");
1030
- const tempDir = path2.join(os2.tmpdir(), "powerline-fonts");
1055
+ const tempDir = path3.join(os2.tmpdir(), "powerline-fonts");
1031
1056
  try {
1032
- if (fs2.existsSync(tempDir)) {
1033
- fs2.rmSync(tempDir, { recursive: true, force: true });
1057
+ if (fs3.existsSync(tempDir)) {
1058
+ fs3.rmSync(tempDir, { recursive: true, force: true });
1034
1059
  }
1035
1060
  console.log("Cloning powerline fonts repository...");
1036
1061
  execSync3(
@@ -1041,9 +1066,9 @@ async function installFonts() {
1041
1066
  }
1042
1067
  );
1043
1068
  console.log("Installing fonts...");
1044
- const installScript = path2.join(tempDir, "install.sh");
1045
- if (fs2.existsSync(installScript)) {
1046
- fs2.chmodSync(installScript, 493);
1069
+ const installScript = path3.join(tempDir, "install.sh");
1070
+ if (fs3.existsSync(installScript)) {
1071
+ fs3.chmodSync(installScript, 493);
1047
1072
  execSync3("./install.sh", { stdio: "inherit", cwd: tempDir });
1048
1073
  } else {
1049
1074
  throw new Error(
@@ -1058,8 +1083,8 @@ async function installFonts() {
1058
1083
  "Popular choices: Source Code Pro Powerline, DejaVu Sans Mono Powerline, Ubuntu Mono Powerline"
1059
1084
  );
1060
1085
  } finally {
1061
- if (fs2.existsSync(tempDir)) {
1062
- fs2.rmSync(tempDir, { recursive: true, force: true });
1086
+ if (fs3.existsSync(tempDir)) {
1087
+ fs3.rmSync(tempDir, { recursive: true, force: true });
1063
1088
  }
1064
1089
  }
1065
1090
  } catch (error) {
@@ -1086,15 +1111,20 @@ claude-powerline - Beautiful powerline statusline for Claude Code
1086
1111
 
1087
1112
  Usage: claude-powerline [options]
1088
1113
 
1089
- Options:
1114
+ Standalone Commands:
1115
+ --install-fonts Install powerline fonts to system
1116
+ -h, --help Show this help
1117
+
1118
+ Debugging:
1119
+ CLAUDE_POWERLINE_DEBUG=1 Enable debug logging for troubleshooting
1120
+
1121
+ Claude Code Options (for settings.json):
1090
1122
  --theme=THEME Set theme: dark, light, nord, tokyo-night, rose-pine, custom
1091
1123
  --style=STYLE Set separator style: minimal, powerline
1092
1124
  --usage=TYPE Usage display: cost, tokens, both, breakdown
1093
1125
  --session-budget=AMOUNT Set session budget for percentage tracking
1094
1126
  --daily-budget=AMOUNT Set daily budget for percentage tracking
1095
1127
  --config=PATH Use custom config file path
1096
- --install-fonts Install powerline fonts to system
1097
- -h, --help Show this help
1098
1128
 
1099
1129
  Configuration:
1100
1130
  Config files are loaded in this order (highest priority first):
@@ -1118,6 +1148,28 @@ Usage in Claude Code settings.json:
1118
1148
  `);
1119
1149
  process2.exit(0);
1120
1150
  }
1151
+ if (process2.stdin.isTTY === true) {
1152
+ console.error(`Error: This tool requires input from Claude Code
1153
+
1154
+ claude-powerline is designed to be used as a Claude Code statusLine command.
1155
+ It reads hook data from stdin and outputs formatted statusline.
1156
+
1157
+ Add to ~/.claude/settings.json:
1158
+ {
1159
+ "statusLine": {
1160
+ "type": "command",
1161
+ "command": "claude-powerline --style=powerline"
1162
+ }
1163
+ }
1164
+
1165
+ Run with --help for more options.
1166
+
1167
+ To test output manually:
1168
+ echo '{"workspace":{"project_dir":"/path/to/project"},"session":{"id":"test","model":"claude"}}' | claude-powerline --style=powerline`);
1169
+ process2.exit(1);
1170
+ }
1171
+ debug(`Working directory: ${process2.cwd()}`);
1172
+ debug(`Process args:`, process2.argv);
1121
1173
  const hookData = await json(process2.stdin);
1122
1174
  if (!hookData) {
1123
1175
  console.error("Error: No input provided");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/colors.ts","../src/themes/dark.ts","../src/themes/light.ts","../src/themes/nord.ts","../src/themes/tokyo-night.ts","../src/themes/rose-pine.ts","../src/themes/index.ts","../src/lib/usage-provider.ts","../src/lib/git-service.ts","../src/lib/tmux-service.ts","../src/lib/formatters.ts","../src/lib/budget.ts","../src/lib/segment-renderer.ts","../src/powerline.ts","../src/config/loader.ts","../src/config/defaults.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport process from \"node:process\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport os from \"node:os\";\nimport { json } from \"node:stream/consumers\";\nimport { PowerlineRenderer } from \"./powerline\";\nimport { loadConfigFromCLI } from \"./config/loader\";\nimport type { ClaudeHookData } from \"./types\";\n\nasync function installFonts(): Promise<void> {\n try {\n const platform = os.platform();\n let fontDir: string;\n\n if (platform === \"darwin\") {\n fontDir = path.join(os.homedir(), \"Library\", \"Fonts\");\n } else if (platform === \"linux\") {\n fontDir = path.join(os.homedir(), \".local\", \"share\", \"fonts\");\n } else if (platform === \"win32\") {\n fontDir = path.join(\n os.homedir(),\n \"AppData\",\n \"Local\",\n \"Microsoft\",\n \"Windows\",\n \"Fonts\"\n );\n } else {\n console.log(\"Unsupported platform for font installation\");\n return;\n }\n\n if (!fs.existsSync(fontDir)) {\n fs.mkdirSync(fontDir, { recursive: true });\n }\n\n console.log(\"📦 Installing Powerline Fonts...\");\n console.log(\"Downloading from https://github.com/powerline/fonts\");\n\n const tempDir = path.join(os.tmpdir(), \"powerline-fonts\");\n\n try {\n if (fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n\n console.log(\"Cloning powerline fonts repository...\");\n execSync(\n \"git clone --depth=1 https://github.com/powerline/fonts.git powerline-fonts\",\n {\n stdio: \"inherit\",\n cwd: os.tmpdir(),\n }\n );\n\n console.log(\"Installing fonts...\");\n const installScript = path.join(tempDir, \"install.sh\");\n\n if (fs.existsSync(installScript)) {\n fs.chmodSync(installScript, 0o755);\n execSync(\"./install.sh\", { stdio: \"inherit\", cwd: tempDir });\n } else {\n throw new Error(\n \"Install script not found in powerline fonts repository\"\n );\n }\n\n console.log(\"✅ Powerline fonts installation complete!\");\n console.log(\n \"Please restart your terminal and set your terminal font to a powerline font.\"\n );\n console.log(\n \"Popular choices: Source Code Pro Powerline, DejaVu Sans Mono Powerline, Ubuntu Mono Powerline\"\n );\n } finally {\n if (fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n }\n } catch (error) {\n console.error(\n \"Error installing fonts:\",\n error instanceof Error ? error.message : String(error)\n );\n console.log(\n \"💡 You can manually install fonts from: https://github.com/powerline/fonts\"\n );\n }\n}\n\nasync function main(): Promise<void> {\n try {\n const showHelp =\n process.argv.includes(\"--help\") || process.argv.includes(\"-h\");\n const installFontsFlag = process.argv.includes(\"--install-fonts\");\n\n if (installFontsFlag) {\n await installFonts();\n process.exit(0);\n }\n\n if (showHelp) {\n console.log(`\nclaude-powerline - Beautiful powerline statusline for Claude Code\n\nUsage: claude-powerline [options]\n\nOptions:\n --theme=THEME Set theme: dark, light, nord, tokyo-night, rose-pine, custom\n --style=STYLE Set separator style: minimal, powerline\n --usage=TYPE Usage display: cost, tokens, both, breakdown\n --session-budget=AMOUNT Set session budget for percentage tracking\n --daily-budget=AMOUNT Set daily budget for percentage tracking\n --config=PATH Use custom config file path\n --install-fonts Install powerline fonts to system\n -h, --help Show this help\n\nConfiguration:\n Config files are loaded in this order (highest priority first):\n 1. CLI arguments (--theme, --style, --usage, --config)\n 2. Environment variables (CLAUDE_POWERLINE_THEME, CLAUDE_POWERLINE_STYLE, CLAUDE_POWERLINE_USAGE_TYPE, CLAUDE_POWERLINE_CONFIG)\n 3. ./.claude-powerline.json (project)\n 4. ~/.claude/claude-powerline.json (user)\n 5. ~/.config/claude-powerline/config.json (XDG)\n\nCreating a config file:\n Copy example from: https://github.com/Owloops/claude-powerline/blob/main/.claude-powerline.json\n\nUsage in Claude Code settings.json:\n{\n \"statusLine\": {\n \"type\": \"command\",\n \"command\": \"claude-powerline\",\n \"padding\": 0\n }\n}\n`);\n process.exit(0);\n }\n\n const hookData = (await json(process.stdin)) as ClaudeHookData;\n if (!hookData) {\n console.error(\"Error: No input provided\");\n console.log(`\nclaude-powerline - Beautiful powerline statusline for Claude Code\n\nUsage: claude-powerline [options]\n\nOptions:\n --theme=THEME Set theme: dark, light, nord, tokyo-night, rose-pine, custom\n --style=STYLE Set separator style: minimal, powerline\n --usage=TYPE Usage display: cost, tokens, both, breakdown\n --session-budget=AMOUNT Set session budget for percentage tracking\n --daily-budget=AMOUNT Set daily budget for percentage tracking\n --config=PATH Use custom config file path\n --install-fonts Install powerline fonts to system\n -h, --help Show this help\n\nSee example config at: https://github.com/Owloops/claude-powerline/blob/main/.claude-powerline.json\n`);\n process.exit(1);\n }\n\n const projectDir = hookData.workspace?.project_dir;\n const config = loadConfigFromCLI(process.argv, projectDir);\n const renderer = new PowerlineRenderer(config);\n const statusline = await renderer.generateStatusline(hookData);\n\n console.log(statusline);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(\"Error generating statusline:\", errorMessage);\n process.exit(1);\n }\n}\n\nmain();\n","export function hexToAnsi(hex: string, isBackground: boolean): string {\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n return `\\x1b[${isBackground ? \"48\" : \"38\"};2;${r};${g};${b}m`;\n}\n\nexport function extractBgToFg(ansiCode: string): string {\n const match = ansiCode.match(/48;2;(\\d+);(\\d+);(\\d+)/);\n if (match) {\n return `\\x1b[38;2;${match[1]};${match[2]};${match[3]}m`;\n }\n return ansiCode.replace(\"48\", \"38\");\n}\n","import type { ColorTheme } from \"../types/config\";\n\nexport const darkTheme: ColorTheme = {\n directory: { bg: \"#8b4513\", fg: \"#ffffff\" },\n git: { bg: \"#404040\", fg: \"#ffffff\" },\n model: { bg: \"#2d2d2d\", fg: \"#ffffff\" },\n session: { bg: \"#202020\", fg: \"#00ffff\" },\n today: { bg: \"#a0520d\", fg: \"#ffffff\" },\n block: { bg: \"#8b4500\", fg: \"#ffffff\" },\n tmux: { bg: \"#2f4f2f\", fg: \"#90ee90\" },\n};\n","import type { ColorTheme } from \"../types/config\";\n\nexport const lightTheme: ColorTheme = {\n directory: { bg: \"#ff6b47\", fg: \"#ffffff\" },\n git: { bg: \"#4fb3d9\", fg: \"#ffffff\" },\n model: { bg: \"#87ceeb\", fg: \"#000000\" },\n session: { bg: \"#da70d6\", fg: \"#ffffff\" },\n today: { bg: \"#90ee90\", fg: \"#ffffff\" },\n block: { bg: \"#ff8c00\", fg: \"#ffffff\" },\n tmux: { bg: \"#32cd32\", fg: \"#ffffff\" },\n};\n","import type { ColorTheme } from \"../types/config\";\n\nexport const nordTheme: ColorTheme = {\n directory: { bg: \"#434c5e\", fg: \"#d8dee9\" },\n git: { bg: \"#3b4252\", fg: \"#a3be8c\" },\n model: { bg: \"#4c566a\", fg: \"#81a1c1\" },\n session: { bg: \"#2e3440\", fg: \"#88c0d0\" },\n today: { bg: \"#434c5e\", fg: \"#ebcb8b\" },\n block: { bg: \"#3b4252\", fg: \"#bf616a\" },\n tmux: { bg: \"#2e3440\", fg: \"#8fbcbb\" },\n};\n","import type { ColorTheme } from \"../types/config\";\n\nexport const tokyoNightTheme: ColorTheme = {\n directory: { bg: \"#2f334d\", fg: \"#82aaff\" },\n git: { bg: \"#1e2030\", fg: \"#c3e88d\" },\n model: { bg: \"#191b29\", fg: \"#fca7ea\" },\n session: { bg: \"#222436\", fg: \"#86e1fc\" },\n today: { bg: \"#2f334d\", fg: \"#ffc777\" },\n block: { bg: \"#1e2030\", fg: \"#ff966c\" },\n tmux: { bg: \"#191b29\", fg: \"#4fd6be\" },\n};\n","import type { ColorTheme } from \"../types/config\";\n\nexport const rosePineTheme: ColorTheme = {\n directory: { bg: \"#26233a\", fg: \"#c4a7e7\" },\n git: { bg: \"#1f1d2e\", fg: \"#9ccfd8\" },\n model: { bg: \"#191724\", fg: \"#ebbcba\" },\n session: { bg: \"#26233a\", fg: \"#f6c177\" },\n today: { bg: \"#1f1d2e\", fg: \"#eb6f92\" },\n block: { bg: \"#191724\", fg: \"#31748f\" },\n tmux: { bg: \"#26233a\", fg: \"#908caa\" },\n};\n","import type { ColorTheme } from \"../types/config\";\nimport { darkTheme } from \"./dark\";\nimport { lightTheme } from \"./light\";\nimport { nordTheme } from \"./nord\";\nimport { tokyoNightTheme } from \"./tokyo-night\";\nimport { rosePineTheme } from \"./rose-pine\";\n\nexport const BUILT_IN_THEMES: Record<string, ColorTheme> = {\n dark: darkTheme,\n light: lightTheme,\n nord: nordTheme,\n \"tokyo-night\": tokyoNightTheme,\n \"rose-pine\": rosePineTheme,\n};\n\nexport function getTheme(themeName: string): ColorTheme | null {\n return BUILT_IN_THEMES[themeName] || null;\n}\n\nexport { darkTheme, lightTheme, nordTheme, tokyoNightTheme, rosePineTheme };\n","import {\n loadSessionUsageById,\n loadDailyUsageData,\n loadSessionBlockData,\n getClaudePaths,\n} from \"ccusage/data-loader\";\nimport { calculateTotals, getTotalTokens } from \"ccusage/calculate-cost\";\nimport { logger } from \"ccusage/logger\";\n\nexport interface TokenBreakdown {\n input: number;\n output: number;\n cacheCreation: number;\n cacheRead: number;\n}\n\nexport interface SessionBlockInfo {\n cost: number;\n tokens: number;\n timeRemaining: number;\n burnRate: number | null;\n tokenBurnRate: number | null;\n isActive: boolean;\n}\n\nexport interface UsageInfo {\n session: {\n cost: number | null;\n tokens: number | null;\n tokenBreakdown: TokenBreakdown | null;\n };\n daily: {\n cost: number;\n tokens: number;\n tokenBreakdown: TokenBreakdown | null;\n };\n}\n\nexport class UsageProvider {\n async getSessionBlockInfo(): Promise<SessionBlockInfo | null> {\n const originalLevel = logger.level;\n logger.level = 0;\n\n try {\n const blocks = await loadSessionBlockData({\n mode: \"auto\",\n sessionDurationHours: 5,\n });\n\n const activeBlock = blocks.find((block) => block.isActive);\n\n if (!activeBlock) {\n return null;\n }\n\n const now = new Date();\n const timeRemaining = Math.round(\n (activeBlock.endTime.getTime() - now.getTime()) / (1000 * 60)\n );\n\n const elapsed = Math.round(\n (now.getTime() - activeBlock.startTime.getTime()) / (1000 * 60)\n );\n\n const totalTokens =\n (activeBlock.tokenCounts?.inputTokens || 0) +\n (activeBlock.tokenCounts?.outputTokens || 0) +\n (activeBlock.tokenCounts?.cacheCreationInputTokens || 0) +\n (activeBlock.tokenCounts?.cacheReadInputTokens || 0);\n\n const burnRate =\n elapsed > 0 ? (activeBlock.costUSD / elapsed) * 60 : null;\n const tokenBurnRate = elapsed > 0 ? (totalTokens / elapsed) * 60 : null;\n\n return {\n cost: activeBlock.costUSD,\n tokens: totalTokens,\n timeRemaining: Math.max(0, timeRemaining),\n burnRate,\n tokenBurnRate,\n isActive: true,\n };\n } catch {\n return null;\n } finally {\n logger.level = originalLevel;\n }\n }\n\n async getUsageInfo(sessionId: string): Promise<UsageInfo> {\n const originalLevel = logger.level;\n logger.level = 0;\n\n try {\n const claudePaths = getClaudePaths();\n if (claudePaths.length === 0) {\n return {\n session: { cost: null, tokens: null, tokenBreakdown: null },\n daily: { cost: 0, tokens: 0, tokenBreakdown: null },\n };\n }\n\n const [sessionData, dailyData] = await Promise.all([\n this.getSessionData(sessionId),\n this.getDailyData(),\n ]);\n\n return {\n session: sessionData,\n daily: dailyData,\n };\n } catch {\n return {\n session: { cost: null, tokens: null, tokenBreakdown: null },\n daily: { cost: 0, tokens: 0, tokenBreakdown: null },\n };\n } finally {\n logger.level = originalLevel;\n }\n }\n\n private async getSessionData(sessionId: string) {\n try {\n const sessionData = await loadSessionUsageById(sessionId, {\n mode: \"auto\",\n });\n\n if (!sessionData) {\n return { cost: null, tokens: null, tokenBreakdown: null };\n }\n\n const breakdown = sessionData.entries.reduce(\n (acc, entry) => {\n const usage = entry.message.usage;\n return {\n input: acc.input + usage.input_tokens,\n output: acc.output + usage.output_tokens,\n cacheCreation:\n acc.cacheCreation + (usage.cache_creation_input_tokens || 0),\n cacheRead: acc.cacheRead + (usage.cache_read_input_tokens || 0),\n };\n },\n { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 }\n );\n\n const totalTokens =\n breakdown.input +\n breakdown.output +\n breakdown.cacheCreation +\n breakdown.cacheRead;\n\n return {\n cost: sessionData.totalCost,\n tokens: totalTokens,\n tokenBreakdown: breakdown,\n };\n } catch {\n return { cost: null, tokens: null, tokenBreakdown: null };\n }\n }\n\n private async getDailyData() {\n try {\n const today = new Date();\n const todayStr =\n today.toISOString().split(\"T\")[0]?.replace(/-/g, \"\") ?? \"\";\n\n const dailyData = await loadDailyUsageData({\n since: todayStr,\n until: todayStr,\n mode: \"auto\",\n });\n\n if (dailyData.length === 0) {\n return { cost: 0, tokens: 0, tokenBreakdown: null };\n }\n\n const totals = calculateTotals(dailyData);\n const breakdown = dailyData.reduce(\n (acc, entry) => {\n return {\n input: acc.input + (entry.inputTokens || 0),\n output: acc.output + (entry.outputTokens || 0),\n cacheCreation: acc.cacheCreation + (entry.cacheCreationTokens || 0),\n cacheRead: acc.cacheRead + (entry.cacheReadTokens || 0),\n };\n },\n { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 }\n );\n\n return {\n cost: totals.totalCost,\n tokens: getTotalTokens(totals),\n tokenBreakdown: breakdown,\n };\n } catch {\n return { cost: 0, tokens: 0, tokenBreakdown: null };\n }\n }\n}\n","import { execSync } from \"node:child_process\";\n\nexport interface GitInfo {\n branch: string;\n status: \"clean\" | \"dirty\" | \"conflicts\";\n ahead: number;\n behind: number;\n sha?: string;\n}\n\nexport class GitService {\n getGitInfo(workingDir: string, showSha = false): GitInfo | null {\n try {\n const branch = this.getBranch(workingDir);\n const status = this.getStatus(workingDir);\n const { ahead, behind } = this.getAheadBehind(workingDir);\n const sha = showSha ? this.getSha(workingDir) || undefined : undefined;\n\n return {\n branch: branch || \"detached\",\n status,\n ahead,\n behind,\n sha,\n };\n } catch {\n return null;\n }\n }\n\n private getBranch(workingDir: string): string | null {\n try {\n return (\n execSync(\"git branch --show-current\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 1000,\n }).trim() || null\n );\n } catch {\n return null;\n }\n }\n\n private getStatus(workingDir: string): \"clean\" | \"dirty\" | \"conflicts\" {\n try {\n const gitStatus = execSync(\"git status --porcelain\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 1000,\n }).trim();\n\n if (!gitStatus) return \"clean\";\n\n if (\n gitStatus.includes(\"UU\") ||\n gitStatus.includes(\"AA\") ||\n gitStatus.includes(\"DD\")\n ) {\n return \"conflicts\";\n }\n\n return \"dirty\";\n } catch {\n return \"clean\";\n }\n }\n\n private getAheadBehind(workingDir: string): {\n ahead: number;\n behind: number;\n } {\n try {\n const aheadResult = execSync(\"git rev-list --count @{u}..HEAD\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 1000,\n }).trim();\n\n const behindResult = execSync(\"git rev-list --count HEAD..@{u}\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 1000,\n }).trim();\n\n return {\n ahead: parseInt(aheadResult) || 0,\n behind: parseInt(behindResult) || 0,\n };\n } catch {\n return { ahead: 0, behind: 0 };\n }\n }\n\n private getSha(workingDir: string): string | null {\n try {\n const sha = execSync(\"git rev-parse --short=7 HEAD\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 1000,\n }).trim();\n\n return sha || null;\n } catch {\n return null;\n }\n }\n}\n","import { execSync } from \"node:child_process\";\n\nexport class TmuxService {\n getSessionId(): string | null {\n try {\n if (!process.env.TMUX_PANE) {\n return null;\n }\n\n const sessionId = execSync(\"tmux display-message -p '#S'\", {\n encoding: \"utf8\",\n timeout: 1000,\n }).trim();\n\n return sessionId || null;\n } catch {\n return null;\n }\n }\n\n isInTmux(): boolean {\n return !!process.env.TMUX_PANE;\n }\n}\n","interface TokenBreakdown {\n input: number;\n output: number;\n cacheCreation: number;\n cacheRead: number;\n}\n\nexport function formatCost(cost: number | null): string {\n if (cost === null) return \"N/A\";\n if (cost < 0.01) return \"<$0.01\";\n return `$${cost.toFixed(2)}`;\n}\n\nexport function formatTokens(tokens: number | null): string {\n if (tokens === null) return \"N/A\";\n if (tokens === 0) return \"0 tokens\";\n if (tokens >= 1_000_000) {\n return `${(tokens / 1_000_000).toFixed(1)}M tokens`;\n } else if (tokens >= 1_000) {\n return `${(tokens / 1_000).toFixed(1)}K tokens`;\n }\n return `${tokens} tokens`;\n}\n\nexport function formatTokenBreakdown(breakdown: TokenBreakdown | null): string {\n if (!breakdown) return \"N/A\";\n\n const parts: string[] = [];\n\n if (breakdown.input > 0) {\n parts.push(`${formatTokens(breakdown.input).replace(\" tokens\", \"\")}in`);\n }\n\n if (breakdown.output > 0) {\n parts.push(`${formatTokens(breakdown.output).replace(\" tokens\", \"\")}out`);\n }\n\n if (breakdown.cacheCreation > 0 || breakdown.cacheRead > 0) {\n const totalCached = breakdown.cacheCreation + breakdown.cacheRead;\n parts.push(`${formatTokens(totalCached).replace(\" tokens\", \"\")}cached`);\n }\n\n return parts.length > 0 ? parts.join(\" + \") : \"0 tokens\";\n}\n\nexport function formatTimeRemaining(minutes: number): string {\n if (minutes <= 0) return \"0m\";\n\n const hours = Math.floor(minutes / 60);\n const mins = minutes % 60;\n\n if (hours > 0) {\n return `${hours}h${mins > 0 ? ` ${mins}m` : \"\"}`;\n }\n\n return `${mins}m`;\n}\n","export interface BudgetStatus {\n percentage: number | null;\n isWarning: boolean;\n displayText: string;\n}\n\nexport function calculateBudgetPercentage(\n cost: number,\n budget: number | undefined\n): number | null {\n if (!budget || budget <= 0 || cost < 0) return null;\n return Math.min(100, (cost / budget) * 100);\n}\n\nexport function getBudgetStatus(\n cost: number,\n budget: number | undefined,\n warningThreshold = 80\n): BudgetStatus {\n const percentage = calculateBudgetPercentage(cost, budget);\n\n if (percentage === null) {\n return {\n percentage: null,\n isWarning: false,\n displayText: \"\",\n };\n }\n\n const percentStr = `${percentage.toFixed(0)}%`;\n const isWarning = percentage >= warningThreshold;\n\n let displayText = \"\";\n if (isWarning) {\n displayText = ` !${percentStr}`;\n } else if (percentage >= 50) {\n displayText = ` +${percentStr}`;\n } else {\n displayText = ` ${percentStr}`;\n }\n\n return {\n percentage,\n isWarning,\n displayText,\n };\n}\n","import type { PowerlineConfig } from \"../types/config\";\nimport type { ClaudeHookData, PowerlineColors } from \"../types\";\nimport {\n formatCost,\n formatTokens,\n formatTokenBreakdown,\n formatTimeRemaining,\n} from \"./formatters\";\nimport { getBudgetStatus } from \"./budget\";\nimport type {\n UsageInfo,\n SessionBlockInfo,\n TokenBreakdown,\n} from \"./usage-provider\";\nimport type { GitInfo } from \"./git-service\";\n\nexport interface PowerlineSymbols {\n right: string;\n branch: string;\n model: string;\n git_clean: string;\n git_dirty: string;\n git_conflicts: string;\n git_ahead: string;\n git_behind: string;\n session_cost: string;\n daily_cost: string;\n block_cost: string;\n}\n\nexport interface SegmentData {\n text: string;\n bgColor: string;\n fgColor: string;\n}\n\nexport class SegmentRenderer {\n constructor(\n private readonly config: PowerlineConfig,\n private readonly symbols: PowerlineSymbols\n ) {}\n\n renderDirectory(\n hookData: ClaudeHookData,\n colors: PowerlineColors\n ): SegmentData {\n const currentDir = hookData.workspace?.current_dir || hookData.cwd || \"/\";\n const projectDir = hookData.workspace?.project_dir;\n const dirName = this.getDisplayDirectoryName(currentDir, projectDir);\n\n return {\n text: dirName,\n bgColor: colors.modeBg,\n fgColor: colors.modeFg,\n };\n }\n\n renderGit(\n gitInfo: GitInfo,\n colors: PowerlineColors,\n showSha = false\n ): SegmentData | null {\n if (!gitInfo) return null;\n\n let gitStatusIcon = this.symbols.git_clean;\n if (gitInfo.status === \"conflicts\") {\n gitStatusIcon = this.symbols.git_conflicts;\n } else if (gitInfo.status === \"dirty\") {\n gitStatusIcon = this.symbols.git_dirty;\n }\n\n let text = `${this.symbols.branch} ${gitInfo.branch} ${gitStatusIcon}`;\n\n if (gitInfo.sha && showSha) {\n text += ` ${gitInfo.sha}`;\n }\n\n if (gitInfo.ahead > 0 && gitInfo.behind > 0) {\n text += ` ${this.symbols.git_ahead}${gitInfo.ahead}${this.symbols.git_behind}${gitInfo.behind}`;\n } else if (gitInfo.ahead > 0) {\n text += ` ${this.symbols.git_ahead}${gitInfo.ahead}`;\n } else if (gitInfo.behind > 0) {\n text += ` ${this.symbols.git_behind}${gitInfo.behind}`;\n }\n\n return {\n text,\n bgColor: colors.gitBg,\n fgColor: colors.gitFg,\n };\n }\n\n renderModel(hookData: ClaudeHookData, colors: PowerlineColors): SegmentData {\n const modelName = hookData.model?.display_name || \"Claude\";\n\n return {\n text: `${this.symbols.model} ${modelName}`,\n bgColor: colors.modelBg,\n fgColor: colors.modelFg,\n };\n }\n\n renderSession(\n usageInfo: UsageInfo,\n colors: PowerlineColors,\n type = \"cost\"\n ): SegmentData {\n const sessionBudget = this.config.budget?.session;\n const text = `${this.symbols.session_cost} ${this.formatUsageWithBudget(\n usageInfo.session.cost,\n usageInfo.session.tokens,\n usageInfo.session.tokenBreakdown,\n type,\n sessionBudget?.amount,\n sessionBudget?.warningThreshold || 80\n )}`;\n\n return {\n text,\n bgColor: colors.sessionBg,\n fgColor: colors.sessionFg,\n };\n }\n\n renderToday(\n usageInfo: UsageInfo,\n colors: PowerlineColors,\n type = \"cost\"\n ): SegmentData {\n const todayBudget = this.config.budget?.today;\n const text = `Today ${this.formatUsageWithBudget(\n usageInfo.daily.cost,\n usageInfo.daily.tokens,\n usageInfo.daily.tokenBreakdown,\n type,\n todayBudget?.amount,\n todayBudget?.warningThreshold || 80\n )}`;\n\n return {\n text,\n bgColor: colors.burnLowBg,\n fgColor: colors.burnFg,\n };\n }\n\n renderBlock(\n blockInfo: SessionBlockInfo | null,\n colors: PowerlineColors,\n type = \"cost\"\n ): SegmentData | null {\n if (!blockInfo) return null;\n\n const text = `${this.symbols.block_cost} ${this.formatSessionBlockInfo(blockInfo, type)}`;\n\n return {\n text,\n bgColor: colors.blockBg,\n fgColor: colors.blockFg,\n };\n }\n\n renderTmux(\n sessionId: string | null,\n colors: PowerlineColors\n ): SegmentData | null {\n if (!sessionId) return null;\n\n return {\n text: `tmux:${sessionId}`,\n bgColor: colors.tmuxBg,\n fgColor: colors.tmuxFg,\n };\n }\n\n private getDisplayDirectoryName(\n currentDir: string,\n projectDir?: string\n ): string {\n if (projectDir && projectDir !== currentDir) {\n const projectName = projectDir.split(\"/\").pop() || \"project\";\n const currentDirName = currentDir.split(\"/\").pop() || \"root\";\n\n if (currentDir.includes(projectDir)) {\n return `${projectName}/${currentDirName}`;\n }\n\n return currentDirName;\n }\n\n return currentDir.split(\"/\").pop() || \"root\";\n }\n\n private formatUsageDisplay(\n cost: number | null,\n tokens: number | null,\n tokenBreakdown: TokenBreakdown | null,\n type: string\n ): string {\n switch (type) {\n case \"cost\":\n return formatCost(cost);\n case \"tokens\":\n return formatTokens(tokens);\n case \"both\":\n return `${formatCost(cost)} (${formatTokens(tokens)})`;\n case \"breakdown\":\n return formatTokenBreakdown(tokenBreakdown);\n default:\n return formatCost(cost);\n }\n }\n\n private formatUsageWithBudget(\n cost: number | null,\n tokens: number | null,\n tokenBreakdown: TokenBreakdown | null,\n type: string,\n budget: number | undefined,\n warningThreshold = 80\n ): string {\n const baseDisplay = this.formatUsageDisplay(\n cost,\n tokens,\n tokenBreakdown,\n type\n );\n\n if (budget && budget > 0 && cost !== null) {\n const budgetStatus = getBudgetStatus(cost, budget, warningThreshold);\n return baseDisplay + budgetStatus.displayText;\n }\n\n return baseDisplay;\n }\n\n private formatSessionBlockInfo(\n blockInfo: SessionBlockInfo,\n type = \"cost\"\n ): string {\n if (!blockInfo.isActive) {\n return \"No active block\";\n }\n\n const timeStr = formatTimeRemaining(blockInfo.timeRemaining);\n\n if (type === \"tokens\") {\n const tokensStr = formatTokens(blockInfo.tokens);\n let result = `${tokensStr} (${timeStr} left)`;\n\n if (blockInfo.tokenBurnRate !== null && blockInfo.tokenBurnRate > 0) {\n const burnRateStr = `${formatTokens(blockInfo.tokenBurnRate)}/hr`;\n result += ` ${burnRateStr}`;\n }\n\n return result;\n } else {\n const costStr = formatCost(blockInfo.cost);\n let result = `${costStr} (${timeStr} left)`;\n\n if (blockInfo.burnRate !== null && blockInfo.burnRate > 0) {\n const burnRateStr = `${formatCost(blockInfo.burnRate)}/hr`;\n result += ` ${burnRateStr}`;\n }\n\n return result;\n }\n }\n}\n","import type { ClaudeHookData, PowerlineColors } from \"./types\";\nimport type {\n PowerlineConfig,\n LineConfig,\n AnySegmentConfig,\n GitSegmentConfig,\n UsageSegmentConfig,\n BlockSegmentConfig,\n} from \"./types/config\";\nimport { hexToAnsi, extractBgToFg } from \"./lib/colors\";\nimport { getTheme } from \"./themes\";\nimport {\n UsageProvider,\n UsageInfo,\n SessionBlockInfo,\n} from \"./lib/usage-provider\";\nimport { GitService } from \"./lib/git-service\";\nimport { TmuxService } from \"./lib/tmux-service\";\nimport { SegmentRenderer, PowerlineSymbols } from \"./lib/segment-renderer\";\n\nexport class PowerlineRenderer {\n private readonly symbols: PowerlineSymbols;\n private readonly usageProvider: UsageProvider;\n private readonly gitService: GitService;\n private readonly tmuxService: TmuxService;\n private readonly segmentRenderer: SegmentRenderer;\n\n constructor(private readonly config: PowerlineConfig) {\n this.symbols = this.initializeSymbols();\n this.usageProvider = new UsageProvider();\n this.gitService = new GitService();\n this.tmuxService = new TmuxService();\n this.segmentRenderer = new SegmentRenderer(config, this.symbols);\n }\n\n async generateStatusline(hookData: ClaudeHookData): Promise<string> {\n const usageInfo = await this.usageProvider.getUsageInfo(\n hookData.session_id\n );\n\n let sessionBlockInfo = null;\n if (this.needsSessionBlock()) {\n sessionBlockInfo = await this.usageProvider.getSessionBlockInfo();\n }\n\n const lines = this.config.display.lines\n .map((lineConfig) =>\n this.renderLine(lineConfig, hookData, usageInfo, sessionBlockInfo)\n )\n .filter((line) => line.length > 0);\n\n return lines.join(\"\\n\");\n }\n\n private needsSessionBlock(): boolean {\n return this.config.display.lines.some(\n (line) => line.segments.block?.enabled\n );\n }\n\n private renderLine(\n lineConfig: LineConfig,\n hookData: ClaudeHookData,\n usageInfo: UsageInfo,\n sessionBlockInfo: SessionBlockInfo | null\n ): string {\n const colors = this.getThemeColors();\n const currentDir = hookData.workspace?.current_dir || hookData.cwd || \"/\";\n\n const segments = Object.entries(lineConfig.segments)\n .filter(\n ([_, config]: [string, AnySegmentConfig | undefined]) => config?.enabled\n )\n .map(([type, config]: [string, AnySegmentConfig]) => ({ type, config }));\n\n let line = colors.reset;\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n if (!segment) continue;\n\n const isLast = i === segments.length - 1;\n const nextSegment = !isLast ? segments[i + 1] : null;\n const nextBgColor = nextSegment\n ? this.getSegmentBgColor(nextSegment.type, colors)\n : \"\";\n\n const segmentData = this.renderSegment(\n segment,\n hookData,\n usageInfo,\n sessionBlockInfo,\n colors,\n currentDir\n );\n\n if (segmentData) {\n line += this.formatSegment(\n segmentData.bgColor,\n segmentData.fgColor,\n segmentData.text,\n isLast ? undefined : nextBgColor\n );\n }\n }\n\n return line;\n }\n\n private renderSegment(\n segment: { type: string; config: AnySegmentConfig },\n hookData: ClaudeHookData,\n usageInfo: UsageInfo,\n sessionBlockInfo: SessionBlockInfo | null,\n colors: PowerlineColors,\n currentDir: string\n ) {\n switch (segment.type) {\n case \"directory\":\n return this.segmentRenderer.renderDirectory(hookData, colors);\n\n case \"git\":\n const showSha = (segment.config as GitSegmentConfig)?.showSha || false;\n const gitInfo = this.gitService.getGitInfo(currentDir, showSha);\n return gitInfo\n ? this.segmentRenderer.renderGit(gitInfo, colors, showSha)\n : null;\n\n case \"model\":\n return this.segmentRenderer.renderModel(hookData, colors);\n\n case \"session\":\n const usageType =\n (segment.config as UsageSegmentConfig)?.type || \"cost\";\n return this.segmentRenderer.renderSession(usageInfo, colors, usageType);\n\n case \"today\":\n const todayType =\n (segment.config as UsageSegmentConfig)?.type || \"cost\";\n return this.segmentRenderer.renderToday(usageInfo, colors, todayType);\n\n case \"block\":\n const blockType =\n (segment.config as BlockSegmentConfig)?.type || \"cost\";\n return this.segmentRenderer.renderBlock(\n sessionBlockInfo,\n colors,\n blockType\n );\n\n case \"tmux\":\n const tmuxSessionId = this.tmuxService.getSessionId();\n return this.segmentRenderer.renderTmux(tmuxSessionId, colors);\n\n default:\n return null;\n }\n }\n\n private initializeSymbols(): PowerlineSymbols {\n const isMinimalStyle = this.config.display.style === \"minimal\";\n\n return {\n right: isMinimalStyle ? \"\" : \"\\uE0B0\",\n branch: \"⑂\",\n model: \"⚡\",\n git_clean: \"✓\",\n git_dirty: \"●\",\n git_conflicts: \"⚠\",\n git_ahead: \"↑\",\n git_behind: \"↓\",\n session_cost: \"Session\",\n daily_cost: \"Today\",\n block_cost: \"Block\",\n };\n }\n\n private getThemeColors(): PowerlineColors {\n const theme = this.config.theme;\n let colorTheme;\n\n if (theme === \"custom\") {\n colorTheme = this.config.colors?.custom;\n if (!colorTheme) {\n throw new Error(\n \"Custom theme selected but no colors provided in configuration\"\n );\n }\n } else {\n colorTheme = getTheme(theme);\n if (!colorTheme) {\n console.warn(\n `Built-in theme '${theme}' not found, falling back to 'dark' theme`\n );\n colorTheme = getTheme(\"dark\")!;\n }\n }\n\n return {\n reset: \"\\x1b[0m\",\n modeBg: hexToAnsi(colorTheme.directory.bg, true),\n modeFg: hexToAnsi(colorTheme.directory.fg, false),\n gitBg: hexToAnsi(colorTheme.git.bg, true),\n gitFg: hexToAnsi(colorTheme.git.fg, false),\n modelBg: hexToAnsi(colorTheme.model.bg, true),\n modelFg: hexToAnsi(colorTheme.model.fg, false),\n sessionBg: hexToAnsi(colorTheme.session.bg, true),\n sessionFg: hexToAnsi(colorTheme.session.fg, false),\n todayBg: hexToAnsi(colorTheme.today.bg, true),\n todayFg: hexToAnsi(colorTheme.today.fg, false),\n blockBg: hexToAnsi(colorTheme.block.bg, true),\n blockFg: hexToAnsi(colorTheme.block.fg, false),\n burnLowBg: hexToAnsi(colorTheme.today.bg, true),\n burnFg: hexToAnsi(colorTheme.today.fg, false),\n tmuxBg: hexToAnsi(colorTheme.tmux.bg, true),\n tmuxFg: hexToAnsi(colorTheme.tmux.fg, false),\n };\n }\n\n private getSegmentBgColor(\n segmentType: string,\n colors: PowerlineColors\n ): string {\n switch (segmentType) {\n case \"directory\":\n return colors.modeBg;\n case \"git\":\n return colors.gitBg;\n case \"model\":\n return colors.modelBg;\n case \"session\":\n return colors.sessionBg;\n case \"today\":\n return colors.burnLowBg;\n case \"block\":\n return colors.blockBg;\n case \"tmux\":\n return colors.tmuxBg;\n default:\n return colors.modeBg;\n }\n }\n\n private formatSegment(\n bgColor: string,\n fgColor: string,\n text: string,\n nextBgColor?: string\n ): string {\n let output = `${bgColor}${fgColor} ${text} `;\n\n const reset = \"\\x1b[0m\";\n\n if (nextBgColor) {\n const arrowFgColor = extractBgToFg(bgColor);\n output += `${reset}${nextBgColor}${arrowFgColor}${this.symbols.right}`;\n } else {\n output += `${reset}${extractBgToFg(bgColor)}${this.symbols.right}${reset}`;\n }\n\n return output;\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport type { PowerlineConfig, ConfigLoadOptions } from \"../types/config\";\nimport { DEFAULT_CONFIG } from \"./defaults\";\n\nfunction deepMerge<T extends Record<string, any>>(\n target: T,\n source: Partial<T>\n): T {\n const result = { ...target };\n\n for (const key in source) {\n const sourceValue = source[key];\n if (sourceValue !== undefined) {\n if (\n typeof sourceValue === \"object\" &&\n sourceValue !== null &&\n !Array.isArray(sourceValue)\n ) {\n const targetValue = result[key] || {};\n result[key] = deepMerge(\n targetValue as Record<string, any>,\n sourceValue as Record<string, any>\n ) as T[Extract<keyof T, string>];\n } else if (Array.isArray(sourceValue) && sourceValue.length === 0) {\n const targetValue = result[key];\n if (!Array.isArray(targetValue) || targetValue.length > 0) {\n continue;\n } else {\n result[key] = sourceValue as T[Extract<keyof T, string>];\n }\n } else {\n result[key] = sourceValue as T[Extract<keyof T, string>];\n }\n }\n }\n\n return result;\n}\n\nfunction findConfigFile(\n customPath?: string,\n projectDir?: string\n): string | null {\n if (customPath) {\n return fs.existsSync(customPath) ? customPath : null;\n }\n\n const locations = [\n ...(projectDir ? [path.join(projectDir, \".claude-powerline.json\")] : []),\n path.join(process.cwd(), \".claude-powerline.json\"),\n path.join(os.homedir(), \".claude\", \"claude-powerline.json\"),\n path.join(os.homedir(), \".config\", \"claude-powerline\", \"config.json\"),\n ];\n\n return locations.find(fs.existsSync) || null;\n}\n\nfunction loadConfigFile(filePath: string): Partial<PowerlineConfig> {\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n return JSON.parse(content);\n } catch (error) {\n throw new Error(\n `Failed to load config file ${filePath}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nfunction loadEnvConfig(): Partial<PowerlineConfig> {\n const config: Partial<PowerlineConfig> = {};\n\n if (process.env.CLAUDE_POWERLINE_THEME) {\n config.theme = process.env.CLAUDE_POWERLINE_THEME as\n | \"light\"\n | \"dark\"\n | \"custom\";\n }\n\n if (process.env.CLAUDE_POWERLINE_STYLE) {\n if (!config.display) {\n config.display = { lines: [] };\n }\n const style = process.env.CLAUDE_POWERLINE_STYLE;\n if (style === \"minimal\" || style === \"powerline\") {\n config.display.style = style;\n } else {\n console.warn(\n `Invalid display style '${style}' from environment variable, falling back to 'minimal'`\n );\n config.display.style = \"minimal\";\n }\n }\n\n if (process.env.CLAUDE_POWERLINE_USAGE_TYPE) {\n const usageType = process.env.CLAUDE_POWERLINE_USAGE_TYPE as\n | \"cost\"\n | \"tokens\"\n | \"both\"\n | \"breakdown\";\n if (!config.display) {\n config.display = { lines: [] };\n }\n\n if (config.display.lines.length === 0) {\n config.display.lines = [{ segments: {} }];\n }\n\n config.display.lines.forEach((line) => {\n if (line.segments.session) {\n line.segments.session.type = usageType;\n }\n if (line.segments.today) {\n line.segments.today.type = usageType;\n }\n if (line.segments.block) {\n line.segments.block.type =\n usageType === \"breakdown\" || usageType === \"both\"\n ? \"cost\"\n : usageType;\n }\n });\n }\n\n return config;\n}\n\nfunction getConfigPathFromEnv(): string | undefined {\n return process.env.CLAUDE_POWERLINE_CONFIG;\n}\n\nfunction parseCLIOverrides(args: string[]): Partial<PowerlineConfig> {\n const config: Partial<PowerlineConfig> = {};\n\n const themeIndex = args.findIndex((arg) => arg.startsWith(\"--theme=\"));\n if (themeIndex !== -1) {\n const theme = args[themeIndex]?.split(\"=\")[1];\n if (theme) {\n config.theme = theme as \"light\" | \"dark\" | \"custom\";\n }\n }\n\n const styleIndex = args.findIndex((arg) => arg.startsWith(\"--style=\"));\n if (styleIndex !== -1) {\n const style = args[styleIndex]?.split(\"=\")[1];\n if (style) {\n if (!config.display) {\n config.display = { lines: [] };\n }\n if (style === \"minimal\" || style === \"powerline\") {\n config.display.style = style;\n } else {\n console.warn(\n `Invalid display style '${style}' from CLI argument, falling back to 'minimal'`\n );\n config.display.style = \"minimal\";\n }\n }\n }\n\n const dailyBudgetIndex = args.findIndex((arg) =>\n arg.startsWith(\"--daily-budget=\")\n );\n if (dailyBudgetIndex !== -1) {\n const dailyBudget = parseFloat(args[dailyBudgetIndex]?.split(\"=\")[1] || \"\");\n if (!isNaN(dailyBudget) && dailyBudget > 0) {\n config.budget = {\n ...config.budget,\n today: {\n ...DEFAULT_CONFIG.budget?.today,\n amount: dailyBudget,\n },\n };\n }\n }\n\n const sessionBudgetIndex = args.findIndex((arg) =>\n arg.startsWith(\"--session-budget=\")\n );\n if (sessionBudgetIndex !== -1) {\n const sessionBudget = parseFloat(\n args[sessionBudgetIndex]?.split(\"=\")[1] || \"\"\n );\n if (!isNaN(sessionBudget) && sessionBudget > 0) {\n config.budget = {\n ...config.budget,\n session: {\n ...DEFAULT_CONFIG.budget?.session,\n amount: sessionBudget,\n },\n };\n }\n }\n\n const usageIndex = args.findIndex((arg) => arg.startsWith(\"--usage=\"));\n if (usageIndex !== -1) {\n const usageType = args[usageIndex]?.split(\"=\")[1] as\n | \"cost\"\n | \"tokens\"\n | \"both\"\n | \"breakdown\";\n if (\n usageType &&\n [\"cost\", \"tokens\", \"both\", \"breakdown\"].includes(usageType)\n ) {\n if (!config.display) {\n config.display = { lines: [] };\n }\n\n if (config.display.lines.length === 0) {\n config.display.lines = [{ segments: {} }];\n }\n\n config.display.lines.forEach((line) => {\n if (line.segments.session) {\n line.segments.session.type = usageType;\n }\n if (line.segments.today) {\n line.segments.today.type = usageType;\n }\n if (line.segments.block) {\n line.segments.block.type =\n usageType === \"breakdown\" || usageType === \"both\"\n ? \"cost\"\n : usageType;\n }\n });\n }\n }\n\n return config;\n}\n\nexport function loadConfig(options: ConfigLoadOptions = {}): PowerlineConfig {\n const {\n configPath,\n ignoreEnvVars = false,\n cliOverrides = {},\n projectDir,\n } = options;\n\n let config: PowerlineConfig = JSON.parse(JSON.stringify(DEFAULT_CONFIG));\n\n const configFile = findConfigFile(configPath, projectDir);\n if (configFile) {\n try {\n const fileConfig = loadConfigFile(configFile);\n config = deepMerge(config, fileConfig);\n } catch (err) {\n console.warn(\n `Warning: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n }\n\n if (\n config.display?.style &&\n config.display.style !== \"minimal\" &&\n config.display.style !== \"powerline\"\n ) {\n console.warn(\n `Invalid display style '${config.display.style}' in config file, falling back to 'minimal'`\n );\n config.display.style = \"minimal\";\n }\n\n if (!ignoreEnvVars) {\n const envConfig = loadEnvConfig();\n config = deepMerge(config, envConfig);\n }\n\n config = deepMerge(config, cliOverrides);\n\n return config;\n}\n\nexport function loadConfigFromCLI(\n args: string[] = process.argv,\n projectDir?: string\n): PowerlineConfig {\n const configPathIndex = args.findIndex((arg) => arg.startsWith(\"--config=\"));\n const configPath =\n configPathIndex !== -1\n ? args[configPathIndex]?.split(\"=\")[1]\n : getConfigPathFromEnv();\n\n const cliOverrides = parseCLIOverrides(args);\n\n return loadConfig({ configPath, cliOverrides, projectDir });\n}\n\nexport function getConfigPath(\n customPath?: string,\n projectDir?: string\n): string | null {\n return findConfigFile(customPath, projectDir);\n}\n","import type { PowerlineConfig } from \"../types/config\";\n\nexport const DEFAULT_CONFIG: PowerlineConfig = {\n theme: \"dark\",\n display: {\n style: \"minimal\",\n lines: [\n {\n segments: {\n directory: { enabled: true },\n git: {\n enabled: true,\n showSha: false,\n },\n model: { enabled: true },\n session: { enabled: true, type: \"tokens\" },\n today: { enabled: true, type: \"both\" },\n block: { enabled: false, type: \"cost\" },\n tmux: { enabled: false },\n },\n },\n ],\n },\n budget: {\n session: {\n warningThreshold: 80,\n },\n today: {\n amount: 50,\n warningThreshold: 80,\n },\n },\n};\n"],"mappings":";;;AAEA,OAAOA,cAAa;AACpB,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AACf,SAAS,YAAAC,iBAAgB;AACzB,OAAOC,SAAQ;AACf,SAAS,YAAY;;;ACPd,SAAS,UAAU,KAAa,cAA+B;AACpE,QAAM,IAAI,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AACtC,QAAM,IAAI,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AACtC,QAAM,IAAI,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AACtC,SAAO,QAAQ,eAAe,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;AAC5D;AAEO,SAAS,cAAc,UAA0B;AACtD,QAAM,QAAQ,SAAS,MAAM,wBAAwB;AACrD,MAAI,OAAO;AACT,WAAO,aAAa,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAAA,EACtD;AACA,SAAO,SAAS,QAAQ,MAAM,IAAI;AACpC;;;ACXO,IAAM,YAAwB;AAAA,EACnC,WAAW,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EAC1C,KAAK,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACpC,OAAO,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACtC,SAAS,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACxC,OAAO,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACtC,OAAO,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACtC,MAAM,EAAE,IAAI,WAAW,IAAI,UAAU;AACvC;;;ACRO,IAAM,aAAyB;AAAA,EACpC,WAAW,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EAC1C,KAAK,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACpC,OAAO,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACtC,SAAS,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACxC,OAAO,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACtC,OAAO,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACtC,MAAM,EAAE,IAAI,WAAW,IAAI,UAAU;AACvC;;;ACRO,IAAM,YAAwB;AAAA,EACnC,WAAW,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EAC1C,KAAK,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACpC,OAAO,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACtC,SAAS,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACxC,OAAO,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACtC,OAAO,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACtC,MAAM,EAAE,IAAI,WAAW,IAAI,UAAU;AACvC;;;ACRO,IAAM,kBAA8B;AAAA,EACzC,WAAW,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EAC1C,KAAK,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACpC,OAAO,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACtC,SAAS,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACxC,OAAO,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACtC,OAAO,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACtC,MAAM,EAAE,IAAI,WAAW,IAAI,UAAU;AACvC;;;ACRO,IAAM,gBAA4B;AAAA,EACvC,WAAW,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EAC1C,KAAK,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACpC,OAAO,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACtC,SAAS,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACxC,OAAO,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACtC,OAAO,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACtC,MAAM,EAAE,IAAI,WAAW,IAAI,UAAU;AACvC;;;ACHO,IAAM,kBAA8C;AAAA,EACzD,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,eAAe;AAAA,EACf,aAAa;AACf;AAEO,SAAS,SAAS,WAAsC;AAC7D,SAAO,gBAAgB,SAAS,KAAK;AACvC;;;ACjBA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB,sBAAsB;AAChD,SAAS,cAAc;AA+BhB,IAAM,gBAAN,MAAoB;AAAA,EACzB,MAAM,sBAAwD;AAC5D,UAAM,gBAAgB,OAAO;AAC7B,WAAO,QAAQ;AAEf,QAAI;AACF,YAAM,SAAS,MAAM,qBAAqB;AAAA,QACxC,MAAM;AAAA,QACN,sBAAsB;AAAA,MACxB,CAAC;AAED,YAAM,cAAc,OAAO,KAAK,CAAC,UAAU,MAAM,QAAQ;AAEzD,UAAI,CAAC,aAAa;AAChB,eAAO;AAAA,MACT;AAEA,YAAM,MAAM,oBAAI,KAAK;AACrB,YAAM,gBAAgB,KAAK;AAAA,SACxB,YAAY,QAAQ,QAAQ,IAAI,IAAI,QAAQ,MAAM,MAAO;AAAA,MAC5D;AAEA,YAAM,UAAU,KAAK;AAAA,SAClB,IAAI,QAAQ,IAAI,YAAY,UAAU,QAAQ,MAAM,MAAO;AAAA,MAC9D;AAEA,YAAM,eACH,YAAY,aAAa,eAAe,MACxC,YAAY,aAAa,gBAAgB,MACzC,YAAY,aAAa,4BAA4B,MACrD,YAAY,aAAa,wBAAwB;AAEpD,YAAM,WACJ,UAAU,IAAK,YAAY,UAAU,UAAW,KAAK;AACvD,YAAM,gBAAgB,UAAU,IAAK,cAAc,UAAW,KAAK;AAEnE,aAAO;AAAA,QACL,MAAM,YAAY;AAAA,QAClB,QAAQ;AAAA,QACR,eAAe,KAAK,IAAI,GAAG,aAAa;AAAA,QACxC;AAAA,QACA;AAAA,QACA,UAAU;AAAA,MACZ;AAAA,IACF,QAAQ;AACN,aAAO;AAAA,IACT,UAAE;AACA,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,WAAuC;AACxD,UAAM,gBAAgB,OAAO;AAC7B,WAAO,QAAQ;AAEf,QAAI;AACF,YAAM,cAAc,eAAe;AACnC,UAAI,YAAY,WAAW,GAAG;AAC5B,eAAO;AAAA,UACL,SAAS,EAAE,MAAM,MAAM,QAAQ,MAAM,gBAAgB,KAAK;AAAA,UAC1D,OAAO,EAAE,MAAM,GAAG,QAAQ,GAAG,gBAAgB,KAAK;AAAA,QACpD;AAAA,MACF;AAEA,YAAM,CAAC,aAAa,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,QACjD,KAAK,eAAe,SAAS;AAAA,QAC7B,KAAK,aAAa;AAAA,MACpB,CAAC;AAED,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,MACT;AAAA,IACF,QAAQ;AACN,aAAO;AAAA,QACL,SAAS,EAAE,MAAM,MAAM,QAAQ,MAAM,gBAAgB,KAAK;AAAA,QAC1D,OAAO,EAAE,MAAM,GAAG,QAAQ,GAAG,gBAAgB,KAAK;AAAA,MACpD;AAAA,IACF,UAAE;AACA,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,MAAc,eAAe,WAAmB;AAC9C,QAAI;AACF,YAAM,cAAc,MAAM,qBAAqB,WAAW;AAAA,QACxD,MAAM;AAAA,MACR,CAAC;AAED,UAAI,CAAC,aAAa;AAChB,eAAO,EAAE,MAAM,MAAM,QAAQ,MAAM,gBAAgB,KAAK;AAAA,MAC1D;AAEA,YAAM,YAAY,YAAY,QAAQ;AAAA,QACpC,CAAC,KAAK,UAAU;AACd,gBAAM,QAAQ,MAAM,QAAQ;AAC5B,iBAAO;AAAA,YACL,OAAO,IAAI,QAAQ,MAAM;AAAA,YACzB,QAAQ,IAAI,SAAS,MAAM;AAAA,YAC3B,eACE,IAAI,iBAAiB,MAAM,+BAA+B;AAAA,YAC5D,WAAW,IAAI,aAAa,MAAM,2BAA2B;AAAA,UAC/D;AAAA,QACF;AAAA,QACA,EAAE,OAAO,GAAG,QAAQ,GAAG,eAAe,GAAG,WAAW,EAAE;AAAA,MACxD;AAEA,YAAM,cACJ,UAAU,QACV,UAAU,SACV,UAAU,gBACV,UAAU;AAEZ,aAAO;AAAA,QACL,MAAM,YAAY;AAAA,QAClB,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF,QAAQ;AACN,aAAO,EAAE,MAAM,MAAM,QAAQ,MAAM,gBAAgB,KAAK;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,MAAc,eAAe;AAC3B,QAAI;AACF,YAAM,QAAQ,oBAAI,KAAK;AACvB,YAAM,WACJ,MAAM,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,QAAQ,MAAM,EAAE,KAAK;AAE1D,YAAM,YAAY,MAAM,mBAAmB;AAAA,QACzC,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,MACR,CAAC;AAED,UAAI,UAAU,WAAW,GAAG;AAC1B,eAAO,EAAE,MAAM,GAAG,QAAQ,GAAG,gBAAgB,KAAK;AAAA,MACpD;AAEA,YAAM,SAAS,gBAAgB,SAAS;AACxC,YAAM,YAAY,UAAU;AAAA,QAC1B,CAAC,KAAK,UAAU;AACd,iBAAO;AAAA,YACL,OAAO,IAAI,SAAS,MAAM,eAAe;AAAA,YACzC,QAAQ,IAAI,UAAU,MAAM,gBAAgB;AAAA,YAC5C,eAAe,IAAI,iBAAiB,MAAM,uBAAuB;AAAA,YACjE,WAAW,IAAI,aAAa,MAAM,mBAAmB;AAAA,UACvD;AAAA,QACF;AAAA,QACA,EAAE,OAAO,GAAG,QAAQ,GAAG,eAAe,GAAG,WAAW,EAAE;AAAA,MACxD;AAEA,aAAO;AAAA,QACL,MAAM,OAAO;AAAA,QACb,QAAQ,eAAe,MAAM;AAAA,QAC7B,gBAAgB;AAAA,MAClB;AAAA,IACF,QAAQ;AACN,aAAO,EAAE,MAAM,GAAG,QAAQ,GAAG,gBAAgB,KAAK;AAAA,IACpD;AAAA,EACF;AACF;;;ACvMA,SAAS,gBAAgB;AAUlB,IAAM,aAAN,MAAiB;AAAA,EACtB,WAAW,YAAoB,UAAU,OAAuB;AAC9D,QAAI;AACF,YAAM,SAAS,KAAK,UAAU,UAAU;AACxC,YAAM,SAAS,KAAK,UAAU,UAAU;AACxC,YAAM,EAAE,OAAO,OAAO,IAAI,KAAK,eAAe,UAAU;AACxD,YAAM,MAAM,UAAU,KAAK,OAAO,UAAU,KAAK,SAAY;AAE7D,aAAO;AAAA,QACL,QAAQ,UAAU;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,UAAU,YAAmC;AACnD,QAAI;AACF,aACE,SAAS,6BAA6B;AAAA,QACpC,KAAK;AAAA,QACL,UAAU;AAAA,QACV,SAAS;AAAA,MACX,CAAC,EAAE,KAAK,KAAK;AAAA,IAEjB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,UAAU,YAAqD;AACrE,QAAI;AACF,YAAM,YAAY,SAAS,0BAA0B;AAAA,QACnD,KAAK;AAAA,QACL,UAAU;AAAA,QACV,SAAS;AAAA,MACX,CAAC,EAAE,KAAK;AAER,UAAI,CAAC,UAAW,QAAO;AAEvB,UACE,UAAU,SAAS,IAAI,KACvB,UAAU,SAAS,IAAI,KACvB,UAAU,SAAS,IAAI,GACvB;AACA,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,eAAe,YAGrB;AACA,QAAI;AACF,YAAM,cAAc,SAAS,mCAAmC;AAAA,QAC9D,KAAK;AAAA,QACL,UAAU;AAAA,QACV,SAAS;AAAA,MACX,CAAC,EAAE,KAAK;AAER,YAAM,eAAe,SAAS,mCAAmC;AAAA,QAC/D,KAAK;AAAA,QACL,UAAU;AAAA,QACV,SAAS;AAAA,MACX,CAAC,EAAE,KAAK;AAER,aAAO;AAAA,QACL,OAAO,SAAS,WAAW,KAAK;AAAA,QAChC,QAAQ,SAAS,YAAY,KAAK;AAAA,MACpC;AAAA,IACF,QAAQ;AACN,aAAO,EAAE,OAAO,GAAG,QAAQ,EAAE;AAAA,IAC/B;AAAA,EACF;AAAA,EAEQ,OAAO,YAAmC;AAChD,QAAI;AACF,YAAM,MAAM,SAAS,gCAAgC;AAAA,QACnD,KAAK;AAAA,QACL,UAAU;AAAA,QACV,SAAS;AAAA,MACX,CAAC,EAAE,KAAK;AAER,aAAO,OAAO;AAAA,IAChB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC3GA,SAAS,YAAAC,iBAAgB;AAElB,IAAM,cAAN,MAAkB;AAAA,EACvB,eAA8B;AAC5B,QAAI;AACF,UAAI,CAAC,QAAQ,IAAI,WAAW;AAC1B,eAAO;AAAA,MACT;AAEA,YAAM,YAAYA,UAAS,gCAAgC;AAAA,QACzD,UAAU;AAAA,QACV,SAAS;AAAA,MACX,CAAC,EAAE,KAAK;AAER,aAAO,aAAa;AAAA,IACtB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,WAAoB;AAClB,WAAO,CAAC,CAAC,QAAQ,IAAI;AAAA,EACvB;AACF;;;AChBO,SAAS,WAAW,MAA6B;AACtD,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,OAAO,KAAM,QAAO;AACxB,SAAO,IAAI,KAAK,QAAQ,CAAC,CAAC;AAC5B;AAEO,SAAS,aAAa,QAA+B;AAC1D,MAAI,WAAW,KAAM,QAAO;AAC5B,MAAI,WAAW,EAAG,QAAO;AACzB,MAAI,UAAU,KAAW;AACvB,WAAO,IAAI,SAAS,KAAW,QAAQ,CAAC,CAAC;AAAA,EAC3C,WAAW,UAAU,KAAO;AAC1B,WAAO,IAAI,SAAS,KAAO,QAAQ,CAAC,CAAC;AAAA,EACvC;AACA,SAAO,GAAG,MAAM;AAClB;AAEO,SAAS,qBAAqB,WAA0C;AAC7E,MAAI,CAAC,UAAW,QAAO;AAEvB,QAAM,QAAkB,CAAC;AAEzB,MAAI,UAAU,QAAQ,GAAG;AACvB,UAAM,KAAK,GAAG,aAAa,UAAU,KAAK,EAAE,QAAQ,WAAW,EAAE,CAAC,IAAI;AAAA,EACxE;AAEA,MAAI,UAAU,SAAS,GAAG;AACxB,UAAM,KAAK,GAAG,aAAa,UAAU,MAAM,EAAE,QAAQ,WAAW,EAAE,CAAC,KAAK;AAAA,EAC1E;AAEA,MAAI,UAAU,gBAAgB,KAAK,UAAU,YAAY,GAAG;AAC1D,UAAM,cAAc,UAAU,gBAAgB,UAAU;AACxD,UAAM,KAAK,GAAG,aAAa,WAAW,EAAE,QAAQ,WAAW,EAAE,CAAC,QAAQ;AAAA,EACxE;AAEA,SAAO,MAAM,SAAS,IAAI,MAAM,KAAK,KAAK,IAAI;AAChD;AAEO,SAAS,oBAAoB,SAAyB;AAC3D,MAAI,WAAW,EAAG,QAAO;AAEzB,QAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AACrC,QAAM,OAAO,UAAU;AAEvB,MAAI,QAAQ,GAAG;AACb,WAAO,GAAG,KAAK,IAAI,OAAO,IAAI,IAAI,IAAI,MAAM,EAAE;AAAA,EAChD;AAEA,SAAO,GAAG,IAAI;AAChB;;;AClDO,SAAS,0BACd,MACA,QACe;AACf,MAAI,CAAC,UAAU,UAAU,KAAK,OAAO,EAAG,QAAO;AAC/C,SAAO,KAAK,IAAI,KAAM,OAAO,SAAU,GAAG;AAC5C;AAEO,SAAS,gBACd,MACA,QACA,mBAAmB,IACL;AACd,QAAM,aAAa,0BAA0B,MAAM,MAAM;AAEzD,MAAI,eAAe,MAAM;AACvB,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,aAAa;AAAA,IACf;AAAA,EACF;AAEA,QAAM,aAAa,GAAG,WAAW,QAAQ,CAAC,CAAC;AAC3C,QAAM,YAAY,cAAc;AAEhC,MAAI,cAAc;AAClB,MAAI,WAAW;AACb,kBAAc,KAAK,UAAU;AAAA,EAC/B,WAAW,cAAc,IAAI;AAC3B,kBAAc,KAAK,UAAU;AAAA,EAC/B,OAAO;AACL,kBAAc,IAAI,UAAU;AAAA,EAC9B;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACVO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YACmB,QACA,SACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAEH,gBACE,UACA,QACa;AACb,UAAM,aAAa,SAAS,WAAW,eAAe,SAAS,OAAO;AACtE,UAAM,aAAa,SAAS,WAAW;AACvC,UAAM,UAAU,KAAK,wBAAwB,YAAY,UAAU;AAEnE,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,OAAO;AAAA,MAChB,SAAS,OAAO;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,UACE,SACA,QACA,UAAU,OACU;AACpB,QAAI,CAAC,QAAS,QAAO;AAErB,QAAI,gBAAgB,KAAK,QAAQ;AACjC,QAAI,QAAQ,WAAW,aAAa;AAClC,sBAAgB,KAAK,QAAQ;AAAA,IAC/B,WAAW,QAAQ,WAAW,SAAS;AACrC,sBAAgB,KAAK,QAAQ;AAAA,IAC/B;AAEA,QAAI,OAAO,GAAG,KAAK,QAAQ,MAAM,IAAI,QAAQ,MAAM,IAAI,aAAa;AAEpE,QAAI,QAAQ,OAAO,SAAS;AAC1B,cAAQ,IAAI,QAAQ,GAAG;AAAA,IACzB;AAEA,QAAI,QAAQ,QAAQ,KAAK,QAAQ,SAAS,GAAG;AAC3C,cAAQ,IAAI,KAAK,QAAQ,SAAS,GAAG,QAAQ,KAAK,GAAG,KAAK,QAAQ,UAAU,GAAG,QAAQ,MAAM;AAAA,IAC/F,WAAW,QAAQ,QAAQ,GAAG;AAC5B,cAAQ,IAAI,KAAK,QAAQ,SAAS,GAAG,QAAQ,KAAK;AAAA,IACpD,WAAW,QAAQ,SAAS,GAAG;AAC7B,cAAQ,IAAI,KAAK,QAAQ,UAAU,GAAG,QAAQ,MAAM;AAAA,IACtD;AAEA,WAAO;AAAA,MACL;AAAA,MACA,SAAS,OAAO;AAAA,MAChB,SAAS,OAAO;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,YAAY,UAA0B,QAAsC;AAC1E,UAAM,YAAY,SAAS,OAAO,gBAAgB;AAElD,WAAO;AAAA,MACL,MAAM,GAAG,KAAK,QAAQ,KAAK,IAAI,SAAS;AAAA,MACxC,SAAS,OAAO;AAAA,MAChB,SAAS,OAAO;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,cACE,WACA,QACA,OAAO,QACM;AACb,UAAM,gBAAgB,KAAK,OAAO,QAAQ;AAC1C,UAAM,OAAO,GAAG,KAAK,QAAQ,YAAY,IAAI,KAAK;AAAA,MAChD,UAAU,QAAQ;AAAA,MAClB,UAAU,QAAQ;AAAA,MAClB,UAAU,QAAQ;AAAA,MAClB;AAAA,MACA,eAAe;AAAA,MACf,eAAe,oBAAoB;AAAA,IACrC,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA,SAAS,OAAO;AAAA,MAChB,SAAS,OAAO;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,YACE,WACA,QACA,OAAO,QACM;AACb,UAAM,cAAc,KAAK,OAAO,QAAQ;AACxC,UAAM,OAAO,SAAS,KAAK;AAAA,MACzB,UAAU,MAAM;AAAA,MAChB,UAAU,MAAM;AAAA,MAChB,UAAU,MAAM;AAAA,MAChB;AAAA,MACA,aAAa;AAAA,MACb,aAAa,oBAAoB;AAAA,IACnC,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA,SAAS,OAAO;AAAA,MAChB,SAAS,OAAO;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,YACE,WACA,QACA,OAAO,QACa;AACpB,QAAI,CAAC,UAAW,QAAO;AAEvB,UAAM,OAAO,GAAG,KAAK,QAAQ,UAAU,IAAI,KAAK,uBAAuB,WAAW,IAAI,CAAC;AAEvF,WAAO;AAAA,MACL;AAAA,MACA,SAAS,OAAO;AAAA,MAChB,SAAS,OAAO;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,WACE,WACA,QACoB;AACpB,QAAI,CAAC,UAAW,QAAO;AAEvB,WAAO;AAAA,MACL,MAAM,QAAQ,SAAS;AAAA,MACvB,SAAS,OAAO;AAAA,MAChB,SAAS,OAAO;AAAA,IAClB;AAAA,EACF;AAAA,EAEQ,wBACN,YACA,YACQ;AACR,QAAI,cAAc,eAAe,YAAY;AAC3C,YAAM,cAAc,WAAW,MAAM,GAAG,EAAE,IAAI,KAAK;AACnD,YAAM,iBAAiB,WAAW,MAAM,GAAG,EAAE,IAAI,KAAK;AAEtD,UAAI,WAAW,SAAS,UAAU,GAAG;AACnC,eAAO,GAAG,WAAW,IAAI,cAAc;AAAA,MACzC;AAEA,aAAO;AAAA,IACT;AAEA,WAAO,WAAW,MAAM,GAAG,EAAE,IAAI,KAAK;AAAA,EACxC;AAAA,EAEQ,mBACN,MACA,QACA,gBACA,MACQ;AACR,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO,WAAW,IAAI;AAAA,MACxB,KAAK;AACH,eAAO,aAAa,MAAM;AAAA,MAC5B,KAAK;AACH,eAAO,GAAG,WAAW,IAAI,CAAC,KAAK,aAAa,MAAM,CAAC;AAAA,MACrD,KAAK;AACH,eAAO,qBAAqB,cAAc;AAAA,MAC5C;AACE,eAAO,WAAW,IAAI;AAAA,IAC1B;AAAA,EACF;AAAA,EAEQ,sBACN,MACA,QACA,gBACA,MACA,QACA,mBAAmB,IACX;AACR,UAAM,cAAc,KAAK;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,UAAU,SAAS,KAAK,SAAS,MAAM;AACzC,YAAM,eAAe,gBAAgB,MAAM,QAAQ,gBAAgB;AACnE,aAAO,cAAc,aAAa;AAAA,IACpC;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,uBACN,WACA,OAAO,QACC;AACR,QAAI,CAAC,UAAU,UAAU;AACvB,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,oBAAoB,UAAU,aAAa;AAE3D,QAAI,SAAS,UAAU;AACrB,YAAM,YAAY,aAAa,UAAU,MAAM;AAC/C,UAAI,SAAS,GAAG,SAAS,KAAK,OAAO;AAErC,UAAI,UAAU,kBAAkB,QAAQ,UAAU,gBAAgB,GAAG;AACnE,cAAM,cAAc,GAAG,aAAa,UAAU,aAAa,CAAC;AAC5D,kBAAU,IAAI,WAAW;AAAA,MAC3B;AAEA,aAAO;AAAA,IACT,OAAO;AACL,YAAM,UAAU,WAAW,UAAU,IAAI;AACzC,UAAI,SAAS,GAAG,OAAO,KAAK,OAAO;AAEnC,UAAI,UAAU,aAAa,QAAQ,UAAU,WAAW,GAAG;AACzD,cAAM,cAAc,GAAG,WAAW,UAAU,QAAQ,CAAC;AACrD,kBAAU,IAAI,WAAW;AAAA,MAC3B;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACxPO,IAAM,oBAAN,MAAwB;AAAA,EAO7B,YAA6B,QAAyB;AAAzB;AAC3B,SAAK,UAAU,KAAK,kBAAkB;AACtC,SAAK,gBAAgB,IAAI,cAAc;AACvC,SAAK,aAAa,IAAI,WAAW;AACjC,SAAK,cAAc,IAAI,YAAY;AACnC,SAAK,kBAAkB,IAAI,gBAAgB,QAAQ,KAAK,OAAO;AAAA,EACjE;AAAA,EAZiB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAUjB,MAAM,mBAAmB,UAA2C;AAClE,UAAM,YAAY,MAAM,KAAK,cAAc;AAAA,MACzC,SAAS;AAAA,IACX;AAEA,QAAI,mBAAmB;AACvB,QAAI,KAAK,kBAAkB,GAAG;AAC5B,yBAAmB,MAAM,KAAK,cAAc,oBAAoB;AAAA,IAClE;AAEA,UAAM,QAAQ,KAAK,OAAO,QAAQ,MAC/B;AAAA,MAAI,CAAC,eACJ,KAAK,WAAW,YAAY,UAAU,WAAW,gBAAgB;AAAA,IACnE,EACC,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AAEnC,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEQ,oBAA6B;AACnC,WAAO,KAAK,OAAO,QAAQ,MAAM;AAAA,MAC/B,CAAC,SAAS,KAAK,SAAS,OAAO;AAAA,IACjC;AAAA,EACF;AAAA,EAEQ,WACN,YACA,UACA,WACA,kBACQ;AACR,UAAM,SAAS,KAAK,eAAe;AACnC,UAAM,aAAa,SAAS,WAAW,eAAe,SAAS,OAAO;AAEtE,UAAM,WAAW,OAAO,QAAQ,WAAW,QAAQ,EAChD;AAAA,MACC,CAAC,CAAC,GAAG,MAAM,MAA8C,QAAQ;AAAA,IACnE,EACC,IAAI,CAAC,CAAC,MAAM,MAAM,OAAmC,EAAE,MAAM,OAAO,EAAE;AAEzE,QAAI,OAAO,OAAO;AAElB,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,YAAM,UAAU,SAAS,CAAC;AAC1B,UAAI,CAAC,QAAS;AAEd,YAAM,SAAS,MAAM,SAAS,SAAS;AACvC,YAAM,cAAc,CAAC,SAAS,SAAS,IAAI,CAAC,IAAI;AAChD,YAAM,cAAc,cAChB,KAAK,kBAAkB,YAAY,MAAM,MAAM,IAC/C;AAEJ,YAAM,cAAc,KAAK;AAAA,QACvB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,aAAa;AACf,gBAAQ,KAAK;AAAA,UACX,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,SAAS,SAAY;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,cACN,SACA,UACA,WACA,kBACA,QACA,YACA;AACA,YAAQ,QAAQ,MAAM;AAAA,MACpB,KAAK;AACH,eAAO,KAAK,gBAAgB,gBAAgB,UAAU,MAAM;AAAA,MAE9D,KAAK;AACH,cAAM,UAAW,QAAQ,QAA6B,WAAW;AACjE,cAAM,UAAU,KAAK,WAAW,WAAW,YAAY,OAAO;AAC9D,eAAO,UACH,KAAK,gBAAgB,UAAU,SAAS,QAAQ,OAAO,IACvD;AAAA,MAEN,KAAK;AACH,eAAO,KAAK,gBAAgB,YAAY,UAAU,MAAM;AAAA,MAE1D,KAAK;AACH,cAAM,YACH,QAAQ,QAA+B,QAAQ;AAClD,eAAO,KAAK,gBAAgB,cAAc,WAAW,QAAQ,SAAS;AAAA,MAExE,KAAK;AACH,cAAM,YACH,QAAQ,QAA+B,QAAQ;AAClD,eAAO,KAAK,gBAAgB,YAAY,WAAW,QAAQ,SAAS;AAAA,MAEtE,KAAK;AACH,cAAM,YACH,QAAQ,QAA+B,QAAQ;AAClD,eAAO,KAAK,gBAAgB;AAAA,UAC1B;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MAEF,KAAK;AACH,cAAM,gBAAgB,KAAK,YAAY,aAAa;AACpD,eAAO,KAAK,gBAAgB,WAAW,eAAe,MAAM;AAAA,MAE9D;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,oBAAsC;AAC5C,UAAM,iBAAiB,KAAK,OAAO,QAAQ,UAAU;AAErD,WAAO;AAAA,MACL,OAAO,iBAAiB,KAAK;AAAA,MAC7B,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,WAAW;AAAA,MACX,WAAW;AAAA,MACX,eAAe;AAAA,MACf,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,YAAY;AAAA,IACd;AAAA,EACF;AAAA,EAEQ,iBAAkC;AACxC,UAAM,QAAQ,KAAK,OAAO;AAC1B,QAAI;AAEJ,QAAI,UAAU,UAAU;AACtB,mBAAa,KAAK,OAAO,QAAQ;AACjC,UAAI,CAAC,YAAY;AACf,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,mBAAa,SAAS,KAAK;AAC3B,UAAI,CAAC,YAAY;AACf,gBAAQ;AAAA,UACN,mBAAmB,KAAK;AAAA,QAC1B;AACA,qBAAa,SAAS,MAAM;AAAA,MAC9B;AAAA,IACF;AAEA,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ,UAAU,WAAW,UAAU,IAAI,IAAI;AAAA,MAC/C,QAAQ,UAAU,WAAW,UAAU,IAAI,KAAK;AAAA,MAChD,OAAO,UAAU,WAAW,IAAI,IAAI,IAAI;AAAA,MACxC,OAAO,UAAU,WAAW,IAAI,IAAI,KAAK;AAAA,MACzC,SAAS,UAAU,WAAW,MAAM,IAAI,IAAI;AAAA,MAC5C,SAAS,UAAU,WAAW,MAAM,IAAI,KAAK;AAAA,MAC7C,WAAW,UAAU,WAAW,QAAQ,IAAI,IAAI;AAAA,MAChD,WAAW,UAAU,WAAW,QAAQ,IAAI,KAAK;AAAA,MACjD,SAAS,UAAU,WAAW,MAAM,IAAI,IAAI;AAAA,MAC5C,SAAS,UAAU,WAAW,MAAM,IAAI,KAAK;AAAA,MAC7C,SAAS,UAAU,WAAW,MAAM,IAAI,IAAI;AAAA,MAC5C,SAAS,UAAU,WAAW,MAAM,IAAI,KAAK;AAAA,MAC7C,WAAW,UAAU,WAAW,MAAM,IAAI,IAAI;AAAA,MAC9C,QAAQ,UAAU,WAAW,MAAM,IAAI,KAAK;AAAA,MAC5C,QAAQ,UAAU,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1C,QAAQ,UAAU,WAAW,KAAK,IAAI,KAAK;AAAA,IAC7C;AAAA,EACF;AAAA,EAEQ,kBACN,aACA,QACQ;AACR,YAAQ,aAAa;AAAA,MACnB,KAAK;AACH,eAAO,OAAO;AAAA,MAChB,KAAK;AACH,eAAO,OAAO;AAAA,MAChB,KAAK;AACH,eAAO,OAAO;AAAA,MAChB,KAAK;AACH,eAAO,OAAO;AAAA,MAChB,KAAK;AACH,eAAO,OAAO;AAAA,MAChB,KAAK;AACH,eAAO,OAAO;AAAA,MAChB,KAAK;AACH,eAAO,OAAO;AAAA,MAChB;AACE,eAAO,OAAO;AAAA,IAClB;AAAA,EACF;AAAA,EAEQ,cACN,SACA,SACA,MACA,aACQ;AACR,QAAI,SAAS,GAAG,OAAO,GAAG,OAAO,IAAI,IAAI;AAEzC,UAAM,QAAQ;AAEd,QAAI,aAAa;AACf,YAAM,eAAe,cAAc,OAAO;AAC1C,gBAAU,GAAG,KAAK,GAAG,WAAW,GAAG,YAAY,GAAG,KAAK,QAAQ,KAAK;AAAA,IACtE,OAAO;AACL,gBAAU,GAAG,KAAK,GAAG,cAAc,OAAO,CAAC,GAAG,KAAK,QAAQ,KAAK,GAAG,KAAK;AAAA,IAC1E;AAEA,WAAO;AAAA,EACT;AACF;;;ACtQA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,QAAQ;;;ACAR,IAAM,iBAAkC;AAAA,EAC7C,OAAO;AAAA,EACP,SAAS;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,MACL;AAAA,QACE,UAAU;AAAA,UACR,WAAW,EAAE,SAAS,KAAK;AAAA,UAC3B,KAAK;AAAA,YACH,SAAS;AAAA,YACT,SAAS;AAAA,UACX;AAAA,UACA,OAAO,EAAE,SAAS,KAAK;AAAA,UACvB,SAAS,EAAE,SAAS,MAAM,MAAM,SAAS;AAAA,UACzC,OAAO,EAAE,SAAS,MAAM,MAAM,OAAO;AAAA,UACrC,OAAO,EAAE,SAAS,OAAO,MAAM,OAAO;AAAA,UACtC,MAAM,EAAE,SAAS,MAAM;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,SAAS;AAAA,MACP,kBAAkB;AAAA,IACpB;AAAA,IACA,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,kBAAkB;AAAA,IACpB;AAAA,EACF;AACF;;;AD1BA,SAAS,UACP,QACA,QACG;AACH,QAAM,SAAS,EAAE,GAAG,OAAO;AAE3B,aAAW,OAAO,QAAQ;AACxB,UAAM,cAAc,OAAO,GAAG;AAC9B,QAAI,gBAAgB,QAAW;AAC7B,UACE,OAAO,gBAAgB,YACvB,gBAAgB,QAChB,CAAC,MAAM,QAAQ,WAAW,GAC1B;AACA,cAAM,cAAc,OAAO,GAAG,KAAK,CAAC;AACpC,eAAO,GAAG,IAAI;AAAA,UACZ;AAAA,UACA;AAAA,QACF;AAAA,MACF,WAAW,MAAM,QAAQ,WAAW,KAAK,YAAY,WAAW,GAAG;AACjE,cAAM,cAAc,OAAO,GAAG;AAC9B,YAAI,CAAC,MAAM,QAAQ,WAAW,KAAK,YAAY,SAAS,GAAG;AACzD;AAAA,QACF,OAAO;AACL,iBAAO,GAAG,IAAI;AAAA,QAChB;AAAA,MACF,OAAO;AACL,eAAO,GAAG,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,eACP,YACA,YACe;AACf,MAAI,YAAY;AACd,WAAO,GAAG,WAAW,UAAU,IAAI,aAAa;AAAA,EAClD;AAEA,QAAM,YAAY;AAAA,IAChB,GAAI,aAAa,CAAC,KAAK,KAAK,YAAY,wBAAwB,CAAC,IAAI,CAAC;AAAA,IACtE,KAAK,KAAK,QAAQ,IAAI,GAAG,wBAAwB;AAAA,IACjD,KAAK,KAAK,GAAG,QAAQ,GAAG,WAAW,uBAAuB;AAAA,IAC1D,KAAK,KAAK,GAAG,QAAQ,GAAG,WAAW,oBAAoB,aAAa;AAAA,EACtE;AAEA,SAAO,UAAU,KAAK,GAAG,UAAU,KAAK;AAC1C;AAEA,SAAS,eAAe,UAA4C;AAClE,MAAI;AACF,UAAM,UAAU,GAAG,aAAa,UAAU,OAAO;AACjD,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,8BAA8B,QAAQ,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACnG;AAAA,EACF;AACF;AAEA,SAAS,gBAA0C;AACjD,QAAM,SAAmC,CAAC;AAE1C,MAAI,QAAQ,IAAI,wBAAwB;AACtC,WAAO,QAAQ,QAAQ,IAAI;AAAA,EAI7B;AAEA,MAAI,QAAQ,IAAI,wBAAwB;AACtC,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO,UAAU,EAAE,OAAO,CAAC,EAAE;AAAA,IAC/B;AACA,UAAM,QAAQ,QAAQ,IAAI;AAC1B,QAAI,UAAU,aAAa,UAAU,aAAa;AAChD,aAAO,QAAQ,QAAQ;AAAA,IACzB,OAAO;AACL,cAAQ;AAAA,QACN,0BAA0B,KAAK;AAAA,MACjC;AACA,aAAO,QAAQ,QAAQ;AAAA,IACzB;AAAA,EACF;AAEA,MAAI,QAAQ,IAAI,6BAA6B;AAC3C,UAAM,YAAY,QAAQ,IAAI;AAK9B,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO,UAAU,EAAE,OAAO,CAAC,EAAE;AAAA,IAC/B;AAEA,QAAI,OAAO,QAAQ,MAAM,WAAW,GAAG;AACrC,aAAO,QAAQ,QAAQ,CAAC,EAAE,UAAU,CAAC,EAAE,CAAC;AAAA,IAC1C;AAEA,WAAO,QAAQ,MAAM,QAAQ,CAAC,SAAS;AACrC,UAAI,KAAK,SAAS,SAAS;AACzB,aAAK,SAAS,QAAQ,OAAO;AAAA,MAC/B;AACA,UAAI,KAAK,SAAS,OAAO;AACvB,aAAK,SAAS,MAAM,OAAO;AAAA,MAC7B;AACA,UAAI,KAAK,SAAS,OAAO;AACvB,aAAK,SAAS,MAAM,OAClB,cAAc,eAAe,cAAc,SACvC,SACA;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,uBAA2C;AAClD,SAAO,QAAQ,IAAI;AACrB;AAEA,SAAS,kBAAkB,MAA0C;AACnE,QAAM,SAAmC,CAAC;AAE1C,QAAM,aAAa,KAAK,UAAU,CAAC,QAAQ,IAAI,WAAW,UAAU,CAAC;AACrE,MAAI,eAAe,IAAI;AACrB,UAAM,QAAQ,KAAK,UAAU,GAAG,MAAM,GAAG,EAAE,CAAC;AAC5C,QAAI,OAAO;AACT,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,aAAa,KAAK,UAAU,CAAC,QAAQ,IAAI,WAAW,UAAU,CAAC;AACrE,MAAI,eAAe,IAAI;AACrB,UAAM,QAAQ,KAAK,UAAU,GAAG,MAAM,GAAG,EAAE,CAAC;AAC5C,QAAI,OAAO;AACT,UAAI,CAAC,OAAO,SAAS;AACnB,eAAO,UAAU,EAAE,OAAO,CAAC,EAAE;AAAA,MAC/B;AACA,UAAI,UAAU,aAAa,UAAU,aAAa;AAChD,eAAO,QAAQ,QAAQ;AAAA,MACzB,OAAO;AACL,gBAAQ;AAAA,UACN,0BAA0B,KAAK;AAAA,QACjC;AACA,eAAO,QAAQ,QAAQ;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,mBAAmB,KAAK;AAAA,IAAU,CAAC,QACvC,IAAI,WAAW,iBAAiB;AAAA,EAClC;AACA,MAAI,qBAAqB,IAAI;AAC3B,UAAM,cAAc,WAAW,KAAK,gBAAgB,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK,EAAE;AAC1E,QAAI,CAAC,MAAM,WAAW,KAAK,cAAc,GAAG;AAC1C,aAAO,SAAS;AAAA,QACd,GAAG,OAAO;AAAA,QACV,OAAO;AAAA,UACL,GAAG,eAAe,QAAQ;AAAA,UAC1B,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,qBAAqB,KAAK;AAAA,IAAU,CAAC,QACzC,IAAI,WAAW,mBAAmB;AAAA,EACpC;AACA,MAAI,uBAAuB,IAAI;AAC7B,UAAM,gBAAgB;AAAA,MACpB,KAAK,kBAAkB,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK;AAAA,IAC7C;AACA,QAAI,CAAC,MAAM,aAAa,KAAK,gBAAgB,GAAG;AAC9C,aAAO,SAAS;AAAA,QACd,GAAG,OAAO;AAAA,QACV,SAAS;AAAA,UACP,GAAG,eAAe,QAAQ;AAAA,UAC1B,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,KAAK,UAAU,CAAC,QAAQ,IAAI,WAAW,UAAU,CAAC;AACrE,MAAI,eAAe,IAAI;AACrB,UAAM,YAAY,KAAK,UAAU,GAAG,MAAM,GAAG,EAAE,CAAC;AAKhD,QACE,aACA,CAAC,QAAQ,UAAU,QAAQ,WAAW,EAAE,SAAS,SAAS,GAC1D;AACA,UAAI,CAAC,OAAO,SAAS;AACnB,eAAO,UAAU,EAAE,OAAO,CAAC,EAAE;AAAA,MAC/B;AAEA,UAAI,OAAO,QAAQ,MAAM,WAAW,GAAG;AACrC,eAAO,QAAQ,QAAQ,CAAC,EAAE,UAAU,CAAC,EAAE,CAAC;AAAA,MAC1C;AAEA,aAAO,QAAQ,MAAM,QAAQ,CAAC,SAAS;AACrC,YAAI,KAAK,SAAS,SAAS;AACzB,eAAK,SAAS,QAAQ,OAAO;AAAA,QAC/B;AACA,YAAI,KAAK,SAAS,OAAO;AACvB,eAAK,SAAS,MAAM,OAAO;AAAA,QAC7B;AACA,YAAI,KAAK,SAAS,OAAO;AACvB,eAAK,SAAS,MAAM,OAClB,cAAc,eAAe,cAAc,SACvC,SACA;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,WAAW,UAA6B,CAAC,GAAoB;AAC3E,QAAM;AAAA,IACJ;AAAA,IACA,gBAAgB;AAAA,IAChB,eAAe,CAAC;AAAA,IAChB;AAAA,EACF,IAAI;AAEJ,MAAI,SAA0B,KAAK,MAAM,KAAK,UAAU,cAAc,CAAC;AAEvE,QAAM,aAAa,eAAe,YAAY,UAAU;AACxD,MAAI,YAAY;AACd,QAAI;AACF,YAAM,aAAa,eAAe,UAAU;AAC5C,eAAS,UAAU,QAAQ,UAAU;AAAA,IACvC,SAAS,KAAK;AACZ,cAAQ;AAAA,QACN,YAAY,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAEA,MACE,OAAO,SAAS,SAChB,OAAO,QAAQ,UAAU,aACzB,OAAO,QAAQ,UAAU,aACzB;AACA,YAAQ;AAAA,MACN,0BAA0B,OAAO,QAAQ,KAAK;AAAA,IAChD;AACA,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAEA,MAAI,CAAC,eAAe;AAClB,UAAM,YAAY,cAAc;AAChC,aAAS,UAAU,QAAQ,SAAS;AAAA,EACtC;AAEA,WAAS,UAAU,QAAQ,YAAY;AAEvC,SAAO;AACT;AAEO,SAAS,kBACd,OAAiB,QAAQ,MACzB,YACiB;AACjB,QAAM,kBAAkB,KAAK,UAAU,CAAC,QAAQ,IAAI,WAAW,WAAW,CAAC;AAC3E,QAAM,aACJ,oBAAoB,KAChB,KAAK,eAAe,GAAG,MAAM,GAAG,EAAE,CAAC,IACnC,qBAAqB;AAE3B,QAAM,eAAe,kBAAkB,IAAI;AAE3C,SAAO,WAAW,EAAE,YAAY,cAAc,WAAW,CAAC;AAC5D;;;AftRA,eAAe,eAA8B;AAC3C,MAAI;AACF,UAAM,WAAWC,IAAG,SAAS;AAC7B,QAAI;AAEJ,QAAI,aAAa,UAAU;AACzB,gBAAUC,MAAK,KAAKD,IAAG,QAAQ,GAAG,WAAW,OAAO;AAAA,IACtD,WAAW,aAAa,SAAS;AAC/B,gBAAUC,MAAK,KAAKD,IAAG,QAAQ,GAAG,UAAU,SAAS,OAAO;AAAA,IAC9D,WAAW,aAAa,SAAS;AAC/B,gBAAUC,MAAK;AAAA,QACbD,IAAG,QAAQ;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,OAAO;AACL,cAAQ,IAAI,4CAA4C;AACxD;AAAA,IACF;AAEA,QAAI,CAACE,IAAG,WAAW,OAAO,GAAG;AAC3B,MAAAA,IAAG,UAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,IAC3C;AAEA,YAAQ,IAAI,yCAAkC;AAC9C,YAAQ,IAAI,qDAAqD;AAEjE,UAAM,UAAUD,MAAK,KAAKD,IAAG,OAAO,GAAG,iBAAiB;AAExD,QAAI;AACF,UAAIE,IAAG,WAAW,OAAO,GAAG;AAC1B,QAAAA,IAAG,OAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MACrD;AAEA,cAAQ,IAAI,uCAAuC;AACnD,MAAAC;AAAA,QACE;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,KAAKH,IAAG,OAAO;AAAA,QACjB;AAAA,MACF;AAEA,cAAQ,IAAI,qBAAqB;AACjC,YAAM,gBAAgBC,MAAK,KAAK,SAAS,YAAY;AAErD,UAAIC,IAAG,WAAW,aAAa,GAAG;AAChC,QAAAA,IAAG,UAAU,eAAe,GAAK;AACjC,QAAAC,UAAS,gBAAgB,EAAE,OAAO,WAAW,KAAK,QAAQ,CAAC;AAAA,MAC7D,OAAO;AACL,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,cAAQ,IAAI,+CAA0C;AACtD,cAAQ;AAAA,QACN;AAAA,MACF;AACA,cAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF,UAAE;AACA,UAAID,IAAG,WAAW,OAAO,GAAG;AAC1B,QAAAA,IAAG,OAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MACrD;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACvD;AACA,YAAQ;AAAA,MACN;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,OAAsB;AACnC,MAAI;AACF,UAAM,WACJE,SAAQ,KAAK,SAAS,QAAQ,KAAKA,SAAQ,KAAK,SAAS,IAAI;AAC/D,UAAM,mBAAmBA,SAAQ,KAAK,SAAS,iBAAiB;AAEhE,QAAI,kBAAkB;AACpB,YAAM,aAAa;AACnB,MAAAA,SAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI,UAAU;AACZ,cAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAkCjB;AACK,MAAAA,SAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,WAAY,MAAM,KAAKA,SAAQ,KAAK;AAC1C,QAAI,CAAC,UAAU;AACb,cAAQ,MAAM,0BAA0B;AACxC,cAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAgBjB;AACK,MAAAA,SAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,aAAa,SAAS,WAAW;AACvC,UAAM,SAAS,kBAAkBA,SAAQ,MAAM,UAAU;AACzD,UAAM,WAAW,IAAI,kBAAkB,MAAM;AAC7C,UAAM,aAAa,MAAM,SAAS,mBAAmB,QAAQ;AAE7D,YAAQ,IAAI,UAAU;AAAA,EACxB,SAAS,OAAO;AACd,UAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,YAAQ,MAAM,gCAAgC,YAAY;AAC1D,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,KAAK;","names":["process","path","fs","execSync","os","execSync","os","path","fs","execSync","process"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/lib/colors.ts","../src/themes/dark.ts","../src/themes/light.ts","../src/themes/nord.ts","../src/themes/tokyo-night.ts","../src/themes/rose-pine.ts","../src/themes/index.ts","../src/lib/usage-provider.ts","../src/lib/logger.ts","../src/lib/git-service.ts","../src/lib/tmux-service.ts","../src/lib/formatters.ts","../src/lib/budget.ts","../src/lib/segment-renderer.ts","../src/powerline.ts","../src/config/loader.ts","../src/config/defaults.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport process from \"node:process\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport os from \"node:os\";\nimport { json } from \"node:stream/consumers\";\nimport { PowerlineRenderer } from \"./powerline\";\nimport { loadConfigFromCLI } from \"./config/loader\";\nimport { debug } from \"./lib/logger\";\nimport type { ClaudeHookData } from \"./types\";\n\nasync function installFonts(): Promise<void> {\n try {\n const platform = os.platform();\n let fontDir: string;\n\n if (platform === \"darwin\") {\n fontDir = path.join(os.homedir(), \"Library\", \"Fonts\");\n } else if (platform === \"linux\") {\n fontDir = path.join(os.homedir(), \".local\", \"share\", \"fonts\");\n } else if (platform === \"win32\") {\n fontDir = path.join(\n os.homedir(),\n \"AppData\",\n \"Local\",\n \"Microsoft\",\n \"Windows\",\n \"Fonts\"\n );\n } else {\n console.log(\"Unsupported platform for font installation\");\n return;\n }\n\n if (!fs.existsSync(fontDir)) {\n fs.mkdirSync(fontDir, { recursive: true });\n }\n\n console.log(\"📦 Installing Powerline Fonts...\");\n console.log(\"Downloading from https://github.com/powerline/fonts\");\n\n const tempDir = path.join(os.tmpdir(), \"powerline-fonts\");\n\n try {\n if (fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n\n console.log(\"Cloning powerline fonts repository...\");\n execSync(\n \"git clone --depth=1 https://github.com/powerline/fonts.git powerline-fonts\",\n {\n stdio: \"inherit\",\n cwd: os.tmpdir(),\n }\n );\n\n console.log(\"Installing fonts...\");\n const installScript = path.join(tempDir, \"install.sh\");\n\n if (fs.existsSync(installScript)) {\n fs.chmodSync(installScript, 0o755);\n execSync(\"./install.sh\", { stdio: \"inherit\", cwd: tempDir });\n } else {\n throw new Error(\n \"Install script not found in powerline fonts repository\"\n );\n }\n\n console.log(\"✅ Powerline fonts installation complete!\");\n console.log(\n \"Please restart your terminal and set your terminal font to a powerline font.\"\n );\n console.log(\n \"Popular choices: Source Code Pro Powerline, DejaVu Sans Mono Powerline, Ubuntu Mono Powerline\"\n );\n } finally {\n if (fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n }\n } catch (error) {\n console.error(\n \"Error installing fonts:\",\n error instanceof Error ? error.message : String(error)\n );\n console.log(\n \"💡 You can manually install fonts from: https://github.com/powerline/fonts\"\n );\n }\n}\n\nasync function main(): Promise<void> {\n try {\n const showHelp =\n process.argv.includes(\"--help\") || process.argv.includes(\"-h\");\n const installFontsFlag = process.argv.includes(\"--install-fonts\");\n\n if (installFontsFlag) {\n await installFonts();\n process.exit(0);\n }\n\n if (showHelp) {\n console.log(`\nclaude-powerline - Beautiful powerline statusline for Claude Code\n\nUsage: claude-powerline [options]\n\nStandalone Commands:\n --install-fonts Install powerline fonts to system\n -h, --help Show this help\n\nDebugging:\n CLAUDE_POWERLINE_DEBUG=1 Enable debug logging for troubleshooting\n\nClaude Code Options (for settings.json):\n --theme=THEME Set theme: dark, light, nord, tokyo-night, rose-pine, custom\n --style=STYLE Set separator style: minimal, powerline\n --usage=TYPE Usage display: cost, tokens, both, breakdown\n --session-budget=AMOUNT Set session budget for percentage tracking\n --daily-budget=AMOUNT Set daily budget for percentage tracking\n --config=PATH Use custom config file path\n\nConfiguration:\n Config files are loaded in this order (highest priority first):\n 1. CLI arguments (--theme, --style, --usage, --config)\n 2. Environment variables (CLAUDE_POWERLINE_THEME, CLAUDE_POWERLINE_STYLE, CLAUDE_POWERLINE_USAGE_TYPE, CLAUDE_POWERLINE_CONFIG)\n 3. ./.claude-powerline.json (project)\n 4. ~/.claude/claude-powerline.json (user)\n 5. ~/.config/claude-powerline/config.json (XDG)\n\nCreating a config file:\n Copy example from: https://github.com/Owloops/claude-powerline/blob/main/.claude-powerline.json\n\nUsage in Claude Code settings.json:\n{\n \"statusLine\": {\n \"type\": \"command\",\n \"command\": \"claude-powerline\",\n \"padding\": 0\n }\n}\n`);\n process.exit(0);\n }\n\n if (process.stdin.isTTY === true) {\n console.error(`Error: This tool requires input from Claude Code\n\nclaude-powerline is designed to be used as a Claude Code statusLine command.\nIt reads hook data from stdin and outputs formatted statusline.\n\nAdd to ~/.claude/settings.json:\n{\n \"statusLine\": {\n \"type\": \"command\",\n \"command\": \"claude-powerline --style=powerline\"\n }\n}\n\nRun with --help for more options.\n\nTo test output manually:\necho '{\"workspace\":{\"project_dir\":\"/path/to/project\"},\"session\":{\"id\":\"test\",\"model\":\"claude\"}}' | claude-powerline --style=powerline`);\n process.exit(1);\n }\n\n debug(`Working directory: ${process.cwd()}`);\n debug(`Process args:`, process.argv);\n\n const hookData = (await json(process.stdin)) as ClaudeHookData;\n if (!hookData) {\n console.error(\"Error: No input provided\");\n console.log(`\nclaude-powerline - Beautiful powerline statusline for Claude Code\n\nUsage: claude-powerline [options]\n\nOptions:\n --theme=THEME Set theme: dark, light, nord, tokyo-night, rose-pine, custom\n --style=STYLE Set separator style: minimal, powerline\n --usage=TYPE Usage display: cost, tokens, both, breakdown\n --session-budget=AMOUNT Set session budget for percentage tracking\n --daily-budget=AMOUNT Set daily budget for percentage tracking\n --config=PATH Use custom config file path\n --install-fonts Install powerline fonts to system\n -h, --help Show this help\n\nSee example config at: https://github.com/Owloops/claude-powerline/blob/main/.claude-powerline.json\n`);\n process.exit(1);\n }\n\n const projectDir = hookData.workspace?.project_dir;\n const config = loadConfigFromCLI(process.argv, projectDir);\n const renderer = new PowerlineRenderer(config);\n const statusline = await renderer.generateStatusline(hookData);\n\n console.log(statusline);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(\"Error generating statusline:\", errorMessage);\n process.exit(1);\n }\n}\n\nmain();\n","export function hexToAnsi(hex: string, isBackground: boolean): string {\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n return `\\x1b[${isBackground ? \"48\" : \"38\"};2;${r};${g};${b}m`;\n}\n\nexport function extractBgToFg(ansiCode: string): string {\n const match = ansiCode.match(/48;2;(\\d+);(\\d+);(\\d+)/);\n if (match) {\n return `\\x1b[38;2;${match[1]};${match[2]};${match[3]}m`;\n }\n return ansiCode.replace(\"48\", \"38\");\n}\n","import type { ColorTheme } from \"../types/config\";\n\nexport const darkTheme: ColorTheme = {\n directory: { bg: \"#8b4513\", fg: \"#ffffff\" },\n git: { bg: \"#404040\", fg: \"#ffffff\" },\n model: { bg: \"#2d2d2d\", fg: \"#ffffff\" },\n session: { bg: \"#202020\", fg: \"#00ffff\" },\n today: { bg: \"#a0520d\", fg: \"#ffffff\" },\n block: { bg: \"#8b4500\", fg: \"#ffffff\" },\n tmux: { bg: \"#2f4f2f\", fg: \"#90ee90\" },\n};\n","import type { ColorTheme } from \"../types/config\";\n\nexport const lightTheme: ColorTheme = {\n directory: { bg: \"#ff6b47\", fg: \"#ffffff\" },\n git: { bg: \"#4fb3d9\", fg: \"#ffffff\" },\n model: { bg: \"#87ceeb\", fg: \"#000000\" },\n session: { bg: \"#da70d6\", fg: \"#ffffff\" },\n today: { bg: \"#90ee90\", fg: \"#ffffff\" },\n block: { bg: \"#ff8c00\", fg: \"#ffffff\" },\n tmux: { bg: \"#32cd32\", fg: \"#ffffff\" },\n};\n","import type { ColorTheme } from \"../types/config\";\n\nexport const nordTheme: ColorTheme = {\n directory: { bg: \"#434c5e\", fg: \"#d8dee9\" },\n git: { bg: \"#3b4252\", fg: \"#a3be8c\" },\n model: { bg: \"#4c566a\", fg: \"#81a1c1\" },\n session: { bg: \"#2e3440\", fg: \"#88c0d0\" },\n today: { bg: \"#434c5e\", fg: \"#ebcb8b\" },\n block: { bg: \"#3b4252\", fg: \"#bf616a\" },\n tmux: { bg: \"#2e3440\", fg: \"#8fbcbb\" },\n};\n","import type { ColorTheme } from \"../types/config\";\n\nexport const tokyoNightTheme: ColorTheme = {\n directory: { bg: \"#2f334d\", fg: \"#82aaff\" },\n git: { bg: \"#1e2030\", fg: \"#c3e88d\" },\n model: { bg: \"#191b29\", fg: \"#fca7ea\" },\n session: { bg: \"#222436\", fg: \"#86e1fc\" },\n today: { bg: \"#2f334d\", fg: \"#ffc777\" },\n block: { bg: \"#1e2030\", fg: \"#ff966c\" },\n tmux: { bg: \"#191b29\", fg: \"#4fd6be\" },\n};\n","import type { ColorTheme } from \"../types/config\";\n\nexport const rosePineTheme: ColorTheme = {\n directory: { bg: \"#26233a\", fg: \"#c4a7e7\" },\n git: { bg: \"#1f1d2e\", fg: \"#9ccfd8\" },\n model: { bg: \"#191724\", fg: \"#ebbcba\" },\n session: { bg: \"#26233a\", fg: \"#f6c177\" },\n today: { bg: \"#1f1d2e\", fg: \"#eb6f92\" },\n block: { bg: \"#191724\", fg: \"#31748f\" },\n tmux: { bg: \"#26233a\", fg: \"#908caa\" },\n};\n","import type { ColorTheme } from \"../types/config\";\nimport { darkTheme } from \"./dark\";\nimport { lightTheme } from \"./light\";\nimport { nordTheme } from \"./nord\";\nimport { tokyoNightTheme } from \"./tokyo-night\";\nimport { rosePineTheme } from \"./rose-pine\";\n\nexport const BUILT_IN_THEMES: Record<string, ColorTheme> = {\n dark: darkTheme,\n light: lightTheme,\n nord: nordTheme,\n \"tokyo-night\": tokyoNightTheme,\n \"rose-pine\": rosePineTheme,\n};\n\nexport function getTheme(themeName: string): ColorTheme | null {\n return BUILT_IN_THEMES[themeName] || null;\n}\n\nexport { darkTheme, lightTheme, nordTheme, tokyoNightTheme, rosePineTheme };\n","import {\n loadSessionUsageById,\n loadDailyUsageData,\n loadSessionBlockData,\n getClaudePaths,\n} from \"ccusage/data-loader\";\nimport { calculateTotals, getTotalTokens } from \"ccusage/calculate-cost\";\nimport { logger } from \"ccusage/logger\";\nimport { debug } from \"./logger\";\n\nexport interface TokenBreakdown {\n input: number;\n output: number;\n cacheCreation: number;\n cacheRead: number;\n}\n\nexport interface SessionBlockInfo {\n cost: number;\n tokens: number;\n timeRemaining: number;\n burnRate: number | null;\n tokenBurnRate: number | null;\n isActive: boolean;\n}\n\nexport interface UsageInfo {\n session: {\n cost: number | null;\n tokens: number | null;\n tokenBreakdown: TokenBreakdown | null;\n };\n daily: {\n cost: number;\n tokens: number;\n tokenBreakdown: TokenBreakdown | null;\n };\n}\n\nexport class UsageProvider {\n async getSessionBlockInfo(): Promise<SessionBlockInfo | null> {\n const originalLevel = logger.level;\n logger.level = 0;\n\n try {\n const blocks = await loadSessionBlockData({\n mode: \"auto\",\n sessionDurationHours: 5,\n });\n\n const activeBlock = blocks.find((block) => block.isActive);\n\n if (!activeBlock) {\n return null;\n }\n\n const now = new Date();\n const timeRemaining = Math.round(\n (activeBlock.endTime.getTime() - now.getTime()) / (1000 * 60)\n );\n\n const elapsed = Math.round(\n (now.getTime() - activeBlock.startTime.getTime()) / (1000 * 60)\n );\n\n const totalTokens =\n (activeBlock.tokenCounts?.inputTokens || 0) +\n (activeBlock.tokenCounts?.outputTokens || 0) +\n (activeBlock.tokenCounts?.cacheCreationInputTokens || 0) +\n (activeBlock.tokenCounts?.cacheReadInputTokens || 0);\n\n const burnRate =\n elapsed > 0 ? (activeBlock.costUSD / elapsed) * 60 : null;\n const tokenBurnRate = elapsed > 0 ? (totalTokens / elapsed) * 60 : null;\n\n return {\n cost: activeBlock.costUSD,\n tokens: totalTokens,\n timeRemaining: Math.max(0, timeRemaining),\n burnRate,\n tokenBurnRate,\n isActive: true,\n };\n } catch {\n return null;\n } finally {\n logger.level = originalLevel;\n }\n }\n\n async getUsageInfo(sessionId: string): Promise<UsageInfo> {\n const originalLevel = logger.level;\n logger.level = 0;\n\n try {\n const claudePaths = getClaudePaths();\n debug(`Found ${claudePaths.length} Claude paths:`, claudePaths);\n\n if (claudePaths.length === 0) {\n debug(`No Claude paths found, returning empty usage data`);\n return {\n session: { cost: null, tokens: null, tokenBreakdown: null },\n daily: { cost: 0, tokens: 0, tokenBreakdown: null },\n };\n }\n\n const [sessionData, dailyData] = await Promise.all([\n this.getSessionData(sessionId),\n this.getDailyData(),\n ]);\n\n return {\n session: sessionData,\n daily: dailyData,\n };\n } catch {\n return {\n session: { cost: null, tokens: null, tokenBreakdown: null },\n daily: { cost: 0, tokens: 0, tokenBreakdown: null },\n };\n } finally {\n logger.level = originalLevel;\n }\n }\n\n private async getSessionData(sessionId: string) {\n try {\n debug(`Loading session data for ID: ${sessionId}`);\n\n const sessionData = await loadSessionUsageById(sessionId, {\n mode: \"auto\",\n });\n\n if (!sessionData) {\n debug(`No session data found for ID: ${sessionId}`);\n return { cost: null, tokens: null, tokenBreakdown: null };\n }\n\n const breakdown = sessionData.entries.reduce(\n (acc, entry) => {\n const usage = entry.message.usage;\n return {\n input: acc.input + usage.input_tokens,\n output: acc.output + usage.output_tokens,\n cacheCreation:\n acc.cacheCreation + (usage.cache_creation_input_tokens || 0),\n cacheRead: acc.cacheRead + (usage.cache_read_input_tokens || 0),\n };\n },\n { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 }\n );\n\n const totalTokens =\n breakdown.input +\n breakdown.output +\n breakdown.cacheCreation +\n breakdown.cacheRead;\n\n return {\n cost: sessionData.totalCost,\n tokens: totalTokens,\n tokenBreakdown: breakdown,\n };\n } catch (error) {\n debug(`Error loading session data for ID ${sessionId}:`, error);\n return { cost: null, tokens: null, tokenBreakdown: null };\n }\n }\n\n private async getDailyData() {\n try {\n const today = new Date();\n const todayStr =\n today.toISOString().split(\"T\")[0]?.replace(/-/g, \"\") ?? \"\";\n\n debug(`Loading daily data for date: ${todayStr}`);\n\n const dailyData = await loadDailyUsageData({\n since: todayStr,\n until: todayStr,\n mode: \"auto\",\n });\n\n if (dailyData.length === 0) {\n return { cost: 0, tokens: 0, tokenBreakdown: null };\n }\n\n const totals = calculateTotals(dailyData);\n const breakdown = dailyData.reduce(\n (acc, entry) => {\n return {\n input: acc.input + (entry.inputTokens || 0),\n output: acc.output + (entry.outputTokens || 0),\n cacheCreation: acc.cacheCreation + (entry.cacheCreationTokens || 0),\n cacheRead: acc.cacheRead + (entry.cacheReadTokens || 0),\n };\n },\n { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 }\n );\n\n return {\n cost: totals.totalCost,\n tokens: getTotalTokens(totals),\n tokenBreakdown: breakdown,\n };\n } catch (error) {\n debug(`Error loading daily usage data:`, error);\n return { cost: 0, tokens: 0, tokenBreakdown: null };\n }\n }\n}\n","const debug = (message: string, ...args: any[]): void => {\n if (process.env.CLAUDE_POWERLINE_DEBUG) {\n console.error(`[DEBUG] ${message}`, ...args);\n }\n};\n\nexport { debug };\n","import { execSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { debug } from \"./logger\";\n\nexport interface GitInfo {\n branch: string;\n status: \"clean\" | \"dirty\" | \"conflicts\";\n ahead: number;\n behind: number;\n sha?: string;\n}\n\nexport class GitService {\n private isGitRepo(workingDir: string): boolean {\n try {\n return fs.existsSync(path.join(workingDir, \".git\"));\n } catch {\n return false;\n }\n }\n\n getGitInfo(workingDir: string, showSha = false): GitInfo | null {\n if (!this.isGitRepo(workingDir)) {\n return {\n branch: \"detached\",\n status: \"clean\",\n ahead: 0,\n behind: 0,\n sha: undefined,\n };\n }\n\n try {\n const branch = this.getBranch(workingDir);\n const status = this.getStatus(workingDir);\n const { ahead, behind } = this.getAheadBehind(workingDir);\n const sha = showSha ? this.getSha(workingDir) || undefined : undefined;\n\n return {\n branch: branch || \"detached\",\n status,\n ahead,\n behind,\n sha,\n };\n } catch {\n return null;\n }\n }\n\n private getBranch(workingDir: string): string | null {\n try {\n return (\n execSync(\"git branch --show-current\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 1000,\n }).trim() || null\n );\n } catch (error) {\n debug(`Git branch command failed in ${workingDir}:`, error);\n return null;\n }\n }\n\n private getStatus(workingDir: string): \"clean\" | \"dirty\" | \"conflicts\" {\n try {\n const gitStatus = execSync(\"git status --porcelain\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 1000,\n }).trim();\n\n if (!gitStatus) return \"clean\";\n\n if (\n gitStatus.includes(\"UU\") ||\n gitStatus.includes(\"AA\") ||\n gitStatus.includes(\"DD\")\n ) {\n return \"conflicts\";\n }\n\n return \"dirty\";\n } catch (error) {\n debug(`Git status command failed in ${workingDir}:`, error);\n return \"clean\";\n }\n }\n\n private getAheadBehind(workingDir: string): {\n ahead: number;\n behind: number;\n } {\n try {\n const aheadResult = execSync(\"git rev-list --count @{u}..HEAD\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 1000,\n }).trim();\n\n const behindResult = execSync(\"git rev-list --count HEAD..@{u}\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 1000,\n }).trim();\n\n return {\n ahead: parseInt(aheadResult) || 0,\n behind: parseInt(behindResult) || 0,\n };\n } catch (error) {\n debug(`Git ahead/behind command failed in ${workingDir}:`, error);\n return { ahead: 0, behind: 0 };\n }\n }\n\n private getSha(workingDir: string): string | null {\n try {\n const sha = execSync(\"git rev-parse --short=7 HEAD\", {\n cwd: workingDir,\n encoding: \"utf8\",\n timeout: 1000,\n }).trim();\n\n return sha || null;\n } catch {\n return null;\n }\n }\n}\n","import { execSync } from \"node:child_process\";\nimport { debug } from \"./logger\";\n\nexport class TmuxService {\n getSessionId(): string | null {\n try {\n if (!process.env.TMUX_PANE) {\n debug(`TMUX_PANE not set, not in tmux session`);\n return null;\n }\n\n debug(`Getting tmux session ID, TMUX_PANE: ${process.env.TMUX_PANE}`);\n\n const sessionId = execSync(\"tmux display-message -p '#S'\", {\n encoding: \"utf8\",\n timeout: 1000,\n }).trim();\n\n debug(`Tmux session ID: ${sessionId || \"empty\"}`);\n\n return sessionId || null;\n } catch (error) {\n debug(`Error getting tmux session ID:`, error);\n return null;\n }\n }\n\n isInTmux(): boolean {\n return !!process.env.TMUX_PANE;\n }\n}\n","interface TokenBreakdown {\n input: number;\n output: number;\n cacheCreation: number;\n cacheRead: number;\n}\n\nexport function formatCost(cost: number | null): string {\n if (cost === null) return \"N/A\";\n if (cost < 0.01) return \"<$0.01\";\n return `$${cost.toFixed(2)}`;\n}\n\nexport function formatTokens(tokens: number | null): string {\n if (tokens === null) return \"N/A\";\n if (tokens === 0) return \"0 tokens\";\n if (tokens >= 1_000_000) {\n return `${(tokens / 1_000_000).toFixed(1)}M tokens`;\n } else if (tokens >= 1_000) {\n return `${(tokens / 1_000).toFixed(1)}K tokens`;\n }\n return `${tokens} tokens`;\n}\n\nexport function formatTokenBreakdown(breakdown: TokenBreakdown | null): string {\n if (!breakdown) return \"N/A\";\n\n const parts: string[] = [];\n\n if (breakdown.input > 0) {\n parts.push(`${formatTokens(breakdown.input).replace(\" tokens\", \"\")}in`);\n }\n\n if (breakdown.output > 0) {\n parts.push(`${formatTokens(breakdown.output).replace(\" tokens\", \"\")}out`);\n }\n\n if (breakdown.cacheCreation > 0 || breakdown.cacheRead > 0) {\n const totalCached = breakdown.cacheCreation + breakdown.cacheRead;\n parts.push(`${formatTokens(totalCached).replace(\" tokens\", \"\")}cached`);\n }\n\n return parts.length > 0 ? parts.join(\" + \") : \"0 tokens\";\n}\n\nexport function formatTimeRemaining(minutes: number): string {\n if (minutes <= 0) return \"0m\";\n\n const hours = Math.floor(minutes / 60);\n const mins = minutes % 60;\n\n if (hours > 0) {\n return `${hours}h${mins > 0 ? ` ${mins}m` : \"\"}`;\n }\n\n return `${mins}m`;\n}\n","export interface BudgetStatus {\n percentage: number | null;\n isWarning: boolean;\n displayText: string;\n}\n\nexport function calculateBudgetPercentage(\n cost: number,\n budget: number | undefined\n): number | null {\n if (!budget || budget <= 0 || cost < 0) return null;\n return Math.min(100, (cost / budget) * 100);\n}\n\nexport function getBudgetStatus(\n cost: number,\n budget: number | undefined,\n warningThreshold = 80\n): BudgetStatus {\n const percentage = calculateBudgetPercentage(cost, budget);\n\n if (percentage === null) {\n return {\n percentage: null,\n isWarning: false,\n displayText: \"\",\n };\n }\n\n const percentStr = `${percentage.toFixed(0)}%`;\n const isWarning = percentage >= warningThreshold;\n\n let displayText = \"\";\n if (isWarning) {\n displayText = ` !${percentStr}`;\n } else if (percentage >= 50) {\n displayText = ` +${percentStr}`;\n } else {\n displayText = ` ${percentStr}`;\n }\n\n return {\n percentage,\n isWarning,\n displayText,\n };\n}\n","import type { PowerlineConfig } from \"../types/config\";\nimport type { ClaudeHookData, PowerlineColors } from \"../types\";\nimport {\n formatCost,\n formatTokens,\n formatTokenBreakdown,\n formatTimeRemaining,\n} from \"./formatters\";\nimport { getBudgetStatus } from \"./budget\";\nimport type {\n UsageInfo,\n SessionBlockInfo,\n TokenBreakdown,\n} from \"./usage-provider\";\nimport type { GitInfo } from \"./git-service\";\n\nexport interface PowerlineSymbols {\n right: string;\n branch: string;\n model: string;\n git_clean: string;\n git_dirty: string;\n git_conflicts: string;\n git_ahead: string;\n git_behind: string;\n session_cost: string;\n daily_cost: string;\n block_cost: string;\n}\n\nexport interface SegmentData {\n text: string;\n bgColor: string;\n fgColor: string;\n}\n\nexport class SegmentRenderer {\n constructor(\n private readonly config: PowerlineConfig,\n private readonly symbols: PowerlineSymbols\n ) {}\n\n renderDirectory(\n hookData: ClaudeHookData,\n colors: PowerlineColors\n ): SegmentData {\n const currentDir = hookData.workspace?.current_dir || hookData.cwd || \"/\";\n const projectDir = hookData.workspace?.project_dir;\n const dirName = this.getDisplayDirectoryName(currentDir, projectDir);\n\n return {\n text: dirName,\n bgColor: colors.modeBg,\n fgColor: colors.modeFg,\n };\n }\n\n renderGit(\n gitInfo: GitInfo,\n colors: PowerlineColors,\n showSha = false\n ): SegmentData | null {\n if (!gitInfo) return null;\n\n let gitStatusIcon = this.symbols.git_clean;\n if (gitInfo.status === \"conflicts\") {\n gitStatusIcon = this.symbols.git_conflicts;\n } else if (gitInfo.status === \"dirty\") {\n gitStatusIcon = this.symbols.git_dirty;\n }\n\n let text = `${this.symbols.branch} ${gitInfo.branch} ${gitStatusIcon}`;\n\n if (gitInfo.sha && showSha) {\n text += ` ${gitInfo.sha}`;\n }\n\n if (gitInfo.ahead > 0 && gitInfo.behind > 0) {\n text += ` ${this.symbols.git_ahead}${gitInfo.ahead}${this.symbols.git_behind}${gitInfo.behind}`;\n } else if (gitInfo.ahead > 0) {\n text += ` ${this.symbols.git_ahead}${gitInfo.ahead}`;\n } else if (gitInfo.behind > 0) {\n text += ` ${this.symbols.git_behind}${gitInfo.behind}`;\n }\n\n return {\n text,\n bgColor: colors.gitBg,\n fgColor: colors.gitFg,\n };\n }\n\n renderModel(hookData: ClaudeHookData, colors: PowerlineColors): SegmentData {\n const modelName = hookData.model?.display_name || \"Claude\";\n\n return {\n text: `${this.symbols.model} ${modelName}`,\n bgColor: colors.modelBg,\n fgColor: colors.modelFg,\n };\n }\n\n renderSession(\n usageInfo: UsageInfo,\n colors: PowerlineColors,\n type = \"cost\"\n ): SegmentData {\n const sessionBudget = this.config.budget?.session;\n const text = `${this.symbols.session_cost} ${this.formatUsageWithBudget(\n usageInfo.session.cost,\n usageInfo.session.tokens,\n usageInfo.session.tokenBreakdown,\n type,\n sessionBudget?.amount,\n sessionBudget?.warningThreshold || 80\n )}`;\n\n return {\n text,\n bgColor: colors.sessionBg,\n fgColor: colors.sessionFg,\n };\n }\n\n renderToday(\n usageInfo: UsageInfo,\n colors: PowerlineColors,\n type = \"cost\"\n ): SegmentData {\n const todayBudget = this.config.budget?.today;\n const text = `Today ${this.formatUsageWithBudget(\n usageInfo.daily.cost,\n usageInfo.daily.tokens,\n usageInfo.daily.tokenBreakdown,\n type,\n todayBudget?.amount,\n todayBudget?.warningThreshold || 80\n )}`;\n\n return {\n text,\n bgColor: colors.burnLowBg,\n fgColor: colors.burnFg,\n };\n }\n\n renderBlock(\n blockInfo: SessionBlockInfo | null,\n colors: PowerlineColors,\n type = \"cost\"\n ): SegmentData | null {\n if (!blockInfo) return null;\n\n const text = `${this.symbols.block_cost} ${this.formatSessionBlockInfo(blockInfo, type)}`;\n\n return {\n text,\n bgColor: colors.blockBg,\n fgColor: colors.blockFg,\n };\n }\n\n renderTmux(\n sessionId: string | null,\n colors: PowerlineColors\n ): SegmentData | null {\n if (!sessionId) return null;\n\n return {\n text: `tmux:${sessionId}`,\n bgColor: colors.tmuxBg,\n fgColor: colors.tmuxFg,\n };\n }\n\n private getDisplayDirectoryName(\n currentDir: string,\n projectDir?: string\n ): string {\n if (projectDir && projectDir !== currentDir) {\n const projectName = projectDir.split(\"/\").pop() || \"project\";\n const currentDirName = currentDir.split(\"/\").pop() || \"root\";\n\n if (currentDir.includes(projectDir)) {\n return `${projectName}/${currentDirName}`;\n }\n\n return currentDirName;\n }\n\n return currentDir.split(\"/\").pop() || \"root\";\n }\n\n private formatUsageDisplay(\n cost: number | null,\n tokens: number | null,\n tokenBreakdown: TokenBreakdown | null,\n type: string\n ): string {\n switch (type) {\n case \"cost\":\n return formatCost(cost);\n case \"tokens\":\n return formatTokens(tokens);\n case \"both\":\n return `${formatCost(cost)} (${formatTokens(tokens)})`;\n case \"breakdown\":\n return formatTokenBreakdown(tokenBreakdown);\n default:\n return formatCost(cost);\n }\n }\n\n private formatUsageWithBudget(\n cost: number | null,\n tokens: number | null,\n tokenBreakdown: TokenBreakdown | null,\n type: string,\n budget: number | undefined,\n warningThreshold = 80\n ): string {\n const baseDisplay = this.formatUsageDisplay(\n cost,\n tokens,\n tokenBreakdown,\n type\n );\n\n if (budget && budget > 0 && cost !== null) {\n const budgetStatus = getBudgetStatus(cost, budget, warningThreshold);\n return baseDisplay + budgetStatus.displayText;\n }\n\n return baseDisplay;\n }\n\n private formatSessionBlockInfo(\n blockInfo: SessionBlockInfo,\n type = \"cost\"\n ): string {\n if (!blockInfo.isActive) {\n return \"No active block\";\n }\n\n const timeStr = formatTimeRemaining(blockInfo.timeRemaining);\n\n if (type === \"tokens\") {\n const tokensStr = formatTokens(blockInfo.tokens);\n let result = `${tokensStr} (${timeStr} left)`;\n\n if (blockInfo.tokenBurnRate !== null && blockInfo.tokenBurnRate > 0) {\n const burnRateStr = `${formatTokens(blockInfo.tokenBurnRate)}/hr`;\n result += ` ${burnRateStr}`;\n }\n\n return result;\n } else {\n const costStr = formatCost(blockInfo.cost);\n let result = `${costStr} (${timeStr} left)`;\n\n if (blockInfo.burnRate !== null && blockInfo.burnRate > 0) {\n const burnRateStr = `${formatCost(blockInfo.burnRate)}/hr`;\n result += ` ${burnRateStr}`;\n }\n\n return result;\n }\n }\n}\n","import type { ClaudeHookData, PowerlineColors } from \"./types\";\nimport type {\n PowerlineConfig,\n LineConfig,\n AnySegmentConfig,\n GitSegmentConfig,\n UsageSegmentConfig,\n BlockSegmentConfig,\n} from \"./types/config\";\nimport { hexToAnsi, extractBgToFg } from \"./lib/colors\";\nimport { getTheme } from \"./themes\";\nimport {\n UsageProvider,\n UsageInfo,\n SessionBlockInfo,\n} from \"./lib/usage-provider\";\nimport { GitService } from \"./lib/git-service\";\nimport { TmuxService } from \"./lib/tmux-service\";\nimport { SegmentRenderer, PowerlineSymbols } from \"./lib/segment-renderer\";\n\nexport class PowerlineRenderer {\n private readonly symbols: PowerlineSymbols;\n private readonly usageProvider: UsageProvider;\n private readonly gitService: GitService;\n private readonly tmuxService: TmuxService;\n private readonly segmentRenderer: SegmentRenderer;\n\n constructor(private readonly config: PowerlineConfig) {\n this.symbols = this.initializeSymbols();\n this.usageProvider = new UsageProvider();\n this.gitService = new GitService();\n this.tmuxService = new TmuxService();\n this.segmentRenderer = new SegmentRenderer(config, this.symbols);\n }\n\n async generateStatusline(hookData: ClaudeHookData): Promise<string> {\n const usageInfo = await this.usageProvider.getUsageInfo(\n hookData.session_id\n );\n\n let sessionBlockInfo = null;\n if (this.needsSessionBlock()) {\n sessionBlockInfo = await this.usageProvider.getSessionBlockInfo();\n }\n\n const lines = this.config.display.lines\n .map((lineConfig) =>\n this.renderLine(lineConfig, hookData, usageInfo, sessionBlockInfo)\n )\n .filter((line) => line.length > 0);\n\n return lines.join(\"\\n\");\n }\n\n private needsSessionBlock(): boolean {\n return this.config.display.lines.some(\n (line) => line.segments.block?.enabled\n );\n }\n\n private renderLine(\n lineConfig: LineConfig,\n hookData: ClaudeHookData,\n usageInfo: UsageInfo,\n sessionBlockInfo: SessionBlockInfo | null\n ): string {\n const colors = this.getThemeColors();\n const currentDir = hookData.workspace?.current_dir || hookData.cwd || \"/\";\n\n const segments = Object.entries(lineConfig.segments)\n .filter(\n ([_, config]: [string, AnySegmentConfig | undefined]) => config?.enabled\n )\n .map(([type, config]: [string, AnySegmentConfig]) => ({ type, config }));\n\n let line = colors.reset;\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n if (!segment) continue;\n\n const isLast = i === segments.length - 1;\n const nextSegment = !isLast ? segments[i + 1] : null;\n const nextBgColor = nextSegment\n ? this.getSegmentBgColor(nextSegment.type, colors)\n : \"\";\n\n const segmentData = this.renderSegment(\n segment,\n hookData,\n usageInfo,\n sessionBlockInfo,\n colors,\n currentDir\n );\n\n if (segmentData) {\n line += this.formatSegment(\n segmentData.bgColor,\n segmentData.fgColor,\n segmentData.text,\n isLast ? undefined : nextBgColor\n );\n }\n }\n\n return line;\n }\n\n private renderSegment(\n segment: { type: string; config: AnySegmentConfig },\n hookData: ClaudeHookData,\n usageInfo: UsageInfo,\n sessionBlockInfo: SessionBlockInfo | null,\n colors: PowerlineColors,\n currentDir: string\n ) {\n switch (segment.type) {\n case \"directory\":\n return this.segmentRenderer.renderDirectory(hookData, colors);\n\n case \"git\":\n const showSha = (segment.config as GitSegmentConfig)?.showSha || false;\n const gitInfo = this.gitService.getGitInfo(currentDir, showSha);\n return gitInfo\n ? this.segmentRenderer.renderGit(gitInfo, colors, showSha)\n : null;\n\n case \"model\":\n return this.segmentRenderer.renderModel(hookData, colors);\n\n case \"session\":\n const usageType =\n (segment.config as UsageSegmentConfig)?.type || \"cost\";\n return this.segmentRenderer.renderSession(usageInfo, colors, usageType);\n\n case \"today\":\n const todayType =\n (segment.config as UsageSegmentConfig)?.type || \"cost\";\n return this.segmentRenderer.renderToday(usageInfo, colors, todayType);\n\n case \"block\":\n const blockType =\n (segment.config as BlockSegmentConfig)?.type || \"cost\";\n return this.segmentRenderer.renderBlock(\n sessionBlockInfo,\n colors,\n blockType\n );\n\n case \"tmux\":\n const tmuxSessionId = this.tmuxService.getSessionId();\n return this.segmentRenderer.renderTmux(tmuxSessionId, colors);\n\n default:\n return null;\n }\n }\n\n private initializeSymbols(): PowerlineSymbols {\n const isMinimalStyle = this.config.display.style === \"minimal\";\n\n return {\n right: isMinimalStyle ? \"\" : \"\\uE0B0\",\n branch: \"⑂\",\n model: \"⚡\",\n git_clean: \"✓\",\n git_dirty: \"●\",\n git_conflicts: \"⚠\",\n git_ahead: \"↑\",\n git_behind: \"↓\",\n session_cost: \"Session\",\n daily_cost: \"Today\",\n block_cost: \"Block\",\n };\n }\n\n private getThemeColors(): PowerlineColors {\n const theme = this.config.theme;\n let colorTheme;\n\n if (theme === \"custom\") {\n colorTheme = this.config.colors?.custom;\n if (!colorTheme) {\n throw new Error(\n \"Custom theme selected but no colors provided in configuration\"\n );\n }\n } else {\n colorTheme = getTheme(theme);\n if (!colorTheme) {\n console.warn(\n `Built-in theme '${theme}' not found, falling back to 'dark' theme`\n );\n colorTheme = getTheme(\"dark\")!;\n }\n }\n\n return {\n reset: \"\\x1b[0m\",\n modeBg: hexToAnsi(colorTheme.directory.bg, true),\n modeFg: hexToAnsi(colorTheme.directory.fg, false),\n gitBg: hexToAnsi(colorTheme.git.bg, true),\n gitFg: hexToAnsi(colorTheme.git.fg, false),\n modelBg: hexToAnsi(colorTheme.model.bg, true),\n modelFg: hexToAnsi(colorTheme.model.fg, false),\n sessionBg: hexToAnsi(colorTheme.session.bg, true),\n sessionFg: hexToAnsi(colorTheme.session.fg, false),\n todayBg: hexToAnsi(colorTheme.today.bg, true),\n todayFg: hexToAnsi(colorTheme.today.fg, false),\n blockBg: hexToAnsi(colorTheme.block.bg, true),\n blockFg: hexToAnsi(colorTheme.block.fg, false),\n burnLowBg: hexToAnsi(colorTheme.today.bg, true),\n burnFg: hexToAnsi(colorTheme.today.fg, false),\n tmuxBg: hexToAnsi(colorTheme.tmux.bg, true),\n tmuxFg: hexToAnsi(colorTheme.tmux.fg, false),\n };\n }\n\n private getSegmentBgColor(\n segmentType: string,\n colors: PowerlineColors\n ): string {\n switch (segmentType) {\n case \"directory\":\n return colors.modeBg;\n case \"git\":\n return colors.gitBg;\n case \"model\":\n return colors.modelBg;\n case \"session\":\n return colors.sessionBg;\n case \"today\":\n return colors.burnLowBg;\n case \"block\":\n return colors.blockBg;\n case \"tmux\":\n return colors.tmuxBg;\n default:\n return colors.modeBg;\n }\n }\n\n private formatSegment(\n bgColor: string,\n fgColor: string,\n text: string,\n nextBgColor?: string\n ): string {\n let output = `${bgColor}${fgColor} ${text} `;\n\n const reset = \"\\x1b[0m\";\n\n if (nextBgColor) {\n const arrowFgColor = extractBgToFg(bgColor);\n output += `${reset}${nextBgColor}${arrowFgColor}${this.symbols.right}`;\n } else {\n output += `${reset}${extractBgToFg(bgColor)}${this.symbols.right}${reset}`;\n }\n\n return output;\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport type { PowerlineConfig, ConfigLoadOptions } from \"../types/config\";\nimport { DEFAULT_CONFIG } from \"./defaults\";\n\nfunction deepMerge<T extends Record<string, any>>(\n target: T,\n source: Partial<T>\n): T {\n const result = { ...target };\n\n for (const key in source) {\n const sourceValue = source[key];\n if (sourceValue !== undefined) {\n if (\n typeof sourceValue === \"object\" &&\n sourceValue !== null &&\n !Array.isArray(sourceValue)\n ) {\n const targetValue = result[key] || {};\n result[key] = deepMerge(\n targetValue as Record<string, any>,\n sourceValue as Record<string, any>\n ) as T[Extract<keyof T, string>];\n } else if (Array.isArray(sourceValue) && sourceValue.length === 0) {\n const targetValue = result[key];\n if (!Array.isArray(targetValue) || targetValue.length > 0) {\n continue;\n } else {\n result[key] = sourceValue as T[Extract<keyof T, string>];\n }\n } else {\n result[key] = sourceValue as T[Extract<keyof T, string>];\n }\n }\n }\n\n return result;\n}\n\nfunction findConfigFile(\n customPath?: string,\n projectDir?: string\n): string | null {\n if (customPath) {\n return fs.existsSync(customPath) ? customPath : null;\n }\n\n const locations = [\n ...(projectDir ? [path.join(projectDir, \".claude-powerline.json\")] : []),\n path.join(process.cwd(), \".claude-powerline.json\"),\n path.join(os.homedir(), \".claude\", \"claude-powerline.json\"),\n path.join(os.homedir(), \".config\", \"claude-powerline\", \"config.json\"),\n ];\n\n return locations.find(fs.existsSync) || null;\n}\n\nfunction loadConfigFile(filePath: string): Partial<PowerlineConfig> {\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n return JSON.parse(content);\n } catch (error) {\n throw new Error(\n `Failed to load config file ${filePath}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nfunction loadEnvConfig(): Partial<PowerlineConfig> {\n const config: Partial<PowerlineConfig> = {};\n\n if (process.env.CLAUDE_POWERLINE_THEME) {\n config.theme = process.env.CLAUDE_POWERLINE_THEME as\n | \"light\"\n | \"dark\"\n | \"custom\";\n }\n\n if (process.env.CLAUDE_POWERLINE_STYLE) {\n if (!config.display) {\n config.display = { lines: [] };\n }\n const style = process.env.CLAUDE_POWERLINE_STYLE;\n if (style === \"minimal\" || style === \"powerline\") {\n config.display.style = style;\n } else {\n console.warn(\n `Invalid display style '${style}' from environment variable, falling back to 'minimal'`\n );\n config.display.style = \"minimal\";\n }\n }\n\n if (process.env.CLAUDE_POWERLINE_USAGE_TYPE) {\n const usageType = process.env.CLAUDE_POWERLINE_USAGE_TYPE as\n | \"cost\"\n | \"tokens\"\n | \"both\"\n | \"breakdown\";\n if ([\"cost\", \"tokens\", \"both\", \"breakdown\"].includes(usageType)) {\n config.usageType = usageType;\n }\n }\n\n return config;\n}\n\nfunction getConfigPathFromEnv(): string | undefined {\n return process.env.CLAUDE_POWERLINE_CONFIG;\n}\n\nfunction parseCLIOverrides(args: string[]): Partial<PowerlineConfig> {\n const config: Partial<PowerlineConfig> = {};\n\n const themeIndex = args.findIndex((arg) => arg.startsWith(\"--theme=\"));\n if (themeIndex !== -1) {\n const theme = args[themeIndex]?.split(\"=\")[1];\n if (theme) {\n config.theme = theme as \"light\" | \"dark\" | \"custom\";\n }\n }\n\n const styleIndex = args.findIndex((arg) => arg.startsWith(\"--style=\"));\n if (styleIndex !== -1) {\n const style = args[styleIndex]?.split(\"=\")[1];\n if (style) {\n if (!config.display) {\n config.display = { lines: [] };\n }\n if (style === \"minimal\" || style === \"powerline\") {\n config.display.style = style;\n } else {\n console.warn(\n `Invalid display style '${style}' from CLI argument, falling back to 'minimal'`\n );\n config.display.style = \"minimal\";\n }\n }\n }\n\n const dailyBudgetIndex = args.findIndex((arg) =>\n arg.startsWith(\"--daily-budget=\")\n );\n if (dailyBudgetIndex !== -1) {\n const dailyBudget = parseFloat(args[dailyBudgetIndex]?.split(\"=\")[1] || \"\");\n if (!isNaN(dailyBudget) && dailyBudget > 0) {\n config.budget = {\n ...config.budget,\n today: {\n ...DEFAULT_CONFIG.budget?.today,\n amount: dailyBudget,\n },\n };\n }\n }\n\n const sessionBudgetIndex = args.findIndex((arg) =>\n arg.startsWith(\"--session-budget=\")\n );\n if (sessionBudgetIndex !== -1) {\n const sessionBudget = parseFloat(\n args[sessionBudgetIndex]?.split(\"=\")[1] || \"\"\n );\n if (!isNaN(sessionBudget) && sessionBudget > 0) {\n config.budget = {\n ...config.budget,\n session: {\n ...DEFAULT_CONFIG.budget?.session,\n amount: sessionBudget,\n },\n };\n }\n }\n\n const usageIndex = args.findIndex((arg) => arg.startsWith(\"--usage=\"));\n if (usageIndex !== -1) {\n const usageType = args[usageIndex]?.split(\"=\")[1] as\n | \"cost\"\n | \"tokens\"\n | \"both\"\n | \"breakdown\";\n if (\n usageType &&\n [\"cost\", \"tokens\", \"both\", \"breakdown\"].includes(usageType)\n ) {\n config.usageType = usageType;\n }\n }\n\n return config;\n}\n\nexport function loadConfig(options: ConfigLoadOptions = {}): PowerlineConfig {\n const {\n configPath,\n ignoreEnvVars = false,\n cliOverrides = {},\n projectDir,\n } = options;\n\n let config: PowerlineConfig = JSON.parse(JSON.stringify(DEFAULT_CONFIG));\n\n const configFile = findConfigFile(configPath, projectDir);\n if (configFile) {\n try {\n const fileConfig = loadConfigFile(configFile);\n config = deepMerge(config, fileConfig);\n } catch (err) {\n console.warn(\n `Warning: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n }\n\n if (\n config.display?.style &&\n config.display.style !== \"minimal\" &&\n config.display.style !== \"powerline\"\n ) {\n console.warn(\n `Invalid display style '${config.display.style}' in config file, falling back to 'minimal'`\n );\n config.display.style = \"minimal\";\n }\n\n if (!ignoreEnvVars) {\n const envConfig = loadEnvConfig();\n config = deepMerge(config, envConfig);\n }\n\n config = deepMerge(config, cliOverrides);\n\n if (config.usageType) {\n config.display.lines.forEach((line) => {\n if (line.segments.session) {\n line.segments.session.type = config.usageType!;\n }\n if (line.segments.today) {\n line.segments.today.type = config.usageType!;\n }\n if (line.segments.block) {\n line.segments.block.type =\n config.usageType === \"breakdown\" || config.usageType === \"both\"\n ? \"cost\"\n : config.usageType!;\n }\n });\n delete config.usageType;\n }\n\n return config;\n}\n\nexport function loadConfigFromCLI(\n args: string[] = process.argv,\n projectDir?: string\n): PowerlineConfig {\n const configPathIndex = args.findIndex((arg) => arg.startsWith(\"--config=\"));\n const configPath =\n configPathIndex !== -1\n ? args[configPathIndex]?.split(\"=\")[1]\n : getConfigPathFromEnv();\n\n const cliOverrides = parseCLIOverrides(args);\n\n return loadConfig({ configPath, cliOverrides, projectDir });\n}\n\nexport function getConfigPath(\n customPath?: string,\n projectDir?: string\n): string | null {\n return findConfigFile(customPath, projectDir);\n}\n","import type { PowerlineConfig } from \"../types/config\";\n\nexport const DEFAULT_CONFIG: PowerlineConfig = {\n theme: \"dark\",\n display: {\n style: \"minimal\",\n lines: [\n {\n segments: {\n directory: { enabled: true },\n git: {\n enabled: true,\n showSha: false,\n },\n model: { enabled: true },\n session: { enabled: true, type: \"tokens\" },\n today: { enabled: true, type: \"both\" },\n block: { enabled: false, type: \"cost\" },\n tmux: { enabled: false },\n },\n },\n ],\n },\n budget: {\n session: {\n warningThreshold: 80,\n },\n today: {\n amount: 50,\n warningThreshold: 80,\n },\n },\n};\n"],"mappings":"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","names":["process","path","fs","execSync","os","execSync","execSync","fs","path","fs","path","os","path","fs","execSync","process"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@owloops/claude-powerline",
3
- "version": "1.1.13",
3
+ "version": "1.2.0",
4
4
  "description": "Beautiful vim-style powerline statusline for Claude Code with real-time cost tracking, git integration, and custom themes",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",