From 50fc631d72d9657fa43f40b7b1c92cb178da7990 Mon Sep 17 00:00:00 2001 From: hero4am <254295924+Hero4Am@users.noreply.github.com> Date: Mon, 16 Mar 2026 23:36:48 +0800 Subject: [PATCH] fix: show default values instead of hiding widgets when data unavailable Widgets now display sensible defaults (0, N/A, bash.00) instead of returning null when data is not yet available. This prevents entire status lines from being hidden at session start when context_window, transcript_path, or session_id data hasn't been populated yet. Affected widgets: Model, ContextLength, ContextPercentage, ContextPercentageUsable, ClaudeSessionId, Version, TokensInput, TokensOutput, TokensCached, TokensTotal, SessionCost Co-authored-by: Qwen-Coder --- src/widgets/ClaudeSessionId.ts | 9 +++------ src/widgets/ContextLength.ts | 6 ++---- src/widgets/ContextPercentage.ts | 4 +++- src/widgets/ContextPercentageUsable.ts | 5 ++++- src/widgets/Model.ts | 7 ++----- src/widgets/SessionCost.ts | 8 +------- src/widgets/TokensCached.ts | 6 ++---- src/widgets/TokensInput.ts | 6 ++---- src/widgets/TokensOutput.ts | 6 ++---- src/widgets/TokensTotal.ts | 6 ++---- src/widgets/Version.ts | 6 +++--- 11 files changed, 26 insertions(+), 43 deletions(-) diff --git a/src/widgets/ClaudeSessionId.ts b/src/widgets/ClaudeSessionId.ts index 2b0394d9..b0b4c6ca 100644 --- a/src/widgets/ClaudeSessionId.ts +++ b/src/widgets/ClaudeSessionId.ts @@ -18,13 +18,10 @@ export class ClaudeSessionIdWidget implements Widget { render(item: WidgetItem, context: RenderContext, settings: Settings): string | null { if (context.isPreview) { return item.rawValue ? 'preview-session-id' : 'Session ID: preview-session-id'; - } else { - const sessionId = context.data?.session_id; - if (!sessionId) { - return null; - } - return item.rawValue ? sessionId : `Session ID: ${sessionId}`; } + + const sessionId = context.data?.session_id ?? 'N/A'; + return item.rawValue ? sessionId : `Session ID: ${sessionId}`; } supportsRawValue(): boolean { return true; } diff --git a/src/widgets/ContextLength.ts b/src/widgets/ContextLength.ts index 59859cd3..d598e0e2 100644 --- a/src/widgets/ContextLength.ts +++ b/src/widgets/ContextLength.ts @@ -27,10 +27,8 @@ export class ContextLengthWidget implements Widget { return item.rawValue ? formatTokens(contextLengthTokens) : `Ctx: ${formatTokens(contextLengthTokens)}`; } - if (context.tokenMetrics) { - return item.rawValue ? formatTokens(context.tokenMetrics.contextLength) : `Ctx: ${formatTokens(context.tokenMetrics.contextLength)}`; - } - return null; + const contextLength = context.tokenMetrics?.contextLength ?? 0; + return item.rawValue ? formatTokens(contextLength) : `Ctx: ${formatTokens(contextLength)}`; } supportsRawValue(): boolean { return true; } diff --git a/src/widgets/ContextPercentage.ts b/src/widgets/ContextPercentage.ts index 2f9ffa64..204d40ca 100644 --- a/src/widgets/ContextPercentage.ts +++ b/src/widgets/ContextPercentage.ts @@ -57,7 +57,9 @@ export class ContextPercentageWidget implements Widget { return formatRawOrLabeledValue(item, 'Ctx: ', `${displayPercentage.toFixed(1)}%`); } - return null; + // Default to 0% when no data available + const displayPercentage = isInverse ? 100 : 0; + return formatRawOrLabeledValue(item, 'Ctx: ', `${displayPercentage.toFixed(1)}%`); } getCustomKeybinds(): CustomKeybind[] { diff --git a/src/widgets/ContextPercentageUsable.ts b/src/widgets/ContextPercentageUsable.ts index e2de5176..0d7c4ed7 100644 --- a/src/widgets/ContextPercentageUsable.ts +++ b/src/widgets/ContextPercentageUsable.ts @@ -57,7 +57,10 @@ export class ContextPercentageUsableWidget implements Widget { const displayPercentage = isInverse ? (100 - usedPercentage) : usedPercentage; return formatRawOrLabeledValue(item, 'Ctx(u): ', `${displayPercentage.toFixed(1)}%`); } - return null; + + // Default to 0% when no data available + const displayPercentage = isInverse ? 100 : 0; + return formatRawOrLabeledValue(item, 'Ctx(u): ', `${displayPercentage.toFixed(1)}%`); } getCustomKeybinds(): CustomKeybind[] { diff --git a/src/widgets/Model.ts b/src/widgets/Model.ts index 94b2b90d..c8a75ebf 100644 --- a/src/widgets/Model.ts +++ b/src/widgets/Model.ts @@ -23,12 +23,9 @@ export class ModelWidget implements Widget { const model = context.data?.model; const modelDisplayName = typeof model === 'string' ? model - : (model?.display_name ?? model?.id); + : (model?.display_name ?? model?.id ?? 'N/A'); - if (modelDisplayName) { - return item.rawValue ? modelDisplayName : `Model: ${modelDisplayName}`; - } - return null; + return item.rawValue ? modelDisplayName : `Model: ${modelDisplayName}`; } supportsRawValue(): boolean { return true; } diff --git a/src/widgets/SessionCost.ts b/src/widgets/SessionCost.ts index dd1bdbd4..3b28bb51 100644 --- a/src/widgets/SessionCost.ts +++ b/src/widgets/SessionCost.ts @@ -20,14 +20,8 @@ export class SessionCostWidget implements Widget { return item.rawValue ? '$2.45' : 'Cost: $2.45'; } - const totalCost = context.data?.cost?.total_cost_usd; - if (totalCost === undefined) { - return null; - } - - // Format the cost to 2 decimal places + const totalCost = context.data?.cost?.total_cost_usd ?? 0; const formattedCost = `$${totalCost.toFixed(2)}`; - return item.rawValue ? formattedCost : `Cost: ${formattedCost}`; } diff --git a/src/widgets/TokensCached.ts b/src/widgets/TokensCached.ts index 1a66aba7..c57da331 100644 --- a/src/widgets/TokensCached.ts +++ b/src/widgets/TokensCached.ts @@ -23,10 +23,8 @@ export class TokensCachedWidget implements Widget { return formatRawOrLabeledValue(item, 'Cached: ', '12k'); } - if (context.tokenMetrics) { - return formatRawOrLabeledValue(item, 'Cached: ', formatTokens(context.tokenMetrics.cachedTokens)); - } - return null; + const cachedTokens = context.tokenMetrics?.cachedTokens ?? 0; + return formatRawOrLabeledValue(item, 'Cached: ', formatTokens(cachedTokens)); } supportsRawValue(): boolean { return true; } diff --git a/src/widgets/TokensInput.ts b/src/widgets/TokensInput.ts index 43f30b02..7b33506c 100644 --- a/src/widgets/TokensInput.ts +++ b/src/widgets/TokensInput.ts @@ -29,10 +29,8 @@ export class TokensInputWidget implements Widget { return formatRawOrLabeledValue(item, 'In: ', formatTokens(inputTotalTokens)); } - if (context.tokenMetrics) { - return formatRawOrLabeledValue(item, 'In: ', formatTokens(context.tokenMetrics.inputTokens)); - } - return null; + const inputTokens = context.tokenMetrics?.inputTokens ?? 0; + return formatRawOrLabeledValue(item, 'In: ', formatTokens(inputTokens)); } supportsRawValue(): boolean { return true; } diff --git a/src/widgets/TokensOutput.ts b/src/widgets/TokensOutput.ts index b317b156..ebd83618 100644 --- a/src/widgets/TokensOutput.ts +++ b/src/widgets/TokensOutput.ts @@ -29,10 +29,8 @@ export class TokensOutputWidget implements Widget { return formatRawOrLabeledValue(item, 'Out: ', formatTokens(outputTotalTokens)); } - if (context.tokenMetrics) { - return formatRawOrLabeledValue(item, 'Out: ', formatTokens(context.tokenMetrics.outputTokens)); - } - return null; + const outputTokens = context.tokenMetrics?.outputTokens ?? 0; + return formatRawOrLabeledValue(item, 'Out: ', formatTokens(outputTokens)); } supportsRawValue(): boolean { return true; } diff --git a/src/widgets/TokensTotal.ts b/src/widgets/TokensTotal.ts index 37659bc5..50f178d2 100644 --- a/src/widgets/TokensTotal.ts +++ b/src/widgets/TokensTotal.ts @@ -23,10 +23,8 @@ export class TokensTotalWidget implements Widget { return formatRawOrLabeledValue(item, 'Total: ', '30.6k'); } - if (context.tokenMetrics) { - return formatRawOrLabeledValue(item, 'Total: ', formatTokens(context.tokenMetrics.totalTokens)); - } - return null; + const totalTokens = context.tokenMetrics?.totalTokens ?? 0; + return formatRawOrLabeledValue(item, 'Total: ', formatTokens(totalTokens)); } supportsRawValue(): boolean { return true; } diff --git a/src/widgets/Version.ts b/src/widgets/Version.ts index 436b3a5c..0a8a2717 100644 --- a/src/widgets/Version.ts +++ b/src/widgets/Version.ts @@ -18,10 +18,10 @@ export class VersionWidget implements Widget { render(item: WidgetItem, context: RenderContext, settings: Settings): string | null { if (context.isPreview) { return item.rawValue ? '1.0.0' : 'v1.0.0'; - } else if (context.data?.version) { - return item.rawValue ? context.data.version : `v${context.data.version}`; } - return null; + + const version = context.data?.version ?? 'N/A'; + return item.rawValue ? version : `v${version}`; } supportsRawValue(): boolean { return true; }