Skip to content

feat(ai-components): generated UI, with A2UI and OpenUI renderers - #3388

Merged
oliverlaz merged 24 commits into
release-v14from
feat/ai-components-generative-ui
Nov 4, 2026
Merged

oliverlaz merged 24 commits into
release-v14from
feat/ai-components-generative-ui

Conversation

@oliverlaz

@oliverlaz oliverlaz commented Nov 4, 2026 •

Copy link
Copy Markdown
Member

🎯 Goal

An agent can answer with UI rather than text: a plan with a map, a form to change it, cards the person taps. The agents router carries a reply's UI to Stream Chat as ai_ui and takes back what the person did in it as ai_ui_action (GetStream/Vision-Agents#1516). StreamChatAI shows it on iOS (GetStream/stream-chat-swift#4370, GetStream/stream-chat-swift#4373, GetStream/stream-chat-swift#4374). This brings stream-chat-react/ai-components to the same place, with A2UI and OpenUI renderers built on their official packages rather than on ports of them.

πŸ›  Implementation details

Stream message (ai_generated, ai_ui)
  └─ fromStreamMessage ─> AIMessage.uiDocument
       └─ AIConversation ui={AIUIHost}
            └─ host.content(document) ─> first renderer that reads format@version
                 β”œβ”€ stream-chat-react/a2ui    @a2ui/web_core + @a2ui/react, loaded on first use
                 β”œβ”€ stream-chat-react/openui  @openuidev/react-lang + react-ui, loaded on first use
                 └─ none, or it can't show ─> the reply's text

What the person does ─> AIUIAction ─> host.send (in order) ─> responses.create(label, { uiAction })
Area What's new StreamChatAI counterpart
Format-agnostic layer (ai-components, no new dependencies) AIUIHost, AIUIRenderer/AIUIEngine, AIUIDocument, AIUIAction, AIUIView, AIUIEntrance, app components from portable JSON (defineAIUIComponent), client tools AIUIHost, AIUIRenderer, AIUIComponent
Conversation the UI shows in place of the text, the thinking indicator gives way to it, reply actions wait while it is written, history shows at once AIConversationView
A2UI 1.0 (stream-chat-react/a2ui) one processor per reply, streaming with prefix replay, Stream's Button, Text, Card, TextField, ChoicePicker, Icon and Modal over the basic catalog, the app's components in the catalog, a2uiInstructions and a2uiProblems StreamChatA2UI
OpenUI (stream-chat-react/openui) OpenUI's chat library with the app's components in its content slots, forms kept by the host, openUIInstructions StreamChatOpenUI

Where it goes further than iOS:

Case iOS Here
One of the app's components throws empty UI only it is left out, tried again when its arguments change, and onRenderError says why once the reply is written
Another part of the UI throws, its packages fail to load, or a finished reply draws nothing empty UI the reply's text, and onRenderError / onError say why; a reply that failed while written is tried again once it is written
A batch with one bad component, in updateComponents or createSurface the rest show the rest show, in both
"v1.0" as the message version refused per message read as 1.0
An action over the router's 8 KB, or missing its reply, format or name sent, refused with a 400 not sent, onError says why, and host.send resolves to false
Links in an A2UI Text's Markdown not tappable open through host.open
callAgentFunction waits 30 s fails at once

The A2UI and OpenUI entries are ESM only, client only (they load in the browser when a reply first shows the format, so server rendering shows a placeholder) and take their packages as optional peers, in ~ ranges of the versions they are tested with since the 0.x packages change their API between minor versions, so apps that never show generated UI install and load nothing new. The README's Generated UI section covers the API.

Tested with 3,373 passing tests, including the Ohrid trip plan rendered in both formats, StrictMode, server rendering, and a regression test for each failure case above that fails without its fix. Checked end to end with the Juno web example (GetStream/Vision-Agents#1712) against a local router: A2UI and OpenUI replies render, forms and cards send their actions, and history shows again on reload.

🎨 UI Changes

Generated UI shows in AI replies only when the app gives AIConversation a ui host; nothing changes otherwise. It is drawn the same in A2UI and OpenUI, as StreamChatOpenUI draws it on iOS: the reply on a raised card, callouts tinted in their variant's colour behind their icon, chips as pills with the chosen ones in the accent colour, the main button a pill as wide as the reply, and follow-ups in the accent colour with a hairline between them. Its marks are CSS, with no images a page's content policy could block.

…sign-in

AIConversation lays an agent conversation out by turn. parseMessageParts reads
a reply's ai_reasoning and ai_tool_call attachments, shown by AIReasoning and
AIToolCall, with AIToolApproval for a tool that asks first and
AIToolAuthorization for a connector sign-in, run in a popup by
createPopupAuthorizer and finished by completeConnectorSignIn. Also
AISuggestions, AIReplyActions, AIMessageComposer.ChatOptions, default
attachment previews and a className merge on the composer. Mirrors
StreamChatAI on iOS and stream-chat-android-ai-compose.
- Sanitise attachment links and images, keeping blob and image data URLs.
- Keep waiting for a sign-in while a provider page severs the popup.
- Retry loading older messages after a failure or an empty page.
- Measure turns only when they change, and on scroll once a frame.
- Drop the entry memo, so a new rating shows with unchanged messages.
- Write the thinking clock only from effects.
- Build ChatOptions on the SDK's Dropdown, and sizes on prettifyFileSize.
- Keep one preview URL per picked image.
The counterpart of StreamChatAI's generative UI. A reply's ai_ui field
shows in place of its text when the conversation's AIUIHost has a
renderer for its format and version; otherwise the text shows. The
components know no format: renderers plug one in.

- AIUIDocument, AIUIAction and aiUIActionJSON: the router's ai_ui and
  ui_action, read and written as the Swift SDK does.
- AIUIHost: renderers (first match wins), one engine per renderer kept
  while it lives, actions sent in order and checked against the
  router's limits first, web and email links only by default, client
  tools, per-reply state and capabilities.
- App components described once in portable JSON shared with iOS and
  Android, with the agent's arguments checked and decoded before the
  view gets them.
- AIConversation takes ui: the thinking indicator gives way to a reply
  whose UI shows, and reply actions wait until it is written.
- A live reply's UI and its parts fade in, 0.1 s apart and at most
  0.4 s later; replies from history show at once.
A new stream-chat-react/a2ui entry: createA2UIRenderer, an AIUIHost
renderer for A2UI 1.0 and the counterpart of StreamChatA2UI, built on
@a2ui/web_core and @a2ui/react 0.15.0 as optional, pinned peers.

- Each reply has its own processor, fed each message as it completes;
  messages the agent rewrites start its surfaces again. Every spelling
  of 1.0 is read, and a surface naming no catalog gets the app's.
- The app's components join the catalog from their portable JSON as on
  iOS (place_card is PlaceCard), under getstream.io:app-catalog and the
  basic catalog, with bound values worked out before they render.
- Actions reach host.send with Swift's label and payload; openUrl goes
  through host.open from a tap only; Text renders with AIMarkdown.
- Errors go to onError and the rest still shows; a batch one bad
  component spoils is fed again a component at a time.
- The A2UI packages load in the browser when a reply first shows A2UI,
  so server rendering shows a placeholder. The entry is ESM only.
- Stream's AI tokens theme the basic catalog's --a2ui-* variables.
A reply's UI being written faded in a frame after it mounted, and a page
that paints no frames, such as one in the background or in some web
views, never got one, so the UI stayed hidden. It now shows at most
50 ms later either way, and still fades in where frames are painted.
- A link in A2UI's Text, which the agent writes, opens through
  host.open, as openUrl does, rather than wherever it points.
- A Modal opens as a native dialog: focus stays in it while it is
  open, Escape and the backdrop close it, focus goes back to what
  opened it, and it shows above a transformed layout. A trigger other
  than a Button opens it from the keyboard.
- require('stream-chat-react/a2ui') says it is an ES module only, as
  the A2UI packages it runs are, rather than failing in one of them.
Button, Text, Card, TextField, ChoicePicker and Icon render with Stream's
components and theme; the rest of the basic catalog stays A2UI's own
elements, themed. A Button's words keep the agent's case.

A live reply's parts come in as the agent writes them, through a new
useAIUIEntrance hook that puts the entrance on a part's own element. A
reply from history now shows whole, its app components included.

Icon draws Stream's icon for about half of A2UI's names; the renderer's
`icons` and `iconFont` options cover the rest, and an icon none of them
draws shows nothing rather than its name.

A Modal whose trigger is a Button no longer wraps it in a second button:
it looks the trigger up by the id the agent wrote, and follows it when it
arrives later.
An agent's answer had no message styling of its own: lists fell back to
the browser's 40px indent, headings, links and quotes were unstyled,
paragraphs sat 8px apart at the chat's 20px line height, and a 12px
inset pushed the text off the edge of the steps above it. The answer is
now set in the SCR scale, without a bubble: 16/24 body, headings a step
up with more room above than below, 12px between blocks, lists, links,
quotes, rules, inline code and tables styled on SCR tokens, and the
text starts at the steps' edge. The steps, reasoning, cards and typing
indicator move from 15/13px to the scale's 14/12px.

`ai-scale()` reads the SCR spacing, type and radius tokens with literal
fallbacks, as `ai-token()` does for colours. Code text, punctuation and
comments follow the SCR text colours, so they read in dark mode.
StreamingMessage typed two letters every 30ms, about 67 a second,
however fast the answer arrived, so a 1,500-character reply delivered
in 3 s took 22 s to finish on screen. By default it now sets its pace
as text arrives: enough letters a frame to write what is behind within
400ms, and at least one, so a long chunk appears almost at once and a
trickle types as it comes. Text there from the start still shows at
once. letterIntervalMs and renderingLetterCount still give a fixed
pace, and the core useMessageTextStreaming hook is unchanged.
DefaultMessageData gains a reply's ai_ui (AIUIDocumentJSON) and a person's
ai_ui_action (AIUIActionJSON), so an app reads them typed through the
custom data it extends, as it does the SDK's other default fields.
stream-chat-react/openui is the renderer of OpenUI for AIUIHost, the
counterpart of StreamChatOpenUI, built on @openuidev/react-lang and
@openuidev/react-ui (optional, exact-pinned peers). It loads them when a
reply first shows OpenUI.

- The app's components join OpenUI's chat library in every content slot.
- Actions go to host.send in StreamChatOpenUI's shape:
  continue_conversation with { context, params, form, values }, secret
  fields left out; links open through host.open.
- Each reply's form state is kept by the host.
- A finished program's errors go to onError once.
- openUIInstructions writes the agent's instructions with OpenUI's own
  prompt generator.
- OpenUI's development inspector stays off the app's page unless
  devtools: true.
- ai-components.css themes OpenUI with Stream's tokens.

Also adds a2ui and openui to typesVersions, adds AIUIHost.toolNames, and
dedupes @floating-ui to one copy.
a2uiInstructions(config) writes what an agent is told to write A2UI with,
from the same configuration as StreamChatA2UI's prompt.json (components,
catalogId, fence, keep, preamble, notes, rules, examples). It uses the
A2UI core's own catalog, and the app's components come out as iOS
writes them. It rejects with an A2UIInstructionsError when an example
would not render.

a2uiProblems(text, config) lists what is wrong with A2UI messages, as
StreamChatA2UI's A2UIProgram does: unreadable or out-of-order messages,
unknown components, dangling references, a missing root, orphans and
cycles. It also checks each component against its schema as the
renderer does.

Both run on the A2UI core alone, loaded when called, so they work on a
server or in a build. The app catalog helpers move to catalogDocument.ts
for that, and an app component's required parameters are listed sorted,
as on iOS.
A reply's UI that throws while it renders, a renderer whose packages
can't load, a finished A2UI reply that made no surface (now from history
too) and a finished OpenUI program that draws nothing each show the
reply's text instead of an empty or stuck UI. The host gains refresh()
and onRenderError, and A2UI and OpenUI share one runtime loader.

A createSurface whose inline components hold a bad one shows the rest.
The A2UI linter flags a surface created again without being deleted.
Errors about the renderer rather than a reply reach onError without a
message id. Shared helpers replace their copies, and the OpenUI test
uses the repo's ResizeObserver fake.
The basic components drawn as Stream's apply what the agent says about
a part with its accessibility (label, description, live, hidden), as
A2UI's own parts and StreamChatA2UI do: a field's name goes on its
input, and a Card or Text the agent names is a group.

The A2UI and OpenUI renderers' capabilities carry the model's
instructions with the app's components, as on iOS. Writing them loads
the format's packages, so host.capabilities() is now async; without
them, when they can't load, the rest still goes to the backend.
Juno is in release-v14 as #3376, squashed, with the composer fixes made
after it was last merged here. The merge takes them, and leaves this
branch as release-v14 with generated UI on top.
@coderabbitai

coderabbitai Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 52cc8d23-4cf7-483d-8d77-55c14b1a80ee

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • Trigger review
  • Autofix Β· Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@github-actions

github-actions Bot commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

Size Change: +59.7 kB (+4.76%) πŸ”

Total Size: 1.31 MB

πŸ“¦ View Changed
Filename Size Change
dist/cjs/69fb2908.js 412 B +412 B (new file) πŸ†•
dist/cjs/116b8ee1.js 1.68 kB +1.68 kB (new file) πŸ†•
dist/cjs/a2ui-require.js 212 B +212 B (new file) πŸ†•
dist/cjs/a11yUtils.js 2.02 kB -24.1 kB (-92.26%) πŸ†
dist/cjs/ai-components.js 51.9 kB +3.2 kB (+6.56%) πŸ”
dist/cjs/AIMarkdown.js 2.27 kB +2.27 kB (new file) πŸ†•
dist/cjs/AIUIComponent.js 5.07 kB +5.07 kB (new file) πŸ†•
dist/cjs/AIUIDocument.js 1.02 kB +1.02 kB (new file) πŸ†•
dist/cjs/AIUIRuntimeLoader.js 1.75 kB +1.75 kB (new file) πŸ†•
dist/cjs/c994a961.js 0 B -1.65 kB (removed) πŸ†
dist/cjs/channel-detail.js 23.3 kB +102 B (+0.44%)
dist/cjs/Chart.js 1.11 kB +21 B (+1.94%)
dist/cjs/chartTypes.js 0 B -584 B (removed) πŸ†
dist/cjs/emojis.js 2.73 kB +46 B (+1.71%)
dist/cjs/FieldError.js 401 B +401 B (new file) πŸ†•
dist/cjs/index.js 258 kB +137 B (+0.05%)
dist/cjs/NotificationList.js 64.7 kB -1.12 kB (-1.7%)
dist/cjs/openui.js 1.83 kB +1.83 kB (new file) πŸ†•
dist/cjs/rolldown-runtime.js 638 B +638 B (new file) πŸ†•
dist/cjs/runtime.js 3.12 kB +3.12 kB (new file) πŸ†•
dist/cjs/TextInput.js 1.73 kB +1.73 kB (new file) πŸ†•
dist/cjs/useChannelHeaderOnlineStatus.js 8.74 kB -82 B (-0.93%)
dist/cjs/useInertWhenHidden.js 56.4 kB +83 B (+0.15%)
dist/cjs/useStableId.js 23.9 kB +23.9 kB (new file) πŸ†•
dist/css/ai-components.css 9.74 kB +2.25 kB (+29.94%) 🚨
dist/es/a2ui.mjs 215 B +215 B (new file) πŸ†•
dist/es/ai-components.mjs 1.17 kB +321 B (+37.63%) 🚨
dist/es/openui.mjs 117 B +117 B (new file) πŸ†•
dist/es/plugins/A2UI/A2UIInstructions.mjs 2.43 kB +2.43 kB (new file) πŸ†•
dist/es/plugins/A2UI/A2UIPlaceholder.mjs 316 B +316 B (new file) πŸ†•
dist/es/plugins/A2UI/A2UIRenderer.mjs 1.4 kB +1.4 kB (new file) πŸ†•
dist/es/plugins/A2UI/A2UIStream.mjs 1.16 kB +1.16 kB (new file) πŸ†•
dist/es/plugins/A2UI/basicComponents.mjs 5.33 kB +5.33 kB (new file) πŸ†•
dist/es/plugins/A2UI/catalogDocument.mjs 1.08 kB +1.08 kB (new file) πŸ†•
dist/es/plugins/A2UI/instructions.mjs 3.18 kB +3.18 kB (new file) πŸ†•
dist/es/plugins/A2UI/runtime.mjs 3.61 kB +3.61 kB (new file) πŸ†•
dist/es/plugins/AIComponents/Conversation/AIConversation.mjs 3.83 kB +268 B (+7.52%) πŸ”
dist/es/plugins/AIComponents/Conversation/entries.mjs 1.28 kB +48 B (+3.9%)
dist/es/plugins/AIComponents/Conversation/fromStreamMessage.mjs 845 B +140 B (+19.86%) 🚨
dist/es/plugins/AIComponents/GenerativeUI/AIUIAction.mjs 784 B +784 B (new file) πŸ†•
dist/es/plugins/AIComponents/GenerativeUI/AIUIArguments.mjs 1.56 kB +1.56 kB (new file) πŸ†•
dist/es/plugins/AIComponents/GenerativeUI/AIUIComponent.mjs 859 B +859 B (new file) πŸ†•
dist/es/plugins/AIComponents/GenerativeUI/AIUIComponentDefinition.mjs 1.42 kB +1.42 kB (new file) πŸ†•
dist/es/plugins/AIComponents/GenerativeUI/AIUIDocument.mjs 860 B +860 B (new file) πŸ†•
dist/es/plugins/AIComponents/GenerativeUI/AIUIEntrance.mjs 1.76 kB +1.76 kB (new file) πŸ†•
dist/es/plugins/AIComponents/GenerativeUI/AIUIErrorBoundary.mjs 478 B +478 B (new file) πŸ†•
dist/es/plugins/AIComponents/GenerativeUI/AIUIHelpers.mjs 835 B +835 B (new file) πŸ†•
dist/es/plugins/AIComponents/GenerativeUI/AIUIRenderer.mjs 241 B +241 B (new file) πŸ†•
dist/es/plugins/AIComponents/GenerativeUI/AIUIRuntimeLoader.mjs 962 B +962 B (new file) πŸ†•
dist/es/plugins/AIComponents/GenerativeUI/mjs 3.07 kB +3.07 kB (new file) πŸ†•
dist/es/plugins/OpenUI/OpenUIPlaceholder.mjs 290 B +290 B (new file) πŸ†•
dist/es/plugins/OpenUI/OpenUIRenderer.mjs 1.6 kB +1.6 kB (new file) πŸ†•
dist/es/plugins/OpenUI/runtime.mjs 3.01 kB +3.01 kB (new file) πŸ†•
ℹ️ View Unchanged
Filename Size
dist/cjs/audioProcessing.js 1.74 kB
dist/cjs/mp3-encoder.js 814 B
dist/cjs/ReactPlayerWrapper.js 545 B
dist/cjs/useReducedMotionPreference.js 547 B
dist/cjs/useStableCallback.js 902 B
dist/css/channel-detail.css 2.84 kB
dist/css/emoji-picker.css 178 B
dist/css/emoji-replacement.css 456 B
dist/css/index.css 42.1 kB
dist/es/_virtual/_rolldown/runtime.mjs 252 B
dist/es/a11y/a11yUtils.mjs 630 B
dist/es/a11y/accessibleLabel.mjs 721 B
dist/es/a11y/hooks/useAriaIdentifiers.mjs 540 B
dist/es/a11y/hooks/useListboxKeyboardNavigation.mjs 1.52 kB
dist/es/a11y/hooks/useResolvedModalAriaProps.mjs 497 B
dist/es/a11y/hooks/useVirtualizedListboxKeyboardNavigation.mjs 1.39 kB
dist/es/channel-detail.mjs 802 B
dist/es/components/Accessibility/AriaLiveAnnouncerProvider.mjs 1.65 kB
dist/es/components/Accessibility/AriaLiveOutlet.mjs 964 B
dist/es/components/Accessibility/AriaLiveOutletContext.mjs 194 B
dist/es/components/Accessibility/hooks/useAudioPlaybackChangeAnnouncements.mjs 425 B
dist/es/components/Accessibility/hooks/useFocusReturn.mjs 916 B
dist/es/components/Accessibility/hooks/useIncomingMessageAnnouncements.mjs 1.19 kB
dist/es/components/Accessibility/hooks/useInertWhenHidden.mjs 1.62 kB
dist/es/components/Accessibility/hooks/useInteractionAnnouncements.mjs 3.02 kB
dist/es/components/Accessibility/NotificationAnnouncer.mjs 1.4 kB
dist/es/components/Accessibility/scheduling/useAnnouncementQueue.mjs 793 B
dist/es/components/Accessibility/scheduling/useDebouncedAnnounce.mjs 1.68 kB
dist/es/components/Accessibility/scheduling/useSettledAnnouncement.mjs 1.84 kB
dist/es/components/Accessibility/useAriaLiveAnnouncer.mjs 300 B
dist/es/components/AIStateIndicator/AIStateIndicator.mjs 458 B
dist/es/components/AIStateIndicator/hooks/useAIState.mjs 616 B
dist/es/components/Attachment/attachment-sizing.mjs 1.05 kB
dist/es/components/Attachment/Attachment.mjs 971 B
dist/es/components/Attachment/AttachmentActions.mjs 1.59 kB
dist/es/components/Attachment/AttachmentContainer.mjs 2.47 kB
dist/es/components/Attachment/Audio.mjs 1.48 kB
dist/es/components/Attachment/audioSampling.mjs 1.29 kB
dist/es/components/Attachment/components/AttachmentUploadProgressIndicator.mjs 825 B
dist/es/components/Attachment/components/DownloadButton.mjs 669 B
dist/es/components/Attachment/components/FileSizeIndicator.mjs 436 B
dist/es/components/Attachment/FileAttachment.mjs 644 B
dist/es/components/Attachment/Geolocation.mjs 1.07 kB
dist/es/components/Attachment/Giphy.mjs 1.03 kB
dist/es/components/Attachment/giphyAccessibility.mjs 481 B
dist/es/components/Attachment/hooks/useAttachmentUploadState.mjs 2.31 kB
dist/es/components/Attachment/hooks/useLocalVideoDimensions.mjs 1.43 kB
dist/es/components/Attachment/icons.mjs 411 B
dist/es/components/Attachment/Image.mjs 346 B
dist/es/components/Attachment/LinkPreview/Card.mjs 1.03 kB
dist/es/components/Attachment/LinkPreview/UnableToRenderCard.mjs 402 B
dist/es/components/Attachment/ModalGallery.mjs 1.87 kB
dist/es/components/Attachment/UnsupportedAttachment.mjs 403 B
dist/es/components/Attachment/utils.mjs 740 B
dist/es/components/Attachment/VideoAttachment.mjs 936 B
dist/es/components/Attachment/VisibilityDisclaimer.mjs 354 B
dist/es/components/Attachment/VoiceRecording.mjs 1.75 kB
dist/es/components/AudioPlayback/AudioPlayer.mjs 3.58 kB
dist/es/components/AudioPlayback/AudioPlayerPool.mjs 1.01 kB
dist/es/components/AudioPlayback/components/DurationDisplay.mjs 596 B
dist/es/components/AudioPlayback/components/formatTime.mjs 339 B
dist/es/components/AudioPlayback/components/keyboardSeek.mjs 524 B
dist/es/components/AudioPlayback/components/PlaybackRateButton.mjs 300 B
dist/es/components/AudioPlayback/components/ProgressBar.mjs 819 B
dist/es/components/AudioPlayback/components/progressBarA11y.mjs 460 B
dist/es/components/AudioPlayback/components/useInteractiveProgressBar.mjs 1.07 kB
dist/es/components/AudioPlayback/components/WaveProgressBar.mjs 1.72 kB
dist/es/components/AudioPlayback/plugins/AudioPlayerNotificationsPlugin.mjs 613 B
dist/es/components/AudioPlayback/WithAudioPlayback.mjs 1 kB
dist/es/components/Avatar/Avatar.mjs 1.02 kB
dist/es/components/Avatar/AvatarStack.mjs 669 B
dist/es/components/Avatar/ChannelAvatar.mjs 344 B
dist/es/components/Avatar/GroupAvatar.mjs 868 B
dist/es/components/Avatar/utils.mjs 183 B
dist/es/components/Badge/Badge.mjs 509 B
dist/es/components/Badge/MediaBadge.mjs 426 B
dist/es/components/BaseImage/BaseImage.mjs 682 B
dist/es/components/BaseImage/ImagePlaceholder.mjs 397 B
dist/es/components/BaseImage/toBaseImageDescriptors.mjs 547 B
dist/es/components/Button/Button.mjs 529 B
dist/es/components/Button/PlayButton.mjs 475 B
dist/es/components/Channel/Channel.mjs 7.14 kB
dist/es/components/Channel/channelState.mjs 978 B
dist/es/components/Channel/constants.mjs 156 B
dist/es/components/Channel/hooks/useChannelContainerClasses.mjs 391 B
dist/es/components/Channel/hooks/useCreateChannelStateContext.mjs 1.1 kB
dist/es/components/Channel/hooks/useCreateTypingContext.mjs 229 B
dist/es/components/Channel/hooks/useEditMessageHandler.mjs 297 B
dist/es/components/Channel/hooks/useIsMounted.mjs 235 B
dist/es/components/Channel/hooks/useMentionsHandlers.mjs 448 B
dist/es/components/Channel/utils.mjs 2.12 kB
dist/es/components/ChannelHeader/ChannelHeader.mjs 927 B
dist/es/components/ChannelHeader/hooks/useChannelHasMembersOnline.mjs 651 B
dist/es/components/ChannelHeader/hooks/useChannelHeaderOnlineStatus.mjs 599 B
dist/es/components/ChannelList/ChannelList.mjs 2.29 kB
dist/es/components/ChannelList/ChannelListHeader.mjs 380 B
dist/es/components/ChannelList/ChannelListUI.mjs 607 B
dist/es/components/ChannelList/hooks/useChannelListKeyboardNavigation.mjs 1.25 kB
dist/es/components/ChannelList/hooks/useChannelListShape.mjs 2.14 kB
dist/es/components/ChannelList/hooks/useChannelMembershipState.mjs 262 B
dist/es/components/ChannelList/hooks/useChannelMembersState.mjs 300 B
dist/es/components/ChannelList/hooks/useConnectionRecoveredListener.mjs 306 B
dist/es/components/ChannelList/hooks/usePaginatedChannels.mjs 1.59 kB
dist/es/components/ChannelList/hooks/useSelectedChannelState.mjs 403 B
dist/es/components/ChannelList/utils.mjs 1.05 kB
dist/es/components/ChannelListItem/ChannelListItem.mjs 1.3 kB
dist/es/components/ChannelListItem/ChannelListItemActionButtons.mjs 2.46 kB
dist/es/components/ChannelListItem/ChannelListItemTimestamp.mjs 505 B
dist/es/components/ChannelListItem/ChannelListItemUI.mjs 1.51 kB
dist/es/components/ChannelListItem/hooks/useChannelDisplayName.mjs 817 B
dist/es/components/ChannelListItem/hooks/useChannelPreviewInfo.mjs 624 B
dist/es/components/ChannelListItem/hooks/useIsChannelMuted.mjs 671 B
dist/es/components/ChannelListItem/hooks/useIsUserMuted.mjs 269 B
dist/es/components/ChannelListItem/hooks/useMessageDeliveryStatus.mjs 830 B
dist/es/components/ChannelListItem/utils.a11y.mjs 2.37 kB
dist/es/components/ChannelListItem/utils.mjs 2.59 kB
dist/es/components/Chat/Chat.mjs 1.25 kB
dist/es/components/Chat/hooks/useChannelsQueryState.mjs 250 B
dist/es/components/Chat/hooks/useChat.mjs 1.05 kB
dist/es/components/Chat/hooks/useCreateChatClient.mjs 533 B
dist/es/components/Chat/hooks/useCreateChatContext.mjs 539 B
dist/es/components/Chat/hooks/useReportLostConnectionSystemNotification.mjs 677 B
dist/es/components/Chat/hooks/useSplitActionSet.mjs 319 B
dist/es/components/ChatView/a11y.utility.mjs 291 B
dist/es/components/ChatView/mjs 2.24 kB
dist/es/components/DateSeparator/DateSeparator.mjs 575 B
dist/es/components/Dialog/components/Alert.mjs 647 B
dist/es/components/Dialog/components/Callout.mjs 819 B
dist/es/components/Dialog/components/ContextMenu.mjs 5.49 kB
dist/es/components/Dialog/components/Prompt.mjs 1.07 kB
dist/es/components/Dialog/components/Viewer.mjs 963 B
dist/es/components/Dialog/hooks/useDialog.mjs 688 B
dist/es/components/Dialog/hooks/usePopoverPosition.mjs 839 B
dist/es/components/Dialog/service/DialogAnchor.mjs 2.06 kB
dist/es/components/Dialog/service/DialogManager.mjs 1.29 kB
dist/es/components/Dialog/service/DialogPortal.mjs 1.02 kB
dist/es/components/DragAndDrop/DragAndDropContainer.mjs 1.16 kB
dist/es/components/EmptyStateIndicator/EmptyStateIndicator.mjs 547 B
dist/es/components/EventComponent/EventComponent.mjs 462 B
dist/es/components/FileIcon/FileIconSet.mjs 6.71 kB
dist/es/components/FileIcon/iconMap.mjs 512 B
dist/es/components/FileIcon/mimeTypes.mjs 1.73 kB
dist/es/components/FileIcon/mjs 599 B
dist/es/components/Form/FieldError.mjs 261 B
dist/es/components/Form/hooks/useFormState.mjs 550 B
dist/es/components/Form/mjs 1.55 kB
dist/es/components/Form/NumericInput.mjs 1.33 kB
dist/es/components/Form/SwitchField.mjs 1.53 kB
dist/es/components/Form/TextInput.mjs 1.3 kB
dist/es/components/Form/TextInputFieldSet.mjs 376 B
dist/es/components/Gallery/Gallery.mjs 654 B
dist/es/components/Gallery/GalleryContext.mjs 422 B
dist/es/components/Gallery/GalleryHeader.mjs 939 B
dist/es/components/Gallery/GalleryUI.mjs 2.02 kB
dist/es/components/Icons/createIcon.mjs 429 B
dist/es/components/Icons/icons.mjs 19.3 kB
dist/es/components/Icons/mjs 378 B
dist/es/components/InfiniteScrollPaginator/hooks/useCursorPaginator.mjs 591 B
dist/es/components/InfiniteScrollPaginator/InfiniteScroll.mjs 1.34 kB
dist/es/components/InfiniteScrollPaginator/InfiniteScrollPaginator.mjs 1.03 kB
dist/es/components/ListItemLayout/ListItemLayout.mjs 707 B
dist/es/components/Loading/AttachmentUploadedSizeIndicator.mjs 634 B
dist/es/components/Loading/LoadingChannel.mjs 639 B
dist/es/components/Loading/LoadingChannels.mjs 377 B
dist/es/components/Loading/LoadingErrorIndicator.mjs 395 B
dist/es/components/Loading/LoadingIndicator.mjs 286 B
dist/es/components/Loading/progress-indicators.mjs 714 B
dist/es/components/Loading/UploadedSizeIndicator.mjs 413 B
dist/es/components/Loading/UploadProgressIndicator.mjs 366 B
dist/es/components/LoadMore/LoadMoreButton.mjs 492 B
dist/es/components/LoadMore/LoadMorePaginator.mjs 378 B
dist/es/components/Location/hooks/useLiveLocationSharingManager.mjs 631 B
dist/es/components/Location/ShareLocationDialog.mjs 2.2 kB
dist/es/components/MediaRecorder/AudioRecorder/AudioRecorder.mjs 621 B
dist/es/components/MediaRecorder/AudioRecorder/AudioRecorderRecordingControls.mjs 1 kB
dist/es/components/MediaRecorder/AudioRecorder/AudioRecordingButtonWithNotification.mjs 1.04 kB
dist/es/components/MediaRecorder/AudioRecorder/AudioRecordingPlayback.mjs 989 B
dist/es/components/MediaRecorder/AudioRecorder/AudioRecordingPreview.mjs 909 B
dist/es/components/MediaRecorder/AudioRecorder/hooks/useTimeElapsed.mjs 434 B
dist/es/components/MediaRecorder/AudioRecorder/recordingStateIdentity.mjs 227 B
dist/es/components/MediaRecorder/AudioRecorder/RecordingTimer.mjs 322 B
dist/es/components/MediaRecorder/classes/AmplitudeRecorder.mjs 1.05 kB
dist/es/components/MediaRecorder/classes/BrowserPermission.mjs 749 B
dist/es/components/MediaRecorder/classes/MediaRecorderController.mjs 2.53 kB
dist/es/components/MediaRecorder/hooks/useMediaRecorder.mjs 962 B
dist/es/components/MediaRecorder/observable/BehaviorSubject.mjs 353 B
dist/es/components/MediaRecorder/observable/mjs 186 B
dist/es/components/MediaRecorder/observable/Observable.mjs 310 B
dist/es/components/MediaRecorder/observable/Subject.mjs 548 B
dist/es/components/MediaRecorder/observable/Subscription.mjs 206 B
dist/es/components/MediaRecorder/RecordingPermissionDeniedNotification.mjs 481 B
dist/es/components/MediaRecorder/transcode/audioProcessing.mjs 758 B
dist/es/components/MediaRecorder/transcode/index.mjs 351 B
dist/es/components/MediaRecorder/transcode/wav.mjs 1.33 kB
dist/es/components/Message/emojiRegex.mjs 450 B
dist/es/components/Message/hooks/useActionHandler.mjs 596 B
dist/es/components/Message/hooks/useDeleteHandler.mjs 363 B
dist/es/components/Message/hooks/useFlagHandler.mjs 382 B
dist/es/components/Message/hooks/useMarkUnreadHandler.mjs 324 B
dist/es/components/Message/hooks/useMentionsHandler.mjs 455 B
dist/es/components/Message/hooks/useMessageReminder.mjs 300 B
dist/es/components/Message/hooks/useMessageTextStreaming.mjs 783 B
dist/es/components/Message/hooks/useMuteHandler.mjs 433 B
dist/es/components/Message/hooks/useOpenThreadHandler.mjs 333 B
dist/es/components/Message/hooks/usePinHandler.mjs 715 B
dist/es/components/Message/hooks/useReactionHandler.mjs 1.36 kB
dist/es/components/Message/hooks/useReactionsFetcher.mjs 492 B
dist/es/components/Message/hooks/useRetryHandler.mjs 266 B
dist/es/components/Message/hooks/useUserHandler.mjs 255 B
dist/es/components/Message/hooks/useUserRole.mjs 718 B
dist/es/components/Message/Message.mjs 1.81 kB
dist/es/components/Message/MessageAlsoSentInChannelIndicator.mjs 1.1 kB
dist/es/components/Message/MessageBlocked.mjs 444 B
dist/es/components/Message/MessageBubble.mjs 246 B
dist/es/components/Message/MessageDeletedBubble.mjs 399 B
dist/es/components/Message/MessageEditedIndicator.mjs 692 B
dist/es/components/Message/MessageRepliesCountButton.mjs 744 B
dist/es/components/Message/MessageStatus.mjs 1.25 kB
dist/es/components/Message/MessageText.mjs 1.62 kB
dist/es/components/Message/MessageTimestamp.mjs 361 B
dist/es/components/Message/MessageTranslationIndicator.mjs 866 B
dist/es/components/Message/MessageUI.mjs 2.77 kB
dist/es/components/Message/PinIndicator.mjs 610 B
dist/es/components/Message/QuotedMessage.mjs 424 B
dist/es/components/Message/ReminderNotification.mjs 947 B
dist/es/components/Message/renderText/componentRenderers/Anchor.mjs 406 B
dist/es/components/Message/renderText/componentRenderers/Emoji.mjs 246 B
dist/es/components/Message/renderText/componentRenderers/Mention.mjs 307 B
dist/es/components/Message/renderText/regex.mjs 440 B
dist/es/components/Message/renderText/rehypePlugins/emojiMarkdownPlugin.mjs 338 B
dist/es/components/Message/renderText/rehypePlugins/mentionsMarkdownPlugin.mjs 1.47 kB
dist/es/components/Message/renderText/remarkPlugins/htmlToTextPlugin.mjs 243 B
dist/es/components/Message/renderText/remarkPlugins/imageToLink.mjs 591 B
dist/es/components/Message/renderText/remarkPlugins/keepLineBreaksPlugin.mjs 824 B
dist/es/components/Message/renderText/remarkPlugins/plusPlusToEmphasis.mjs 962 B
dist/es/components/Message/renderText/remarkPlugins/remarkIgnoreMarkdown.mjs 337 B
dist/es/components/Message/renderText/renderText.mjs 1.58 kB
dist/es/components/Message/StreamedMessageText.mjs 484 B
dist/es/components/Message/Timestamp.mjs 517 B
dist/es/components/Message/utils.mjs 2.65 kB
dist/es/components/MessageActions/DeleteMessageAlert.mjs 581 B
dist/es/components/MessageActions/DownloadSubmenu.mjs 812 B
dist/es/components/MessageActions/downloadUtils.mjs 980 B
dist/es/components/MessageActions/hooks/useBaseMessageActionSetFilter.mjs 1.23 kB
dist/es/components/MessageActions/MessageActions.mjs 3.9 kB
dist/es/components/MessageActions/QuickMessageActionButton.mjs 359 B
dist/es/components/MessageActions/RemindMeSubmenu.mjs 997 B
dist/es/components/MessageBounce/MessageBounceModal.mjs 348 B
dist/es/components/MessageBounce/MessageBouncePrompt.mjs 772 B
dist/es/components/MessageComposer/AttachmentPreviewList/AttachmentPreviewList.mjs 1.19 kB
dist/es/components/MessageComposer/AttachmentPreviewList/AudioAttachmentPreview.mjs 1.75 kB
dist/es/components/MessageComposer/AttachmentPreviewList/FileAttachmentPreview.mjs 1.05 kB
dist/es/components/MessageComposer/AttachmentPreviewList/GeolocationPreview.mjs 715 B
dist/es/components/MessageComposer/AttachmentPreviewList/MediaAttachmentPreview.mjs 1.33 kB
dist/es/components/MessageComposer/AttachmentPreviewList/UnsupportedAttachmentPreview.mjs 529 B
dist/es/components/MessageComposer/AttachmentPreviewList/utils/AttachmentPreviewRoot.mjs 884 B
dist/es/components/MessageComposer/AttachmentPreviewList/VoiceRecordingPreviewSlot.mjs 548 B
dist/es/components/MessageComposer/AttachmentSelector/AttachmentSelector.mjs 3.23 kB
dist/es/components/MessageComposer/AttachmentSelector/CommandsMenu.mjs 1.29 kB
dist/es/components/MessageComposer/CommandChip.mjs 550 B
dist/es/components/MessageComposer/CooldownTimer.mjs 294 B
dist/es/components/MessageComposer/EditedMessagePreview.mjs 318 B
dist/es/components/MessageComposer/hooks/useAttachmentManagerState.mjs 405 B
dist/es/components/MessageComposer/hooks/useAttachmentsForPreview.mjs 362 B
dist/es/components/MessageComposer/hooks/useCanCreatePoll.mjs 285 B
dist/es/components/MessageComposer/hooks/useCooldownRemaining.mjs 449 B
dist/es/components/MessageComposer/hooks/useCreateMessageComposerContext.mjs 429 B
dist/es/components/MessageComposer/hooks/useIsCooldownActive.mjs 294 B
dist/es/components/MessageComposer/hooks/useMessageComposerBindings.mjs 374 B
dist/es/components/MessageComposer/hooks/useMessageComposerCommands.mjs 414 B
dist/es/components/MessageComposer/hooks/useMessageComposerController.mjs 680 B
dist/es/components/MessageComposer/hooks/useMessageComposerHasSendableData.mjs 274 B
dist/es/components/MessageComposer/hooks/useMessageContentIsEmpty.mjs 274 B
dist/es/components/MessageComposer/hooks/usePasteHandler.mjs 577 B
dist/es/components/MessageComposer/hooks/useSubmitHandler.mjs 1.49 kB
dist/es/components/MessageComposer/hooks/useTextareaRef.mjs 269 B
dist/es/components/MessageComposer/hooks/utils.mjs 339 B
dist/es/components/MessageComposer/icons.mjs 1.26 kB
dist/es/components/MessageComposer/LinkPreviewList.mjs 1.07 kB
dist/es/components/MessageComposer/MessageComposer.mjs 1.01 kB
dist/es/components/MessageComposer/MessageComposerActions.mjs 1.31 kB
dist/es/components/MessageComposer/MessageComposerUI.mjs 1.41 kB
dist/es/components/MessageComposer/preEditSnapshot.mjs 627 B
dist/es/components/MessageComposer/QuotedMessageIndicator.mjs 263 B
dist/es/components/MessageComposer/QuotedMessagePreview.mjs 2.93 kB
dist/es/components/MessageComposer/RemoveAttachmentPreviewButton.mjs 586 B
dist/es/components/MessageComposer/SendButton.mjs 483 B
dist/es/components/MessageComposer/SendToChannelCheckbox.mjs 748 B
dist/es/components/MessageComposer/StopAIGenerationButton.mjs 354 B
dist/es/components/MessageComposer/WithDragAndDropUpload.mjs 1.59 kB
dist/es/components/MessageList/FloatingDateSeparator.mjs 687 B
dist/es/components/MessageList/GiphyPreviewMessage.mjs 278 B
dist/es/components/MessageList/hooks/MessageList/useEnrichedMessages.mjs 648 B
dist/es/components/MessageList/hooks/MessageList/useFloatingDateSeparatorMessageList.mjs 933 B
dist/es/components/MessageList/hooks/MessageList/useMessageListElements.mjs 571 B
dist/es/components/MessageList/hooks/MessageList/useMessageListScrollManager.mjs 1.68 kB
dist/es/components/MessageList/hooks/MessageList/useScrollLocationLogic.mjs 3.14 kB
dist/es/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.mjs 1.12 kB
dist/es/components/MessageList/hooks/useLastDeliveredData.mjs 539 B
dist/es/components/MessageList/hooks/useLastOwnMessage.mjs 249 B
dist/es/components/MessageList/hooks/useLastReadData.mjs 397 B
dist/es/components/MessageList/hooks/useMarkRead.mjs 1.18 kB
dist/es/components/MessageList/hooks/useReducedMotionPreference.mjs 475 B
dist/es/components/MessageList/hooks/VirtualizedMessageList/useFloatingDateSeparator.mjs 955 B
dist/es/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.mjs 427 B
dist/es/components/MessageList/hooks/VirtualizedMessageList/useMessageSetKey.mjs 396 B
dist/es/components/MessageList/hooks/VirtualizedMessageList/useNewMessageNotification.mjs 533 B
dist/es/components/MessageList/hooks/VirtualizedMessageList/usePrependMessagesCount.mjs 647 B
dist/es/components/MessageList/hooks/VirtualizedMessageList/useScrollerViewport.mjs 1.12 kB
dist/es/components/MessageList/hooks/VirtualizedMessageList/useScrollToBottomOnNewMessage.mjs 499 B
dist/es/components/MessageList/hooks/VirtualizedMessageList/useShouldForceScrollToBottom.mjs 422 B
dist/es/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.mjs 721 B
dist/es/components/MessageList/MessageList.mjs 3.87 kB
dist/es/components/MessageList/MessageListMainPanel.mjs 284 B
dist/es/components/MessageList/NewMessageNotification.mjs 519 B
dist/es/components/MessageList/renderMessages.mjs 1.13 kB
dist/es/components/MessageList/ScrollToLatestMessageButton.mjs 1.09 kB
dist/es/components/MessageList/UnreadMessagesNotification.mjs 616 B
dist/es/components/MessageList/UnreadMessagesSeparator.mjs 601 B
dist/es/components/MessageList/utils.mjs 2.19 kB
dist/es/components/MessageList/VirtualizedMessageList.mjs 4.35 kB
dist/es/components/MessageList/VirtualizedMessageListComponents.mjs 1.66 kB
dist/es/components/Modal/GlobalModal.mjs 1.81 kB
dist/es/components/Notifications/hooks/useNotificationApi.mjs 1.27 kB
dist/es/components/Notifications/hooks/useNotifications.mjs 569 B
dist/es/components/Notifications/hooks/useNotificationTarget.mjs 422 B
dist/es/components/Notifications/hooks/useSystemNotifications.mjs 458 B
dist/es/components/Notifications/Notification.mjs 1.22 kB
dist/es/components/Notifications/NotificationConfigurationContext.mjs 386 B
dist/es/components/Notifications/NotificationList.mjs 3.17 kB
dist/es/components/Notifications/notificationTarget.mjs 636 B
dist/es/components/Poll/hooks/useManagePollVotesRealtime.mjs 686 B
dist/es/components/Poll/hooks/usePollAnswerPagination.mjs 566 B
dist/es/components/Poll/hooks/usePollOptionVotesPagination.mjs 572 B
dist/es/components/Poll/mjs 872 B
dist/es/components/Poll/Poll.mjs 302 B
dist/es/components/Poll/PollActions/AddCommentPrompt.mjs 1.25 kB
dist/es/components/Poll/PollActions/EndPollAlert.mjs 764 B
dist/es/components/Poll/PollActions/PollAction.mjs 492 B
dist/es/components/Poll/PollActions/PollActions.mjs 1.26 kB
dist/es/components/Poll/PollActions/PollAnswerList.mjs 1.01 kB
dist/es/components/Poll/PollActions/PollOptionsFullList.mjs 561 B
dist/es/components/Poll/PollActions/PollQuestion.mjs 335 B
dist/es/components/Poll/PollActions/PollResults/PollOptionWithVotes.mjs 815 B
dist/es/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.mjs 684 B
dist/es/components/Poll/PollActions/PollResults/PollOptionWithVotesList.mjs 615 B
dist/es/components/Poll/PollActions/PollResults/PollResults.mjs 1.03 kB
dist/es/components/Poll/PollActions/SuggestPollOptionPrompt.mjs 1.23 kB
dist/es/components/Poll/PollContent.mjs 488 B
dist/es/components/Poll/PollCreationDialog/MultipleAnswersField.mjs 1.24 kB
dist/es/components/Poll/PollCreationDialog/NameField.mjs 677 B
dist/es/components/Poll/PollCreationDialog/OptionFieldSet.mjs 2.24 kB
dist/es/components/Poll/PollCreationDialog/PollCreationDialog.mjs 1.02 kB
dist/es/components/Poll/PollCreationDialog/PollCreationDialogControls.mjs 820 B
dist/es/components/Poll/PollCreationDialog/PollOptionReorderHandle.mjs 982 B
dist/es/components/Poll/PollHeader.mjs 635 B
dist/es/components/Poll/PollOptionList.mjs 814 B
dist/es/components/Poll/PollOptionSelector.mjs 1.47 kB
dist/es/components/Portal/Portal.mjs 300 B
dist/es/components/ReactFileUtilities/UploadButton.mjs 803 B
dist/es/components/ReactFileUtilities/utils.mjs 1.06 kB
dist/es/components/Reactions/hooks/useFetchReactions.mjs 701 B
dist/es/components/Reactions/hooks/useProcessReactions.mjs 1.23 kB
dist/es/components/Reactions/MessageReactions.mjs 2.07 kB
dist/es/components/Reactions/MessageReactionsDetail.mjs 1.89 kB
dist/es/components/Reactions/reactionOptions.mjs 1.11 kB
dist/es/components/Reactions/ReactionSelector.mjs 1.58 kB
dist/es/components/Reactions/ReactionSelectorWithButton.mjs 910 B
dist/es/components/Reactions/SpriteImage.mjs 727 B
dist/es/components/Reactions/utils/utils.mjs 284 B
dist/es/components/SafeAnchor/SafeAnchor.mjs 336 B
dist/es/components/Search/hooks/useAnnounceSearchResultCount.mjs 1.31 kB
dist/es/components/Search/hooks/useSearchFocusedMessage.mjs 296 B
dist/es/components/Search/hooks/useSearchQueriesInProgress.mjs 450 B
dist/es/components/Search/hooks/useSearchResultsKeyboardNavigation.mjs 721 B
dist/es/components/Search/Search.mjs 643 B
dist/es/components/Search/SearchBar/SearchBar.mjs 1.32 kB
dist/es/components/Search/SearchContext.mjs 306 B
dist/es/components/Search/SearchResults/SearchResultItem.mjs 1.27 kB
dist/es/components/Search/SearchResults/SearchResults.mjs 711 B
dist/es/components/Search/SearchResults/SearchResultsHeader.mjs 856 B
dist/es/components/Search/SearchResults/SearchResultsPresearch.mjs 305 B
dist/es/components/Search/SearchResults/SearchSourceResultList.mjs 649 B
dist/es/components/Search/SearchResults/SearchSourceResultListFooter.mjs 547 B
dist/es/components/Search/SearchResults/SearchSourceResults.mjs 562 B
dist/es/components/Search/SearchResults/SearchSourceResultsEmpty.mjs 308 B
dist/es/components/Search/SearchResults/SearchSourceResultsHeader.mjs 148 B
dist/es/components/Search/SearchResults/SearchSourceResultsLoadingIndicator.mjs 375 B
dist/es/components/Search/SearchSourceResultsContext.mjs 316 B
dist/es/components/SkipNavigation/SkipNavigation.mjs 1.01 kB
dist/es/components/SummarizedMessagePreview/hooks/useLatestMessagePreview.mjs 1.36 kB
dist/es/components/SummarizedMessagePreview/SummarizedMessagePreview.mjs 821 B
dist/es/components/TextareaComposer/hooks/useTextareaPlaceholder.mjs 600 B
dist/es/components/TextareaComposer/SuggestionList/CommandItem.mjs 481 B
dist/es/components/TextareaComposer/SuggestionList/EmoticonItem.mjs 508 B
dist/es/components/TextareaComposer/SuggestionList/MentionItem/BroadcastMentionItem.mjs 614 B
dist/es/components/TextareaComposer/SuggestionList/MentionItem/MentionItem.mjs 439 B
dist/es/components/TextareaComposer/SuggestionList/MentionItem/MentionSuggestionTitle.mjs 236 B
dist/es/components/TextareaComposer/SuggestionList/MentionItem/mjs 775 B
dist/es/components/TextareaComposer/SuggestionList/MentionItem/SpecialMentionItem.mjs 161 B
dist/es/components/TextareaComposer/SuggestionList/MentionItem/UserGroupItem.mjs 590 B
dist/es/components/TextareaComposer/SuggestionList/SuggestionList.mjs 2.39 kB
dist/es/components/TextareaComposer/SuggestionList/SuggestionListItem.mjs 648 B
dist/es/components/TextareaComposer/SuggestionList/TokenizedSuggestionParts.mjs 608 B
dist/es/components/TextareaComposer/TextareaComposer.mjs 3.78 kB
dist/es/components/Thread/LegacyThreadContext.mjs 198 B
dist/es/components/Thread/Thread.mjs 1.39 kB
dist/es/components/Thread/ThreadHead.mjs 416 B
dist/es/components/Thread/ThreadHeader.mjs 1.34 kB
dist/es/components/Thread/ThreadStart.mjs 461 B
dist/es/components/Threads/ThreadContext.mjs 305 B
dist/es/components/Threads/ThreadList/ThreadList.mjs 1.52 kB
dist/es/components/Threads/ThreadList/ThreadListEmptyPlaceholder.mjs 390 B
dist/es/components/Threads/ThreadList/ThreadListHeader.mjs 395 B
dist/es/components/Threads/ThreadList/ThreadListItem.mjs 351 B
dist/es/components/Threads/ThreadList/ThreadListItemUI.mjs 1.72 kB
dist/es/components/Threads/ThreadList/ThreadListLoadingIndicator.mjs 441 B
dist/es/components/Threads/ThreadList/ThreadListUnseenThreadsBanner.mjs 625 B
dist/es/components/Threads/ThreadList/utils.a11y.mjs 1.74 kB
dist/es/components/Threads/UnreadCountBadge.mjs 332 B
dist/es/components/Tooltip/hooks/useEnterLeaveHandlers.mjs 296 B
dist/es/components/Tooltip/Tooltip.mjs 556 B
dist/es/components/TypingIndicator/hooks/useDebouncedTypingActive.mjs 974 B
dist/es/components/TypingIndicator/TypingIndicator.mjs 1.22 kB
dist/es/components/TypingIndicator/TypingIndicatorDots.mjs 411 B
dist/es/components/TypingIndicator/TypingIndicatorHeader.mjs 838 B
dist/es/components/TypingIndicator/utils/getTypingStatusMessage.mjs 384 B
dist/es/components/UtilityComponents/ErrorBoundary.mjs 313 B
dist/es/components/UtilityComponents/hooks/useMutationObserver.mjs 798 B
dist/es/components/UtilityComponents/NullComponent.mjs 138 B
dist/es/components/UtilityComponents/useStableId.mjs 455 B
dist/es/components/VideoPlayer/ReactPlayerWrapper.mjs 481 B
dist/es/components/VideoPlayer/VideoPlayer.mjs 466 B
dist/es/components/VideoPlayer/VideoThumbnail.mjs 550 B
dist/es/components/VisuallyHidden/VisuallyHidden.mjs 397 B
dist/es/components/Window/Window.mjs 406 B
dist/es/constants/messageTypes.mjs 173 B
dist/es/context/AttachmentSelectorContext.mjs 272 B
dist/es/context/ChannelActionContext.mjs 412 B
dist/es/context/ChannelListContext.mjs 334 B
dist/es/context/ChannelStateContext.mjs 453 B
dist/es/context/ChatContext.mjs 402 B
dist/es/context/ComponentContext.mjs 263 B
dist/es/context/DialogManagerContext.mjs 1.38 kB
dist/es/context/MessageBounceContext.mjs 739 B
dist/es/context/MessageComposerContext.mjs 306 B
dist/es/context/MessageContext.mjs 305 B
dist/es/context/MessageListContext.mjs 434 B
dist/es/context/MessageTranslationViewContext.mjs 1.55 kB
dist/es/context/ModalContext.mjs 385 B
dist/es/context/PollContext.mjs 278 B
dist/es/context/TranslationContext.mjs 544 B
dist/es/context/TypingContext.mjs 408 B
dist/es/context/useComponentContextIcons.mjs 564 B
dist/es/context/VirtualizedMessageListContext.mjs 310 B
dist/es/context/WithComponents.mjs 308 B
dist/es/emojis.mjs 126 B
dist/es/i18n/de.mjs 12.7 kB
dist/es/i18n/en.mjs 9.34 kB
dist/es/i18n/es.mjs 12.8 kB
dist/es/i18n/fr.mjs 13.1 kB
dist/es/i18n/hi.mjs 14.1 kB
dist/es/i18n/it.mjs 12.7 kB
dist/es/i18n/ja.mjs 13.3 kB
dist/es/i18n/ko.mjs 12.9 kB
dist/es/i18n/nl.mjs 12.4 kB
dist/es/i18n/pt.mjs 12.7 kB
dist/es/i18n/ru.mjs 15.1 kB
dist/es/i18n/Streami18n.mjs 5.08 kB
dist/es/i18n/tr.mjs 12.5 kB
dist/es/i18n/TranslationBuilder/notifications/NotificationTranslationTopic.mjs 588 B
dist/es/i18n/TranslationBuilder/notifications/translators.mjs 668 B
dist/es/i18n/TranslationBuilder/notifications/translatorsByNotificationType.mjs 592 B
dist/es/i18n/TranslationBuilder/TranslationBuilder.mjs 741 B
dist/es/i18n/utils.mjs 2.04 kB
dist/es/index.mjs 8.57 kB
dist/es/mp3-encoder.mjs 778 B
dist/es/plugins/AIComponents/AIMarkdown/AIMarkdown.mjs 1.19 kB
dist/es/plugins/AIComponents/AIMarkdown/tools/charts/Chart.mjs 796 B
dist/es/plugins/AIComponents/AIMarkdown/tools/charts/chartJsSchema.mjs 425 B
dist/es/plugins/AIComponents/AIMarkdown/tools/charts/chartTypes.mjs 517 B
dist/es/plugins/AIComponents/AIMarkdown/tools/charts/JsonChart.mjs 424 B
dist/es/plugins/AIComponents/AIMarkdown/tools/charts/SuspendedChart.mjs 715 B
dist/es/plugins/AIComponents/AIMessageComposer/AIMessageComposer.mjs 3.37 kB
dist/es/plugins/AIComponents/AIMessageComposer/AttachmentPreview.mjs 1.65 kB
dist/es/plugins/AIComponents/AIMessageComposer/ChatOptions.mjs 1.51 kB
dist/es/plugins/AIComponents/AIMessageComposer/hooks/useSpeechToText.mjs 1.12 kB
dist/es/plugins/AIComponents/AIStateIndicator/AIStateIndicator.mjs 656 B
dist/es/plugins/AIComponents/hooks/useHeardText.mjs 2.49 kB
dist/es/plugins/AIComponents/icons.mjs 1.24 kB
dist/es/plugins/AIComponents/Message/AIAssistantMessage.mjs 628 B
dist/es/plugins/AIComponents/Message/AIMessageAttachment.mjs 1.23 kB
dist/es/plugins/AIComponents/Message/AIReplyActions.mjs 1.29 kB
dist/es/plugins/AIComponents/Message/AITypingIndicator.mjs 469 B
dist/es/plugins/AIComponents/Message/AIUserMessage.mjs 651 B
dist/es/plugins/AIComponents/MessageParts/AIMessageParts.mjs 809 B
dist/es/plugins/AIComponents/MessageParts/AIToolApproval.mjs 1.52 kB
dist/es/plugins/AIComponents/MessageParts/AIToolAuthorization.mjs 1.98 kB
dist/es/plugins/AIComponents/MessageParts/AIToolCall.mjs 1.07 kB
dist/es/plugins/AIComponents/MessageParts/parseMessageParts.mjs 2.12 kB
dist/es/plugins/AIComponents/Reasoning/AIReasoning.mjs 2.92 kB
dist/es/plugins/AIComponents/Reasoning/thinkingClock.mjs 939 B
dist/es/plugins/AIComponents/StreamingMessage/StreamingMessage.mjs 1.11 kB
dist/es/plugins/AIComponents/Suggestions/AISuggestions.mjs 516 B
dist/es/plugins/AIComponents/ToolCalls/AIClientIdentity.mjs 676 B
dist/es/plugins/AIComponents/ToolCalls/AIToolApprover.mjs 392 B
dist/es/plugins/AIComponents/ToolCalls/popupAuthorizer.mjs 2.19 kB
dist/es/plugins/AIComponents/utils.mjs 811 B
dist/es/plugins/AIComponents/VoiceVisualization/bounce.mjs 804 B
dist/es/plugins/AIComponents/VoiceVisualization/cssGlow.mjs 2.27 kB
dist/es/plugins/AIComponents/VoiceVisualization/driver.mjs 1.99 kB
dist/es/plugins/AIComponents/VoiceVisualization/hitArea.mjs 496 B
dist/es/plugins/AIComponents/VoiceVisualization/math.mjs 1.15 kB
dist/es/plugins/AIComponents/VoiceVisualization/palette.mjs 1.59 kB
dist/es/plugins/AIComponents/VoiceVisualization/renderers/glowWebGLRenderer.mjs 4.75 kB
dist/es/plugins/AIComponents/VoiceVisualization/renderers/types.mjs 216 B
dist/es/plugins/AIComponents/VoiceVisualization/renderers/waveRenderer.mjs 2.26 kB
dist/es/plugins/AIComponents/VoiceVisualization/simplex.mjs 1.26 kB
dist/es/plugins/AIComponents/VoiceVisualization/useAudioLevel.mjs 1.26 kB
dist/es/plugins/AIComponents/VoiceVisualization/useVoiceStateLabel.mjs 356 B
dist/es/plugins/AIComponents/VoiceVisualization/VoiceGlow.mjs 771 B
dist/es/plugins/AIComponents/VoiceVisualization/VoiceGlowCss.mjs 3.39 kB
dist/es/plugins/AIComponents/VoiceVisualization/VoiceVisualizationView.mjs 2.38 kB
dist/es/plugins/AIComponents/VoiceVisualization/VoiceWave.mjs 628 B
dist/es/plugins/ChannelDetail/AvatarWithChannelDetail.mjs 703 B
dist/es/plugins/ChannelDetail/ChannelDetail.mjs 944 B
dist/es/plugins/ChannelDetail/ChannelDetailContext.mjs 373 B
dist/es/plugins/ChannelDetail/ChannelDetailEmptyList.mjs 337 B
dist/es/plugins/ChannelDetail/ChannelDetailListLoadingIndicator.mjs 419 B
dist/es/plugins/ChannelDetail/ChannelDetailNavButton.mjs 505 B
dist/es/plugins/ChannelDetail/ChannelDetailSearchInput.mjs 567 B
dist/es/plugins/ChannelDetail/SectionNavigator/SectionNavigator.mjs 1.79 kB
dist/es/plugins/ChannelDetail/SectionNavigator/SectionNavigatorHeader.mjs 832 B
dist/es/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesEmptyList.mjs 445 B
dist/es/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesView.mjs 1.48 kB
dist/es/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesView.utils.mjs 1.1 kB
dist/es/plugins/ChannelDetail/Views/ChannelFilesView/useChannelFilesSearch.mjs 726 B
dist/es/plugins/ChannelDetail/Views/ChannelManagementView/ChannelManagementActions.mjs 3.67 kB
dist/es/plugins/ChannelDetail/Views/ChannelManagementView/ChannelManagementView.mjs 3.54 kB
dist/es/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaEmptyList.mjs 454 B
dist/es/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaView.mjs 2.29 kB
dist/es/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaView.utils.mjs 665 B
dist/es/plugins/ChannelDetail/Views/ChannelMediaView/useChannelMediaSearch.mjs 723 B
dist/es/plugins/ChannelDetail/Views/ChannelMemberDetailView/ChannelMemberActions.mjs 3.26 kB
dist/es/plugins/ChannelDetail/Views/ChannelMemberDetailView/ChannelMemberDetail.mjs 1 kB
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersAddView.mjs 2.21 kB
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersBrowseView.mjs 1.56 kB
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersHeaderActions.mjs 1.61 kB
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersView.mjs 1.25 kB
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersView.utils.mjs 361 B
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/useChannelMemberCount.mjs 408 B
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/useChannelMemberIds.mjs 430 B
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/useChannelMembersSearch.mjs 744 B
dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/PinnedMessagesEmptyList.mjs 447 B
dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/PinnedMessagesView.mjs 1.66 kB
dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/usePinnedMessagesCount.mjs 447 B
dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/usePinnedMessagesSearch.mjs 881 B
dist/es/plugins/ChannelDetail/VirtualizedList/VirtualizedList.mjs 670 B
dist/es/plugins/Emojis/EmojiPicker.mjs 1.3 kB
dist/es/plugins/Emojis/middleware/textComposerEmojiMiddleware.mjs 1.37 kB
dist/es/plugins/Emojis/Picker.mjs 324 B
dist/es/store/hooks/useStateStore.mjs 516 B
dist/es/utils/findReverse.mjs 188 B
dist/es/utils/getChannel.mjs 690 B
dist/es/utils/getChannelConfig.mjs 266 B
dist/es/utils/getTextareaCaretRect.mjs 856 B
dist/es/utils/getWholeChar.mjs 368 B
dist/es/utils/isDmChannel.mjs 247 B
dist/es/utils/mergeDeep.mjs 197 B
dist/es/utils/useStableCallback.mjs 831 B

compressed-size-action

@codecov

codecov Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 94.22356% with 77 lines in your changes missing coverage. Please review.
βœ… Project coverage is 87.21%. Comparing base (8fa9b5f) to head (2626e32).
⚠️ Report is 9 commits behind head on release-v14.

Files with missing lines Patch % Lines
src/plugins/A2UI/basicComponents.tsx 93.56% 15 Missing ⚠️
src/plugins/A2UI/runtime.tsx 93.40% 13 Missing ⚠️
...plugins/AIComponents/GenerativeUI/AIUIArguments.ts 87.83% 9 Missing ⚠️
src/plugins/A2UI/A2UIRenderer.tsx 80.55% 7 Missing ⚠️
src/plugins/A2UI/instructions.ts 96.02% 6 Missing ⚠️
src/plugins/OpenUI/OpenUIRenderer.tsx 87.50% 6 Missing ⚠️
src/plugins/OpenUI/runtime.tsx 95.23% 6 Missing ⚠️
src/plugins/A2UI/A2UIStream.ts 88.37% 5 Missing ⚠️
...Components/GenerativeUI/AIUIComponentDefinition.ts 93.47% 3 Missing ⚠️
src/plugins/AIComponents/GenerativeUI/AIUIHost.ts 97.54% 3 Missing ⚠️
... and 4 more
Additional details and impacted files
@@               Coverage Diff               @@
##           release-v14    #3388      +/-   ##
===============================================
+ Coverage        86.84%   87.21%   +0.36%     
===============================================
  Files              526      587      +61     
  Lines            16699    20082    +3383     
  Branches          5251     6324    +1073     
===============================================
+ Hits             14503    17514    +3011     
- Misses            2196     2568     +372     

β˜” View full report in Codecov by Harness.
πŸ“’ Have feedback on the report? Share it here.

πŸš€ New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • πŸ“¦ JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

The A2UI and OpenUI packages are optional peers at ~ ranges rather than
exact versions, so an app with a newer patch installs without a peer
conflict. Minors stay out: the 0.x packages change their API between
them, and the renderers rely on parts of both beyond their documented
API. The dev dependencies stay exact, so CI tests one version.

The README says so, and that ai-components is in 14.15.0.
OpenUI's step numbers set z-index 2, and nothing contained it, so they
showed over an app's layer above the conversation, such as Juno's call
screen. A reply's generated UI is now its own stacking context. It is
no containing block, so a fixed overlay inside it still covers the
page, and OpenUI's popovers and A2UI's dialog render outside it anyway.
A2UI's borderless variant has no border or background so that it reads as a
link, and iOS draws it in the accent colour. Ours was Stream's secondary ghost
button, grey words that looked like a heading until hovered. It is now the
primary ghost button.
- An app's component that throws leaves only itself out of a reply's UI,
  is tried again when its arguments change, and is reported once the
  reply is written; a reply whose UI failed while written is tried again
  once it is written.
- Renderers tell the app what went wrong after rendering, the host forgets
  a reply that left only after the conversation renders without it, and
  the runtime loader no longer changes state while rendering.
- host.send resolves to whether the action was sent.
- A middle click opens a link of a reply's UI; the menu button doesn't.
- The ai-components entry exports what the README documents, and the a2ui
  entry no longer exports its stream helpers. DefaultMessageData is empty
  again; apps type ai_ui themselves.
- zod ^4.2.0, which OpenUI's app components need; zustand and
  @openuidev/react-headless are no longer peers of this package.
- The build no longer ships the unreachable CJS A2UI renderer.
… does

A reply's generated UI looks the same in either format, and as on iOS:
the reply on a raised card, a callout tinted in its variant's colour
behind its icon, chips as pills with the chosen ones in the accent
colour, the main button a pill as wide as the reply, and follow-ups in
the accent colour with a hairline between them, under no heading.

A2UI buttons carry their variant as a class, and its chips are neutral
buttons with a class for the chosen ones, so choosing one changes only
their colour. The marks are CSS, with no images a page's content policy
could block.
…-ups

A2UI's Button works out from its surface whether it is a borderless
button in a Column, and whether one is before it, and says so with its
own classes, rather than the styles reaching for @a2ui/react's host
elements. A borderless button elsewhere, such as in a Row, reads as a
link. OpenUI's chosen chips drop their tick, so choosing one moves
nothing, and an app's component decodes its arguments only when they
change.
@stream-ci-bot

Copy link
Copy Markdown

πŸŽ‰ This PR is included in version 14.16.0 πŸŽ‰

The release is available on:

Your semantic-release bot πŸ“¦πŸš€

oliverlaz added a commit to GetStream/Vision-Agents that referenced this pull request Nov 4, 2026
## Why

A reply can be UI the agent writes, and what the person does in it comes
back with their next message as `ui_action` on `POST
/v1/agents/sessions/{id}/responses` (#1516). Go has `client.UIAction`
and Swift `Responses.create(_:uiAction:)`; JavaScript had only the
generated type, so a web app could not send one. Juno on the web and
`stream-chat-react`'s generated UI (GetStream/stream-chat-react#3388)
need it.

## How it works

```
AIUIHost.send(action)
  └─ session.responses.create(action.label, { uiAction: aiUIActionJSON(action) })
       └─ POST /v1/agents/sessions/{id}/responses
            { text: label, request_id, ui_action: { v, message_id, format, name, payload } }
              └─ router: the person's message carries it as custom.ai_ui_action,
                 and the model is told it after their words
```

| Change | Result | Test |
| --- | --- | --- |
| `CreateResponseOptions.uiAction`, exported `UIAction` (the generated
`ui_action` type) | sent as `ui_action` |
`sdks/js/tests/resource.test.ts`: the request carries `ui_action` |
| An empty `uiAction` | not sent | same file |
| A text-only question with an action | keeps its `request_id`, which
the router needs to keep the action on the message | same file |

## Validation

- `npm test` in `sdks/js`: 420 pass. `npm run types -- --check`: in step
with the spec.
- `go build ./...` and `go test ./internal/session/` pass on the branch
as merged with `accelerate`.

---------

Co-authored-by: Martin Mitrevski <martinmitrevski.oh@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
oliverlaz added a commit to GetStream/Vision-Agents that referenced this pull request Nov 4, 2026
> Stacked on the JavaScript SDK's `uiAction` (#1711). Until it merges,
this diff shows it too; this PR's own change is
`examples/voice_agents/react_assistant`.

## Why

`swift_assistant` plans a trip as interactive UI, in A2UI or OpenUI
(#1516). Juno on the web (#1645) showed only text. With
`stream-chat-react`'s generated UI (GetStream/stream-chat-react#3388),
it shows the same replies: the same backend, the same
`UIComponents.json`, the same actions back to the agent.

## How it works

```
reply's ai_ui ─> AIConversation ui={AIUIHost}
                  β”œβ”€ createA2UIRenderer()    A2UI 1.0
                  β”œβ”€ createOpenUIRenderer()  OpenUI
                  └─ tripComponents          place_card, trip_map, calendar_check,
                                             from swift_assistant's UIComponents.json

tap, form ─> AIUIAction ─> ChatScreen.send(label, uiAction)
                           └─ responses.create(label, { uiAction })
```

| Change | Where |
| --- | --- |
| A reply-format menu in the top bar: text, A2UI or OpenUI, the
backend's `/reply-format` | `src/ReplyFormatMenu.tsx`, `src/App.tsx` |
| The host with both renderers and the trip components; an action the
screen can't send yet, while the agent answers, says so over the
composer rather than doing nothing | `src/ChatView.tsx` |
| The trip components: a Wikipedia place card, a Leaflet map, a calendar
check | `src/tripComponents.tsx` |
| A reply with UI is not empty; `ai_ui` and `ai_ui_action` typed on
Stream messages; the action passed on with the question |
`src/agentChat.ts`, `src/chatScreen.ts` |
| OpenUI's styles, the a2ui and openui packages | `src/main.tsx`,
`package.json` |

The AI components and the generated UI come from `stream-chat-react`
14.16.0, released with GetStream/stream-chat-react#3388, which the
example installs from npm.

The branch also has a test,
`TestAHandedOnCommandTellsTheModelWhatThePersonDidInTheUI`
(`acceleration/internal/session/command_test.go`): a dispatch worker's
session must tell the model what the person did, not only "Update the
plan". The fix it was written for came with #1516, which it holds to.

## Validation

- `npm test` in the example: 35 pass, including the trip components.
`npm run build` (types, then the bundle) passes against
`stream-chat-react` 14.16.0 from npm.
- `go test ./internal/session/` passes on the branch as merged with
`accelerate`.
- Checked by hand against a local router and the `swift_assistant`
backend: in A2UI and OpenUI, "Plan a weekend in Ohrid" streams in as a
card with a map, places and the calendar; tapping a place and submitting
the form send their actions, which reach the person's message as
`custom.ai_ui_action` and get a new reply; reloading shows history at
once; switching to text shows text.

---------

Co-authored-by: Martin Mitrevski <martinmitrevski.oh@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

This branch was successfully deployed

2 active deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants