@vimukthid/ccsl 1.0.0 → 1.0.3
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 +54 -17
- package/dist/cli.js +226 -40
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +220 -23
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +75 -3
- package/dist/index.d.ts +75 -3
- package/dist/index.js +212 -17
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -14,7 +14,11 @@ var neonTheme = {
|
|
|
14
14
|
linesRemoved: { fg: "#ff0066" },
|
|
15
15
|
directory: { fg: "#00ffff" },
|
|
16
16
|
version: { fg: "#aaaaff" },
|
|
17
|
-
separator: { fg: "#666666" }
|
|
17
|
+
separator: { fg: "#666666" },
|
|
18
|
+
usage: { fg: "#00ffaa" },
|
|
19
|
+
usageHigh: { fg: "#ffff00" },
|
|
20
|
+
usageCritical: { fg: "#ff0000", bold: true },
|
|
21
|
+
resetTime: { fg: "#ff00ff" }
|
|
18
22
|
}
|
|
19
23
|
};
|
|
20
24
|
var rainbowTheme = {
|
|
@@ -32,7 +36,11 @@ var rainbowTheme = {
|
|
|
32
36
|
linesRemoved: { fg: "#ff0000" },
|
|
33
37
|
directory: { fg: "#ff7f00" },
|
|
34
38
|
version: { fg: "#9400d3" },
|
|
35
|
-
separator: { fg: "#888888" }
|
|
39
|
+
separator: { fg: "#888888" },
|
|
40
|
+
usage: { fg: "#00ffff" },
|
|
41
|
+
usageHigh: { fg: "#ffff00" },
|
|
42
|
+
usageCritical: { fg: "#ff0000", bold: true },
|
|
43
|
+
resetTime: { fg: "#ff7f00" }
|
|
36
44
|
}
|
|
37
45
|
};
|
|
38
46
|
var oceanTheme = {
|
|
@@ -50,7 +58,11 @@ var oceanTheme = {
|
|
|
50
58
|
linesRemoved: { fg: "#ff5252" },
|
|
51
59
|
directory: { fg: "#00bcd4" },
|
|
52
60
|
version: { fg: "#80deea" },
|
|
53
|
-
separator: { fg: "#37474f" }
|
|
61
|
+
separator: { fg: "#37474f" },
|
|
62
|
+
usage: { fg: "#26c6da" },
|
|
63
|
+
usageHigh: { fg: "#4dd0e1" },
|
|
64
|
+
usageCritical: { fg: "#ff5252", bold: true },
|
|
65
|
+
resetTime: { fg: "#0288d1" }
|
|
54
66
|
}
|
|
55
67
|
};
|
|
56
68
|
var minimalTheme = {
|
|
@@ -68,7 +80,11 @@ var minimalTheme = {
|
|
|
68
80
|
linesRemoved: { fg: "#e06c75" },
|
|
69
81
|
directory: { fg: "#888888" },
|
|
70
82
|
version: { fg: "#5c6370" },
|
|
71
|
-
separator: { fg: "#444444" }
|
|
83
|
+
separator: { fg: "#444444" },
|
|
84
|
+
usage: { fg: "#98c379" },
|
|
85
|
+
usageHigh: { fg: "#e5c07b" },
|
|
86
|
+
usageCritical: { fg: "#e06c75", bold: true },
|
|
87
|
+
resetTime: { fg: "#61afef" }
|
|
72
88
|
},
|
|
73
89
|
icons: {
|
|
74
90
|
model: "",
|
|
@@ -76,7 +92,9 @@ var minimalTheme = {
|
|
|
76
92
|
tokens: "",
|
|
77
93
|
duration: "",
|
|
78
94
|
lines: "",
|
|
79
|
-
directory: ""
|
|
95
|
+
directory: "",
|
|
96
|
+
usage: "",
|
|
97
|
+
resetTime: ""
|
|
80
98
|
}
|
|
81
99
|
};
|
|
82
100
|
var monochromeTheme = {
|
|
@@ -94,7 +112,11 @@ var monochromeTheme = {
|
|
|
94
112
|
linesRemoved: { fg: "#888888" },
|
|
95
113
|
directory: { fg: "#aaaaaa" },
|
|
96
114
|
version: { fg: "#666666" },
|
|
97
|
-
separator: { fg: "#444444" }
|
|
115
|
+
separator: { fg: "#444444" },
|
|
116
|
+
usage: { fg: "#bbbbbb" },
|
|
117
|
+
usageHigh: { fg: "#ffffff", bold: true },
|
|
118
|
+
usageCritical: { fg: "#ffffff", bold: true, underline: true },
|
|
119
|
+
resetTime: { fg: "#999999" }
|
|
98
120
|
},
|
|
99
121
|
icons: {
|
|
100
122
|
model: "",
|
|
@@ -102,7 +124,9 @@ var monochromeTheme = {
|
|
|
102
124
|
tokens: "",
|
|
103
125
|
duration: "",
|
|
104
126
|
lines: "",
|
|
105
|
-
directory: ""
|
|
127
|
+
directory: "",
|
|
128
|
+
usage: "",
|
|
129
|
+
resetTime: ""
|
|
106
130
|
}
|
|
107
131
|
};
|
|
108
132
|
var corporateTheme = {
|
|
@@ -120,7 +144,11 @@ var corporateTheme = {
|
|
|
120
144
|
linesRemoved: { fg: "#ef4444" },
|
|
121
145
|
directory: { fg: "#3b82f6" },
|
|
122
146
|
version: { fg: "#94a3b8" },
|
|
123
|
-
separator: { fg: "#334155" }
|
|
147
|
+
separator: { fg: "#334155" },
|
|
148
|
+
usage: { fg: "#22c55e" },
|
|
149
|
+
usageHigh: { fg: "#f59e0b" },
|
|
150
|
+
usageCritical: { fg: "#ef4444", bold: true },
|
|
151
|
+
resetTime: { fg: "#3b82f6" }
|
|
124
152
|
}
|
|
125
153
|
};
|
|
126
154
|
var themes = {
|
|
@@ -142,7 +170,9 @@ var nerdIcons = {
|
|
|
142
170
|
duration: "\u23F1",
|
|
143
171
|
lines: "\xB1",
|
|
144
172
|
directory: "",
|
|
145
|
-
version: ""
|
|
173
|
+
version: "",
|
|
174
|
+
usage: "\u{F04C5}",
|
|
175
|
+
resetTime: "\u{F051F}"
|
|
146
176
|
};
|
|
147
177
|
var unicodeIcons = {
|
|
148
178
|
model: "\u25C8",
|
|
@@ -152,7 +182,9 @@ var unicodeIcons = {
|
|
|
152
182
|
duration: "\u23F1",
|
|
153
183
|
lines: "\xB1",
|
|
154
184
|
directory: "\u{1F4C1}",
|
|
155
|
-
version: "v"
|
|
185
|
+
version: "v",
|
|
186
|
+
usage: "\u25B0",
|
|
187
|
+
resetTime: "\u27F3"
|
|
156
188
|
};
|
|
157
189
|
var asciiIcons = {
|
|
158
190
|
model: "*",
|
|
@@ -162,7 +194,9 @@ var asciiIcons = {
|
|
|
162
194
|
duration: "",
|
|
163
195
|
lines: "",
|
|
164
196
|
directory: "",
|
|
165
|
-
version: "v"
|
|
197
|
+
version: "v",
|
|
198
|
+
usage: "#",
|
|
199
|
+
resetTime: "~"
|
|
166
200
|
};
|
|
167
201
|
var detectedIconMode = null;
|
|
168
202
|
function detectIconSupport() {
|
|
@@ -275,7 +309,9 @@ var availableWidgets = [
|
|
|
275
309
|
"duration",
|
|
276
310
|
"lines",
|
|
277
311
|
"directory",
|
|
278
|
-
"version"
|
|
312
|
+
"version",
|
|
313
|
+
"usage",
|
|
314
|
+
"resetTime"
|
|
279
315
|
];
|
|
280
316
|
function renderWidget(widget, input, theme, config) {
|
|
281
317
|
switch (widget) {
|
|
@@ -295,6 +331,10 @@ function renderWidget(widget, input, theme, config) {
|
|
|
295
331
|
return renderDirectory(input, theme, config);
|
|
296
332
|
case "version":
|
|
297
333
|
return renderVersion(input, theme, config);
|
|
334
|
+
case "usage":
|
|
335
|
+
return renderUsage(input, theme, config);
|
|
336
|
+
case "resetTime":
|
|
337
|
+
return renderResetTime(input, theme, config);
|
|
298
338
|
default:
|
|
299
339
|
return { content: "", visible: false };
|
|
300
340
|
}
|
|
@@ -413,6 +453,106 @@ function renderVersion(input, theme, config) {
|
|
|
413
453
|
const content = applyStyle(text, theme.colors.version);
|
|
414
454
|
return { content, visible: true };
|
|
415
455
|
}
|
|
456
|
+
function renderUsage(input, theme, config) {
|
|
457
|
+
const sessionUsage = input.session_usage;
|
|
458
|
+
if (!sessionUsage) {
|
|
459
|
+
return { content: "", visible: false };
|
|
460
|
+
}
|
|
461
|
+
const { requests_used, requests_limit, usage_percentage, plan } = sessionUsage;
|
|
462
|
+
if (requests_used === void 0 && usage_percentage === void 0) {
|
|
463
|
+
return { content: "", visible: false };
|
|
464
|
+
}
|
|
465
|
+
const icon = getIcon("usage", theme, config.icons);
|
|
466
|
+
let percent = usage_percentage;
|
|
467
|
+
if (percent === void 0 && requests_used !== void 0 && requests_limit !== void 0 && requests_limit > 0) {
|
|
468
|
+
percent = requests_used / requests_limit * 100;
|
|
469
|
+
}
|
|
470
|
+
let text = "";
|
|
471
|
+
if (icon) {
|
|
472
|
+
text += `${icon} `;
|
|
473
|
+
}
|
|
474
|
+
if (percent !== void 0) {
|
|
475
|
+
const progressBar = renderUsageBar(percent, theme);
|
|
476
|
+
text += progressBar + " ";
|
|
477
|
+
}
|
|
478
|
+
if (requests_used !== void 0 && requests_limit !== void 0) {
|
|
479
|
+
text += `${requests_used}/${requests_limit}`;
|
|
480
|
+
} else if (percent !== void 0) {
|
|
481
|
+
text += `${Math.round(percent)}%`;
|
|
482
|
+
}
|
|
483
|
+
if (plan) {
|
|
484
|
+
text += ` (${plan})`;
|
|
485
|
+
}
|
|
486
|
+
let colorKey = "usage";
|
|
487
|
+
if (percent !== void 0) {
|
|
488
|
+
if (percent >= 90) {
|
|
489
|
+
colorKey = "usageCritical";
|
|
490
|
+
} else if (percent >= 70) {
|
|
491
|
+
colorKey = "usageHigh";
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
const style = theme.colors[colorKey] || theme.colors.usage;
|
|
495
|
+
const content = applyStyle(text.trim(), style);
|
|
496
|
+
return { content, visible: true };
|
|
497
|
+
}
|
|
498
|
+
function renderUsageBar(percentage, theme) {
|
|
499
|
+
const totalBars = 5;
|
|
500
|
+
const filledBars = Math.round(percentage / 100 * totalBars);
|
|
501
|
+
const emptyBars = totalBars - filledBars;
|
|
502
|
+
const filledChar = "\u25B0";
|
|
503
|
+
const emptyChar = "\u25B1";
|
|
504
|
+
let filledStyle = theme.colors.usage;
|
|
505
|
+
if (percentage >= 90) {
|
|
506
|
+
filledStyle = theme.colors.usageCritical || theme.colors.usage;
|
|
507
|
+
} else if (percentage >= 70) {
|
|
508
|
+
filledStyle = theme.colors.usageHigh || theme.colors.usage;
|
|
509
|
+
}
|
|
510
|
+
const filled = applyStyle(filledChar.repeat(filledBars), filledStyle);
|
|
511
|
+
const empty = applyStyle(emptyChar.repeat(emptyBars), { fg: "#444444", dim: true });
|
|
512
|
+
return `${filled}${empty}`;
|
|
513
|
+
}
|
|
514
|
+
function renderResetTime(input, theme, config) {
|
|
515
|
+
const sessionUsage = input.session_usage;
|
|
516
|
+
if (!sessionUsage) {
|
|
517
|
+
return { content: "", visible: false };
|
|
518
|
+
}
|
|
519
|
+
const { reset_at, reset_in_seconds } = sessionUsage;
|
|
520
|
+
if (reset_at === void 0 && reset_in_seconds === void 0) {
|
|
521
|
+
return { content: "", visible: false };
|
|
522
|
+
}
|
|
523
|
+
const icon = getIcon("resetTime", theme, config.icons);
|
|
524
|
+
let timeStr = "";
|
|
525
|
+
if (reset_in_seconds !== void 0) {
|
|
526
|
+
timeStr = formatResetDuration(reset_in_seconds);
|
|
527
|
+
} else if (reset_at) {
|
|
528
|
+
try {
|
|
529
|
+
const resetDate = new Date(reset_at);
|
|
530
|
+
const now = /* @__PURE__ */ new Date();
|
|
531
|
+
const diffSeconds = Math.max(0, Math.floor((resetDate.getTime() - now.getTime()) / 1e3));
|
|
532
|
+
timeStr = formatResetDuration(diffSeconds);
|
|
533
|
+
} catch {
|
|
534
|
+
timeStr = reset_at;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
const text = icon ? `${icon} ${timeStr}` : timeStr;
|
|
538
|
+
const content = applyStyle(text, theme.colors.resetTime);
|
|
539
|
+
return { content, visible: true };
|
|
540
|
+
}
|
|
541
|
+
function formatResetDuration(seconds) {
|
|
542
|
+
if (seconds <= 0) {
|
|
543
|
+
return "now";
|
|
544
|
+
}
|
|
545
|
+
const hours = Math.floor(seconds / 3600);
|
|
546
|
+
const minutes = Math.floor(seconds % 3600 / 60);
|
|
547
|
+
if (hours > 0) {
|
|
548
|
+
return minutes > 0 ? `${hours}h${minutes}m` : `${hours}h`;
|
|
549
|
+
}
|
|
550
|
+
if (minutes > 0) {
|
|
551
|
+
const secs = seconds % 60;
|
|
552
|
+
return secs > 0 ? `${minutes}m${secs}s` : `${minutes}m`;
|
|
553
|
+
}
|
|
554
|
+
return `${seconds}s`;
|
|
555
|
+
}
|
|
416
556
|
|
|
417
557
|
// src/formatter.ts
|
|
418
558
|
function formatStatusLine(input, config) {
|
|
@@ -463,6 +603,13 @@ var sampleStatusInput = {
|
|
|
463
603
|
cache_creation_input_tokens: 5e3,
|
|
464
604
|
cache_read_input_tokens: 2e3
|
|
465
605
|
}
|
|
606
|
+
},
|
|
607
|
+
session_usage: {
|
|
608
|
+
requests_used: 45,
|
|
609
|
+
requests_limit: 100,
|
|
610
|
+
usage_percentage: 45,
|
|
611
|
+
reset_in_seconds: 7200,
|
|
612
|
+
plan: "Pro"
|
|
466
613
|
}
|
|
467
614
|
};
|
|
468
615
|
|
|
@@ -504,6 +651,21 @@ var StatusInputSchema = z.object({
|
|
|
504
651
|
cache_creation_input_tokens: z.number().optional(),
|
|
505
652
|
cache_read_input_tokens: z.number().optional()
|
|
506
653
|
}).nullable().optional()
|
|
654
|
+
}).optional(),
|
|
655
|
+
// Session usage and rate limit information
|
|
656
|
+
session_usage: z.object({
|
|
657
|
+
// Number of requests/messages used in current session
|
|
658
|
+
requests_used: z.number().optional(),
|
|
659
|
+
// Maximum requests allowed in the session period
|
|
660
|
+
requests_limit: z.number().optional(),
|
|
661
|
+
// Percentage of session usage (0-100)
|
|
662
|
+
usage_percentage: z.number().optional(),
|
|
663
|
+
// ISO timestamp when the usage limit resets
|
|
664
|
+
reset_at: z.string().optional(),
|
|
665
|
+
// Seconds until reset
|
|
666
|
+
reset_in_seconds: z.number().optional(),
|
|
667
|
+
// Plan/tier name (e.g., "Pro", "Free", "Max")
|
|
668
|
+
plan: z.string().optional()
|
|
507
669
|
}).optional()
|
|
508
670
|
}).passthrough();
|
|
509
671
|
function parseStatusInput(input) {
|
|
@@ -525,6 +687,7 @@ function parseStatusInput(input) {
|
|
|
525
687
|
|
|
526
688
|
// src/config/loader.ts
|
|
527
689
|
import { cosmiconfig } from "cosmiconfig";
|
|
690
|
+
import { existsSync } from "fs";
|
|
528
691
|
|
|
529
692
|
// src/config/defaults.ts
|
|
530
693
|
var defaultWidgets = ["model", "context", "tokens", "cost"];
|
|
@@ -556,10 +719,33 @@ async function loadConfig(searchFrom) {
|
|
|
556
719
|
if (result && result.config) {
|
|
557
720
|
return mergeConfig(defaultConfig, result.config);
|
|
558
721
|
}
|
|
722
|
+
const globalPath = getConfigPath("global");
|
|
723
|
+
if (existsSync(globalPath)) {
|
|
724
|
+
const globalResult = await explorer.load(globalPath);
|
|
725
|
+
if (globalResult && globalResult.config) {
|
|
726
|
+
return mergeConfig(defaultConfig, globalResult.config);
|
|
727
|
+
}
|
|
728
|
+
}
|
|
559
729
|
} catch {
|
|
560
730
|
}
|
|
561
731
|
return { ...defaultConfig };
|
|
562
732
|
}
|
|
733
|
+
async function loadConfigForScope(scope) {
|
|
734
|
+
const configPath = getConfigPath(scope);
|
|
735
|
+
if (scope === "global") {
|
|
736
|
+
if (existsSync(configPath)) {
|
|
737
|
+
try {
|
|
738
|
+
const result = await explorer.load(configPath);
|
|
739
|
+
if (result && result.config) {
|
|
740
|
+
return mergeConfig(defaultConfig, result.config);
|
|
741
|
+
}
|
|
742
|
+
} catch {
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
return { ...defaultConfig };
|
|
746
|
+
}
|
|
747
|
+
return loadConfig();
|
|
748
|
+
}
|
|
563
749
|
function mergeConfig(defaults, userConfig) {
|
|
564
750
|
return {
|
|
565
751
|
theme: userConfig.theme ?? defaults.theme,
|
|
@@ -570,9 +756,16 @@ function mergeConfig(defaults, userConfig) {
|
|
|
570
756
|
customTheme: userConfig.customTheme
|
|
571
757
|
};
|
|
572
758
|
}
|
|
759
|
+
function getConfigPath(scope) {
|
|
760
|
+
if (scope === "local") {
|
|
761
|
+
return ".ccslrc.json";
|
|
762
|
+
}
|
|
763
|
+
const home = process.env.HOME || process.env.USERPROFILE || "~";
|
|
764
|
+
return `${home}/.config/ccsl/config.json`;
|
|
765
|
+
}
|
|
573
766
|
|
|
574
767
|
// src/config/claude.ts
|
|
575
|
-
import { readFileSync, writeFileSync, existsSync, mkdirSync, copyFileSync } from "fs";
|
|
768
|
+
import { readFileSync, writeFileSync, existsSync as existsSync2, mkdirSync, copyFileSync } from "fs";
|
|
576
769
|
import { dirname, join } from "path";
|
|
577
770
|
import { homedir } from "os";
|
|
578
771
|
function getClaudeSettingsPath() {
|
|
@@ -581,7 +774,7 @@ function getClaudeSettingsPath() {
|
|
|
581
774
|
}
|
|
582
775
|
function getClaudeSettings() {
|
|
583
776
|
const settingsPath = getClaudeSettingsPath();
|
|
584
|
-
if (!
|
|
777
|
+
if (!existsSync2(settingsPath)) {
|
|
585
778
|
return null;
|
|
586
779
|
}
|
|
587
780
|
try {
|
|
@@ -594,11 +787,11 @@ function getClaudeSettings() {
|
|
|
594
787
|
function installToClaudeSettings(command = "npx @vimukthid/ccsl") {
|
|
595
788
|
const settingsPath = getClaudeSettingsPath();
|
|
596
789
|
const dir = dirname(settingsPath);
|
|
597
|
-
if (!
|
|
790
|
+
if (!existsSync2(dir)) {
|
|
598
791
|
mkdirSync(dir, { recursive: true });
|
|
599
792
|
}
|
|
600
793
|
let settings = {};
|
|
601
|
-
if (
|
|
794
|
+
if (existsSync2(settingsPath)) {
|
|
602
795
|
try {
|
|
603
796
|
const content = readFileSync(settingsPath, "utf8");
|
|
604
797
|
settings = JSON.parse(content);
|
|
@@ -619,7 +812,7 @@ function installToClaudeSettings(command = "npx @vimukthid/ccsl") {
|
|
|
619
812
|
}
|
|
620
813
|
function uninstallFromClaudeSettings() {
|
|
621
814
|
const settingsPath = getClaudeSettingsPath();
|
|
622
|
-
if (!
|
|
815
|
+
if (!existsSync2(settingsPath)) {
|
|
623
816
|
return true;
|
|
624
817
|
}
|
|
625
818
|
try {
|
|
@@ -646,9 +839,11 @@ export {
|
|
|
646
839
|
defaultConfig,
|
|
647
840
|
formatStatusLine,
|
|
648
841
|
getClaudeSettingsPath,
|
|
842
|
+
getConfigPath,
|
|
649
843
|
installToClaudeSettings,
|
|
650
844
|
isInstalledInClaude,
|
|
651
845
|
loadConfig,
|
|
846
|
+
loadConfigForScope,
|
|
652
847
|
parseStatusInput,
|
|
653
848
|
sampleStatusInput,
|
|
654
849
|
themeNames,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/themes/index.ts","../src/utils/icons.ts","../src/utils/colors.ts","../src/utils/format.ts","../src/widgets/index.ts","../src/formatter.ts","../src/parser.ts","../src/config/loader.ts","../src/config/defaults.ts","../src/config/claude.ts"],"sourcesContent":["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}\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 },\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 },\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 },\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 },\n icons: {\n model: \"\",\n context: \"\",\n tokens: \"\",\n duration: \"\",\n lines: \"\",\n directory: \"\",\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 },\n icons: {\n model: \"\",\n context: \"\",\n tokens: \"\",\n duration: \"\",\n lines: \"\",\n directory: \"\",\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 },\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\nconst nerdIcons: Record<IconKey, string> = {\n model: \"◈\",\n context: \"◐\",\n tokens: \"\",\n cost: \"$\",\n duration: \"⏱\",\n lines: \"±\",\n directory: \"\",\n version: \"\",\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};\n\nconst asciiIcons: Record<IconKey, string> = {\n model: \"*\",\n context: \"%\",\n tokens: \"\",\n cost: \"$\",\n duration: \"\",\n lines: \"\",\n directory: \"\",\n version: \"v\",\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\nexport const availableWidgets: WidgetType[] = [\n \"model\",\n \"context\",\n \"tokens\",\n \"cost\",\n \"duration\",\n \"lines\",\n \"directory\",\n \"version\",\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 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","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};\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 })\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","import { cosmiconfig } from \"cosmiconfig\";\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 } catch {\n // Config loading failed, use defaults\n }\n\n return { ...defaultConfig };\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 { 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 { 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"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/themes/index.ts","../src/utils/icons.ts","../src/utils/colors.ts","../src/utils/format.ts","../src/widgets/index.ts","../src/formatter.ts","../src/parser.ts","../src/config/loader.ts","../src/config/defaults.ts","../src/config/claude.ts"],"sourcesContent":["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 { 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","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 { 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 { 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"],"mappings":";AA8BA,IAAM,YAAmB;AAAA,EACvB,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,OAAO,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,IACnC,SAAS,EAAE,IAAI,UAAU;AAAA,IACzB,aAAa,EAAE,IAAI,UAAU;AAAA,IAC7B,iBAAiB,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,IAC7C,QAAQ,EAAE,IAAI,UAAU;AAAA,IACxB,MAAM,EAAE,IAAI,UAAU;AAAA,IACtB,UAAU,EAAE,IAAI,UAAU;AAAA,IAC1B,OAAO,EAAE,IAAI,UAAU;AAAA,IACvB,YAAY,EAAE,IAAI,UAAU;AAAA,IAC5B,cAAc,EAAE,IAAI,UAAU;AAAA,IAC9B,WAAW,EAAE,IAAI,UAAU;AAAA,IAC3B,SAAS,EAAE,IAAI,UAAU;AAAA,IACzB,WAAW,EAAE,IAAI,UAAU;AAAA,IAC3B,OAAO,EAAE,IAAI,UAAU;AAAA,IACvB,WAAW,EAAE,IAAI,UAAU;AAAA,IAC3B,eAAe,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,IAC3C,WAAW,EAAE,IAAI,UAAU;AAAA,EAC7B;AACF;AAGA,IAAM,eAAsB;AAAA,EAC1B,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,OAAO,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,IACnC,SAAS,EAAE,IAAI,UAAU;AAAA,IACzB,aAAa,EAAE,IAAI,UAAU;AAAA,IAC7B,iBAAiB,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,IAC7C,QAAQ,EAAE,IAAI,UAAU;AAAA,IACxB,MAAM,EAAE,IAAI,UAAU;AAAA,IACtB,UAAU,EAAE,IAAI,UAAU;AAAA,IAC1B,OAAO,EAAE,IAAI,UAAU;AAAA,IACvB,YAAY,EAAE,IAAI,UAAU;AAAA,IAC5B,cAAc,EAAE,IAAI,UAAU;AAAA,IAC9B,WAAW,EAAE,IAAI,UAAU;AAAA,IAC3B,SAAS,EAAE,IAAI,UAAU;AAAA,IACzB,WAAW,EAAE,IAAI,UAAU;AAAA,IAC3B,OAAO,EAAE,IAAI,UAAU;AAAA,IACvB,WAAW,EAAE,IAAI,UAAU;AAAA,IAC3B,eAAe,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,IAC3C,WAAW,EAAE,IAAI,UAAU;AAAA,EAC7B;AACF;AAGA,IAAM,aAAoB;AAAA,EACxB,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,OAAO,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,IACnC,SAAS,EAAE,IAAI,UAAU;AAAA,IACzB,aAAa,EAAE,IAAI,UAAU;AAAA,IAC7B,iBAAiB,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,IAC7C,QAAQ,EAAE,IAAI,UAAU;AAAA,IACxB,MAAM,EAAE,IAAI,UAAU;AAAA,IACtB,UAAU,EAAE,IAAI,UAAU;AAAA,IAC1B,OAAO,EAAE,IAAI,UAAU;AAAA,IACvB,YAAY,EAAE,IAAI,UAAU;AAAA,IAC5B,cAAc,EAAE,IAAI,UAAU;AAAA,IAC9B,WAAW,EAAE,IAAI,UAAU;AAAA,IAC3B,SAAS,EAAE,IAAI,UAAU;AAAA,IACzB,WAAW,EAAE,IAAI,UAAU;AAAA,IAC3B,OAAO,EAAE,IAAI,UAAU;AAAA,IACvB,WAAW,EAAE,IAAI,UAAU;AAAA,IAC3B,eAAe,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,IAC3C,WAAW,EAAE,IAAI,UAAU;AAAA,EAC7B;AACF;AAGA,IAAM,eAAsB;AAAA,EAC1B,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,OAAO,EAAE,IAAI,UAAU;AAAA,IACvB,SAAS,EAAE,IAAI,UAAU;AAAA,IACzB,aAAa,EAAE,IAAI,UAAU;AAAA,IAC7B,iBAAiB,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,IAC7C,QAAQ,EAAE,IAAI,WAAW,KAAK,KAAK;AAAA,IACnC,MAAM,EAAE,IAAI,UAAU;AAAA,IACtB,UAAU,EAAE,IAAI,WAAW,KAAK,KAAK;AAAA,IACrC,OAAO,EAAE,IAAI,UAAU;AAAA,IACvB,YAAY,EAAE,IAAI,UAAU;AAAA,IAC5B,cAAc,EAAE,IAAI,UAAU;AAAA,IAC9B,WAAW,EAAE,IAAI,UAAU;AAAA,IAC3B,SAAS,EAAE,IAAI,UAAU;AAAA,IACzB,WAAW,EAAE,IAAI,UAAU;AAAA,IAC3B,OAAO,EAAE,IAAI,UAAU;AAAA,IACvB,WAAW,EAAE,IAAI,UAAU;AAAA,IAC3B,eAAe,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,IAC3C,WAAW,EAAE,IAAI,UAAU;AAAA,EAC7B;AAAA,EACA,OAAO;AAAA,IACL,OAAO;AAAA,IACP,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,IACP,WAAW;AAAA,IACX,OAAO;AAAA,IACP,WAAW;AAAA,EACb;AACF;AAGA,IAAM,kBAAyB;AAAA,EAC7B,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,OAAO,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,IACnC,SAAS,EAAE,IAAI,UAAU;AAAA,IACzB,aAAa,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,IACzC,iBAAiB,EAAE,IAAI,WAAW,MAAM,MAAM,WAAW,KAAK;AAAA,IAC9D,QAAQ,EAAE,IAAI,UAAU;AAAA,IACxB,MAAM,EAAE,IAAI,UAAU;AAAA,IACtB,UAAU,EAAE,IAAI,UAAU;AAAA,IAC1B,OAAO,EAAE,IAAI,UAAU;AAAA,IACvB,YAAY,EAAE,IAAI,UAAU;AAAA,IAC5B,cAAc,EAAE,IAAI,UAAU;AAAA,IAC9B,WAAW,EAAE,IAAI,UAAU;AAAA,IAC3B,SAAS,EAAE,IAAI,UAAU;AAAA,IACzB,WAAW,EAAE,IAAI,UAAU;AAAA,IAC3B,OAAO,EAAE,IAAI,UAAU;AAAA,IACvB,WAAW,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,IACvC,eAAe,EAAE,IAAI,WAAW,MAAM,MAAM,WAAW,KAAK;AAAA,IAC5D,WAAW,EAAE,IAAI,UAAU;AAAA,EAC7B;AAAA,EACA,OAAO;AAAA,IACL,OAAO;AAAA,IACP,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,IACP,WAAW;AAAA,IACX,OAAO;AAAA,IACP,WAAW;AAAA,EACb;AACF;AAGA,IAAM,iBAAwB;AAAA,EAC5B,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,OAAO,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,IACnC,SAAS,EAAE,IAAI,UAAU;AAAA,IACzB,aAAa,EAAE,IAAI,UAAU;AAAA,IAC7B,iBAAiB,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,IAC7C,QAAQ,EAAE,IAAI,UAAU;AAAA,IACxB,MAAM,EAAE,IAAI,UAAU;AAAA,IACtB,UAAU,EAAE,IAAI,UAAU;AAAA,IAC1B,OAAO,EAAE,IAAI,UAAU;AAAA,IACvB,YAAY,EAAE,IAAI,UAAU;AAAA,IAC5B,cAAc,EAAE,IAAI,UAAU;AAAA,IAC9B,WAAW,EAAE,IAAI,UAAU;AAAA,IAC3B,SAAS,EAAE,IAAI,UAAU;AAAA,IACzB,WAAW,EAAE,IAAI,UAAU;AAAA,IAC3B,OAAO,EAAE,IAAI,UAAU;AAAA,IACvB,WAAW,EAAE,IAAI,UAAU;AAAA,IAC3B,eAAe,EAAE,IAAI,WAAW,MAAM,KAAK;AAAA,IAC3C,WAAW,EAAE,IAAI,UAAU;AAAA,EAC7B;AACF;AAEO,IAAM,SAAgC;AAAA,EAC3C,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AACb;AAEO,IAAM,aAAa,OAAO,KAAK,MAAM;;;AC3L5C,IAAM,YAAqC;AAAA,EACzC,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AAAA,EACV,OAAO;AAAA,EACP,WAAW;AAAA,EACX,SAAS;AAAA,EACT,OAAO;AAAA,EACP,WAAW;AACb;AAEA,IAAM,eAAwC;AAAA,EAC5C,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AAAA,EACV,OAAO;AAAA,EACP,WAAW;AAAA,EACX,SAAS;AAAA,EACT,OAAO;AAAA,EACP,WAAW;AACb;AAEA,IAAM,aAAsC;AAAA,EAC1C,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AAAA,EACV,OAAO;AAAA,EACP,WAAW;AAAA,EACX,SAAS;AAAA,EACT,OAAO;AAAA,EACP,WAAW;AACb;AAEA,IAAI,mBAAoC;AAExC,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;;;AC5GA,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;;;ACpCO,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;;;AC9BA,OAAO,UAAU;AAcV,IAAM,mBAAiC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAOO,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,UAAU,KAAK,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;;;AClWO,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;AAGO,IAAM,oBAAiC;AAAA,EAC5C,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,cAAc;AAAA,EAChB;AAAA,EACA,WAAW;AAAA,IACT,aAAa;AAAA,IACb,aAAa;AAAA,EACf;AAAA,EACA,SAAS;AAAA,EACT,MAAM;AAAA,IACJ,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,uBAAuB;AAAA,IACvB,mBAAmB;AAAA,IACnB,qBAAqB;AAAA,EACvB;AAAA,EACA,gBAAgB;AAAA,IACd,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,iBAAiB;AAAA,IACjB,sBAAsB;AAAA,IACtB,eAAe;AAAA,MACb,cAAc;AAAA,MACd,eAAe;AAAA,MACf,6BAA6B;AAAA,MAC7B,yBAAyB;AAAA,IAC3B;AAAA,EACF;AAAA,EACA,eAAe;AAAA,IACb,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,MAAM;AAAA,EACR;AACF;;;ACvEA,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;;;AC/FA,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;;;ACEpB,IAAM,iBAA+B,CAAC,SAAS,WAAW,UAAU,MAAM;AAE1E,IAAM,gBAA4B;AAAA,EACvC,OAAO;AAAA,EACP,SAAS;AAAA,EACT,WAAW;AAAA,EACX,OAAO;AAAA,EACP,SAAS;AACX;;;ADKA,IAAM,WAAW,YAAY,QAAQ;AAAA,EACnC,cAAc;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF,CAAC;AAED,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;;;AE1GA,SAAS,cAAc,eAAe,cAAAA,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;AAkBO,SAAS,wBAAwB,UAAkB,uBAAgC;AACxF,QAAM,eAAe,sBAAsB;AAC3C,QAAM,MAAM,QAAQ,YAAY;AAGhC,MAAI,CAACC,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;","names":["existsSync","existsSync"]}
|