@assistant-ui/react 0.15.14 → 0.15.16

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 (210) hide show
  1. package/dist/assistant-transport.d.ts +32 -0
  2. package/dist/assistant-transport.d.ts.map +1 -0
  3. package/dist/assistant-transport.js +27 -0
  4. package/dist/assistant-transport.js.map +1 -0
  5. package/dist/context/providers/MessageProvider.js +1 -1
  6. package/dist/devtools/DevToolsHooks.d.ts +0 -2
  7. package/dist/devtools/DevToolsHooks.d.ts.map +1 -1
  8. package/dist/devtools/DevToolsHooks.js +10 -12
  9. package/dist/devtools/DevToolsHooks.js.map +1 -1
  10. package/dist/hooks/useMessageQuote.js +1 -1
  11. package/dist/hooks/useToolCallElapsed.js +1 -1
  12. package/dist/index.d.ts +4 -7
  13. package/dist/index.js +6 -8
  14. package/dist/legacy-runtime/AssistantRuntimeProvider.js +1 -1
  15. package/dist/mcp-apps/McpAppRenderer.js +1 -1
  16. package/dist/mcp-apps/McpAppsRemoteHost.d.ts.map +1 -1
  17. package/dist/mcp-apps/McpAppsRemoteHost.js +18 -2
  18. package/dist/mcp-apps/McpAppsRemoteHost.js.map +1 -1
  19. package/dist/mcp-apps/bridge.d.ts.map +1 -1
  20. package/dist/mcp-apps/bridge.js +33 -24
  21. package/dist/mcp-apps/bridge.js.map +1 -1
  22. package/dist/model-context/makeAssistantVisible.js +1 -1
  23. package/dist/primitives/actionBar/ActionBarCopy.js +1 -1
  24. package/dist/primitives/actionBar/ActionBarExportMarkdown.d.ts.map +1 -1
  25. package/dist/primitives/actionBar/ActionBarExportMarkdown.js +5 -2
  26. package/dist/primitives/actionBar/ActionBarExportMarkdown.js.map +1 -1
  27. package/dist/primitives/actionBar/ActionBarFeedbackNegative.js +1 -1
  28. package/dist/primitives/actionBar/ActionBarFeedbackPositive.js +1 -1
  29. package/dist/primitives/actionBar/ActionBarStopSpeaking.d.ts.map +1 -1
  30. package/dist/primitives/actionBar/ActionBarStopSpeaking.js +24 -37
  31. package/dist/primitives/actionBar/ActionBarStopSpeaking.js.map +1 -1
  32. package/dist/primitives/actionBar/useActionBarFloatStatus.js +1 -1
  33. package/dist/primitives/assistantModal/AssistantModalRoot.js +1 -1
  34. package/dist/primitives/attachment/AttachmentName.js +1 -1
  35. package/dist/primitives/attachment/AttachmentRemove.js +1 -1
  36. package/dist/primitives/attachment/AttachmentThumb.js +1 -1
  37. package/dist/primitives/branchPicker/BranchPickerCount.js +1 -1
  38. package/dist/primitives/branchPicker/BranchPickerNumber.js +1 -1
  39. package/dist/primitives/branchPicker/BranchPickerRoot.d.ts.map +1 -1
  40. package/dist/primitives/branchPicker/BranchPickerRoot.js +20 -15
  41. package/dist/primitives/branchPicker/BranchPickerRoot.js.map +1 -1
  42. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.js +1 -1
  43. package/dist/primitives/composer/ComposerAddAttachment.js +1 -1
  44. package/dist/primitives/composer/ComposerAttachmentDropzone.js +1 -1
  45. package/dist/primitives/composer/ComposerDictationTranscript.d.ts +2 -2
  46. package/dist/primitives/composer/ComposerDictationTranscript.js +3 -3
  47. package/dist/primitives/composer/ComposerDictationTranscript.js.map +1 -1
  48. package/dist/primitives/composer/ComposerInput.js +2 -2
  49. package/dist/primitives/composer/ComposerInput.js.map +1 -1
  50. package/dist/primitives/composer/ComposerQuote.js +1 -1
  51. package/dist/primitives/composer/ComposerRoot.js +1 -1
  52. package/dist/primitives/composer/ComposerStopDictation.js +1 -1
  53. package/dist/primitives/composer/trigger/TriggerPopover.js +1 -1
  54. package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts.map +1 -1
  55. package/dist/primitives/composer/trigger/triggerSelectionResource.js +24 -20
  56. package/dist/primitives/composer/trigger/triggerSelectionResource.js.map +1 -1
  57. package/dist/primitives/composer/useComposerInputState.js +1 -1
  58. package/dist/primitives/message/MessageIf.js +1 -1
  59. package/dist/primitives/message/MessagePartsGrouped.js +1 -1
  60. package/dist/primitives/message/MessageRoot.js +1 -1
  61. package/dist/primitives/message.js +1 -1
  62. package/dist/primitives/queueItem/QueueItemRemove.js +1 -1
  63. package/dist/primitives/queueItem/QueueItemSteer.js +1 -1
  64. package/dist/primitives/queueItem/QueueItemText.js +1 -1
  65. package/dist/primitives/selectionToolbar/SelectionToolbarQuote.js +1 -1
  66. package/dist/primitives/suggestion/SuggestionDescription.js +1 -1
  67. package/dist/primitives/suggestion/SuggestionTitle.js +1 -1
  68. package/dist/primitives/suggestion/SuggestionTrigger.js +1 -1
  69. package/dist/primitives/thread/ThreadIf.js +1 -1
  70. package/dist/primitives/thread/ThreadRoot.d.ts +3 -0
  71. package/dist/primitives/thread/ThreadRoot.d.ts.map +1 -1
  72. package/dist/primitives/thread/ThreadRoot.js +44 -9
  73. package/dist/primitives/thread/ThreadRoot.js.map +1 -1
  74. package/dist/primitives/thread/ThreadViewport.d.ts.map +1 -1
  75. package/dist/primitives/thread/ThreadViewport.js +2 -13
  76. package/dist/primitives/thread/ThreadViewport.js.map +1 -1
  77. package/dist/primitives/thread/useThreadViewportAutoScroll.d.ts.map +1 -1
  78. package/dist/primitives/thread/useThreadViewportAutoScroll.js +23 -8
  79. package/dist/primitives/thread/useThreadViewportAutoScroll.js.map +1 -1
  80. package/dist/primitives/threadList/ThreadListNew.js +1 -1
  81. package/dist/sandbox-host/SandboxHost.d.ts.map +1 -1
  82. package/dist/sandbox-host/SandboxHost.js +6 -1
  83. package/dist/sandbox-host/SandboxHost.js.map +1 -1
  84. package/dist/unstable/useComposerInput.d.ts +2 -2
  85. package/dist/unstable/useComposerInput.js +1 -1
  86. package/dist/unstable/useComposerInput.js.map +1 -1
  87. package/dist/unstable/useComposerInputHistory.js +2 -2
  88. package/dist/unstable/useComposerInputHistory.js.map +1 -1
  89. package/dist/unstable/useLiveCompletionAdapter.d.ts +5 -0
  90. package/dist/unstable/useLiveCompletionAdapter.d.ts.map +1 -1
  91. package/dist/unstable/useLiveCompletionAdapter.js +16 -3
  92. package/dist/unstable/useLiveCompletionAdapter.js.map +1 -1
  93. package/dist/unstable/useMentionAdapter.d.ts +1 -1
  94. package/dist/utils/invokeCallbackSafely.d.ts +5 -0
  95. package/dist/utils/invokeCallbackSafely.d.ts.map +1 -0
  96. package/dist/utils/invokeCallbackSafely.js +15 -0
  97. package/dist/utils/invokeCallbackSafely.js.map +1 -0
  98. package/dist/utils/smooth/SmoothContext.d.ts +6 -6
  99. package/dist/utils/smooth/SmoothContext.js +1 -1
  100. package/dist/utils/smooth/useSmooth.d.ts +3 -0
  101. package/dist/utils/smooth/useSmooth.d.ts.map +1 -1
  102. package/dist/utils/smooth/useSmooth.js +16 -1
  103. package/dist/utils/smooth/useSmooth.js.map +1 -1
  104. package/dist/utils/useToolArgsFieldStatus.js +1 -1
  105. package/package.json +10 -10
  106. package/src/assistant-transport.ts +94 -0
  107. package/src/devtools/DevToolsHooks.test.ts +40 -0
  108. package/src/devtools/DevToolsHooks.ts +10 -15
  109. package/src/index.ts +8 -4
  110. package/src/mcp-apps/McpAppsRemoteHost.test.ts +29 -3
  111. package/src/mcp-apps/McpAppsRemoteHost.ts +42 -7
  112. package/src/mcp-apps/bridge.test.ts +153 -0
  113. package/src/mcp-apps/bridge.ts +42 -30
  114. package/src/model-context/frame/SPEC_AssistantFrame.md +1 -1
  115. package/src/primitives/actionBar/ActionBarExportMarkdown.test.tsx +67 -0
  116. package/src/primitives/actionBar/ActionBarExportMarkdown.tsx +3 -1
  117. package/src/primitives/actionBar/ActionBarStopSpeaking.tsx +0 -9
  118. package/src/primitives/branchPicker/BranchPickerRoot.tsx +5 -3
  119. package/src/primitives/composer/ComposerDictationTranscript.tsx +2 -2
  120. package/src/primitives/composer/ComposerInput.tsx +1 -1
  121. package/src/primitives/composer/trigger/triggerSelectionResource.test.ts +135 -0
  122. package/src/primitives/composer/trigger/triggerSelectionResource.ts +2 -0
  123. package/src/primitives/thread/ThreadRoot.test.tsx +251 -0
  124. package/src/primitives/thread/ThreadRoot.tsx +33 -0
  125. package/src/primitives/thread/ThreadViewport.tsx +1 -8
  126. package/src/primitives/thread/useThreadViewportAutoScroll.test.tsx +152 -0
  127. package/src/primitives/thread/useThreadViewportAutoScroll.ts +26 -19
  128. package/src/sandbox-host/SandboxHost.test.tsx +90 -0
  129. package/src/sandbox-host/SandboxHost.tsx +8 -2
  130. package/src/tests/RemoteThreadListRuntime.adapterProvider.test.tsx +24 -3
  131. package/src/tests/RemoteThreadListRuntime.reloadMainThread.test.tsx +1 -2
  132. package/src/tests/augmentations.test.ts +49 -0
  133. package/src/tests/in-memory-thread-list.test.tsx +1 -1
  134. package/src/tests/threadMessageById.test.tsx +61 -1
  135. package/src/unstable/useComposerInput.ts +2 -2
  136. package/src/unstable/useComposerInputHistory.test.tsx +4 -4
  137. package/src/unstable/useComposerInputHistory.ts +1 -1
  138. package/src/unstable/useLiveCompletionAdapter.test.tsx +157 -0
  139. package/src/unstable/useLiveCompletionAdapter.ts +41 -17
  140. package/src/utils/invokeCallbackSafely.ts +11 -0
  141. package/src/utils/smooth/useSmooth.test.tsx +110 -0
  142. package/src/utils/smooth/useSmooth.ts +20 -6
  143. package/dist/client/InMemoryThreadList.d.ts +0 -12
  144. package/dist/client/InMemoryThreadList.d.ts.map +0 -1
  145. package/dist/client/InMemoryThreadList.js +0 -374
  146. package/dist/client/InMemoryThreadList.js.map +0 -1
  147. package/dist/context/react/utils/ensureBinding.d.ts +0 -5
  148. package/dist/context/react/utils/ensureBinding.d.ts.map +0 -1
  149. package/dist/context/react/utils/ensureBinding.js +0 -24
  150. package/dist/context/react/utils/ensureBinding.js.map +0 -1
  151. package/dist/context/react/utils/useRuntimeState.d.ts +0 -13
  152. package/dist/context/react/utils/useRuntimeState.d.ts.map +0 -1
  153. package/dist/context/react/utils/useRuntimeState.js +0 -33
  154. package/dist/context/react/utils/useRuntimeState.js.map +0 -1
  155. package/dist/legacy-runtime/cloud/auiV0.d.ts +0 -119
  156. package/dist/legacy-runtime/cloud/auiV0.d.ts.map +0 -1
  157. package/dist/legacy-runtime/cloud/auiV0.js +0 -137
  158. package/dist/legacy-runtime/cloud/auiV0.js.map +0 -1
  159. package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.d.ts +0 -16
  160. package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.d.ts.map +0 -1
  161. package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.js +0 -36
  162. package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.js.map +0 -1
  163. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.d.ts +0 -17
  164. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.d.ts.map +0 -1
  165. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.js +0 -55
  166. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.js.map +0 -1
  167. package/dist/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.d.ts +0 -11
  168. package/dist/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.d.ts.map +0 -1
  169. package/dist/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.js +0 -165
  170. package/dist/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.js.map +0 -1
  171. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.d.ts +0 -15
  172. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.d.ts.map +0 -1
  173. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.js +0 -81
  174. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.js.map +0 -1
  175. package/dist/legacy-runtime/runtime-cores/assistant-transport/types.d.ts +0 -126
  176. package/dist/legacy-runtime/runtime-cores/assistant-transport/types.d.ts.map +0 -1
  177. package/dist/legacy-runtime/runtime-cores/assistant-transport/types.js +0 -0
  178. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.d.ts +0 -14
  179. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.d.ts.map +0 -1
  180. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js +0 -290
  181. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js.map +0 -1
  182. package/dist/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.d.ts +0 -7
  183. package/dist/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.d.ts.map +0 -1
  184. package/dist/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.js +0 -25
  185. package/dist/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.js.map +0 -1
  186. package/dist/legacy-runtime/runtime-cores/assistant-transport/useLatestRef.d.ts +0 -7
  187. package/dist/legacy-runtime/runtime-cores/assistant-transport/useLatestRef.d.ts.map +0 -1
  188. package/dist/legacy-runtime/runtime-cores/assistant-transport/useLatestRef.js +0 -27
  189. package/dist/legacy-runtime/runtime-cores/assistant-transport/useLatestRef.js.map +0 -1
  190. package/dist/legacy-runtime/runtime-cores/assistant-transport/utils.d.ts +0 -2
  191. package/dist/legacy-runtime/runtime-cores/assistant-transport/utils.js +0 -2
  192. package/src/client/InMemoryThreadList.ts +0 -247
  193. package/src/context/react/utils/ensureBinding.ts +0 -46
  194. package/src/context/react/utils/useRuntimeState.ts +0 -46
  195. package/src/legacy-runtime/cloud/auiV0.ts +0 -331
  196. package/src/legacy-runtime/cloud/useCloudThreadListRuntime.ts +0 -31
  197. package/src/legacy-runtime/runtime-cores/assistant-transport/commandQueue.ts +0 -68
  198. package/src/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.test.ts +0 -455
  199. package/src/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.ts +0 -172
  200. package/src/legacy-runtime/runtime-cores/assistant-transport/runManager.ts +0 -113
  201. package/src/legacy-runtime/runtime-cores/assistant-transport/transport-delivery.test.tsx +0 -79
  202. package/src/legacy-runtime/runtime-cores/assistant-transport/transport-parentid.test.tsx +0 -97
  203. package/src/legacy-runtime/runtime-cores/assistant-transport/transport-scheduling.test.ts +0 -307
  204. package/src/legacy-runtime/runtime-cores/assistant-transport/types.ts +0 -170
  205. package/src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransport.spec.md +0 -141
  206. package/src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.test.tsx +0 -585
  207. package/src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.ts +0 -476
  208. package/src/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.ts +0 -20
  209. package/src/legacy-runtime/runtime-cores/assistant-transport/useLatestRef.ts +0 -9
  210. package/src/legacy-runtime/runtime-cores/assistant-transport/utils.ts +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ComposerInput.js","names":["composeEventHandlers","useComposedRefs","Slot","ClipboardEvent","KeyboardEvent","ReactElement","ReactNode","forwardRef","useCallback","useEffect","useRef","cloneElement","isValidElement","TextareaAutosize","TextareaAutosizeProps","TextareaHeightChangeMeta","useEscapeKeydown","useOnScrollToBottom","useMediaQuery","useAui","flushTapSync","useComposerInputPluginRegistryOptional","useComposerCompactContextOptional","useComposerInputDisabled","useComposerInputValue","useTriggerPopoverAriaProps","TOUCH_PRIMARY_QUERY","ComposerPrimitiveInput","Element","HTMLTextAreaElement","BaseProps","asChild","render","cancelOnEscape","unstable_focusOnRunStart","unstable_focusOnScrollToBottom","unstable_focusOnThreadSwitched","unstable_insertNewlineOnTouchEnter","addAttachmentOnPaste","SubmitModeProps","submitMode","submitOnEnter","Props","autoFocus","disabled","disabledProp","onChange","onKeyDown","onPaste","onSelect","onHeightChange","rest","forwardedRef","aui","pluginRegistry","compactContext","declaredSubmitMode","isTouchPrimary","effectiveSubmitMode","value","isDisabled","textareaRef","ref","compositionRef","e","current","contains","target","Node","isComposing","plugin","getPlugins","handleKeyDown","composer","getState","canCancel","cancel","preventDefault","handleKeyPress","nativeEvent","key","threadState","thread","hasQueue","capabilities","queue","shiftKey","ctrlKey","metaKey","canSend","send","steer","isRunning","shouldSubmit","closest","requestSubmit","handlePaste","threadCapabilities","files","Array","from","clipboardData","attachments","length","Promise","all","map","file","addAttachment","handleHeightChange","height","meta","el","cs","getComputedStyle","contentHeight","boxSizing","parseFloat","paddingTop","paddingBottom","borderTopWidth","borderBottomWidth","Math","round","rowHeight","setMultiline","autoFocusEnabled","focus","textarea","preventScroll","setSelectionRange","type","undefined","on","ariaComboboxProps","inputProps","name","const","React","ForwardedRef","ChangeEvent","isEditing","nativeIsComposing","setText","pos","selectionStart","setCursorPosition","onCompositionStart","CompositionEventHandler","onCompositionEnd","CompositionEvent","SyntheticEvent","renderChildren","children","props","Record","Component","Root","displayName"],"sources":["../../../src/primitives/composer/ComposerInput.tsx"],"sourcesContent":["\"use client\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { Slot } from \"radix-ui\";\nimport {\n type ClipboardEvent,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n cloneElement,\n isValidElement,\n} from \"react\";\nimport TextareaAutosize, {\n type TextareaAutosizeProps,\n type TextareaHeightChangeMeta,\n} from \"react-textarea-autosize\";\nimport { useEscapeKeydown } from \"@radix-ui/react-use-escape-keydown\";\nimport { useOnScrollToBottom } from \"../../utils/hooks/useOnScrollToBottom\";\nimport { useMediaQuery } from \"../../utils/hooks/useMediaQuery\";\nimport { useAui } from \"@assistant-ui/store\";\nimport { flushTapSync } from \"@assistant-ui/tap\";\nimport { useComposerInputPluginRegistryOptional } from \"./ComposerInputPluginContext\";\nimport { useComposerCompactContextOptional } from \"./ComposerCompactContext\";\nimport {\n useComposerInputDisabled,\n useComposerInputValue,\n useTriggerPopoverAriaProps,\n} from \"./useComposerInputState\";\n\nconst TOUCH_PRIMARY_QUERY = \"(pointer: coarse) and (not (any-pointer: fine))\";\n\nexport namespace ComposerPrimitiveInput {\n export type Element = HTMLTextAreaElement;\n\n type BaseProps = {\n /**\n * Whether to render as a child component using Slot.\n * When true, the component will merge its props with its child.\n */\n asChild?: boolean | undefined;\n /**\n * A React element to use as the input container, with props merged in.\n */\n render?: ReactElement | undefined;\n /**\n * Whether to cancel message composition when Escape is pressed.\n * @default true\n */\n cancelOnEscape?: boolean | undefined;\n /**\n * Whether to automatically focus the input when a new run starts.\n * @default true\n */\n unstable_focusOnRunStart?: boolean | undefined;\n /**\n * Whether to automatically focus the input when scrolling to bottom.\n * @default true\n */\n unstable_focusOnScrollToBottom?: boolean | undefined;\n /**\n * Whether to automatically focus the input when switching threads.\n * @default true\n */\n unstable_focusOnThreadSwitched?: boolean | undefined;\n /**\n * Whether plain Enter on a touch-primary device should insert a newline\n * instead of submitting, detected via\n * `(pointer: coarse) and (not (any-pointer: fine))`. Only takes effect\n * when `submitMode` resolves to `\"enter\"`.\n * @default false\n */\n unstable_insertNewlineOnTouchEnter?: boolean | undefined;\n /**\n * Whether to automatically add pasted files as attachments.\n * @default true\n */\n addAttachmentOnPaste?: boolean | undefined;\n };\n\n type SubmitModeProps =\n | {\n /**\n * Controls how the Enter key submits messages.\n * - \"enter\": Plain Enter submits (Shift+Enter for newline)\n * - \"ctrlEnter\": Ctrl/Cmd+Enter submits (plain Enter for newline)\n * - \"none\": Keyboard submission disabled\n * @default \"enter\"\n */\n submitMode?: \"enter\" | \"ctrlEnter\" | \"none\" | undefined;\n /**\n * @deprecated Use `submitMode` instead\n * @ignore\n */\n submitOnEnter?: never;\n }\n | {\n submitMode?: never;\n /**\n * Whether to submit the message when Enter is pressed (without Shift).\n * @default true\n * @deprecated Use `submitMode` instead. Will be removed in a future version.\n */\n submitOnEnter?: boolean | undefined;\n };\n\n export type Props = TextareaAutosizeProps & BaseProps & SubmitModeProps;\n}\n\n/**\n * A text input component for composing messages.\n *\n * This component provides a rich text input experience with automatic resizing,\n * keyboard shortcuts, file paste support, and intelligent focus management.\n * It integrates with the composer context to manage message state and submission.\n *\n * When rendered inside `Unstable_TriggerPopoverRoot` and a popover is open, the\n * underlying `<textarea>` automatically receives `aria-controls`,\n * `aria-expanded`, `aria-haspopup`, and `aria-activedescendant` for the\n * combobox relationship. These computed attributes override user-provided\n * values for those four ARIA props while the popover is open.\n *\n * @example\n * ```tsx\n * // Ctrl/Cmd+Enter to submit (plain Enter inserts newline)\n * <ComposerPrimitive.Input\n * placeholder=\"Type your message...\"\n * submitMode=\"ctrlEnter\"\n * />\n *\n * // Insert a newline on Enter on touch-primary devices.\n * <ComposerPrimitive.Input\n * placeholder=\"Type your message...\"\n * unstable_insertNewlineOnTouchEnter\n * />\n *\n * // Old API (deprecated, still supported)\n * <ComposerPrimitive.Input\n * placeholder=\"Type your message...\"\n * submitOnEnter={true}\n * />\n * ```\n */\nexport const ComposerPrimitiveInput = forwardRef<\n ComposerPrimitiveInput.Element,\n ComposerPrimitiveInput.Props\n>(\n (\n {\n autoFocus = false,\n asChild,\n render,\n disabled: disabledProp,\n onChange,\n onKeyDown,\n onPaste,\n onSelect,\n submitOnEnter,\n submitMode,\n cancelOnEscape = true,\n unstable_focusOnRunStart = true,\n unstable_focusOnScrollToBottom = true,\n unstable_focusOnThreadSwitched = true,\n unstable_insertNewlineOnTouchEnter = false,\n addAttachmentOnPaste = true,\n onHeightChange,\n ...rest\n },\n forwardedRef,\n ) => {\n const aui = useAui();\n const pluginRegistry = useComposerInputPluginRegistryOptional();\n const compactContext = useComposerCompactContextOptional();\n\n const declaredSubmitMode =\n submitMode ?? (submitOnEnter === false ? \"none\" : \"enter\");\n const isTouchPrimary = useMediaQuery(\n unstable_insertNewlineOnTouchEnter ? TOUCH_PRIMARY_QUERY : null,\n );\n const effectiveSubmitMode =\n unstable_insertNewlineOnTouchEnter &&\n isTouchPrimary &&\n declaredSubmitMode === \"enter\"\n ? \"none\"\n : declaredSubmitMode;\n\n const value = useComposerInputValue();\n const isDisabled = useComposerInputDisabled(disabledProp);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const ref = useComposedRefs(forwardedRef, textareaRef);\n // suppress text/cursor broadcasts during IME composition\n const compositionRef = useRef(false);\n\n useEscapeKeydown((e) => {\n // Only handle ESC if it originated from within this input\n if (!textareaRef.current?.contains(e.target as Node)) return;\n\n // ignore IME composition events\n if (e.isComposing) return;\n\n // Let registered plugins (mention, slash command, etc.) handle Escape first\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n if (plugin.handleKeyDown(e)) return;\n }\n }\n\n if (!cancelOnEscape) return;\n\n const composer = aui.composer;\n if (composer.getState().canCancel) {\n composer.cancel();\n e.preventDefault();\n }\n });\n\n const handleKeyPress = (e: KeyboardEvent) => {\n if (isDisabled) return;\n\n // ignore IME composition events\n if (e.nativeEvent.isComposing) return;\n\n // Let registered plugins (mention, slash command, etc.) handle keyboard events first\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n if (plugin.handleKeyDown(e)) return;\n }\n }\n\n if (e.key === \"Enter\") {\n const threadState = aui.thread.getState();\n const hasQueue = threadState.capabilities.queue;\n\n // Steer hotkey: Cmd/Ctrl+Shift+Enter (respects submitMode=\"none\" and canSend)\n if (\n e.shiftKey &&\n (e.ctrlKey || e.metaKey) &&\n hasQueue &&\n declaredSubmitMode !== \"none\" &&\n aui.composer.getState().canSend\n ) {\n e.preventDefault();\n aui.composer.send({ steer: true });\n return;\n }\n\n // Regular newline: Shift+Enter\n if (e.shiftKey) return;\n\n // Block submission when running unless queue is supported\n if (threadState.isRunning && !hasQueue) return;\n\n let shouldSubmit = false;\n if (effectiveSubmitMode === \"ctrlEnter\") {\n shouldSubmit = e.ctrlKey || e.metaKey;\n } else if (effectiveSubmitMode === \"enter\") {\n shouldSubmit = true;\n }\n\n if (shouldSubmit) {\n e.preventDefault();\n textareaRef.current?.closest(\"form\")?.requestSubmit();\n }\n }\n };\n\n const handlePaste = async (e: ClipboardEvent<HTMLTextAreaElement>) => {\n if (!addAttachmentOnPaste) return;\n const threadCapabilities = aui.thread.getState().capabilities;\n const files = Array.from(e.clipboardData?.files || []);\n\n if (threadCapabilities.attachments && files.length > 0) {\n e.preventDefault();\n await Promise.all(\n files.map(async (file) => {\n try {\n await aui.composer.addAttachment(file);\n } catch {\n // The composer runtime emits composer.attachmentAddError before rejecting.\n }\n }),\n );\n }\n };\n\n const handleHeightChange = (\n height: number,\n meta: TextareaHeightChangeMeta,\n ) => {\n onHeightChange?.(height, meta);\n if (!compactContext) return;\n const el = textareaRef.current;\n if (!el || el.value === \"\") return;\n const cs = getComputedStyle(el);\n const contentHeight =\n cs.boxSizing === \"border-box\"\n ? height -\n parseFloat(cs.paddingTop) -\n parseFloat(cs.paddingBottom) -\n parseFloat(cs.borderTopWidth) -\n parseFloat(cs.borderBottomWidth)\n : height;\n if (Math.round(contentHeight / meta.rowHeight) > 1) {\n compactContext.setMultiline(true);\n }\n };\n\n const autoFocusEnabled = autoFocus && !isDisabled;\n const focus = useCallback(() => {\n const textarea = textareaRef.current;\n if (!textarea || !autoFocusEnabled) return;\n\n textarea.focus({ preventScroll: true });\n textarea.setSelectionRange(textarea.value.length, textarea.value.length);\n }, [autoFocusEnabled]);\n\n useEffect(() => focus(), [focus]);\n\n useOnScrollToBottom(() => {\n if (\n aui.composer.getState().type === \"thread\" &&\n unstable_focusOnScrollToBottom\n ) {\n focus();\n }\n });\n\n useEffect(() => {\n if (\n aui.composer.getState().type !== \"thread\" ||\n !unstable_focusOnRunStart\n )\n return undefined;\n\n return aui.on(\"thread.runStart\", focus);\n }, [unstable_focusOnRunStart, focus, aui]);\n\n useEffect(() => {\n if (\n aui.composer.getState().type !== \"thread\" ||\n !unstable_focusOnThreadSwitched\n )\n return undefined;\n\n return aui.on(\"threadListItem.switchedTo\", focus);\n }, [unstable_focusOnThreadSwitched, focus, aui]);\n\n useEffect(() => {\n if (value === \"\") compactContext?.setMultiline(false);\n }, [value, compactContext]);\n\n const ariaComboboxProps = useTriggerPopoverAriaProps();\n\n const inputProps = {\n name: \"input\" as const,\n value,\n ...rest,\n ...ariaComboboxProps,\n ref: ref as React.ForwardedRef<HTMLTextAreaElement>,\n disabled: isDisabled,\n onChange: composeEventHandlers(\n onChange,\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (!aui.composer.getState().isEditing) return;\n const nativeIsComposing =\n (e.nativeEvent as { isComposing?: boolean }).isComposing === true;\n // recover stuck compositionRef when the browser drops compositionend\n if (compositionRef.current && !nativeIsComposing) {\n compositionRef.current = false;\n }\n const isComposing = nativeIsComposing || compositionRef.current;\n // keep controlled value in sync mid-IME so react does not reset the textarea to a stale value\n flushTapSync(() => {\n aui.composer.setText(e.target.value);\n });\n if (isComposing) return;\n const pos = e.target.selectionStart ?? e.target.value.length;\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n plugin.setCursorPosition(pos);\n }\n }\n },\n ),\n onKeyDown: composeEventHandlers(onKeyDown, handleKeyPress),\n onCompositionStart: composeEventHandlers(\n (rest as { onCompositionStart?: React.CompositionEventHandler })\n .onCompositionStart,\n () => {\n compositionRef.current = true;\n },\n ),\n onCompositionEnd: composeEventHandlers(\n (rest as { onCompositionEnd?: React.CompositionEventHandler })\n .onCompositionEnd,\n (e: React.CompositionEvent<HTMLTextAreaElement>) => {\n compositionRef.current = false;\n if (!aui.composer.getState().isEditing) return;\n const target = e.target as HTMLTextAreaElement;\n flushTapSync(() => {\n aui.composer.setText(target.value);\n });\n const pos = target.selectionStart ?? target.value.length;\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n plugin.setCursorPosition(pos);\n }\n }\n },\n ),\n onSelect: composeEventHandlers(\n onSelect,\n (e: React.SyntheticEvent<HTMLTextAreaElement>) => {\n if (compositionRef.current) return;\n const target = e.target as HTMLTextAreaElement;\n const pos = target.selectionStart ?? target.value.length;\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n plugin.setCursorPosition(pos);\n }\n }\n },\n ),\n onPaste: composeEventHandlers(onPaste, handlePaste),\n ...(compactContext\n ? { onHeightChange: handleHeightChange }\n : onHeightChange !== undefined\n ? { onHeightChange }\n : {}),\n };\n\n if (render && isValidElement(render)) {\n const renderChildren =\n (rest as any).children !== undefined\n ? ((rest as any).children as ReactNode)\n : ((render.props as Record<string, unknown>).children as ReactNode);\n return (\n <Slot.Root {...inputProps}>\n {cloneElement(render, undefined, renderChildren)}\n </Slot.Root>\n );\n }\n\n const Component = asChild ? Slot.Root : TextareaAutosize;\n return <Component {...inputProps} />;\n },\n);\n\nComposerPrimitiveInput.displayName = \"ComposerPrimitive.Input\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"ComposerInput.js","names":["composeEventHandlers","useComposedRefs","Slot","ClipboardEvent","KeyboardEvent","ReactElement","ReactNode","forwardRef","useCallback","useEffect","useRef","cloneElement","isValidElement","TextareaAutosize","TextareaAutosizeProps","TextareaHeightChangeMeta","useEscapeKeydown","useOnScrollToBottom","useMediaQuery","useAui","flushTapSync","useComposerInputPluginRegistryOptional","useComposerCompactContextOptional","useComposerInputDisabled","useComposerInputValue","useTriggerPopoverAriaProps","TOUCH_PRIMARY_QUERY","ComposerPrimitiveInput","Element","HTMLTextAreaElement","BaseProps","asChild","render","cancelOnEscape","unstable_focusOnRunStart","unstable_focusOnScrollToBottom","unstable_focusOnThreadSwitched","unstable_insertNewlineOnTouchEnter","addAttachmentOnPaste","SubmitModeProps","submitMode","submitOnEnter","Props","autoFocus","disabled","disabledProp","onChange","onKeyDown","onPaste","onSelect","onHeightChange","rest","forwardedRef","aui","pluginRegistry","compactContext","declaredSubmitMode","isTouchPrimary","effectiveSubmitMode","value","isDisabled","textareaRef","ref","compositionRef","e","current","contains","target","Node","isComposing","plugin","getPlugins","handleKeyDown","composer","getState","canCancel","cancel","preventDefault","handleKeyPress","nativeEvent","key","threadState","thread","hasQueue","capabilities","queue","shiftKey","ctrlKey","metaKey","canSend","send","steer","isRunning","shouldSubmit","closest","requestSubmit","handlePaste","threadCapabilities","files","Array","from","clipboardData","attachments","length","Promise","all","map","file","addAttachment","handleHeightChange","height","meta","el","cs","getComputedStyle","contentHeight","boxSizing","parseFloat","paddingTop","paddingBottom","borderTopWidth","borderBottomWidth","Math","round","rowHeight","setMultiline","autoFocusEnabled","focus","textarea","preventScroll","setSelectionRange","type","undefined","on","ariaComboboxProps","inputProps","name","const","React","ForwardedRef","ChangeEvent","isEditing","nativeIsComposing","setText","pos","selectionStart","setCursorPosition","onCompositionStart","CompositionEventHandler","onCompositionEnd","CompositionEvent","SyntheticEvent","renderChildren","children","props","Record","Component","Root","displayName"],"sources":["../../../src/primitives/composer/ComposerInput.tsx"],"sourcesContent":["\"use client\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { Slot } from \"radix-ui\";\nimport {\n type ClipboardEvent,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n cloneElement,\n isValidElement,\n} from \"react\";\nimport TextareaAutosize, {\n type TextareaAutosizeProps,\n type TextareaHeightChangeMeta,\n} from \"react-textarea-autosize\";\nimport { useEscapeKeydown } from \"@radix-ui/react-use-escape-keydown\";\nimport { useOnScrollToBottom } from \"../../utils/hooks/useOnScrollToBottom\";\nimport { useMediaQuery } from \"../../utils/hooks/useMediaQuery\";\nimport { useAui } from \"@assistant-ui/store\";\nimport { flushTapSync } from \"@assistant-ui/tap\";\nimport { useComposerInputPluginRegistryOptional } from \"./ComposerInputPluginContext\";\nimport { useComposerCompactContextOptional } from \"./ComposerCompactContext\";\nimport {\n useComposerInputDisabled,\n useComposerInputValue,\n useTriggerPopoverAriaProps,\n} from \"./useComposerInputState\";\n\nconst TOUCH_PRIMARY_QUERY = \"(pointer: coarse) and (not (any-pointer: fine))\";\n\nexport namespace ComposerPrimitiveInput {\n export type Element = HTMLTextAreaElement;\n\n type BaseProps = {\n /**\n * Whether to render as a child component using Slot.\n * When true, the component will merge its props with its child.\n */\n asChild?: boolean | undefined;\n /**\n * A React element to use as the input container, with props merged in.\n */\n render?: ReactElement | undefined;\n /**\n * Whether to cancel message composition when Escape is pressed.\n * @default true\n */\n cancelOnEscape?: boolean | undefined;\n /**\n * Whether to automatically focus the input when a new run starts.\n * @default true\n */\n unstable_focusOnRunStart?: boolean | undefined;\n /**\n * Whether to automatically focus the input when scrolling to bottom.\n * @default true\n */\n unstable_focusOnScrollToBottom?: boolean | undefined;\n /**\n * Whether to automatically focus the input when switching threads.\n * @default true\n */\n unstable_focusOnThreadSwitched?: boolean | undefined;\n /**\n * Whether plain Enter on a touch-primary device should insert a newline\n * instead of submitting, detected via\n * `(pointer: coarse) and (not (any-pointer: fine))`. Only takes effect\n * when `submitMode` resolves to `\"enter\"`.\n * @default false\n */\n unstable_insertNewlineOnTouchEnter?: boolean | undefined;\n /**\n * Whether to automatically add pasted files as attachments.\n * @default true\n */\n addAttachmentOnPaste?: boolean | undefined;\n };\n\n type SubmitModeProps =\n | {\n /**\n * Controls how the Enter key submits messages.\n * - \"enter\": Plain Enter submits (Shift+Enter for newline)\n * - \"ctrlEnter\": Ctrl/Cmd+Enter submits (plain Enter for newline)\n * - \"none\": Keyboard submission disabled\n * @default \"enter\"\n */\n submitMode?: \"enter\" | \"ctrlEnter\" | \"none\" | undefined;\n /**\n * @deprecated Use `submitMode` instead\n * @ignore\n */\n submitOnEnter?: never;\n }\n | {\n submitMode?: never;\n /**\n * Whether to submit the message when Enter is pressed (without Shift).\n * @default true\n * @deprecated Use `submitMode` instead. Will be removed in a future version.\n */\n submitOnEnter?: boolean | undefined;\n };\n\n export type Props = TextareaAutosizeProps & BaseProps & SubmitModeProps;\n}\n\n/**\n * A text input component for composing messages.\n *\n * This component provides a rich text input experience with automatic resizing,\n * keyboard shortcuts, file paste support, and intelligent focus management.\n * It integrates with the composer context to manage message state and submission.\n *\n * When rendered inside `Unstable_TriggerPopoverRoot` and a popover is open, the\n * underlying `<textarea>` automatically receives `aria-controls`,\n * `aria-expanded`, `aria-haspopup`, and `aria-activedescendant` for the\n * combobox relationship. These computed attributes override user-provided\n * values for those four ARIA props while the popover is open.\n *\n * @example\n * ```tsx\n * // Ctrl/Cmd+Enter to submit (plain Enter inserts newline)\n * <ComposerPrimitive.Input\n * placeholder=\"Type your message...\"\n * submitMode=\"ctrlEnter\"\n * />\n *\n * // Insert a newline on Enter on touch-primary devices.\n * <ComposerPrimitive.Input\n * placeholder=\"Type your message...\"\n * unstable_insertNewlineOnTouchEnter\n * />\n *\n * // Old API (deprecated, still supported)\n * <ComposerPrimitive.Input\n * placeholder=\"Type your message...\"\n * submitOnEnter={true}\n * />\n * ```\n */\nexport const ComposerPrimitiveInput = forwardRef<\n ComposerPrimitiveInput.Element,\n ComposerPrimitiveInput.Props\n>(\n (\n {\n autoFocus = false,\n asChild,\n render,\n disabled: disabledProp,\n onChange,\n onKeyDown,\n onPaste,\n onSelect,\n submitOnEnter,\n submitMode,\n cancelOnEscape = true,\n unstable_focusOnRunStart = true,\n unstable_focusOnScrollToBottom = true,\n unstable_focusOnThreadSwitched = true,\n unstable_insertNewlineOnTouchEnter = false,\n addAttachmentOnPaste = true,\n onHeightChange,\n ...rest\n },\n forwardedRef,\n ) => {\n const aui = useAui();\n const pluginRegistry = useComposerInputPluginRegistryOptional();\n const compactContext = useComposerCompactContextOptional();\n\n const declaredSubmitMode =\n submitMode ?? (submitOnEnter === false ? \"none\" : \"enter\");\n const isTouchPrimary = useMediaQuery(\n unstable_insertNewlineOnTouchEnter ? TOUCH_PRIMARY_QUERY : null,\n );\n const effectiveSubmitMode =\n unstable_insertNewlineOnTouchEnter &&\n isTouchPrimary &&\n declaredSubmitMode === \"enter\"\n ? \"none\"\n : declaredSubmitMode;\n\n const value = useComposerInputValue();\n const isDisabled = useComposerInputDisabled(disabledProp);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const ref = useComposedRefs(forwardedRef, textareaRef);\n // suppress text/cursor broadcasts during IME composition\n const compositionRef = useRef(false);\n\n useEscapeKeydown((e) => {\n // Only handle ESC if it originated from within this input\n if (!textareaRef.current?.contains(e.target as Node)) return;\n\n // ignore IME composition events\n if (e.isComposing) return;\n\n // Let registered plugins (mention, slash command, etc.) handle Escape first\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n if (plugin.handleKeyDown(e)) return;\n }\n }\n\n if (!cancelOnEscape) return;\n\n const composer = aui.composer;\n if (composer.getState().canCancel) {\n composer.cancel();\n e.preventDefault();\n }\n });\n\n const handleKeyPress = (e: KeyboardEvent) => {\n if (isDisabled) return;\n\n // ignore IME composition events\n if (e.nativeEvent.isComposing) return;\n\n // Let registered plugins (mention, slash command, etc.) handle keyboard events first\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n if (plugin.handleKeyDown(e)) return;\n }\n }\n\n if (e.key === \"Enter\") {\n const threadState = aui.thread.getState();\n const hasQueue = threadState.capabilities.queue;\n\n // Steer hotkey: Cmd/Ctrl+Shift+Enter (respects submitMode=\"none\" and canSend)\n if (\n e.shiftKey &&\n (e.ctrlKey || e.metaKey) &&\n hasQueue &&\n declaredSubmitMode !== \"none\" &&\n aui.composer.getState().canSend\n ) {\n e.preventDefault();\n aui.composer.send({ steer: true });\n return;\n }\n\n // Regular newline: Shift+Enter\n if (e.shiftKey) return;\n\n // Block submission when running unless queue is supported\n if (threadState.isRunning && !hasQueue) return;\n\n let shouldSubmit = false;\n if (effectiveSubmitMode === \"ctrlEnter\") {\n shouldSubmit = e.ctrlKey || e.metaKey;\n } else if (effectiveSubmitMode === \"enter\") {\n shouldSubmit = true;\n }\n\n if (shouldSubmit) {\n e.preventDefault();\n textareaRef.current?.closest(\"form\")?.requestSubmit();\n }\n }\n };\n\n const handlePaste = async (e: ClipboardEvent<HTMLTextAreaElement>) => {\n if (!addAttachmentOnPaste) return;\n const threadCapabilities = aui.thread.getState().capabilities;\n const files = Array.from(e.clipboardData?.files || []);\n\n if (threadCapabilities.attachments && files.length > 0) {\n e.preventDefault();\n await Promise.all(\n files.map(async (file) => {\n try {\n await aui.composer.addAttachment(file);\n } catch {\n // The composer runtime emits composer.attachmentAddError before rejecting.\n }\n }),\n );\n }\n };\n\n const handleHeightChange = (\n height: number,\n meta: TextareaHeightChangeMeta,\n ) => {\n onHeightChange?.(height, meta);\n if (!compactContext) return;\n const el = textareaRef.current;\n if (!el || el.value === \"\") return;\n const cs = getComputedStyle(el);\n const contentHeight =\n cs.boxSizing === \"border-box\"\n ? height -\n parseFloat(cs.paddingTop) -\n parseFloat(cs.paddingBottom) -\n parseFloat(cs.borderTopWidth) -\n parseFloat(cs.borderBottomWidth)\n : height;\n if (Math.round(contentHeight / meta.rowHeight) > 1) {\n compactContext.setMultiline(true);\n }\n };\n\n const autoFocusEnabled = autoFocus && !isDisabled;\n const focus = useCallback(() => {\n const textarea = textareaRef.current;\n if (!textarea || !autoFocusEnabled) return;\n\n textarea.focus({ preventScroll: true });\n textarea.setSelectionRange(textarea.value.length, textarea.value.length);\n }, [autoFocusEnabled]);\n\n useEffect(() => focus(), [focus]);\n\n useOnScrollToBottom(() => {\n if (\n aui.composer.getState().type === \"thread\" &&\n unstable_focusOnScrollToBottom\n ) {\n focus();\n }\n });\n\n useEffect(() => {\n if (\n aui.composer.getState().type !== \"thread\" ||\n !unstable_focusOnRunStart\n )\n return undefined;\n\n return aui.on(\"thread.runStart\", focus);\n }, [unstable_focusOnRunStart, focus, aui]);\n\n useEffect(() => {\n if (\n aui.composer.getState().type !== \"thread\" ||\n !unstable_focusOnThreadSwitched\n )\n return undefined;\n\n return aui.on(\"threads.selectionChanged\", focus);\n }, [unstable_focusOnThreadSwitched, focus, aui]);\n\n useEffect(() => {\n if (value === \"\") compactContext?.setMultiline(false);\n }, [value, compactContext]);\n\n const ariaComboboxProps = useTriggerPopoverAriaProps();\n\n const inputProps = {\n name: \"input\" as const,\n value,\n ...rest,\n ...ariaComboboxProps,\n ref: ref as React.ForwardedRef<HTMLTextAreaElement>,\n disabled: isDisabled,\n onChange: composeEventHandlers(\n onChange,\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (!aui.composer.getState().isEditing) return;\n const nativeIsComposing =\n (e.nativeEvent as { isComposing?: boolean }).isComposing === true;\n // recover stuck compositionRef when the browser drops compositionend\n if (compositionRef.current && !nativeIsComposing) {\n compositionRef.current = false;\n }\n const isComposing = nativeIsComposing || compositionRef.current;\n // keep controlled value in sync mid-IME so react does not reset the textarea to a stale value\n flushTapSync(() => {\n aui.composer.setText(e.target.value);\n });\n if (isComposing) return;\n const pos = e.target.selectionStart ?? e.target.value.length;\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n plugin.setCursorPosition(pos);\n }\n }\n },\n ),\n onKeyDown: composeEventHandlers(onKeyDown, handleKeyPress),\n onCompositionStart: composeEventHandlers(\n (rest as { onCompositionStart?: React.CompositionEventHandler })\n .onCompositionStart,\n () => {\n compositionRef.current = true;\n },\n ),\n onCompositionEnd: composeEventHandlers(\n (rest as { onCompositionEnd?: React.CompositionEventHandler })\n .onCompositionEnd,\n (e: React.CompositionEvent<HTMLTextAreaElement>) => {\n compositionRef.current = false;\n if (!aui.composer.getState().isEditing) return;\n const target = e.target as HTMLTextAreaElement;\n flushTapSync(() => {\n aui.composer.setText(target.value);\n });\n const pos = target.selectionStart ?? target.value.length;\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n plugin.setCursorPosition(pos);\n }\n }\n },\n ),\n onSelect: composeEventHandlers(\n onSelect,\n (e: React.SyntheticEvent<HTMLTextAreaElement>) => {\n if (compositionRef.current) return;\n const target = e.target as HTMLTextAreaElement;\n const pos = target.selectionStart ?? target.value.length;\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n plugin.setCursorPosition(pos);\n }\n }\n },\n ),\n onPaste: composeEventHandlers(onPaste, handlePaste),\n ...(compactContext\n ? { onHeightChange: handleHeightChange }\n : onHeightChange !== undefined\n ? { onHeightChange }\n : {}),\n };\n\n if (render && isValidElement(render)) {\n const renderChildren =\n (rest as any).children !== undefined\n ? ((rest as any).children as ReactNode)\n : ((render.props as Record<string, unknown>).children as ReactNode);\n return (\n <Slot.Root {...inputProps}>\n {cloneElement(render, undefined, renderChildren)}\n </Slot.Root>\n );\n }\n\n const Component = asChild ? Slot.Root : TextareaAutosize;\n return <Component {...inputProps} />;\n },\n);\n\nComposerPrimitiveInput.displayName = \"ComposerPrimitive.Input\";\n"],"mappings":";;;;;;;;;;;;;;;;AAkCA,MAAM0B,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiH5B,MAAaC,yBAAyBpB,YAKlC,EACEoC,YAAY,OACZZ,SACAC,QACAY,UAAUC,cACVC,UACAC,WACAC,SACAC,UACAR,eACAD,YACAP,iBAAiB,MACjBC,2BAA2B,MAC3BC,iCAAiC,MACjCC,iCAAiC,MACjCC,qCAAqC,OACrCC,uBAAuB,MACvBY,gBACA,GAAGC,QAELC,iBACG;CACH,MAAMC,MAAMlC,OAAO;CACnB,MAAMmC,iBAAiBjC,uCAAuC;CAC9D,MAAMkC,iBAAiBjC,kCAAkC;CAEzD,MAAMkC,qBACJhB,eAAeC,kBAAkB,QAAQ,SAAS;CACpD,MAAMgB,iBAAiBvC,cACrBmB,qCAAqCX,sBAAsB,IAC7D;CACA,MAAMgC,sBACJrB,sCACAoB,kBACAD,uBAAuB,UACnB,SACAA;CAEN,MAAMG,QAAQnC,sBAAsB;CACpC,MAAMoC,aAAarC,yBAAyBsB,YAAY;CACxD,MAAMgB,cAAcnD,OAA4B,IAAI;CACpD,MAAMoD,MAAM7D,gBAAgBmD,cAAcS,WAAW;CAErD,MAAME,iBAAiBrD,OAAO,KAAK;CAEnCM,kBAAkBgD,MAAM;EAEtB,IAAI,CAACH,YAAYI,SAASC,SAASF,EAAEG,MAAc,GAAG;EAGtD,IAAIH,EAAEK,aAAa;EAGnB,IAAIf,gBACG;QAAA,MAAMgB,UAAUhB,eAAeiB,WAAW,GAC7C,IAAID,OAAOE,cAAcR,CAAC,GAAG;EAAA;EAIjC,IAAI,CAAC/B,gBAAgB;EAErB,MAAMwC,WAAWpB,IAAIoB;EACrB,IAAIA,SAASC,SAAS,CAAC,CAACC,WAAW;GACjCF,SAASG,OAAO;GAChBZ,EAAEa,eAAe;EACnB;CACF,CAAC;CAED,MAAMC,kBAAkBd,QAAqB;EAC3C,IAAIJ,YAAY;EAGhB,IAAII,IAAEe,YAAYV,aAAa;EAG/B,IAAIf,gBACG;QAAA,MAAMgB,YAAUhB,eAAeiB,WAAW,GAC7C,IAAID,SAAOE,cAAcR,GAAC,GAAG;EAAA;EAIjC,IAAIA,IAAEgB,QAAQ,SAAS;GACrB,MAAMC,cAAc5B,IAAI6B,OAAOR,SAAS;GACxC,MAAMS,WAAWF,YAAYG,aAAaC;GAG1C,IACErB,IAAEsB,aACDtB,IAAEuB,WAAWvB,IAAEwB,YAChBL,YACA3B,uBAAuB,UACvBH,IAAIoB,SAASC,SAAS,CAAC,CAACe,SACxB;IACAzB,IAAEa,eAAe;IACjBxB,IAAIoB,SAASiB,KAAK,EAAEC,OAAO,KAAK,CAAC;IACjC;GACF;GAGA,IAAI3B,IAAEsB,UAAU;GAGhB,IAAIL,YAAYW,aAAa,CAACT,UAAU;GAExC,IAAIU,eAAe;GACnB,IAAInC,wBAAwB,aAC1BmC,eAAe7B,IAAEuB,WAAWvB,IAAEwB;QACzB,IAAI9B,wBAAwB,SACjCmC,eAAe;GAGjB,IAAIA,cAAc;IAChB7B,IAAEa,eAAe;IACjBhB,YAAYI,SAAS6B,QAAQ,MAAM,CAAC,EAAEC,cAAc;GACtD;EACF;CACF;CAEA,MAAMC,cAAc,OAAOhC,QAA2C;EACpE,IAAI,CAAC1B,sBAAsB;EAC3B,MAAM2D,qBAAqB5C,IAAI6B,OAAOR,SAAS,CAAC,CAACU;EACjD,MAAMc,QAAQC,MAAMC,KAAKpC,IAAEqC,eAAeH,SAAS,CAAA,CAAE;EAErD,IAAID,mBAAmBK,eAAeJ,MAAMK,SAAS,GAAG;GACtDvC,IAAEa,eAAe;GACjB,MAAM2B,QAAQC,IACZP,MAAMQ,IAAI,OAAOC,SAAS;IACxB,IAAI;KACF,MAAMtD,IAAIoB,SAASmC,cAAcD,IAAI;IACvC,QAAQ,CACN;GAEJ,CAAC,CACH;EACF;CACF;CAEA,MAAME,sBACJC,QACAC,SACG;EACH7D,iBAAiB4D,QAAQC,IAAI;EAC7B,IAAI,CAACxD,gBAAgB;EACrB,MAAMyD,KAAKnD,YAAYI;EACvB,IAAI,CAAC+C,MAAMA,GAAGrD,UAAU,IAAI;EAC5B,MAAMsD,KAAKC,iBAAiBF,EAAE;EAC9B,MAAMG,gBACJF,GAAGG,cAAc,eACbN,SACAO,WAAWJ,GAAGK,UAAU,IACxBD,WAAWJ,GAAGM,aAAa,IAC3BF,WAAWJ,GAAGO,cAAc,IAC5BH,WAAWJ,GAAGQ,iBAAiB,IAC/BX;EACN,IAAIY,KAAKC,MAAMR,gBAAgBJ,KAAKa,SAAS,IAAI,GAC/CrE,eAAesE,aAAa,IAAI;CAEpC;CAEA,MAAMC,mBAAmBnF,aAAa,CAACiB;CACvC,MAAMmE,QAAQvH,kBAAkB;EAC9B,MAAMwH,WAAWnE,YAAYI;EAC7B,IAAI,CAAC+D,YAAY,CAACF,kBAAkB;EAEpCE,SAASD,MAAM,EAAEE,eAAe,KAAK,CAAC;EACtCD,SAASE,kBAAkBF,SAASrE,MAAM4C,QAAQyB,SAASrE,MAAM4C,MAAM;CACzE,GAAG,CAACuB,gBAAgB,CAAC;CAErBrH,gBAAgBsH,MAAM,GAAG,CAACA,KAAK,CAAC;CAEhC9G,0BAA0B;EACxB,IACEoC,IAAIoB,SAASC,SAAS,CAAC,CAACyD,SAAS,YACjChG,gCAEA4F,MAAM;CAEV,CAAC;CAEDtH,gBAAgB;EACd,IACE4C,IAAIoB,SAASC,SAAS,CAAC,CAACyD,SAAS,YACjC,CAACjG,0BAED,OAAOkG,KAAAA;EAET,OAAO/E,IAAIgF,GAAG,mBAAmBN,KAAK;CACxC,GAAG;EAAC7F;EAA0B6F;EAAO1E;CAAG,CAAC;CAEzC5C,gBAAgB;EACd,IACE4C,IAAIoB,SAASC,SAAS,CAAC,CAACyD,SAAS,YACjC,CAAC/F,gCAED,OAAOgG,KAAAA;EAET,OAAO/E,IAAIgF,GAAG,4BAA4BN,KAAK;CACjD,GAAG;EAAC3F;EAAgC2F;EAAO1E;CAAG,CAAC;CAE/C5C,gBAAgB;EACd,IAAIkD,UAAU,IAAIJ,gBAAgBsE,aAAa,KAAK;CACtD,GAAG,CAAClE,OAAOJ,cAAc,CAAC;CAE1B,MAAM+E,oBAAoB7G,2BAA2B;CAErD,MAAM8G,aAAa;EACjBC,MAAM;EACN7E;EACA,GAAGR;EACH,GAAGmF;EACExE;EACLlB,UAAUgB;EACVd,UAAU9C,qBACR8C,WACCkB,QAA8C;GAC7C,IAAI,CAACX,IAAIoB,SAASC,SAAS,CAAC,CAACmE,WAAW;GACxC,MAAMC,oBACH9E,IAAEe,YAA0CV,gBAAgB;GAE/D,IAAIN,eAAeE,WAAW,CAAC6E,mBAC7B/E,eAAeE,UAAU;GAE3B,MAAMI,cAAcyE,qBAAqB/E,eAAeE;GAExD7C,mBAAmB;IACjBiC,IAAIoB,SAASsE,QAAQ/E,IAAEG,OAAOR,KAAK;GACrC,CAAC;GACD,IAAIU,aAAa;GACjB,MAAM2E,MAAMhF,IAAEG,OAAO8E,kBAAkBjF,IAAEG,OAAOR,MAAM4C;GACtD,IAAIjD,gBACF,KAAK,MAAMgB,YAAUhB,eAAeiB,WAAW,GAC7CD,SAAO4E,kBAAkBF,GAAG;EAGlC,CACF;EACAjG,WAAW/C,qBAAqB+C,WAAW+B,cAAc;EACzDqE,oBAAoBnJ,qBACjBmD,KACEgG,0BACG;GACJpF,eAAeE,UAAU;EAC3B,CACF;EACAoF,kBAAkBrJ,qBACfmD,KACEkG,mBACFrF,QAAmD;GAClDD,eAAeE,UAAU;GACzB,IAAI,CAACZ,IAAIoB,SAASC,SAAS,CAAC,CAACmE,WAAW;GACxC,MAAM1E,SAASH,IAAEG;GACjB/C,mBAAmB;IACjBiC,IAAIoB,SAASsE,QAAQ5E,OAAOR,KAAK;GACnC,CAAC;GACD,MAAMqF,QAAM7E,OAAO8E,kBAAkB9E,OAAOR,MAAM4C;GAClD,IAAIjD,gBACF,KAAK,MAAMgB,YAAUhB,eAAeiB,WAAW,GAC7CD,SAAO4E,kBAAkBF,KAAG;EAGlC,CACF;EACA/F,UAAUjD,qBACRiD,WACCe,QAAiD;GAChD,IAAID,eAAeE,SAAS;GAC5B,MAAME,WAASH,IAAEG;GACjB,MAAM6E,QAAM7E,SAAO8E,kBAAkB9E,SAAOR,MAAM4C;GAClD,IAAIjD,gBACF,KAAK,MAAMgB,YAAUhB,eAAeiB,WAAW,GAC7CD,SAAO4E,kBAAkBF,KAAG;EAGlC,CACF;EACAhG,SAAShD,qBAAqBgD,SAASgD,WAAW;EAClD,GAAIzC,iBACA,EAAEL,gBAAgB2D,mBAAmB,IACrC3D,mBAAmBkF,KAAAA,IACjB,EAAElF,eAAe,IACjB,CAAC;CACT;CAEA,IAAIlB,UAAUpB,eAAeoB,MAAM,GAAG;EACpC,MAAMwH,iBACHrG,KAAasG,aAAarB,KAAAA,IACrBjF,KAAasG,WACbzH,OAAO0H,MAAkCD;EACjD,OACE,oBAAC,KAAK,MAAN;GAAW,GAAIlB;GACZ5H,UAAAA,aAAaqB,QAAQoG,KAAAA,GAAWoB,cAAc;EACtC,CAAA;CAEf;CAEA,MAAMI,YAAY7H,UAAU7B,KAAK2J,OAAOhJ;CACxC,OAAO,oBAAC,WAAD,EAAW,GAAI0H,WAAW,CAAA;AACnC,CACF;AAEA5G,uBAAuBmI,cAAc"}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { Primitive } from "../../utils/Primitive.js";
3
- import { useAui, useAuiState } from "@assistant-ui/store";
4
3
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
4
+ import { useAui, useAuiState } from "@assistant-ui/store";
5
5
  import { forwardRef } from "@assistant-ui/tap/react-shim";
6
6
  import { jsx } from "react/jsx-runtime";
7
7
  import { composeEventHandlers } from "@radix-ui/primitive";
@@ -2,8 +2,8 @@
2
2
  import { Primitive } from "../../utils/Primitive.js";
3
3
  import { useComposerSend } from "./ComposerSend.js";
4
4
  import { ComposerCompactContext } from "./ComposerCompactContext.js";
5
- import { useAuiState } from "@assistant-ui/store";
6
5
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
6
+ import { useAuiState } from "@assistant-ui/store";
7
7
  import { forwardRef, useState } from "@assistant-ui/tap/react-shim";
8
8
  import { jsx } from "react/jsx-runtime";
9
9
  import { composeEventHandlers } from "@radix-ui/primitive";
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { createActionButton } from "../../utils/createActionButton.js";
3
- import { useAui, useAuiState } from "@assistant-ui/store";
4
3
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
4
+ import { useAui, useAuiState } from "@assistant-ui/store";
5
5
  import "@assistant-ui/tap/react-shim";
6
6
  //#region src/primitives/composer/ComposerStopDictation.ts
7
7
  const useComposerStopDictation = () => {
@@ -3,8 +3,8 @@ import { Primitive } from "../../../utils/Primitive.js";
3
3
  import { useComposerInputPluginRegistryOptional } from "../ComposerInputPluginContext.js";
4
4
  import { useTriggerPopoverAriaPublish, useTriggerPopoverRootContext } from "./TriggerPopoverRootContext.js";
5
5
  import { TriggerPopoverResource } from "./TriggerPopoverResource.js";
6
- import { useAui, useAuiState } from "@assistant-ui/store";
7
6
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
7
+ import { useAui, useAuiState } from "@assistant-ui/store";
8
8
  import { createContext, forwardRef, useContext, useEffect, useEffectEvent, useId, useRef, useState } from "@assistant-ui/tap/react-shim";
9
9
  import { jsx } from "react/jsx-runtime";
10
10
  import { useResource } from "@assistant-ui/tap";
@@ -1 +1 @@
1
- {"version":3,"file":"triggerSelectionResource.d.ts","names":[],"sources":["../../../../src/primitives/composer/trigger/triggerSelectionResource.ts"],"mappings":";;;;;KAUY,sBAAsB,MAAM;KAE5B;WAEG;WACA,WAAW;WACX,cAAc,MAAM;;WAGpB;WACA,WAAW;WACX,YAAY,MAAM;WAClB;;KAGH;;EAEV,WAAW,MAAM;;EAEjB;;EAEA,2BAA2B,IAAI;;cAyFpB,sDAAwB,SAAA;EA7EzB,UAAA;EACD,SAAA;EACJ,KAAA;EACQ;EACM,oBAAC;;EAER"}
1
+ {"version":3,"file":"triggerSelectionResource.d.ts","names":[],"sources":["../../../../src/primitives/composer/trigger/triggerSelectionResource.ts"],"mappings":";;;;;KAUY,sBAAsB,MAAM;KAE5B;WAEG;WACA,WAAW;WACX,cAAc,MAAM;;WAGpB;WACA,WAAW;WACX,YAAY,MAAM;WAClB;;KAGH;;EAEV,WAAW,MAAM;;EAEjB;;EAEA,2BAA2B,IAAI;;cA2FpB,sDAAwB,SAAA;EA/EzB,UAAA;EACD,SAAA;EACJ,KAAA;EACQ;EACM,oBAAC;;EAER"}
@@ -4,7 +4,7 @@ import { resource } from "@assistant-ui/tap";
4
4
  //#region src/primitives/composer/trigger/triggerSelectionResource.ts
5
5
  /** Owns composer text mutation + behavior dispatch on item selection. */
6
6
  const useTriggerSelectionResource = (t0) => {
7
- const $ = c(15);
7
+ const $ = c(16);
8
8
  const { behavior, trigger, aui, triggerChar, setCursorPosition, onSelected } = t0;
9
9
  const selectItemOverrideRef = useRef(null);
10
10
  let t1;
@@ -19,7 +19,7 @@ const useTriggerSelectionResource = (t0) => {
19
19
  } else t1 = $[0];
20
20
  const registerSelectItemOverride = useEffectEvent(t1);
21
21
  let t2;
22
- if ($[1] !== aui || $[2] !== behavior || $[3] !== onSelected || $[4] !== trigger || $[5] !== triggerChar) {
22
+ if ($[1] !== aui || $[2] !== behavior || $[3] !== onSelected || $[4] !== setCursorPosition || $[5] !== trigger || $[6] !== triggerChar) {
23
23
  t2 = (item) => {
24
24
  if (!trigger || !behavior) return;
25
25
  if (selectItemOverrideRef.current?.(item)) {
@@ -32,13 +32,16 @@ const useTriggerSelectionResource = (t0) => {
32
32
  const insertDirective = () => {
33
33
  const directive = behavior.formatter.serialize(item);
34
34
  aui.composer.setText(before + directive + (after.startsWith(" ") ? after : ` ${after}`));
35
+ setCursorPosition(before.length + directive.length + 1);
35
36
  };
36
37
  if (behavior.kind === "directive") {
37
38
  insertDirective();
38
39
  behavior.onInserted?.(item);
39
40
  } else {
40
- if (behavior.removeOnExecute) aui.composer.setText(before + (after.startsWith(" ") ? after.slice(1) : after));
41
- else insertDirective();
41
+ if (behavior.removeOnExecute) {
42
+ aui.composer.setText(before + (after.startsWith(" ") ? after.slice(1) : after));
43
+ setCursorPosition(before.length);
44
+ } else insertDirective();
42
45
  behavior.onExecute(item);
43
46
  }
44
47
  onSelected();
@@ -46,35 +49,36 @@ const useTriggerSelectionResource = (t0) => {
46
49
  $[1] = aui;
47
50
  $[2] = behavior;
48
51
  $[3] = onSelected;
49
- $[4] = trigger;
50
- $[5] = triggerChar;
51
- $[6] = t2;
52
- } else t2 = $[6];
52
+ $[4] = setCursorPosition;
53
+ $[5] = trigger;
54
+ $[6] = triggerChar;
55
+ $[7] = t2;
56
+ } else t2 = $[7];
53
57
  const selectItem = useEffectEvent(t2);
54
58
  let t3;
55
- if ($[7] !== onSelected || $[8] !== setCursorPosition || $[9] !== trigger) {
59
+ if ($[8] !== onSelected || $[9] !== setCursorPosition || $[10] !== trigger) {
56
60
  t3 = () => {
57
61
  onSelected();
58
62
  if (trigger) setCursorPosition(trigger.offset);
59
63
  };
60
- $[7] = onSelected;
61
- $[8] = setCursorPosition;
62
- $[9] = trigger;
63
- $[10] = t3;
64
- } else t3 = $[10];
64
+ $[8] = onSelected;
65
+ $[9] = setCursorPosition;
66
+ $[10] = trigger;
67
+ $[11] = t3;
68
+ } else t3 = $[11];
65
69
  const close = useEffectEvent(t3);
66
70
  let t4;
67
- if ($[11] !== close || $[12] !== registerSelectItemOverride || $[13] !== selectItem) {
71
+ if ($[12] !== close || $[13] !== registerSelectItemOverride || $[14] !== selectItem) {
68
72
  t4 = {
69
73
  selectItem,
70
74
  close,
71
75
  registerSelectItemOverride
72
76
  };
73
- $[11] = close;
74
- $[12] = registerSelectItemOverride;
75
- $[13] = selectItem;
76
- $[14] = t4;
77
- } else t4 = $[14];
77
+ $[12] = close;
78
+ $[13] = registerSelectItemOverride;
79
+ $[14] = selectItem;
80
+ $[15] = t4;
81
+ } else t4 = $[15];
78
82
  return t4;
79
83
  };
80
84
  const TriggerSelectionResource = resource(useTriggerSelectionResource);
@@ -1 +1 @@
1
- {"version":3,"file":"triggerSelectionResource.js","names":["useEffectEvent","useRef","resource","Unstable_DirectiveFormatter","Unstable_TriggerItem","AssistantClient","DetectedTrigger","SelectItemOverride","item","TriggerBehavior","kind","formatter","onInserted","onExecute","removeOnExecute","TriggerSelectionResourceOutput","selectItem","close","registerSelectItemOverride","fn","useTriggerSelectionResource","t0","$","_c","behavior","trigger","aui","triggerChar","setCursorPosition","onSelected","selectItemOverrideRef","t1","Symbol","for","current","t2","currentText","composer","getState","text","before","slice","offset","after","length","query","insertDirective","directive","serialize","setText","startsWith","t3","t4","TriggerSelectionResource"],"sources":["../../../../src/primitives/composer/trigger/triggerSelectionResource.ts"],"sourcesContent":["import { useEffectEvent, useRef } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport type {\n Unstable_DirectiveFormatter,\n Unstable_TriggerItem,\n} from \"@assistant-ui/core\";\nimport type { AssistantClient } from \"@assistant-ui/store\";\nimport type { DetectedTrigger } from \"./triggerDetectionResource\";\n\n/** External override for selection (used by Lexical's DirectivePlugin). */\nexport type SelectItemOverride = (item: Unstable_TriggerItem) => boolean;\n\nexport type TriggerBehavior =\n | {\n readonly kind: \"directive\";\n readonly formatter: Unstable_DirectiveFormatter;\n readonly onInserted?: (item: Unstable_TriggerItem) => void;\n }\n | {\n readonly kind: \"action\";\n readonly formatter: Unstable_DirectiveFormatter;\n readonly onExecute: (item: Unstable_TriggerItem) => void;\n readonly removeOnExecute?: boolean;\n };\n\nexport type TriggerSelectionResourceOutput = {\n /** Select an item — runs override (if any) then applies behavior. */\n selectItem(item: Unstable_TriggerItem): void;\n /** Close the popover (moves cursor before trigger to deactivate detection). */\n close(): void;\n /** Register a Lexical-style selection override. Returns unregister fn. */\n registerSelectItemOverride(fn: SelectItemOverride): () => void;\n};\n\n/** Owns composer text mutation + behavior dispatch on item selection. */\nconst useTriggerSelectionResource = ({\n behavior,\n trigger,\n aui,\n triggerChar,\n setCursorPosition,\n onSelected,\n}: {\n behavior: TriggerBehavior | undefined;\n trigger: DetectedTrigger | null;\n aui: AssistantClient;\n triggerChar: string;\n setCursorPosition: (pos: number) => void;\n /** Called after a successful selection so the parent can reset nav state. */\n onSelected: () => void;\n}): TriggerSelectionResourceOutput => {\n // Select-item override: lets Lexical's DirectivePlugin intercept selection\n // and drive its own node insertion.\n const selectItemOverrideRef = useRef<SelectItemOverride | null>(null);\n\n const registerSelectItemOverride = useEffectEvent(\n (fn: SelectItemOverride) => {\n selectItemOverrideRef.current = fn;\n return () => {\n if (selectItemOverrideRef.current === fn) {\n selectItemOverrideRef.current = null;\n }\n };\n },\n );\n\n const selectItem = useEffectEvent((item: Unstable_TriggerItem) => {\n if (!trigger || !behavior) return;\n\n if (selectItemOverrideRef.current?.(item)) {\n onSelected();\n return;\n }\n\n const currentText = aui.composer.getState().text;\n const before = currentText.slice(0, trigger.offset);\n const after = currentText.slice(\n trigger.offset + triggerChar.length + trigger.query.length,\n );\n\n const insertDirective = () => {\n const directive = behavior.formatter.serialize(item);\n aui.composer.setText(\n before + directive + (after.startsWith(\" \") ? after : ` ${after}`),\n );\n };\n\n if (behavior.kind === \"directive\") {\n insertDirective();\n behavior.onInserted?.(item);\n } else {\n if (behavior.removeOnExecute) {\n aui.composer.setText(\n before + (after.startsWith(\" \") ? after.slice(1) : after),\n );\n } else {\n // Leave directive chip in the composer as an audit trail\n insertDirective();\n }\n behavior.onExecute(item);\n }\n\n onSelected();\n });\n\n const close = useEffectEvent(() => {\n onSelected();\n // Move cursor before the trigger so trigger detection deactivates\n if (trigger) {\n setCursorPosition(trigger.offset);\n }\n });\n\n return {\n selectItem,\n close,\n registerSelectItemOverride,\n };\n};\n\nexport const TriggerSelectionResource = resource(useTriggerSelectionResource);\n"],"mappings":";;;;;AAmCA,MAAMoB,+BAA8BC,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAC,MAAA,EAAAC,UAAAC,SAAAC,KAAAC,aAAAC,mBAAAC,eAAAR;CAkBnC,MAAAS,wBAA8B7B,OAAkC,IAAI;CAAE,IAAA8B;CAAA,IAAAT,EAAA,OAAAU,OAAAC,IAAA,2BAAA,GAAA;EAGpEF,MAAAZ,OAAA;GACEW,sBAAqBI,UAAWf;GAAH,aACtB;IACL,IAAIW,sBAAqBI,YAAaf,IACpCW,sBAAqBI,UAAW;GACjC;EACF;EACFZ,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CARH,MAAAJ,6BAAmClB,eACjC+B,EAQF;CAAE,IAAAI;CAAA,IAAAb,EAAA,OAAAI,OAAAJ,EAAA,OAAAE,YAAAF,EAAA,OAAAO,cAAAP,EAAA,OAAAG,WAAAH,EAAA,OAAAK,aAAA;EAEgCQ,MAAA3B,SAAA;GAChC,IAAI,CAACiB,WAAD,CAAaD,UAAQ;GAEzB,IAAIM,sBAAqBI,UAAW1B,IAAI,GAAC;IACvCqB,WAAW;IAAC;GAAA;GAId,MAAAO,cAAoBV,IAAGW,SAASC,SAAU,CAAC,CAAAC;GAC3C,MAAAC,SAAeJ,YAAWK,MAAO,GAAGhB,QAAOiB,MAAO;GAClD,MAAAC,QAAcP,YAAWK,MACvBhB,QAAOiB,SAAUf,YAAWiB,SAAUnB,QAAOoB,MAAMD,MACrD;GAEA,MAAAE,wBAAwB;IACtB,MAAAC,YAAkBvB,SAAQb,UAAUqC,UAAWxC,IAAI;IACnDkB,IAAGW,SAASY,QACVT,SAASO,aAAaJ,MAAKO,WAAY,GAAyB,IAA1CP,QAAA,IAAoCA,QAC5D;GAAC;GAGH,IAAInB,SAAQd,SAAU,aAAW;IAC/BoC,gBAAgB;IAChBtB,SAAQZ,aAAcJ,IAAI;GAAC,OAAA;IAE3B,IAAIgB,SAAQV,iBACVY,IAAGW,SAASY,QACVT,UAAUG,MAAKO,WAAY,GAA4B,IAArBP,MAAKF,MAAO,CAAS,IAA7CE,MACZ;SAGAG,gBAAgB;IAElBtB,SAAQX,UAAWL,IAAI;GAAC;GAG1BqB,WAAW;EAAC;EACbP,EAAA,KAAAI;EAAAJ,EAAA,KAAAE;EAAAF,EAAA,KAAAO;EAAAP,EAAA,KAAAG;EAAAH,EAAA,KAAAK;EAAAL,EAAA,KAAAa;CAAA,OAAAA,KAAAb,EAAA;CArCD,MAAAN,aAAmBhB,eAAemC,EAqCjC;CAAE,IAAAgB;CAAA,IAAA7B,EAAA,OAAAO,cAAAP,EAAA,OAAAM,qBAAAN,EAAA,OAAAG,SAAA;EAE0B0B,WAAA;GAC3BtB,WAAW;GAEX,IAAIJ,SACFG,kBAAkBH,QAAOiB,MAAO;EACjC;EACFpB,EAAA,KAAAO;EAAAP,EAAA,KAAAM;EAAAN,EAAA,KAAAG;EAAAH,EAAA,MAAA6B;CAAA,OAAAA,KAAA7B,EAAA;CAND,MAAAL,QAAcjB,eAAemD,EAM5B;CAAE,IAAAC;CAAA,IAAA9B,EAAA,QAAAL,SAAAK,EAAA,QAAAJ,8BAAAI,EAAA,QAAAN,YAAA;EAEIoC,KAAA;GAAApC;GAAAC;GAAAC;EAIP;EAACI,EAAA,MAAAL;EAAAK,EAAA,MAAAJ;EAAAI,EAAA,MAAAN;EAAAM,EAAA,MAAA8B;CAAA,OAAAA,KAAA9B,EAAA;CAAA,OAJM8B;AAIN;AAGH,MAAaC,2BAA2BnD,SAASkB,2BAA2B"}
1
+ {"version":3,"file":"triggerSelectionResource.js","names":["useEffectEvent","useRef","resource","Unstable_DirectiveFormatter","Unstable_TriggerItem","AssistantClient","DetectedTrigger","SelectItemOverride","item","TriggerBehavior","kind","formatter","onInserted","onExecute","removeOnExecute","TriggerSelectionResourceOutput","selectItem","close","registerSelectItemOverride","fn","useTriggerSelectionResource","t0","$","_c","behavior","trigger","aui","triggerChar","setCursorPosition","onSelected","selectItemOverrideRef","t1","Symbol","for","current","t2","currentText","composer","getState","text","before","slice","offset","after","length","query","insertDirective","directive","serialize","setText","startsWith","t3","t4","TriggerSelectionResource"],"sources":["../../../../src/primitives/composer/trigger/triggerSelectionResource.ts"],"sourcesContent":["import { useEffectEvent, useRef } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport type {\n Unstable_DirectiveFormatter,\n Unstable_TriggerItem,\n} from \"@assistant-ui/core\";\nimport type { AssistantClient } from \"@assistant-ui/store\";\nimport type { DetectedTrigger } from \"./triggerDetectionResource\";\n\n/** External override for selection (used by Lexical's DirectivePlugin). */\nexport type SelectItemOverride = (item: Unstable_TriggerItem) => boolean;\n\nexport type TriggerBehavior =\n | {\n readonly kind: \"directive\";\n readonly formatter: Unstable_DirectiveFormatter;\n readonly onInserted?: (item: Unstable_TriggerItem) => void;\n }\n | {\n readonly kind: \"action\";\n readonly formatter: Unstable_DirectiveFormatter;\n readonly onExecute: (item: Unstable_TriggerItem) => void;\n readonly removeOnExecute?: boolean;\n };\n\nexport type TriggerSelectionResourceOutput = {\n /** Select an item — runs override (if any) then applies behavior. */\n selectItem(item: Unstable_TriggerItem): void;\n /** Close the popover (moves cursor before trigger to deactivate detection). */\n close(): void;\n /** Register a Lexical-style selection override. Returns unregister fn. */\n registerSelectItemOverride(fn: SelectItemOverride): () => void;\n};\n\n/** Owns composer text mutation + behavior dispatch on item selection. */\nconst useTriggerSelectionResource = ({\n behavior,\n trigger,\n aui,\n triggerChar,\n setCursorPosition,\n onSelected,\n}: {\n behavior: TriggerBehavior | undefined;\n trigger: DetectedTrigger | null;\n aui: AssistantClient;\n triggerChar: string;\n setCursorPosition: (pos: number) => void;\n /** Called after a successful selection so the parent can reset nav state. */\n onSelected: () => void;\n}): TriggerSelectionResourceOutput => {\n // Select-item override: lets Lexical's DirectivePlugin intercept selection\n // and drive its own node insertion.\n const selectItemOverrideRef = useRef<SelectItemOverride | null>(null);\n\n const registerSelectItemOverride = useEffectEvent(\n (fn: SelectItemOverride) => {\n selectItemOverrideRef.current = fn;\n return () => {\n if (selectItemOverrideRef.current === fn) {\n selectItemOverrideRef.current = null;\n }\n };\n },\n );\n\n const selectItem = useEffectEvent((item: Unstable_TriggerItem) => {\n if (!trigger || !behavior) return;\n\n if (selectItemOverrideRef.current?.(item)) {\n onSelected();\n return;\n }\n\n const currentText = aui.composer.getState().text;\n const before = currentText.slice(0, trigger.offset);\n const after = currentText.slice(\n trigger.offset + triggerChar.length + trigger.query.length,\n );\n\n const insertDirective = () => {\n const directive = behavior.formatter.serialize(item);\n aui.composer.setText(\n before + directive + (after.startsWith(\" \") ? after : ` ${after}`),\n );\n setCursorPosition(before.length + directive.length + 1);\n };\n\n if (behavior.kind === \"directive\") {\n insertDirective();\n behavior.onInserted?.(item);\n } else {\n if (behavior.removeOnExecute) {\n aui.composer.setText(\n before + (after.startsWith(\" \") ? after.slice(1) : after),\n );\n setCursorPosition(before.length);\n } else {\n // Leave directive chip in the composer as an audit trail\n insertDirective();\n }\n behavior.onExecute(item);\n }\n\n onSelected();\n });\n\n const close = useEffectEvent(() => {\n onSelected();\n // Move cursor before the trigger so trigger detection deactivates\n if (trigger) {\n setCursorPosition(trigger.offset);\n }\n });\n\n return {\n selectItem,\n close,\n registerSelectItemOverride,\n };\n};\n\nexport const TriggerSelectionResource = resource(useTriggerSelectionResource);\n"],"mappings":";;;;;AAmCA,MAAMoB,+BAA8BC,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAC,MAAA,EAAAC,UAAAC,SAAAC,KAAAC,aAAAC,mBAAAC,eAAAR;CAkBnC,MAAAS,wBAA8B7B,OAAkC,IAAI;CAAE,IAAA8B;CAAA,IAAAT,EAAA,OAAAU,OAAAC,IAAA,2BAAA,GAAA;EAGpEF,MAAAZ,OAAA;GACEW,sBAAqBI,UAAWf;GAAH,aACtB;IACL,IAAIW,sBAAqBI,YAAaf,IACpCW,sBAAqBI,UAAW;GACjC;EACF;EACFZ,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CARH,MAAAJ,6BAAmClB,eACjC+B,EAQF;CAAE,IAAAI;CAAA,IAAAb,EAAA,OAAAI,OAAAJ,EAAA,OAAAE,YAAAF,EAAA,OAAAO,cAAAP,EAAA,OAAAM,qBAAAN,EAAA,OAAAG,WAAAH,EAAA,OAAAK,aAAA;EAEgCQ,MAAA3B,SAAA;GAChC,IAAI,CAACiB,WAAD,CAAaD,UAAQ;GAEzB,IAAIM,sBAAqBI,UAAW1B,IAAI,GAAC;IACvCqB,WAAW;IAAC;GAAA;GAId,MAAAO,cAAoBV,IAAGW,SAASC,SAAU,CAAC,CAAAC;GAC3C,MAAAC,SAAeJ,YAAWK,MAAO,GAAGhB,QAAOiB,MAAO;GAClD,MAAAC,QAAcP,YAAWK,MACvBhB,QAAOiB,SAAUf,YAAWiB,SAAUnB,QAAOoB,MAAMD,MACrD;GAEA,MAAAE,wBAAwB;IACtB,MAAAC,YAAkBvB,SAAQb,UAAUqC,UAAWxC,IAAI;IACnDkB,IAAGW,SAASY,QACVT,SAASO,aAAaJ,MAAKO,WAAY,GAAyB,IAA1CP,QAAA,IAAoCA,QAC5D;IACAf,kBAAkBY,OAAMI,SAAUG,UAASH,SAAU,CAAC;GAAC;GAGzD,IAAIpB,SAAQd,SAAU,aAAW;IAC/BoC,gBAAgB;IAChBtB,SAAQZ,aAAcJ,IAAI;GAAC,OAAA;IAE3B,IAAIgB,SAAQV,iBAAgB;KAC1BY,IAAGW,SAASY,QACVT,UAAUG,MAAKO,WAAY,GAA4B,IAArBP,MAAKF,MAAO,CAAS,IAA7CE,MACZ;KACAf,kBAAkBY,OAAMI,MAAO;IAAC,OAGhCE,gBAAgB;IAElBtB,SAAQX,UAAWL,IAAI;GAAC;GAG1BqB,WAAW;EAAC;EACbP,EAAA,KAAAI;EAAAJ,EAAA,KAAAE;EAAAF,EAAA,KAAAO;EAAAP,EAAA,KAAAM;EAAAN,EAAA,KAAAG;EAAAH,EAAA,KAAAK;EAAAL,EAAA,KAAAa;CAAA,OAAAA,KAAAb,EAAA;CAvCD,MAAAN,aAAmBhB,eAAemC,EAuCjC;CAAE,IAAAgB;CAAA,IAAA7B,EAAA,OAAAO,cAAAP,EAAA,OAAAM,qBAAAN,EAAA,QAAAG,SAAA;EAE0B0B,WAAA;GAC3BtB,WAAW;GAEX,IAAIJ,SACFG,kBAAkBH,QAAOiB,MAAO;EACjC;EACFpB,EAAA,KAAAO;EAAAP,EAAA,KAAAM;EAAAN,EAAA,MAAAG;EAAAH,EAAA,MAAA6B;CAAA,OAAAA,KAAA7B,EAAA;CAND,MAAAL,QAAcjB,eAAemD,EAM5B;CAAE,IAAAC;CAAA,IAAA9B,EAAA,QAAAL,SAAAK,EAAA,QAAAJ,8BAAAI,EAAA,QAAAN,YAAA;EAEIoC,KAAA;GAAApC;GAAAC;GAAAC;EAIP;EAACI,EAAA,MAAAL;EAAAK,EAAA,MAAAJ;EAAAI,EAAA,MAAAN;EAAAM,EAAA,MAAA8B;CAAA,OAAAA,KAAA9B,EAAA;CAAA,OAJM8B;AAIN;AAGH,MAAaC,2BAA2BnD,SAASkB,2BAA2B"}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { useTriggerPopoverActiveAriaOptional } from "./trigger/TriggerPopoverRootContext.js";
3
- import { useAuiState } from "@assistant-ui/store";
4
3
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
4
+ import { useAuiState } from "@assistant-ui/store";
5
5
  //#region src/primitives/composer/useComposerInputState.ts
6
6
  function useComposerInputValue() {
7
7
  return useAuiState(_temp);
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { useAuiState } from "@assistant-ui/store";
3
2
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
3
+ import { useAuiState } from "@assistant-ui/store";
4
4
  //#region src/primitives/message/MessageIf.ts
5
5
  const useMessageIf = (props) => {
6
6
  const $ = c(12);
@@ -4,8 +4,8 @@ import { TextMessagePartProvider } from "../../context/providers/TextMessagePart
4
4
  import { MessagePartPrimitiveText } from "../messagePart/MessagePartText.js";
5
5
  import { MessagePartPrimitiveImage } from "../messagePart/MessagePartImage.js";
6
6
  import { MessagePartPrimitiveInProgress } from "../messagePart/MessagePartInProgress.js";
7
- import { useAui, useAuiState } from "@assistant-ui/store";
8
7
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
8
+ import { useAui, useAuiState } from "@assistant-ui/store";
9
9
  import { memo } from "@assistant-ui/tap/react-shim";
10
10
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
11
11
  //#region src/primitives/message/MessagePartsGrouped.tsx
@@ -3,8 +3,8 @@ import { useThreadViewport, useThreadViewportStore } from "../../context/react/T
3
3
  import { Primitive } from "../../utils/Primitive.js";
4
4
  import { useManagedRef } from "../../utils/hooks/useManagedRef.js";
5
5
  import { parseCssLength } from "../thread/topAnchor/topAnchorUtils.js";
6
- import { useAui, useAuiState } from "@assistant-ui/store";
7
6
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
7
+ import { useAui, useAuiState } from "@assistant-ui/store";
8
8
  import { forwardRef } from "@assistant-ui/tap/react-shim";
9
9
  import { jsx } from "react/jsx-runtime";
10
10
  import { useComposedRefs } from "@radix-ui/react-compose-refs";
@@ -1,7 +1,7 @@
1
1
  import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
- import { MessagePrimitiveIf } from "./message/MessageIf.js";
3
2
  import { MessagePrimitiveRoot } from "./message/MessageRoot.js";
4
3
  import { MessagePrimitivePartByIndex as MessagePrimitivePartByIndexBase, MessagePrimitiveParts } from "./message/MessageParts.js";
4
+ import { MessagePrimitiveIf } from "./message/MessageIf.js";
5
5
  import { MessagePrimitiveAttachmentByIndex, MessagePrimitiveAttachments } from "./message/MessageAttachments.js";
6
6
  import { MessagePrimitiveError } from "./message/MessageError.js";
7
7
  import { MessagePrimitiveUnstable_PartsGrouped, MessagePrimitiveUnstable_PartsGroupedByParentId } from "./message/MessagePartsGrouped.js";
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { createActionButton } from "../../utils/createActionButton.js";
3
- import { useAui } from "@assistant-ui/store";
4
3
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
4
+ import { useAui } from "@assistant-ui/store";
5
5
  import "@assistant-ui/tap/react-shim";
6
6
  //#region src/primitives/queueItem/QueueItemRemove.ts
7
7
  const useQueueItemRemove = () => {
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { createActionButton } from "../../utils/createActionButton.js";
3
- import { useAui } from "@assistant-ui/store";
4
3
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
4
+ import { useAui } from "@assistant-ui/store";
5
5
  import "@assistant-ui/tap/react-shim";
6
6
  //#region src/primitives/queueItem/QueueItemSteer.ts
7
7
  const useQueueItemSteer = () => {
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { Primitive } from "../../utils/Primitive.js";
3
- import { useAuiState } from "@assistant-ui/store";
4
3
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
4
+ import { useAuiState } from "@assistant-ui/store";
5
5
  import { forwardRef } from "@assistant-ui/tap/react-shim";
6
6
  import { jsx } from "react/jsx-runtime";
7
7
  //#region src/primitives/queueItem/QueueItemText.tsx
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import { Primitive } from "../../utils/Primitive.js";
3
3
  import { useSelectionToolbarInfo } from "./SelectionToolbarRoot.js";
4
- import { useAui } from "@assistant-ui/store";
5
4
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
5
+ import { useAui } from "@assistant-ui/store";
6
6
  import { forwardRef } from "@assistant-ui/tap/react-shim";
7
7
  import { jsx } from "react/jsx-runtime";
8
8
  import { composeEventHandlers } from "@radix-ui/primitive";
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { Primitive } from "../../utils/Primitive.js";
3
- import { useAuiState } from "@assistant-ui/store";
4
3
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
4
+ import { useAuiState } from "@assistant-ui/store";
5
5
  import { forwardRef } from "@assistant-ui/tap/react-shim";
6
6
  import { jsx } from "react/jsx-runtime";
7
7
  //#region src/primitives/suggestion/SuggestionDescription.tsx
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { Primitive } from "../../utils/Primitive.js";
3
- import { useAuiState } from "@assistant-ui/store";
4
3
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
4
+ import { useAuiState } from "@assistant-ui/store";
5
5
  import { forwardRef } from "@assistant-ui/tap/react-shim";
6
6
  import { jsx } from "react/jsx-runtime";
7
7
  //#region src/primitives/suggestion/SuggestionTitle.tsx
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import { createActionButton } from "../../utils/createActionButton.js";
3
- import { useAuiState } from "@assistant-ui/store";
4
3
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
5
4
  import { useSuggestionTrigger } from "@assistant-ui/core/react";
5
+ import { useAuiState } from "@assistant-ui/store";
6
6
  //#region src/primitives/suggestion/SuggestionTrigger.ts
7
7
  const useSuggestionTrigger$1 = (t0) => {
8
8
  const $ = c(4);
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { useAuiState } from "@assistant-ui/store";
3
2
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
3
+ import { useAuiState } from "@assistant-ui/store";
4
4
  //#region src/primitives/thread/ThreadIf.ts
5
5
  const useThreadIf = (props) => {
6
6
  const $ = c(4);
@@ -15,6 +15,9 @@ declare namespace ThreadPrimitiveRoot {
15
15
  * This component serves as the foundational wrapper for all thread-related components.
16
16
  * It provides the basic structure and context needed for thread functionality.
17
17
  *
18
+ * While this component is mounted, an unhandled Escape keydown stops active speech, even if
19
+ * the action bar that started it is no longer mounted.
20
+ *
18
21
  * @example
19
22
  * ```tsx
20
23
  * <ThreadPrimitive.Root>
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadRoot.d.ts","names":[],"sources":["../../../src/primitives/thread/ThreadRoot.tsx"],"mappings":";;;kBASiB;OACH,UAAU,oBAAoB,UAAU;;;;;OAKxC,QAAQ,gCAAgC,UAAU;;;;;;;;;;;;;;;;;;;cAoBnD,qCAAmB,0BAAA,KAAA,qBAAA,gBAAA,kCAAA,eAAA;;;;oBAK9B,cAAA,0CAAA,cAAA"}
1
+ {"version":3,"file":"ThreadRoot.d.ts","names":[],"sources":["../../../src/primitives/thread/ThreadRoot.tsx"],"mappings":";;;kBAWiB;OACH,UAAU,oBAAoB,UAAU;;;;;OAKxC,QAAQ,gCAAgC,UAAU;;;;;;;;;;;;;;;;;;;;;;cAuBnD,qCAAmB,0BAAA,KAAA,qBAAA,gBAAA,kCAAA,eAAA;;;;oBAiC9B,cAAA,0CAAA,cAAA"}
@@ -1,7 +1,8 @@
1
1
  "use client";
2
2
  import { Primitive } from "../../utils/Primitive.js";
3
3
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
4
- import { forwardRef } from "@assistant-ui/tap/react-shim";
4
+ import { useAui } from "@assistant-ui/store";
5
+ import { forwardRef, useEffect } from "@assistant-ui/tap/react-shim";
5
6
  import { jsx } from "react/jsx-runtime";
6
7
  //#region src/primitives/thread/ThreadRoot.tsx
7
8
  /**
@@ -10,6 +11,9 @@ import { jsx } from "react/jsx-runtime";
10
11
  * This component serves as the foundational wrapper for all thread-related components.
11
12
  * It provides the basic structure and context needed for thread functionality.
12
13
  *
14
+ * While this component is mounted, an unhandled Escape keydown stops active speech, even if
15
+ * the action bar that started it is no longer mounted.
16
+ *
13
17
  * @example
14
18
  * ```tsx
15
19
  * <ThreadPrimitive.Root>
@@ -22,18 +26,49 @@ import { jsx } from "react/jsx-runtime";
22
26
  * ```
23
27
  */
24
28
  const ThreadPrimitiveRoot = forwardRef((props, ref) => {
25
- const $ = c(3);
29
+ const $ = c(6);
30
+ const aui = useAui();
26
31
  let t0;
27
- if ($[0] !== props || $[1] !== ref) {
28
- t0 = /* @__PURE__ */ jsx(Primitive.div, {
32
+ let t1;
33
+ if ($[0] !== aui) {
34
+ t0 = () => {
35
+ const handleKeyDown = (event) => {
36
+ if (event.key !== "Escape") return;
37
+ if (event.defaultPrevented || aui.thread.source === null) return;
38
+ if (aui.thread.getState().speech == null) return;
39
+ event.preventDefault();
40
+ try {
41
+ aui.thread.stopSpeaking();
42
+ } catch (t2) {
43
+ const error = t2;
44
+ if (!(error instanceof Error) || error.message !== "No message is being spoken") throw error;
45
+ }
46
+ };
47
+ document.addEventListener("keydown", handleKeyDown);
48
+ return () => {
49
+ document.removeEventListener("keydown", handleKeyDown);
50
+ };
51
+ };
52
+ t1 = [aui];
53
+ $[0] = aui;
54
+ $[1] = t0;
55
+ $[2] = t1;
56
+ } else {
57
+ t0 = $[1];
58
+ t1 = $[2];
59
+ }
60
+ useEffect(t0, t1);
61
+ let t2;
62
+ if ($[3] !== props || $[4] !== ref) {
63
+ t2 = /* @__PURE__ */ jsx(Primitive.div, {
29
64
  ...props,
30
65
  ref
31
66
  });
32
- $[0] = props;
33
- $[1] = ref;
34
- $[2] = t0;
35
- } else t0 = $[2];
36
- return t0;
67
+ $[3] = props;
68
+ $[4] = ref;
69
+ $[5] = t2;
70
+ } else t2 = $[5];
71
+ return t2;
37
72
  });
38
73
  ThreadPrimitiveRoot.displayName = "ThreadPrimitive.Root";
39
74
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadRoot.js","names":["c","_c","Primitive","ComponentRef","forwardRef","ComponentPropsWithoutRef","ThreadPrimitiveRoot","Element","div","Props","props","ref","$","t0","displayName"],"sources":["../../../src/primitives/thread/ThreadRoot.tsx"],"sourcesContent":["\"use client\";\n\nimport { Primitive } from \"../../utils/Primitive\";\nimport {\n type ComponentRef,\n forwardRef,\n type ComponentPropsWithoutRef,\n} from \"react\";\n\nexport namespace ThreadPrimitiveRoot {\n export type Element = ComponentRef<typeof Primitive.div>;\n /**\n * Props for the ThreadPrimitive.Root component.\n * Accepts all standard div element props.\n */\n export type Props = ComponentPropsWithoutRef<typeof Primitive.div>;\n}\n\n/**\n * The root container component for a thread.\n *\n * This component serves as the foundational wrapper for all thread-related components.\n * It provides the basic structure and context needed for thread functionality.\n *\n * @example\n * ```tsx\n * <ThreadPrimitive.Root>\n * <ThreadPrimitive.Viewport>\n * <ThreadPrimitive.Messages>\n * {() => <MyMessage />}\n * </ThreadPrimitive.Messages>\n * </ThreadPrimitive.Viewport>\n * </ThreadPrimitive.Root>\n * ```\n */\nexport const ThreadPrimitiveRoot = forwardRef<\n ThreadPrimitiveRoot.Element,\n ThreadPrimitiveRoot.Props\n>((props, ref) => {\n return <Primitive.div {...props} ref={ref} />;\n});\n\nThreadPrimitiveRoot.displayName = \"ThreadPrimitive.Root\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAmCA,MAAaM,sBAAsBF,YAGjCM,OAAAC,QAAA;CAAA,MAAAC,IAAAX,EAAA,CAAA;CAAA,IAAAY;CAAA,IAAAD,EAAA,OAAAF,SAAAE,EAAA,OAAAD,KAAA;EACOE,KAAA,oBAAA,UAAA,KAAA;GAAA,GAAmBH;GAAYC;EAAG,CAAA;EAAIC,EAAA,KAAAF;EAAAE,EAAA,KAAAD;EAAAC,EAAA,KAAAC;CAAA,OAAAA,KAAAD,EAAA;CAAA,OAAtCC;AAAsC,CAC9C;AAEDP,oBAAoBQ,cAAc"}
1
+ {"version":3,"file":"ThreadRoot.js","names":["c","_c","Primitive","ComponentRef","forwardRef","ComponentPropsWithoutRef","useEffect","useAui","ThreadPrimitiveRoot","Element","div","Props","props","ref","$","aui","t0","t1","handleKeyDown","event","key","defaultPrevented","thread","source","getState","speech","preventDefault","stopSpeaking","t2","error","Error","message","document","addEventListener","removeEventListener","displayName"],"sources":["../../../src/primitives/thread/ThreadRoot.tsx"],"sourcesContent":["\"use client\";\n\nimport { Primitive } from \"../../utils/Primitive\";\nimport {\n type ComponentRef,\n forwardRef,\n type ComponentPropsWithoutRef,\n useEffect,\n} from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\n\nexport namespace ThreadPrimitiveRoot {\n export type Element = ComponentRef<typeof Primitive.div>;\n /**\n * Props for the ThreadPrimitive.Root component.\n * Accepts all standard div element props.\n */\n export type Props = ComponentPropsWithoutRef<typeof Primitive.div>;\n}\n\n/**\n * The root container component for a thread.\n *\n * This component serves as the foundational wrapper for all thread-related components.\n * It provides the basic structure and context needed for thread functionality.\n *\n * While this component is mounted, an unhandled Escape keydown stops active speech, even if\n * the action bar that started it is no longer mounted.\n *\n * @example\n * ```tsx\n * <ThreadPrimitive.Root>\n * <ThreadPrimitive.Viewport>\n * <ThreadPrimitive.Messages>\n * {() => <MyMessage />}\n * </ThreadPrimitive.Messages>\n * </ThreadPrimitive.Viewport>\n * </ThreadPrimitive.Root>\n * ```\n */\nexport const ThreadPrimitiveRoot = forwardRef<\n ThreadPrimitiveRoot.Element,\n ThreadPrimitiveRoot.Props\n>((props, ref) => {\n const aui = useAui();\n\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n if (event.defaultPrevented || aui.thread.source === null) return;\n if (aui.thread.getState().speech == null) return;\n event.preventDefault();\n try {\n aui.thread.stopSpeaking();\n } catch (error) {\n // getState() is the last rendered snapshot, so speech can finish before this call.\n if (\n !(error instanceof Error) ||\n error.message !== \"No message is being spoken\"\n ) {\n throw error;\n }\n }\n };\n\n // Bubble phase lets capture-phase Escape handlers consume the event first.\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [aui]);\n\n return <Primitive.div {...props} ref={ref} />;\n});\n\nThreadPrimitiveRoot.displayName = \"ThreadPrimitive.Root\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCA,MAAaQ,sBAAsBJ,YAGjCQ,OAAAC,QAAA;CAAA,MAAAC,IAAAb,EAAA,CAAA;CACA,MAAAc,MAAYR,OAAO;CAAE,IAAAS;CAAA,IAAAC;CAAA,IAAAH,EAAA,OAAAC,KAAA;EAEXC,WAAA;GACR,MAAAE,iBAAsBC,UAAA;IACpB,IAAIA,MAAKC,QAAS,UAAQ;IAC1B,IAAID,MAAKE,oBAAqBN,IAAGO,OAAOC,WAAY,MAAI;IACxD,IAAIR,IAAGO,OAAOE,SAAU,CAAC,CAAAC,UAAW,MAAI;IACxCN,MAAKO,eAAgB;IACrB,IAAA;KACEX,IAAGO,OAAOK,aAAc;IAAC,SAAAC,IAAA;KAClBC,MAAAA,QAAAA;KAEP,IACE,EAAEA,iBAAiBC,UACnBD,MAAKE,YAAa,8BAElB,MAAMF;IACP;GACF;GAIHG,SAAQC,iBAAkB,WAAWf,aAAa;GAAC,aAC5C;IACLc,SAAQE,oBAAqB,WAAWhB,aAAa;GAAC;EACvD;EACAD,KAAA,CAACF,GAAG;EAACD,EAAA,KAAAC;EAAAD,EAAA,KAAAE;EAAAF,EAAA,KAAAG;CAAA,OAAA;EAAAD,KAAAF,EAAA;EAAAG,KAAAH,EAAA;CAAA;CAxBRR,UAAUU,IAwBPC,EAAK;CAAC,IAAAW;CAAA,IAAAd,EAAA,OAAAF,SAAAE,EAAA,OAAAD,KAAA;EAEFe,KAAA,oBAAA,UAAA,KAAA;GAAA,GAAmBhB;GAAYC;EAAG,CAAA;EAAIC,EAAA,KAAAF;EAAAE,EAAA,KAAAD;EAAAC,EAAA,KAAAc;CAAA,OAAAA,KAAAd,EAAA;CAAA,OAAtCc;AAAsC,CAC9C;AAEDpB,oBAAoB2B,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadViewport.d.ts","names":[],"sources":["../../../src/primitives/thread/ThreadViewport.tsx"],"mappings":";;;kBA4BiB;OACH,UAAU,oBAAoB,UAAU;OACxC,QAAQ,gCAAgC,UAAU;;;;;;;IAO5D;;;;;;IAOA;;;;;;IAOA;;;;;;MAME;;;;;;MAMA;;;;;;;IAQF;;;;;;IAOA;;;;;;IAOA;;;;;;;;;;;;;;;;;;;cAoIS,yCAAuB,0BAAA,KAAA,qBAAA,gBAAA,kCAAA,eAAA;;;;;;;;;;;EApLnB;;;;;;EAOA;;;;;;EAOW;;;;;;IAMtB;;;;;;IAMA;;;;;;;EAQyB;;;;;;EAOE;;;;;;EAOE;oBA+IjC,cAAA"}
1
+ {"version":3,"file":"ThreadViewport.d.ts","names":[],"sources":["../../../src/primitives/thread/ThreadViewport.tsx"],"mappings":";;;kBA4BiB;OACH,UAAU,oBAAoB,UAAU;OACxC,QAAQ,gCAAgC,UAAU;;;;;;;IAO5D;;;;;;IAOA;;;;;;IAOA;;;;;;MAME;;;;;;MAMA;;;;;;;IAQF;;;;;;IAOA;;;;;;IAOA;;;;;;;;;;;;;;;;;;;cA6HS,yCAAuB,0BAAA,KAAA,qBAAA,gBAAA,kCAAA,eAAA;;;;;;;;;;;EA7KnB;;;;;;EAOA;;;;;;EAOW;;;;;;IAMtB;;;;;;IAMA;;;;;;;EAQyB;;;;;;EAOE;;;;;;EAOE;oBAwIjC,cAAA"}
@@ -7,8 +7,8 @@ import { useThreadViewportAutoScroll } from "./useThreadViewportAutoScroll.js";
7
7
  import { useSizeHandle } from "../../utils/hooks/useSizeHandle.js";
8
8
  import { useTopAnchorReserve } from "./topAnchor/useTopAnchorReserve.js";
9
9
  import { getActiveTopAnchorAnchorId, getActiveTopAnchorTargetId, isTopAnchorTurnValid } from "./topAnchor/topAnchorTurn.js";
10
- import { useAuiEvent, useAuiState } from "@assistant-ui/store";
11
10
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
11
+ import { useAuiState } from "@assistant-ui/store";
12
12
  import { forwardRef, useLayoutEffect } from "@assistant-ui/tap/react-shim";
13
13
  import { jsx } from "react/jsx-runtime";
14
14
  import { useComposedRefs } from "@radix-ui/react-compose-refs";
@@ -22,7 +22,7 @@ const useViewportElementRef = () => {
22
22
  return useManagedRef(registerViewportElement);
23
23
  };
24
24
  const useTopAnchorTurn = (enabled) => {
25
- const $ = c(21);
25
+ const $ = c(19);
26
26
  const threadViewportStore = useThreadViewportStore();
27
27
  let t0;
28
28
  if ($[0] !== enabled) {
@@ -114,17 +114,6 @@ const useTopAnchorTurn = (enabled) => {
114
114
  t7 = $[18];
115
115
  }
116
116
  useLayoutEffect(t6, t7);
117
- let t8;
118
- if ($[19] !== threadViewportStore) {
119
- t8 = () => {
120
- threadViewportStore.getState().setTopAnchorTurn(null);
121
- };
122
- $[19] = threadViewportStore;
123
- $[20] = t8;
124
- } else t8 = $[20];
125
- const clearTopAnchorTurn = t8;
126
- useAuiEvent("thread.initialize", clearTopAnchorTurn);
127
- useAuiEvent("threadListItem.switchedTo", clearTopAnchorTurn);
128
117
  };
129
118
  const ThreadPrimitiveViewportScrollable = forwardRef((t0, forwardedRef) => {
130
119
  const $ = c(18);