Repository navigation
feat(web): move the composer's + and mic buttons into the control row - #172
Conversation
The + (attach) and mic buttons sat next to the prompt. They now live at the left end of the composer's control row, before Full access, so send is the only button beside the prompt. A live dictation session still takes over the send slot; the control-row mic stays put, disabled, so the row doesn't shift. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
There was a problem hiding this comment.
Thermo-nuclear on HEAD c4f305dc: no major structural issues.
The move deletes the old model. dictationOwnsPrimaryAction is now isAvailable && blocksSubmission. The leading slot, the two-column grids, the hidden ghost width-reserve, and the idle-empty / resume-yield send-slot gate are gone. Attach and the mic land in the existing left slot. Send is the only prompt-row button. Net −136. No file crosses 1k.
Do not add a ComposerShell leading prop back. Do not decompose ChatComposer / theme.custom.css / yaml.
Sent by Cursor Automation: Thermo nuke 4.6
NoahHendrickson
left a comment
There was a problem hiding this comment.
Reviewed commit c4f305dc7f002de885cfd1ecec3045d5f27d856a.
No actionable correctness findings in this diff. I traced the moved attach/mic controls, idle versus active dictation slot ownership, resume/stop paths, pending-question and approval gates, and the draft/started-thread CSS layouts. The change applies to web and the desktop web shell; native mobile, provider adapters, RPC contracts, and connection handling are unchanged.
Validation: all 54 tests passed across forkComposerShell, forkLocalDictation, forkNewAgentDraft, and ComposerPrimaryActions, using the web app's test configuration. git diff --check also passed.
Two remaining verification caveats:
- No running-client visual pass was performed, so narrow-width layout, file-picker interaction, and live dictation geometry still need visual verification. The PR currently has no before/after screenshots.
- CI is not fully green:
Test Server 4fails inAcpSessionRuntime.processTree.test.ts, “rotates more than 64 live parents without scanning retained tombstones,” with retained processes1084, 11084. That code is untouched by this PR; I found no connection to this composer change. Failing job.
Reviewed by GPT-6 Astra via the Codex harness.


The
+(attach) and mic buttons sat beside the prompt, and an idle mic took over the send slot whenever the prompt was empty. They now sit at the left end of the composer's control row, in the order [+] [mic] [Full access] [Build/Plan], with model and effort still on the right. Send is the only button beside the prompt.Behaviour
+is disabled during a session, as before.+in the prompt row; the prompt just stacks above the send row.Visible side effects
+and the mic are now 20px squares with 12px icons in the row's grey, to match Full access and Build/Plan. Before, they were 24px and white in dark mode.⋯menu slightly sooner.Changes:
ChatComposer.tsx(the dictation slot gate, the attach button and mic moved intomodeControls),custom/ComposerShell.tsx,custom/voice/ForkDictationControl.tsx,theme.custom.css, comments inComposerPrimaryActions.tsx, and the three guard tests plus.fork/customizations.yamlupdated for the new placement. Rebased onto the currentcustom, which includes the orchestrator-V2 sync.Verified: fork guards and the
ComposerPrimaryActionstests pass (513), plus web typecheck, lint and format. Not checked in a running app, and no screenshots attached.🤖 Generated with Claude Code