simplify prompt bar controls - #2183
Conversation
Prime Agent performance — partialPR Overall: 0 regressed · 0 improved · 13 no clear change · 4 unavailable.
Python runtime
Sandbox cost: ~$0.1739 — no inference calls. Methodology and samplesMain resolved at 2026-09-11T00:12:58.641557+00:00. Harness
Failures:
|
| private readonly getLocationLabel: () => string | undefined = () => undefined, | ||
| private readonly getContextLabel: () => string | undefined = () => undefined, | ||
| private readonly getOverrideLabel: () => string | undefined = () => undefined, | ||
| private readonly getPickerOpen: () => boolean = () => false, |
There was a problem hiding this comment.
Hidden summary remains focusable
Low Severity
render now returns no rows while a picker is open, but isSelectable still treats the summary as available. focusSubagentSummary only gates on isSelectable and getTrayOverrideLabel, and the override label is now forced off during pickers, so focus can move onto an invisible row and swallow input.
Additional Locations (2)
Reviewed by Cursor Bugbot for commit 9aff542. Configure here.
| ); | ||
| const isSlashCommand = slashContext?.kind === "name" && slashContext.prefix === prefix && command !== undefined; | ||
| if (isSlashCommand) { | ||
| const takesArgument = |
There was a problem hiding this comment.
🟡 Medium src/autocomplete.ts:401
Commands that provide getArgumentCompletions but omit takesArgument are completed as /deploy without a separator, so typing an argument produces /deployprod and the command's argument completion cannot trigger. The fallback must treat getArgumentCompletions as indicating that the command takes an argument.
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file @packages/tui/src/autocomplete.ts around line 401:
Commands that provide `getArgumentCompletions` but omit `takesArgument` are completed as `/deploy` without a separator, so typing an argument produces `/deployprod` and the command's argument completion cannot trigger. The fallback must treat `getArgumentCompletions` as indicating that the command takes an argument.
Evidence trail:
Commit 9391a70b8561e05374b4083d8548f2640d71e956: packages/tui/src/autocomplete.ts:231-239, 345-360, 396-415; packages/tui/src/slash-command-context.ts:14-35; packages/coding-agent/docs/extensions.md:1423-1439; packages/coding-agent/src/modes/interactive/interactive-mode.ts:1377-1387.
| this.autocompletePrefix.startsWith("/")); | ||
| const shouldSubmitSlashCommand = | ||
| isSlashCommandCompletion && slashContext?.kind === "name" && slashContext.isAtPromptStart; | ||
| const isTypedExactSlashCommand = this.isSlashNameCompletionAtPromptStart(); |
There was a problem hiding this comment.
🟡 Medium components/editor.ts:756
Accepting an already typed no-argument slash command such as /model with Tab leaves it in the editor instead of submitting it, so the user must press Enter again. The tui.input.tab branch applies the completion, cancels autocomplete, and unconditionally returns; apply the same exact-match check used for Enter and fall through to submission when the completion is a no-op.
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file @packages/tui/src/components/editor.ts around line 756:
Accepting an already typed no-argument slash command such as `/model` with `Tab` leaves it in the editor instead of submitting it, so the user must press `Enter` again. The `tui.input.tab` branch applies the completion, cancels autocomplete, and unconditionally returns; apply the same exact-match check used for `Enter` and fall through to submission when the completion is a no-op.
Evidence trail:
Reviewed commit 9391a70. Inspect: packages/tui/src/components/editor.ts:732-750,753-780,857-870; packages/tui/src/autocomplete.ts:399-415; packages/tui/test/editor.test.ts:2242-2264,2356-2374. Commands: git_diff MERGE_BASE REVIEWED_COMMIT -- packages/tui/src/components/editor.ts; git_grep -F 'isSlashNameCompletionAtPromptStart' -- packages/tui/src/components/editor.ts.
| } | ||
| } else { | ||
| this.cancelAutocomplete(); | ||
| if (!isTypedExactSlashCommand || !completedExistingText) { |
There was a problem hiding this comment.
🟡 Medium components/editor.ts:774
Pressing Enter on a partially typed no-argument slash command inserts the completion but does not submit it, so /mod becomes /model and requires a second Enter. The completedExistingText check rejects any completion that changes the line; submit should instead follow the existing slash-command-at-prompt-start and selected.takesArgument rules.
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file @packages/tui/src/components/editor.ts around line 774:
Pressing Enter on a partially typed no-argument slash command inserts the completion but does not submit it, so `/mod` becomes `/model` and requires a second Enter. The `completedExistingText` check rejects any completion that changes the line; submit should instead follow the existing slash-command-at-prompt-start and `selected.takesArgument` rules.
Evidence trail:
Reviewed commit 6176c0c: `packages/tui/src/components/editor.ts:753-780`; `packages/tui/src/autocomplete.ts:394-415`; `packages/tui/test/editor.test.ts:2266-2288`. Compare behavior with `git diff MERGE_BASE REVIEWED_COMMIT -- packages/tui/src/components/editor.ts packages/tui/test/editor.test.ts`.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
There are 2 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 0735532. Configure here.
| private renderWidgets(): void { | ||
| if (!this.widgetContainerAbove || !this.widgetContainerBelow) return; | ||
| this.renderWidgetContainer(this.widgetContainerAbove, this.extensionWidgetsAbove, true, true); | ||
| this.renderWidgetContainer(this.widgetContainerAbove, this.extensionWidgetsAbove, false, true); |
There was a problem hiding this comment.
Always-false widget spacer parameter
Low Severity
Both renderWidgetContainer call sites now pass false for spacerWhenEmpty, so that flag no longer varies. The parameter and the empty-container spacer branch are leftover ceremony after the extra blank line was removed.
Additional Locations (1)
Triggered by project rule: Review rules
Reviewed by Cursor Bugbot for commit 0735532. Configure here.


Show muted conversation detail status directly above the prompt, with recap on the left and ellipsis truncation reserving room for the status. A blank line separates this row from the chat; there is no gap before the prompt surface. Empty extension widgets add no extra separator.
glm-5.3:high, followed by fast mode when active and live context usage, in the bottom-right tray. Keep manage navigation on the bottom left.Validation: 216 focused prompt layout, startup, status/context usage, and recap regression tests passed after the final position swap; 61 startup tests, including 24 composed layout combinations and actual autocomplete/picker overlay transitions, passed after the final visibility fix;
npm run checkpassed.UI proposals (no ticket)
Note
Simplify prompt bar controls by removing feature hints and reworking context line
FeatureHintComponent, all hint deck/timer/state fromInteractiveMode, startup-hint selection, and related testsPromptContextLinecomponent that renders a blank row plus a context row with left-alignedRecap:text and right-aligned conversation-detail statusgetModelContextLabelcombines provider-stripped model ID, reasoning level, priority status, and context usage into one dim label;getTrayLocationLabeldrops model and shortcut text and only shows depth and manage hintCombinedAutocompleteProvider.applyCompletionandEditorkeyboard handler: no-argument commands complete without trailing space; argument-taking commands keep the separator; confirming an already-complete slash command now submits normallySubagentSummaryLineoutput while an inline picker or overlay is open viaisInlinePickerOpenmodelslash command no longer takes a free-form argument; tray no longer shows exit/follow-up labels during picker interaction; slash-command completions no longer append a trailing space for no-argument commandsMacroscope summarized eb2ab0f.