@assistant-ui/react 0.15.23 → 0.15.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/README.md +44 -23
  2. package/dist/assistant-transport.js.map +1 -1
  3. package/dist/cloud-renderer/CloudRendererHost.js.map +1 -1
  4. package/dist/context/providers/MessageProvider.js.map +1 -1
  5. package/dist/context/providers/ThreadViewportProvider.js.map +1 -1
  6. package/dist/hooks/useToolCallElapsed.js.map +1 -1
  7. package/dist/legacy-runtime/AssistantRuntimeProvider.js.map +1 -1
  8. package/dist/mcp-apps/app-frame.js.map +1 -1
  9. package/dist/model-context/frame/useAssistantFrameHost.js.map +1 -1
  10. package/dist/model-context/makeAssistantVisible.js.map +1 -1
  11. package/dist/primitives/actionBar/ActionBarCopy.js.map +1 -1
  12. package/dist/primitives/actionBar/ActionBarEdit.js.map +1 -1
  13. package/dist/primitives/actionBar/ActionBarExportMarkdown.js.map +1 -1
  14. package/dist/primitives/actionBar/ActionBarFeedbackNegative.js.map +1 -1
  15. package/dist/primitives/actionBar/ActionBarFeedbackPositive.js.map +1 -1
  16. package/dist/primitives/actionBar/ActionBarReload.js.map +1 -1
  17. package/dist/primitives/actionBar/ActionBarRoot.js.map +1 -1
  18. package/dist/primitives/actionBar/ActionBarSpeak.js.map +1 -1
  19. package/dist/primitives/actionBar/ActionBarStopSpeaking.js.map +1 -1
  20. package/dist/primitives/actionBar/useActionBarFloatStatus.js.map +1 -1
  21. package/dist/primitives/actionBarMore/ActionBarMoreContent.js.map +1 -1
  22. package/dist/primitives/actionBarMore/ActionBarMoreItem.js.map +1 -1
  23. package/dist/primitives/actionBarMore/ActionBarMoreRoot.js.map +1 -1
  24. package/dist/primitives/actionBarMore/ActionBarMoreSeparator.js.map +1 -1
  25. package/dist/primitives/actionBarMore/ActionBarMoreTrigger.js.map +1 -1
  26. package/dist/primitives/actionBarMore/scope.js.map +1 -1
  27. package/dist/primitives/assistantModal/AssistantModalAnchor.js.map +1 -1
  28. package/dist/primitives/assistantModal/AssistantModalContent.js.map +1 -1
  29. package/dist/primitives/assistantModal/AssistantModalRoot.js.map +1 -1
  30. package/dist/primitives/assistantModal/AssistantModalTrigger.js.map +1 -1
  31. package/dist/primitives/assistantModal/popoverRenderPrimitives.js.map +1 -1
  32. package/dist/primitives/assistantModal/scope.js.map +1 -1
  33. package/dist/primitives/attachment/AttachmentName.js.map +1 -1
  34. package/dist/primitives/attachment/AttachmentRemove.js.map +1 -1
  35. package/dist/primitives/attachment/AttachmentRoot.js.map +1 -1
  36. package/dist/primitives/attachment/AttachmentThumb.js.map +1 -1
  37. package/dist/primitives/branchPicker/BranchPickerCount.js.map +1 -1
  38. package/dist/primitives/branchPicker/BranchPickerNext.js.map +1 -1
  39. package/dist/primitives/branchPicker/BranchPickerNumber.js.map +1 -1
  40. package/dist/primitives/branchPicker/BranchPickerPrevious.js.map +1 -1
  41. package/dist/primitives/branchPicker/BranchPickerRoot.js.map +1 -1
  42. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.js.map +1 -1
  43. package/dist/primitives/chainOfThought/ChainOfThoughtRoot.js.map +1 -1
  44. package/dist/primitives/composer/ComposerAddAttachment.js.map +1 -1
  45. package/dist/primitives/composer/ComposerCancel.js.map +1 -1
  46. package/dist/primitives/composer/ComposerDictate.js.map +1 -1
  47. package/dist/primitives/composer/ComposerDictationTranscript.js.map +1 -1
  48. package/dist/primitives/composer/ComposerInput.d.ts.map +1 -1
  49. package/dist/primitives/composer/ComposerInput.js +3 -2
  50. package/dist/primitives/composer/ComposerInput.js.map +1 -1
  51. package/dist/primitives/composer/ComposerInputPluginContext.js.map +1 -1
  52. package/dist/primitives/composer/ComposerQuote.js.map +1 -1
  53. package/dist/primitives/composer/ComposerRoot.js.map +1 -1
  54. package/dist/primitives/composer/ComposerSend.js.map +1 -1
  55. package/dist/primitives/composer/ComposerStopDictation.js.map +1 -1
  56. package/dist/primitives/composer/trigger/TriggerPopover.js.map +1 -1
  57. package/dist/primitives/composer/trigger/TriggerPopoverAction.js.map +1 -1
  58. package/dist/primitives/composer/trigger/TriggerPopoverBack.js.map +1 -1
  59. package/dist/primitives/composer/trigger/TriggerPopoverCategories.js.map +1 -1
  60. package/dist/primitives/composer/trigger/TriggerPopoverDirective.js.map +1 -1
  61. package/dist/primitives/composer/trigger/TriggerPopoverItems.js.map +1 -1
  62. package/dist/primitives/composer/trigger/TriggerPopoverResource.js.map +1 -1
  63. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.js.map +1 -1
  64. package/dist/primitives/composer/trigger/index.js.map +1 -1
  65. package/dist/primitives/composer/trigger/triggerDetectionResource.js.map +1 -1
  66. package/dist/primitives/composer/trigger/triggerKeyboardResource.js.map +1 -1
  67. package/dist/primitives/composer/trigger/triggerNavigationResource.js.map +1 -1
  68. package/dist/primitives/composer/trigger/triggerSelectionResource.js.map +1 -1
  69. package/dist/primitives/composer/useComposerInputState.js.map +1 -1
  70. package/dist/primitives/dropdownMenuRenderPrimitives.js.map +1 -1
  71. package/dist/primitives/error/ErrorMessage.js.map +1 -1
  72. package/dist/primitives/error/ErrorRoot.js.map +1 -1
  73. package/dist/primitives/message/MessageIf.js.map +1 -1
  74. package/dist/primitives/message/MessageParts.js.map +1 -1
  75. package/dist/primitives/message/MessagePartsGrouped.d.ts.map +1 -1
  76. package/dist/primitives/message/MessagePartsGrouped.js +42 -17
  77. package/dist/primitives/message/MessagePartsGrouped.js.map +1 -1
  78. package/dist/primitives/message/MessageRoot.js.map +1 -1
  79. package/dist/primitives/messagePart/MessagePartImage.js.map +1 -1
  80. package/dist/primitives/queueItem/QueueItemRemove.js.map +1 -1
  81. package/dist/primitives/queueItem/QueueItemSteer.js.map +1 -1
  82. package/dist/primitives/queueItem/QueueItemText.js.map +1 -1
  83. package/dist/primitives/reasoning/useScrollLock.js.map +1 -1
  84. package/dist/primitives/selectionToolbar/SelectionToolbarQuote.js.map +1 -1
  85. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js.map +1 -1
  86. package/dist/primitives/suggestion/SuggestionDescription.js.map +1 -1
  87. package/dist/primitives/suggestion/SuggestionTitle.js.map +1 -1
  88. package/dist/primitives/suggestion/SuggestionTrigger.js.map +1 -1
  89. package/dist/primitives/thread/ThreadIf.js.map +1 -1
  90. package/dist/primitives/thread/ThreadRoot.d.ts.map +1 -1
  91. package/dist/primitives/thread/ThreadRoot.js +2 -0
  92. package/dist/primitives/thread/ThreadRoot.js.map +1 -1
  93. package/dist/primitives/thread/ThreadScrollToBottom.js.map +1 -1
  94. package/dist/primitives/thread/ThreadSuggestion.js.map +1 -1
  95. package/dist/primitives/thread/ThreadViewport.js.map +1 -1
  96. package/dist/primitives/thread/ThreadViewportFooter.js.map +1 -1
  97. package/dist/primitives/thread/topAnchor/useTopAnchorReserve.js.map +1 -1
  98. package/dist/primitives/threadList/ThreadListLoadMore.js.map +1 -1
  99. package/dist/primitives/threadList/ThreadListNew.js.map +1 -1
  100. package/dist/primitives/threadList/ThreadListRoot.js.map +1 -1
  101. package/dist/primitives/threadListItem/ThreadListItemArchive.js.map +1 -1
  102. package/dist/primitives/threadListItem/ThreadListItemDelete.js.map +1 -1
  103. package/dist/primitives/threadListItem/ThreadListItemRoot.js.map +1 -1
  104. package/dist/primitives/threadListItem/ThreadListItemTrigger.js.map +1 -1
  105. package/dist/primitives/threadListItem/ThreadListItemUnarchive.js.map +1 -1
  106. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js.map +1 -1
  107. package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.js.map +1 -1
  108. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.js.map +1 -1
  109. package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.js.map +1 -1
  110. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.js.map +1 -1
  111. package/dist/primitives/threadListItemMore/scope.js.map +1 -1
  112. package/dist/sandbox-host/SandboxHost.js.map +1 -1
  113. package/dist/unstable/useModelContextSnapshot.js.map +1 -1
  114. package/dist/unstable/webmcp/WebMcpRegistrationResource.js.map +1 -1
  115. package/dist/unstable/webmcp/useWebMcpProvider.js.map +1 -1
  116. package/dist/utils/Primitive.js.map +1 -1
  117. package/dist/utils/createActionButton.js.map +1 -1
  118. package/dist/utils/hooks/useManagedRef.js.map +1 -1
  119. package/dist/utils/hooks/useMediaQuery.js.map +1 -1
  120. package/dist/utils/hooks/useOnResizeContent.js.map +1 -1
  121. package/dist/utils/hooks/useOnScrollToBottom.js.map +1 -1
  122. package/dist/utils/hooks/useSizeHandle.js.map +1 -1
  123. package/dist/utils/isCompositionKey.d.ts +2 -0
  124. package/dist/utils/isCompositionKey.d.ts.map +1 -0
  125. package/dist/utils/isCompositionKey.js +6 -0
  126. package/dist/utils/isCompositionKey.js.map +1 -0
  127. package/dist/utils/smooth/SmoothContext.js.map +1 -1
  128. package/package.json +11 -11
  129. package/src/primitives/composer/ComposerInput.test.tsx +33 -1
  130. package/src/primitives/composer/ComposerInput.tsx +3 -2
  131. package/src/primitives/message/MessagePartsGrouped.test.tsx +271 -1
  132. package/src/primitives/message/MessagePartsGrouped.tsx +14 -6
  133. package/src/primitives/thread/ThreadRoot.test.tsx +33 -0
  134. package/src/primitives/thread/ThreadRoot.tsx +3 -0
  135. package/src/utils/isCompositionKey.ts +5 -0
@@ -357,6 +357,39 @@ describe("ThreadPrimitiveRoot", () => {
357
357
  expect(event.defaultPrevented).toBe(true);
358
358
  });
359
359
 
360
+ it.each([
361
+ ["during the composition", { isComposing: true }],
362
+ ["after compositionend (Safari)", { keyCode: 229 }],
363
+ ])(
364
+ "keeps speech playing when Escape ends an IME composition %s",
365
+ async (_, init) => {
366
+ const speech = createSpeechAdapter();
367
+ const runtimeRef: RuntimeRef = { current: null };
368
+ render(
369
+ <RuntimeProvider runtimeRef={runtimeRef} speech={speech.adapter}>
370
+ <ThreadPrimitiveRoot>
371
+ <ComposerPrimitiveInput data-testid="composer" />
372
+ </ThreadPrimitiveRoot>
373
+ </RuntimeProvider>,
374
+ );
375
+ startSpeaking(runtimeRef);
376
+ await waitFor(() => {
377
+ expect(runtimeRef.current!.thread.getState().speech).toBeDefined();
378
+ });
379
+
380
+ const event = new KeyboardEvent("keydown", {
381
+ key: "Escape",
382
+ bubbles: true,
383
+ cancelable: true,
384
+ ...init,
385
+ });
386
+ act(() => screen.getByTestId("composer").dispatchEvent(event));
387
+
388
+ expect(speech.cancel).not.toHaveBeenCalled();
389
+ expect(event.defaultPrevented).toBe(false);
390
+ },
391
+ );
392
+
360
393
  it("lets an idle composer fall through so Escape still stops speech", async () => {
361
394
  const speech = createSpeechAdapter();
362
395
  const runtimeRef: RuntimeRef = { current: null };
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
 
3
3
  import { Primitive } from "../../utils/Primitive";
4
+ import { isCompositionKey } from "../../utils/isCompositionKey";
4
5
  import {
5
6
  type ComponentRef,
6
7
  forwardRef,
@@ -64,6 +65,8 @@ export const ThreadPrimitiveRoot = forwardRef<
64
65
  useEffect(() => {
65
66
  const handleKeyDown = (event: KeyboardEvent) => {
66
67
  if (event.key !== "Escape") return;
68
+ // An Escape that ends an IME composition belongs to the input method.
69
+ if (isCompositionKey(event)) return;
67
70
  if (event.defaultPrevented || aui.thread.source === null) return;
68
71
  const eventThreadRoot =
69
72
  escapeEventThreadRoots.get(event) ??
@@ -0,0 +1,5 @@
1
+ // A keydown that ends an IME composition can arrive after compositionend with
2
+ // isComposing false and keyCode 229, as the Enter that commits one does in
3
+ // Safari.
4
+ export const isCompositionKey = (event: KeyboardEvent) =>
5
+ event.isComposing || event.keyCode === 229;