fix(desktop): stop completed-message layout shift while streaming
The assistant message action bar used `hideWhenRunning`, which unmounts it whenever the thread is streaming. Since the bar reserves vertical space in each completed assistant message's footer (it's invisible-until-hover via opacity, not via mount), unmounting it collapsed every prior turn by the bar's height — then remounting on resolve grew them back, shifting the whole conversation (visible as "padding appears above the last user message"). Drop hideWhenRunning so the footer height is constant; the bar stays invisible during streaming via its existing opacity/pointer-events gating.
This commit is contained in:
@@ -517,11 +517,17 @@ const AssistantActionBar: FC<MessageActionProps> = ({ messageId, messageText, on
|
||||
<div className="relative flex w-full shrink-0 justify-end">
|
||||
<ActionBarPrimitive.Root
|
||||
className={cn(
|
||||
// NOTE: intentionally NOT `hideWhenRunning`. That prop unmounts the
|
||||
// bar while the thread streams, which collapses every completed
|
||||
// assistant message's footer by this bar's height and shifts the
|
||||
// whole conversation when the turn resolves. The bar is already
|
||||
// invisible by default (opacity-0 + pointer-events-none, reveals on
|
||||
// hover), so keeping it mounted reserves stable layout height with
|
||||
// no visual change during streaming.
|
||||
'relative flex flex-row items-center justify-end gap-2 py-1.5 opacity-0 pointer-events-none group-hover:pointer-events-auto group-hover:opacity-100 focus-within:pointer-events-auto focus-within:opacity-100',
|
||||
menuOpen && 'pointer-events-auto opacity-100 [&_button]:opacity-100'
|
||||
)}
|
||||
data-slot="aui_msg-actions"
|
||||
hideWhenRunning
|
||||
>
|
||||
<CopyButton appearance="icon" buttonSize="icon" disabled={!messageText} label="Copy" text={messageText} />
|
||||
<ActionBarPrimitive.Reload asChild>
|
||||
|
||||
+2
-2
@@ -1654,10 +1654,10 @@ class MCPServerTask:
|
||||
self.name,
|
||||
)
|
||||
|
||||
# Validate remote URL once, up front. Raising here (rather than
|
||||
# Validate remote URL once, up front. Raising here (rather than
|
||||
# letting it blow up inside the SDK's httpx layer on every retry)
|
||||
# means a typo in config.yaml fails fast with a clear error — and
|
||||
# critically, no reconnect-backoff burn. (Ported from
|
||||
# critically, no reconnect-backoff burn. (Ported from
|
||||
# anomalyco/opencode#25019.)
|
||||
if self._is_http():
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user