@sooneocean/claude-hud 0.5.0 → 0.7.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.
@@ -5,16 +5,29 @@ import { getAdaptiveBarWidth, isNarrowTerminal, isVeryNarrowTerminal } from '../
5
5
  import { formatCost, predictSessionCost } from '../../cost-tracker.js';
6
6
  import { formatTokens, formatContextValue } from '../../utils/format.js';
7
7
  const DEBUG = process.env.DEBUG?.includes('claude-hud') || process.env.DEBUG === '*';
8
- const SPARK_CHARS = '▁▂▃▄▅▆▇█';
9
- function renderSparkline(values) {
8
+ const HEATMAP_CHARS = '▁▂▃▄▅▆▇█';
9
+ function renderHeatmap(values) {
10
10
  if (values.length < 2)
11
11
  return '';
12
- const min = Math.min(...values);
13
- const max = Math.max(...values);
14
- const range = max - min || 1;
12
+ // Color gradient: green (low) → yellow (mid) → red (high)
15
13
  return values.map(v => {
16
- const idx = Math.round(((v - min) / range) * (SPARK_CHARS.length - 1));
17
- return SPARK_CHARS[idx];
14
+ const idx = Math.min(Math.round((v / 100) * (HEATMAP_CHARS.length - 1)), HEATMAP_CHARS.length - 1);
15
+ const char = HEATMAP_CHARS[idx];
16
+ // ANSI 256-color: green(34) → yellow(226) → red(196)
17
+ let colorCode;
18
+ if (v < 50) {
19
+ // Green to yellow gradient (ANSI 256: 34 → 226)
20
+ colorCode = v < 25 ? 34 : v < 40 ? 70 : 226;
21
+ }
22
+ else if (v < 80) {
23
+ // Yellow to orange (226 → 208)
24
+ colorCode = v < 65 ? 226 : 208;
25
+ }
26
+ else {
27
+ // Orange to red (208 → 196)
28
+ colorCode = v < 90 ? 208 : 196;
29
+ }
30
+ return `\x1b[38;5;${colorCode}m${char}\x1b[0m`;
18
31
  }).join('');
19
32
  }
20
33
  function ordinal(n) {
@@ -90,7 +103,7 @@ export function renderIdentityLine(ctx) {
90
103
  line += dim(` (${ordinal(ctx.sessionStats.autocompactCount)} compact)`);
91
104
  }
92
105
  if (!isNarrow && ctx.sparkline && ctx.sparkline.length >= 3) {
93
- line += ` ${dim(renderSparkline(ctx.sparkline))}`;
106
+ line += ` ${renderHeatmap(ctx.sparkline)}`;
94
107
  }
95
108
  if (!isNarrow && ctx.apiLatency !== null && ctx.apiLatency !== undefined && ctx.apiLatency > 0) {
96
109
  const latencyColor = ctx.apiLatency > 5000 ? red : ctx.apiLatency > 2000 ? warning : dim;
@@ -1 +1 @@
1
- {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../../src/render/lines/identity.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../../src/render/lines/identity.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../../src/render/lines/usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAQpD,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAuEjE"}
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../../src/render/lines/usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAQpD,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CA+EjE"}
@@ -60,8 +60,16 @@ export function renderUsageLine(ctx) {
60
60
  : (sevenDayReset
61
61
  ? `7d: ${sevenDayDisplay} (resets in ${sevenDayReset})`
62
62
  : `7d: ${sevenDayDisplay}`);
63
- return `${label} ${fiveHourPart} ${dim('│')} ${sevenDayPart}${syncingSuffix}`;
63
+ let result = `${label} ${fiveHourPart} ${dim('│')} ${sevenDayPart}${syncingSuffix}`;
64
+ if (ctx.rateLimitEta) {
65
+ result += ` ${dim(`→limit ${ctx.rateLimitEta}`)}`;
66
+ }
67
+ return result;
64
68
  }
65
- return `${label} ${fiveHourPart}${syncingSuffix}`;
69
+ let result = `${label} ${fiveHourPart}${syncingSuffix}`;
70
+ if (ctx.rateLimitEta) {
71
+ result += ` ${dim(`→limit ${ctx.rateLimitEta}`)}`;
72
+ }
73
+ return result;
66
74
  }
67
75
  //# sourceMappingURL=usage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../src/render/lines/usage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../src/render/lines/usage.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,18 @@ export declare function getSparkline(cacheDir: string): number[];
13
13
  export declare function getSessionStats(cacheDir: string): SessionStats;
14
14
  export declare function updateSessionStats(cacheDir: string, input: UpdateInput): void;
15
15
  export declare function updatePromptStats(tokensDelta: number, cacheDir: string): void;
16
+ export interface AgentEfficiency {
17
+ type: string;
18
+ count: number;
19
+ avgDurationSecs: number;
20
+ }
21
+ export declare function updateAgentStats(agents: Array<{
22
+ type: string;
23
+ status: string;
24
+ startTime: Date;
25
+ endTime?: Date;
26
+ }>, cacheDir: string): void;
27
+ export declare function getAgentEfficiency(cacheDir: string): AgentEfficiency[];
16
28
  export declare function getPromptStats(cacheDir: string): PromptStats | null;
17
29
  export {};
18
30
  //# sourceMappingURL=session-stats.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-stats.d.ts","sourceRoot":"","sources":["../src/session-stats.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAcD,UAAU,WAAW;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAEvD;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAQ9D;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CA8B7E;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAY7E;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAWnE"}
1
+ {"version":3,"file":"session-stats.d.ts","sourceRoot":"","sources":["../src/session-stats.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAcD,UAAU,WAAW;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAEvD;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAQ9D;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CA8B7E;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAY7E;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;CACzB;AAID,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAiBzI;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,EAAE,CAatE;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAWnE"}
@@ -56,6 +56,35 @@ export function updatePromptStats(tokensDelta, cacheDir) {
56
56
  stats.maxTokens = tokensDelta;
57
57
  writeCache(PROMPT_STATS_KEY, stats, cacheDir);
58
58
  }
59
+ const AGENT_STATS_KEY = 'agent-efficiency';
60
+ export function updateAgentStats(agents, cacheDir) {
61
+ const stats = readCache(AGENT_STATS_KEY, TTL, cacheDir) ?? {};
62
+ for (const agent of agents) {
63
+ if (agent.status !== 'completed' || !agent.endTime)
64
+ continue;
65
+ const duration = (agent.endTime.getTime() - agent.startTime.getTime()) / 1000;
66
+ if (duration <= 0)
67
+ continue;
68
+ const key = agent.type || 'unknown';
69
+ if (!stats[key])
70
+ stats[key] = { count: 0, totalDuration: 0 };
71
+ stats[key].count++;
72
+ stats[key].totalDuration += duration;
73
+ }
74
+ writeCache(AGENT_STATS_KEY, stats, cacheDir);
75
+ }
76
+ export function getAgentEfficiency(cacheDir) {
77
+ const stats = readCache(AGENT_STATS_KEY, TTL, cacheDir);
78
+ if (!stats)
79
+ return [];
80
+ return Object.entries(stats)
81
+ .map(([type, data]) => ({
82
+ type,
83
+ count: data.count,
84
+ avgDurationSecs: Math.round(data.totalDuration / data.count),
85
+ }))
86
+ .sort((a, b) => b.count - a.count);
87
+ }
59
88
  export function getPromptStats(cacheDir) {
60
89
  const stats = readCache(PROMPT_STATS_KEY, TTL, cacheDir);
61
90
  if (!stats || stats.count === 0)
@@ -1 +1 @@
1
- {"version":3,"file":"session-stats.js","sourceRoot":"","sources":["../src/session-stats.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-stats.js","sourceRoot":"","sources":["../src/session-stats.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -129,5 +129,6 @@ export interface RenderContext {
129
129
  locale: Locale;
130
130
  customWidgets: CustomWidget[];
131
131
  suggestions: Suggestion[];
132
+ rateLimitEta: string | null;
132
133
  }
133
134
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sooneocean/claude-hud",
3
- "version": "0.5.0",
3
+ "version": "0.7.0",
4
4
  "description": "Enhanced real-time statusline HUD for Claude Code — with cache, alerts, frameworks, themes, and Dashboard Rich visuals",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
package/src/alert.ts CHANGED
@@ -106,6 +106,29 @@ export function shouldBell(alerts: Alert[], cacheDir: string): boolean {
106
106
 
107
107
  const DEBUG = process.env.DEBUG?.includes('claude-hud') || process.env.DEBUG === '*';
108
108
 
109
+ export function predictRateLimitHit(
110
+ currentUsagePercent: number,
111
+ resetAt: Date | null,
112
+ sessionDurationMins: number,
113
+ ): string | null {
114
+ if (currentUsagePercent <= 0 || sessionDurationMins <= 0) return null;
115
+ if (currentUsagePercent >= 95) return 'imminent';
116
+
117
+ // Usage rate per minute
118
+ const usagePerMin = currentUsagePercent / sessionDurationMins;
119
+ if (usagePerMin <= 0) return null;
120
+
121
+ const remaining = 100 - currentUsagePercent;
122
+ const minsUntilLimit = Math.round(remaining / usagePerMin);
123
+
124
+ if (minsUntilLimit > 300) return null; // > 5h away, not worth showing
125
+
126
+ if (minsUntilLimit < 60) return `~${minsUntilLimit}m`;
127
+ const hours = Math.floor(minsUntilLimit / 60);
128
+ const mins = minsUntilLimit % 60;
129
+ return `~${hours}h ${mins}m`;
130
+ }
131
+
109
132
  export function runAlertHook(hook: string, alert: Alert): void {
110
133
  try {
111
134
  const env = {
package/src/config.ts CHANGED
@@ -97,6 +97,7 @@ export interface HudConfig {
97
97
  hook?: string; // shell command to run on any alert trigger
98
98
  };
99
99
  locale: Locale;
100
+ schemaVersion: number;
100
101
  }
101
102
 
102
103
  export const DEFAULT_CONFIG: HudConfig = {
@@ -164,6 +165,7 @@ export const DEFAULT_CONFIG: HudConfig = {
164
165
  usage7d: { warningThreshold: 80, actions: { visual: true, bell: false, predict: true } },
165
166
  },
166
167
  locale: 'en' as Locale,
168
+ schemaVersion: 1,
167
169
  };
168
170
 
169
171
  export function getConfigPath(): string {
@@ -272,8 +274,18 @@ function validatePositiveInt(value: unknown, defaultValue: number): number {
272
274
  }
273
275
 
274
276
  export function mergeConfig(userConfig: Partial<HudConfig>): HudConfig {
277
+ const DEBUG = process.env.DEBUG?.includes('claude-hud') || process.env.DEBUG === '*';
275
278
  const migrated = migrateConfig(userConfig);
276
279
 
280
+ // Schema version migration
281
+ const schemaVersion = typeof userConfig.schemaVersion === 'number' ? userConfig.schemaVersion : 0;
282
+
283
+ if (schemaVersion < 1) {
284
+ // Migrate from v0 (no schema version) to v1
285
+ // Currently no-op — future breaking changes will add migration steps here
286
+ if (DEBUG) console.error('[claude-hud:config] migrating config from schema v0 to v1');
287
+ }
288
+
277
289
  const lineLayout = validateLineLayout(migrated.lineLayout)
278
290
  ? migrated.lineLayout
279
291
  : DEFAULT_CONFIG.lineLayout;
@@ -495,11 +507,59 @@ export function mergeConfig(userConfig: Partial<HudConfig>): HudConfig {
495
507
  ? migrated.locale
496
508
  : DEFAULT_CONFIG.locale;
497
509
 
498
- return { lineLayout, showSeparators, pathLevels, elementOrder, gitStatus, display, theme, usage, colors, frameworks, alerts, locale };
510
+ const mergedSchemaVersion = 1; // Always set to current
511
+ return { lineLayout, showSeparators, pathLevels, elementOrder, gitStatus, display, theme, usage, colors, frameworks, alerts, locale, schemaVersion: mergedSchemaVersion };
512
+ }
513
+
514
+ export function validateConfigWithWarnings(userConfig: Record<string, unknown>): string[] {
515
+ const warnings: string[] = [];
516
+
517
+ const knownTopLevel = new Set([
518
+ 'lineLayout', 'showSeparators', 'pathLevels', 'elementOrder',
519
+ 'gitStatus', 'display', 'usage', 'colors', 'frameworks', 'alerts', 'theme', 'locale',
520
+ 'schemaVersion',
521
+ ]);
522
+
523
+ for (const key of Object.keys(userConfig)) {
524
+ if (!knownTopLevel.has(key)) {
525
+ warnings.push(`Unknown config key: "${key}" — will be ignored`);
526
+ }
527
+ }
528
+
529
+ // Type checks
530
+ if (userConfig.theme !== undefined && typeof userConfig.theme !== 'string') {
531
+ warnings.push(`"theme" should be a string, got ${typeof userConfig.theme}`);
532
+ }
533
+
534
+ if (userConfig.locale !== undefined && !['en', 'zh', 'ja'].includes(userConfig.locale as string)) {
535
+ warnings.push(`"locale" should be "en", "zh", or "ja", got "${userConfig.locale}"`);
536
+ }
537
+
538
+ const display = userConfig.display;
539
+ if (display && typeof display === 'object') {
540
+ const knownDisplay = new Set([
541
+ 'showModel', 'showProject', 'showContextBar', 'contextValue',
542
+ 'showConfigCounts', 'showDuration', 'showSpeed', 'showUsage',
543
+ 'usageBarEnabled', 'showTools', 'showAgents', 'showTodos',
544
+ 'showSessionName', 'showTokenBreakdown', 'autocompactBuffer',
545
+ 'usageThreshold', 'sevenDayThreshold', 'environmentThreshold',
546
+ 'customLine', 'showFrameworks', 'showBurnRate', 'showAlerts',
547
+ 'activityIndicator', 'treePrefixes', 'mergeToolsAgents', 'barStyle',
548
+ 'showCost', 'showNotifications', 'autoCompactSwitch', 'autoTune',
549
+ ]);
550
+ for (const key of Object.keys(display as Record<string, unknown>)) {
551
+ if (!knownDisplay.has(key)) {
552
+ warnings.push(`Unknown display key: "display.${key}" — will be ignored`);
553
+ }
554
+ }
555
+ }
556
+
557
+ return warnings;
499
558
  }
500
559
 
501
560
  export async function loadConfig(): Promise<HudConfig> {
502
561
  const configPath = getConfigPath();
562
+ const DEBUG = process.env.DEBUG?.includes('claude-hud') || process.env.DEBUG === '*';
503
563
 
504
564
  try {
505
565
  if (!fs.existsSync(configPath)) {
@@ -508,6 +568,14 @@ export async function loadConfig(): Promise<HudConfig> {
508
568
 
509
569
  const content = fs.readFileSync(configPath, 'utf-8');
510
570
  const userConfig = JSON.parse(content) as Partial<HudConfig>;
571
+
572
+ const warnings = validateConfigWithWarnings(userConfig as Record<string, unknown>);
573
+ if (DEBUG && warnings.length > 0) {
574
+ for (const w of warnings) {
575
+ console.error(`[claude-hud:config] ⚠ ${w}`);
576
+ }
577
+ }
578
+
511
579
  return mergeConfig(userConfig);
512
580
  } catch {
513
581
  return DEFAULT_CONFIG;
package/src/index.ts CHANGED
@@ -11,9 +11,9 @@ import { fileURLToPath } from 'node:url';
11
11
  import { realpathSync } from 'node:fs';
12
12
  import { getDefaultCacheDir, readCache, writeCache, readLatency, writeLatency } from './cache.js';
13
13
  import { loadProviders, fetchAllProviders } from './providers/index.js';
14
- import { evaluateAlerts, shouldBell, sendNotification, recordAlertHistory, runAlertHook } from './alert.js';
14
+ import { evaluateAlerts, shouldBell, sendNotification, recordAlertHistory, runAlertHook, predictRateLimitHit } from './alert.js';
15
15
  import { calculateBurnRate, recordTokenSnapshot } from './burn-rate.js';
16
- import { updateSessionStats, getSessionStats, getSparkline, updatePromptStats } from './session-stats.js';
16
+ import { updateSessionStats, getSessionStats, getSparkline, updatePromptStats, updateAgentStats } from './session-stats.js';
17
17
  import { getTerminalWidth } from './utils/terminal.js';
18
18
  import { estimateCost } from './cost-tracker.js';
19
19
  import { saveCurrentSession, getLastSession, formatSessionSummary } from './session-history.js';
@@ -40,7 +40,15 @@ export type MainDeps = {
40
40
  log: (...args: unknown[]) => void;
41
41
  };
42
42
 
43
+ function timer() {
44
+ const start = Date.now();
45
+ return () => Date.now() - start;
46
+ }
47
+
43
48
  export async function main(overrides: Partial<MainDeps> = {}): Promise<void> {
49
+ const DEBUG = process.env.DEBUG?.includes('claude-hud') || process.env.DEBUG === '*';
50
+ const tTotal = timer();
51
+
44
52
  const deps: MainDeps = {
45
53
  readStdin,
46
54
  parseTranscript,
@@ -57,7 +65,9 @@ export async function main(overrides: Partial<MainDeps> = {}): Promise<void> {
57
65
  };
58
66
 
59
67
  try {
68
+ const t1 = timer();
60
69
  const stdin = await deps.readStdin();
70
+ if (DEBUG) console.error(`[claude-hud:timing] readStdin: ${t1()}ms`);
61
71
 
62
72
  if (!stdin) {
63
73
  // Running without stdin - this happens during setup verification
@@ -71,20 +81,27 @@ export async function main(overrides: Partial<MainDeps> = {}): Promise<void> {
71
81
 
72
82
  registerSession(stdin.cwd);
73
83
  const transcriptPath = stdin.transcript_path ?? '';
84
+ const t2 = timer();
74
85
  const transcript = await deps.parseTranscript(transcriptPath);
86
+ if (DEBUG) console.error(`[claude-hud:timing] parseTranscript: ${t2()}ms`);
75
87
 
76
88
  const { claudeMdCount, rulesCount, mcpCount, hooksCount } = await deps.countConfigs(stdin.cwd);
77
89
 
78
90
  const cacheDir = getDefaultCacheDir();
79
91
 
92
+ const t3 = timer();
80
93
  let config = await deps.loadConfig();
94
+ if (DEBUG) console.error(`[claude-hud:timing] loadConfig: ${t3()}ms`);
81
95
  config = autoTuneConfig(config, getTerminalWidth(), cacheDir);
96
+ const t4 = timer();
82
97
  const gitStatus = config.gitStatus.enabled
83
98
  ? await deps.getGitStatus(stdin.cwd)
84
99
  : null;
100
+ if (DEBUG) console.error(`[claude-hud:timing] gitStatus: ${t4()}ms`);
85
101
 
86
102
  // Only fetch usage if enabled in config (replaces env var requirement)
87
103
  const usageStart = Date.now();
104
+ const t5 = timer();
88
105
  const usageData = config.display.showUsage !== false
89
106
  ? await deps.getUsage({
90
107
  ttls: {
@@ -93,6 +110,7 @@ export async function main(overrides: Partial<MainDeps> = {}): Promise<void> {
93
110
  },
94
111
  })
95
112
  : null;
113
+ if (DEBUG) console.error(`[claude-hud:timing] usageApi: ${t5()}ms`);
96
114
  if (config.display.showUsage !== false && usageData !== null) {
97
115
  writeLatency(Date.now() - usageStart, cacheDir);
98
116
  }
@@ -137,6 +155,11 @@ export async function main(overrides: Partial<MainDeps> = {}): Promise<void> {
137
155
  // Context percent
138
156
  const contextPercent = getContextPercent(stdin);
139
157
 
158
+ // Agent efficiency tracking
159
+ if (transcript.agents.length > 0) {
160
+ updateAgentStats(transcript.agents, cacheDir);
161
+ }
162
+
140
163
  // Session stats
141
164
  updateSessionStats(cacheDir, {
142
165
  contextPercent,
@@ -182,6 +205,16 @@ export async function main(overrides: Partial<MainDeps> = {}): Promise<void> {
182
205
  }
183
206
  }
184
207
 
208
+ // Rate limit prediction
209
+ const sessionMins = transcript.sessionStart
210
+ ? Math.floor((Date.now() - transcript.sessionStart.getTime()) / 60000)
211
+ : 0;
212
+ const rateLimitEta = predictRateLimitHit(
213
+ usageData?.fiveHour ?? 0,
214
+ usageData?.fiveHourResetAt ?? null,
215
+ sessionMins,
216
+ );
217
+
185
218
  const costEstimate = config.display.showCost ? estimateCost(stdin, cacheDir) : null;
186
219
 
187
220
  const mcpServers = getMcpServers(cacheDir);
@@ -238,6 +271,7 @@ export async function main(overrides: Partial<MainDeps> = {}): Promise<void> {
238
271
  mcpServers,
239
272
  locale: config.locale ?? detectLocale(),
240
273
  customWidgets,
274
+ rateLimitEta,
241
275
  };
242
276
  const suggestions = config.display.showAlerts
243
277
  ? getSuggestions(suggestionInput as RenderContext)
@@ -248,7 +282,10 @@ export async function main(overrides: Partial<MainDeps> = {}): Promise<void> {
248
282
  suggestions,
249
283
  };
250
284
 
285
+ const t6 = timer();
251
286
  deps.render(ctx);
287
+ if (DEBUG) console.error(`[claude-hud:timing] render: ${t6()}ms`);
288
+ if (DEBUG) console.error(`[claude-hud:timing] total: ${tTotal()}ms`);
252
289
  } catch (error) {
253
290
  deps.log('[claude-hud] Error:', error instanceof Error ? error.message : 'Unknown error');
254
291
  }
@@ -8,16 +8,30 @@ import { formatTokens, formatContextValue } from '../../utils/format.js';
8
8
 
9
9
  const DEBUG = process.env.DEBUG?.includes('claude-hud') || process.env.DEBUG === '*';
10
10
 
11
- const SPARK_CHARS = '▁▂▃▄▅▆▇█';
11
+ const HEATMAP_CHARS = '▁▂▃▄▅▆▇█';
12
12
 
13
- function renderSparkline(values: number[]): string {
13
+ function renderHeatmap(values: number[]): string {
14
14
  if (values.length < 2) return '';
15
- const min = Math.min(...values);
16
- const max = Math.max(...values);
17
- const range = max - min || 1;
15
+
16
+ // Color gradient: green (low) → yellow (mid) → red (high)
18
17
  return values.map(v => {
19
- const idx = Math.round(((v - min) / range) * (SPARK_CHARS.length - 1));
20
- return SPARK_CHARS[idx];
18
+ const idx = Math.min(Math.round((v / 100) * (HEATMAP_CHARS.length - 1)), HEATMAP_CHARS.length - 1);
19
+ const char = HEATMAP_CHARS[idx];
20
+
21
+ // ANSI 256-color: green(34) → yellow(226) → red(196)
22
+ let colorCode: number;
23
+ if (v < 50) {
24
+ // Green to yellow gradient (ANSI 256: 34 → 226)
25
+ colorCode = v < 25 ? 34 : v < 40 ? 70 : 226;
26
+ } else if (v < 80) {
27
+ // Yellow to orange (226 → 208)
28
+ colorCode = v < 65 ? 226 : 208;
29
+ } else {
30
+ // Orange to red (208 → 196)
31
+ colorCode = v < 90 ? 208 : 196;
32
+ }
33
+
34
+ return `\x1b[38;5;${colorCode}m${char}\x1b[0m`;
21
35
  }).join('');
22
36
  }
23
37
 
@@ -104,7 +118,7 @@ export function renderIdentityLine(ctx: RenderContext): string {
104
118
  }
105
119
 
106
120
  if (!isNarrow && ctx.sparkline && ctx.sparkline.length >= 3) {
107
- line += ` ${dim(renderSparkline(ctx.sparkline))}`;
121
+ line += ` ${renderHeatmap(ctx.sparkline)}`;
108
122
  }
109
123
 
110
124
  if (!isNarrow && ctx.apiLatency !== null && ctx.apiLatency !== undefined && ctx.apiLatency > 0) {
@@ -73,9 +73,17 @@ export function renderUsageLine(ctx: RenderContext): string | null {
73
73
  : (sevenDayReset
74
74
  ? `7d: ${sevenDayDisplay} (resets in ${sevenDayReset})`
75
75
  : `7d: ${sevenDayDisplay}`);
76
- return `${label} ${fiveHourPart} ${dim('│')} ${sevenDayPart}${syncingSuffix}`;
76
+ let result = `${label} ${fiveHourPart} ${dim('│')} ${sevenDayPart}${syncingSuffix}`;
77
+ if (ctx.rateLimitEta) {
78
+ result += ` ${dim(`→limit ${ctx.rateLimitEta}`)}`;
79
+ }
80
+ return result;
77
81
  }
78
82
 
79
- return `${label} ${fiveHourPart}${syncingSuffix}`;
83
+ let result = `${label} ${fiveHourPart}${syncingSuffix}`;
84
+ if (ctx.rateLimitEta) {
85
+ result += ` ${dim(`→limit ${ctx.rateLimitEta}`)}`;
86
+ }
87
+ return result;
80
88
  }
81
89
 
@@ -85,6 +85,48 @@ export function updatePromptStats(tokensDelta: number, cacheDir: string): void {
85
85
  writeCache(PROMPT_STATS_KEY, stats, cacheDir);
86
86
  }
87
87
 
88
+ export interface AgentEfficiency {
89
+ type: string;
90
+ count: number;
91
+ avgDurationSecs: number;
92
+ }
93
+
94
+ const AGENT_STATS_KEY = 'agent-efficiency';
95
+
96
+ export function updateAgentStats(agents: Array<{ type: string; status: string; startTime: Date; endTime?: Date }>, cacheDir: string): void {
97
+ const stats = readCache<Record<string, { count: number; totalDuration: number }>>(
98
+ AGENT_STATS_KEY, TTL, cacheDir
99
+ ) ?? {};
100
+
101
+ for (const agent of agents) {
102
+ if (agent.status !== 'completed' || !agent.endTime) continue;
103
+ const duration = (agent.endTime.getTime() - agent.startTime.getTime()) / 1000;
104
+ if (duration <= 0) continue;
105
+
106
+ const key = agent.type || 'unknown';
107
+ if (!stats[key]) stats[key] = { count: 0, totalDuration: 0 };
108
+ stats[key].count++;
109
+ stats[key].totalDuration += duration;
110
+ }
111
+
112
+ writeCache(AGENT_STATS_KEY, stats, cacheDir);
113
+ }
114
+
115
+ export function getAgentEfficiency(cacheDir: string): AgentEfficiency[] {
116
+ const stats = readCache<Record<string, { count: number; totalDuration: number }>>(
117
+ AGENT_STATS_KEY, TTL, cacheDir
118
+ );
119
+ if (!stats) return [];
120
+
121
+ return Object.entries(stats)
122
+ .map(([type, data]) => ({
123
+ type,
124
+ count: data.count,
125
+ avgDurationSecs: Math.round(data.totalDuration / data.count),
126
+ }))
127
+ .sort((a, b) => b.count - a.count);
128
+ }
129
+
88
130
  export function getPromptStats(cacheDir: string): PromptStats | null {
89
131
  const stats = readCache<{ count: number; totalTokens: number; maxTokens: number }>(
90
132
  PROMPT_STATS_KEY, TTL, cacheDir
package/src/types.ts CHANGED
@@ -152,4 +152,5 @@ export interface RenderContext {
152
152
  locale: Locale;
153
153
  customWidgets: CustomWidget[];
154
154
  suggestions: Suggestion[];
155
+ rateLimitEta: string | null;
155
156
  }