lumira 0.7.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -10
- package/dist/config.js +39 -5
- package/dist/config.js.map +1 -1
- package/dist/normalize.d.ts +11 -1
- package/dist/normalize.js +49 -7
- package/dist/normalize.js.map +1 -1
- package/dist/parsers/token-speed.d.ts +1 -1
- package/dist/parsers/token-speed.js.map +1 -1
- package/dist/render/colors.d.ts +13 -1
- package/dist/render/colors.js +17 -6
- package/dist/render/colors.js.map +1 -1
- package/dist/render/icons.d.ts +20 -0
- package/dist/render/icons.js +82 -30
- package/dist/render/icons.js.map +1 -1
- package/dist/render/line1.js +14 -1
- package/dist/render/line1.js.map +1 -1
- package/dist/render/line2.js +56 -37
- package/dist/render/line2.js.map +1 -1
- package/dist/render/line3.js +1 -1
- package/dist/render/minimal.js +7 -1
- package/dist/render/minimal.js.map +1 -1
- package/dist/render/powerline-line1.js +28 -1
- package/dist/render/powerline-line1.js.map +1 -1
- package/dist/render/powerline-line2.js +23 -13
- package/dist/render/powerline-line2.js.map +1 -1
- package/dist/render/shared.d.ts +11 -1
- package/dist/render/shared.js +16 -6
- package/dist/render/shared.js.map +1 -1
- package/dist/render/text.js +9 -0
- package/dist/render/text.js.map +1 -1
- package/dist/types.d.ts +23 -1
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -1
- package/dist/utils/terminal.js +7 -1
- package/dist/utils/terminal.js.map +1 -1
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -24,7 +24,7 @@ Interactive wizard — preset, theme, icons — previewed live before write.
|
|
|
24
24
|

|
|
25
25
|

|
|
26
26
|
|
|
27
|
-
>
|
|
27
|
+
> 1,700+ downloads in the first month — [share your setup](https://github.com/cativo23/lumira/discussions) in Discussions.
|
|
28
28
|
|
|
29
29
|
## Table of contents
|
|
30
30
|
|
|
@@ -47,16 +47,16 @@ Claude Code's default statusline shows the model name and current directory. Tha
|
|
|
47
47
|
|
|
48
48
|
- **Context-window pressure** — color-coded bar from green to blinking red, with a `/compact?` hint at high fill so you act before hitting the wall.
|
|
49
49
|
- **Burn rate** — `$/h` next to total cost, so a runaway agent shows up immediately.
|
|
50
|
-
- **Rate-limit
|
|
50
|
+
- **Rate-limit battery** — 5h/7d usage shows as a Nerd Font battery glyph (or 🔋/🪫 in emoji mode) that fills as you consume quota, with a reset countdown above 70%. Hidden below 50% to keep the line uncluttered when you have margin.
|
|
51
51
|
- **Active tools, agents, and todo progress** — parsed from the live transcript, updated every render.
|
|
52
52
|
- **Cross-platform** — same config drives Claude Code and Qwen Code; Qwen sessions auto-collapse to single-line.
|
|
53
53
|
|
|
54
|
-
Inspired by [claude-hud](https://github.com/jarrodwatts/claude-hud); takes a different stance on opt-in powerline rendering, theme contrast guarantees, and
|
|
54
|
+
Inspired by [claude-hud](https://github.com/jarrodwatts/claude-hud); takes a different stance on opt-in powerline rendering, theme contrast guarantees, and Qwen Code compatibility.
|
|
55
55
|
|
|
56
56
|
## Requirements
|
|
57
57
|
|
|
58
58
|
- **Node ≥18**
|
|
59
|
-
- **Nerd Font** (recommended) — for
|
|
59
|
+
- **Nerd Font** (recommended) — for branch, folder, model, and spinner icons. Falls back to plain glyphs via `icons: emoji` or `icons: none`.
|
|
60
60
|
- **Truecolor terminal** (for themes / powerline) — auto-detected via `COLORTERM=truecolor`. 256-color terminals get a nearest-index projection; named-ANSI terminals fall back to default colors silently.
|
|
61
61
|
|
|
62
62
|
## Features
|
|
@@ -74,7 +74,7 @@ Inspired by [claude-hud](https://github.com/jarrodwatts/claude-hud); takes a dif
|
|
|
74
74
|
<summary>Everything else lumira shows</summary>
|
|
75
75
|
|
|
76
76
|
- **Git status** — branch + staged/modified/untracked counts, 5s TTL cache. Branch turns red on dirty repos in powerline mode.
|
|
77
|
-
- **Rate limits** — 5h/7d usage with color
|
|
77
|
+
- **Rate limits** — 5h/7d usage as a battery glyph (Nerd Font level fill, or 🔋/🪫 in emoji mode) with color tier and reset countdown. Threshold-gated at 50% to stay invisible while you have margin.
|
|
78
78
|
- **Active agents** — running subagent count and types from the transcript.
|
|
79
79
|
- **GSD integration** — current task and update notifications (opt-in).
|
|
80
80
|
- **Config health widget** — surfaces silent fallbacks (theme/powerline degrading in named-ANSI, missing GSD STATE.md). Opt-in.
|
|
@@ -253,13 +253,19 @@ Create `~/.config/lumira/config.json`:
|
|
|
253
253
|
"version": true,
|
|
254
254
|
"linesChanged": true,
|
|
255
255
|
"memory": true,
|
|
256
|
-
"health": false
|
|
256
|
+
"health": false,
|
|
257
|
+
"contextWarningThreshold": 70,
|
|
258
|
+
"contextCriticalThreshold": 85
|
|
257
259
|
}
|
|
258
260
|
}
|
|
259
261
|
```
|
|
260
262
|
|
|
261
263
|
All fields are optional — defaults are shown above. `display.health` defaults to `false` (opt-in widget).
|
|
262
264
|
|
|
265
|
+
**Context bar thresholds** — `contextWarningThreshold` (default 70) and `contextCriticalThreshold` (default 85) control when the bar transitions through yellow/orange/red. Both are clamped to `[0, 100]` and `warning < critical` is required (invalid pairs fall back to defaults with a one-shot stderr warning). Lower them for earlier warnings, raise them if your workflow tolerates fuller buffers.
|
|
266
|
+
|
|
267
|
+
> **Migration note (post-0.7.1):** default color transitions shifted from `50/65/80` to `50/70/85`. The bar now stays yellow up to 70% (was 65%) and orange up to 85% (was 80%) before flashing red. To restore the previous behavior, set `"contextWarningThreshold": 65, "contextCriticalThreshold": 80` in your config.
|
|
268
|
+
|
|
263
269
|
### CLI Flags
|
|
264
270
|
|
|
265
271
|
```bash
|
|
@@ -314,15 +320,15 @@ PRs welcome — particularly for new themes (one of the most common contribution
|
|
|
314
320
|
|
|
315
321
|
### What's next
|
|
316
322
|
|
|
317
|
-
- **
|
|
318
|
-
- **
|
|
319
|
-
- **Backlog** — incremental transcript parsing for very large sessions (
|
|
323
|
+
- **v1.0** — soak window on v0.7.x, then tagging stable. CLI flags, preset names, and config schema are considered frozen from this point.
|
|
324
|
+
- **Themes** — community theme contributions welcome via the theme PR template.
|
|
325
|
+
- **Backlog** — incremental transcript parsing for very large sessions (deferred; full re-parse stays under budget for real-world transcripts).
|
|
320
326
|
|
|
321
327
|
For security issues, see [SECURITY.md](SECURITY.md).
|
|
322
328
|
|
|
323
329
|
## Credits
|
|
324
330
|
|
|
325
|
-
|
|
331
|
+
Migrated from [claude-setup](https://github.com/cativo23/claude-setup) statusline.
|
|
326
332
|
|
|
327
333
|
Theme palettes drawn from upstream specs: [Dracula](https://draculatheme.com), [Nord](https://www.nordtheme.com), [Tokyo Night](https://github.com/folke/tokyonight.nvim), [Catppuccin](https://catppuccin.com), [Monokai](https://monokai.pro), [Gruvbox](https://github.com/morhetz/gruvbox), [Solarized](https://ethanschoonover.com/solarized).
|
|
328
334
|
|
package/dist/config.js
CHANGED
|
@@ -1,13 +1,39 @@
|
|
|
1
1
|
import { readFileSync, existsSync, writeFileSync, renameSync, mkdirSync } from 'node:fs';
|
|
2
2
|
import { join, dirname } from 'node:path';
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
|
-
import { DEFAULT_CONFIG, DEFAULT_DISPLAY, POWERLINE_STYLE_NAMES } from './types.js';
|
|
4
|
+
import { DEFAULT_CONFIG, DEFAULT_DISPLAY, DEFAULT_CONTEXT_WARNING_THRESHOLD, DEFAULT_CONTEXT_CRITICAL_THRESHOLD, POWERLINE_STYLE_NAMES } from './types.js';
|
|
5
5
|
// Module-level flag: fires the qwen→minimal deprecation warning once per
|
|
6
6
|
// Node process. Process-scoped by design — tests must run in forked workers
|
|
7
7
|
// (see vitest.config.ts `pool: 'forks'`). Issue #20.
|
|
8
8
|
let qwenWarningShown = false;
|
|
9
|
+
let thresholdWarningShown = false;
|
|
9
10
|
/** Test-only — resets the process-scoped qwenWarningShown flag. Do not call in production. */
|
|
10
|
-
export function _resetMigrationFlags() { qwenWarningShown = false; }
|
|
11
|
+
export function _resetMigrationFlags() { qwenWarningShown = false; thresholdWarningShown = false; }
|
|
12
|
+
const clampPct = (n) => Math.max(0, Math.min(100, n));
|
|
13
|
+
/**
|
|
14
|
+
* Validate context-bar threshold pair. Clamps each to [0, 100]. If `warning`
|
|
15
|
+
* is not strictly less than `critical` after clamping, emits a one-shot warn
|
|
16
|
+
* to stderr and returns the defaults (70/85). Falls back to defaults if a
|
|
17
|
+
* value is missing or non-finite.
|
|
18
|
+
*/
|
|
19
|
+
function resolveThresholds(rawWarn, rawCrit) {
|
|
20
|
+
const hasWarn = typeof rawWarn === 'number' && Number.isFinite(rawWarn);
|
|
21
|
+
const hasCrit = typeof rawCrit === 'number' && Number.isFinite(rawCrit);
|
|
22
|
+
if (!hasWarn && !hasCrit) {
|
|
23
|
+
return { warning: DEFAULT_CONTEXT_WARNING_THRESHOLD, critical: DEFAULT_CONTEXT_CRITICAL_THRESHOLD };
|
|
24
|
+
}
|
|
25
|
+
const warning = hasWarn ? clampPct(rawWarn) : DEFAULT_CONTEXT_WARNING_THRESHOLD;
|
|
26
|
+
const critical = hasCrit ? clampPct(rawCrit) : DEFAULT_CONTEXT_CRITICAL_THRESHOLD;
|
|
27
|
+
if (warning >= critical) {
|
|
28
|
+
if (!thresholdWarningShown) {
|
|
29
|
+
process.stderr.write(`[lumira] context thresholds invalid (warning=${warning}, critical=${critical}); ` +
|
|
30
|
+
`falling back to defaults (${DEFAULT_CONTEXT_WARNING_THRESHOLD}/${DEFAULT_CONTEXT_CRITICAL_THRESHOLD})\n`);
|
|
31
|
+
thresholdWarningShown = true;
|
|
32
|
+
}
|
|
33
|
+
return { warning: DEFAULT_CONTEXT_WARNING_THRESHOLD, critical: DEFAULT_CONTEXT_CRITICAL_THRESHOLD };
|
|
34
|
+
}
|
|
35
|
+
return { warning, critical };
|
|
36
|
+
}
|
|
11
37
|
export function loadConfig(configDir = join(homedir(), '.config', 'lumira')) {
|
|
12
38
|
const p = join(configDir, 'config.json');
|
|
13
39
|
if (!existsSync(p))
|
|
@@ -43,10 +69,14 @@ function mergeConfig(rawIn) {
|
|
|
43
69
|
applyPreset(result, raw.preset);
|
|
44
70
|
// Then overlay user's explicit display toggles (user wins over preset)
|
|
45
71
|
if (raw.display && typeof raw.display === 'object') {
|
|
72
|
+
const rawDisplay = raw.display;
|
|
46
73
|
for (const k of Object.keys(DEFAULT_DISPLAY)) {
|
|
47
|
-
if (typeof
|
|
48
|
-
result.display[k] =
|
|
74
|
+
if (typeof rawDisplay[k] === 'boolean')
|
|
75
|
+
result.display[k] = rawDisplay[k];
|
|
49
76
|
}
|
|
77
|
+
const { warning, critical } = resolveThresholds(rawDisplay.contextWarningThreshold, rawDisplay.contextCriticalThreshold);
|
|
78
|
+
result.display.contextWarningThreshold = warning;
|
|
79
|
+
result.display.contextCriticalThreshold = critical;
|
|
50
80
|
}
|
|
51
81
|
if (typeof raw.theme === 'string' && raw.theme.length > 0)
|
|
52
82
|
result.theme = raw.theme;
|
|
@@ -112,8 +142,12 @@ export function applyPreset(r, preset) {
|
|
|
112
142
|
const def = PRESET_DEFS[preset];
|
|
113
143
|
r.preset = preset;
|
|
114
144
|
r.layout = def.layout;
|
|
145
|
+
// PRESET_DEFS only set boolean toggles — threshold numbers are not
|
|
146
|
+
// overridable via preset. The runtime guard keeps the cast narrow and
|
|
147
|
+
// catches accidental non-boolean entries in PRESET_DEFS.
|
|
115
148
|
for (const [k, v] of Object.entries(def.display)) {
|
|
116
|
-
|
|
149
|
+
if (typeof v === 'boolean')
|
|
150
|
+
r.display[k] = v;
|
|
117
151
|
}
|
|
118
152
|
}
|
|
119
153
|
export function mergeCliFlags(config, argv) {
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,qBAAqB,EAAyD,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/normalize.d.ts
CHANGED
|
@@ -49,6 +49,8 @@ export interface NormalizedInput {
|
|
|
49
49
|
agentName?: string;
|
|
50
50
|
/** Worktree name */
|
|
51
51
|
worktreeName?: string;
|
|
52
|
+
/** Reasoning effort level (≥ 2.1.x stdin, falls back to transcript regex) */
|
|
53
|
+
effortLevel?: string;
|
|
52
54
|
/** Rate limits (Claude only) */
|
|
53
55
|
rateLimits?: {
|
|
54
56
|
fiveHour?: {
|
|
@@ -65,6 +67,14 @@ export interface NormalizedInput {
|
|
|
65
67
|
/** Escape hatch: access raw platform data for platform-specific widgets */
|
|
66
68
|
raw: RawInput;
|
|
67
69
|
}
|
|
68
|
-
/**
|
|
70
|
+
/**
|
|
71
|
+
* Strip terminal control characters and bidirectional/zero-width Unicode from
|
|
72
|
+
* untrusted strings.
|
|
73
|
+
* - C0/C1 + DEL — escape sequences, ANSI, etc.
|
|
74
|
+
* - U+200B-200F — zero-width and LTR/RTL marks
|
|
75
|
+
* - U+202A-202E — explicit directional embedding/overrides (visual spoofing)
|
|
76
|
+
* - U+2028/2029 — line/paragraph separators
|
|
77
|
+
* - U+2066-2069 — directional isolates
|
|
78
|
+
*/
|
|
69
79
|
export declare function sanitizeTermString(s: string): string;
|
|
70
80
|
export declare function normalize(input: RawInput): NormalizedInput;
|
package/dist/normalize.js
CHANGED
|
@@ -13,10 +13,20 @@ export function isQwenInput(input) {
|
|
|
13
13
|
const first = Object.values(models)[0];
|
|
14
14
|
return first != null && typeof first === 'object' && 'api' in first;
|
|
15
15
|
}
|
|
16
|
-
/**
|
|
16
|
+
/**
|
|
17
|
+
* Strip terminal control characters and bidirectional/zero-width Unicode from
|
|
18
|
+
* untrusted strings.
|
|
19
|
+
* - C0/C1 + DEL — escape sequences, ANSI, etc.
|
|
20
|
+
* - U+200B-200F — zero-width and LTR/RTL marks
|
|
21
|
+
* - U+202A-202E — explicit directional embedding/overrides (visual spoofing)
|
|
22
|
+
* - U+2028/2029 — line/paragraph separators
|
|
23
|
+
* - U+2066-2069 — directional isolates
|
|
24
|
+
*/
|
|
17
25
|
export function sanitizeTermString(s) {
|
|
18
|
-
return s.replace(/[\x00-\x1f\x7f-\x9f]/g, '');
|
|
26
|
+
return s.replace(/[\x00-\x1f\x7f-\x9f\u200b-\u200f\u202a-\u202e\u2028\u2029\u2066-\u2069]/g, '');
|
|
19
27
|
}
|
|
28
|
+
/** Allowed values for the reasoning effort level field (CC ≥ 2.1.x). */
|
|
29
|
+
const VALID_EFFORT_LEVELS = new Set(['low', 'medium', 'high', 'xhigh', 'max']);
|
|
20
30
|
export function normalize(input) {
|
|
21
31
|
const platform = isQwenInput(input) ? 'qwen-code' : 'claude-code';
|
|
22
32
|
const qwen = isQwenInput(input) ? input : null;
|
|
@@ -40,7 +50,33 @@ export function normalize(input) {
|
|
|
40
50
|
}
|
|
41
51
|
}
|
|
42
52
|
else if (claude) {
|
|
43
|
-
|
|
53
|
+
// Modern Claude Code (≥ 2.1.x) nests cache fields under current_usage.
|
|
54
|
+
// Fall back to the legacy top-level path for older payloads.
|
|
55
|
+
const cu = claude.context_window?.current_usage;
|
|
56
|
+
const nested = typeof cu === 'object' ? cu?.cache_read_input_tokens : undefined;
|
|
57
|
+
cached = nested ?? claude.context_window?.cache_read_input_tokens;
|
|
58
|
+
}
|
|
59
|
+
// Per-turn cache denominator (Claude only): fresh input + cache_read + cache_creation
|
|
60
|
+
// for the current turn. Used to compute a meaningful cache hit rate, since
|
|
61
|
+
// `cached` is per-turn while `total_input_tokens` is cumulative across the session.
|
|
62
|
+
// Falls back to total_input_tokens for legacy payloads without current_usage.
|
|
63
|
+
let cacheTurnDenominator;
|
|
64
|
+
if (claude) {
|
|
65
|
+
const cu = claude.context_window?.current_usage;
|
|
66
|
+
if (typeof cu === 'object' && cu) {
|
|
67
|
+
const fresh = cu.input_tokens ?? 0;
|
|
68
|
+
const read = cu.cache_read_input_tokens ?? 0;
|
|
69
|
+
const create = cu.cache_creation_input_tokens ?? 0;
|
|
70
|
+
const total = fresh + read + create;
|
|
71
|
+
if (total > 0)
|
|
72
|
+
cacheTurnDenominator = total;
|
|
73
|
+
}
|
|
74
|
+
// Legacy fallback: top-level totals (pre-2.1.x payloads, or current_usage
|
|
75
|
+
// without cache fields). The Math.min(100, ...) cap below protects against
|
|
76
|
+
// overflow when cache_read accumulates past total_input in long sessions.
|
|
77
|
+
if (cacheTurnDenominator == null && inputTokens > 0) {
|
|
78
|
+
cacheTurnDenominator = inputTokens;
|
|
79
|
+
}
|
|
44
80
|
}
|
|
45
81
|
// Performance (Qwen only)
|
|
46
82
|
let performance;
|
|
@@ -74,9 +110,10 @@ export function normalize(input) {
|
|
|
74
110
|
: undefined,
|
|
75
111
|
};
|
|
76
112
|
}
|
|
77
|
-
// Cache hit rate (Claude only)
|
|
78
|
-
|
|
79
|
-
|
|
113
|
+
// Cache hit rate (Claude only) — denominator is the current turn's total input
|
|
114
|
+
// (fresh + cache_read + cache_creation), not the cumulative session total.
|
|
115
|
+
const cacheHitRate = (cached != null && cached > 0 && cacheTurnDenominator && platform === 'claude-code')
|
|
116
|
+
? Math.min(100, Math.round((cached / cacheTurnDenominator) * 100))
|
|
80
117
|
: undefined;
|
|
81
118
|
return {
|
|
82
119
|
platform,
|
|
@@ -92,7 +129,9 @@ export function normalize(input) {
|
|
|
92
129
|
},
|
|
93
130
|
context: {
|
|
94
131
|
usedPercentage: input.context_window.used_percentage,
|
|
95
|
-
windowSize: qwen
|
|
132
|
+
windowSize: qwen
|
|
133
|
+
? qwen.context_window.context_window_size
|
|
134
|
+
: claude?.context_window?.context_window_size,
|
|
96
135
|
},
|
|
97
136
|
cost: claude ? claude.cost?.total_cost_usd : undefined,
|
|
98
137
|
durationMs: claude ? claude.cost?.total_duration_ms : undefined,
|
|
@@ -104,6 +143,9 @@ export function normalize(input) {
|
|
|
104
143
|
sessionName: input.session_name ? sanitizeTermString(input.session_name) : undefined,
|
|
105
144
|
outputStyle: input.output_style?.name ? sanitizeTermString(input.output_style.name) : undefined,
|
|
106
145
|
agentName: input.agent?.name ? sanitizeTermString(input.agent.name) : undefined,
|
|
146
|
+
effortLevel: claude?.effort?.level && VALID_EFFORT_LEVELS.has(claude.effort.level)
|
|
147
|
+
? sanitizeTermString(claude.effort.level)
|
|
148
|
+
: undefined,
|
|
107
149
|
worktreeName: input.worktree?.name ? sanitizeTermString(input.worktree.name) : undefined,
|
|
108
150
|
rateLimits,
|
|
109
151
|
cacheHitRate,
|
package/dist/normalize.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../src/normalize.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,EAAE;AACF,yDAAyD;AACzD,kDAAkD;AAClD,yDAAyD;AAIzD,MAAM,UAAU,WAAW,CAAC,KAAe;IACzC,MAAM,GAAG,GAAG,KAA2C,CAAC;IACxD,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAChG,MAAM,MAAM,GAAI,GAAG,CAAC,OAAgD,CAAC,MAAM,CAAC;IAC5E,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACxD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,OAAO,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,IAAI,KAAK,CAAC;AACtE,CAAC;
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../src/normalize.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ interface ContextWindow {
|
|
|
2
2
|
used_percentage: number;
|
|
3
3
|
remaining_percentage: number;
|
|
4
4
|
current_usage?: number | {
|
|
5
|
-
output_tokens
|
|
5
|
+
output_tokens?: number;
|
|
6
6
|
};
|
|
7
7
|
}
|
|
8
8
|
export declare function getTokenSpeed(contextWindow: ContextWindow, cacheDir?: string): number | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-speed.js","sourceRoot":"","sources":["../../src/parsers/token-speed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,MAAM,eAAe,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"token-speed.js","sourceRoot":"","sources":["../../src/parsers/token-speed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,MAAM,eAAe,GAAG,IAAI,CAAC;AAO7B,MAAM,UAAU,aAAa,CAAC,aAA4B,EAAE,WAAmB,MAAM,EAAE;IACrF,MAAM,EAAE,GAAG,aAAa,EAAE,aAAa,CAAC;IACxC,MAAM,YAAY,GAAG,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,aAAa,CAAC;IACrE,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,YAAY,CAAa,OAAO,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;IAE9E,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,IAAI,QAAQ,IAAI,YAAY,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;QACtD,MAAM,WAAW,GAAG,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;QACzD,MAAM,OAAO,GAAG,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC;QACzC,IAAI,WAAW,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,IAAI,eAAe,EAAE,CAAC;YACjE,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,aAAa,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;IACnE,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/render/colors.d.ts
CHANGED
|
@@ -16,5 +16,17 @@ export interface Colors {
|
|
|
16
16
|
export declare function createColors(mode: ColorMode, theme?: import('../themes.js').ThemePalette | null): Colors;
|
|
17
17
|
export declare function stripAnsi(str: string): string;
|
|
18
18
|
export declare function detectColorMode(): ColorMode;
|
|
19
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Map a context-fill percentage to its alarm color.
|
|
21
|
+
*
|
|
22
|
+
* Zones (with default 70/85): green<50, yellow 50–70, orange 70–85, red 85+.
|
|
23
|
+
*
|
|
24
|
+
* **Asymmetry by design:** the green→yellow boundary is fixed at 50%, the
|
|
25
|
+
* "universally healthy" mark. So if a user sets `warning ≤ 50`, the yellow
|
|
26
|
+
* zone collapses entirely and the bar jumps green→orange at `warning`. That's
|
|
27
|
+
* consistent with the field's contract ("percentage at which the bar turns
|
|
28
|
+
* orange") — yellow is just a soft pre-alarm buffer that only exists when
|
|
29
|
+
* there's room for it between 50 and `warning`.
|
|
30
|
+
*/
|
|
31
|
+
export declare function getContextColor(pct: number, warning?: number, critical?: number): ColorName;
|
|
20
32
|
export declare function getQuotaColor(pct: number): ColorName;
|
package/dist/render/colors.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DEFAULT_CONTEXT_WARNING_THRESHOLD, DEFAULT_CONTEXT_CRITICAL_THRESHOLD } from '../types.js';
|
|
1
2
|
const RST = '\x1b[0m';
|
|
2
3
|
export function createColors(mode, theme) {
|
|
3
4
|
const wrap = (code) => (s) => `${code}${s}${RST}`;
|
|
@@ -60,12 +61,22 @@ export function detectColorMode() {
|
|
|
60
61
|
return '256';
|
|
61
62
|
return 'named';
|
|
62
63
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
64
|
+
/**
|
|
65
|
+
* Map a context-fill percentage to its alarm color.
|
|
66
|
+
*
|
|
67
|
+
* Zones (with default 70/85): green<50, yellow 50–70, orange 70–85, red 85+.
|
|
68
|
+
*
|
|
69
|
+
* **Asymmetry by design:** the green→yellow boundary is fixed at 50%, the
|
|
70
|
+
* "universally healthy" mark. So if a user sets `warning ≤ 50`, the yellow
|
|
71
|
+
* zone collapses entirely and the bar jumps green→orange at `warning`. That's
|
|
72
|
+
* consistent with the field's contract ("percentage at which the bar turns
|
|
73
|
+
* orange") — yellow is just a soft pre-alarm buffer that only exists when
|
|
74
|
+
* there's room for it between 50 and `warning`.
|
|
75
|
+
*/
|
|
76
|
+
export function getContextColor(pct, warning = DEFAULT_CONTEXT_WARNING_THRESHOLD, critical = DEFAULT_CONTEXT_CRITICAL_THRESHOLD) {
|
|
77
|
+
if (pct < warning)
|
|
78
|
+
return pct < 50 ? 'green' : 'yellow';
|
|
79
|
+
if (pct < critical)
|
|
69
80
|
return 'orange';
|
|
70
81
|
return 'blinkRed';
|
|
71
82
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/render/colors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/render/colors.ts"],"names":[],"mappings":"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"}
|
package/dist/render/icons.d.ts
CHANGED
|
@@ -16,6 +16,26 @@ export interface IconSet {
|
|
|
16
16
|
ellipsis: string;
|
|
17
17
|
dash: string;
|
|
18
18
|
checkmark: string;
|
|
19
|
+
/**
|
|
20
|
+
* Battery glyph keyed by usedPercentage. Replaces the bolt prefix on
|
|
21
|
+
* rate-limit segments with a visual fuel gauge so the icon itself signals
|
|
22
|
+
* level before the user parses the number.
|
|
23
|
+
*
|
|
24
|
+
* Per-implementation contract:
|
|
25
|
+
* - `nerd`: 11 Material Design glyphs by 10% bucket; alert (``) reserved
|
|
26
|
+
* for the 100% ceiling. Bucket dispatch matches `.toFixed(0)` rounding so
|
|
27
|
+
* the displayed `%` text and the glyph never disagree.
|
|
28
|
+
* - `emoji`: two-state — 🔋 below 85, 🪫 at/above. Intentional divergence
|
|
29
|
+
* from nerd's ceiling-only alert: emoji has no per-decile gradient, so
|
|
30
|
+
* the single tier flip rides the colour escalation at QUOTA_CRITICAL.
|
|
31
|
+
* - `none`: empty string for all inputs (icon-less mode contract).
|
|
32
|
+
*
|
|
33
|
+
* Out-of-range / malformed inputs (NaN, negative, Infinity) are NOT the
|
|
34
|
+
* responsibility of this method — callers MUST gate with `Number.isFinite`
|
|
35
|
+
* and a sane range check before invoking. `nerdBattery` defends with an
|
|
36
|
+
* outline fallback as a last line of safety; the other modes do not.
|
|
37
|
+
*/
|
|
38
|
+
battery: (pct: number) => string;
|
|
19
39
|
}
|
|
20
40
|
export declare const NERD_ICONS: IconSet;
|
|
21
41
|
export declare const EMOJI_ICONS: IconSet;
|
package/dist/render/icons.js
CHANGED
|
@@ -1,21 +1,67 @@
|
|
|
1
|
+
// Emoji boundary mirrors getQuotaColor's blinkRed cutoff at 85% — the two-state
|
|
2
|
+
// 🔋/🪫 split has nowhere else to put a "ceiling" marker, so urgency switches
|
|
3
|
+
// at the colour tier. The Nerd Font ladder below has 11 levels and reserves
|
|
4
|
+
// alert for 100% only.
|
|
5
|
+
const QUOTA_CRITICAL = 85;
|
|
6
|
+
/**
|
|
7
|
+
* Pick the Material Design Nerd Font battery glyph for a given percentage.
|
|
8
|
+
*
|
|
9
|
+
* Bucket dispatch uses `Math.round(pct)` to align with the `.toFixed(0)` text
|
|
10
|
+
* rendered alongside the glyph: a payload of 99.7 displays as "100%" so it
|
|
11
|
+
* must also pick the alert glyph — anything else creates a visible
|
|
12
|
+
* contradiction (text says ceiling, shape doesn't).
|
|
13
|
+
*
|
|
14
|
+
* The alert glyph is reserved for the 100% ceiling — the moment quota is
|
|
15
|
+
* actually exhausted. Below that, the level glyph reads naturally
|
|
16
|
+
* (battery_80, battery_90...) and the urgency tier is carried by the colour
|
|
17
|
+
* (yellow/orange/red via `getQuotaColor`). Color and glyph encode orthogonal
|
|
18
|
+
* info: tier vs level. Alert at 100% says "you hit the ceiling".
|
|
19
|
+
*/
|
|
20
|
+
function nerdBattery(pct) {
|
|
21
|
+
if (!Number.isFinite(pct) || pct < 0)
|
|
22
|
+
return '\u{F008E}'; // outline — defensive last line
|
|
23
|
+
const rounded = Math.round(pct);
|
|
24
|
+
if (rounded >= 100)
|
|
25
|
+
return '\u{F0083}'; // battery_alert — quota exhausted
|
|
26
|
+
if (rounded >= 90)
|
|
27
|
+
return '\u{F0082}';
|
|
28
|
+
if (rounded >= 80)
|
|
29
|
+
return '\u{F0081}';
|
|
30
|
+
if (rounded >= 70)
|
|
31
|
+
return '\u{F0080}';
|
|
32
|
+
if (rounded >= 60)
|
|
33
|
+
return '\u{F007F}';
|
|
34
|
+
if (rounded >= 50)
|
|
35
|
+
return '\u{F007E}';
|
|
36
|
+
if (rounded >= 40)
|
|
37
|
+
return '\u{F007D}';
|
|
38
|
+
if (rounded >= 30)
|
|
39
|
+
return '\u{F007C}';
|
|
40
|
+
if (rounded >= 20)
|
|
41
|
+
return '\u{F007B}';
|
|
42
|
+
if (rounded >= 10)
|
|
43
|
+
return '\u{F007A}';
|
|
44
|
+
return '\u{F008E}'; // battery_outline — empty/unknown
|
|
45
|
+
}
|
|
1
46
|
export const NERD_ICONS = {
|
|
2
|
-
model: '
|
|
3
|
-
branch: '
|
|
4
|
-
folder: '
|
|
5
|
-
fire: '
|
|
6
|
-
skull: '
|
|
7
|
-
comment: '
|
|
8
|
-
clock: '
|
|
9
|
-
bolt: '
|
|
10
|
-
tree: '
|
|
11
|
-
cubes: '
|
|
12
|
-
hammer: '
|
|
13
|
-
warning: '
|
|
14
|
-
barFull: '
|
|
15
|
-
barEmpty: '
|
|
16
|
-
ellipsis: '
|
|
17
|
-
dash: '
|
|
18
|
-
checkmark: '
|
|
47
|
+
model: '', // fa-robot
|
|
48
|
+
branch: '', // dev-git-branch
|
|
49
|
+
folder: '', // fa-folder-open
|
|
50
|
+
fire: '', // fa-fire
|
|
51
|
+
skull: '', // fa-skull
|
|
52
|
+
comment: '', // fa-comment
|
|
53
|
+
clock: '', // fa-clock
|
|
54
|
+
bolt: '', // fa-bolt
|
|
55
|
+
tree: '', // fa-tree
|
|
56
|
+
cubes: '', // fa-cubes
|
|
57
|
+
hammer: '', // fa-hammer
|
|
58
|
+
warning: '', // fa-warning
|
|
59
|
+
barFull: '█', // block full
|
|
60
|
+
barEmpty: '░', // block light
|
|
61
|
+
ellipsis: '…', // ...
|
|
62
|
+
dash: '—', // em-dash
|
|
63
|
+
checkmark: '✓', // checkmark
|
|
64
|
+
battery: nerdBattery,
|
|
19
65
|
};
|
|
20
66
|
export const EMOJI_ICONS = {
|
|
21
67
|
model: '\u{1F916}', // 🤖
|
|
@@ -24,17 +70,20 @@ export const EMOJI_ICONS = {
|
|
|
24
70
|
fire: '\u{1F525}', // 🔥
|
|
25
71
|
skull: '\u{1F480}', // 💀
|
|
26
72
|
comment: '\u{1F4AC}', // 💬
|
|
27
|
-
clock: '\u{23F1}
|
|
28
|
-
bolt: '
|
|
73
|
+
clock: '\u{23F1}️', // ⏱️
|
|
74
|
+
bolt: '⚡', // ⚡
|
|
29
75
|
tree: '\u{1F332}', // 🌲
|
|
30
76
|
cubes: '\u{1F4E6}', // 📦
|
|
31
77
|
hammer: '\u{1F528}', // 🔨
|
|
32
|
-
warning: '
|
|
33
|
-
barFull: '
|
|
34
|
-
barEmpty: '
|
|
35
|
-
ellipsis: '
|
|
36
|
-
dash: '
|
|
37
|
-
checkmark: '
|
|
78
|
+
warning: '⚠️', // ⚠️
|
|
79
|
+
barFull: '█',
|
|
80
|
+
barEmpty: '░',
|
|
81
|
+
ellipsis: '…',
|
|
82
|
+
dash: '—',
|
|
83
|
+
checkmark: '✅', // ✅
|
|
84
|
+
// 🔋 → 🪫 at the critical boundary so colour and shape signal urgency in
|
|
85
|
+
// lockstep. Two states keeps emoji semantics simple — no per-decile gradient.
|
|
86
|
+
battery: (pct) => (pct >= QUOTA_CRITICAL ? '\u{1FAAB}' : '\u{1F50B}'),
|
|
38
87
|
};
|
|
39
88
|
export const NO_ICONS = {
|
|
40
89
|
model: '',
|
|
@@ -49,11 +98,14 @@ export const NO_ICONS = {
|
|
|
49
98
|
cubes: '',
|
|
50
99
|
hammer: '',
|
|
51
100
|
warning: '!',
|
|
52
|
-
barFull: '
|
|
53
|
-
barEmpty: '
|
|
54
|
-
ellipsis: '
|
|
55
|
-
dash: '
|
|
56
|
-
checkmark: '
|
|
101
|
+
barFull: '█',
|
|
102
|
+
barEmpty: '░',
|
|
103
|
+
ellipsis: '…',
|
|
104
|
+
dash: '—',
|
|
105
|
+
checkmark: '✓',
|
|
106
|
+
// No-icon mode keeps the legacy bolt fallback (currently empty) so users who
|
|
107
|
+
// opted out of icons see no shape change from this feature.
|
|
108
|
+
battery: () => '',
|
|
57
109
|
};
|
|
58
110
|
/** Resolve icon set from config value */
|
|
59
111
|
export function resolveIcons(mode) {
|
package/dist/render/icons.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icons.js","sourceRoot":"","sources":["../../src/render/icons.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"icons.js","sourceRoot":"","sources":["../../src/render/icons.ts"],"names":[],"mappings":"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"}
|