Skip to content

fix(web): restore letter navigation in the effort picker - #29418

Open
nimobeeren wants to merge 1 commit into
pingdotgg:mainfrom
nimobeeren:fix/effort-typeahead
Open

nimobeeren wants to merge 1 commit into
pingdotgg:mainfrom
nimobeeren:fix/effort-typeahead

Conversation

@nimobeeren

@nimobeeren nimobeeren commented Nov 2, 2026 •

Copy link
Copy Markdown

Note

🤖 GPT-6.1 Sol is responding on behalf of Nimo.

Problem

After the model and effort pickers were combined in #28057, opening the composer effort picker and pressing a letter such as h no longer focused the effort level such as "High". The effort column handles arrows but lost the old menu's letter navigation.

Change

Match typed letters against enabled row labels, starting after the focused row and wrapping around. Matching is case-insensitive, and repeated letters cycle through matching rows. Enter still applies the focused choice through its existing button handler.

Ignore modified keys and IME composition, and leave portaled option menus to their own keyboard handlers. No new shortcuts, settings, dependencies, or provider-specific mappings.

Scope and approval

Submitted under the very small, focused fix for an obvious bug exception: this restores letter navigation in the replacement for the existing effort menu. One handler and its existing browser test change.

The composer click and effort-shortcut entry points share this column in web and desktop. Settings retains its existing menu navigation. Native mobile, server, contracts, provider adapters, and connection handling are unchanged; matching uses each provider's displayed labels.

Verification

  • Added assertions to the existing effort-column browser test before changing the handler. On the original code, h left focus on Medium instead of High. With the fix, h focuses High, Enter selects it, and l can select Low again. The same test covers repeated-letter cycling, uppercase matching, unmatched and modified keys, arrow navigation, and letter navigation inside a nested option menu.
  • vp test run apps/web/src/components/chat/ComposerModelEffort.browser.test.tsx apps/web/src/components/chat/ProviderModelPicker.browser.test.tsx: 3 tests passed, including the model-to-effort focus handoff.
  • vp run check:changed: format, lint, both knip passes, affected-package typechecks, adjacent tests, and changed-file React Compiler coverage passed. Full suites and builds were not run locally.
  • Nimo supplied the recordings below on macOS. Before is the installed desktop app, whose exact build was not collected. After is the isolated dev web app at c5c4dc2df253be974cb8d0f8aceb8bcb42bf3ac0, using copied Work state and a separate OpenCode database. No paid turn is needed. The agent's integrated browser check was unavailable because the browser tool was disconnected.

Stills extracted from the supplied recordings show h leaving focus on Medium before, and focusing High after while Medium remains selected.

Before After
Before: h leaves focus on Medium After: h focuses High

Recordings: Before · After. Evidence is hosted on GitHub, not committed to the repository.

To check manually, select Medium, open the effort picker with Cmd+Shift+E, press h, and then Enter. High should gain focus and become selected. Arrow keys should continue to work; typing in the model search should not navigate effort rows.

Implemented with GPT-6.1 Sol through the OpenCode harness in T3 Code.

@github-actions github-actions Bot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Nov 2, 2026
@nimobeeren
nimobeeren marked this pull request as ready for review November 2, 2026 15:55
@coderabbitai

coderabbitai Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review.

Recent review info
Run configuration
Commits

Reviewing files that changed from the base of the PR and between ac8dce0 and c5c4dc2.

Files selected for processing: 2
  • apps/web/src/components/chat/ComposerModelEffort.browser.test.tsx
  • apps/web/src/components/chat/ComposerModelEffort.tsx

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.

Walkthrough

The composer now supports printable-character navigation between reasoning options. The browser test adds a Max option and checks letter-key selection, invalid input, case matching, and arrow navigation to Speed.

Changes: Reasoning option keyboard navigation

Layer / File(s) Summary
Typeahead and arrow navigation
apps/web/src/components/chat/ComposerModelEffort.tsx, apps/web/src/components/chat/ComposerModelEffort.browser.test.tsx
moveBetweenRows supports case-insensitive printable-character searches across reasoning rows while retaining arrow navigation. The browser test adds a Max option and checks letter-key navigation, invalid input, case matching, and navigation to Speed.

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Bug fix

Suggested labels: bugfix

Suggested reviewers: t3dotgg, macroscopeapp

Merge Risk: Minimal · up to c5c4d

No actionable merge-blocking risk was identified.

Pre-merge checks: Passed 4
Check name Status Explanation
Title check Passed The title "fix(web): restore letter navigation in the effort picker" matches the main change. The diff adds printable-character typeahead to moveBetweenRows in ComposerModelEffort.tsx, and the test fi…
Description check Passed The description follows the template's main sections: Problem, Change, Scope and approval, and Verification. It explains the regression and the fix, and it cites the CONTRIBUTING prior-approval except…
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Full details: Title check

Explanation

The title "fix(web): restore letter navigation in the effort picker" matches the main change. The diff adds printable-character typeahead to moveBetweenRows in ComposerModelEffort.tsx, and the test file covers letter navigation across reasoning levels. The title follows conventional commit form and is specific, so it passes.

Full details: Description check

Explanation

The description follows the template's main sections: Problem, Change, Scope and approval, and Verification. It explains the regression and the fix, and it cites the CONTRIBUTING prior-approval exception for a very small, focused fix. It gives concrete verification: test runs, before/after behavior, and before/after evidence. It also states what was not checked: full suites and builds were not run locally, and the integrated browser check was unavailable. The template's required before/after screenshots are present. Minor gaps remain: the before build is not pinned, and the test run covers only the two browser test files. These gaps do not make the description incomplete.

Finishing Touches
Generate unit tests (beta)
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

@maria-rcks

maria-rcks commented Nov 3, 2026 •

Copy link
Copy Markdown
Collaborator

Note

Written by gpt-6.1-sol on behalf of Maria

Verified in a real dev environment

Verified unchanged head c5c4dc2df253be974cb8d0f8aceb8bcb42bf3ac0 on Linux with the repository's Playwright and /usr/bin/google-chrome. Ran vp i and the real dev app on both github/main (f6503f0e71) in a separate worktree and the exact PR head, one server at a time. Created the project, threads, and turns through the UI against empty isolated databases. No mocks or replay provider.

  • Main: select Codex gpt-6.1-sol, Medium, open with Ctrl+Shift+E, press h. Focus stays on Medium, reproducing the bug.
  • PR: the same keys focus High while Medium remains selected. Enter selects High. A real Codex turn returns effort verification ok.; Codex's own turn context records model=gpt-6.1-sol, effort=high. Main's comparison turn records effort=medium.
  • Nearby behavior: m/M cycles Max and Medium, arrows still navigate, unmatched and Ctrl-modified keys preserve focus, model search filters without changing effort, High persists after reload, and l + Enter selects Low again.
  • Blacksmith: the existing ComposerModelEffort and ProviderModelPicker browser test files pass, 3 tests total. Installed the worker's missing Chromium prerequisite before rerunning. PR checks: 26 successful, zero failing or pending. No source changes needed.

Before: main after h, Medium still focused and selected.

main: h leaves focus on Medium

After: PR after h, High focused while Medium is still selected.

pr: h focuses High before Enter

Recording: Medium → h → High focus → Enter → High selection → real Codex response. Inspected the capture and checked uploaded playback and seeking.

effort keyboard selection followed by a real codex turn

Short runtime transcript

Not verified

Native desktop, iOS/Android, macOS/Windows shortcuts, other providers, remote/relay connections, and real IME input were not exercised on this Linux VM. Portaled option-menu isolation was covered by the existing browser test, not a real provider option menu. GitHub does not render this externally hosted MP4 inline; playback and seeking were verified in T3's player. Full suites and a fresh check:changed run were not run; no code was changed.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S 10-29 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants