feat(widget): render the concurrency wait-queue status - #967
Conversation
PR SummaryMedium Risk Overview While queued, the UI shows waiting copy (short in the header/trigger, full on the avatar overlay), hides the typing indicator, and blocks text, attachments, rich-content buttons, and event-bridge sends. Unknown statuses do not lock the UI. On timeout, disconnect is treated as a friendly Events are parsed via Reviewed by Cursor Bugbot for commit 377906c. Bugbot is set up for automated code reviews on this repo. Configure here. |
Handle the queue_status server events (waiting/admitted/timed_out) in the embeddable widget, mirroring elevenlabs/xi#46137 for the agent Preview: show a waiting status while all agents are busy, hide the typing indicator and block text/attachment sending while queued, and render a friendly non-error message when the queue wait times out. New queue_waiting_status and queue_timed_out text-content keys are customizable like all other copy.
Live-testing the embed against a real backend showed the full waiting
sentence collapsing to min-content width in the avatar overlay pill and
overflowing into the composer, and it cannot fit the single-line pills in
the sheet header and full trigger at all. The avatar overlay wrapper now
sizes to w-max so the copy wraps at its intended cap, and the cramped
surfaces show a new short queue_waiting_status_short key ("Waiting for an
available agent") instead.
The status label was absolutely positioned over the main label, so it never contributed to the trigger's width and the long queue-waiting copy got clipped at the card edge. Stack both labels in one grid cell so the wider one sizes the card, and truncate single-line statuses that exceed the cap instead of spilling past it.
Derive wrapping from the compact prop instead of hardcoding it per label type so long custom copy wraps on spacious surfaces too, take the suggested useState simplification, trim the verbose comments, and mark the onDebug narrowing as interim until the SDK handles queue_status explicitly.
040e8ea to
15cb2ed
Compare
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 15cb2ed. Configure here.
The queue gate lived only in SheetActions' canSend, so rich-content message buttons and elevenlabs-agent:user-message events could still send (and append transcript entries) while the orchestrator was discarding client messages. Guard sendUserMessage and sendMultimodalMessage at the source and render rich-content buttons disabled while waiting.

What
Widget follow-up to elevenlabs/xi#46137: the embeddable ConvAI widget now renders the concurrency wait-queue lifecycle from the
queue_statusserver events (waiting/admitted/timed_out).@elevenlabs/clientchanges: the SDK forwards unhandled server events toonDebugon both the WebSocket and WebRTC transports. Once the queue is finalized then we will make the SDK changes.Testing
Tested by embedding widget in a local server connecting it to local backend
Screen.Recording.2026-08-20.at.4.42.03.PM.mov