Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions webview-ui/src/components/chat/ContextCondenseRow.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@ export const ContextCondenseRow = ({ cost, prevContextTokens, newContextTokens,
const { t } = useTranslation()
const [isExpanded, setIsExpanded] = useState(false)

// Handle null/undefined token values to prevent crashes
const prevTokens = prevContextTokens ?? 0
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I notice we're treating these values as optional here, but the Zod schema in packages/types/src/message.ts defines them as required fields. This creates a type safety issue.

Is this intentional? The schema has:

export const contextCondenseSchema = z.object({
  cost: z.number(),
  prevContextTokens: z.number(),
  newContextTokens: z.number(),
  summary: z.string(),
})

If these values can indeed be null/undefined in practice, we should update the schema to use .number().optional() to maintain type consistency across the codebase.

const newTokens = newContextTokens ?? 0
const displayCost = cost ?? 0
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While defaulting to 0 prevents the crash, could this be misleading to users? When data is unavailable, showing "0 tokens" might imply no tokens were used, when actually the data is missing.

Would it be clearer to display "--" or "N/A" when values are null/undefined?

Suggested change
const displayCost = cost ?? 0
const prevTokens = prevContextTokens ?? 0
const newTokens = newContextTokens ?? 0
const displayCost = cost ?? 0
const hasValidData = prevContextTokens != null && newContextTokens != null


return (
<div className="mb-2">
<div
Expand All @@ -33,9 +38,11 @@ export const ContextCondenseRow = ({ cost, prevContextTokens, newContextTokens,
<span className="codicon codicon-compress text-blue-400" />
<span className="font-bold text-vscode-foreground">{t("chat:contextCondense.title")}</span>
<span className="text-vscode-descriptionForeground text-sm">
{prevContextTokens.toLocaleString()} → {newContextTokens.toLocaleString()} {t("tokens")}
{prevTokens.toLocaleString()} → {newTokens.toLocaleString()} {t("tokens")}
</span>
<VSCodeBadge className={cost > 0 ? "opacity-100" : "opacity-0"}>${cost.toFixed(2)}</VSCodeBadge>
<VSCodeBadge className={displayCost > 0 ? "opacity-100" : "opacity-0"}>
${displayCost.toFixed(2)}
</VSCodeBadge>
</div>
<span className={`codicon codicon-chevron-${isExpanded ? "up" : "down"}`}></span>
</div>
Expand Down
Loading