Skip to content

Replace dashboard thinking-level toggles with dropdown selectors #403

Description

@m-aebrer

Summary

The dashboard's session-level thinking/effort control currently behaves like a cycling toggle. Users must repeatedly click through every available level, while asynchronous state updates can change the displayed value during interaction and make the control feel like it is fighting the user.

Replace the cycling buttons with dropdown selectors so users can choose the intended level directly and predictably.

Current Behavior

  • The desktop session header and mobile overflow menu use buttons that cycle through off → minimal → low → medium → high → xhigh.
  • There is no way to choose a specific level directly.
  • Rapid interaction and live state synchronization can cause the displayed level to change while the user is interacting with the control.
  • The desktop and mobile controls duplicate the same cycling logic.

Proposed Behavior

  • Display the current thinking/effort level in a dropdown selector.
  • Let users choose any supported level directly.
  • Keep the selected value stable while the update is in flight.
  • Ensure stale asynchronous responses cannot overwrite a newer selection.
  • Provide equivalent behavior on desktop and mobile.

Acceptance Criteria

  • The desktop session header uses a dropdown selector instead of a cycling button.
  • The mobile session overflow menu provides the same direct selector.
  • All supported levels appear in the existing order: off, minimal, low, medium, high, xhigh.
  • The selector reflects the runtime's current authoritative level.
  • Selecting a level sends exactly that level to the runtime without cycling through intermediate values.
  • Rapid interaction does not cause the selector to bounce between values or allow an older response to overwrite the latest intended selection.
  • Update failures remain visible through the existing action-error handling.
  • The selector is usable with keyboard, mouse, and touch input.
  • Client tests cover desktop and mobile selection, successful updates, failures, and overlapping asynchronous updates.
  • Documentation referring to dashboard "thinking switchers" is updated to describe the selector.

Technical Notes

  • The duplicated controls are in packages/dashboard/src/client/screens/session.tsx.
  • The existing API is api.setThinking(sessionKey, level) in packages/dashboard/src/client/api.ts.
  • Successful updates currently patch dashboard state through setRuntimeThinkingLevel.
  • Consider extracting a shared selector component so desktop and mobile use identical request and race-handling behavior.
  • Dashboard settings already use a native <select> for the default thinking level and may provide a suitable UX pattern.
  • Relevant tests belong in packages/dashboard/test/client/screens.test.tsx.
  • Documentation references exist in:
    • README.md
    • packages/dashboard/README.md
    • packages/coding-agent/docs/dashboard.md

No matching existing dashboard UX issue was found.

Metadata

Metadata

Assignees

No one assigned

    Labels

    P1Important for workflow completenessdashboardDashboard server or clientenhancementNew feature or requestuxUser experience improvements

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions