feat(ui): make configuration pickers compact and inline - #2182
feat(ui): make configuration pickers compact and inline#2182kevinjosethomas wants to merge 19 commits into
Conversation
Prime Agent performance — completedPR Overall: 0 regressed · 0 improved · 17 no clear change.
Python runtime
Sandbox cost: ~$0.0861 — no inference calls. Methodology and samplesMain resolved at 2026-09-10T07:09:16.214281+00:00. Harness
|
| conceal(); | ||
| await this.completeModelSelection(model); |
There was a problem hiding this comment.
🟠 High interactive/interactive-mode.ts:8246
The editor regains focus while completeModelSelection(model) is still pending, so users can start another model selection and run setModel concurrently; a slower first selection can then overwrite the newer choice. Keep the configuration menu focused until completeModelSelection completes, and only call conceal() afterward.
- conceal();
await this.completeModelSelection(model);
+ conceal();🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file @packages/coding-agent/src/modes/interactive/interactive-mode.ts around lines 8246-8247:
The editor regains focus while `completeModelSelection(model)` is still pending, so users can start another model selection and run `setModel` concurrently; a slower first selection can then overwrite the newer choice. Keep the configuration menu focused until `completeModelSelection` completes, and only call `conceal()` afterward.
Evidence trail:
c7559680: packages/coding-agent/src/modes/interactive/interactive-mode.ts:8132-8153 (conceal restores editor focus); 8230-8255 (local busy guard, conceal before awaiting completeModelSelection, completion/finalization); 4751-4755 (editor /model command); 8121-8122 (opening a new menu closes the prior one without cancelling its pending async work); 7777-7781 (asynchronous setModel call). Supporting implementations: packages/coding-agent/src/modes/agent-connection/in-process-agent-connection.ts:450-462 and packages/coding-agent/src/modes/agent-connection/daemon-agent-connection.ts:1196-1202.
| @@ -163,12 +93,12 @@ export class ConfigurationMenuComponent extends Container implements Focusable { | |||
| options.onCancel, | |||
| (providerId) => options.modelRegistry.getProviderAuthStatus(providerId), | |||
There was a problem hiding this comment.
Dead configuration tab keybinding
Low Severity
Removing tab navigation left app.configuration.previousTab with no non-test consumer. The exported keybinding still ships in the public map, so custom keybindings.json entries and Shift+Tab resolve to a no-op after the completed picker split.
Triggered by project rule: Review rules
Reviewed by Cursor Bugbot for commit cf53afe. Configure here.
| this.activeBody.getSearchInput().handleInput(keyData); | ||
| return; | ||
| } | ||
| this.activeBody.handleInput(keyData); |
There was a problem hiding this comment.
🟡 Medium components/configuration-menu.ts:171
Left/right input is consumed by ModelSelectorComponent for non-reasoning models, so users cannot move the search cursor or close the picker with left-at-start. Restore the model-tab handling that forwards these keys directly to MenuSearchInput before delegating to activeBody.
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file @packages/coding-agent/src/modes/interactive/components/configuration-menu.ts around line 171:
Left/right input is consumed by `ModelSelectorComponent` for non-reasoning models, so users cannot move the search cursor or close the picker with left-at-start. Restore the model-tab handling that forwards these keys directly to `MenuSearchInput` before delegating to `activeBody`.
Evidence trail:
Reviewed commit 162659e6ffedae38d6ac309dd6bb825b7784b8cb
- packages/coding-agent/src/modes/interactive/components/configuration-menu.ts:170-172
- packages/coding-agent/src/modes/interactive/components/model-selector.ts:379-400, 583-627
- packages/coding-agent/src/modes/interactive/components/modal-back.ts:26-30
- packages/coding-agent/src/core/keybindings.ts:157
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 3 potential issues.
There are 4 total unresolved issues (including 1 from previous review).
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 4c6c64e. Configure here.
| await this.completeModelSelection(model); | ||
| if (thinkingLevel !== undefined) { | ||
| this.applyThinkingLevel(thinkingLevel); | ||
| } |
There was a problem hiding this comment.
Picker effort overrides model-switch default
High Severity
Confirming a model now always applies the picker's resolved effort, which starts from connectionState.thinkingLevel or off. That overwrites setModel's restore path: when the current model has no reasoning, _getThinkingLevelForModelSwitch reapplies the saved default (usually medium), and applyThinkingLevel then forces off. First-time and non-reasoning-to-reasoning switches disable thinking even if the user never touched effort.
Additional Locations (2)
Reviewed by Cursor Bugbot for commit 4c6c64e. Configure here.
| await this.completeModelSelection(model); | ||
| if (thinkingLevel !== undefined) { | ||
| this.applyThinkingLevel(thinkingLevel); | ||
| } |
There was a problem hiding this comment.
Selected effort applied without waiting
Medium Severity
applyThinkingLevel is fire-and-forget after completeModelSelection, and finish() still resolves the picker promise. Callers that await showConfigurationMenu (including onboarding) and users who submit immediately can run against the level setModel just wrote, not the squares they confirmed.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit 4c6c64e. Configure here.
| this.updateList(); | ||
| this.tui.requestRender(); | ||
| } | ||
| return; |
There was a problem hiding this comment.
Arrows always steal search editing
Medium Severity
Left and right now always return from handleInput, even when adjustEffort does nothing. That removes cursor movement in the search field and drops the earlier forward-to-search path. Highlighting a non-reasoning row, or editing a filter, leaves the arrows dead, unlike OAuthSelectorComponent, which only steals them when the field is empty.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit 4c6c64e. Configure here.


npm run checkand 215 focused testsno-ticket: ui proposals tracked in https://app.notion.com/p/3d672940136f817b99a3d97c7d5fa048
Note
Medium Risk
Changes model-selection UX and callback signatures (optional thinking level), plus auth/model apply flows guarded by a busy flag—behavioral regressions are possible though heavily tested.
Overview
Replaces the full-pane configuration overlay with compact inline pickers mounted in the prompt area; closing or canceling restores the editor and draft text. The tab bar is removed—each slash command opens one picker (models, providers, or MCP) led by a bordered search row, with softer row selection styling.
The models picker gains right-aligned provider metadata with a require sign in hint, signed-in-first ordering (Prime Inference pinned when authenticated), effort/reasoning controls (←/→ on the highlighted row, Enter applies model and level together), and inline input/cached/output rates per million tokens with sensible rounding.
Shared menu components gain an
inlinelayout path (trailing segments, width budgeting, page up/down). Onboarding now dismisses the splash before opening model selection rather than holding it until the picker closes.Reviewed by Cursor Bugbot for commit d07c77f. Bugbot is set up for automated code reviews on this repo. Configure here.
Note
Make configuration pickers render inline in the editor container
ConfigurationMenuComponent; each provider, model, and MCP picker is now a standalone single-purpose body with a responsive footer hintMenuPanel,MenuSearchInput,MenuRow, andMenuListwith compact bordered rows, soft selection highlighting, and right-aligned trailing status segmentsModelSelectorComponentwith filled/unfilled square indicators, cyclic left/right adjustment, and a callback that reports the selected level on confirmInteractiveMode.showConfigurationMenuno longer opens a full-pane overlay; tests and out-of-tree callers that depend on overlay lifecycle handles must switch to container-membership checks.ConfigurationMenuComponent.handleInputno longer forwards left/right keys to the search input — those now adjust effort level. Unconfigured model wording changes from "sign in" to "require sign in".Macroscope summarized d07c77f.