Skip to content

hyp query overview does not adapt to terminal width (96 cols; 9 lines over 80) #410

Description

@bgmcmullen

The overview block does not read stdout.columns, so it renders at a fixed width regardless of the terminal. The widest line is 95 characters and 9 of 64 lines exceed 80, so on an 80-column terminal (SSH, a split pane) the models and repos tables wrap and each wrapped fragment reads as a garbage line - at the closing moment of hyp init.

The daily and tools tables already fit. Only models and repos overflow.

Not urgent: the numbers are correct, and this only bites below 96 columns.

Where the width goes

The widest line is a models row, 95 characters:

part width note
indent 2
provider + gap 11
model + gap 27 sized by claude-haiku-4-5-20251001 (25)
input + gap 11
cached + gap 15 1,169,377,480
output + gap 11
bar 18 BAR_WIDTH

The trap: the bar cannot shrink on its own

Shrinking BAR_WIDTH saves 3 columns, not 14. A column is never narrower than its own header, and the bar's header is by input+output - 15 characters. Below 15 cells, the header sets the floor and further shrinking buys nothing.

An earlier version of this issue claimed the bar alone nearly closed the gap. It does not.

Fix

Two levers, both needed:

  1. Model column (-9). MAX_MODEL_WIDTH = 30 never fires, so claude-haiku-4-5-20251001 sets the column width for every row. Ellipsize at 16 on a narrow terminal.
  2. Bar and its header (-12). Shrink BAR_WIDTH to ~6 and shorten the header to share. The caption line beneath the table already spells out what the bar charts, so the header is not carrying that meaning alone.

Together: 95 to 74. Measured, not estimated - mockup below.

Plumbing: read stdout.columns in both callers (default 100 when absent, so piped output stays stable and tests stay deterministic), thread it into renderOverview, and give renderTable a width budget.

Every token count stays exact. Only the two columns carrying no information give ground.

Before, at 80 columns

  provider   model                          input         cached     output  by
input+output
  anthropic  claude-fable-5             1,428,442  1,169,377,480  8,432,056  ▒▒▒
███████████████
  anthropic  claude-opus-4-8            1,634,958    741,775,344  7,437,378  ▒▒▒
██████████████
  openai     gpt-5.5                      894,318     13,570,048     89,598  ▒▒█

After

  provider   model                 input         cached     output  share
  anthropic  claude-fable-5    1,428,442  1,169,377,480  8,432,056  ▒█████
  anthropic  claude-opus-4-8   1,634,958    741,775,344  7,437,378  ▒█████
  openai     gpt-5.5             894,318     13,570,048     89,598  ▒█
  anthropic  claude-sonnet-5       3,978     45,466,960    363,797  ▒█
  anthropic  claude-opus-5        19,373     40,202,516     90,898  ▒█
  anthropic  claude-haiku-4-…      8,688      9,569,514     58,976  ▒█

Rejected: dropping cached on narrow terminals saves 15, but cache is 98.9% of tokens, so hiding it hides where the volume goes. Also rejected: compact units (1.2B). Not needed once the two levers above are pulled, and they trade away precision in the block's primary content.

Measurement note

Raised in review of #407 as 101 columns. I first re-measured it as 132 - wrong, because awk counts bytes and the bar glyphs are 3 bytes each. The character width is 95.

Metadata

Metadata

Assignees

No one assigned

    Labels

    onboardingFirst-run experience: hyp init wizard, enrollment/join, skills+agents install, first query

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions