From cbbdfda2ce4d4e5d76e982c0b068e4d1d5fc5a69 Mon Sep 17 00:00:00 2001 From: oldschoola Date: Tue, 23 Jun 2026 15:49:18 -0700 Subject: [PATCH] fix: normalize tabs in usage notes rendering Address P2 review: sanitizeText preserves \t which can create visual holes in rendered output. Add .replace(/\t/g, ' ') to provider-wide and per-limit notes in usage-report.ts and usage-cli.ts, matching the TUI path which already uses replaceTabs(). --- packages/coding-agent/src/cli/usage-cli.ts | 3 ++- .../src/slash-commands/helpers/usage-report.ts | 7 +++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/coding-agent/src/cli/usage-cli.ts b/packages/coding-agent/src/cli/usage-cli.ts index dc79d7ff9..fe8a7e65d 100644 --- a/packages/coding-agent/src/cli/usage-cli.ts +++ b/packages/coding-agent/src/cli/usage-cli.ts @@ -452,7 +452,8 @@ export function formatUsageBreakdown( ); // Provider-wide disclaimers render once per provider, not per limit. const providerNotes = [...new Set(providerReports.flatMap(report => report.notes ?? []))]; - for (const note of providerNotes) lines.push(` ${chalk.dim(sanitizeText(note.replace(/[\r\n]+/g, " ")))}`); + for (const note of providerNotes) + lines.push(` ${chalk.dim(sanitizeText(note.replace(/[\r\n]+/g, " ").replace(/\t/g, " ")))}`); const labelWidth = providerReports .flatMap(report => report.limits) diff --git a/packages/coding-agent/src/slash-commands/helpers/usage-report.ts b/packages/coding-agent/src/slash-commands/helpers/usage-report.ts index 5efdf877b..d40c89399 100644 --- a/packages/coding-agent/src/slash-commands/helpers/usage-report.ts +++ b/packages/coding-agent/src/slash-commands/helpers/usage-report.ts @@ -55,7 +55,8 @@ function renderUsageReports( const activeAccount = resolveActiveAccount?.(provider); // Provider-wide disclaimers render once per provider, not per limit. const providerNotes = [...new Set(providerReports.flatMap(report => report.notes ?? []))]; - for (const note of providerNotes) lines.push(` ${sanitizeText(note.replace(/[\r\n]+/g, " "))}`); + for (const note of providerNotes) + lines.push(` ${sanitizeText(note.replace(/[\r\n]+/g, " ").replace(/\t/g, " "))}`); for (const report of providerReports) { const inUse = reportMatchesActiveAccount(report, activeAccount); const savedResets = report.resetCredits?.availableCount ?? 0; @@ -88,7 +89,9 @@ function renderUsageReports( lines.push(` resets in ${formatDuration(limit.window.resetsAt - nowMs)}`); } if (limit.notes && limit.notes.length > 0) - lines.push(` ${limit.notes.map(n => sanitizeText(n.replace(/[\r\n]+/g, " "))).join(" • ")}`); + lines.push( + ` ${limit.notes.map(n => sanitizeText(n.replace(/[\r\n]+/g, " ").replace(/\t/g, " "))).join(" • ")}`, + ); } } }