@vimukthid/ccsl 1.0.1 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -249,10 +249,10 @@ ccsl install
|
|
|
249
249
|
# Option 2: Install directly from the built package
|
|
250
250
|
cd /path/to/ccsl
|
|
251
251
|
npm run build
|
|
252
|
-
npm pack # Creates @vimukthid-ccsl-1.0.
|
|
252
|
+
npm pack # Creates @vimukthid-ccsl-1.0.4.tgz
|
|
253
253
|
|
|
254
254
|
# Install the tarball globally
|
|
255
|
-
npm install -g ./vimukthid-ccsl-1.0.
|
|
255
|
+
npm install -g ./vimukthid-ccsl-1.0.4.tgz
|
|
256
256
|
```
|
|
257
257
|
|
|
258
258
|
```bash
|
package/dist/cli.js
CHANGED
|
@@ -1240,7 +1240,7 @@ init_defaults();
|
|
|
1240
1240
|
import { writeFileSync as writeFileSync3, mkdirSync as mkdirSync3, existsSync as existsSync4 } from "fs";
|
|
1241
1241
|
import { dirname as dirname3 } from "path";
|
|
1242
1242
|
var program = new Command();
|
|
1243
|
-
program.name("ccsl").description("Customizable status line formatter for Claude Code CLI").version("
|
|
1243
|
+
program.name("ccsl").description("Customizable status line formatter for Claude Code CLI").version("1.0.4");
|
|
1244
1244
|
program.command("install").description("Install ccsl to Claude Code settings.json").option("-c, --command <cmd>", "Custom command to use", "npx @vimukthid/ccsl").action(async (options) => {
|
|
1245
1245
|
console.log("\nInstalling ccsl to Claude Code...\n");
|
|
1246
1246
|
if (isInstalledInClaude()) {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/config/defaults.ts","../src/config/loader.ts","../src/themes/index.ts","../src/utils/icons.ts","../src/utils/colors.ts","../src/utils/format.ts","../src/widgets/index.ts","../src/formatter.ts","../src/config/claude.ts","../src/tui/app.tsx","../src/cli.ts","../src/parser.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import type { CcslConfig } from \"./loader.js\";\nimport type { WidgetType } from \"../widgets/index.js\";\n\nexport const defaultWidgets: WidgetType[] = [\"model\", \"context\", \"tokens\", \"cost\"];\n\nexport const defaultConfig: CcslConfig = {\n theme: \"minimal\",\n widgets: defaultWidgets,\n separator: \" │ \",\n icons: \"auto\",\n padding: 1,\n};\n","import { cosmiconfig } from \"cosmiconfig\";\nimport { existsSync } from \"fs\";\nimport { defaultConfig } from \"./defaults.js\";\nimport type { Theme } from \"../themes/index.js\";\nimport type { WidgetType } from \"../widgets/index.js\";\nimport type { IconMode } from \"../utils/icons.js\";\n\nexport interface CcslConfig {\n theme: string;\n widgets: WidgetType[];\n separator: string;\n icons: IconMode;\n padding: number;\n customTheme?: Theme;\n}\n\nconst explorer = cosmiconfig(\"ccsl\", {\n searchPlaces: [\n \".ccslrc\",\n \".ccslrc.json\",\n \".ccslrc.yaml\",\n \".ccslrc.yml\",\n \".ccslrc.js\",\n \".ccslrc.cjs\",\n \".config/ccsl/config.json\",\n \"ccsl.config.js\",\n \"ccsl.config.cjs\",\n ],\n});\n\nexport async function loadConfig(searchFrom?: string): Promise<CcslConfig> {\n try {\n const result = await explorer.search(searchFrom);\n\n if (result && result.config) {\n return mergeConfig(defaultConfig, result.config);\n }\n\n // Fall back to global config if no local config found\n const globalPath = getConfigPath(\"global\");\n if (existsSync(globalPath)) {\n const globalResult = await explorer.load(globalPath);\n if (globalResult && globalResult.config) {\n return mergeConfig(defaultConfig, globalResult.config);\n }\n }\n } catch {\n // Config loading failed, use defaults\n }\n\n return { ...defaultConfig };\n}\n\nexport async function loadConfigForScope(scope: \"local\" | \"global\"): Promise<CcslConfig> {\n const configPath = getConfigPath(scope);\n\n // For global scope, try to load the global config file directly\n if (scope === \"global\") {\n if (existsSync(configPath)) {\n try {\n const result = await explorer.load(configPath);\n if (result && result.config) {\n return mergeConfig(defaultConfig, result.config);\n }\n } catch {\n // Fall through to defaults\n }\n }\n return { ...defaultConfig };\n }\n\n // For local scope, try local first, then fall back to global\n return loadConfig();\n}\n\nexport async function loadConfigFromFile(filePath: string): Promise<CcslConfig> {\n try {\n const result = await explorer.load(filePath);\n\n if (result && result.config) {\n return mergeConfig(defaultConfig, result.config);\n }\n } catch {\n // Config loading failed, use defaults\n }\n\n return { ...defaultConfig };\n}\n\nfunction mergeConfig(defaults: CcslConfig, userConfig: Partial<CcslConfig>): CcslConfig {\n return {\n theme: userConfig.theme ?? defaults.theme,\n widgets: userConfig.widgets ?? defaults.widgets,\n separator: userConfig.separator ?? defaults.separator,\n icons: userConfig.icons ?? defaults.icons,\n padding: userConfig.padding ?? defaults.padding,\n customTheme: userConfig.customTheme,\n };\n}\n\nexport function getConfigPath(scope: \"local\" | \"global\"): string {\n if (scope === \"local\") {\n return \".ccslrc.json\";\n }\n const home = process.env.HOME || process.env.USERPROFILE || \"~\";\n return `${home}/.config/ccsl/config.json`;\n}\n","import type { ColorStyle } from \"../utils/colors.js\";\nimport type { IconKey } from \"../utils/icons.js\";\n\nexport interface ThemeColors {\n model?: ColorStyle;\n context?: ColorStyle;\n contextHigh?: ColorStyle;\n contextCritical?: ColorStyle;\n tokens?: ColorStyle;\n cost?: ColorStyle;\n duration?: ColorStyle;\n lines?: ColorStyle;\n linesAdded?: ColorStyle;\n linesRemoved?: ColorStyle;\n directory?: ColorStyle;\n version?: ColorStyle;\n separator?: ColorStyle;\n usage?: ColorStyle;\n usageHigh?: ColorStyle;\n usageCritical?: ColorStyle;\n resetTime?: ColorStyle;\n}\n\nexport interface Theme {\n name: string;\n colors: ThemeColors;\n icons?: Partial<Record<IconKey, string>>;\n}\n\n// Neon theme - Vibrant cyberpunk\nconst neonTheme: Theme = {\n name: \"neon\",\n colors: {\n model: { fg: \"#00ffff\", bold: true },\n context: { fg: \"#ff00ff\" },\n contextHigh: { fg: \"#ffff00\" },\n contextCritical: { fg: \"#ff0000\", bold: true },\n tokens: { fg: \"#00ff00\" },\n cost: { fg: \"#ffff00\" },\n duration: { fg: \"#00aaff\" },\n lines: { fg: \"#ff6600\" },\n linesAdded: { fg: \"#00ff00\" },\n linesRemoved: { fg: \"#ff0066\" },\n directory: { fg: \"#00ffff\" },\n version: { fg: \"#aaaaff\" },\n separator: { fg: \"#666666\" },\n usage: { fg: \"#00ffaa\" },\n usageHigh: { fg: \"#ffff00\" },\n usageCritical: { fg: \"#ff0000\", bold: true },\n resetTime: { fg: \"#ff00ff\" },\n },\n};\n\n// Rainbow theme - Colorful gradient\nconst rainbowTheme: Theme = {\n name: \"rainbow\",\n colors: {\n model: { fg: \"#ff0000\", bold: true },\n context: { fg: \"#ff7f00\" },\n contextHigh: { fg: \"#ffff00\" },\n contextCritical: { fg: \"#ff0000\", bold: true },\n tokens: { fg: \"#00ff00\" },\n cost: { fg: \"#0000ff\" },\n duration: { fg: \"#4b0082\" },\n lines: { fg: \"#9400d3\" },\n linesAdded: { fg: \"#00ff00\" },\n linesRemoved: { fg: \"#ff0000\" },\n directory: { fg: \"#ff7f00\" },\n version: { fg: \"#9400d3\" },\n separator: { fg: \"#888888\" },\n usage: { fg: \"#00ffff\" },\n usageHigh: { fg: \"#ffff00\" },\n usageCritical: { fg: \"#ff0000\", bold: true },\n resetTime: { fg: \"#ff7f00\" },\n },\n};\n\n// Ocean theme - Cool blues and teals\nconst oceanTheme: Theme = {\n name: \"ocean\",\n colors: {\n model: { fg: \"#00bcd4\", bold: true },\n context: { fg: \"#2d8b8b\" },\n contextHigh: { fg: \"#4dd0e1\" },\n contextCritical: { fg: \"#ff5252\", bold: true },\n tokens: { fg: \"#80deea\" },\n cost: { fg: \"#4dd0e1\" },\n duration: { fg: \"#0288d1\" },\n lines: { fg: \"#26c6da\" },\n linesAdded: { fg: \"#69f0ae\" },\n linesRemoved: { fg: \"#ff5252\" },\n directory: { fg: \"#00bcd4\" },\n version: { fg: \"#80deea\" },\n separator: { fg: \"#37474f\" },\n usage: { fg: \"#26c6da\" },\n usageHigh: { fg: \"#4dd0e1\" },\n usageCritical: { fg: \"#ff5252\", bold: true },\n resetTime: { fg: \"#0288d1\" },\n },\n};\n\n// Minimal theme - Clean and subtle (default)\nconst minimalTheme: Theme = {\n name: \"minimal\",\n colors: {\n model: { fg: \"#888888\" },\n context: { fg: \"#ffffff\" },\n contextHigh: { fg: \"#e5c07b\" },\n contextCritical: { fg: \"#e06c75\", bold: true },\n tokens: { fg: \"#666666\", dim: true },\n cost: { fg: \"#61afef\" },\n duration: { fg: \"#666666\", dim: true },\n lines: { fg: \"#abb2bf\" },\n linesAdded: { fg: \"#98c379\" },\n linesRemoved: { fg: \"#e06c75\" },\n directory: { fg: \"#888888\" },\n version: { fg: \"#5c6370\" },\n separator: { fg: \"#444444\" },\n usage: { fg: \"#98c379\" },\n usageHigh: { fg: \"#e5c07b\" },\n usageCritical: { fg: \"#e06c75\", bold: true },\n resetTime: { fg: \"#61afef\" },\n },\n icons: {\n model: \"\",\n context: \"\",\n tokens: \"\",\n duration: \"\",\n lines: \"\",\n directory: \"\",\n usage: \"\",\n resetTime: \"\",\n },\n};\n\n// Monochrome theme - Grayscale\nconst monochromeTheme: Theme = {\n name: \"monochrome\",\n colors: {\n model: { fg: \"#ffffff\", bold: true },\n context: { fg: \"#cccccc\" },\n contextHigh: { fg: \"#ffffff\", bold: true },\n contextCritical: { fg: \"#ffffff\", bold: true, underline: true },\n tokens: { fg: \"#aaaaaa\" },\n cost: { fg: \"#999999\" },\n duration: { fg: \"#888888\" },\n lines: { fg: \"#777777\" },\n linesAdded: { fg: \"#cccccc\" },\n linesRemoved: { fg: \"#888888\" },\n directory: { fg: \"#aaaaaa\" },\n version: { fg: \"#666666\" },\n separator: { fg: \"#444444\" },\n usage: { fg: \"#bbbbbb\" },\n usageHigh: { fg: \"#ffffff\", bold: true },\n usageCritical: { fg: \"#ffffff\", bold: true, underline: true },\n resetTime: { fg: \"#999999\" },\n },\n icons: {\n model: \"\",\n context: \"\",\n tokens: \"\",\n duration: \"\",\n lines: \"\",\n directory: \"\",\n usage: \"\",\n resetTime: \"\",\n },\n};\n\n// Corporate theme - Professional blues\nconst corporateTheme: Theme = {\n name: \"corporate\",\n colors: {\n model: { fg: \"#3b82f6\", bold: true },\n context: { fg: \"#64748b\" },\n contextHigh: { fg: \"#f59e0b\" },\n contextCritical: { fg: \"#ef4444\", bold: true },\n tokens: { fg: \"#4682b4\" },\n cost: { fg: \"#6b7280\" },\n duration: { fg: \"#64748b\" },\n lines: { fg: \"#94a3b8\" },\n linesAdded: { fg: \"#22c55e\" },\n linesRemoved: { fg: \"#ef4444\" },\n directory: { fg: \"#3b82f6\" },\n version: { fg: \"#94a3b8\" },\n separator: { fg: \"#334155\" },\n usage: { fg: \"#22c55e\" },\n usageHigh: { fg: \"#f59e0b\" },\n usageCritical: { fg: \"#ef4444\", bold: true },\n resetTime: { fg: \"#3b82f6\" },\n },\n};\n\nexport const themes: Record<string, Theme> = {\n neon: neonTheme,\n rainbow: rainbowTheme,\n ocean: oceanTheme,\n minimal: minimalTheme,\n monochrome: monochromeTheme,\n corporate: corporateTheme,\n};\n\nexport const themeNames = Object.keys(themes);\n\nexport function getTheme(name: string): Theme {\n return themes[name] || themes.minimal;\n}\n","import type { Theme } from \"../themes/index.js\";\n\nexport type IconMode = \"auto\" | \"nerd\" | \"unicode\" | \"ascii\";\nexport type IconKey =\n | \"model\"\n | \"context\"\n | \"tokens\"\n | \"cost\"\n | \"duration\"\n | \"lines\"\n | \"directory\"\n | \"version\"\n | \"usage\"\n | \"resetTime\";\n\nconst nerdIcons: Record<IconKey, string> = {\n model: \"◈\",\n context: \"◐\",\n tokens: \"\",\n cost: \"$\",\n duration: \"⏱\",\n lines: \"±\",\n directory: \"\",\n version: \"\",\n usage: \"\",\n resetTime: \"\",\n};\n\nconst unicodeIcons: Record<IconKey, string> = {\n model: \"◈\",\n context: \"◐\",\n tokens: \"⇅\",\n cost: \"$\",\n duration: \"⏱\",\n lines: \"±\",\n directory: \"📁\",\n version: \"v\",\n usage: \"▰\",\n resetTime: \"⟳\",\n};\n\nconst asciiIcons: Record<IconKey, string> = {\n model: \"*\",\n context: \"%\",\n tokens: \"\",\n cost: \"$\",\n duration: \"\",\n lines: \"\",\n directory: \"\",\n version: \"v\",\n usage: \"#\",\n resetTime: \"~\",\n};\n\nlet detectedIconMode: IconMode | null = null;\n\nfunction detectIconSupport(): IconMode {\n if (detectedIconMode !== null) {\n return detectedIconMode;\n }\n\n const term = process.env.TERM || \"\";\n const termProgram = process.env.TERM_PROGRAM || \"\";\n const nerdFontEnv = process.env.NERD_FONT || \"\";\n\n // Explicit Nerd Font environment variable\n if (nerdFontEnv === \"1\" || nerdFontEnv.toLowerCase() === \"true\") {\n detectedIconMode = \"nerd\";\n return \"nerd\";\n }\n\n // Known Nerd Font capable terminals\n const nerdFontTerminals = [\"iTerm.app\", \"WezTerm\", \"Alacritty\", \"kitty\", \"Hyper\", \"Tabby\"];\n\n if (nerdFontTerminals.some((t) => termProgram.includes(t))) {\n detectedIconMode = \"nerd\";\n return \"nerd\";\n }\n\n // Modern terminals with good Unicode support\n if (term.includes(\"256color\") || term.includes(\"truecolor\")) {\n detectedIconMode = \"unicode\";\n return \"unicode\";\n }\n\n detectedIconMode = \"ascii\";\n return \"ascii\";\n}\n\nexport function getIcon(key: IconKey, theme: Theme, mode: IconMode): string {\n // Check theme-specific icons first\n if (theme.icons && theme.icons[key]) {\n return theme.icons[key] || \"\";\n }\n\n // Determine which icon set to use\n const effectiveMode = mode === \"auto\" ? detectIconSupport() : mode;\n\n switch (effectiveMode) {\n case \"nerd\":\n return nerdIcons[key] || \"\";\n case \"unicode\":\n return unicodeIcons[key] || \"\";\n case \"ascii\":\n return asciiIcons[key] || \"\";\n default:\n return unicodeIcons[key] || \"\";\n }\n}\n\nexport function getAllIcons(mode: IconMode): Record<IconKey, string> {\n const effectiveMode = mode === \"auto\" ? detectIconSupport() : mode;\n\n switch (effectiveMode) {\n case \"nerd\":\n return { ...nerdIcons };\n case \"unicode\":\n return { ...unicodeIcons };\n case \"ascii\":\n return { ...asciiIcons };\n default:\n return { ...unicodeIcons };\n }\n}\n","import chalk from \"chalk\";\n\nexport interface ColorStyle {\n fg?: string;\n bg?: string;\n bold?: boolean;\n dim?: boolean;\n italic?: boolean;\n underline?: boolean;\n}\n\nexport function applyStyle(text: string, style?: ColorStyle): string {\n if (!style) return text;\n\n let result = chalk;\n\n if (style.fg) {\n result = result.hex(style.fg);\n }\n if (style.bg) {\n result = result.bgHex(style.bg);\n }\n if (style.bold) {\n result = result.bold;\n }\n if (style.dim) {\n result = result.dim;\n }\n if (style.italic) {\n result = result.italic;\n }\n if (style.underline) {\n result = result.underline;\n }\n\n return result(text);\n}\n\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result\n ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16),\n }\n : null;\n}\n\nexport function rgbToHex(r: number, g: number, b: number): string {\n return (\n \"#\" +\n [r, g, b]\n .map((x) => {\n const hex = x.toString(16);\n return hex.length === 1 ? \"0\" + hex : hex;\n })\n .join(\"\")\n );\n}\n","export function formatNumber(num: number): string {\n if (num >= 1000000) {\n return `${(num / 1000000).toFixed(1)}m`;\n }\n if (num >= 1000) {\n return `${(num / 1000).toFixed(1)}k`;\n }\n return num.toString();\n}\n\nexport function formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n\n if (seconds < 60) {\n return `${seconds}s`;\n }\n\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) {\n const remainingSeconds = seconds % 60;\n return remainingSeconds > 0 ? `${minutes}m${remainingSeconds}s` : `${minutes}m`;\n }\n\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return remainingMinutes > 0 ? `${hours}h${remainingMinutes}m` : `${hours}h`;\n}\n\nexport function formatCost(usd: number): string {\n if (usd < 0.01) {\n return usd.toFixed(4);\n }\n if (usd < 1) {\n return usd.toFixed(2);\n }\n return usd.toFixed(2);\n}\n","import type { StatusInput } from \"../parser.js\";\nimport type { Theme } from \"../themes/index.js\";\nimport type { CcslConfig } from \"../config/loader.js\";\nimport { getIcon } from \"../utils/icons.js\";\nimport { applyStyle } from \"../utils/colors.js\";\nimport { formatNumber, formatDuration, formatCost } from \"../utils/format.js\";\nimport path from \"path\";\n\nexport type WidgetType =\n | \"model\"\n | \"context\"\n | \"tokens\"\n | \"cost\"\n | \"duration\"\n | \"lines\"\n | \"directory\"\n | \"version\"\n | \"usage\"\n | \"resetTime\";\n\nexport const availableWidgets: WidgetType[] = [\n \"model\",\n \"context\",\n \"tokens\",\n \"cost\",\n \"duration\",\n \"lines\",\n \"directory\",\n \"version\",\n \"usage\",\n \"resetTime\",\n];\n\nexport interface WidgetResult {\n content: string;\n visible: boolean;\n}\n\nexport function renderWidget(\n widget: WidgetType,\n input: StatusInput,\n theme: Theme,\n config: CcslConfig\n): WidgetResult {\n switch (widget) {\n case \"model\":\n return renderModel(input, theme, config);\n case \"context\":\n return renderContext(input, theme, config);\n case \"tokens\":\n return renderTokens(input, theme, config);\n case \"cost\":\n return renderCostWidget(input, theme, config);\n case \"duration\":\n return renderDurationWidget(input, theme, config);\n case \"lines\":\n return renderLines(input, theme, config);\n case \"directory\":\n return renderDirectory(input, theme, config);\n case \"version\":\n return renderVersion(input, theme, config);\n case \"usage\":\n return renderUsage(input, theme, config);\n case \"resetTime\":\n return renderResetTime(input, theme, config);\n default:\n return { content: \"\", visible: false };\n }\n}\n\nfunction renderModel(input: StatusInput, theme: Theme, config: CcslConfig): WidgetResult {\n const displayName = input.model?.display_name;\n if (!displayName) {\n return { content: \"\", visible: false };\n }\n\n const icon = getIcon(\"model\", theme, config.icons);\n const text = icon ? `${icon} ${displayName}` : displayName;\n const content = applyStyle(text, theme.colors.model);\n\n return { content, visible: true };\n}\n\nfunction renderContext(input: StatusInput, theme: Theme, config: CcslConfig): WidgetResult {\n const percentage = input.context_window?.used_percentage;\n if (percentage === undefined) {\n return { content: \"\", visible: false };\n }\n\n const icon = getIcon(\"context\", theme, config.icons);\n const roundedPercent = Math.round(percentage);\n const progressBar = renderProgressBar(percentage, theme);\n const value = `${roundedPercent}%`;\n const text = icon ? `${icon} ${progressBar} ${value}` : `${progressBar} ${value}`;\n\n // Color based on usage level\n let colorKey: \"context\" | \"contextHigh\" | \"contextCritical\" = \"context\";\n if (percentage >= 80) {\n colorKey = \"contextCritical\";\n } else if (percentage >= 60) {\n colorKey = \"contextHigh\";\n }\n\n const style = theme.colors[colorKey] || theme.colors.context;\n const content = applyStyle(text, style);\n\n return { content, visible: true };\n}\n\nfunction renderProgressBar(percentage: number, theme: Theme): string {\n const totalBars = 10;\n const filledBars = Math.round((percentage / 100) * totalBars);\n const emptyBars = totalBars - filledBars;\n\n // Use block characters for progress bar\n const filledChar = \"█\";\n const emptyChar = \"░\";\n\n // Color the filled portion based on usage level\n let filledStyle = theme.colors.context;\n if (percentage >= 80) {\n filledStyle = theme.colors.contextCritical || theme.colors.context;\n } else if (percentage >= 60) {\n filledStyle = theme.colors.contextHigh || theme.colors.context;\n }\n\n const filled = applyStyle(filledChar.repeat(filledBars), filledStyle);\n const empty = applyStyle(emptyChar.repeat(emptyBars), { fg: \"#444444\", dim: true });\n\n return `${filled}${empty}`;\n}\n\nfunction renderTokens(input: StatusInput, theme: Theme, config: CcslConfig): WidgetResult {\n const inputTokens = input.context_window?.total_input_tokens;\n const outputTokens = input.context_window?.total_output_tokens;\n\n if (inputTokens === undefined && outputTokens === undefined) {\n return { content: \"\", visible: false };\n }\n\n const icon = getIcon(\"tokens\", theme, config.icons);\n const inStr = formatNumber(inputTokens ?? 0);\n const outStr = formatNumber(outputTokens ?? 0);\n const text = icon ? `${icon} ↑${inStr} ↓${outStr}` : `↑${inStr} ↓${outStr}`;\n const content = applyStyle(text, theme.colors.tokens);\n\n return { content, visible: true };\n}\n\nfunction renderCostWidget(input: StatusInput, theme: Theme, config: CcslConfig): WidgetResult {\n const costUsd = input.cost?.total_cost_usd;\n if (costUsd === undefined) {\n return { content: \"\", visible: false };\n }\n\n const icon = getIcon(\"cost\", theme, config.icons);\n const value = formatCost(costUsd);\n const text = icon ? `${icon}${value}` : `$${value}`;\n const content = applyStyle(text, theme.colors.cost);\n\n return { content, visible: true };\n}\n\nfunction renderDurationWidget(input: StatusInput, theme: Theme, config: CcslConfig): WidgetResult {\n const durationMs = input.cost?.total_duration_ms;\n if (durationMs === undefined) {\n return { content: \"\", visible: false };\n }\n\n const icon = getIcon(\"duration\", theme, config.icons);\n const value = formatDuration(durationMs);\n const text = icon ? `${icon} ${value}` : value;\n const content = applyStyle(text, theme.colors.duration);\n\n return { content, visible: true };\n}\n\nfunction renderLines(input: StatusInput, theme: Theme, config: CcslConfig): WidgetResult {\n const added = input.cost?.total_lines_added;\n const removed = input.cost?.total_lines_removed;\n\n if (added === undefined && removed === undefined) {\n return { content: \"\", visible: false };\n }\n\n const icon = getIcon(\"lines\", theme, config.icons);\n\n const addedStr = applyStyle(`+${added ?? 0}`, theme.colors.linesAdded || theme.colors.lines);\n const removedStr = applyStyle(`-${removed ?? 0}`, theme.colors.linesRemoved || theme.colors.lines);\n\n const text = icon ? `${icon} ${addedStr} ${removedStr}` : `${addedStr} ${removedStr}`;\n\n return { content: text, visible: true };\n}\n\nfunction renderDirectory(input: StatusInput, theme: Theme, config: CcslConfig): WidgetResult {\n const dir = input.workspace?.current_dir || input.cwd;\n if (!dir) {\n return { content: \"\", visible: false };\n }\n\n const icon = getIcon(\"directory\", theme, config.icons);\n const dirName = path.basename(dir);\n const text = icon ? `${icon} ${dirName}` : dirName;\n const content = applyStyle(text, theme.colors.directory);\n\n return { content, visible: true };\n}\n\nfunction renderVersion(input: StatusInput, theme: Theme, config: CcslConfig): WidgetResult {\n const version = input.version;\n if (!version) {\n return { content: \"\", visible: false };\n }\n\n const icon = getIcon(\"version\", theme, config.icons);\n const text = icon ? `${icon}${version}` : `v${version}`;\n const content = applyStyle(text, theme.colors.version);\n\n return { content, visible: true };\n}\n\nfunction renderUsage(input: StatusInput, theme: Theme, config: CcslConfig): WidgetResult {\n const sessionUsage = input.session_usage;\n if (!sessionUsage) {\n return { content: \"\", visible: false };\n }\n\n const { requests_used, requests_limit, usage_percentage, plan } = sessionUsage;\n\n // Need at least some usage info to display\n if (requests_used === undefined && usage_percentage === undefined) {\n return { content: \"\", visible: false };\n }\n\n const icon = getIcon(\"usage\", theme, config.icons);\n\n // Calculate percentage if not provided\n let percent = usage_percentage;\n if (percent === undefined && requests_used !== undefined && requests_limit !== undefined && requests_limit > 0) {\n percent = (requests_used / requests_limit) * 100;\n }\n\n // Build the display string\n let text = \"\";\n if (icon) {\n text += `${icon} `;\n }\n\n // Show usage bar if we have percentage\n if (percent !== undefined) {\n const progressBar = renderUsageBar(percent, theme);\n text += progressBar + \" \";\n }\n\n // Show counts if available\n if (requests_used !== undefined && requests_limit !== undefined) {\n text += `${requests_used}/${requests_limit}`;\n } else if (percent !== undefined) {\n text += `${Math.round(percent)}%`;\n }\n\n // Append plan if available\n if (plan) {\n text += ` (${plan})`;\n }\n\n // Color based on usage level\n let colorKey: \"usage\" | \"usageHigh\" | \"usageCritical\" = \"usage\";\n if (percent !== undefined) {\n if (percent >= 90) {\n colorKey = \"usageCritical\";\n } else if (percent >= 70) {\n colorKey = \"usageHigh\";\n }\n }\n\n const style = theme.colors[colorKey] || theme.colors.usage;\n const content = applyStyle(text.trim(), style);\n\n return { content, visible: true };\n}\n\nfunction renderUsageBar(percentage: number, theme: Theme): string {\n const totalBars = 5;\n const filledBars = Math.round((percentage / 100) * totalBars);\n const emptyBars = totalBars - filledBars;\n\n const filledChar = \"▰\";\n const emptyChar = \"▱\";\n\n // Color the filled portion based on usage level\n let filledStyle = theme.colors.usage;\n if (percentage >= 90) {\n filledStyle = theme.colors.usageCritical || theme.colors.usage;\n } else if (percentage >= 70) {\n filledStyle = theme.colors.usageHigh || theme.colors.usage;\n }\n\n const filled = applyStyle(filledChar.repeat(filledBars), filledStyle);\n const empty = applyStyle(emptyChar.repeat(emptyBars), { fg: \"#444444\", dim: true });\n\n return `${filled}${empty}`;\n}\n\nfunction renderResetTime(input: StatusInput, theme: Theme, config: CcslConfig): WidgetResult {\n const sessionUsage = input.session_usage;\n if (!sessionUsage) {\n return { content: \"\", visible: false };\n }\n\n const { reset_at, reset_in_seconds } = sessionUsage;\n\n // Need reset time info\n if (reset_at === undefined && reset_in_seconds === undefined) {\n return { content: \"\", visible: false };\n }\n\n const icon = getIcon(\"resetTime\", theme, config.icons);\n\n let timeStr = \"\";\n if (reset_in_seconds !== undefined) {\n timeStr = formatResetDuration(reset_in_seconds);\n } else if (reset_at) {\n // Parse ISO timestamp and calculate time until reset\n try {\n const resetDate = new Date(reset_at);\n const now = new Date();\n const diffSeconds = Math.max(0, Math.floor((resetDate.getTime() - now.getTime()) / 1000));\n timeStr = formatResetDuration(diffSeconds);\n } catch {\n // If parsing fails, show the raw timestamp\n timeStr = reset_at;\n }\n }\n\n const text = icon ? `${icon} ${timeStr}` : timeStr;\n const content = applyStyle(text, theme.colors.resetTime);\n\n return { content, visible: true };\n}\n\nfunction formatResetDuration(seconds: number): string {\n if (seconds <= 0) {\n return \"now\";\n }\n\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n\n if (hours > 0) {\n return minutes > 0 ? `${hours}h${minutes}m` : `${hours}h`;\n }\n\n if (minutes > 0) {\n const secs = seconds % 60;\n return secs > 0 ? `${minutes}m${secs}s` : `${minutes}m`;\n }\n\n return `${seconds}s`;\n}\n","import type { StatusInput } from \"./parser.js\";\nimport type { CcslConfig } from \"./config/loader.js\";\nimport { themes } from \"./themes/index.js\";\nimport { renderWidget } from \"./widgets/index.js\";\nimport { applyStyle } from \"./utils/colors.js\";\n\nexport function formatStatusLine(input: StatusInput, config: CcslConfig): string {\n const theme = config.customTheme || themes[config.theme] || themes.minimal;\n const renderedWidgets: string[] = [];\n\n for (const widget of config.widgets) {\n const result = renderWidget(widget, input, theme, config);\n if (result.visible && result.content) {\n renderedWidgets.push(result.content);\n }\n }\n\n if (renderedWidgets.length === 0) {\n return \"\";\n }\n\n const separator = applyStyle(config.separator, theme.colors.separator);\n const statusLine = renderedWidgets.join(separator);\n\n // Add padding\n const padding = \" \".repeat(config.padding);\n\n // Prepend ANSI reset to ensure clean state\n return `\\x1b[0m${padding}${statusLine}${padding}`;\n}\n\n// Sample data for preview\nexport const sampleStatusInput: StatusInput = {\n hook_event_name: \"Status\",\n session_id: \"sample-session-123\",\n model: {\n id: \"claude-opus-4-1\",\n display_name: \"Opus\",\n },\n workspace: {\n current_dir: \"/home/user/my-project\",\n project_dir: \"/home/user/my-project\",\n },\n version: \"1.0.80\",\n cost: {\n total_cost_usd: 0.0234,\n total_duration_ms: 45000,\n total_api_duration_ms: 2300,\n total_lines_added: 156,\n total_lines_removed: 23,\n },\n context_window: {\n total_input_tokens: 15234,\n total_output_tokens: 4521,\n context_window_size: 200000,\n used_percentage: 42.5,\n remaining_percentage: 57.5,\n current_usage: {\n input_tokens: 8500,\n output_tokens: 1200,\n cache_creation_input_tokens: 5000,\n cache_read_input_tokens: 2000,\n },\n },\n session_usage: {\n requests_used: 45,\n requests_limit: 100,\n usage_percentage: 45,\n reset_in_seconds: 7200,\n plan: \"Pro\",\n },\n};\n","import { readFileSync, writeFileSync, existsSync, mkdirSync, copyFileSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport { homedir } from \"os\";\n\nexport interface ClaudeSettings {\n statusLine?: {\n type: \"command\";\n command: string;\n padding?: number;\n };\n [key: string]: unknown;\n}\n\nexport function getClaudeSettingsPath(): string {\n const claudeDir = process.env.CLAUDE_CONFIG_DIR || join(homedir(), \".claude\");\n return join(claudeDir, \"settings.json\");\n}\n\nexport function getClaudeSettings(): ClaudeSettings | null {\n const settingsPath = getClaudeSettingsPath();\n\n if (!existsSync(settingsPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(settingsPath, \"utf8\");\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n\nexport function backupClaudeSettings(): string | null {\n const settingsPath = getClaudeSettingsPath();\n\n if (!existsSync(settingsPath)) {\n return null;\n }\n\n const backupPath = settingsPath + \".backup\";\n try {\n copyFileSync(settingsPath, backupPath);\n return backupPath;\n } catch {\n return null;\n }\n}\n\nexport function installToClaudeSettings(command: string = \"npx @vimukthid/ccsl\"): boolean {\n const settingsPath = getClaudeSettingsPath();\n const dir = dirname(settingsPath);\n\n // Ensure directory exists\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n // Load existing settings or create new\n let settings: ClaudeSettings = {};\n if (existsSync(settingsPath)) {\n try {\n const content = readFileSync(settingsPath, \"utf8\");\n settings = JSON.parse(content);\n } catch {\n // If parse fails, start fresh\n settings = {};\n }\n }\n\n // Update statusLine\n settings.statusLine = {\n type: \"command\",\n command,\n };\n\n // Write back\n try {\n writeFileSync(settingsPath, JSON.stringify(settings, null, 2));\n return true;\n } catch {\n return false;\n }\n}\n\nexport function uninstallFromClaudeSettings(): boolean {\n const settingsPath = getClaudeSettingsPath();\n\n if (!existsSync(settingsPath)) {\n return true; // Nothing to uninstall\n }\n\n try {\n const content = readFileSync(settingsPath, \"utf8\");\n const settings: ClaudeSettings = JSON.parse(content);\n\n // Remove statusLine\n delete settings.statusLine;\n\n // Write back\n writeFileSync(settingsPath, JSON.stringify(settings, null, 2));\n return true;\n } catch {\n return false;\n }\n}\n\nexport function isInstalledInClaude(): boolean {\n const settings = getClaudeSettings();\n if (!settings?.statusLine) {\n return false;\n }\n\n const command = settings.statusLine.command || \"\";\n return command.includes(\"ccsl\") || command.includes(\"@vimukthid/ccsl\");\n}\n\nexport function getCurrentClaudeCommand(): string | null {\n const settings = getClaudeSettings();\n return settings?.statusLine?.command || null;\n}\n","import React, { useState } from \"react\";\nimport { render, Box, Text, useApp, useInput } from \"ink\";\nimport SelectInput from \"ink-select-input\";\nimport { loadConfigForScope, getConfigPath, type CcslConfig } from \"../config/loader.js\";\nimport { themeNames } from \"../themes/index.js\";\nimport { formatStatusLine, sampleStatusInput } from \"../formatter.js\";\nimport { availableWidgets, type WidgetType } from \"../widgets/index.js\";\nimport {\n installToClaudeSettings,\n isInstalledInClaude,\n getCurrentClaudeCommand,\n} from \"../config/claude.js\";\nimport { writeFileSync, mkdirSync, existsSync } from \"fs\";\nimport { dirname } from \"path\";\n\ntype Screen = \"main\" | \"themes\" | \"widgets\" | \"settings\" | \"preview\" | \"install\";\n\ninterface AppProps {\n initialConfig: CcslConfig;\n scope: \"local\" | \"global\";\n}\n\nfunction App({ initialConfig, scope }: AppProps) {\n const { exit } = useApp();\n const [screen, setScreen] = useState<Screen>(\"main\");\n const [config, setConfig] = useState<CcslConfig>(initialConfig);\n const [message, setMessage] = useState<string>(\"\");\n\n useInput((input, key) => {\n if (key.escape) {\n if (screen === \"main\") {\n exit();\n } else {\n setScreen(\"main\");\n }\n }\n if (input === \"q\" && screen === \"main\") {\n exit();\n }\n });\n\n const saveConfig = () => {\n const configPath = getConfigPath(scope);\n try {\n const dir = dirname(configPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(configPath, JSON.stringify(config, null, 2));\n setMessage(\"Configuration saved!\");\n setTimeout(() => setMessage(\"\"), 2000);\n } catch (err) {\n setMessage(`Error saving: ${err}`);\n }\n };\n\n const renderMain = () => {\n const items = [\n { label: \"🎨 Select Theme\", value: \"themes\" },\n { label: \"📊 Configure Widgets\", value: \"widgets\" },\n { label: \"⚙️ General Settings\", value: \"settings\" },\n { label: \"👁️ Live Preview\", value: \"preview\" },\n { label: \"📦 Install to Claude Code\", value: \"install\" },\n { label: \"💾 Save Configuration\", value: \"save\" },\n { label: \"❌ Exit\", value: \"exit\" },\n ];\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n CCSL Configuration\n </Text>\n <Text color=\"gray\"> ({scope})</Text>\n </Box>\n <SelectInput\n items={items}\n onSelect={(item) => {\n if (item.value === \"exit\") {\n exit();\n } else if (item.value === \"save\") {\n saveConfig();\n } else {\n setScreen(item.value as Screen);\n }\n }}\n />\n {message && (\n <Box marginTop={1}>\n <Text color=\"green\">{message}</Text>\n </Box>\n )}\n <Box marginTop={1}>\n <Text color=\"gray\">Press q or Esc to exit</Text>\n </Box>\n </Box>\n );\n };\n\n const renderThemes = () => {\n const items = themeNames.map((name) => ({\n label: `${name}${config.theme === name ? \" (current)\" : \"\"}`,\n value: name,\n }));\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🎨 Select Theme\n </Text>\n </Box>\n <SelectInput\n items={items}\n onSelect={(item) => {\n setConfig({ ...config, theme: item.value });\n setScreen(\"main\");\n }}\n />\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"gray\">Preview:</Text>\n <Text>{formatStatusLine(sampleStatusInput, config)}</Text>\n </Box>\n <Box marginTop={1}>\n <Text color=\"gray\">Press Esc to go back</Text>\n </Box>\n </Box>\n );\n };\n\n const renderWidgets = () => {\n const items = availableWidgets.map((widget) => ({\n label: `${config.widgets.includes(widget) ? \"[x]\" : \"[ ]\"} ${widget}`,\n value: widget,\n }));\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 📊 Configure Widgets\n </Text>\n </Box>\n <SelectInput\n items={items}\n onSelect={(item) => {\n const widget = item.value as WidgetType;\n const newWidgets = config.widgets.includes(widget)\n ? config.widgets.filter((w) => w !== widget)\n : [...config.widgets, widget];\n setConfig({ ...config, widgets: newWidgets });\n }}\n />\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"gray\">Current order: {config.widgets.join(\", \")}</Text>\n <Text>{formatStatusLine(sampleStatusInput, config)}</Text>\n </Box>\n <Box marginTop={1}>\n <Text color=\"gray\">Press Esc to go back</Text>\n </Box>\n </Box>\n );\n };\n\n const renderSettings = () => {\n const iconOptions = [\n { label: `Icons: auto${config.icons === \"auto\" ? \" (current)\" : \"\"}`, value: \"icon-auto\" },\n { label: `Icons: nerd${config.icons === \"nerd\" ? \" (current)\" : \"\"}`, value: \"icon-nerd\" },\n {\n label: `Icons: unicode${config.icons === \"unicode\" ? \" (current)\" : \"\"}`,\n value: \"icon-unicode\",\n },\n { label: `Icons: ascii${config.icons === \"ascii\" ? \" (current)\" : \"\"}`, value: \"icon-ascii\" },\n ];\n\n const separatorOptions = [\n {\n label: `Separator: \" │ \"${config.separator === \" │ \" ? \" (current)\" : \"\"}`,\n value: \"sep- │ \",\n },\n {\n label: `Separator: \" | \"${config.separator === \" | \" ? \" (current)\" : \"\"}`,\n value: \"sep- | \",\n },\n {\n label: `Separator: \" · \"${config.separator === \" · \" ? \" (current)\" : \"\"}`,\n value: \"sep- · \",\n },\n {\n label: `Separator: \" \"${config.separator === \" \" ? \" (current)\" : \"\"}`,\n value: \"sep- \",\n },\n ];\n\n const items = [...iconOptions, ...separatorOptions];\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n ⚙️ General Settings\n </Text>\n </Box>\n <SelectInput\n items={items}\n onSelect={(item) => {\n if (item.value.startsWith(\"icon-\")) {\n const iconMode = item.value.replace(\"icon-\", \"\") as\n | \"auto\"\n | \"nerd\"\n | \"unicode\"\n | \"ascii\";\n setConfig({ ...config, icons: iconMode });\n } else if (item.value.startsWith(\"sep-\")) {\n const sep = item.value.replace(\"sep-\", \"\");\n setConfig({ ...config, separator: sep });\n }\n }}\n />\n <Box marginTop={1}>\n <Text>{formatStatusLine(sampleStatusInput, config)}</Text>\n </Box>\n <Box marginTop={1}>\n <Text color=\"gray\">Press Esc to go back</Text>\n </Box>\n </Box>\n );\n };\n\n const renderPreview = () => {\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 👁️ Live Preview\n </Text>\n </Box>\n <Box marginBottom={1} flexDirection=\"column\">\n <Text color=\"gray\">Theme: {config.theme}</Text>\n <Text color=\"gray\">Widgets: {config.widgets.join(\", \")}</Text>\n <Text color=\"gray\">Icons: {config.icons}</Text>\n </Box>\n <Box marginBottom={1}>\n <Text bold>Output:</Text>\n </Box>\n <Text>{formatStatusLine(sampleStatusInput, config)}</Text>\n <Box marginTop={2}>\n <Text color=\"gray\">Press Esc to go back</Text>\n </Box>\n </Box>\n );\n };\n\n const renderInstall = () => {\n const installed = isInstalledInClaude();\n const currentCmd = getCurrentClaudeCommand();\n\n const items = [\n { label: installed ? \"🔄 Update Installation\" : \"📥 Install to Claude Code\", value: \"install\" },\n { label: \"⬅️ Back\", value: \"back\" },\n ];\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 📦 Claude Code Integration\n </Text>\n </Box>\n <Box marginBottom={1} flexDirection=\"column\">\n {installed ? (\n <>\n <Text color=\"green\">Status: Installed</Text>\n <Text color=\"gray\">Command: {currentCmd}</Text>\n </>\n ) : (\n <Text color=\"yellow\">Status: Not installed</Text>\n )}\n </Box>\n <SelectInput\n items={items}\n onSelect={(item) => {\n if (item.value === \"install\") {\n const success = installToClaudeSettings();\n if (success) {\n setMessage(\"Installed! Restart Claude Code to apply.\");\n } else {\n setMessage(\"Installation failed. Check permissions.\");\n }\n setTimeout(() => setMessage(\"\"), 3000);\n } else {\n setScreen(\"main\");\n }\n }}\n />\n {message && (\n <Box marginTop={1}>\n <Text color={message.includes(\"failed\") ? \"red\" : \"green\"}>{message}</Text>\n </Box>\n )}\n <Box marginTop={1}>\n <Text color=\"gray\">Press Esc to go back</Text>\n </Box>\n </Box>\n );\n };\n\n return (\n <Box padding={1} flexDirection=\"column\">\n {screen === \"main\" && renderMain()}\n {screen === \"themes\" && renderThemes()}\n {screen === \"widgets\" && renderWidgets()}\n {screen === \"settings\" && renderSettings()}\n {screen === \"preview\" && renderPreview()}\n {screen === \"install\" && renderInstall()}\n </Box>\n );\n}\n\nexport async function launchTui(scope: \"local\" | \"global\") {\n const config = await loadConfigForScope(scope);\n\n const { waitUntilExit } = render(<App initialConfig={config} scope={scope} />);\n await waitUntilExit();\n}\n","import { Command } from \"commander\";\nimport { loadConfig, getConfigPath } from \"./config/loader.js\";\nimport { parseStatusInput, readStdin, isInteractiveMode } from \"./parser.js\";\nimport { formatStatusLine, sampleStatusInput } from \"./formatter.js\";\nimport { themeNames } from \"./themes/index.js\";\nimport {\n installToClaudeSettings,\n uninstallFromClaudeSettings,\n isInstalledInClaude,\n getCurrentClaudeCommand,\n backupClaudeSettings,\n getClaudeSettingsPath,\n} from \"./config/claude.js\";\nimport { writeFileSync, mkdirSync, existsSync } from \"fs\";\nimport { dirname } from \"path\";\nimport { defaultConfig } from \"./config/defaults.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"ccsl\")\n .description(\"Customizable status line formatter for Claude Code CLI\")\n .version(\"0.0.1\");\n\nprogram\n .command(\"install\")\n .description(\"Install ccsl to Claude Code settings.json\")\n .option(\"-c, --command <cmd>\", \"Custom command to use\", \"npx @vimukthid/ccsl\")\n .action(async (options) => {\n console.log(\"\\nInstalling ccsl to Claude Code...\\n\");\n\n // Check if already installed\n if (isInstalledInClaude()) {\n const currentCmd = getCurrentClaudeCommand();\n console.log(` Already installed with command: ${currentCmd}`);\n console.log(\" Updating configuration...\\n\");\n }\n\n // Backup existing settings\n const backupPath = backupClaudeSettings();\n if (backupPath) {\n console.log(` Backup created: ${backupPath}`);\n }\n\n // Install\n const success = installToClaudeSettings(options.command);\n if (success) {\n console.log(` Installed to: ${getClaudeSettingsPath()}`);\n console.log(` Command: ${options.command}`);\n console.log(\"\\n ccsl is now configured for Claude Code!\");\n console.log(\" Restart Claude Code to see your new status line.\\n\");\n } else {\n console.error(\"\\n Failed to install. Check file permissions.\\n\");\n process.exit(1);\n }\n });\n\nprogram\n .command(\"uninstall\")\n .description(\"Remove ccsl from Claude Code settings.json\")\n .action(async () => {\n console.log(\"\\nRemoving ccsl from Claude Code...\\n\");\n\n if (!isInstalledInClaude()) {\n console.log(\" ccsl is not currently installed in Claude Code.\\n\");\n return;\n }\n\n // Backup existing settings\n const backupPath = backupClaudeSettings();\n if (backupPath) {\n console.log(` Backup created: ${backupPath}`);\n }\n\n const success = uninstallFromClaudeSettings();\n if (success) {\n console.log(\" Successfully removed from Claude Code settings.\\n\");\n } else {\n console.error(\"\\n Failed to uninstall. Check file permissions.\\n\");\n process.exit(1);\n }\n });\n\nprogram\n .command(\"theme [name]\")\n .description(\"Quick switch theme or list available themes\")\n .option(\"-l, --list\", \"List available themes\")\n .action(async (name, options) => {\n if (options.list || !name) {\n listThemes();\n return;\n }\n await switchTheme(name);\n });\n\nprogram\n .command(\"preview\")\n .description(\"Preview current configuration with sample data\")\n .action(async () => {\n await previewConfig();\n });\n\nprogram\n .command(\"init\")\n .description(\"Create local config file\")\n .option(\"-g, --global\", \"Create global config file instead\")\n .action(async (options) => {\n const scope = options.global ? \"global\" : \"local\";\n await initConfig(scope);\n });\n\nprogram\n .command(\"config\")\n .description(\"Open TUI configuration\")\n .option(\"-g, --global\", \"Configure global settings\")\n .option(\"-l, --local\", \"Configure local project settings\")\n .action(async (options) => {\n const scope = options.global ? \"global\" : \"local\";\n await runTui(scope);\n });\n\n// Default action - either format stdin or launch TUI\nprogram.action(async () => {\n if (isInteractiveMode()) {\n // No piped input - launch TUI\n await runTui(\"local\");\n } else {\n // Piped input - format status line\n const stdinData = await readStdin();\n const input = parseStatusInput(stdinData);\n\n if (!input) {\n // Output empty line if no valid input\n console.log(\"\");\n return;\n }\n\n const config = await loadConfig();\n const output = formatStatusLine(input, config);\n console.log(output);\n }\n});\n\nasync function runTui(scope: \"local\" | \"global\") {\n const { launchTui } = await import(\"./tui/app.js\");\n await launchTui(scope);\n}\n\nfunction listThemes() {\n console.log(\"\\nAvailable themes:\\n\");\n\n const descriptions: Record<string, string> = {\n neon: \"Vibrant cyberpunk with electric colors\",\n rainbow: \"Colorful gradient transitions\",\n ocean: \"Cool blues and teals\",\n minimal: \"Clean, understated (default)\",\n monochrome: \"Pure grayscale\",\n corporate: \"Professional muted blues\",\n };\n\n for (const name of themeNames) {\n const desc = descriptions[name] || \"\";\n console.log(` ${name.padEnd(12)} - ${desc}`);\n }\n\n console.log(\"\\nUse 'ccsl theme <name>' to switch themes\");\n console.log(\"Use 'ccsl preview' to see the current theme\\n\");\n}\n\nasync function switchTheme(themeName: string) {\n if (!themeNames.includes(themeName)) {\n console.error(`\\nError: Unknown theme '${themeName}'`);\n console.log(`Available themes: ${themeNames.join(\", \")}\\n`);\n process.exit(1);\n }\n\n const configPath = getConfigPath(\"local\");\n const config = await loadConfig();\n config.theme = themeName;\n\n try {\n const dir = dirname(configPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(configPath, JSON.stringify(config, null, 2));\n console.log(`\\nTheme switched to '${themeName}'\\n`);\n\n // Show preview\n const output = formatStatusLine(sampleStatusInput, config);\n console.log(\"Preview:\");\n console.log(output);\n console.log(\"\");\n } catch (err) {\n console.error(`\\nError saving config: ${err}\\n`);\n process.exit(1);\n }\n}\n\nasync function previewConfig() {\n const config = await loadConfig();\n\n console.log(\"\\nCurrent configuration:\");\n console.log(` Theme: ${config.theme}`);\n console.log(` Widgets: ${config.widgets.join(\", \")}`);\n console.log(` Separator: \"${config.separator}\"`);\n console.log(` Icons: ${config.icons}`);\n console.log(\"\\nPreview with sample data:\\n\");\n console.log(formatStatusLine(sampleStatusInput, config));\n console.log(\"\");\n\n // Show Claude Code status\n if (isInstalledInClaude()) {\n console.log(`Claude Code: Installed (${getCurrentClaudeCommand()})`);\n } else {\n console.log(\"Claude Code: Not installed (run 'ccsl install')\");\n }\n console.log(\"\");\n}\n\nasync function initConfig(scope: \"local\" | \"global\") {\n const configPath = getConfigPath(scope);\n\n if (existsSync(configPath)) {\n console.log(`\\nConfig file already exists at ${configPath}\\n`);\n return;\n }\n\n try {\n const dir = dirname(configPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(configPath, JSON.stringify(defaultConfig, null, 2));\n console.log(`\\nCreated config file at ${configPath}\\n`);\n } catch (err) {\n console.error(`\\nError creating config: ${err}\\n`);\n process.exit(1);\n }\n}\n\nprogram.parse();\n","import { z } from \"zod\";\n\n// Schema for Claude Code status JSON input\nexport const StatusInputSchema = z\n .object({\n hook_event_name: z.string().optional(),\n session_id: z.string().optional(),\n transcript_path: z.string().optional(),\n cwd: z.string().optional(),\n model: z\n .object({\n id: z.string().optional(),\n display_name: z.string().optional(),\n })\n .optional(),\n workspace: z\n .object({\n current_dir: z.string().optional(),\n project_dir: z.string().optional(),\n })\n .optional(),\n version: z.string().optional(),\n output_style: z\n .object({\n name: z.string().optional(),\n })\n .optional(),\n cost: z\n .object({\n total_cost_usd: z.number().optional(),\n total_duration_ms: z.number().optional(),\n total_api_duration_ms: z.number().optional(),\n total_lines_added: z.number().optional(),\n total_lines_removed: z.number().optional(),\n })\n .optional(),\n context_window: z\n .object({\n total_input_tokens: z.number().optional(),\n total_output_tokens: z.number().optional(),\n context_window_size: z.number().optional(),\n used_percentage: z.number().optional(),\n remaining_percentage: z.number().optional(),\n current_usage: z\n .object({\n input_tokens: z.number().optional(),\n output_tokens: z.number().optional(),\n cache_creation_input_tokens: z.number().optional(),\n cache_read_input_tokens: z.number().optional(),\n })\n .nullable()\n .optional(),\n })\n .optional(),\n // Session usage and rate limit information\n session_usage: z\n .object({\n // Number of requests/messages used in current session\n requests_used: z.number().optional(),\n // Maximum requests allowed in the session period\n requests_limit: z.number().optional(),\n // Percentage of session usage (0-100)\n usage_percentage: z.number().optional(),\n // ISO timestamp when the usage limit resets\n reset_at: z.string().optional(),\n // Seconds until reset\n reset_in_seconds: z.number().optional(),\n // Plan/tier name (e.g., \"Pro\", \"Free\", \"Max\")\n plan: z.string().optional(),\n })\n .optional(),\n })\n .passthrough();\n\nexport type StatusInput = z.infer<typeof StatusInputSchema>;\n\nexport function parseStatusInput(input: string): StatusInput | null {\n try {\n const trimmed = input.trim();\n if (!trimmed) {\n return null;\n }\n const parsed = JSON.parse(trimmed);\n const result = StatusInputSchema.safeParse(parsed);\n\n if (result.success) {\n return result.data;\n }\n\n // If validation fails, still try to use the data\n // Claude Code may add new fields we don't know about\n return parsed as StatusInput;\n } catch {\n return null;\n }\n}\n\nexport async function readStdin(): Promise<string> {\n return new Promise((resolve) => {\n let data = \"\";\n\n process.stdin.setEncoding(\"utf8\");\n\n process.stdin.on(\"readable\", () => {\n let chunk;\n while ((chunk = process.stdin.read()) !== null) {\n data += chunk;\n }\n });\n\n process.stdin.on(\"end\", () => {\n resolve(data);\n });\n\n process.stdin.on(\"error\", () => {\n resolve(\"\");\n });\n });\n}\n\nexport function isInteractiveMode(): boolean {\n return process.stdin.isTTY === true;\n}\n"],"mappings":";;;;;;;;;;;;AACA,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAF9B;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAGa,gBAEA;AALb;AAAA;AAAA;AAAA;AAGO,IAAM,iBAA+B,CAAC,SAAS,WAAW,UAAU,MAAM;AAE1E,IAAM,gBAA4B;AAAA,MACvC,OAAO;AAAA,MACP,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IACX;AAAA;AAAA;;;ACXA,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AA6B3B,eAAsB,WAAW,YAA0C;AACzE,MAAI;AACF,UAAM,SAAS,MAAM,SAAS,OAAO,UAAU;AAE/C,QAAI,UAAU,OAAO,QAAQ;AAC3B,aAAO,YAAY,eAAe,OAAO,MAAM;AAAA,IACjD;AAGA,UAAM,aAAa,cAAc,QAAQ;AACzC,QAAI,WAAW,UAAU,GAAG;AAC1B,YAAM,eAAe,MAAM,SAAS,KAAK,UAAU;AACnD,UAAI,gBAAgB,aAAa,QAAQ;AACvC,eAAO,YAAY,eAAe,aAAa,MAAM;AAAA,MACvD;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO,EAAE,GAAG,cAAc;AAC5B;AAEA,eAAsB,mBAAmB,OAAgD;AACvF,QAAM,aAAa,cAAc,KAAK;AAGtC,MAAI,UAAU,UAAU;AACtB,QAAI,WAAW,UAAU,GAAG;AAC1B,UAAI;AACF,cAAM,SAAS,MAAM,SAAS,KAAK,UAAU;AAC7C,YAAI,UAAU,OAAO,QAAQ;AAC3B,iBAAO,YAAY,eAAe,OAAO,MAAM;AAAA,QACjD;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AACA,WAAO,EAAE,GAAG,cAAc;AAAA,EAC5B;AAGA,SAAO,WAAW;AACpB;AAgBA,SAAS,YAAY,UAAsB,YAA6C;AACtF,SAAO;AAAA,IACL,OAAO,WAAW,SAAS,SAAS;AAAA,IACpC,SAAS,WAAW,WAAW,SAAS;AAAA,IACxC,WAAW,WAAW,aAAa,SAAS;AAAA,IAC5C,OAAO,WAAW,SAAS,SAAS;AAAA,IACpC,SAAS,WAAW,WAAW,SAAS;AAAA,IACxC,aAAa,WAAW;AAAA,EAC1B;AACF;AAEO,SAAS,cAAc,OAAmC;AAC/D,MAAI,UAAU,SAAS;AACrB,WAAO;AAAA,EACT;AACA,QAAM,OAAO,QAAQ,IAAI,QAAQ,QAAQ,IAAI,eAAe;AAC5D,SAAO,GAAG,IAAI;AAChB;AA1GA,IAgBM;AAhBN;AAAA;AAAA;AAAA;AAEA;AAcA,IAAM,WAAW,YAAY,QAAQ;AAAA,MACnC,cAAc;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAAA;AAAA;;;AC5BD,IA8BM,WAwBA,cAwBA,YAwBA,cAkCA,iBAkCA,gBAuBO,QASA;AA1Mb;AAAA;AAAA;AAAA;AA8BA,IAAM,YAAmB;AAAA,MACvB,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,OAAO,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,QACnC,SAAS,EAAE,IAAI,UAAU;AAAA,QACzB,aAAa,EAAE,IAAI,UAAU;AAAA,QAC7B,iBAAiB,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,QAC7C,QAAQ,EAAE,IAAI,UAAU;AAAA,QACxB,MAAM,EAAE,IAAI,UAAU;AAAA,QACtB,UAAU,EAAE,IAAI,UAAU;AAAA,QAC1B,OAAO,EAAE,IAAI,UAAU;AAAA,QACvB,YAAY,EAAE,IAAI,UAAU;AAAA,QAC5B,cAAc,EAAE,IAAI,UAAU;AAAA,QAC9B,WAAW,EAAE,IAAI,UAAU;AAAA,QAC3B,SAAS,EAAE,IAAI,UAAU;AAAA,QACzB,WAAW,EAAE,IAAI,UAAU;AAAA,QAC3B,OAAO,EAAE,IAAI,UAAU;AAAA,QACvB,WAAW,EAAE,IAAI,UAAU;AAAA,QAC3B,eAAe,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,QAC3C,WAAW,EAAE,IAAI,UAAU;AAAA,MAC7B;AAAA,IACF;AAGA,IAAM,eAAsB;AAAA,MAC1B,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,OAAO,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,QACnC,SAAS,EAAE,IAAI,UAAU;AAAA,QACzB,aAAa,EAAE,IAAI,UAAU;AAAA,QAC7B,iBAAiB,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,QAC7C,QAAQ,EAAE,IAAI,UAAU;AAAA,QACxB,MAAM,EAAE,IAAI,UAAU;AAAA,QACtB,UAAU,EAAE,IAAI,UAAU;AAAA,QAC1B,OAAO,EAAE,IAAI,UAAU;AAAA,QACvB,YAAY,EAAE,IAAI,UAAU;AAAA,QAC5B,cAAc,EAAE,IAAI,UAAU;AAAA,QAC9B,WAAW,EAAE,IAAI,UAAU;AAAA,QAC3B,SAAS,EAAE,IAAI,UAAU;AAAA,QACzB,WAAW,EAAE,IAAI,UAAU;AAAA,QAC3B,OAAO,EAAE,IAAI,UAAU;AAAA,QACvB,WAAW,EAAE,IAAI,UAAU;AAAA,QAC3B,eAAe,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,QAC3C,WAAW,EAAE,IAAI,UAAU;AAAA,MAC7B;AAAA,IACF;AAGA,IAAM,aAAoB;AAAA,MACxB,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,OAAO,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,QACnC,SAAS,EAAE,IAAI,UAAU;AAAA,QACzB,aAAa,EAAE,IAAI,UAAU;AAAA,QAC7B,iBAAiB,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,QAC7C,QAAQ,EAAE,IAAI,UAAU;AAAA,QACxB,MAAM,EAAE,IAAI,UAAU;AAAA,QACtB,UAAU,EAAE,IAAI,UAAU;AAAA,QAC1B,OAAO,EAAE,IAAI,UAAU;AAAA,QACvB,YAAY,EAAE,IAAI,UAAU;AAAA,QAC5B,cAAc,EAAE,IAAI,UAAU;AAAA,QAC9B,WAAW,EAAE,IAAI,UAAU;AAAA,QAC3B,SAAS,EAAE,IAAI,UAAU;AAAA,QACzB,WAAW,EAAE,IAAI,UAAU;AAAA,QAC3B,OAAO,EAAE,IAAI,UAAU;AAAA,QACvB,WAAW,EAAE,IAAI,UAAU;AAAA,QAC3B,eAAe,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,QAC3C,WAAW,EAAE,IAAI,UAAU;AAAA,MAC7B;AAAA,IACF;AAGA,IAAM,eAAsB;AAAA,MAC1B,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,OAAO,EAAE,IAAI,UAAU;AAAA,QACvB,SAAS,EAAE,IAAI,UAAU;AAAA,QACzB,aAAa,EAAE,IAAI,UAAU;AAAA,QAC7B,iBAAiB,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,QAC7C,QAAQ,EAAE,IAAI,WAAW,KAAK,KAAK;AAAA,QACnC,MAAM,EAAE,IAAI,UAAU;AAAA,QACtB,UAAU,EAAE,IAAI,WAAW,KAAK,KAAK;AAAA,QACrC,OAAO,EAAE,IAAI,UAAU;AAAA,QACvB,YAAY,EAAE,IAAI,UAAU;AAAA,QAC5B,cAAc,EAAE,IAAI,UAAU;AAAA,QAC9B,WAAW,EAAE,IAAI,UAAU;AAAA,QAC3B,SAAS,EAAE,IAAI,UAAU;AAAA,QACzB,WAAW,EAAE,IAAI,UAAU;AAAA,QAC3B,OAAO,EAAE,IAAI,UAAU;AAAA,QACvB,WAAW,EAAE,IAAI,UAAU;AAAA,QAC3B,eAAe,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,QAC3C,WAAW,EAAE,IAAI,UAAU;AAAA,MAC7B;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,OAAO;AAAA,QACP,WAAW;AAAA,QACX,OAAO;AAAA,QACP,WAAW;AAAA,MACb;AAAA,IACF;AAGA,IAAM,kBAAyB;AAAA,MAC7B,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,OAAO,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,QACnC,SAAS,EAAE,IAAI,UAAU;AAAA,QACzB,aAAa,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,QACzC,iBAAiB,EAAE,IAAI,WAAW,MAAM,MAAM,WAAW,KAAK;AAAA,QAC9D,QAAQ,EAAE,IAAI,UAAU;AAAA,QACxB,MAAM,EAAE,IAAI,UAAU;AAAA,QACtB,UAAU,EAAE,IAAI,UAAU;AAAA,QAC1B,OAAO,EAAE,IAAI,UAAU;AAAA,QACvB,YAAY,EAAE,IAAI,UAAU;AAAA,QAC5B,cAAc,EAAE,IAAI,UAAU;AAAA,QAC9B,WAAW,EAAE,IAAI,UAAU;AAAA,QAC3B,SAAS,EAAE,IAAI,UAAU;AAAA,QACzB,WAAW,EAAE,IAAI,UAAU;AAAA,QAC3B,OAAO,EAAE,IAAI,UAAU;AAAA,QACvB,WAAW,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,QACvC,eAAe,EAAE,IAAI,WAAW,MAAM,MAAM,WAAW,KAAK;AAAA,QAC5D,WAAW,EAAE,IAAI,UAAU;AAAA,MAC7B;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,OAAO;AAAA,QACP,WAAW;AAAA,QACX,OAAO;AAAA,QACP,WAAW;AAAA,MACb;AAAA,IACF;AAGA,IAAM,iBAAwB;AAAA,MAC5B,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,OAAO,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,QACnC,SAAS,EAAE,IAAI,UAAU;AAAA,QACzB,aAAa,EAAE,IAAI,UAAU;AAAA,QAC7B,iBAAiB,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,QAC7C,QAAQ,EAAE,IAAI,UAAU;AAAA,QACxB,MAAM,EAAE,IAAI,UAAU;AAAA,QACtB,UAAU,EAAE,IAAI,UAAU;AAAA,QAC1B,OAAO,EAAE,IAAI,UAAU;AAAA,QACvB,YAAY,EAAE,IAAI,UAAU;AAAA,QAC5B,cAAc,EAAE,IAAI,UAAU;AAAA,QAC9B,WAAW,EAAE,IAAI,UAAU;AAAA,QAC3B,SAAS,EAAE,IAAI,UAAU;AAAA,QACzB,WAAW,EAAE,IAAI,UAAU;AAAA,QAC3B,OAAO,EAAE,IAAI,UAAU;AAAA,QACvB,WAAW,EAAE,IAAI,UAAU;AAAA,QAC3B,eAAe,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,QAC3C,WAAW,EAAE,IAAI,UAAU;AAAA,MAC7B;AAAA,IACF;AAEO,IAAM,SAAgC;AAAA,MAC3C,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,WAAW;AAAA,IACb;AAEO,IAAM,aAAa,OAAO,KAAK,MAAM;AAAA;AAAA;;;AClJ5C,SAAS,oBAA8B;AACrC,MAAI,qBAAqB,MAAM;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,QAAQ,IAAI,QAAQ;AACjC,QAAM,cAAc,QAAQ,IAAI,gBAAgB;AAChD,QAAM,cAAc,QAAQ,IAAI,aAAa;AAG7C,MAAI,gBAAgB,OAAO,YAAY,YAAY,MAAM,QAAQ;AAC/D,uBAAmB;AACnB,WAAO;AAAA,EACT;AAGA,QAAM,oBAAoB,CAAC,aAAa,WAAW,aAAa,SAAS,SAAS,OAAO;AAEzF,MAAI,kBAAkB,KAAK,CAAC,MAAM,YAAY,SAAS,CAAC,CAAC,GAAG;AAC1D,uBAAmB;AACnB,WAAO;AAAA,EACT;AAGA,MAAI,KAAK,SAAS,UAAU,KAAK,KAAK,SAAS,WAAW,GAAG;AAC3D,uBAAmB;AACnB,WAAO;AAAA,EACT;AAEA,qBAAmB;AACnB,SAAO;AACT;AAEO,SAAS,QAAQ,KAAc,OAAc,MAAwB;AAE1E,MAAI,MAAM,SAAS,MAAM,MAAM,GAAG,GAAG;AACnC,WAAO,MAAM,MAAM,GAAG,KAAK;AAAA,EAC7B;AAGA,QAAM,gBAAgB,SAAS,SAAS,kBAAkB,IAAI;AAE9D,UAAQ,eAAe;AAAA,IACrB,KAAK;AACH,aAAO,UAAU,GAAG,KAAK;AAAA,IAC3B,KAAK;AACH,aAAO,aAAa,GAAG,KAAK;AAAA,IAC9B,KAAK;AACH,aAAO,WAAW,GAAG,KAAK;AAAA,IAC5B;AACE,aAAO,aAAa,GAAG,KAAK;AAAA,EAChC;AACF;AA5GA,IAeM,WAaA,cAaA,YAaF;AAtDJ;AAAA;AAAA;AAAA;AAeA,IAAM,YAAqC;AAAA,MACzC,OAAO;AAAA,MACP,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,MACV,OAAO;AAAA,MACP,WAAW;AAAA,MACX,SAAS;AAAA,MACT,OAAO;AAAA,MACP,WAAW;AAAA,IACb;AAEA,IAAM,eAAwC;AAAA,MAC5C,OAAO;AAAA,MACP,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,MACV,OAAO;AAAA,MACP,WAAW;AAAA,MACX,SAAS;AAAA,MACT,OAAO;AAAA,MACP,WAAW;AAAA,IACb;AAEA,IAAM,aAAsC;AAAA,MAC1C,OAAO;AAAA,MACP,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,MACV,OAAO;AAAA,MACP,WAAW;AAAA,MACX,SAAS;AAAA,MACT,OAAO;AAAA,MACP,WAAW;AAAA,IACb;AAEA,IAAI,mBAAoC;AAAA;AAAA;;;ACtDxC,OAAO,WAAW;AAWX,SAAS,WAAW,MAAc,OAA4B;AACnE,MAAI,CAAC,MAAO,QAAO;AAEnB,MAAI,SAAS;AAEb,MAAI,MAAM,IAAI;AACZ,aAAS,OAAO,IAAI,MAAM,EAAE;AAAA,EAC9B;AACA,MAAI,MAAM,IAAI;AACZ,aAAS,OAAO,MAAM,MAAM,EAAE;AAAA,EAChC;AACA,MAAI,MAAM,MAAM;AACd,aAAS,OAAO;AAAA,EAClB;AACA,MAAI,MAAM,KAAK;AACb,aAAS,OAAO;AAAA,EAClB;AACA,MAAI,MAAM,QAAQ;AAChB,aAAS,OAAO;AAAA,EAClB;AACA,MAAI,MAAM,WAAW;AACnB,aAAS,OAAO;AAAA,EAClB;AAEA,SAAO,OAAO,IAAI;AACpB;AApCA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,SAAS,aAAa,KAAqB;AAChD,MAAI,OAAO,KAAS;AAClB,WAAO,IAAI,MAAM,KAAS,QAAQ,CAAC,CAAC;AAAA,EACtC;AACA,MAAI,OAAO,KAAM;AACf,WAAO,IAAI,MAAM,KAAM,QAAQ,CAAC,CAAC;AAAA,EACnC;AACA,SAAO,IAAI,SAAS;AACtB;AAEO,SAAS,eAAe,IAAoB;AACjD,QAAM,UAAU,KAAK,MAAM,KAAK,GAAI;AAEpC,MAAI,UAAU,IAAI;AAChB,WAAO,GAAG,OAAO;AAAA,EACnB;AAEA,QAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AACvC,MAAI,UAAU,IAAI;AAChB,UAAM,mBAAmB,UAAU;AACnC,WAAO,mBAAmB,IAAI,GAAG,OAAO,IAAI,gBAAgB,MAAM,GAAG,OAAO;AAAA,EAC9E;AAEA,QAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AACrC,QAAM,mBAAmB,UAAU;AACnC,SAAO,mBAAmB,IAAI,GAAG,KAAK,IAAI,gBAAgB,MAAM,GAAG,KAAK;AAC1E;AAEO,SAAS,WAAW,KAAqB;AAC9C,MAAI,MAAM,MAAM;AACd,WAAO,IAAI,QAAQ,CAAC;AAAA,EACtB;AACA,MAAI,MAAM,GAAG;AACX,WAAO,IAAI,QAAQ,CAAC;AAAA,EACtB;AACA,SAAO,IAAI,QAAQ,CAAC;AACtB;AApCA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACMA,OAAOA,WAAU;AAgCV,SAAS,aACd,QACA,OACA,OACA,QACc;AACd,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,YAAY,OAAO,OAAO,MAAM;AAAA,IACzC,KAAK;AACH,aAAO,cAAc,OAAO,OAAO,MAAM;AAAA,IAC3C,KAAK;AACH,aAAO,aAAa,OAAO,OAAO,MAAM;AAAA,IAC1C,KAAK;AACH,aAAO,iBAAiB,OAAO,OAAO,MAAM;AAAA,IAC9C,KAAK;AACH,aAAO,qBAAqB,OAAO,OAAO,MAAM;AAAA,IAClD,KAAK;AACH,aAAO,YAAY,OAAO,OAAO,MAAM;AAAA,IACzC,KAAK;AACH,aAAO,gBAAgB,OAAO,OAAO,MAAM;AAAA,IAC7C,KAAK;AACH,aAAO,cAAc,OAAO,OAAO,MAAM;AAAA,IAC3C,KAAK;AACH,aAAO,YAAY,OAAO,OAAO,MAAM;AAAA,IACzC,KAAK;AACH,aAAO,gBAAgB,OAAO,OAAO,MAAM;AAAA,IAC7C;AACE,aAAO,EAAE,SAAS,IAAI,SAAS,MAAM;AAAA,EACzC;AACF;AAEA,SAAS,YAAY,OAAoB,OAAc,QAAkC;AACvF,QAAM,cAAc,MAAM,OAAO;AACjC,MAAI,CAAC,aAAa;AAChB,WAAO,EAAE,SAAS,IAAI,SAAS,MAAM;AAAA,EACvC;AAEA,QAAM,OAAO,QAAQ,SAAS,OAAO,OAAO,KAAK;AACjD,QAAM,OAAO,OAAO,GAAG,IAAI,IAAI,WAAW,KAAK;AAC/C,QAAM,UAAU,WAAW,MAAM,MAAM,OAAO,KAAK;AAEnD,SAAO,EAAE,SAAS,SAAS,KAAK;AAClC;AAEA,SAAS,cAAc,OAAoB,OAAc,QAAkC;AACzF,QAAM,aAAa,MAAM,gBAAgB;AACzC,MAAI,eAAe,QAAW;AAC5B,WAAO,EAAE,SAAS,IAAI,SAAS,MAAM;AAAA,EACvC;AAEA,QAAM,OAAO,QAAQ,WAAW,OAAO,OAAO,KAAK;AACnD,QAAM,iBAAiB,KAAK,MAAM,UAAU;AAC5C,QAAM,cAAc,kBAAkB,YAAY,KAAK;AACvD,QAAM,QAAQ,GAAG,cAAc;AAC/B,QAAM,OAAO,OAAO,GAAG,IAAI,IAAI,WAAW,IAAI,KAAK,KAAK,GAAG,WAAW,IAAI,KAAK;AAG/E,MAAI,WAA0D;AAC9D,MAAI,cAAc,IAAI;AACpB,eAAW;AAAA,EACb,WAAW,cAAc,IAAI;AAC3B,eAAW;AAAA,EACb;AAEA,QAAM,QAAQ,MAAM,OAAO,QAAQ,KAAK,MAAM,OAAO;AACrD,QAAM,UAAU,WAAW,MAAM,KAAK;AAEtC,SAAO,EAAE,SAAS,SAAS,KAAK;AAClC;AAEA,SAAS,kBAAkB,YAAoB,OAAsB;AACnE,QAAM,YAAY;AAClB,QAAM,aAAa,KAAK,MAAO,aAAa,MAAO,SAAS;AAC5D,QAAM,YAAY,YAAY;AAG9B,QAAM,aAAa;AACnB,QAAM,YAAY;AAGlB,MAAI,cAAc,MAAM,OAAO;AAC/B,MAAI,cAAc,IAAI;AACpB,kBAAc,MAAM,OAAO,mBAAmB,MAAM,OAAO;AAAA,EAC7D,WAAW,cAAc,IAAI;AAC3B,kBAAc,MAAM,OAAO,eAAe,MAAM,OAAO;AAAA,EACzD;AAEA,QAAM,SAAS,WAAW,WAAW,OAAO,UAAU,GAAG,WAAW;AACpE,QAAM,QAAQ,WAAW,UAAU,OAAO,SAAS,GAAG,EAAE,IAAI,WAAW,KAAK,KAAK,CAAC;AAElF,SAAO,GAAG,MAAM,GAAG,KAAK;AAC1B;AAEA,SAAS,aAAa,OAAoB,OAAc,QAAkC;AACxF,QAAM,cAAc,MAAM,gBAAgB;AAC1C,QAAM,eAAe,MAAM,gBAAgB;AAE3C,MAAI,gBAAgB,UAAa,iBAAiB,QAAW;AAC3D,WAAO,EAAE,SAAS,IAAI,SAAS,MAAM;AAAA,EACvC;AAEA,QAAM,OAAO,QAAQ,UAAU,OAAO,OAAO,KAAK;AAClD,QAAM,QAAQ,aAAa,eAAe,CAAC;AAC3C,QAAM,SAAS,aAAa,gBAAgB,CAAC;AAC7C,QAAM,OAAO,OAAO,GAAG,IAAI,UAAK,KAAK,UAAK,MAAM,KAAK,SAAI,KAAK,UAAK,MAAM;AACzE,QAAM,UAAU,WAAW,MAAM,MAAM,OAAO,MAAM;AAEpD,SAAO,EAAE,SAAS,SAAS,KAAK;AAClC;AAEA,SAAS,iBAAiB,OAAoB,OAAc,QAAkC;AAC5F,QAAM,UAAU,MAAM,MAAM;AAC5B,MAAI,YAAY,QAAW;AACzB,WAAO,EAAE,SAAS,IAAI,SAAS,MAAM;AAAA,EACvC;AAEA,QAAM,OAAO,QAAQ,QAAQ,OAAO,OAAO,KAAK;AAChD,QAAM,QAAQ,WAAW,OAAO;AAChC,QAAM,OAAO,OAAO,GAAG,IAAI,GAAG,KAAK,KAAK,IAAI,KAAK;AACjD,QAAM,UAAU,WAAW,MAAM,MAAM,OAAO,IAAI;AAElD,SAAO,EAAE,SAAS,SAAS,KAAK;AAClC;AAEA,SAAS,qBAAqB,OAAoB,OAAc,QAAkC;AAChG,QAAM,aAAa,MAAM,MAAM;AAC/B,MAAI,eAAe,QAAW;AAC5B,WAAO,EAAE,SAAS,IAAI,SAAS,MAAM;AAAA,EACvC;AAEA,QAAM,OAAO,QAAQ,YAAY,OAAO,OAAO,KAAK;AACpD,QAAM,QAAQ,eAAe,UAAU;AACvC,QAAM,OAAO,OAAO,GAAG,IAAI,IAAI,KAAK,KAAK;AACzC,QAAM,UAAU,WAAW,MAAM,MAAM,OAAO,QAAQ;AAEtD,SAAO,EAAE,SAAS,SAAS,KAAK;AAClC;AAEA,SAAS,YAAY,OAAoB,OAAc,QAAkC;AACvF,QAAM,QAAQ,MAAM,MAAM;AAC1B,QAAM,UAAU,MAAM,MAAM;AAE5B,MAAI,UAAU,UAAa,YAAY,QAAW;AAChD,WAAO,EAAE,SAAS,IAAI,SAAS,MAAM;AAAA,EACvC;AAEA,QAAM,OAAO,QAAQ,SAAS,OAAO,OAAO,KAAK;AAEjD,QAAM,WAAW,WAAW,IAAI,SAAS,CAAC,IAAI,MAAM,OAAO,cAAc,MAAM,OAAO,KAAK;AAC3F,QAAM,aAAa,WAAW,IAAI,WAAW,CAAC,IAAI,MAAM,OAAO,gBAAgB,MAAM,OAAO,KAAK;AAEjG,QAAM,OAAO,OAAO,GAAG,IAAI,IAAI,QAAQ,IAAI,UAAU,KAAK,GAAG,QAAQ,IAAI,UAAU;AAEnF,SAAO,EAAE,SAAS,MAAM,SAAS,KAAK;AACxC;AAEA,SAAS,gBAAgB,OAAoB,OAAc,QAAkC;AAC3F,QAAM,MAAM,MAAM,WAAW,eAAe,MAAM;AAClD,MAAI,CAAC,KAAK;AACR,WAAO,EAAE,SAAS,IAAI,SAAS,MAAM;AAAA,EACvC;AAEA,QAAM,OAAO,QAAQ,aAAa,OAAO,OAAO,KAAK;AACrD,QAAM,UAAUA,MAAK,SAAS,GAAG;AACjC,QAAM,OAAO,OAAO,GAAG,IAAI,IAAI,OAAO,KAAK;AAC3C,QAAM,UAAU,WAAW,MAAM,MAAM,OAAO,SAAS;AAEvD,SAAO,EAAE,SAAS,SAAS,KAAK;AAClC;AAEA,SAAS,cAAc,OAAoB,OAAc,QAAkC;AACzF,QAAM,UAAU,MAAM;AACtB,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,SAAS,IAAI,SAAS,MAAM;AAAA,EACvC;AAEA,QAAM,OAAO,QAAQ,WAAW,OAAO,OAAO,KAAK;AACnD,QAAM,OAAO,OAAO,GAAG,IAAI,GAAG,OAAO,KAAK,IAAI,OAAO;AACrD,QAAM,UAAU,WAAW,MAAM,MAAM,OAAO,OAAO;AAErD,SAAO,EAAE,SAAS,SAAS,KAAK;AAClC;AAEA,SAAS,YAAY,OAAoB,OAAc,QAAkC;AACvF,QAAM,eAAe,MAAM;AAC3B,MAAI,CAAC,cAAc;AACjB,WAAO,EAAE,SAAS,IAAI,SAAS,MAAM;AAAA,EACvC;AAEA,QAAM,EAAE,eAAe,gBAAgB,kBAAkB,KAAK,IAAI;AAGlE,MAAI,kBAAkB,UAAa,qBAAqB,QAAW;AACjE,WAAO,EAAE,SAAS,IAAI,SAAS,MAAM;AAAA,EACvC;AAEA,QAAM,OAAO,QAAQ,SAAS,OAAO,OAAO,KAAK;AAGjD,MAAI,UAAU;AACd,MAAI,YAAY,UAAa,kBAAkB,UAAa,mBAAmB,UAAa,iBAAiB,GAAG;AAC9G,cAAW,gBAAgB,iBAAkB;AAAA,EAC/C;AAGA,MAAI,OAAO;AACX,MAAI,MAAM;AACR,YAAQ,GAAG,IAAI;AAAA,EACjB;AAGA,MAAI,YAAY,QAAW;AACzB,UAAM,cAAc,eAAe,SAAS,KAAK;AACjD,YAAQ,cAAc;AAAA,EACxB;AAGA,MAAI,kBAAkB,UAAa,mBAAmB,QAAW;AAC/D,YAAQ,GAAG,aAAa,IAAI,cAAc;AAAA,EAC5C,WAAW,YAAY,QAAW;AAChC,YAAQ,GAAG,KAAK,MAAM,OAAO,CAAC;AAAA,EAChC;AAGA,MAAI,MAAM;AACR,YAAQ,KAAK,IAAI;AAAA,EACnB;AAGA,MAAI,WAAoD;AACxD,MAAI,YAAY,QAAW;AACzB,QAAI,WAAW,IAAI;AACjB,iBAAW;AAAA,IACb,WAAW,WAAW,IAAI;AACxB,iBAAW;AAAA,IACb;AAAA,EACF;AAEA,QAAM,QAAQ,MAAM,OAAO,QAAQ,KAAK,MAAM,OAAO;AACrD,QAAM,UAAU,WAAW,KAAK,KAAK,GAAG,KAAK;AAE7C,SAAO,EAAE,SAAS,SAAS,KAAK;AAClC;AAEA,SAAS,eAAe,YAAoB,OAAsB;AAChE,QAAM,YAAY;AAClB,QAAM,aAAa,KAAK,MAAO,aAAa,MAAO,SAAS;AAC5D,QAAM,YAAY,YAAY;AAE9B,QAAM,aAAa;AACnB,QAAM,YAAY;AAGlB,MAAI,cAAc,MAAM,OAAO;AAC/B,MAAI,cAAc,IAAI;AACpB,kBAAc,MAAM,OAAO,iBAAiB,MAAM,OAAO;AAAA,EAC3D,WAAW,cAAc,IAAI;AAC3B,kBAAc,MAAM,OAAO,aAAa,MAAM,OAAO;AAAA,EACvD;AAEA,QAAM,SAAS,WAAW,WAAW,OAAO,UAAU,GAAG,WAAW;AACpE,QAAM,QAAQ,WAAW,UAAU,OAAO,SAAS,GAAG,EAAE,IAAI,WAAW,KAAK,KAAK,CAAC;AAElF,SAAO,GAAG,MAAM,GAAG,KAAK;AAC1B;AAEA,SAAS,gBAAgB,OAAoB,OAAc,QAAkC;AAC3F,QAAM,eAAe,MAAM;AAC3B,MAAI,CAAC,cAAc;AACjB,WAAO,EAAE,SAAS,IAAI,SAAS,MAAM;AAAA,EACvC;AAEA,QAAM,EAAE,UAAU,iBAAiB,IAAI;AAGvC,MAAI,aAAa,UAAa,qBAAqB,QAAW;AAC5D,WAAO,EAAE,SAAS,IAAI,SAAS,MAAM;AAAA,EACvC;AAEA,QAAM,OAAO,QAAQ,aAAa,OAAO,OAAO,KAAK;AAErD,MAAI,UAAU;AACd,MAAI,qBAAqB,QAAW;AAClC,cAAU,oBAAoB,gBAAgB;AAAA,EAChD,WAAW,UAAU;AAEnB,QAAI;AACF,YAAM,YAAY,IAAI,KAAK,QAAQ;AACnC,YAAM,MAAM,oBAAI,KAAK;AACrB,YAAM,cAAc,KAAK,IAAI,GAAG,KAAK,OAAO,UAAU,QAAQ,IAAI,IAAI,QAAQ,KAAK,GAAI,CAAC;AACxF,gBAAU,oBAAoB,WAAW;AAAA,IAC3C,QAAQ;AAEN,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,OAAO,OAAO,GAAG,IAAI,IAAI,OAAO,KAAK;AAC3C,QAAM,UAAU,WAAW,MAAM,MAAM,OAAO,SAAS;AAEvD,SAAO,EAAE,SAAS,SAAS,KAAK;AAClC;AAEA,SAAS,oBAAoB,SAAyB;AACpD,MAAI,WAAW,GAAG;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,KAAK,MAAM,UAAU,IAAI;AACvC,QAAM,UAAU,KAAK,MAAO,UAAU,OAAQ,EAAE;AAEhD,MAAI,QAAQ,GAAG;AACb,WAAO,UAAU,IAAI,GAAG,KAAK,IAAI,OAAO,MAAM,GAAG,KAAK;AAAA,EACxD;AAEA,MAAI,UAAU,GAAG;AACf,UAAM,OAAO,UAAU;AACvB,WAAO,OAAO,IAAI,GAAG,OAAO,IAAI,IAAI,MAAM,GAAG,OAAO;AAAA,EACtD;AAEA,SAAO,GAAG,OAAO;AACnB;AAxWA,IAoBa;AApBb;AAAA;AAAA;AAAA;AAGA;AACA;AACA;AAeO,IAAM,mBAAiC;AAAA,MAC5C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA;;;ACzBO,SAAS,iBAAiB,OAAoB,QAA4B;AAC/E,QAAM,QAAQ,OAAO,eAAe,OAAO,OAAO,KAAK,KAAK,OAAO;AACnE,QAAM,kBAA4B,CAAC;AAEnC,aAAW,UAAU,OAAO,SAAS;AACnC,UAAM,SAAS,aAAa,QAAQ,OAAO,OAAO,MAAM;AACxD,QAAI,OAAO,WAAW,OAAO,SAAS;AACpC,sBAAgB,KAAK,OAAO,OAAO;AAAA,IACrC;AAAA,EACF;AAEA,MAAI,gBAAgB,WAAW,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,WAAW,OAAO,WAAW,MAAM,OAAO,SAAS;AACrE,QAAM,aAAa,gBAAgB,KAAK,SAAS;AAGjD,QAAM,UAAU,IAAI,OAAO,OAAO,OAAO;AAGzC,SAAO,UAAU,OAAO,GAAG,UAAU,GAAG,OAAO;AACjD;AA7BA,IAgCa;AAhCb;AAAA;AAAA;AAAA;AAEA;AACA;AACA;AA4BO,IAAM,oBAAiC;AAAA,MAC5C,iBAAiB;AAAA,MACjB,YAAY;AAAA,MACZ,OAAO;AAAA,QACL,IAAI;AAAA,QACJ,cAAc;AAAA,MAChB;AAAA,MACA,WAAW;AAAA,QACT,aAAa;AAAA,QACb,aAAa;AAAA,MACf;AAAA,MACA,SAAS;AAAA,MACT,MAAM;AAAA,QACJ,gBAAgB;AAAA,QAChB,mBAAmB;AAAA,QACnB,uBAAuB;AAAA,QACvB,mBAAmB;AAAA,QACnB,qBAAqB;AAAA,MACvB;AAAA,MACA,gBAAgB;AAAA,QACd,oBAAoB;AAAA,QACpB,qBAAqB;AAAA,QACrB,qBAAqB;AAAA,QACrB,iBAAiB;AAAA,QACjB,sBAAsB;AAAA,QACtB,eAAe;AAAA,UACb,cAAc;AAAA,UACd,eAAe;AAAA,UACf,6BAA6B;AAAA,UAC7B,yBAAyB;AAAA,QAC3B;AAAA,MACF;AAAA,MACA,eAAe;AAAA,QACb,eAAe;AAAA,QACf,gBAAgB;AAAA,QAChB,kBAAkB;AAAA,QAClB,kBAAkB;AAAA,QAClB,MAAM;AAAA,MACR;AAAA,IACF;AAAA;AAAA;;;ACvEA,SAAS,cAAc,eAAe,cAAAC,aAAY,WAAW,oBAAoB;AACjF,SAAS,SAAS,YAAY;AAC9B,SAAS,eAAe;AAWjB,SAAS,wBAAgC;AAC9C,QAAM,YAAY,QAAQ,IAAI,qBAAqB,KAAK,QAAQ,GAAG,SAAS;AAC5E,SAAO,KAAK,WAAW,eAAe;AACxC;AAEO,SAAS,oBAA2C;AACzD,QAAM,eAAe,sBAAsB;AAE3C,MAAI,CAACA,YAAW,YAAY,GAAG;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,UAAU,aAAa,cAAc,MAAM;AACjD,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,uBAAsC;AACpD,QAAM,eAAe,sBAAsB;AAE3C,MAAI,CAACA,YAAW,YAAY,GAAG;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,eAAe;AAClC,MAAI;AACF,iBAAa,cAAc,UAAU;AACrC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,wBAAwB,UAAkB,uBAAgC;AACxF,QAAM,eAAe,sBAAsB;AAC3C,QAAM,MAAM,QAAQ,YAAY;AAGhC,MAAI,CAACA,YAAW,GAAG,GAAG;AACpB,cAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AAGA,MAAI,WAA2B,CAAC;AAChC,MAAIA,YAAW,YAAY,GAAG;AAC5B,QAAI;AACF,YAAM,UAAU,aAAa,cAAc,MAAM;AACjD,iBAAW,KAAK,MAAM,OAAO;AAAA,IAC/B,QAAQ;AAEN,iBAAW,CAAC;AAAA,IACd;AAAA,EACF;AAGA,WAAS,aAAa;AAAA,IACpB,MAAM;AAAA,IACN;AAAA,EACF;AAGA,MAAI;AACF,kBAAc,cAAc,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAC7D,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,8BAAuC;AACrD,QAAM,eAAe,sBAAsB;AAE3C,MAAI,CAACA,YAAW,YAAY,GAAG;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,UAAU,aAAa,cAAc,MAAM;AACjD,UAAM,WAA2B,KAAK,MAAM,OAAO;AAGnD,WAAO,SAAS;AAGhB,kBAAc,cAAc,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAC7D,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,sBAA+B;AAC7C,QAAM,WAAW,kBAAkB;AACnC,MAAI,CAAC,UAAU,YAAY;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,WAAW,WAAW;AAC/C,SAAO,QAAQ,SAAS,MAAM,KAAK,QAAQ,SAAS,iBAAiB;AACvE;AAEO,SAAS,0BAAyC;AACvD,QAAM,WAAW,kBAAkB;AACnC,SAAO,UAAU,YAAY,WAAW;AAC1C;AAxHA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA,SAAgB,gBAAgB;AAChC,SAAS,QAAQ,KAAK,MAAM,QAAQ,gBAAgB;AACpD,OAAO,iBAAiB;AAUxB,SAAS,iBAAAC,gBAAe,aAAAC,YAAW,cAAAC,mBAAkB;AACrD,SAAS,WAAAC,gBAAe;AAyDd,SAyME,UAzMF,KAGA,YAHA;AAhDV,SAAS,IAAI,EAAE,eAAe,MAAM,GAAa;AAC/C,QAAM,EAAE,KAAK,IAAI,OAAO;AACxB,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAiB,MAAM;AACnD,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAqB,aAAa;AAC9D,QAAM,CAAC,SAAS,UAAU,IAAI,SAAiB,EAAE;AAEjD,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,UAAI,WAAW,QAAQ;AACrB,aAAK;AAAA,MACP,OAAO;AACL,kBAAU,MAAM;AAAA,MAClB;AAAA,IACF;AACA,QAAI,UAAU,OAAO,WAAW,QAAQ;AACtC,WAAK;AAAA,IACP;AAAA,EACF,CAAC;AAED,QAAM,aAAa,MAAM;AACvB,UAAM,aAAa,cAAc,KAAK;AACtC,QAAI;AACF,YAAM,MAAMA,SAAQ,UAAU;AAC9B,UAAI,CAACD,YAAW,GAAG,GAAG;AACpB,QAAAD,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,MACpC;AACA,MAAAD,eAAc,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AACzD,iBAAW,sBAAsB;AACjC,iBAAW,MAAM,WAAW,EAAE,GAAG,GAAI;AAAA,IACvC,SAAS,KAAK;AACZ,iBAAW,iBAAiB,GAAG,EAAE;AAAA,IACnC;AAAA,EACF;AAEA,QAAM,aAAa,MAAM;AACvB,UAAM,QAAQ;AAAA,MACZ,EAAE,OAAO,0BAAmB,OAAO,SAAS;AAAA,MAC5C,EAAE,OAAO,+BAAwB,OAAO,UAAU;AAAA,MAClD,EAAE,OAAO,kCAAwB,OAAO,WAAW;AAAA,MACnD,EAAE,OAAO,iCAAqB,OAAO,UAAU;AAAA,MAC/C,EAAE,OAAO,oCAA6B,OAAO,UAAU;AAAA,MACvD,EAAE,OAAO,gCAAyB,OAAO,OAAO;AAAA,MAChD,EAAE,OAAO,eAAU,OAAO,OAAO;AAAA,IACnC;AAEA,WACE,qBAAC,OAAI,eAAc,UACjB;AAAA,2BAAC,OAAI,cAAc,GACjB;AAAA,4BAAC,QAAK,MAAI,MAAC,OAAM,QAAO,gCAExB;AAAA,QACA,qBAAC,QAAK,OAAM,QAAO;AAAA;AAAA,UAAG;AAAA,UAAM;AAAA,WAAC;AAAA,SAC/B;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,UAAU,CAAC,SAAS;AAClB,gBAAI,KAAK,UAAU,QAAQ;AACzB,mBAAK;AAAA,YACP,WAAW,KAAK,UAAU,QAAQ;AAChC,yBAAW;AAAA,YACb,OAAO;AACL,wBAAU,KAAK,KAAe;AAAA,YAChC;AAAA,UACF;AAAA;AAAA,MACF;AAAA,MACC,WACC,oBAAC,OAAI,WAAW,GACd,8BAAC,QAAK,OAAM,SAAS,mBAAQ,GAC/B;AAAA,MAEF,oBAAC,OAAI,WAAW,GACd,8BAAC,QAAK,OAAM,QAAO,oCAAsB,GAC3C;AAAA,OACF;AAAA,EAEJ;AAEA,QAAM,eAAe,MAAM;AACzB,UAAM,QAAQ,WAAW,IAAI,CAAC,UAAU;AAAA,MACtC,OAAO,GAAG,IAAI,GAAG,OAAO,UAAU,OAAO,eAAe,EAAE;AAAA,MAC1D,OAAO;AAAA,IACT,EAAE;AAEF,WACE,qBAAC,OAAI,eAAc,UACjB;AAAA,0BAAC,OAAI,cAAc,GACjB,8BAAC,QAAK,MAAI,MAAC,OAAM,QAAO,oCAExB,GACF;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,UAAU,CAAC,SAAS;AAClB,sBAAU,EAAE,GAAG,QAAQ,OAAO,KAAK,MAAM,CAAC;AAC1C,sBAAU,MAAM;AAAA,UAClB;AAAA;AAAA,MACF;AAAA,MACA,qBAAC,OAAI,WAAW,GAAG,eAAc,UAC/B;AAAA,4BAAC,QAAK,OAAM,QAAO,sBAAQ;AAAA,QAC3B,oBAAC,QAAM,2BAAiB,mBAAmB,MAAM,GAAE;AAAA,SACrD;AAAA,MACA,oBAAC,OAAI,WAAW,GACd,8BAAC,QAAK,OAAM,QAAO,kCAAoB,GACzC;AAAA,OACF;AAAA,EAEJ;AAEA,QAAM,gBAAgB,MAAM;AAC1B,UAAM,QAAQ,iBAAiB,IAAI,CAAC,YAAY;AAAA,MAC9C,OAAO,GAAG,OAAO,QAAQ,SAAS,MAAM,IAAI,QAAQ,KAAK,IAAI,MAAM;AAAA,MACnE,OAAO;AAAA,IACT,EAAE;AAEF,WACE,qBAAC,OAAI,eAAc,UACjB;AAAA,0BAAC,OAAI,cAAc,GACjB,8BAAC,QAAK,MAAI,MAAC,OAAM,QAAO,yCAExB,GACF;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,UAAU,CAAC,SAAS;AAClB,kBAAM,SAAS,KAAK;AACpB,kBAAM,aAAa,OAAO,QAAQ,SAAS,MAAM,IAC7C,OAAO,QAAQ,OAAO,CAAC,MAAM,MAAM,MAAM,IACzC,CAAC,GAAG,OAAO,SAAS,MAAM;AAC9B,sBAAU,EAAE,GAAG,QAAQ,SAAS,WAAW,CAAC;AAAA,UAC9C;AAAA;AAAA,MACF;AAAA,MACA,qBAAC,OAAI,WAAW,GAAG,eAAc,UAC/B;AAAA,6BAAC,QAAK,OAAM,QAAO;AAAA;AAAA,UAAgB,OAAO,QAAQ,KAAK,IAAI;AAAA,WAAE;AAAA,QAC7D,oBAAC,QAAM,2BAAiB,mBAAmB,MAAM,GAAE;AAAA,SACrD;AAAA,MACA,oBAAC,OAAI,WAAW,GACd,8BAAC,QAAK,OAAM,QAAO,kCAAoB,GACzC;AAAA,OACF;AAAA,EAEJ;AAEA,QAAM,iBAAiB,MAAM;AAC3B,UAAM,cAAc;AAAA,MAClB,EAAE,OAAO,cAAc,OAAO,UAAU,SAAS,eAAe,EAAE,IAAI,OAAO,YAAY;AAAA,MACzF,EAAE,OAAO,cAAc,OAAO,UAAU,SAAS,eAAe,EAAE,IAAI,OAAO,YAAY;AAAA,MACzF;AAAA,QACE,OAAO,iBAAiB,OAAO,UAAU,YAAY,eAAe,EAAE;AAAA,QACtE,OAAO;AAAA,MACT;AAAA,MACA,EAAE,OAAO,eAAe,OAAO,UAAU,UAAU,eAAe,EAAE,IAAI,OAAO,aAAa;AAAA,IAC9F;AAEA,UAAM,mBAAmB;AAAA,MACvB;AAAA,QACE,OAAO,wBAAmB,OAAO,cAAc,aAAQ,eAAe,EAAE;AAAA,QACxE,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,OAAO,mBAAmB,OAAO,cAAc,QAAQ,eAAe,EAAE;AAAA,QACxE,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,OAAO,sBAAmB,OAAO,cAAc,WAAQ,eAAe,EAAE;AAAA,QACxE,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,OAAO,kBAAkB,OAAO,cAAc,OAAO,eAAe,EAAE;AAAA,QACtE,OAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,QAAQ,CAAC,GAAG,aAAa,GAAG,gBAAgB;AAElD,WACE,qBAAC,OAAI,eAAc,UACjB;AAAA,0BAAC,OAAI,cAAc,GACjB,8BAAC,QAAK,MAAI,MAAC,OAAM,QAAO,4CAExB,GACF;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,UAAU,CAAC,SAAS;AAClB,gBAAI,KAAK,MAAM,WAAW,OAAO,GAAG;AAClC,oBAAM,WAAW,KAAK,MAAM,QAAQ,SAAS,EAAE;AAK/C,wBAAU,EAAE,GAAG,QAAQ,OAAO,SAAS,CAAC;AAAA,YAC1C,WAAW,KAAK,MAAM,WAAW,MAAM,GAAG;AACxC,oBAAM,MAAM,KAAK,MAAM,QAAQ,QAAQ,EAAE;AACzC,wBAAU,EAAE,GAAG,QAAQ,WAAW,IAAI,CAAC;AAAA,YACzC;AAAA,UACF;AAAA;AAAA,MACF;AAAA,MACA,oBAAC,OAAI,WAAW,GACd,8BAAC,QAAM,2BAAiB,mBAAmB,MAAM,GAAE,GACrD;AAAA,MACA,oBAAC,OAAI,WAAW,GACd,8BAAC,QAAK,OAAM,QAAO,kCAAoB,GACzC;AAAA,OACF;AAAA,EAEJ;AAEA,QAAM,gBAAgB,MAAM;AAC1B,WACE,qBAAC,OAAI,eAAc,UACjB;AAAA,0BAAC,OAAI,cAAc,GACjB,8BAAC,QAAK,MAAI,MAAC,OAAM,QAAO,2CAExB,GACF;AAAA,MACA,qBAAC,OAAI,cAAc,GAAG,eAAc,UAClC;AAAA,6BAAC,QAAK,OAAM,QAAO;AAAA;AAAA,UAAQ,OAAO;AAAA,WAAM;AAAA,QACxC,qBAAC,QAAK,OAAM,QAAO;AAAA;AAAA,UAAU,OAAO,QAAQ,KAAK,IAAI;AAAA,WAAE;AAAA,QACvD,qBAAC,QAAK,OAAM,QAAO;AAAA;AAAA,UAAQ,OAAO;AAAA,WAAM;AAAA,SAC1C;AAAA,MACA,oBAAC,OAAI,cAAc,GACjB,8BAAC,QAAK,MAAI,MAAC,qBAAO,GACpB;AAAA,MACA,oBAAC,QAAM,2BAAiB,mBAAmB,MAAM,GAAE;AAAA,MACnD,oBAAC,OAAI,WAAW,GACd,8BAAC,QAAK,OAAM,QAAO,kCAAoB,GACzC;AAAA,OACF;AAAA,EAEJ;AAEA,QAAM,gBAAgB,MAAM;AAC1B,UAAM,YAAY,oBAAoB;AACtC,UAAM,aAAa,wBAAwB;AAE3C,UAAM,QAAQ;AAAA,MACZ,EAAE,OAAO,YAAY,kCAA2B,oCAA6B,OAAO,UAAU;AAAA,MAC9F,EAAE,OAAO,sBAAY,OAAO,OAAO;AAAA,IACrC;AAEA,WACE,qBAAC,OAAI,eAAc,UACjB;AAAA,0BAAC,OAAI,cAAc,GACjB,8BAAC,QAAK,MAAI,MAAC,OAAM,QAAO,+CAExB,GACF;AAAA,MACA,oBAAC,OAAI,cAAc,GAAG,eAAc,UACjC,sBACC,iCACE;AAAA,4BAAC,QAAK,OAAM,SAAQ,+BAAiB;AAAA,QACrC,qBAAC,QAAK,OAAM,QAAO;AAAA;AAAA,UAAU;AAAA,WAAW;AAAA,SAC1C,IAEA,oBAAC,QAAK,OAAM,UAAS,mCAAqB,GAE9C;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,UAAU,CAAC,SAAS;AAClB,gBAAI,KAAK,UAAU,WAAW;AAC5B,oBAAM,UAAU,wBAAwB;AACxC,kBAAI,SAAS;AACX,2BAAW,0CAA0C;AAAA,cACvD,OAAO;AACL,2BAAW,yCAAyC;AAAA,cACtD;AACA,yBAAW,MAAM,WAAW,EAAE,GAAG,GAAI;AAAA,YACvC,OAAO;AACL,wBAAU,MAAM;AAAA,YAClB;AAAA,UACF;AAAA;AAAA,MACF;AAAA,MACC,WACC,oBAAC,OAAI,WAAW,GACd,8BAAC,QAAK,OAAO,QAAQ,SAAS,QAAQ,IAAI,QAAQ,SAAU,mBAAQ,GACtE;AAAA,MAEF,oBAAC,OAAI,WAAW,GACd,8BAAC,QAAK,OAAM,QAAO,kCAAoB,GACzC;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,qBAAC,OAAI,SAAS,GAAG,eAAc,UAC5B;AAAA,eAAW,UAAU,WAAW;AAAA,IAChC,WAAW,YAAY,aAAa;AAAA,IACpC,WAAW,aAAa,cAAc;AAAA,IACtC,WAAW,cAAc,eAAe;AAAA,IACxC,WAAW,aAAa,cAAc;AAAA,IACtC,WAAW,aAAa,cAAc;AAAA,KACzC;AAEJ;AAEA,eAAsB,UAAU,OAA2B;AACzD,QAAM,SAAS,MAAM,mBAAmB,KAAK;AAE7C,QAAM,EAAE,cAAc,IAAI,OAAO,oBAAC,OAAI,eAAe,QAAQ,OAAc,CAAE;AAC7E,QAAM,cAAc;AACtB;AApUA;AAAA;AAAA;AAAA;AAGA;AACA;AACA;AACA;AACA;AAAA;AAAA;;;ACPA;AACA;AADA,SAAS,eAAe;;;ACAxB;AAAA,SAAS,SAAS;AAGX,IAAM,oBAAoB,EAC9B,OAAO;AAAA,EACN,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,EACrC,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,EACrC,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,EACzB,OAAO,EACJ,OAAO;AAAA,IACN,IAAI,EAAE,OAAO,EAAE,SAAS;AAAA,IACxB,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EACpC,CAAC,EACA,SAAS;AAAA,EACZ,WAAW,EACR,OAAO;AAAA,IACN,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,IACjC,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACnC,CAAC,EACA,SAAS;AAAA,EACZ,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,cAAc,EACX,OAAO;AAAA,IACN,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,CAAC,EACA,SAAS;AAAA,EACZ,MAAM,EACH,OAAO;AAAA,IACN,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,IACpC,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,IACvC,uBAAuB,EAAE,OAAO,EAAE,SAAS;AAAA,IAC3C,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,IACvC,qBAAqB,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3C,CAAC,EACA,SAAS;AAAA,EACZ,gBAAgB,EACb,OAAO;AAAA,IACN,oBAAoB,EAAE,OAAO,EAAE,SAAS;AAAA,IACxC,qBAAqB,EAAE,OAAO,EAAE,SAAS;AAAA,IACzC,qBAAqB,EAAE,OAAO,EAAE,SAAS;AAAA,IACzC,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,IACrC,sBAAsB,EAAE,OAAO,EAAE,SAAS;AAAA,IAC1C,eAAe,EACZ,OAAO;AAAA,MACN,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,MAClC,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,MACnC,6BAA6B,EAAE,OAAO,EAAE,SAAS;AAAA,MACjD,yBAAyB,EAAE,OAAO,EAAE,SAAS;AAAA,IAC/C,CAAC,EACA,SAAS,EACT,SAAS;AAAA,EACd,CAAC,EACA,SAAS;AAAA;AAAA,EAEZ,eAAe,EACZ,OAAO;AAAA;AAAA,IAEN,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,IAEnC,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,IAEpC,kBAAkB,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,IAEtC,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,IAE9B,kBAAkB,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,IAEtC,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,CAAC,EACA,SAAS;AACd,CAAC,EACA,YAAY;AAIR,SAAS,iBAAiB,OAAmC;AAClE,MAAI;AACF,UAAM,UAAU,MAAM,KAAK;AAC3B,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AACA,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,UAAM,SAAS,kBAAkB,UAAU,MAAM;AAEjD,QAAI,OAAO,SAAS;AAClB,aAAO,OAAO;AAAA,IAChB;AAIA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,YAA6B;AACjD,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,QAAI,OAAO;AAEX,YAAQ,MAAM,YAAY,MAAM;AAEhC,YAAQ,MAAM,GAAG,YAAY,MAAM;AACjC,UAAI;AACJ,cAAQ,QAAQ,QAAQ,MAAM,KAAK,OAAO,MAAM;AAC9C,gBAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAED,YAAQ,MAAM,GAAG,OAAO,MAAM;AAC5B,cAAQ,IAAI;AAAA,IACd,CAAC;AAED,YAAQ,MAAM,GAAG,SAAS,MAAM;AAC9B,cAAQ,EAAE;AAAA,IACZ,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,oBAA6B;AAC3C,SAAO,QAAQ,MAAM,UAAU;AACjC;;;ADvHA;AACA;AACA;AAUA;AAFA,SAAS,iBAAAI,gBAAe,aAAAC,YAAW,cAAAC,mBAAkB;AACrD,SAAS,WAAAC,gBAAe;AAGxB,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,MAAM,EACX,YAAY,wDAAwD,EACpE,QAAQ,OAAO;AAElB,QACG,QAAQ,SAAS,EACjB,YAAY,2CAA2C,EACvD,OAAO,uBAAuB,yBAAyB,qBAAqB,EAC5E,OAAO,OAAO,YAAY;AACzB,UAAQ,IAAI,uCAAuC;AAGnD,MAAI,oBAAoB,GAAG;AACzB,UAAM,aAAa,wBAAwB;AAC3C,YAAQ,IAAI,qCAAqC,UAAU,EAAE;AAC7D,YAAQ,IAAI,+BAA+B;AAAA,EAC7C;AAGA,QAAM,aAAa,qBAAqB;AACxC,MAAI,YAAY;AACd,YAAQ,IAAI,qBAAqB,UAAU,EAAE;AAAA,EAC/C;AAGA,QAAM,UAAU,wBAAwB,QAAQ,OAAO;AACvD,MAAI,SAAS;AACX,YAAQ,IAAI,mBAAmB,sBAAsB,CAAC,EAAE;AACxD,YAAQ,IAAI,cAAc,QAAQ,OAAO,EAAE;AAC3C,YAAQ,IAAI,6CAA6C;AACzD,YAAQ,IAAI,sDAAsD;AAAA,EACpE,OAAO;AACL,YAAQ,MAAM,kDAAkD;AAChE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,WAAW,EACnB,YAAY,4CAA4C,EACxD,OAAO,YAAY;AAClB,UAAQ,IAAI,uCAAuC;AAEnD,MAAI,CAAC,oBAAoB,GAAG;AAC1B,YAAQ,IAAI,qDAAqD;AACjE;AAAA,EACF;AAGA,QAAM,aAAa,qBAAqB;AACxC,MAAI,YAAY;AACd,YAAQ,IAAI,qBAAqB,UAAU,EAAE;AAAA,EAC/C;AAEA,QAAM,UAAU,4BAA4B;AAC5C,MAAI,SAAS;AACX,YAAQ,IAAI,qDAAqD;AAAA,EACnE,OAAO;AACL,YAAQ,MAAM,oDAAoD;AAClE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,cAAc,EACtB,YAAY,6CAA6C,EACzD,OAAO,cAAc,uBAAuB,EAC5C,OAAO,OAAO,MAAM,YAAY;AAC/B,MAAI,QAAQ,QAAQ,CAAC,MAAM;AACzB,eAAW;AACX;AAAA,EACF;AACA,QAAM,YAAY,IAAI;AACxB,CAAC;AAEH,QACG,QAAQ,SAAS,EACjB,YAAY,gDAAgD,EAC5D,OAAO,YAAY;AAClB,QAAM,cAAc;AACtB,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,0BAA0B,EACtC,OAAO,gBAAgB,mCAAmC,EAC1D,OAAO,OAAO,YAAY;AACzB,QAAM,QAAQ,QAAQ,SAAS,WAAW;AAC1C,QAAM,WAAW,KAAK;AACxB,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,wBAAwB,EACpC,OAAO,gBAAgB,2BAA2B,EAClD,OAAO,eAAe,kCAAkC,EACxD,OAAO,OAAO,YAAY;AACzB,QAAM,QAAQ,QAAQ,SAAS,WAAW;AAC1C,QAAM,OAAO,KAAK;AACpB,CAAC;AAGH,QAAQ,OAAO,YAAY;AACzB,MAAI,kBAAkB,GAAG;AAEvB,UAAM,OAAO,OAAO;AAAA,EACtB,OAAO;AAEL,UAAM,YAAY,MAAM,UAAU;AAClC,UAAM,QAAQ,iBAAiB,SAAS;AAExC,QAAI,CAAC,OAAO;AAEV,cAAQ,IAAI,EAAE;AACd;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,WAAW;AAChC,UAAM,SAAS,iBAAiB,OAAO,MAAM;AAC7C,YAAQ,IAAI,MAAM;AAAA,EACpB;AACF,CAAC;AAED,eAAe,OAAO,OAA2B;AAC/C,QAAM,EAAE,WAAAC,WAAU,IAAI,MAAM;AAC5B,QAAMA,WAAU,KAAK;AACvB;AAEA,SAAS,aAAa;AACpB,UAAQ,IAAI,uBAAuB;AAEnC,QAAM,eAAuC;AAAA,IAC3C,MAAM;AAAA,IACN,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,WAAW;AAAA,EACb;AAEA,aAAW,QAAQ,YAAY;AAC7B,UAAM,OAAO,aAAa,IAAI,KAAK;AACnC,YAAQ,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC,MAAM,IAAI,EAAE;AAAA,EAC9C;AAEA,UAAQ,IAAI,4CAA4C;AACxD,UAAQ,IAAI,+CAA+C;AAC7D;AAEA,eAAe,YAAY,WAAmB;AAC5C,MAAI,CAAC,WAAW,SAAS,SAAS,GAAG;AACnC,YAAQ,MAAM;AAAA,wBAA2B,SAAS,GAAG;AACrD,YAAQ,IAAI,qBAAqB,WAAW,KAAK,IAAI,CAAC;AAAA,CAAI;AAC1D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,aAAa,cAAc,OAAO;AACxC,QAAM,SAAS,MAAM,WAAW;AAChC,SAAO,QAAQ;AAEf,MAAI;AACF,UAAM,MAAMD,SAAQ,UAAU;AAC9B,QAAI,CAACD,YAAW,GAAG,GAAG;AACpB,MAAAD,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACpC;AACA,IAAAD,eAAc,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AACzD,YAAQ,IAAI;AAAA,qBAAwB,SAAS;AAAA,CAAK;AAGlD,UAAM,SAAS,iBAAiB,mBAAmB,MAAM;AACzD,YAAQ,IAAI,UAAU;AACtB,YAAQ,IAAI,MAAM;AAClB,YAAQ,IAAI,EAAE;AAAA,EAChB,SAAS,KAAK;AACZ,YAAQ,MAAM;AAAA,uBAA0B,GAAG;AAAA,CAAI;AAC/C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAe,gBAAgB;AAC7B,QAAM,SAAS,MAAM,WAAW;AAEhC,UAAQ,IAAI,0BAA0B;AACtC,UAAQ,IAAI,YAAY,OAAO,KAAK,EAAE;AACtC,UAAQ,IAAI,cAAc,OAAO,QAAQ,KAAK,IAAI,CAAC,EAAE;AACrD,UAAQ,IAAI,iBAAiB,OAAO,SAAS,GAAG;AAChD,UAAQ,IAAI,YAAY,OAAO,KAAK,EAAE;AACtC,UAAQ,IAAI,+BAA+B;AAC3C,UAAQ,IAAI,iBAAiB,mBAAmB,MAAM,CAAC;AACvD,UAAQ,IAAI,EAAE;AAGd,MAAI,oBAAoB,GAAG;AACzB,YAAQ,IAAI,2BAA2B,wBAAwB,CAAC,GAAG;AAAA,EACrE,OAAO;AACL,YAAQ,IAAI,iDAAiD;AAAA,EAC/D;AACA,UAAQ,IAAI,EAAE;AAChB;AAEA,eAAe,WAAW,OAA2B;AACnD,QAAM,aAAa,cAAc,KAAK;AAEtC,MAAIE,YAAW,UAAU,GAAG;AAC1B,YAAQ,IAAI;AAAA,gCAAmC,UAAU;AAAA,CAAI;AAC7D;AAAA,EACF;AAEA,MAAI;AACF,UAAM,MAAMC,SAAQ,UAAU;AAC9B,QAAI,CAACD,YAAW,GAAG,GAAG;AACpB,MAAAD,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACpC;AACA,IAAAD,eAAc,YAAY,KAAK,UAAU,eAAe,MAAM,CAAC,CAAC;AAChE,YAAQ,IAAI;AAAA,yBAA4B,UAAU;AAAA,CAAI;AAAA,EACxD,SAAS,KAAK;AACZ,YAAQ,MAAM;AAAA,yBAA4B,GAAG;AAAA,CAAI;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,QAAQ,MAAM;","names":["path","existsSync","writeFileSync","mkdirSync","existsSync","dirname","writeFileSync","mkdirSync","existsSync","dirname","launchTui"]}
|
|
1
|
+
{"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/config/defaults.ts","../src/config/loader.ts","../src/themes/index.ts","../src/utils/icons.ts","../src/utils/colors.ts","../src/utils/format.ts","../src/widgets/index.ts","../src/formatter.ts","../src/config/claude.ts","../src/tui/app.tsx","../src/cli.ts","../src/parser.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import type { CcslConfig } from \"./loader.js\";\nimport type { WidgetType } from \"../widgets/index.js\";\n\nexport const defaultWidgets: WidgetType[] = [\"model\", \"context\", \"tokens\", \"cost\"];\n\nexport const defaultConfig: CcslConfig = {\n theme: \"minimal\",\n widgets: defaultWidgets,\n separator: \" │ \",\n icons: \"auto\",\n padding: 1,\n};\n","import { cosmiconfig } from \"cosmiconfig\";\nimport { existsSync } from \"fs\";\nimport { defaultConfig } from \"./defaults.js\";\nimport type { Theme } from \"../themes/index.js\";\nimport type { WidgetType } from \"../widgets/index.js\";\nimport type { IconMode } from \"../utils/icons.js\";\n\nexport interface CcslConfig {\n theme: string;\n widgets: WidgetType[];\n separator: string;\n icons: IconMode;\n padding: number;\n customTheme?: Theme;\n}\n\nconst explorer = cosmiconfig(\"ccsl\", {\n searchPlaces: [\n \".ccslrc\",\n \".ccslrc.json\",\n \".ccslrc.yaml\",\n \".ccslrc.yml\",\n \".ccslrc.js\",\n \".ccslrc.cjs\",\n \".config/ccsl/config.json\",\n \"ccsl.config.js\",\n \"ccsl.config.cjs\",\n ],\n});\n\nexport async function loadConfig(searchFrom?: string): Promise<CcslConfig> {\n try {\n const result = await explorer.search(searchFrom);\n\n if (result && result.config) {\n return mergeConfig(defaultConfig, result.config);\n }\n\n // Fall back to global config if no local config found\n const globalPath = getConfigPath(\"global\");\n if (existsSync(globalPath)) {\n const globalResult = await explorer.load(globalPath);\n if (globalResult && globalResult.config) {\n return mergeConfig(defaultConfig, globalResult.config);\n }\n }\n } catch {\n // Config loading failed, use defaults\n }\n\n return { ...defaultConfig };\n}\n\nexport async function loadConfigForScope(scope: \"local\" | \"global\"): Promise<CcslConfig> {\n const configPath = getConfigPath(scope);\n\n // For global scope, try to load the global config file directly\n if (scope === \"global\") {\n if (existsSync(configPath)) {\n try {\n const result = await explorer.load(configPath);\n if (result && result.config) {\n return mergeConfig(defaultConfig, result.config);\n }\n } catch {\n // Fall through to defaults\n }\n }\n return { ...defaultConfig };\n }\n\n // For local scope, try local first, then fall back to global\n return loadConfig();\n}\n\nexport async function loadConfigFromFile(filePath: string): Promise<CcslConfig> {\n try {\n const result = await explorer.load(filePath);\n\n if (result && result.config) {\n return mergeConfig(defaultConfig, result.config);\n }\n } catch {\n // Config loading failed, use defaults\n }\n\n return { ...defaultConfig };\n}\n\nfunction mergeConfig(defaults: CcslConfig, userConfig: Partial<CcslConfig>): CcslConfig {\n return {\n theme: userConfig.theme ?? defaults.theme,\n widgets: userConfig.widgets ?? defaults.widgets,\n separator: userConfig.separator ?? defaults.separator,\n icons: userConfig.icons ?? defaults.icons,\n padding: userConfig.padding ?? defaults.padding,\n customTheme: userConfig.customTheme,\n };\n}\n\nexport function getConfigPath(scope: \"local\" | \"global\"): string {\n if (scope === \"local\") {\n return \".ccslrc.json\";\n }\n const home = process.env.HOME || process.env.USERPROFILE || \"~\";\n return `${home}/.config/ccsl/config.json`;\n}\n","import type { ColorStyle } from \"../utils/colors.js\";\nimport type { IconKey } from \"../utils/icons.js\";\n\nexport interface ThemeColors {\n model?: ColorStyle;\n context?: ColorStyle;\n contextHigh?: ColorStyle;\n contextCritical?: ColorStyle;\n tokens?: ColorStyle;\n cost?: ColorStyle;\n duration?: ColorStyle;\n lines?: ColorStyle;\n linesAdded?: ColorStyle;\n linesRemoved?: ColorStyle;\n directory?: ColorStyle;\n version?: ColorStyle;\n separator?: ColorStyle;\n usage?: ColorStyle;\n usageHigh?: ColorStyle;\n usageCritical?: ColorStyle;\n resetTime?: ColorStyle;\n}\n\nexport interface Theme {\n name: string;\n colors: ThemeColors;\n icons?: Partial<Record<IconKey, string>>;\n}\n\n// Neon theme - Vibrant cyberpunk\nconst neonTheme: Theme = {\n name: \"neon\",\n colors: {\n model: { fg: \"#00ffff\", bold: true },\n context: { fg: \"#ff00ff\" },\n contextHigh: { fg: \"#ffff00\" },\n contextCritical: { fg: \"#ff0000\", bold: true },\n tokens: { fg: \"#00ff00\" },\n cost: { fg: \"#ffff00\" },\n duration: { fg: \"#00aaff\" },\n lines: { fg: \"#ff6600\" },\n linesAdded: { fg: \"#00ff00\" },\n linesRemoved: { fg: \"#ff0066\" },\n directory: { fg: \"#00ffff\" },\n version: { fg: \"#aaaaff\" },\n separator: { fg: \"#666666\" },\n usage: { fg: \"#00ffaa\" },\n usageHigh: { fg: \"#ffff00\" },\n usageCritical: { fg: \"#ff0000\", bold: true },\n resetTime: { fg: \"#ff00ff\" },\n },\n};\n\n// Rainbow theme - Colorful gradient\nconst rainbowTheme: Theme = {\n name: \"rainbow\",\n colors: {\n model: { fg: \"#ff0000\", bold: true },\n context: { fg: \"#ff7f00\" },\n contextHigh: { fg: \"#ffff00\" },\n contextCritical: { fg: \"#ff0000\", bold: true },\n tokens: { fg: \"#00ff00\" },\n cost: { fg: \"#0000ff\" },\n duration: { fg: \"#4b0082\" },\n lines: { fg: \"#9400d3\" },\n linesAdded: { fg: \"#00ff00\" },\n linesRemoved: { fg: \"#ff0000\" },\n directory: { fg: \"#ff7f00\" },\n version: { fg: \"#9400d3\" },\n separator: { fg: \"#888888\" },\n usage: { fg: \"#00ffff\" },\n usageHigh: { fg: \"#ffff00\" },\n usageCritical: { fg: \"#ff0000\", bold: true },\n resetTime: { fg: \"#ff7f00\" },\n },\n};\n\n// Ocean theme - Cool blues and teals\nconst oceanTheme: Theme = {\n name: \"ocean\",\n colors: {\n model: { fg: \"#00bcd4\", bold: true },\n context: { fg: \"#2d8b8b\" },\n contextHigh: { fg: \"#4dd0e1\" },\n contextCritical: { fg: \"#ff5252\", bold: true },\n tokens: { fg: \"#80deea\" },\n cost: { fg: \"#4dd0e1\" },\n duration: { fg: \"#0288d1\" },\n lines: { fg: \"#26c6da\" },\n linesAdded: { fg: \"#69f0ae\" },\n linesRemoved: { fg: \"#ff5252\" },\n directory: { fg: \"#00bcd4\" },\n version: { fg: \"#80deea\" },\n separator: { fg: \"#37474f\" },\n usage: { fg: \"#26c6da\" },\n usageHigh: { fg: \"#4dd0e1\" },\n usageCritical: { fg: \"#ff5252\", bold: true },\n resetTime: { fg: \"#0288d1\" },\n },\n};\n\n// Minimal theme - Clean and subtle (default)\nconst minimalTheme: Theme = {\n name: \"minimal\",\n colors: {\n model: { fg: \"#888888\" },\n context: { fg: \"#ffffff\" },\n contextHigh: { fg: \"#e5c07b\" },\n contextCritical: { fg: \"#e06c75\", bold: true },\n tokens: { fg: \"#666666\", dim: true },\n cost: { fg: \"#61afef\" },\n duration: { fg: \"#666666\", dim: true },\n lines: { fg: \"#abb2bf\" },\n linesAdded: { fg: \"#98c379\" },\n linesRemoved: { fg: \"#e06c75\" },\n directory: { fg: \"#888888\" },\n version: { fg: \"#5c6370\" },\n separator: { fg: \"#444444\" },\n usage: { fg: \"#98c379\" },\n usageHigh: { fg: \"#e5c07b\" },\n usageCritical: { fg: \"#e06c75\", bold: true },\n resetTime: { fg: \"#61afef\" },\n },\n icons: {\n model: \"\",\n context: \"\",\n tokens: \"\",\n duration: \"\",\n lines: \"\",\n directory: \"\",\n usage: \"\",\n resetTime: \"\",\n },\n};\n\n// Monochrome theme - Grayscale\nconst monochromeTheme: Theme = {\n name: \"monochrome\",\n colors: {\n model: { fg: \"#ffffff\", bold: true },\n context: { fg: \"#cccccc\" },\n contextHigh: { fg: \"#ffffff\", bold: true },\n contextCritical: { fg: \"#ffffff\", bold: true, underline: true },\n tokens: { fg: \"#aaaaaa\" },\n cost: { fg: \"#999999\" },\n duration: { fg: \"#888888\" },\n lines: { fg: \"#777777\" },\n linesAdded: { fg: \"#cccccc\" },\n linesRemoved: { fg: \"#888888\" },\n directory: { fg: \"#aaaaaa\" },\n version: { fg: \"#666666\" },\n separator: { fg: \"#444444\" },\n usage: { fg: \"#bbbbbb\" },\n usageHigh: { fg: \"#ffffff\", bold: true },\n usageCritical: { fg: \"#ffffff\", bold: true, underline: true },\n resetTime: { fg: \"#999999\" },\n },\n icons: {\n model: \"\",\n context: \"\",\n tokens: \"\",\n duration: \"\",\n lines: \"\",\n directory: \"\",\n usage: \"\",\n resetTime: \"\",\n },\n};\n\n// Corporate theme - Professional blues\nconst corporateTheme: Theme = {\n name: \"corporate\",\n colors: {\n model: { fg: \"#3b82f6\", bold: true },\n context: { fg: \"#64748b\" },\n contextHigh: { fg: \"#f59e0b\" },\n contextCritical: { fg: \"#ef4444\", bold: true },\n tokens: { fg: \"#4682b4\" },\n cost: { fg: \"#6b7280\" },\n duration: { fg: \"#64748b\" },\n lines: { fg: \"#94a3b8\" },\n linesAdded: { fg: \"#22c55e\" },\n linesRemoved: { fg: \"#ef4444\" },\n directory: { fg: \"#3b82f6\" },\n version: { fg: \"#94a3b8\" },\n separator: { fg: \"#334155\" },\n usage: { fg: \"#22c55e\" },\n usageHigh: { fg: \"#f59e0b\" },\n usageCritical: { fg: \"#ef4444\", bold: true },\n resetTime: { fg: \"#3b82f6\" },\n },\n};\n\nexport const themes: Record<string, Theme> = {\n neon: neonTheme,\n rainbow: rainbowTheme,\n ocean: oceanTheme,\n minimal: minimalTheme,\n monochrome: monochromeTheme,\n corporate: corporateTheme,\n};\n\nexport const themeNames = Object.keys(themes);\n\nexport function getTheme(name: string): Theme {\n return themes[name] || themes.minimal;\n}\n","import type { Theme } from \"../themes/index.js\";\n\nexport type IconMode = \"auto\" | \"nerd\" | \"unicode\" | \"ascii\";\nexport type IconKey =\n | \"model\"\n | \"context\"\n | \"tokens\"\n | \"cost\"\n | \"duration\"\n | \"lines\"\n | \"directory\"\n | \"version\"\n | \"usage\"\n | \"resetTime\";\n\nconst nerdIcons: Record<IconKey, string> = {\n model: \"◈\",\n context: \"◐\",\n tokens: \"\",\n cost: \"$\",\n duration: \"⏱\",\n lines: \"±\",\n directory: \"\",\n version: \"\",\n usage: \"\",\n resetTime: \"\",\n};\n\nconst unicodeIcons: Record<IconKey, string> = {\n model: \"◈\",\n context: \"◐\",\n tokens: \"⇅\",\n cost: \"$\",\n duration: \"⏱\",\n lines: \"±\",\n directory: \"📁\",\n version: \"v\",\n usage: \"▰\",\n resetTime: \"⟳\",\n};\n\nconst asciiIcons: Record<IconKey, string> = {\n model: \"*\",\n context: \"%\",\n tokens: \"\",\n cost: \"$\",\n duration: \"\",\n lines: \"\",\n directory: \"\",\n version: \"v\",\n usage: \"#\",\n resetTime: \"~\",\n};\n\nlet detectedIconMode: IconMode | null = null;\n\nfunction detectIconSupport(): IconMode {\n if (detectedIconMode !== null) {\n return detectedIconMode;\n }\n\n const term = process.env.TERM || \"\";\n const termProgram = process.env.TERM_PROGRAM || \"\";\n const nerdFontEnv = process.env.NERD_FONT || \"\";\n\n // Explicit Nerd Font environment variable\n if (nerdFontEnv === \"1\" || nerdFontEnv.toLowerCase() === \"true\") {\n detectedIconMode = \"nerd\";\n return \"nerd\";\n }\n\n // Known Nerd Font capable terminals\n const nerdFontTerminals = [\"iTerm.app\", \"WezTerm\", \"Alacritty\", \"kitty\", \"Hyper\", \"Tabby\"];\n\n if (nerdFontTerminals.some((t) => termProgram.includes(t))) {\n detectedIconMode = \"nerd\";\n return \"nerd\";\n }\n\n // Modern terminals with good Unicode support\n if (term.includes(\"256color\") || term.includes(\"truecolor\")) {\n detectedIconMode = \"unicode\";\n return \"unicode\";\n }\n\n detectedIconMode = \"ascii\";\n return \"ascii\";\n}\n\nexport function getIcon(key: IconKey, theme: Theme, mode: IconMode): string {\n // Check theme-specific icons first\n if (theme.icons && theme.icons[key]) {\n return theme.icons[key] || \"\";\n }\n\n // Determine which icon set to use\n const effectiveMode = mode === \"auto\" ? detectIconSupport() : mode;\n\n switch (effectiveMode) {\n case \"nerd\":\n return nerdIcons[key] || \"\";\n case \"unicode\":\n return unicodeIcons[key] || \"\";\n case \"ascii\":\n return asciiIcons[key] || \"\";\n default:\n return unicodeIcons[key] || \"\";\n }\n}\n\nexport function getAllIcons(mode: IconMode): Record<IconKey, string> {\n const effectiveMode = mode === \"auto\" ? detectIconSupport() : mode;\n\n switch (effectiveMode) {\n case \"nerd\":\n return { ...nerdIcons };\n case \"unicode\":\n return { ...unicodeIcons };\n case \"ascii\":\n return { ...asciiIcons };\n default:\n return { ...unicodeIcons };\n }\n}\n","import chalk from \"chalk\";\n\nexport interface ColorStyle {\n fg?: string;\n bg?: string;\n bold?: boolean;\n dim?: boolean;\n italic?: boolean;\n underline?: boolean;\n}\n\nexport function applyStyle(text: string, style?: ColorStyle): string {\n if (!style) return text;\n\n let result = chalk;\n\n if (style.fg) {\n result = result.hex(style.fg);\n }\n if (style.bg) {\n result = result.bgHex(style.bg);\n }\n if (style.bold) {\n result = result.bold;\n }\n if (style.dim) {\n result = result.dim;\n }\n if (style.italic) {\n result = result.italic;\n }\n if (style.underline) {\n result = result.underline;\n }\n\n return result(text);\n}\n\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result\n ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16),\n }\n : null;\n}\n\nexport function rgbToHex(r: number, g: number, b: number): string {\n return (\n \"#\" +\n [r, g, b]\n .map((x) => {\n const hex = x.toString(16);\n return hex.length === 1 ? \"0\" + hex : hex;\n })\n .join(\"\")\n );\n}\n","export function formatNumber(num: number): string {\n if (num >= 1000000) {\n return `${(num / 1000000).toFixed(1)}m`;\n }\n if (num >= 1000) {\n return `${(num / 1000).toFixed(1)}k`;\n }\n return num.toString();\n}\n\nexport function formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n\n if (seconds < 60) {\n return `${seconds}s`;\n }\n\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) {\n const remainingSeconds = seconds % 60;\n return remainingSeconds > 0 ? `${minutes}m${remainingSeconds}s` : `${minutes}m`;\n }\n\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return remainingMinutes > 0 ? `${hours}h${remainingMinutes}m` : `${hours}h`;\n}\n\nexport function formatCost(usd: number): string {\n if (usd < 0.01) {\n return usd.toFixed(4);\n }\n if (usd < 1) {\n return usd.toFixed(2);\n }\n return usd.toFixed(2);\n}\n","import type { StatusInput } from \"../parser.js\";\nimport type { Theme } from \"../themes/index.js\";\nimport type { CcslConfig } from \"../config/loader.js\";\nimport { getIcon } from \"../utils/icons.js\";\nimport { applyStyle } from \"../utils/colors.js\";\nimport { formatNumber, formatDuration, formatCost } from \"../utils/format.js\";\nimport path from \"path\";\n\nexport type WidgetType =\n | \"model\"\n | \"context\"\n | \"tokens\"\n | \"cost\"\n | \"duration\"\n | \"lines\"\n | \"directory\"\n | \"version\"\n | \"usage\"\n | \"resetTime\";\n\nexport const availableWidgets: WidgetType[] = [\n \"model\",\n \"context\",\n \"tokens\",\n \"cost\",\n \"duration\",\n \"lines\",\n \"directory\",\n \"version\",\n \"usage\",\n \"resetTime\",\n];\n\nexport interface WidgetResult {\n content: string;\n visible: boolean;\n}\n\nexport function renderWidget(\n widget: WidgetType,\n input: StatusInput,\n theme: Theme,\n config: CcslConfig\n): WidgetResult {\n switch (widget) {\n case \"model\":\n return renderModel(input, theme, config);\n case \"context\":\n return renderContext(input, theme, config);\n case \"tokens\":\n return renderTokens(input, theme, config);\n case \"cost\":\n return renderCostWidget(input, theme, config);\n case \"duration\":\n return renderDurationWidget(input, theme, config);\n case \"lines\":\n return renderLines(input, theme, config);\n case \"directory\":\n return renderDirectory(input, theme, config);\n case \"version\":\n return renderVersion(input, theme, config);\n case \"usage\":\n return renderUsage(input, theme, config);\n case \"resetTime\":\n return renderResetTime(input, theme, config);\n default:\n return { content: \"\", visible: false };\n }\n}\n\nfunction renderModel(input: StatusInput, theme: Theme, config: CcslConfig): WidgetResult {\n const displayName = input.model?.display_name;\n if (!displayName) {\n return { content: \"\", visible: false };\n }\n\n const icon = getIcon(\"model\", theme, config.icons);\n const text = icon ? `${icon} ${displayName}` : displayName;\n const content = applyStyle(text, theme.colors.model);\n\n return { content, visible: true };\n}\n\nfunction renderContext(input: StatusInput, theme: Theme, config: CcslConfig): WidgetResult {\n const percentage = input.context_window?.used_percentage;\n if (percentage === undefined) {\n return { content: \"\", visible: false };\n }\n\n const icon = getIcon(\"context\", theme, config.icons);\n const roundedPercent = Math.round(percentage);\n const progressBar = renderProgressBar(percentage, theme);\n const value = `${roundedPercent}%`;\n const text = icon ? `${icon} ${progressBar} ${value}` : `${progressBar} ${value}`;\n\n // Color based on usage level\n let colorKey: \"context\" | \"contextHigh\" | \"contextCritical\" = \"context\";\n if (percentage >= 80) {\n colorKey = \"contextCritical\";\n } else if (percentage >= 60) {\n colorKey = \"contextHigh\";\n }\n\n const style = theme.colors[colorKey] || theme.colors.context;\n const content = applyStyle(text, style);\n\n return { content, visible: true };\n}\n\nfunction renderProgressBar(percentage: number, theme: Theme): string {\n const totalBars = 10;\n const filledBars = Math.round((percentage / 100) * totalBars);\n const emptyBars = totalBars - filledBars;\n\n // Use block characters for progress bar\n const filledChar = \"█\";\n const emptyChar = \"░\";\n\n // Color the filled portion based on usage level\n let filledStyle = theme.colors.context;\n if (percentage >= 80) {\n filledStyle = theme.colors.contextCritical || theme.colors.context;\n } else if (percentage >= 60) {\n filledStyle = theme.colors.contextHigh || theme.colors.context;\n }\n\n const filled = applyStyle(filledChar.repeat(filledBars), filledStyle);\n const empty = applyStyle(emptyChar.repeat(emptyBars), { fg: \"#444444\", dim: true });\n\n return `${filled}${empty}`;\n}\n\nfunction renderTokens(input: StatusInput, theme: Theme, config: CcslConfig): WidgetResult {\n const inputTokens = input.context_window?.total_input_tokens;\n const outputTokens = input.context_window?.total_output_tokens;\n\n if (inputTokens === undefined && outputTokens === undefined) {\n return { content: \"\", visible: false };\n }\n\n const icon = getIcon(\"tokens\", theme, config.icons);\n const inStr = formatNumber(inputTokens ?? 0);\n const outStr = formatNumber(outputTokens ?? 0);\n const text = icon ? `${icon} ↑${inStr} ↓${outStr}` : `↑${inStr} ↓${outStr}`;\n const content = applyStyle(text, theme.colors.tokens);\n\n return { content, visible: true };\n}\n\nfunction renderCostWidget(input: StatusInput, theme: Theme, config: CcslConfig): WidgetResult {\n const costUsd = input.cost?.total_cost_usd;\n if (costUsd === undefined) {\n return { content: \"\", visible: false };\n }\n\n const icon = getIcon(\"cost\", theme, config.icons);\n const value = formatCost(costUsd);\n const text = icon ? `${icon}${value}` : `$${value}`;\n const content = applyStyle(text, theme.colors.cost);\n\n return { content, visible: true };\n}\n\nfunction renderDurationWidget(input: StatusInput, theme: Theme, config: CcslConfig): WidgetResult {\n const durationMs = input.cost?.total_duration_ms;\n if (durationMs === undefined) {\n return { content: \"\", visible: false };\n }\n\n const icon = getIcon(\"duration\", theme, config.icons);\n const value = formatDuration(durationMs);\n const text = icon ? `${icon} ${value}` : value;\n const content = applyStyle(text, theme.colors.duration);\n\n return { content, visible: true };\n}\n\nfunction renderLines(input: StatusInput, theme: Theme, config: CcslConfig): WidgetResult {\n const added = input.cost?.total_lines_added;\n const removed = input.cost?.total_lines_removed;\n\n if (added === undefined && removed === undefined) {\n return { content: \"\", visible: false };\n }\n\n const icon = getIcon(\"lines\", theme, config.icons);\n\n const addedStr = applyStyle(`+${added ?? 0}`, theme.colors.linesAdded || theme.colors.lines);\n const removedStr = applyStyle(`-${removed ?? 0}`, theme.colors.linesRemoved || theme.colors.lines);\n\n const text = icon ? `${icon} ${addedStr} ${removedStr}` : `${addedStr} ${removedStr}`;\n\n return { content: text, visible: true };\n}\n\nfunction renderDirectory(input: StatusInput, theme: Theme, config: CcslConfig): WidgetResult {\n const dir = input.workspace?.current_dir || input.cwd;\n if (!dir) {\n return { content: \"\", visible: false };\n }\n\n const icon = getIcon(\"directory\", theme, config.icons);\n const dirName = path.basename(dir);\n const text = icon ? `${icon} ${dirName}` : dirName;\n const content = applyStyle(text, theme.colors.directory);\n\n return { content, visible: true };\n}\n\nfunction renderVersion(input: StatusInput, theme: Theme, config: CcslConfig): WidgetResult {\n const version = input.version;\n if (!version) {\n return { content: \"\", visible: false };\n }\n\n const icon = getIcon(\"version\", theme, config.icons);\n const text = icon ? `${icon}${version}` : `v${version}`;\n const content = applyStyle(text, theme.colors.version);\n\n return { content, visible: true };\n}\n\nfunction renderUsage(input: StatusInput, theme: Theme, config: CcslConfig): WidgetResult {\n const sessionUsage = input.session_usage;\n if (!sessionUsage) {\n return { content: \"\", visible: false };\n }\n\n const { requests_used, requests_limit, usage_percentage, plan } = sessionUsage;\n\n // Need at least some usage info to display\n if (requests_used === undefined && usage_percentage === undefined) {\n return { content: \"\", visible: false };\n }\n\n const icon = getIcon(\"usage\", theme, config.icons);\n\n // Calculate percentage if not provided\n let percent = usage_percentage;\n if (percent === undefined && requests_used !== undefined && requests_limit !== undefined && requests_limit > 0) {\n percent = (requests_used / requests_limit) * 100;\n }\n\n // Build the display string\n let text = \"\";\n if (icon) {\n text += `${icon} `;\n }\n\n // Show usage bar if we have percentage\n if (percent !== undefined) {\n const progressBar = renderUsageBar(percent, theme);\n text += progressBar + \" \";\n }\n\n // Show counts if available\n if (requests_used !== undefined && requests_limit !== undefined) {\n text += `${requests_used}/${requests_limit}`;\n } else if (percent !== undefined) {\n text += `${Math.round(percent)}%`;\n }\n\n // Append plan if available\n if (plan) {\n text += ` (${plan})`;\n }\n\n // Color based on usage level\n let colorKey: \"usage\" | \"usageHigh\" | \"usageCritical\" = \"usage\";\n if (percent !== undefined) {\n if (percent >= 90) {\n colorKey = \"usageCritical\";\n } else if (percent >= 70) {\n colorKey = \"usageHigh\";\n }\n }\n\n const style = theme.colors[colorKey] || theme.colors.usage;\n const content = applyStyle(text.trim(), style);\n\n return { content, visible: true };\n}\n\nfunction renderUsageBar(percentage: number, theme: Theme): string {\n const totalBars = 5;\n const filledBars = Math.round((percentage / 100) * totalBars);\n const emptyBars = totalBars - filledBars;\n\n const filledChar = \"▰\";\n const emptyChar = \"▱\";\n\n // Color the filled portion based on usage level\n let filledStyle = theme.colors.usage;\n if (percentage >= 90) {\n filledStyle = theme.colors.usageCritical || theme.colors.usage;\n } else if (percentage >= 70) {\n filledStyle = theme.colors.usageHigh || theme.colors.usage;\n }\n\n const filled = applyStyle(filledChar.repeat(filledBars), filledStyle);\n const empty = applyStyle(emptyChar.repeat(emptyBars), { fg: \"#444444\", dim: true });\n\n return `${filled}${empty}`;\n}\n\nfunction renderResetTime(input: StatusInput, theme: Theme, config: CcslConfig): WidgetResult {\n const sessionUsage = input.session_usage;\n if (!sessionUsage) {\n return { content: \"\", visible: false };\n }\n\n const { reset_at, reset_in_seconds } = sessionUsage;\n\n // Need reset time info\n if (reset_at === undefined && reset_in_seconds === undefined) {\n return { content: \"\", visible: false };\n }\n\n const icon = getIcon(\"resetTime\", theme, config.icons);\n\n let timeStr = \"\";\n if (reset_in_seconds !== undefined) {\n timeStr = formatResetDuration(reset_in_seconds);\n } else if (reset_at) {\n // Parse ISO timestamp and calculate time until reset\n try {\n const resetDate = new Date(reset_at);\n const now = new Date();\n const diffSeconds = Math.max(0, Math.floor((resetDate.getTime() - now.getTime()) / 1000));\n timeStr = formatResetDuration(diffSeconds);\n } catch {\n // If parsing fails, show the raw timestamp\n timeStr = reset_at;\n }\n }\n\n const text = icon ? `${icon} ${timeStr}` : timeStr;\n const content = applyStyle(text, theme.colors.resetTime);\n\n return { content, visible: true };\n}\n\nfunction formatResetDuration(seconds: number): string {\n if (seconds <= 0) {\n return \"now\";\n }\n\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n\n if (hours > 0) {\n return minutes > 0 ? `${hours}h${minutes}m` : `${hours}h`;\n }\n\n if (minutes > 0) {\n const secs = seconds % 60;\n return secs > 0 ? `${minutes}m${secs}s` : `${minutes}m`;\n }\n\n return `${seconds}s`;\n}\n","import type { StatusInput } from \"./parser.js\";\nimport type { CcslConfig } from \"./config/loader.js\";\nimport { themes } from \"./themes/index.js\";\nimport { renderWidget } from \"./widgets/index.js\";\nimport { applyStyle } from \"./utils/colors.js\";\n\nexport function formatStatusLine(input: StatusInput, config: CcslConfig): string {\n const theme = config.customTheme || themes[config.theme] || themes.minimal;\n const renderedWidgets: string[] = [];\n\n for (const widget of config.widgets) {\n const result = renderWidget(widget, input, theme, config);\n if (result.visible && result.content) {\n renderedWidgets.push(result.content);\n }\n }\n\n if (renderedWidgets.length === 0) {\n return \"\";\n }\n\n const separator = applyStyle(config.separator, theme.colors.separator);\n const statusLine = renderedWidgets.join(separator);\n\n // Add padding\n const padding = \" \".repeat(config.padding);\n\n // Prepend ANSI reset to ensure clean state\n return `\\x1b[0m${padding}${statusLine}${padding}`;\n}\n\n// Sample data for preview\nexport const sampleStatusInput: StatusInput = {\n hook_event_name: \"Status\",\n session_id: \"sample-session-123\",\n model: {\n id: \"claude-opus-4-1\",\n display_name: \"Opus\",\n },\n workspace: {\n current_dir: \"/home/user/my-project\",\n project_dir: \"/home/user/my-project\",\n },\n version: \"1.0.80\",\n cost: {\n total_cost_usd: 0.0234,\n total_duration_ms: 45000,\n total_api_duration_ms: 2300,\n total_lines_added: 156,\n total_lines_removed: 23,\n },\n context_window: {\n total_input_tokens: 15234,\n total_output_tokens: 4521,\n context_window_size: 200000,\n used_percentage: 42.5,\n remaining_percentage: 57.5,\n current_usage: {\n input_tokens: 8500,\n output_tokens: 1200,\n cache_creation_input_tokens: 5000,\n cache_read_input_tokens: 2000,\n },\n },\n session_usage: {\n requests_used: 45,\n requests_limit: 100,\n usage_percentage: 45,\n reset_in_seconds: 7200,\n plan: \"Pro\",\n },\n};\n","import { readFileSync, writeFileSync, existsSync, mkdirSync, copyFileSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport { homedir } from \"os\";\n\nexport interface ClaudeSettings {\n statusLine?: {\n type: \"command\";\n command: string;\n padding?: number;\n };\n [key: string]: unknown;\n}\n\nexport function getClaudeSettingsPath(): string {\n const claudeDir = process.env.CLAUDE_CONFIG_DIR || join(homedir(), \".claude\");\n return join(claudeDir, \"settings.json\");\n}\n\nexport function getClaudeSettings(): ClaudeSettings | null {\n const settingsPath = getClaudeSettingsPath();\n\n if (!existsSync(settingsPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(settingsPath, \"utf8\");\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n\nexport function backupClaudeSettings(): string | null {\n const settingsPath = getClaudeSettingsPath();\n\n if (!existsSync(settingsPath)) {\n return null;\n }\n\n const backupPath = settingsPath + \".backup\";\n try {\n copyFileSync(settingsPath, backupPath);\n return backupPath;\n } catch {\n return null;\n }\n}\n\nexport function installToClaudeSettings(command: string = \"npx @vimukthid/ccsl\"): boolean {\n const settingsPath = getClaudeSettingsPath();\n const dir = dirname(settingsPath);\n\n // Ensure directory exists\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n // Load existing settings or create new\n let settings: ClaudeSettings = {};\n if (existsSync(settingsPath)) {\n try {\n const content = readFileSync(settingsPath, \"utf8\");\n settings = JSON.parse(content);\n } catch {\n // If parse fails, start fresh\n settings = {};\n }\n }\n\n // Update statusLine\n settings.statusLine = {\n type: \"command\",\n command,\n };\n\n // Write back\n try {\n writeFileSync(settingsPath, JSON.stringify(settings, null, 2));\n return true;\n } catch {\n return false;\n }\n}\n\nexport function uninstallFromClaudeSettings(): boolean {\n const settingsPath = getClaudeSettingsPath();\n\n if (!existsSync(settingsPath)) {\n return true; // Nothing to uninstall\n }\n\n try {\n const content = readFileSync(settingsPath, \"utf8\");\n const settings: ClaudeSettings = JSON.parse(content);\n\n // Remove statusLine\n delete settings.statusLine;\n\n // Write back\n writeFileSync(settingsPath, JSON.stringify(settings, null, 2));\n return true;\n } catch {\n return false;\n }\n}\n\nexport function isInstalledInClaude(): boolean {\n const settings = getClaudeSettings();\n if (!settings?.statusLine) {\n return false;\n }\n\n const command = settings.statusLine.command || \"\";\n return command.includes(\"ccsl\") || command.includes(\"@vimukthid/ccsl\");\n}\n\nexport function getCurrentClaudeCommand(): string | null {\n const settings = getClaudeSettings();\n return settings?.statusLine?.command || null;\n}\n","import React, { useState } from \"react\";\nimport { render, Box, Text, useApp, useInput } from \"ink\";\nimport SelectInput from \"ink-select-input\";\nimport { loadConfigForScope, getConfigPath, type CcslConfig } from \"../config/loader.js\";\nimport { themeNames } from \"../themes/index.js\";\nimport { formatStatusLine, sampleStatusInput } from \"../formatter.js\";\nimport { availableWidgets, type WidgetType } from \"../widgets/index.js\";\nimport {\n installToClaudeSettings,\n isInstalledInClaude,\n getCurrentClaudeCommand,\n} from \"../config/claude.js\";\nimport { writeFileSync, mkdirSync, existsSync } from \"fs\";\nimport { dirname } from \"path\";\n\ntype Screen = \"main\" | \"themes\" | \"widgets\" | \"settings\" | \"preview\" | \"install\";\n\ninterface AppProps {\n initialConfig: CcslConfig;\n scope: \"local\" | \"global\";\n}\n\nfunction App({ initialConfig, scope }: AppProps) {\n const { exit } = useApp();\n const [screen, setScreen] = useState<Screen>(\"main\");\n const [config, setConfig] = useState<CcslConfig>(initialConfig);\n const [message, setMessage] = useState<string>(\"\");\n\n useInput((input, key) => {\n if (key.escape) {\n if (screen === \"main\") {\n exit();\n } else {\n setScreen(\"main\");\n }\n }\n if (input === \"q\" && screen === \"main\") {\n exit();\n }\n });\n\n const saveConfig = () => {\n const configPath = getConfigPath(scope);\n try {\n const dir = dirname(configPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(configPath, JSON.stringify(config, null, 2));\n setMessage(\"Configuration saved!\");\n setTimeout(() => setMessage(\"\"), 2000);\n } catch (err) {\n setMessage(`Error saving: ${err}`);\n }\n };\n\n const renderMain = () => {\n const items = [\n { label: \"🎨 Select Theme\", value: \"themes\" },\n { label: \"📊 Configure Widgets\", value: \"widgets\" },\n { label: \"⚙️ General Settings\", value: \"settings\" },\n { label: \"👁️ Live Preview\", value: \"preview\" },\n { label: \"📦 Install to Claude Code\", value: \"install\" },\n { label: \"💾 Save Configuration\", value: \"save\" },\n { label: \"❌ Exit\", value: \"exit\" },\n ];\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n CCSL Configuration\n </Text>\n <Text color=\"gray\"> ({scope})</Text>\n </Box>\n <SelectInput\n items={items}\n onSelect={(item) => {\n if (item.value === \"exit\") {\n exit();\n } else if (item.value === \"save\") {\n saveConfig();\n } else {\n setScreen(item.value as Screen);\n }\n }}\n />\n {message && (\n <Box marginTop={1}>\n <Text color=\"green\">{message}</Text>\n </Box>\n )}\n <Box marginTop={1}>\n <Text color=\"gray\">Press q or Esc to exit</Text>\n </Box>\n </Box>\n );\n };\n\n const renderThemes = () => {\n const items = themeNames.map((name) => ({\n label: `${name}${config.theme === name ? \" (current)\" : \"\"}`,\n value: name,\n }));\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🎨 Select Theme\n </Text>\n </Box>\n <SelectInput\n items={items}\n onSelect={(item) => {\n setConfig({ ...config, theme: item.value });\n setScreen(\"main\");\n }}\n />\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"gray\">Preview:</Text>\n <Text>{formatStatusLine(sampleStatusInput, config)}</Text>\n </Box>\n <Box marginTop={1}>\n <Text color=\"gray\">Press Esc to go back</Text>\n </Box>\n </Box>\n );\n };\n\n const renderWidgets = () => {\n const items = availableWidgets.map((widget) => ({\n label: `${config.widgets.includes(widget) ? \"[x]\" : \"[ ]\"} ${widget}`,\n value: widget,\n }));\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 📊 Configure Widgets\n </Text>\n </Box>\n <SelectInput\n items={items}\n onSelect={(item) => {\n const widget = item.value as WidgetType;\n const newWidgets = config.widgets.includes(widget)\n ? config.widgets.filter((w) => w !== widget)\n : [...config.widgets, widget];\n setConfig({ ...config, widgets: newWidgets });\n }}\n />\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"gray\">Current order: {config.widgets.join(\", \")}</Text>\n <Text>{formatStatusLine(sampleStatusInput, config)}</Text>\n </Box>\n <Box marginTop={1}>\n <Text color=\"gray\">Press Esc to go back</Text>\n </Box>\n </Box>\n );\n };\n\n const renderSettings = () => {\n const iconOptions = [\n { label: `Icons: auto${config.icons === \"auto\" ? \" (current)\" : \"\"}`, value: \"icon-auto\" },\n { label: `Icons: nerd${config.icons === \"nerd\" ? \" (current)\" : \"\"}`, value: \"icon-nerd\" },\n {\n label: `Icons: unicode${config.icons === \"unicode\" ? \" (current)\" : \"\"}`,\n value: \"icon-unicode\",\n },\n { label: `Icons: ascii${config.icons === \"ascii\" ? \" (current)\" : \"\"}`, value: \"icon-ascii\" },\n ];\n\n const separatorOptions = [\n {\n label: `Separator: \" │ \"${config.separator === \" │ \" ? \" (current)\" : \"\"}`,\n value: \"sep- │ \",\n },\n {\n label: `Separator: \" | \"${config.separator === \" | \" ? \" (current)\" : \"\"}`,\n value: \"sep- | \",\n },\n {\n label: `Separator: \" · \"${config.separator === \" · \" ? \" (current)\" : \"\"}`,\n value: \"sep- · \",\n },\n {\n label: `Separator: \" \"${config.separator === \" \" ? \" (current)\" : \"\"}`,\n value: \"sep- \",\n },\n ];\n\n const items = [...iconOptions, ...separatorOptions];\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n ⚙️ General Settings\n </Text>\n </Box>\n <SelectInput\n items={items}\n onSelect={(item) => {\n if (item.value.startsWith(\"icon-\")) {\n const iconMode = item.value.replace(\"icon-\", \"\") as\n | \"auto\"\n | \"nerd\"\n | \"unicode\"\n | \"ascii\";\n setConfig({ ...config, icons: iconMode });\n } else if (item.value.startsWith(\"sep-\")) {\n const sep = item.value.replace(\"sep-\", \"\");\n setConfig({ ...config, separator: sep });\n }\n }}\n />\n <Box marginTop={1}>\n <Text>{formatStatusLine(sampleStatusInput, config)}</Text>\n </Box>\n <Box marginTop={1}>\n <Text color=\"gray\">Press Esc to go back</Text>\n </Box>\n </Box>\n );\n };\n\n const renderPreview = () => {\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 👁️ Live Preview\n </Text>\n </Box>\n <Box marginBottom={1} flexDirection=\"column\">\n <Text color=\"gray\">Theme: {config.theme}</Text>\n <Text color=\"gray\">Widgets: {config.widgets.join(\", \")}</Text>\n <Text color=\"gray\">Icons: {config.icons}</Text>\n </Box>\n <Box marginBottom={1}>\n <Text bold>Output:</Text>\n </Box>\n <Text>{formatStatusLine(sampleStatusInput, config)}</Text>\n <Box marginTop={2}>\n <Text color=\"gray\">Press Esc to go back</Text>\n </Box>\n </Box>\n );\n };\n\n const renderInstall = () => {\n const installed = isInstalledInClaude();\n const currentCmd = getCurrentClaudeCommand();\n\n const items = [\n { label: installed ? \"🔄 Update Installation\" : \"📥 Install to Claude Code\", value: \"install\" },\n { label: \"⬅️ Back\", value: \"back\" },\n ];\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 📦 Claude Code Integration\n </Text>\n </Box>\n <Box marginBottom={1} flexDirection=\"column\">\n {installed ? (\n <>\n <Text color=\"green\">Status: Installed</Text>\n <Text color=\"gray\">Command: {currentCmd}</Text>\n </>\n ) : (\n <Text color=\"yellow\">Status: Not installed</Text>\n )}\n </Box>\n <SelectInput\n items={items}\n onSelect={(item) => {\n if (item.value === \"install\") {\n const success = installToClaudeSettings();\n if (success) {\n setMessage(\"Installed! Restart Claude Code to apply.\");\n } else {\n setMessage(\"Installation failed. Check permissions.\");\n }\n setTimeout(() => setMessage(\"\"), 3000);\n } else {\n setScreen(\"main\");\n }\n }}\n />\n {message && (\n <Box marginTop={1}>\n <Text color={message.includes(\"failed\") ? \"red\" : \"green\"}>{message}</Text>\n </Box>\n )}\n <Box marginTop={1}>\n <Text color=\"gray\">Press Esc to go back</Text>\n </Box>\n </Box>\n );\n };\n\n return (\n <Box padding={1} flexDirection=\"column\">\n {screen === \"main\" && renderMain()}\n {screen === \"themes\" && renderThemes()}\n {screen === \"widgets\" && renderWidgets()}\n {screen === \"settings\" && renderSettings()}\n {screen === \"preview\" && renderPreview()}\n {screen === \"install\" && renderInstall()}\n </Box>\n );\n}\n\nexport async function launchTui(scope: \"local\" | \"global\") {\n const config = await loadConfigForScope(scope);\n\n const { waitUntilExit } = render(<App initialConfig={config} scope={scope} />);\n await waitUntilExit();\n}\n","import { Command } from \"commander\";\nimport { loadConfig, getConfigPath } from \"./config/loader.js\";\nimport { parseStatusInput, readStdin, isInteractiveMode } from \"./parser.js\";\nimport { formatStatusLine, sampleStatusInput } from \"./formatter.js\";\nimport { themeNames } from \"./themes/index.js\";\nimport {\n installToClaudeSettings,\n uninstallFromClaudeSettings,\n isInstalledInClaude,\n getCurrentClaudeCommand,\n backupClaudeSettings,\n getClaudeSettingsPath,\n} from \"./config/claude.js\";\nimport { writeFileSync, mkdirSync, existsSync } from \"fs\";\nimport { dirname } from \"path\";\nimport { defaultConfig } from \"./config/defaults.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"ccsl\")\n .description(\"Customizable status line formatter for Claude Code CLI\")\n .version(\"1.0.4\");\n\nprogram\n .command(\"install\")\n .description(\"Install ccsl to Claude Code settings.json\")\n .option(\"-c, --command <cmd>\", \"Custom command to use\", \"npx @vimukthid/ccsl\")\n .action(async (options) => {\n console.log(\"\\nInstalling ccsl to Claude Code...\\n\");\n\n // Check if already installed\n if (isInstalledInClaude()) {\n const currentCmd = getCurrentClaudeCommand();\n console.log(` Already installed with command: ${currentCmd}`);\n console.log(\" Updating configuration...\\n\");\n }\n\n // Backup existing settings\n const backupPath = backupClaudeSettings();\n if (backupPath) {\n console.log(` Backup created: ${backupPath}`);\n }\n\n // Install\n const success = installToClaudeSettings(options.command);\n if (success) {\n console.log(` Installed to: ${getClaudeSettingsPath()}`);\n console.log(` Command: ${options.command}`);\n console.log(\"\\n ccsl is now configured for Claude Code!\");\n console.log(\" Restart Claude Code to see your new status line.\\n\");\n } else {\n console.error(\"\\n Failed to install. Check file permissions.\\n\");\n process.exit(1);\n }\n });\n\nprogram\n .command(\"uninstall\")\n .description(\"Remove ccsl from Claude Code settings.json\")\n .action(async () => {\n console.log(\"\\nRemoving ccsl from Claude Code...\\n\");\n\n if (!isInstalledInClaude()) {\n console.log(\" ccsl is not currently installed in Claude Code.\\n\");\n return;\n }\n\n // Backup existing settings\n const backupPath = backupClaudeSettings();\n if (backupPath) {\n console.log(` Backup created: ${backupPath}`);\n }\n\n const success = uninstallFromClaudeSettings();\n if (success) {\n console.log(\" Successfully removed from Claude Code settings.\\n\");\n } else {\n console.error(\"\\n Failed to uninstall. Check file permissions.\\n\");\n process.exit(1);\n }\n });\n\nprogram\n .command(\"theme [name]\")\n .description(\"Quick switch theme or list available themes\")\n .option(\"-l, --list\", \"List available themes\")\n .action(async (name, options) => {\n if (options.list || !name) {\n listThemes();\n return;\n }\n await switchTheme(name);\n });\n\nprogram\n .command(\"preview\")\n .description(\"Preview current configuration with sample data\")\n .action(async () => {\n await previewConfig();\n });\n\nprogram\n .command(\"init\")\n .description(\"Create local config file\")\n .option(\"-g, --global\", \"Create global config file instead\")\n .action(async (options) => {\n const scope = options.global ? \"global\" : \"local\";\n await initConfig(scope);\n });\n\nprogram\n .command(\"config\")\n .description(\"Open TUI configuration\")\n .option(\"-g, --global\", \"Configure global settings\")\n .option(\"-l, --local\", \"Configure local project settings\")\n .action(async (options) => {\n const scope = options.global ? \"global\" : \"local\";\n await runTui(scope);\n });\n\n// Default action - either format stdin or launch TUI\nprogram.action(async () => {\n if (isInteractiveMode()) {\n // No piped input - launch TUI\n await runTui(\"local\");\n } else {\n // Piped input - format status line\n const stdinData = await readStdin();\n const input = parseStatusInput(stdinData);\n\n if (!input) {\n // Output empty line if no valid input\n console.log(\"\");\n return;\n }\n\n const config = await loadConfig();\n const output = formatStatusLine(input, config);\n console.log(output);\n }\n});\n\nasync function runTui(scope: \"local\" | \"global\") {\n const { launchTui } = await import(\"./tui/app.js\");\n await launchTui(scope);\n}\n\nfunction listThemes() {\n console.log(\"\\nAvailable themes:\\n\");\n\n const descriptions: Record<string, string> = {\n neon: \"Vibrant cyberpunk with electric colors\",\n rainbow: \"Colorful gradient transitions\",\n ocean: \"Cool blues and teals\",\n minimal: \"Clean, understated (default)\",\n monochrome: \"Pure grayscale\",\n corporate: \"Professional muted blues\",\n };\n\n for (const name of themeNames) {\n const desc = descriptions[name] || \"\";\n console.log(` ${name.padEnd(12)} - ${desc}`);\n }\n\n console.log(\"\\nUse 'ccsl theme <name>' to switch themes\");\n console.log(\"Use 'ccsl preview' to see the current theme\\n\");\n}\n\nasync function switchTheme(themeName: string) {\n if (!themeNames.includes(themeName)) {\n console.error(`\\nError: Unknown theme '${themeName}'`);\n console.log(`Available themes: ${themeNames.join(\", \")}\\n`);\n process.exit(1);\n }\n\n const configPath = getConfigPath(\"local\");\n const config = await loadConfig();\n config.theme = themeName;\n\n try {\n const dir = dirname(configPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(configPath, JSON.stringify(config, null, 2));\n console.log(`\\nTheme switched to '${themeName}'\\n`);\n\n // Show preview\n const output = formatStatusLine(sampleStatusInput, config);\n console.log(\"Preview:\");\n console.log(output);\n console.log(\"\");\n } catch (err) {\n console.error(`\\nError saving config: ${err}\\n`);\n process.exit(1);\n }\n}\n\nasync function previewConfig() {\n const config = await loadConfig();\n\n console.log(\"\\nCurrent configuration:\");\n console.log(` Theme: ${config.theme}`);\n console.log(` Widgets: ${config.widgets.join(\", \")}`);\n console.log(` Separator: \"${config.separator}\"`);\n console.log(` Icons: ${config.icons}`);\n console.log(\"\\nPreview with sample data:\\n\");\n console.log(formatStatusLine(sampleStatusInput, config));\n console.log(\"\");\n\n // Show Claude Code status\n if (isInstalledInClaude()) {\n console.log(`Claude Code: Installed (${getCurrentClaudeCommand()})`);\n } else {\n console.log(\"Claude Code: Not installed (run 'ccsl install')\");\n }\n console.log(\"\");\n}\n\nasync function initConfig(scope: \"local\" | \"global\") {\n const configPath = getConfigPath(scope);\n\n if (existsSync(configPath)) {\n console.log(`\\nConfig file already exists at ${configPath}\\n`);\n return;\n }\n\n try {\n const dir = dirname(configPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(configPath, JSON.stringify(defaultConfig, null, 2));\n console.log(`\\nCreated config file at ${configPath}\\n`);\n } catch (err) {\n console.error(`\\nError creating config: ${err}\\n`);\n process.exit(1);\n }\n}\n\nprogram.parse();\n","import { z } from \"zod\";\n\n// Schema for Claude Code status JSON input\nexport const StatusInputSchema = z\n .object({\n hook_event_name: z.string().optional(),\n session_id: z.string().optional(),\n transcript_path: z.string().optional(),\n cwd: z.string().optional(),\n model: z\n .object({\n id: z.string().optional(),\n display_name: z.string().optional(),\n })\n .optional(),\n workspace: z\n .object({\n current_dir: z.string().optional(),\n project_dir: z.string().optional(),\n })\n .optional(),\n version: z.string().optional(),\n output_style: z\n .object({\n name: z.string().optional(),\n })\n .optional(),\n cost: z\n .object({\n total_cost_usd: z.number().optional(),\n total_duration_ms: z.number().optional(),\n total_api_duration_ms: z.number().optional(),\n total_lines_added: z.number().optional(),\n total_lines_removed: z.number().optional(),\n })\n .optional(),\n context_window: z\n .object({\n total_input_tokens: z.number().optional(),\n total_output_tokens: z.number().optional(),\n context_window_size: z.number().optional(),\n used_percentage: z.number().optional(),\n remaining_percentage: z.number().optional(),\n current_usage: z\n .object({\n input_tokens: z.number().optional(),\n output_tokens: z.number().optional(),\n cache_creation_input_tokens: z.number().optional(),\n cache_read_input_tokens: z.number().optional(),\n })\n .nullable()\n .optional(),\n })\n .optional(),\n // Session usage and rate limit information\n session_usage: z\n .object({\n // Number of requests/messages used in current session\n requests_used: z.number().optional(),\n // Maximum requests allowed in the session period\n requests_limit: z.number().optional(),\n // Percentage of session usage (0-100)\n usage_percentage: z.number().optional(),\n // ISO timestamp when the usage limit resets\n reset_at: z.string().optional(),\n // Seconds until reset\n reset_in_seconds: z.number().optional(),\n // Plan/tier name (e.g., \"Pro\", \"Free\", \"Max\")\n plan: z.string().optional(),\n })\n .optional(),\n })\n .passthrough();\n\nexport type StatusInput = z.infer<typeof StatusInputSchema>;\n\nexport function parseStatusInput(input: string): StatusInput | null {\n try {\n const trimmed = input.trim();\n if (!trimmed) {\n return null;\n }\n const parsed = JSON.parse(trimmed);\n const result = StatusInputSchema.safeParse(parsed);\n\n if (result.success) {\n return result.data;\n }\n\n // If validation fails, still try to use the data\n // Claude Code may add new fields we don't know about\n return parsed as StatusInput;\n } catch {\n return null;\n }\n}\n\nexport async function readStdin(): Promise<string> {\n return new Promise((resolve) => {\n let data = \"\";\n\n process.stdin.setEncoding(\"utf8\");\n\n process.stdin.on(\"readable\", () => {\n let chunk;\n while ((chunk = process.stdin.read()) !== null) {\n data += chunk;\n }\n });\n\n process.stdin.on(\"end\", () => {\n resolve(data);\n });\n\n process.stdin.on(\"error\", () => {\n resolve(\"\");\n });\n });\n}\n\nexport function isInteractiveMode(): boolean {\n return process.stdin.isTTY === true;\n}\n"],"mappings":"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","names":["path","existsSync","writeFileSync","mkdirSync","existsSync","dirname","writeFileSync","mkdirSync","existsSync","dirname","launchTui"]}
|