cyberine
UsageRun recipes

The stall indicator stays inside the palette (kfapa)

While a reply is streaming, the input frame drifts from the brand accent through the warning tone to the error tone as the stream stays silent, reaching its end state after 8 seconds — the same window that makes the stall row spell out how long it has been quiet.

It used to leave the palette entirely. stallColor returned the accent only while no token had arrived at all; on the FIRST token of every reply the inline formula produced rgb(0,255,255) — pure cyan — and then ramped toward a hard-coded red. Neither endpoint was a palette colour, and cyan means nothing in four of the five variants (in the fifth it is the accent, so it collided).

The ramp now runs over real tokens through a shared rampColor(t, stops) helper in src/tui/theme.ts, available to any other ramp that needs one. Reduced motion still collapses it to a single step rather than a continuous drift — a colour that changes every frame IS motion, and npm run selftest:tui-stall-ramp asserts that branch survives alongside the endpoints.

Known Limitations and Deferred Work. In a variant whose tones are terminal-defined ANSI NAMES rather than hex (the ansi variant), interpolation is undefined, so the ramp SNAPS to the nearest stop instead. Degrading to a step there is correct; emitting an invented rgb() would not be.