Before submitting
Area
apps/web
Steps to reproduce
No phone required — the trigger is viewport width, not touch.
- Open a thread in the web UI and narrow the window below the
sm breakpoint (< 640px), or open it on a phone.
- Send a prompt so the turn starts running.
- Type a follow-up in the composer while the turn is still running.
- Try to send it.
Expected behavior
The follow-up can be sent, the same as on a desktop viewport where pressing Enter mid-run submits it.
Actual behavior
There is no way to submit. The composer's primary action is replaced by the stop button while the turn runs, and Enter-to-send is disabled on mobile viewports, so the message can only be sent after the turn ends.
Root cause
The two guards overlap, leaving no send path below sm:
apps/web/src/components/chat/ComposerPrimaryActions.tsx — if (isRunning) returns only the stop button, replacing the submit button entirely.
apps/web/src/composer-logic.ts — shouldSubmitComposerOnEnter returns !isMobileViewport && !shiftKey, so Enter never submits below sm.
Sending mid-run is otherwise fully supported: onSend in ChatView.tsx has no isRunning guard, and isSendBusy is activeLocalDispatch !== null rather than the turn state. Desktop reaches that path via Enter; mobile has no path to it at all. So this is a missing affordance on one viewport, not a missing capability.
Notes
I have a small patch for this (one prop, rendering send next to stop while running when the composer has content; desktop unchanged) and am happy to open a PR if you want it.
Before submitting
Area
apps/web
Steps to reproduce
No phone required — the trigger is viewport width, not touch.
smbreakpoint (< 640px), or open it on a phone.Expected behavior
The follow-up can be sent, the same as on a desktop viewport where pressing Enter mid-run submits it.
Actual behavior
There is no way to submit. The composer's primary action is replaced by the stop button while the turn runs, and Enter-to-send is disabled on mobile viewports, so the message can only be sent after the turn ends.
Root cause
The two guards overlap, leaving no send path below
sm:apps/web/src/components/chat/ComposerPrimaryActions.tsx—if (isRunning)returns only the stop button, replacing the submit button entirely.apps/web/src/composer-logic.ts—shouldSubmitComposerOnEnterreturns!isMobileViewport && !shiftKey, so Enter never submits belowsm.Sending mid-run is otherwise fully supported:
onSendinChatView.tsxhas noisRunningguard, andisSendBusyisactiveLocalDispatch !== nullrather than the turn state. Desktop reaches that path via Enter; mobile has no path to it at all. So this is a missing affordance on one viewport, not a missing capability.Notes
runningafter turn interrupt — stop button becomes a no-op #4713 / [Bug]: Provider turn interrupt failures are silently swallowed — Stop generation looks successful while the turn keeps running #4524, which are about interrupt itself being a no-op server-side.I have a small patch for this (one prop, rendering send next to stop while running when the composer has content; desktop unchanged) and am happy to open a PR if you want it.