@sooneocean/claude-hud 0.1.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.
Files changed (210) hide show
  1. package/.claude-plugin/marketplace.json +20 -0
  2. package/.claude-plugin/plugin.json +20 -0
  3. package/LICENSE +21 -0
  4. package/README.md +379 -0
  5. package/commands/configure.md +361 -0
  6. package/commands/export.md +43 -0
  7. package/commands/health.md +61 -0
  8. package/commands/setup.md +287 -0
  9. package/commands/theme.md +31 -0
  10. package/dist/alert.d.ts +31 -0
  11. package/dist/alert.d.ts.map +1 -0
  12. package/dist/alert.js +53 -0
  13. package/dist/alert.js.map +1 -0
  14. package/dist/burn-rate.d.ts +4 -0
  15. package/dist/burn-rate.d.ts.map +1 -0
  16. package/dist/burn-rate.js +36 -0
  17. package/dist/burn-rate.js.map +1 -0
  18. package/dist/cache.d.ts +6 -0
  19. package/dist/cache.d.ts.map +1 -0
  20. package/dist/cache.js +47 -0
  21. package/dist/cache.js.map +1 -0
  22. package/dist/claude-config-dir.d.ts +4 -0
  23. package/dist/claude-config-dir.d.ts.map +1 -0
  24. package/dist/claude-config-dir.js +24 -0
  25. package/dist/claude-config-dir.js.map +1 -0
  26. package/dist/config-io.d.ts +6 -0
  27. package/dist/config-io.d.ts.map +1 -0
  28. package/dist/config-io.js +27 -0
  29. package/dist/config-io.js.map +1 -0
  30. package/dist/config-reader.d.ts +8 -0
  31. package/dist/config-reader.d.ts.map +1 -0
  32. package/dist/config-reader.js +204 -0
  33. package/dist/config-reader.js.map +1 -0
  34. package/dist/config.d.ts +94 -0
  35. package/dist/config.d.ts.map +1 -0
  36. package/dist/config.js +358 -0
  37. package/dist/config.js.map +1 -0
  38. package/dist/constants.d.ts +11 -0
  39. package/dist/constants.d.ts.map +1 -0
  40. package/dist/constants.js +11 -0
  41. package/dist/constants.js.map +1 -0
  42. package/dist/cost-tracker.d.ts +9 -0
  43. package/dist/cost-tracker.d.ts.map +1 -0
  44. package/dist/cost-tracker.js +46 -0
  45. package/dist/cost-tracker.js.map +1 -0
  46. package/dist/debug.d.ts +6 -0
  47. package/dist/debug.d.ts.map +1 -0
  48. package/dist/debug.js +15 -0
  49. package/dist/debug.js.map +1 -0
  50. package/dist/extra-cmd.d.ts +20 -0
  51. package/dist/extra-cmd.d.ts.map +1 -0
  52. package/dist/extra-cmd.js +112 -0
  53. package/dist/extra-cmd.js.map +1 -0
  54. package/dist/git.d.ts +16 -0
  55. package/dist/git.d.ts.map +1 -0
  56. package/dist/git.js +94 -0
  57. package/dist/git.js.map +1 -0
  58. package/dist/health-check.d.ts +12 -0
  59. package/dist/health-check.d.ts.map +1 -0
  60. package/dist/health-check.js +37 -0
  61. package/dist/health-check.js.map +1 -0
  62. package/dist/index.d.ts +24 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +198 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/providers/agent-teams-provider.d.ts +10 -0
  67. package/dist/providers/agent-teams-provider.d.ts.map +1 -0
  68. package/dist/providers/agent-teams-provider.js +57 -0
  69. package/dist/providers/agent-teams-provider.js.map +1 -0
  70. package/dist/providers/agw-provider.d.ts +10 -0
  71. package/dist/providers/agw-provider.d.ts.map +1 -0
  72. package/dist/providers/agw-provider.js +49 -0
  73. package/dist/providers/agw-provider.js.map +1 -0
  74. package/dist/providers/index.d.ts +14 -0
  75. package/dist/providers/index.d.ts.map +1 -0
  76. package/dist/providers/index.js +25 -0
  77. package/dist/providers/index.js.map +1 -0
  78. package/dist/render/agents-line.d.ts +3 -0
  79. package/dist/render/agents-line.d.ts.map +1 -0
  80. package/dist/render/agents-line.js +40 -0
  81. package/dist/render/agents-line.js.map +1 -0
  82. package/dist/render/alert-line.d.ts +3 -0
  83. package/dist/render/alert-line.d.ts.map +1 -0
  84. package/dist/render/alert-line.js +11 -0
  85. package/dist/render/alert-line.js.map +1 -0
  86. package/dist/render/colors.d.ts +39 -0
  87. package/dist/render/colors.d.ts.map +1 -0
  88. package/dist/render/colors.js +109 -0
  89. package/dist/render/colors.js.map +1 -0
  90. package/dist/render/framework-line.d.ts +3 -0
  91. package/dist/render/framework-line.d.ts.map +1 -0
  92. package/dist/render/framework-line.js +32 -0
  93. package/dist/render/framework-line.js.map +1 -0
  94. package/dist/render/index.d.ts +3 -0
  95. package/dist/render/index.d.ts.map +1 -0
  96. package/dist/render/index.js +435 -0
  97. package/dist/render/index.js.map +1 -0
  98. package/dist/render/lines/environment.d.ts +3 -0
  99. package/dist/render/lines/environment.d.ts.map +1 -0
  100. package/dist/render/lines/environment.js +30 -0
  101. package/dist/render/lines/environment.js.map +1 -0
  102. package/dist/render/lines/identity.d.ts +3 -0
  103. package/dist/render/lines/identity.d.ts.map +1 -0
  104. package/dist/render/lines/identity.js +93 -0
  105. package/dist/render/lines/identity.js.map +1 -0
  106. package/dist/render/lines/index.d.ts +5 -0
  107. package/dist/render/lines/index.d.ts.map +1 -0
  108. package/dist/render/lines/index.js +5 -0
  109. package/dist/render/lines/index.js.map +1 -0
  110. package/dist/render/lines/project.d.ts +3 -0
  111. package/dist/render/lines/project.d.ts.map +1 -0
  112. package/dist/render/lines/project.js +100 -0
  113. package/dist/render/lines/project.js.map +1 -0
  114. package/dist/render/lines/usage.d.ts +3 -0
  115. package/dist/render/lines/usage.d.ts.map +1 -0
  116. package/dist/render/lines/usage.js +65 -0
  117. package/dist/render/lines/usage.js.map +1 -0
  118. package/dist/render/session-line.d.ts +7 -0
  119. package/dist/render/session-line.d.ts.map +1 -0
  120. package/dist/render/session-line.js +227 -0
  121. package/dist/render/session-line.js.map +1 -0
  122. package/dist/render/todos-line.d.ts +3 -0
  123. package/dist/render/todos-line.d.ts.map +1 -0
  124. package/dist/render/todos-line.js +29 -0
  125. package/dist/render/todos-line.js.map +1 -0
  126. package/dist/render/tools-line.d.ts +3 -0
  127. package/dist/render/tools-line.d.ts.map +1 -0
  128. package/dist/render/tools-line.js +45 -0
  129. package/dist/render/tools-line.js.map +1 -0
  130. package/dist/session-history.d.ts +15 -0
  131. package/dist/session-history.d.ts.map +1 -0
  132. package/dist/session-history.js +46 -0
  133. package/dist/session-history.js.map +1 -0
  134. package/dist/session-stats.d.ts +11 -0
  135. package/dist/session-stats.d.ts.map +1 -0
  136. package/dist/session-stats.js +48 -0
  137. package/dist/session-stats.js.map +1 -0
  138. package/dist/speed-tracker.d.ts +7 -0
  139. package/dist/speed-tracker.d.ts.map +1 -0
  140. package/dist/speed-tracker.js +34 -0
  141. package/dist/speed-tracker.js.map +1 -0
  142. package/dist/stdin.d.ts +9 -0
  143. package/dist/stdin.d.ts.map +1 -0
  144. package/dist/stdin.js +142 -0
  145. package/dist/stdin.js.map +1 -0
  146. package/dist/themes.d.ts +10 -0
  147. package/dist/themes.d.ts.map +1 -0
  148. package/dist/themes.js +81 -0
  149. package/dist/themes.js.map +1 -0
  150. package/dist/transcript.d.ts +3 -0
  151. package/dist/transcript.d.ts.map +1 -0
  152. package/dist/transcript.js +221 -0
  153. package/dist/transcript.js.map +1 -0
  154. package/dist/types.d.ts +124 -0
  155. package/dist/types.d.ts.map +1 -0
  156. package/dist/types.js +5 -0
  157. package/dist/types.js.map +1 -0
  158. package/dist/usage-api.d.ts +62 -0
  159. package/dist/usage-api.d.ts.map +1 -0
  160. package/dist/usage-api.js +908 -0
  161. package/dist/usage-api.js.map +1 -0
  162. package/dist/utils/format.d.ts +9 -0
  163. package/dist/utils/format.d.ts.map +1 -0
  164. package/dist/utils/format.js +75 -0
  165. package/dist/utils/format.js.map +1 -0
  166. package/dist/utils/terminal.d.ts +5 -0
  167. package/dist/utils/terminal.d.ts.map +1 -0
  168. package/dist/utils/terminal.js +42 -0
  169. package/dist/utils/terminal.js.map +1 -0
  170. package/package.json +36 -0
  171. package/src/alert.ts +75 -0
  172. package/src/burn-rate.ts +45 -0
  173. package/src/cache.ts +57 -0
  174. package/src/claude-config-dir.ts +27 -0
  175. package/src/config-io.ts +26 -0
  176. package/src/config-reader.ts +236 -0
  177. package/src/config.ts +496 -0
  178. package/src/constants.ts +10 -0
  179. package/src/cost-tracker.ts +53 -0
  180. package/src/debug.ts +16 -0
  181. package/src/extra-cmd.ts +125 -0
  182. package/src/git.ts +126 -0
  183. package/src/health-check.ts +50 -0
  184. package/src/index.ts +234 -0
  185. package/src/providers/agent-teams-provider.ts +56 -0
  186. package/src/providers/agw-provider.ts +47 -0
  187. package/src/providers/index.ts +27 -0
  188. package/src/render/agents-line.ts +51 -0
  189. package/src/render/alert-line.ts +11 -0
  190. package/src/render/colors.ts +145 -0
  191. package/src/render/framework-line.ts +34 -0
  192. package/src/render/index.ts +512 -0
  193. package/src/render/lines/environment.ts +41 -0
  194. package/src/render/lines/identity.ts +109 -0
  195. package/src/render/lines/index.ts +4 -0
  196. package/src/render/lines/project.ts +113 -0
  197. package/src/render/lines/usage.ts +79 -0
  198. package/src/render/session-line.ts +253 -0
  199. package/src/render/todos-line.ts +35 -0
  200. package/src/render/tools-line.ts +58 -0
  201. package/src/session-history.ts +62 -0
  202. package/src/session-stats.ts +65 -0
  203. package/src/speed-tracker.ts +51 -0
  204. package/src/stdin.ts +169 -0
  205. package/src/themes.ts +90 -0
  206. package/src/transcript.ts +268 -0
  207. package/src/types.ts +146 -0
  208. package/src/usage-api.ts +1090 -0
  209. package/src/utils/format.ts +79 -0
  210. package/src/utils/terminal.ts +46 -0
@@ -0,0 +1,93 @@
1
+ import { getContextPercent, getBufferedPercent } from '../../stdin.js';
2
+ import { coloredBar, dim, getContextColor, RESET, red, warning } from '../colors.js';
3
+ import { getAdaptiveBarWidth, isNarrowTerminal, isVeryNarrowTerminal } from '../../utils/terminal.js';
4
+ import { formatCost } from '../../cost-tracker.js';
5
+ import { formatTokens, formatContextValue } from '../../utils/format.js';
6
+ const DEBUG = process.env.DEBUG?.includes('claude-hud') || process.env.DEBUG === '*';
7
+ const SPARK_CHARS = '▁▂▃▄▅▆▇█';
8
+ function renderSparkline(values) {
9
+ if (values.length < 2)
10
+ return '';
11
+ const min = Math.min(...values);
12
+ const max = Math.max(...values);
13
+ const range = max - min || 1;
14
+ return values.map(v => {
15
+ const idx = Math.round(((v - min) / range) * (SPARK_CHARS.length - 1));
16
+ return SPARK_CHARS[idx];
17
+ }).join('');
18
+ }
19
+ function ordinal(n) {
20
+ if (n === 1)
21
+ return '1st';
22
+ if (n === 2)
23
+ return '2nd';
24
+ if (n === 3)
25
+ return '3rd';
26
+ return `${n}th`;
27
+ }
28
+ export function renderIdentityLine(ctx) {
29
+ const rawPercent = getContextPercent(ctx.stdin);
30
+ const bufferedPercent = getBufferedPercent(ctx.stdin);
31
+ const autocompactMode = ctx.config?.display?.autocompactBuffer ?? 'enabled';
32
+ const percent = autocompactMode === 'disabled' ? rawPercent : bufferedPercent;
33
+ const colors = ctx.config?.colors;
34
+ if (DEBUG && autocompactMode === 'disabled') {
35
+ console.error(`[claude-hud:context] autocompactBuffer=disabled, showing raw ${rawPercent}% (buffered would be ${bufferedPercent}%)`);
36
+ }
37
+ const display = ctx.config?.display;
38
+ const contextValueMode = display?.contextValue ?? 'percent';
39
+ const contextValue = formatContextValue(ctx, percent, contextValueMode);
40
+ const alertThresholds = ctx.config.alerts?.context
41
+ ? { warningThreshold: ctx.config.alerts.context.warningThreshold, criticalThreshold: ctx.config.alerts.context.criticalThreshold }
42
+ : undefined;
43
+ const contextValueDisplay = `${getContextColor(percent, colors, alertThresholds)}${contextValue}${RESET}`;
44
+ const barStyle = display?.barStyle ?? 'classic';
45
+ let line = display?.showContextBar !== false
46
+ ? `${dim('Context')} ${coloredBar(percent, getAdaptiveBarWidth(), colors, barStyle, alertThresholds)} ${contextValueDisplay}`
47
+ : `${dim('Context')} ${contextValueDisplay}`;
48
+ // Progressive content reduction based on terminal width
49
+ const tw = ctx.terminalWidth;
50
+ const isNarrow = isNarrowTerminal(tw);
51
+ const isVeryNarrow = isVeryNarrowTerminal(tw);
52
+ if (!isVeryNarrow && display?.showTokenBreakdown !== false && percent >= 85) {
53
+ const usage = ctx.stdin.context_window?.current_usage;
54
+ if (usage) {
55
+ const input = formatTokens(usage.input_tokens ?? 0);
56
+ const cache = formatTokens((usage.cache_creation_input_tokens ?? 0) + (usage.cache_read_input_tokens ?? 0));
57
+ line += dim(` (in: ${input}, cache: ${cache})`);
58
+ }
59
+ }
60
+ if (ctx.costEstimate && ctx.config.display.showCost) {
61
+ if (!isNarrow) {
62
+ line += ` ${dim('│')} ${dim(formatCost(ctx.costEstimate.sessionCost))}`;
63
+ }
64
+ }
65
+ if (!isNarrow && ctx.burnRate && ctx.config.display.showBurnRate) {
66
+ const formatted = ctx.burnRate.tokensPerMinute >= 1000
67
+ ? `${(ctx.burnRate.tokensPerMinute / 1000).toFixed(1)}k`
68
+ : `${ctx.burnRate.tokensPerMinute}`;
69
+ line += ` ${dim('│')} ${dim(`${formatted} tok/m`)}`;
70
+ }
71
+ if (!isNarrow && ctx.burnRate && ctx.burnRate.tokensPerMinute > 0 && percent >= (alertThresholds?.warningThreshold ?? 70)) {
72
+ const remaining = ctx.stdin.context_window?.context_window_size
73
+ ? ctx.stdin.context_window.context_window_size - (ctx.stdin.context_window?.current_usage?.input_tokens ?? 0)
74
+ : 0;
75
+ if (remaining > 0) {
76
+ const minsLeft = Math.round(remaining / ctx.burnRate.tokensPerMinute);
77
+ const timeStr = minsLeft >= 60 ? `${Math.floor(minsLeft / 60)}h ${minsLeft % 60}m` : `${minsLeft}m`;
78
+ line += dim(` ~${timeStr}`);
79
+ }
80
+ }
81
+ if (!isVeryNarrow && ctx.sessionStats.autocompactCount > 0) {
82
+ line += dim(` (${ordinal(ctx.sessionStats.autocompactCount)} compact)`);
83
+ }
84
+ if (!isNarrow && ctx.sparkline && ctx.sparkline.length >= 3) {
85
+ line += ` ${dim(renderSparkline(ctx.sparkline))}`;
86
+ }
87
+ if (!isNarrow && ctx.apiLatency !== null && ctx.apiLatency !== undefined && ctx.apiLatency > 0) {
88
+ const latencyColor = ctx.apiLatency > 5000 ? red : ctx.apiLatency > 2000 ? warning : dim;
89
+ line += ` ${latencyColor(`${ctx.apiLatency}ms`)}`;
90
+ }
91
+ return line;
92
+ }
93
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../../src/render/lines/identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { renderIdentityLine } from './identity.js';
2
+ export { renderProjectLine } from './project.js';
3
+ export { renderEnvironmentLine } from './environment.js';
4
+ export { renderUsageLine } from './usage.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/render/lines/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { renderIdentityLine } from './identity.js';
2
+ export { renderProjectLine } from './project.js';
3
+ export { renderEnvironmentLine } from './environment.js';
4
+ export { renderUsageLine } from './usage.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/render/lines/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RenderContext } from '../../types.js';
2
+ export declare function renderProjectLine(ctx: RenderContext): string | null;
3
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../../src/render/lines/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAMpD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CA0GnE"}
@@ -0,0 +1,100 @@
1
+ import { getModelName, getProviderLabel } from '../../stdin.js';
2
+ import { getOutputSpeed } from '../../speed-tracker.js';
3
+ import { cyan, dim, magenta, yellow, red, claudeOrange, colorize, green } from '../colors.js';
4
+ import { isNarrowTerminal } from '../../utils/terminal.js';
5
+ export function renderProjectLine(ctx) {
6
+ const display = ctx.config?.display;
7
+ const parts = [];
8
+ if (display?.activityIndicator) {
9
+ const hasRunning = ctx.transcript.tools.some(t => t.status === 'running');
10
+ const indicator = hasRunning ? colorize('◉', '\x1b[31m') : green('◉');
11
+ parts.unshift(indicator);
12
+ }
13
+ if (display?.showModel !== false) {
14
+ const model = getModelName(ctx.stdin);
15
+ const providerLabel = getProviderLabel(ctx.stdin);
16
+ const showUsage = display?.showUsage !== false;
17
+ const planName = showUsage ? ctx.usageData?.planName : undefined;
18
+ const hasApiKey = !!process.env.ANTHROPIC_API_KEY;
19
+ const billingLabel = showUsage ? (planName ?? (hasApiKey ? red('API') : undefined)) : undefined;
20
+ const planDisplay = providerLabel ?? billingLabel;
21
+ const modelDisplay = planDisplay ? `${model} | ${planDisplay}` : model;
22
+ parts.push(cyan(`[${modelDisplay}]`));
23
+ }
24
+ let projectPart = null;
25
+ if (display?.showProject !== false && ctx.stdin.cwd) {
26
+ const segments = ctx.stdin.cwd.split(/[/\\]/).filter(Boolean);
27
+ const pathLevels = ctx.config?.pathLevels ?? 1;
28
+ const projectPath = segments.length > 0 ? segments.slice(-pathLevels).join('/') : '/';
29
+ projectPart = yellow(projectPath);
30
+ }
31
+ let gitPart = '';
32
+ const gitConfig = ctx.config?.gitStatus;
33
+ const showGit = gitConfig?.enabled ?? true;
34
+ if (showGit && ctx.gitStatus) {
35
+ const gitParts = [ctx.gitStatus.branch];
36
+ if ((gitConfig?.showDirty ?? true) && ctx.gitStatus.isDirty) {
37
+ gitParts.push('*');
38
+ }
39
+ if (gitConfig?.showAheadBehind) {
40
+ if (ctx.gitStatus.ahead > 0) {
41
+ gitParts.push(` ↑${ctx.gitStatus.ahead}`);
42
+ }
43
+ if (ctx.gitStatus.behind > 0) {
44
+ gitParts.push(` ↓${ctx.gitStatus.behind}`);
45
+ }
46
+ }
47
+ if (gitConfig?.showFileStats && ctx.gitStatus.fileStats) {
48
+ const { modified, added, deleted, untracked } = ctx.gitStatus.fileStats;
49
+ const statParts = [];
50
+ if (modified > 0)
51
+ statParts.push(`!${modified}`);
52
+ if (added > 0)
53
+ statParts.push(`+${added}`);
54
+ if (deleted > 0)
55
+ statParts.push(`✘${deleted}`);
56
+ if (untracked > 0)
57
+ statParts.push(`?${untracked}`);
58
+ if (statParts.length > 0) {
59
+ gitParts.push(` ${statParts.join(' ')}`);
60
+ }
61
+ }
62
+ gitPart = `${magenta('git:(')}${cyan(gitParts.join(''))}${magenta(')')}`;
63
+ }
64
+ if (projectPart && gitPart) {
65
+ parts.push(`${projectPart} ${gitPart}`);
66
+ }
67
+ else if (projectPart) {
68
+ parts.push(projectPart);
69
+ }
70
+ else if (gitPart) {
71
+ parts.push(gitPart);
72
+ }
73
+ // Progressive content reduction based on terminal width
74
+ const tw = ctx.terminalWidth;
75
+ const isNarrow = isNarrowTerminal(tw);
76
+ if (!isNarrow && display?.showSessionName && ctx.transcript.sessionName) {
77
+ parts.push(dim(ctx.transcript.sessionName));
78
+ }
79
+ if (!isNarrow && ctx.extraLabel) {
80
+ parts.push(dim(ctx.extraLabel));
81
+ }
82
+ if (display?.showSpeed) {
83
+ const speed = getOutputSpeed(ctx.stdin);
84
+ if (speed !== null) {
85
+ parts.push(dim(`out: ${speed.toFixed(1)} tok/s`));
86
+ }
87
+ }
88
+ if (!isNarrow && display?.showDuration !== false && ctx.sessionDuration) {
89
+ parts.push(dim(`⏱️ ${ctx.sessionDuration}`));
90
+ }
91
+ const customLine = display?.customLine;
92
+ if (customLine) {
93
+ parts.push(claudeOrange(customLine));
94
+ }
95
+ if (parts.length === 0) {
96
+ return null;
97
+ }
98
+ return parts.join(' \u2502 ');
99
+ }
100
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../../src/render/lines/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { RenderContext } from '../../types.js';
2
+ export declare function renderUsageLine(ctx: RenderContext): string | null;
3
+ //# sourceMappingURL=usage.d.ts.map
@@ -0,0 +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;AAOpD,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAsEjE"}
@@ -0,0 +1,65 @@
1
+ import { isLimitReached } from '../../types.js';
2
+ import { getProviderLabel } from '../../stdin.js';
3
+ import { critical, warning, dim, quotaBar } from '../colors.js';
4
+ import { getAdaptiveBarWidth } from '../../utils/terminal.js';
5
+ import { formatResetTime, formatUsageError, formatUsagePercent } from '../../utils/format.js';
6
+ export function renderUsageLine(ctx) {
7
+ const display = ctx.config?.display;
8
+ const colors = ctx.config?.colors;
9
+ if (display?.showUsage === false) {
10
+ return null;
11
+ }
12
+ if (!ctx.usageData?.planName) {
13
+ return null;
14
+ }
15
+ if (getProviderLabel(ctx.stdin)) {
16
+ return null;
17
+ }
18
+ const label = dim('Usage');
19
+ if (ctx.usageData.apiUnavailable) {
20
+ const errorHint = formatUsageError(ctx.usageData.apiError);
21
+ return `${label} ${warning(`⚠${errorHint}`, colors)}`;
22
+ }
23
+ if (isLimitReached(ctx.usageData)) {
24
+ const resetTime = ctx.usageData.fiveHour === 100
25
+ ? formatResetTime(ctx.usageData.fiveHourResetAt)
26
+ : formatResetTime(ctx.usageData.sevenDayResetAt);
27
+ return `${label} ${critical(`⚠ Limit reached${resetTime ? ` (resets ${resetTime})` : ''}`, colors)}`;
28
+ }
29
+ const threshold = display?.usageThreshold ?? 0;
30
+ const fiveHour = ctx.usageData.fiveHour;
31
+ const sevenDay = ctx.usageData.sevenDay;
32
+ const effectiveUsage = Math.max(fiveHour ?? 0, sevenDay ?? 0);
33
+ if (effectiveUsage < threshold) {
34
+ return null;
35
+ }
36
+ const fiveHourDisplay = formatUsagePercent(ctx.usageData.fiveHour, colors);
37
+ const fiveHourReset = formatResetTime(ctx.usageData.fiveHourResetAt);
38
+ const usageBarEnabled = display?.usageBarEnabled ?? true;
39
+ const barStyle = display?.barStyle ?? 'classic';
40
+ const fiveHourPart = usageBarEnabled
41
+ ? (fiveHourReset
42
+ ? `${quotaBar(fiveHour ?? 0, getAdaptiveBarWidth(), colors, barStyle)} ${fiveHourDisplay} (resets in ${fiveHourReset})`
43
+ : `${quotaBar(fiveHour ?? 0, getAdaptiveBarWidth(), colors, barStyle)} ${fiveHourDisplay}`)
44
+ : (fiveHourReset
45
+ ? `5h: ${fiveHourDisplay} (resets in ${fiveHourReset})`
46
+ : `5h: ${fiveHourDisplay}`);
47
+ const sevenDayThreshold = display?.sevenDayThreshold ?? 80;
48
+ const syncingSuffix = ctx.usageData.apiError === 'rate-limited'
49
+ ? ` ${dim('(syncing...)')}`
50
+ : '';
51
+ if (sevenDay !== null && sevenDay >= sevenDayThreshold) {
52
+ const sevenDayDisplay = formatUsagePercent(sevenDay, colors);
53
+ const sevenDayReset = formatResetTime(ctx.usageData.sevenDayResetAt);
54
+ const sevenDayPart = usageBarEnabled
55
+ ? (sevenDayReset
56
+ ? `${quotaBar(sevenDay, getAdaptiveBarWidth(), colors, barStyle)} ${sevenDayDisplay} (resets in ${sevenDayReset})`
57
+ : `${quotaBar(sevenDay, getAdaptiveBarWidth(), colors, barStyle)} ${sevenDayDisplay}`)
58
+ : (sevenDayReset
59
+ ? `7d: ${sevenDayDisplay} (resets in ${sevenDayReset})`
60
+ : `7d: ${sevenDayDisplay}`);
61
+ return `${label} ${fiveHourPart} ${dim('│')} ${sevenDayPart}${syncingSuffix}`;
62
+ }
63
+ return `${label} ${fiveHourPart}${syncingSuffix}`;
64
+ }
65
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../src/render/lines/usage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE9F,MAAM,UAAU,eAAe,CAAC,GAAkB;IAChD,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IACpC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAElC,IAAI,OAAO,EAAE,SAAS,KAAK,KAAK,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;IAE3B,IAAI,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC3D,OAAO,GAAG,KAAK,IAAI,OAAO,CAAC,IAAI,SAAS,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;IACxD,CAAC;IAED,IAAI,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QAClC,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,QAAQ,KAAK,GAAG;YAC9C,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC;YAChD,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACnD,OAAO,GAAG,KAAK,IAAI,QAAQ,CAAC,kBAAkB,SAAS,CAAC,CAAC,CAAC,YAAY,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;IACvG,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,EAAE,cAAc,IAAI,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC;IACxC,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC;IAExC,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,EAAE,QAAQ,IAAI,CAAC,CAAC,CAAC;IAC9D,IAAI,cAAc,GAAG,SAAS,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,eAAe,GAAG,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3E,MAAM,aAAa,GAAG,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAErE,MAAM,eAAe,GAAG,OAAO,EAAE,eAAe,IAAI,IAAI,CAAC;IACzD,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,SAAS,CAAC;IAChD,MAAM,YAAY,GAAG,eAAe;QAClC,CAAC,CAAC,CAAC,aAAa;YACZ,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,IAAI,CAAC,EAAE,mBAAmB,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,eAAe,eAAe,aAAa,GAAG;YACvH,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,IAAI,CAAC,EAAE,mBAAmB,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,eAAe,EAAE,CAAC;QAC/F,CAAC,CAAC,CAAC,aAAa;YACZ,CAAC,CAAC,OAAO,eAAe,eAAe,aAAa,GAAG;YACvD,CAAC,CAAC,OAAO,eAAe,EAAE,CAAC,CAAC;IAElC,MAAM,iBAAiB,GAAG,OAAO,EAAE,iBAAiB,IAAI,EAAE,CAAC;IAC3D,MAAM,aAAa,GAAG,GAAG,CAAC,SAAS,CAAC,QAAQ,KAAK,cAAc;QAC7D,CAAC,CAAC,IAAI,GAAG,CAAC,cAAc,CAAC,EAAE;QAC3B,CAAC,CAAC,EAAE,CAAC;IACP,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,IAAI,iBAAiB,EAAE,CAAC;QACvD,MAAM,eAAe,GAAG,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC7D,MAAM,aAAa,GAAG,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACrE,MAAM,YAAY,GAAG,eAAe;YAClC,CAAC,CAAC,CAAC,aAAa;gBACZ,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,eAAe,eAAe,aAAa,GAAG;gBAClH,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,eAAe,EAAE,CAAC;YAC1F,CAAC,CAAC,CAAC,aAAa;gBACZ,CAAC,CAAC,OAAO,eAAe,eAAe,aAAa,GAAG;gBACvD,CAAC,CAAC,OAAO,eAAe,EAAE,CAAC,CAAC;QAClC,OAAO,GAAG,KAAK,IAAI,YAAY,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,YAAY,GAAG,aAAa,EAAE,CAAC;IAChF,CAAC;IAED,OAAO,GAAG,KAAK,IAAI,YAAY,GAAG,aAAa,EAAE,CAAC;AACpD,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { RenderContext } from '../types.js';
2
+ /**
3
+ * Renders the full session line (model + context bar + project + git + counts + usage + duration).
4
+ * Used for compact layout mode.
5
+ */
6
+ export declare function renderSessionLine(ctx: RenderContext): string;
7
+ //# sourceMappingURL=session-line.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-line.d.ts","sourceRoot":"","sources":["../../src/render/session-line.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAUjD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CA6O5D"}
@@ -0,0 +1,227 @@
1
+ import { isLimitReached } from '../types.js';
2
+ import { getContextPercent, getBufferedPercent, getModelName, getProviderLabel } from '../stdin.js';
3
+ import { getOutputSpeed } from '../speed-tracker.js';
4
+ import { coloredBar, colorize, critical, cyan, dim, green, magenta, red, warning, yellow, getContextColor, quotaBar, claudeOrange, RESET } from './colors.js';
5
+ import { getAdaptiveBarWidth } from '../utils/terminal.js';
6
+ import { formatTokens, formatContextValue, formatResetTime, formatUsageError, formatUsagePercent } from '../utils/format.js';
7
+ const DEBUG = process.env.DEBUG?.includes('claude-hud') || process.env.DEBUG === '*';
8
+ /**
9
+ * Renders the full session line (model + context bar + project + git + counts + usage + duration).
10
+ * Used for compact layout mode.
11
+ */
12
+ export function renderSessionLine(ctx) {
13
+ const model = getModelName(ctx.stdin);
14
+ const rawPercent = getContextPercent(ctx.stdin);
15
+ const bufferedPercent = getBufferedPercent(ctx.stdin);
16
+ const autocompactMode = ctx.config?.display?.autocompactBuffer ?? 'enabled';
17
+ const percent = autocompactMode === 'disabled' ? rawPercent : bufferedPercent;
18
+ if (DEBUG && autocompactMode === 'disabled') {
19
+ console.error(`[claude-hud:context] autocompactBuffer=disabled, showing raw ${rawPercent}% (buffered would be ${bufferedPercent}%)`);
20
+ }
21
+ const colors = ctx.config?.colors;
22
+ const barWidth = getAdaptiveBarWidth();
23
+ const barStyle = ctx.config?.display?.barStyle ?? 'classic';
24
+ const bar = coloredBar(percent, barWidth, colors, barStyle);
25
+ const parts = [];
26
+ const display = ctx.config?.display;
27
+ const contextValueMode = display?.contextValue ?? 'percent';
28
+ const contextValue = formatContextValue(ctx, percent, contextValueMode);
29
+ const contextValueDisplay = `${getContextColor(percent, colors)}${contextValue}${RESET}`;
30
+ // Model and context bar (FIRST)
31
+ // Plan name only shows if showUsage is enabled (respects hybrid toggle)
32
+ const providerLabel = getProviderLabel(ctx.stdin);
33
+ const showUsage = display?.showUsage !== false;
34
+ const planName = showUsage ? ctx.usageData?.planName : undefined;
35
+ const hasApiKey = !!process.env.ANTHROPIC_API_KEY;
36
+ const billingLabel = showUsage ? (planName ?? (hasApiKey ? red('API') : undefined)) : undefined;
37
+ const planDisplay = providerLabel ?? billingLabel;
38
+ const modelDisplay = planDisplay ? `${model} | ${planDisplay}` : model;
39
+ if (display?.showModel !== false && display?.showContextBar !== false) {
40
+ parts.push(`${cyan(`[${modelDisplay}]`)} ${bar} ${contextValueDisplay}`);
41
+ }
42
+ else if (display?.showModel !== false) {
43
+ parts.push(`${cyan(`[${modelDisplay}]`)} ${contextValueDisplay}`);
44
+ }
45
+ else if (display?.showContextBar !== false) {
46
+ parts.push(`${bar} ${contextValueDisplay}`);
47
+ }
48
+ else {
49
+ parts.push(contextValueDisplay);
50
+ }
51
+ if (display?.activityIndicator) {
52
+ const hasRunning = ctx.transcript.tools.some(t => t.status === 'running');
53
+ const indicator = hasRunning ? colorize('◉', '\x1b[31m') : green('◉');
54
+ parts.unshift(indicator);
55
+ }
56
+ if (ctx.burnRate && display?.showBurnRate) {
57
+ const formatted = ctx.burnRate.tokensPerMinute >= 1000
58
+ ? `${(ctx.burnRate.tokensPerMinute / 1000).toFixed(1)}k`
59
+ : `${ctx.burnRate.tokensPerMinute}`;
60
+ parts.push(dim(`${formatted} tok/m`));
61
+ }
62
+ // Project path + git status (SECOND)
63
+ let projectPart = null;
64
+ if (display?.showProject !== false && ctx.stdin.cwd) {
65
+ // Split by both Unix (/) and Windows (\) separators for cross-platform support
66
+ const segments = ctx.stdin.cwd.split(/[/\\]/).filter(Boolean);
67
+ const pathLevels = ctx.config?.pathLevels ?? 1;
68
+ // Always join with forward slash for consistent display
69
+ // Handle root path (/) which results in empty segments
70
+ const projectPath = segments.length > 0 ? segments.slice(-pathLevels).join('/') : '/';
71
+ projectPart = yellow(projectPath);
72
+ }
73
+ let gitPart = '';
74
+ const gitConfig = ctx.config?.gitStatus;
75
+ const showGit = gitConfig?.enabled ?? true;
76
+ if (showGit && ctx.gitStatus) {
77
+ const gitParts = [ctx.gitStatus.branch];
78
+ // Show dirty indicator
79
+ if ((gitConfig?.showDirty ?? true) && ctx.gitStatus.isDirty) {
80
+ gitParts.push('*');
81
+ }
82
+ // Show ahead/behind (with space separator for readability)
83
+ if (gitConfig?.showAheadBehind) {
84
+ if (ctx.gitStatus.ahead > 0) {
85
+ gitParts.push(` ↑${ctx.gitStatus.ahead}`);
86
+ }
87
+ if (ctx.gitStatus.behind > 0) {
88
+ gitParts.push(` ↓${ctx.gitStatus.behind}`);
89
+ }
90
+ }
91
+ // Show file stats in Starship-compatible format (!modified +added ✘deleted ?untracked)
92
+ if (gitConfig?.showFileStats && ctx.gitStatus.fileStats) {
93
+ const { modified, added, deleted, untracked } = ctx.gitStatus.fileStats;
94
+ const statParts = [];
95
+ if (modified > 0)
96
+ statParts.push(`!${modified}`);
97
+ if (added > 0)
98
+ statParts.push(`+${added}`);
99
+ if (deleted > 0)
100
+ statParts.push(`✘${deleted}`);
101
+ if (untracked > 0)
102
+ statParts.push(`?${untracked}`);
103
+ if (statParts.length > 0) {
104
+ gitParts.push(` ${statParts.join(' ')}`);
105
+ }
106
+ }
107
+ gitPart = `${magenta('git:(')}${cyan(gitParts.join(''))}${magenta(')')}`;
108
+ }
109
+ if (projectPart && gitPart) {
110
+ parts.push(`${projectPart} ${gitPart}`);
111
+ }
112
+ else if (projectPart) {
113
+ parts.push(projectPart);
114
+ }
115
+ else if (gitPart) {
116
+ parts.push(gitPart);
117
+ }
118
+ // Session name (custom title from /rename, or auto-generated slug)
119
+ if (display?.showSessionName && ctx.transcript.sessionName) {
120
+ parts.push(dim(ctx.transcript.sessionName));
121
+ }
122
+ // Config counts (respects environmentThreshold)
123
+ if (display?.showConfigCounts !== false) {
124
+ const totalCounts = ctx.claudeMdCount + ctx.rulesCount + ctx.mcpCount + ctx.hooksCount;
125
+ const envThreshold = display?.environmentThreshold ?? 0;
126
+ if (totalCounts > 0 && totalCounts >= envThreshold) {
127
+ if (ctx.claudeMdCount > 0) {
128
+ parts.push(dim(`${ctx.claudeMdCount} CLAUDE.md`));
129
+ }
130
+ if (ctx.rulesCount > 0) {
131
+ parts.push(dim(`${ctx.rulesCount} rules`));
132
+ }
133
+ if (ctx.mcpCount > 0) {
134
+ parts.push(dim(`${ctx.mcpCount} MCPs`));
135
+ }
136
+ if (ctx.hooksCount > 0) {
137
+ parts.push(dim(`${ctx.hooksCount} hooks`));
138
+ }
139
+ }
140
+ }
141
+ // Usage limits display (shown when enabled in config, respects usageThreshold)
142
+ if (display?.showUsage !== false && ctx.usageData?.planName && !providerLabel) {
143
+ if (ctx.usageData.apiUnavailable) {
144
+ const errorHint = formatUsageError(ctx.usageData.apiError);
145
+ parts.push(warning(`usage: ⚠${errorHint}`, colors));
146
+ }
147
+ else if (isLimitReached(ctx.usageData)) {
148
+ const resetTime = ctx.usageData.fiveHour === 100
149
+ ? formatResetTime(ctx.usageData.fiveHourResetAt)
150
+ : formatResetTime(ctx.usageData.sevenDayResetAt);
151
+ parts.push(critical(`⚠ Limit reached${resetTime ? ` (resets ${resetTime})` : ''}`, colors));
152
+ }
153
+ else {
154
+ const usageThreshold = display?.usageThreshold ?? 0;
155
+ const fiveHour = ctx.usageData.fiveHour;
156
+ const sevenDay = ctx.usageData.sevenDay;
157
+ const effectiveUsage = Math.max(fiveHour ?? 0, sevenDay ?? 0);
158
+ if (effectiveUsage >= usageThreshold) {
159
+ const syncingSuffix = ctx.usageData.apiError === 'rate-limited'
160
+ ? ` ${dim('(syncing...)')}`
161
+ : '';
162
+ const fiveHourDisplay = formatUsagePercent(fiveHour, colors);
163
+ const fiveHourReset = formatResetTime(ctx.usageData.fiveHourResetAt);
164
+ const usageBarEnabled = display?.usageBarEnabled ?? true;
165
+ const fiveHourPart = usageBarEnabled
166
+ ? (fiveHourReset
167
+ ? `${quotaBar(fiveHour ?? 0, barWidth, colors, barStyle)} ${fiveHourDisplay} (${fiveHourReset} / 5h)`
168
+ : `${quotaBar(fiveHour ?? 0, barWidth, colors, barStyle)} ${fiveHourDisplay}`)
169
+ : (fiveHourReset
170
+ ? `5h: ${fiveHourDisplay} (${fiveHourReset})`
171
+ : `5h: ${fiveHourDisplay}`);
172
+ const sevenDayThreshold = display?.sevenDayThreshold ?? 80;
173
+ if (sevenDay !== null && sevenDay >= sevenDayThreshold) {
174
+ const sevenDayDisplay = formatUsagePercent(sevenDay, colors);
175
+ const sevenDayReset = formatResetTime(ctx.usageData.sevenDayResetAt);
176
+ const sevenDayPart = usageBarEnabled
177
+ ? (sevenDayReset
178
+ ? `${quotaBar(sevenDay, barWidth, colors, barStyle)} ${sevenDayDisplay} (${sevenDayReset} / 7d)`
179
+ : `${quotaBar(sevenDay, barWidth, colors, barStyle)} ${sevenDayDisplay}`)
180
+ : (sevenDayReset
181
+ ? `7d: ${sevenDayDisplay} (${sevenDayReset})`
182
+ : `7d: ${sevenDayDisplay}`);
183
+ parts.push(`${fiveHourPart} ${dim('│')} ${sevenDayPart}${syncingSuffix}`);
184
+ }
185
+ else {
186
+ parts.push(`${fiveHourPart}${syncingSuffix}`);
187
+ }
188
+ }
189
+ }
190
+ }
191
+ // Session duration
192
+ if (display?.showSpeed) {
193
+ const speed = getOutputSpeed(ctx.stdin);
194
+ if (speed !== null) {
195
+ parts.push(dim(`out: ${speed.toFixed(1)} tok/s`));
196
+ }
197
+ }
198
+ if (display?.showDuration !== false && ctx.sessionDuration) {
199
+ parts.push(dim(`⏱️ ${ctx.sessionDuration}`));
200
+ }
201
+ if (ctx.extraLabel) {
202
+ parts.push(dim(ctx.extraLabel));
203
+ }
204
+ // Custom line (static user-defined text)
205
+ const customLine = display?.customLine;
206
+ if (customLine) {
207
+ parts.push(claudeOrange(customLine));
208
+ }
209
+ if (ctx.alerts && ctx.alerts.length > 0) {
210
+ const criticalAlert = ctx.alerts.find(a => a.type.includes('critical'));
211
+ if (criticalAlert) {
212
+ parts.push(red(`⚠ ${criticalAlert.message}`));
213
+ }
214
+ }
215
+ let line = parts.join(' | ');
216
+ // Token breakdown at high context
217
+ if (display?.showTokenBreakdown !== false && percent >= 85) {
218
+ const usage = ctx.stdin.context_window?.current_usage;
219
+ if (usage) {
220
+ const input = formatTokens(usage.input_tokens ?? 0);
221
+ const cache = formatTokens((usage.cache_creation_input_tokens ?? 0) + (usage.cache_read_input_tokens ?? 0));
222
+ line += dim(` (in: ${input}, cache: ${cache})`);
223
+ }
224
+ }
225
+ return line;
226
+ }
227
+ //# sourceMappingURL=session-line.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-line.js","sourceRoot":"","sources":["../../src/render/session-line.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { RenderContext } from '../types.js';
2
+ export declare function renderTodosLine(ctx: RenderContext): string | null;
3
+ //# sourceMappingURL=todos-line.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todos-line.d.ts","sourceRoot":"","sources":["../../src/render/todos-line.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CA6BjE"}
@@ -0,0 +1,29 @@
1
+ import { yellow, green, dim, claudeOrange } from './colors.js';
2
+ import { truncateString } from '../utils/format.js';
3
+ export function renderTodosLine(ctx) {
4
+ const { todos } = ctx.transcript;
5
+ if (!todos || todos.length === 0) {
6
+ return null;
7
+ }
8
+ const inProgress = todos.find((t) => t.status === 'in_progress');
9
+ const completed = todos.filter((t) => t.status === 'completed').length;
10
+ const total = todos.length;
11
+ if (!inProgress) {
12
+ if (completed === total && total > 0) {
13
+ return `${green('✓')} All todos complete ${dim(`(${completed}/${total})`)}`;
14
+ }
15
+ return null;
16
+ }
17
+ const content = truncateString(inProgress.content, 50);
18
+ const progress = dim(`(${completed}/${total})`);
19
+ const miniBar = ctx.transcript.todos.slice(0, 10).map(todo => {
20
+ if (todo.status === 'completed')
21
+ return green('▪');
22
+ if (todo.status === 'in_progress')
23
+ return claudeOrange('▪');
24
+ return dim('▪');
25
+ }).join('');
26
+ const suffix = ctx.transcript.todos.length > 10 ? dim('…') : '';
27
+ return `${yellow('▸')} ${content} ${progress} │ ${miniBar}${suffix}`;
28
+ }
29
+ //# sourceMappingURL=todos-line.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todos-line.js","sourceRoot":"","sources":["../../src/render/todos-line.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,UAAU,eAAe,CAAC,GAAkB;IAChD,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC;IAEjC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;IACvE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAE3B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,IAAI,SAAS,KAAK,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACrC,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,uBAAuB,GAAG,CAAC,IAAI,SAAS,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC9E,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,SAAS,IAAI,KAAK,GAAG,CAAC,CAAC;IAEhD,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QAC3D,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW;YAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC;QACnD,IAAI,IAAI,CAAC,MAAM,KAAK,aAAa;YAAE,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;QAC5D,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEhE,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,OAAO,IAAI,QAAQ,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC;AACvE,CAAC"}