feat: add ElevenLabsWidget with a runnable DemoApp - #224
Merged
Conversation
3 tasks
renal128
force-pushed
the
elevenlabs-widget
branch
from
July 26, 2026 14:10
69c2305 to
c5ab2e8
Compare
renal128
force-pushed
the
elevenlabs-widget
branch
from
July 26, 2026 14:33
c5ab2e8 to
74fa1ed
Compare
renal128
force-pushed
the
elevenlabs-widget
branch
from
July 26, 2026 15:02
74fa1ed to
a56d7f6
Compare
renal128
force-pushed
the
elevenlabs-widget
branch
from
July 26, 2026 16:30
a56d7f6 to
a8802b0
Compare
renal128
force-pushed
the
elevenlabs-widget
branch
from
July 26, 2026 16:54
a8802b0 to
47ba3ab
Compare
renal128
force-pushed
the
elevenlabs-widget
branch
2 times, most recently
from
July 26, 2026 17:09
437c6f4 to
c6af73b
Compare
renal128
force-pushed
the
elevenlabs-widget
branch
from
July 26, 2026 22:37
c6af73b to
8f6aced
Compare
renal128
force-pushed
the
elevenlabs-widget
branch
from
July 26, 2026 22:43
8f6aced to
4b63731
Compare
renal128
force-pushed
the
elevenlabs-widget
branch
from
July 26, 2026 23:10
4b63731 to
c8a929d
Compare
renal128
force-pushed
the
elevenlabs-widget
branch
from
July 27, 2026 09:22
c8a929d to
00d64fe
Compare
renal128
force-pushed
the
elevenlabs-widget
branch
from
July 27, 2026 09:33
00d64fe to
96a5fdc
Compare
renal128
force-pushed
the
elevenlabs-widget
branch
from
July 27, 2026 09:41
96a5fdc to
08f36b3
Compare
renal128
force-pushed
the
elevenlabs-widget
branch
from
July 27, 2026 09:54
08f36b3 to
2368fd3
Compare
renal128
force-pushed
the
elevenlabs-widget
branch
from
July 27, 2026 10:07
2368fd3 to
484eee0
Compare
renal128
force-pushed
the
elevenlabs-widget
branch
from
July 27, 2026 10:13
484eee0 to
d8749e3
Compare
renal128
force-pushed
the
elevenlabs-widget
branch
from
July 27, 2026 10:27
d8749e3 to
1ec10cc
Compare
jacksonh
approved these changes
Aug 3, 2026
renal128
force-pushed
the
elevenlabs-widget
branch
2 times, most recently
from
August 4, 2026 16:16
8e6a505 to
2e21ae8
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 2e21ae8. Configure here.
renal128
force-pushed
the
elevenlabs-widget
branch
from
August 4, 2026 16:38
2e21ae8 to
a6a1582
Compare
renal128
force-pushed
the
elevenlabs-widget
branch
2 times, most recently
from
August 4, 2026 19:23
d1daed8 to
d144cd6
Compare
renal128
force-pushed
the
elevenlabs-widget
branch
from
August 4, 2026 19:31
d144cd6 to
6c5116b
Compare
renal128
force-pushed
the
elevenlabs-widget
branch
from
August 4, 2026 19:34
6c5116b to
4501f9e
Compare
ChatWidget renders a floating launcher and a drawer with transcript, composer, mic toggle and a placeholder orb, driven by a trimmed ChatWidgetViewModel over ConversationClient. ChatWidgetController is the host control surface from the start. Examples/DemoApp exercises it end to end with a client tool. WidgetConversationMode says how the user can reach the agent — text only, voice only, voice with a composer, or either — and carries the credentials each kind of session needs, so a widget can't be configured for a session it has no way to authenticate. Credentials are minted per start. The drawer is a bottom sheet with a compact and an expanded detent: drag or tap the grabber to move between them, fling down to dismiss, and the compact height adapts to landscape. Voice drawers open as a peek and grow once there is a transcript to read. Failures land in a banner across the top of the drawer — start and send errors auto-dismiss, while denied microphone access stays until it is acted on and offers Settings, since the SDK connects muted rather than failing there. Co-authored-by: Cursor <cursoragent@cursor.com>
Keep widget config/mode live, cancel credential mint before bind, and avoid stale connected/tool work so end/disappear can tear down a session safely. Co-authored-by: Cursor <cursoragent@cursor.com>
renal128
force-pushed
the
elevenlabs-widget
branch
from
August 4, 2026 19:39
4501f9e to
ef1d129
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Summary
First slice of the widget port. Adds
ElevenLabsWidgetas a second product in the package and anExamples/DemoAppthat uses it, so everything after this is reviewable against something you can actually run.ChatWidgetController: the host's handle on the widget — mirrors state (state,isOpen,isMicMuted,conversationId,messageCount) and forwards commands (open,close,startConversation,sendMessage,setMicMuted, ...).ChatWidgetConfig/ChatWidgetStrings/ChatWidgetThemefor behavior, copy, and colors.Examples/DemoApp: a real-estate search form driven by anupdate_real_estate_searchclient tool, plus buttons that drive the widget through the controller.Everything is
#if canImport(UIKit)and@available(iOS 16, ...), so the SDK keeps its iOS 13 floor andswift buildon macOS compiles the widget to an empty module.Not in this PR
The real orb (next), conversation modes, drawer polish, markdown transcript, error banner, attachments, feedback, terms, and MCP approval all land as their own slices on top.
Test plan
swift build,swift test,swiftformat . --strictxcodebuildofExamples/DemoAppfor the iOS simulatorNote that repo CI only builds PRs targeting
main, so this stack gets SwiftFormat but no build job.