ux: No feedback in CLI TUI when Shift+Tab thinking cycle is unsupported for current model #209

Open
opened 2026-03-19 02:11:58 +00:00 by jason.woltje · 0 comments
Owner

Summary

When a user presses Shift+Tab and the current model does not support thinking, the CLI TUI silently does nothing. There is no status message, no visual change, and no indication of why the keypress had no effect.

Root Cause

Two compounding problems:

1. The Shift+Tab handler has no guard for unsupported models (packages/cli/src/tui/app.tsx):

if (key.shift && key.tab) {
  const levels = socket.availableThinkingLevels;
  if (levels.length > 0) {
    // cycles anyway even if levels = ["off"]
    socket.setThinkingLevel(next);
  }
  // no else branch — no feedback when levels is empty or only contains "off"
}

2. The bottom bar hides the "off" state entirely (packages/cli/src/tui/components/bottom-bar.tsx):

{thinkingLevel !== 'off' ? ` • ${thinkingLevel}` : ''}

When thinking is "off", nothing renders on the right side of the bottom bar. There is no indicator that thinking is "off" vs "unavailable" — the two states look identical.

Expected Behaviour

  • If availableThinkingLevels is ["off"] or empty: display a short status message such as Thinking not supported for current model
  • The bottom bar should show thinking off (matching the pi TUI) when thinking is supported but disabled, and show nothing (or a muted indicator) when the model has no reasoning capability at all

Affected Files

  • packages/cli/src/tui/app.tsx — Shift+Tab useInput handler
  • packages/cli/src/tui/components/bottom-bar.tsx — thinking level display
## Summary When a user presses Shift+Tab and the current model does not support thinking, the CLI TUI silently does nothing. There is no status message, no visual change, and no indication of why the keypress had no effect. ## Root Cause Two compounding problems: **1. The Shift+Tab handler has no guard for unsupported models** (`packages/cli/src/tui/app.tsx`): ```ts if (key.shift && key.tab) { const levels = socket.availableThinkingLevels; if (levels.length > 0) { // cycles anyway even if levels = ["off"] socket.setThinkingLevel(next); } // no else branch — no feedback when levels is empty or only contains "off" } ``` **2. The bottom bar hides the "off" state entirely** (`packages/cli/src/tui/components/bottom-bar.tsx`): ```tsx {thinkingLevel !== 'off' ? ` • ${thinkingLevel}` : ''} ``` When thinking is "off", nothing renders on the right side of the bottom bar. There is no indicator that thinking is "off" vs "unavailable" — the two states look identical. ## Expected Behaviour - If `availableThinkingLevels` is `["off"]` or empty: display a short status message such as `Thinking not supported for current model` - The bottom bar should show `thinking off` (matching the pi TUI) when thinking is supported but disabled, and show nothing (or a muted indicator) when the model has no reasoning capability at all ## Affected Files - `packages/cli/src/tui/app.tsx` — Shift+Tab `useInput` handler - `packages/cli/src/tui/components/bottom-bar.tsx` — thinking level display
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: mosaicstack/stack#209