Skip to content

feat(web): move the composer's + and mic buttons into the control row - #172

Merged
NoahHendrickson merged 1 commit into
customfrom
t3code/move-composer-action-buttons
Oct 10, 2026
Merged

NoahHendrickson merged 1 commit into
customfrom
t3code/move-composer-action-buttons

Conversation

@NoahHendrickson

Copy link
Copy Markdown
Owner

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

  • An empty prompt shows send (disabled) in its slot. The mic no longer takes that slot while idle, and it no longer competes with the resume action.
  • A live dictation session still takes the send slot: X, waveform and check, as before. The mic in the control row stays where it is but is disabled, so the row doesn't shift. + is disabled during a session, as before.
  • The draft (new-agent) box and the dictation layouts no longer reserve space for + 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.
  • They hide whenever the control row does: during a pending approval, when the mobile composer is collapsed, and while the mobile answer buttons are showing.
  • On narrow windows, Full access and Build/Plan collapse into the ⋯ menu slightly sooner.

Changes: ChatComposer.tsx (the dictation slot gate, the attach button and mic moved into modeControls), custom/ComposerShell.tsx, custom/voice/ForkDictationControl.tsx, theme.custom.css, comments in ComposerPrimaryActions.tsx, and the three guard tests plus .fork/customizations.yaml updated for the new placement. Rebased onto the current custom, which includes the orchestrator-V2 sync.

Verified: fork guards and the ComposerPrimaryActions tests pass (513), plus web typecheck, lint and format. Not checked in a running app, and no screenshots attached.

🤖 Generated with Claude Code

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>
@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L labels Oct 10, 2026
@github-actions

github-actions Bot commented Oct 10, 2026 •

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire 5.0 KiB 5.0 KiB 0 B (0.0%) 6.8 KiB ✅
Codex Thread snapshot wire 3.8 KiB 3.8 KiB 0 B (0.0%) 4.9 KiB ✅
Codex Live turn WebSocket wire 1.2 KiB 1.2 KiB 0 B (0.0%) 2.0 KiB ✅
Codex Live turn WebSocket decoded 20.9 KiB 20.9 KiB 0 B (0.0%) 29.3 KiB ✅
Codex Live turn messages 2 2 0 (0.0%) 8 ✅
Claude Total thread wire 5.0 KiB 5.0 KiB 0 B (0.0%) 6.8 KiB ✅
Claude Thread snapshot wire 3.8 KiB 3.8 KiB 0 B (0.0%) 4.9 KiB ✅
Claude Live turn WebSocket wire 1.2 KiB 1.2 KiB 0 B (0.0%) 2.0 KiB ✅
Claude Live turn WebSocket decoded 21.2 KiB 21.2 KiB 0 B (0.0%) 29.3 KiB ✅
Claude Live turn messages 2 2 0 (0.0%) 8 ✅

Baseline: d43b2e6 · PR result: c4f305d · Source CI: success

Scenario and decoded snapshot size

10 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.

  • Codex decoded thread snapshot: 108.5 KiB
  • Claude decoded thread snapshot: 108.8 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Open in Web View Automation 

Sent by Cursor Automation: Thermo nuke 4.6

@NoahHendrickson NoahHendrickson left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 4 fails in AcpSessionRuntime.processTree.test.ts, “rotates more than 64 live parents without scanning retained tombstones,” with retained processes 1084, 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.

@NoahHendrickson
NoahHendrickson merged commit 997a42e into custom Oct 10, 2026
41 of 43 checks passed
@NoahHendrickson
NoahHendrickson deleted the t3code/move-composer-action-buttons branch October 10, 2026 15:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants