fix: wrap HUD output when terminal width is unavailable

This commit is contained in:
Jarrod Watts
2026-04-04 13:59:08 +11:00
parent d9b1a3daae
commit 7ea5f331d9
4 changed files with 70 additions and 10 deletions

View File

@@ -13,6 +13,7 @@ import {
renderMemoryLine,
} from './lines/index.js';
import { dim, RESET } from './colors.js';
import { UNKNOWN_TERMINAL_WIDTH } from '../utils/terminal.js';
// eslint-disable-next-line no-control-regex
const ANSI_ESCAPE_PATTERN = /^\x1b\[[0-9;]*m/;
@@ -25,7 +26,7 @@ function stripAnsi(str: string): string {
return str.replace(ANSI_ESCAPE_GLOBAL, '');
}
function getTerminalWidth(): number | null {
function getTerminalWidth(): number {
const stdoutColumns = process.stdout?.columns;
if (typeof stdoutColumns === 'number' && Number.isFinite(stdoutColumns) && stdoutColumns > 0) {
return Math.floor(stdoutColumns);
@@ -43,7 +44,7 @@ function getTerminalWidth(): number | null {
return envColumns;
}
return null;
return UNKNOWN_TERMINAL_WIDTH;
}
function splitAnsiTokens(str: string): Array<{ type: 'ansi' | 'text'; value: string }> {
@@ -459,9 +460,7 @@ export function render(ctx: RenderContext): void {
}
const physicalLines = lines.flatMap(line => line.split('\n'));
const visibleLines = terminalWidth
? physicalLines.flatMap(line => wrapLineToWidth(line, terminalWidth))
: physicalLines;
const visibleLines = physicalLines.flatMap(line => wrapLineToWidth(line, terminalWidth));
for (const line of visibleLines) {
const outputLine = `${RESET}${line}`;

View File

@@ -1,5 +1,7 @@
export const UNKNOWN_TERMINAL_WIDTH = 40;
// Returns a progress bar width scaled to the current terminal width.
// Wide (>=100): 10, Medium (60-99): 6, Narrow (<60): 4. Defaults to 10.
// Wide (>=100): 10, Medium (60-99): 6, Narrow (<60): 4.
export function getAdaptiveBarWidth(): number {
const stdoutCols = process.stdout?.columns;
const cols = (typeof stdoutCols === 'number' && Number.isFinite(stdoutCols) && stdoutCols > 0)