Skip to content

feat(tui): hover tooltip on status bar model segment - #41968

Open
marsmensch wants to merge 1 commit into
NousResearch:mainfrom
marsmensch:feat/tui-status-bar-hover-tooltips
Open

feat(tui): hover tooltip on status bar model segment#41968
marsmensch wants to merge 1 commit into
NousResearch:mainfrom
marsmensch:feat/tui-status-bar-hover-tooltips

Conversation

@marsmensch

Copy link
Copy Markdown

Summary

Hovering over the model+context segment in the Ink TUI status bar shows a FloatBox tooltip with the full model ID, provider, reasoning effort (when non-default), and fast-mode state.

Changes

  • tui_gateway/server.py: add provider to _session_info() payload
  • ui-tui/src/types.ts: SessionInfo.provider?: string
  • ui-tui/src/app/interfaces.ts: add statusTooltip: null | { lines: string[] } to OverlayState (excluded from $isBlocked — informational only)
  • ui-tui/src/app/overlayStore.ts: initialise statusTooltip: null; cleared by resetFlowOverlays()
  • ui-tui/src/components/appChrome.tsx: buildModelTooltip() helper; provider prop on StatusRule; onMouseEnter/onMouseLeave on the pinned model+ctx Box fires patchOverlayState
  • ui-tui/src/components/appLayout.tsx: pass provider={ui.info?.provider} to StatusRule
  • ui-tui/src/components/appOverlays.tsx: render FloatBox when overlay.statusTooltip is set

Validation

Before After
Model segment hover no feedback FloatBox: model: … / provider: … / reasoning: … / fast mode: on
statusTooltip blocks input no ($isBlocked unchanged)
tsc --noEmit in changed files clean clean
npm run build (ui-tui)

Hovering over the model·effort·ctx segment in the Ink TUI status bar
now pops a FloatBox tooltip with the full model ID, provider, reasoning
effort (when non-default), and fast-mode status.

Changes:
- tui_gateway/server.py: add 'provider' field to _session_info() dict
- types.ts: SessionInfo.provider?: string
- interfaces.ts: OverlayState.statusTooltip: null | { lines: string[] }
- overlayStore.ts: initialise statusTooltip: null in buildOverlayState()
  (excluded from $isBlocked — informational only, must not block input;
  cleared by resetFlowOverlays() as a transient/hover-driven overlay)
- appChrome.tsx: buildModelTooltip() helper; provider prop on StatusRule;
  onMouseEnter/onMouseLeave on the pinned model+ctx Box fires
  patchOverlayState({ statusTooltip }) / clears it
- appLayout.tsx: thread provider={ui.info?.provider} to StatusRule
- appOverlays.tsx: render FloatBox when overlay.statusTooltip is set
@marsmensch

Copy link
Copy Markdown
Author

This PR is provided mainly as usability enhancement similar to Hermes Desktop this PR

@alt-glitch alt-glitch added type/feature New feature or request comp/tui Terminal UI (ui-tui/ + tui_gateway/) P3 Low — cosmetic, nice to have labels Jun 8, 2026

@teknium1 teknium1 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the focused TUI usability contribution. The feature premise remains valid on current main: the model/context segment at ui-tui/src/components/appChrome.tsx:575-592 has no hover handling or tooltip rendering.

Problems

  • Current main already emits provider from _session_info() at tui_gateway/server.py:3373 (and the lazy path preserves it at :5466-5467), so the backend hunk is redundant.
  • The proposed tooltip is rendered through FloatingOverlays, which is composer-relative (ui-tui/src/components/appLayout.tsx:355-367; appOverlays.tsx:162). The default status bar is top-mounted (uiStore.ts:29, appLayout.tsx:353), so this does not place the tooltip next to the hovered status segment.
  • No tests cover the new hover/state/wire behavior; current focused suites exist under ui-tui/src/__tests__/appChromeStatusRule.test.tsx and tests/tui_gateway/test_reasoning_session_scope.py.

Suggested changes

  • Salvage only the TypeScript/UI plumbing; omit the already-landed backend field.
  • Mount the tooltip in status-bar-relative layout and cover top/bottom status-bar placement plus the non-blocking overlay invariant.

Automated hermes-sweeper review.

Comment thread tui_gateway/server.py
yolo = False
info: dict = {
"model": getattr(agent, "model", ""),
"provider": getattr(agent, "provider", None) or "",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Current main already emits this field from _session_info() at tui_gateway/server.py:3373, and _lazy_resume_info() preserves a provider too at :5466-5467. Please omit this redundant backend hunk when salvaging the UI change.

@teknium1 teknium1 added the sweeper:blast-moderate Sweeper blast radius: moderate — a subsystem or single platform label Jul 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

comp/tui Terminal UI (ui-tui/ + tui_gateway/) P3 Low — cosmetic, nice to have sweeper:blast-moderate Sweeper blast radius: moderate — a subsystem or single platform type/feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants