simplify prompt bar controls - #2183
Conversation
Prime Agent performance — partialPR Overall: 3 regressed · 0 improved · 10 no clear change · 4 unavailable.
Python runtime
Sandbox cost: ~$0.1823 — no inference calls. Methodology and samplesMain resolved at 2026-09-11T20:17:26.909790+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.Fixes ENG-6113.
Design: Prime Agent UI/UX Improvements.
Note
Remove feature hints and reorganize prompt bar labels and completion in
InteractiveModeFeatureHintComponent, the hint deck, scheduling, animation, and suppression logic are removed fromInteractiveModeand its tests.PromptContextLineto render the session recap and a right-aligned conversation-detail status above the prompt with a blank separator row.renderRecapnow uses this component instead of directly prefixing recap text.getModelContextLabel, which combines the normalized model ID, reasoning level, priority tier, and context usage into one dimmed, width-limited label. Tray location and context labels are simplified to show only the manage hint and non-root session depth.SubagentSummaryLinenow hides entirely while a picker is open and drops the bold escape from the subagents label./model;CANONICAL_BUILTIN_SLASH_COMMANDSremovestakesArgument: truefrom themodelentry.Editorconfirm handling now falls through to Enter when a completion leaves text unchanged.Macroscope summarized 129fa2c.
Note
Low Risk
Mostly terminal UI layout and input completion behavior; no auth, data, or session persistence changes beyond display logic.
Overview
Reworks the interactive prompt area so recap and conversation detail status (Collapsed / Details / All output mode) share one muted row directly above the input via new
PromptContextLine, with a blank line separating that row from the chat. Model name, effort, fast mode, and live context usage move into the bottom tray (modelId:effort · tokens), while the upper row no longer duplicates token usage.Removes the feature-discovery hint stack (animated hints during agent runs, startup splash/editor example prompts, and the fresh-chat shortcut hint in the tray). Session navigation in the tray is renamed to manage; depth shows only for subagent sessions. The tray and subagent summary hide while real pickers/overlays are open but stay visible during slash-command autocomplete.
Slash autocomplete is completion-only: Tab/Enter completes without auto-submit; a second Enter runs the command. No-argument commands (including
/model) complete without a trailing space; argument-taking commands still open a parameter slot./modelis no longer treated as a free-form argument command at the builtin metadata level.Reviewed by Cursor Bugbot for commit 129fa2c. Bugbot is set up for automated code reviews on this repo. Configure here.