@assistant-ui/react 0.14.28 → 0.15.0

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 (190) hide show
  1. package/dist/client/ExternalThread.d.ts +11 -1
  2. package/dist/client/ExternalThread.d.ts.map +1 -1
  3. package/dist/client/ExternalThread.js +762 -516
  4. package/dist/client/ExternalThread.js.map +1 -1
  5. package/dist/client/InMemoryThreadList.js +3 -3
  6. package/dist/client/InMemoryThreadList.js.map +1 -1
  7. package/dist/context/index.d.ts +1 -8
  8. package/dist/context/index.js +1 -8
  9. package/dist/index.d.ts +1 -8
  10. package/dist/index.js +1 -8
  11. package/dist/legacy-runtime/cloud/auiV0.d.ts +12 -1
  12. package/dist/legacy-runtime/cloud/auiV0.d.ts.map +1 -1
  13. package/dist/legacy-runtime/cloud/auiV0.js +2 -1
  14. package/dist/legacy-runtime/cloud/auiV0.js.map +1 -1
  15. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.d.ts +1 -1
  16. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.js +7 -6
  17. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.js.map +1 -1
  18. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.d.ts.map +1 -1
  19. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.js +30 -15
  20. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.js.map +1 -1
  21. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -1
  22. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js +11 -7
  23. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js.map +1 -1
  24. package/dist/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.js +1 -0
  25. package/dist/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.js.map +1 -1
  26. package/dist/mcp-apps/McpAppRenderer.js +1 -1
  27. package/dist/mcp-apps/McpAppRenderer.js.map +1 -1
  28. package/dist/model-context/makeAssistantVisible.js +26 -25
  29. package/dist/model-context/makeAssistantVisible.js.map +1 -1
  30. package/dist/primitives/actionBar/ActionBarExportMarkdown.js +3 -3
  31. package/dist/primitives/actionBar/ActionBarExportMarkdown.js.map +1 -1
  32. package/dist/primitives/actionBar/ActionBarRoot.js +3 -3
  33. package/dist/primitives/actionBar/ActionBarRoot.js.map +1 -1
  34. package/dist/primitives/actionBar/useActionBarFloatStatus.d.ts +7 -6
  35. package/dist/primitives/actionBar/useActionBarFloatStatus.d.ts.map +1 -1
  36. package/dist/primitives/actionBar/useActionBarFloatStatus.js +10 -11
  37. package/dist/primitives/actionBar/useActionBarFloatStatus.js.map +1 -1
  38. package/dist/primitives/attachment/AttachmentRemove.js +4 -3
  39. package/dist/primitives/attachment/AttachmentRemove.js.map +1 -1
  40. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.js +4 -3
  41. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.js.map +1 -1
  42. package/dist/primitives/composer/ComposerAddAttachment.d.ts.map +1 -1
  43. package/dist/primitives/composer/ComposerAddAttachment.js +11 -5
  44. package/dist/primitives/composer/ComposerAddAttachment.js.map +1 -1
  45. package/dist/primitives/composer/ComposerAttachmentDropzone.d.ts.map +1 -1
  46. package/dist/primitives/composer/ComposerAttachmentDropzone.js +2 -4
  47. package/dist/primitives/composer/ComposerAttachmentDropzone.js.map +1 -1
  48. package/dist/primitives/composer/ComposerInput.js +18 -16
  49. package/dist/primitives/composer/ComposerInput.js.map +1 -1
  50. package/dist/primitives/composer/ComposerQuote.js +1 -1
  51. package/dist/primitives/composer/ComposerQuote.js.map +1 -1
  52. package/dist/primitives/composer/ComposerSend.js +1 -0
  53. package/dist/primitives/composer/ComposerSend.js.map +1 -1
  54. package/dist/primitives/composer/ComposerStopDictation.js +4 -3
  55. package/dist/primitives/composer/ComposerStopDictation.js.map +1 -1
  56. package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts.map +1 -1
  57. package/dist/primitives/composer/trigger/triggerSelectionResource.js +3 -3
  58. package/dist/primitives/composer/trigger/triggerSelectionResource.js.map +1 -1
  59. package/dist/primitives/message/MessagePartsGrouped.d.ts.map +1 -1
  60. package/dist/primitives/message/MessagePartsGrouped.js +67 -89
  61. package/dist/primitives/message/MessagePartsGrouped.js.map +1 -1
  62. package/dist/primitives/message/MessageRoot.js +3 -3
  63. package/dist/primitives/message/MessageRoot.js.map +1 -1
  64. package/dist/primitives/queueItem/QueueItemRemove.js +4 -3
  65. package/dist/primitives/queueItem/QueueItemRemove.js.map +1 -1
  66. package/dist/primitives/queueItem/QueueItemSteer.js +4 -3
  67. package/dist/primitives/queueItem/QueueItemSteer.js.map +1 -1
  68. package/dist/primitives/selectionToolbar/SelectionToolbarQuote.js +1 -1
  69. package/dist/primitives/selectionToolbar/SelectionToolbarQuote.js.map +1 -1
  70. package/dist/primitives/suggestion/SuggestionTrigger.js +17 -15
  71. package/dist/primitives/suggestion/SuggestionTrigger.js.map +1 -1
  72. package/dist/primitives/thread/ThreadScrollToBottom.js +1 -0
  73. package/dist/primitives/thread/ThreadScrollToBottom.js.map +1 -1
  74. package/dist/unstable/useComposerInput.js +2 -2
  75. package/dist/unstable/useComposerInput.js.map +1 -1
  76. package/dist/unstable/useComposerInputHistory.js +6 -6
  77. package/dist/unstable/useComposerInputHistory.js.map +1 -1
  78. package/dist/unstable/useMentionAdapter.js +1 -1
  79. package/dist/unstable/useMentionAdapter.js.map +1 -1
  80. package/dist/utils/hooks/useOnResizeContent.js +1 -0
  81. package/dist/utils/hooks/useOnResizeContent.js.map +1 -1
  82. package/dist/utils/hooks/useSizeHandle.js +1 -0
  83. package/dist/utils/hooks/useSizeHandle.js.map +1 -1
  84. package/dist/utils/smooth/SmoothContext.js +3 -3
  85. package/dist/utils/smooth/SmoothContext.js.map +1 -1
  86. package/dist/utils/smooth/useSmooth.d.ts.map +1 -1
  87. package/dist/utils/smooth/useSmooth.js +3 -3
  88. package/dist/utils/smooth/useSmooth.js.map +1 -1
  89. package/package.json +9 -9
  90. package/src/client/ExternalThread.ts +345 -56
  91. package/src/client/InMemoryThreadList.ts +3 -3
  92. package/src/context/index.ts +0 -44
  93. package/src/legacy-runtime/cloud/auiV0.ts +14 -0
  94. package/src/legacy-runtime/runtime-cores/assistant-transport/commandQueue.ts +4 -1
  95. package/src/legacy-runtime/runtime-cores/assistant-transport/runManager.ts +37 -10
  96. package/src/legacy-runtime/runtime-cores/assistant-transport/transport-delivery.test.tsx +79 -0
  97. package/src/legacy-runtime/runtime-cores/assistant-transport/transport-parentid.test.tsx +97 -0
  98. package/src/legacy-runtime/runtime-cores/assistant-transport/transport-scheduling.test.ts +113 -2
  99. package/src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransport.spec.md +10 -2
  100. package/src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.test.tsx +185 -0
  101. package/src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.ts +21 -5
  102. package/src/mcp-apps/McpAppRenderer.tsx +1 -1
  103. package/src/model-context/makeAssistantVisible.test.tsx +1 -1
  104. package/src/model-context/makeAssistantVisible.tsx +1 -1
  105. package/src/primitives/actionBar/ActionBarExportMarkdown.tsx +1 -1
  106. package/src/primitives/actionBar/useActionBarFloatStatus.ts +7 -5
  107. package/src/primitives/attachment/AttachmentRemove.ts +1 -1
  108. package/src/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.ts +1 -1
  109. package/src/primitives/composer/ComposerAddAttachment.test.tsx +108 -0
  110. package/src/primitives/composer/ComposerAddAttachment.ts +11 -5
  111. package/src/primitives/composer/ComposerAttachmentDropzone.test.tsx +5 -4
  112. package/src/primitives/composer/ComposerAttachmentDropzone.tsx +4 -3
  113. package/src/primitives/composer/ComposerInput.test.tsx +104 -7
  114. package/src/primitives/composer/ComposerInput.tsx +22 -20
  115. package/src/primitives/composer/ComposerQuote.tsx +1 -1
  116. package/src/primitives/composer/ComposerStopDictation.ts +1 -1
  117. package/src/primitives/composer/trigger/triggerSelectionResource.ts +7 -9
  118. package/src/primitives/message/MessagePartsGrouped.tsx +6 -8
  119. package/src/primitives/message/MessageRoot.tsx +1 -1
  120. package/src/primitives/queueItem/QueueItemRemove.ts +1 -1
  121. package/src/primitives/queueItem/QueueItemSteer.ts +1 -1
  122. package/src/primitives/selectionToolbar/SelectionToolbarQuote.tsx +1 -1
  123. package/src/primitives/suggestion/SuggestionTrigger.ts +9 -9
  124. package/src/tests/DataRenderers.test.tsx +212 -0
  125. package/src/tests/RemoteThreadListRuntime.adapterProvider.test.tsx +1 -11
  126. package/src/tests/RemoteThreadListRuntime.deferredProvider.test.tsx +3 -3
  127. package/src/tests/external-thread-attachments.test.tsx +300 -11
  128. package/src/tests/external-thread-branches.test.tsx +10 -10
  129. package/src/tests/external-thread-parity.test.tsx +230 -0
  130. package/src/tests/generative-ui.test.tsx +1 -46
  131. package/src/tests/local-runtime-queue.test.tsx +29 -34
  132. package/src/tests/messagePartSwitchRace.test.tsx +46 -15
  133. package/src/tests/messagePartTypeMismatch.test.tsx +2 -2
  134. package/src/tests/threadMessageById.test.tsx +0 -7
  135. package/src/unstable/useComposerInput.test.tsx +2 -2
  136. package/src/unstable/useComposerInput.ts +2 -2
  137. package/src/unstable/useComposerInputHistory.test.tsx +3 -3
  138. package/src/unstable/useComposerInputHistory.ts +6 -6
  139. package/src/unstable/useMentionAdapter.ts +1 -1
  140. package/src/utils/smooth/SmoothContext.tsx +1 -1
  141. package/src/utils/smooth/useSmooth.test.tsx +1 -1
  142. package/src/utils/smooth/useSmooth.ts +8 -5
  143. package/dist/context/react/utils/createStateHookForRuntime.d.ts +0 -34
  144. package/dist/context/react/utils/createStateHookForRuntime.d.ts.map +0 -1
  145. package/dist/context/react/utils/createStateHookForRuntime.js +0 -21
  146. package/dist/context/react/utils/createStateHookForRuntime.js.map +0 -1
  147. package/dist/legacy-runtime/hooks/AssistantContext.d.ts +0 -74
  148. package/dist/legacy-runtime/hooks/AssistantContext.d.ts.map +0 -1
  149. package/dist/legacy-runtime/hooks/AssistantContext.js +0 -29
  150. package/dist/legacy-runtime/hooks/AssistantContext.js.map +0 -1
  151. package/dist/legacy-runtime/hooks/AttachmentContext.d.ts +0 -1007
  152. package/dist/legacy-runtime/hooks/AttachmentContext.d.ts.map +0 -1
  153. package/dist/legacy-runtime/hooks/AttachmentContext.js +0 -47
  154. package/dist/legacy-runtime/hooks/AttachmentContext.js.map +0 -1
  155. package/dist/legacy-runtime/hooks/ComposerContext.d.ts +0 -141
  156. package/dist/legacy-runtime/hooks/ComposerContext.d.ts.map +0 -1
  157. package/dist/legacy-runtime/hooks/ComposerContext.js +0 -65
  158. package/dist/legacy-runtime/hooks/ComposerContext.js.map +0 -1
  159. package/dist/legacy-runtime/hooks/MessageContext.d.ts +0 -155
  160. package/dist/legacy-runtime/hooks/MessageContext.d.ts.map +0 -1
  161. package/dist/legacy-runtime/hooks/MessageContext.js +0 -68
  162. package/dist/legacy-runtime/hooks/MessageContext.js.map +0 -1
  163. package/dist/legacy-runtime/hooks/MessagePartContext.d.ts +0 -44
  164. package/dist/legacy-runtime/hooks/MessagePartContext.d.ts.map +0 -1
  165. package/dist/legacy-runtime/hooks/MessagePartContext.js +0 -26
  166. package/dist/legacy-runtime/hooks/MessagePartContext.js.map +0 -1
  167. package/dist/legacy-runtime/hooks/ThreadContext.d.ts +0 -139
  168. package/dist/legacy-runtime/hooks/ThreadContext.d.ts.map +0 -1
  169. package/dist/legacy-runtime/hooks/ThreadContext.js +0 -84
  170. package/dist/legacy-runtime/hooks/ThreadContext.js.map +0 -1
  171. package/dist/legacy-runtime/hooks/ThreadListItemContext.d.ts +0 -44
  172. package/dist/legacy-runtime/hooks/ThreadListItemContext.d.ts.map +0 -1
  173. package/dist/legacy-runtime/hooks/ThreadListItemContext.js +0 -26
  174. package/dist/legacy-runtime/hooks/ThreadListItemContext.js.map +0 -1
  175. package/src/context/react/utils/createStateHookForRuntime.ts +0 -82
  176. package/src/legacy-runtime/hooks/AssistantContext.ts +0 -67
  177. package/src/legacy-runtime/hooks/AttachmentContext.ts +0 -99
  178. package/src/legacy-runtime/hooks/ComposerContext.ts +0 -131
  179. package/src/legacy-runtime/hooks/MessageContext.ts +0 -127
  180. package/src/legacy-runtime/hooks/MessagePartContext.ts +0 -32
  181. package/src/legacy-runtime/hooks/ThreadContext.ts +0 -120
  182. package/src/legacy-runtime/hooks/ThreadListItemContext.ts +0 -36
  183. package/src/tests/BaseComposerRuntimeCore.test.ts +0 -621
  184. package/src/tests/BaseSubscribable.test.ts +0 -54
  185. package/src/tests/DataRenderers.test.ts +0 -355
  186. package/src/tests/ExternalStoreThreadRuntimeCore.test.ts +0 -685
  187. package/src/tests/LocalThreadRuntimeCore.test.ts +0 -324
  188. package/src/tests/auiV0Encode.test.ts +0 -188
  189. package/src/tests/external-message-converter.test.ts +0 -346
  190. package/src/tests/shouldContinue.test.ts +0 -122
@@ -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","plugin","getPlugins","handleKeyDown","composer","getState","canCancel","cancel","preventDefault","handleKeyPress","nativeEvent","isComposing","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","error","console","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 // 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 try {\n e.preventDefault();\n await Promise.all(\n files.map((file) => aui.composer().addAttachment(file)),\n );\n } catch (error) {\n console.error(\"Error adding attachment:\", error);\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","plugin","getPlugins","handleKeyDown","composer","getState","canCancel","cancel","preventDefault","handleKeyPress","nativeEvent","isComposing","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 // 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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"}
@@ -98,7 +98,7 @@ const ComposerPrimitiveQuoteDismiss = forwardRef((t0, forwardedRef) => {
98
98
  let t1;
99
99
  if ($[3] !== aui) {
100
100
  t1 = () => {
101
- aui.composer().setQuote(void 0);
101
+ aui.composer.setQuote(void 0);
102
102
  };
103
103
  $[3] = aui;
104
104
  $[4] = t1;
@@ -1 +1 @@
1
- {"version":3,"file":"ComposerQuote.js","names":["c","_c","Primitive","ComponentRef","ComponentPropsWithoutRef","forwardRef","useCallback","useAui","useAuiState","composeEventHandlers","ComposerPrimitiveQuote","Element","div","Props","props","forwardedRef","$","quote","_temp","t0","displayName","ComposerPrimitiveQuoteText","span","children","text","_temp2","t1","t2","ComposerPrimitiveQuoteDismiss","button","onClick","aui","composer","setQuote","undefined","handleDismiss","t3","s"],"sources":["../../../src/primitives/composer/ComposerQuote.tsx"],"sourcesContent":["\"use client\";\n\nimport { Primitive } from \"../../utils/Primitive\";\nimport {\n type ComponentRef,\n type ComponentPropsWithoutRef,\n forwardRef,\n useCallback,\n} from \"react\";\nimport { useAui, useAuiState } from \"@assistant-ui/store\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\n\n// ---- Root ----\n\nexport namespace ComposerPrimitiveQuote {\n export type Element = ComponentRef<typeof Primitive.div>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.div>;\n}\n\n/**\n * Renders a container for the quoted text preview in the composer.\n * Only renders when a quote is set.\n *\n * @example\n * ```tsx\n * <ComposerPrimitive.Quote>\n * <ComposerPrimitive.QuoteText />\n * <ComposerPrimitive.QuoteDismiss>×</ComposerPrimitive.QuoteDismiss>\n * </ComposerPrimitive.Quote>\n * ```\n */\nexport const ComposerPrimitiveQuote = forwardRef<\n ComposerPrimitiveQuote.Element,\n ComposerPrimitiveQuote.Props\n>((props, forwardedRef) => {\n const quote = useAuiState((s) => s.composer.quote);\n if (!quote) return null;\n\n return <Primitive.div {...props} ref={forwardedRef} />;\n});\n\nComposerPrimitiveQuote.displayName = \"ComposerPrimitive.Quote\";\n\n// ---- QuoteText ----\n\nexport namespace ComposerPrimitiveQuoteText {\n export type Element = ComponentRef<typeof Primitive.span>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.span>;\n}\n\n/**\n * Renders the quoted text content.\n *\n * @example\n * ```tsx\n * <ComposerPrimitive.QuoteText />\n * ```\n */\nexport const ComposerPrimitiveQuoteText = forwardRef<\n ComposerPrimitiveQuoteText.Element,\n ComposerPrimitiveQuoteText.Props\n>(({ children, ...props }, forwardedRef) => {\n const text = useAuiState((s) => s.composer.quote?.text);\n if (!text) return null;\n\n return (\n <Primitive.span {...props} ref={forwardedRef}>\n {children ?? text}\n </Primitive.span>\n );\n});\n\nComposerPrimitiveQuoteText.displayName = \"ComposerPrimitive.QuoteText\";\n\n// ---- QuoteDismiss ----\n\nexport namespace ComposerPrimitiveQuoteDismiss {\n export type Element = ComponentRef<typeof Primitive.button>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.button>;\n}\n\n/**\n * A button that clears the current quote from the composer.\n *\n * @example\n * ```tsx\n * <ComposerPrimitive.QuoteDismiss>×</ComposerPrimitive.QuoteDismiss>\n * ```\n */\nexport const ComposerPrimitiveQuoteDismiss = forwardRef<\n ComposerPrimitiveQuoteDismiss.Element,\n ComposerPrimitiveQuoteDismiss.Props\n>(({ onClick, ...props }, forwardedRef) => {\n const aui = useAui();\n const handleDismiss = useCallback(() => {\n aui.composer().setQuote(undefined);\n }, [aui]);\n\n return (\n <Primitive.button\n type=\"button\"\n {...props}\n ref={forwardedRef}\n onClick={composeEventHandlers(onClick, handleDismiss)}\n />\n );\n});\n\nComposerPrimitiveQuoteDismiss.displayName = \"ComposerPrimitive.QuoteDismiss\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"ComposerQuote.js","names":["c","_c","Primitive","ComponentRef","ComponentPropsWithoutRef","forwardRef","useCallback","useAui","useAuiState","composeEventHandlers","ComposerPrimitiveQuote","Element","div","Props","props","forwardedRef","$","quote","_temp","t0","displayName","ComposerPrimitiveQuoteText","span","children","text","_temp2","t1","t2","ComposerPrimitiveQuoteDismiss","button","onClick","aui","composer","setQuote","undefined","handleDismiss","t3","s"],"sources":["../../../src/primitives/composer/ComposerQuote.tsx"],"sourcesContent":["\"use client\";\n\nimport { Primitive } from \"../../utils/Primitive\";\nimport {\n type ComponentRef,\n type ComponentPropsWithoutRef,\n forwardRef,\n useCallback,\n} from \"react\";\nimport { useAui, useAuiState } from \"@assistant-ui/store\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\n\n// ---- Root ----\n\nexport namespace ComposerPrimitiveQuote {\n export type Element = ComponentRef<typeof Primitive.div>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.div>;\n}\n\n/**\n * Renders a container for the quoted text preview in the composer.\n * Only renders when a quote is set.\n *\n * @example\n * ```tsx\n * <ComposerPrimitive.Quote>\n * <ComposerPrimitive.QuoteText />\n * <ComposerPrimitive.QuoteDismiss>×</ComposerPrimitive.QuoteDismiss>\n * </ComposerPrimitive.Quote>\n * ```\n */\nexport const ComposerPrimitiveQuote = forwardRef<\n ComposerPrimitiveQuote.Element,\n ComposerPrimitiveQuote.Props\n>((props, forwardedRef) => {\n const quote = useAuiState((s) => s.composer.quote);\n if (!quote) return null;\n\n return <Primitive.div {...props} ref={forwardedRef} />;\n});\n\nComposerPrimitiveQuote.displayName = \"ComposerPrimitive.Quote\";\n\n// ---- QuoteText ----\n\nexport namespace ComposerPrimitiveQuoteText {\n export type Element = ComponentRef<typeof Primitive.span>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.span>;\n}\n\n/**\n * Renders the quoted text content.\n *\n * @example\n * ```tsx\n * <ComposerPrimitive.QuoteText />\n * ```\n */\nexport const ComposerPrimitiveQuoteText = forwardRef<\n ComposerPrimitiveQuoteText.Element,\n ComposerPrimitiveQuoteText.Props\n>(({ children, ...props }, forwardedRef) => {\n const text = useAuiState((s) => s.composer.quote?.text);\n if (!text) return null;\n\n return (\n <Primitive.span {...props} ref={forwardedRef}>\n {children ?? text}\n </Primitive.span>\n );\n});\n\nComposerPrimitiveQuoteText.displayName = \"ComposerPrimitive.QuoteText\";\n\n// ---- QuoteDismiss ----\n\nexport namespace ComposerPrimitiveQuoteDismiss {\n export type Element = ComponentRef<typeof Primitive.button>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.button>;\n}\n\n/**\n * A button that clears the current quote from the composer.\n *\n * @example\n * ```tsx\n * <ComposerPrimitive.QuoteDismiss>×</ComposerPrimitive.QuoteDismiss>\n * ```\n */\nexport const ComposerPrimitiveQuoteDismiss = forwardRef<\n ComposerPrimitiveQuoteDismiss.Element,\n ComposerPrimitiveQuoteDismiss.Props\n>(({ onClick, ...props }, forwardedRef) => {\n const aui = useAui();\n const handleDismiss = useCallback(() => {\n aui.composer.setQuote(undefined);\n }, [aui]);\n\n return (\n <Primitive.button\n type=\"button\"\n {...props}\n ref={forwardedRef}\n onClick={composeEventHandlers(onClick, handleDismiss)}\n />\n );\n});\n\nComposerPrimitiveQuoteDismiss.displayName = \"ComposerPrimitive.QuoteDismiss\";\n"],"mappings":"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"}
@@ -2,6 +2,7 @@
2
2
  import { createActionButton } from "../../utils/createActionButton.js";
3
3
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
4
4
  import { useComposerSend as useComposerSend$1 } from "@assistant-ui/core/react";
5
+ import "@assistant-ui/tap/react-shim";
5
6
  //#region src/primitives/composer/ComposerSend.ts
6
7
  const useComposerSend = () => {
7
8
  const $ = c(2);
@@ -1 +1 @@
1
- {"version":3,"file":"ComposerSend.js","names":["c","_c","useCallback","ActionButtonElement","ActionButtonProps","createActionButton","useComposerSend","useComposerSendBehavior","$","disabled","send","t0","callback","ComposerPrimitiveSend","Element","Props"],"sources":["../../../src/primitives/composer/ComposerSend.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback } from \"react\";\nimport {\n type ActionButtonElement,\n type ActionButtonProps,\n createActionButton,\n} from \"../../utils/createActionButton\";\nimport { useComposerSend as useComposerSendBehavior } from \"@assistant-ui/core/react\";\n\nexport const useComposerSend = () => {\n const { disabled, send } = useComposerSendBehavior();\n const callback = useCallback(() => send(), [send]);\n if (disabled) return null;\n return callback;\n};\n\nexport namespace ComposerPrimitiveSend {\n export type Element = ActionButtonElement;\n /**\n * Props for the ComposerPrimitive.Send component.\n * Inherits all button element props and action button functionality.\n */\n export type Props = ActionButtonProps<typeof useComposerSend>;\n}\n\n/**\n * A button component that sends the current message in the composer.\n *\n * This component automatically handles the send functionality and is disabled\n * when sending is not available (e.g., when the thread is running, the composer\n * is empty, or not in editing mode).\n *\n * @example\n * ```tsx\n * <ComposerPrimitive.Send>\n * Send Message\n * </ComposerPrimitive.Send>\n * ```\n */\nexport const ComposerPrimitiveSend = createActionButton(\n \"ComposerPrimitive.Send\",\n useComposerSend,\n);\n"],"mappings":";;;;;AAUA,MAAaM,wBAAkB;CAAA,MAAAE,IAAAP,EAAA,CAAA;CAC7B,MAAA,EAAAQ,UAAAC,SAA2BH,kBAAwB;CAAE,IAAAI;CAAA,IAAAH,EAAA,OAAAE,MAAA;EACxBC,WAAMD,KAAK;EAACF,EAAA,KAAAE;EAAAF,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CAAzC,MAAAI,WAAiBD;CACjB,IAAIF,UAAQ,OAAS;CAAK,OACnBG;AAAQ;;;;;;;;;;;;;;;AA0BjB,MAAaC,wBAAwBR,mBACnC,0BACAC,eACF"}
1
+ {"version":3,"file":"ComposerSend.js","names":["c","_c","useCallback","ActionButtonElement","ActionButtonProps","createActionButton","useComposerSend","useComposerSendBehavior","$","disabled","send","t0","callback","ComposerPrimitiveSend","Element","Props"],"sources":["../../../src/primitives/composer/ComposerSend.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback } from \"react\";\nimport {\n type ActionButtonElement,\n type ActionButtonProps,\n createActionButton,\n} from \"../../utils/createActionButton\";\nimport { useComposerSend as useComposerSendBehavior } from \"@assistant-ui/core/react\";\n\nexport const useComposerSend = () => {\n const { disabled, send } = useComposerSendBehavior();\n const callback = useCallback(() => send(), [send]);\n if (disabled) return null;\n return callback;\n};\n\nexport namespace ComposerPrimitiveSend {\n export type Element = ActionButtonElement;\n /**\n * Props for the ComposerPrimitive.Send component.\n * Inherits all button element props and action button functionality.\n */\n export type Props = ActionButtonProps<typeof useComposerSend>;\n}\n\n/**\n * A button component that sends the current message in the composer.\n *\n * This component automatically handles the send functionality and is disabled\n * when sending is not available (e.g., when the thread is running, the composer\n * is empty, or not in editing mode).\n *\n * @example\n * ```tsx\n * <ComposerPrimitive.Send>\n * Send Message\n * </ComposerPrimitive.Send>\n * ```\n */\nexport const ComposerPrimitiveSend = createActionButton(\n \"ComposerPrimitive.Send\",\n useComposerSend,\n);\n"],"mappings":";;;;;;AAUA,MAAaM,wBAAkB;CAAA,MAAAE,IAAAP,EAAA,CAAA;CAC7B,MAAA,EAAAQ,UAAAC,SAA2BH,kBAAwB;CAAE,IAAAI;CAAA,IAAAH,EAAA,OAAAE,MAAA;EACxBC,WAAMD,KAAK;EAACF,EAAA,KAAAE;EAAAF,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CAAzC,MAAAI,WAAiBD;CACjB,IAAIF,UAAQ,OAAS;CAAK,OACnBG;AAAQ;;;;;;;;;;;;;;;AA0BjB,MAAaC,wBAAwBR,mBACnC,0BACAC,eACF"}
@@ -2,17 +2,18 @@
2
2
  import { createActionButton } from "../../utils/createActionButton.js";
3
3
  import { useAui, useAuiState } from "@assistant-ui/store";
4
4
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
5
+ import "@assistant-ui/tap/react-shim";
5
6
  //#region src/primitives/composer/ComposerStopDictation.ts
6
7
  const useComposerStopDictation = () => {
7
8
  const $ = c(2);
8
9
  const aui = useAui();
9
10
  const isDictating = useAuiState(_temp);
10
11
  let t0;
11
- if ($[0] !== aui) {
12
+ if ($[0] !== aui.composer) {
12
13
  t0 = () => {
13
- aui.composer().stopDictation();
14
+ aui.composer.stopDictation();
14
15
  };
15
- $[0] = aui;
16
+ $[0] = aui.composer;
16
17
  $[1] = t0;
17
18
  } else t0 = $[1];
18
19
  const callback = t0;
@@ -1 +1 @@
1
- {"version":3,"file":"ComposerStopDictation.js","names":["c","_c","useCallback","useAui","ActionButtonElement","ActionButtonProps","createActionButton","useAuiState","useComposerStopDictation","$","aui","isDictating","_temp","t0","composer","stopDictation","callback","ComposerPrimitiveStopDictation","Element","Props","s","dictation"],"sources":["../../../src/primitives/composer/ComposerStopDictation.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport type {\n ActionButtonElement,\n ActionButtonProps,\n} from \"../../utils/createActionButton\";\nimport { createActionButton } from \"../../utils/createActionButton\";\nimport { useAuiState } from \"@assistant-ui/store\";\n\nconst useComposerStopDictation = () => {\n const aui = useAui();\n const isDictating = useAuiState((s) => s.composer.dictation != null);\n\n const callback = useCallback(() => {\n aui.composer().stopDictation();\n }, [aui]);\n\n if (!isDictating) return null;\n return callback;\n};\n\nexport namespace ComposerPrimitiveStopDictation {\n export type Element = ActionButtonElement;\n export type Props = ActionButtonProps<typeof useComposerStopDictation>;\n}\n\n/**\n * A button that stops the current dictation session.\n *\n * Only rendered when dictation is active.\n *\n * @example\n * ```tsx\n * <ComposerPrimitive.StopDictation>\n * <StopIcon />\n * </ComposerPrimitive.StopDictation>\n * ```\n */\nexport const ComposerPrimitiveStopDictation = createActionButton(\n \"ComposerPrimitive.StopDictation\",\n useComposerStopDictation,\n);\n"],"mappings":";;;;;AAWA,MAAMQ,iCAA2B;CAAA,MAAAC,IAAAR,EAAA,CAAA;CAC/B,MAAAS,MAAYP,OAAO;CACnB,MAAAQ,cAAoBJ,YAAYK,KAAmC;CAAE,IAAAC;CAAA,IAAAJ,EAAA,OAAAC,KAAA;EAExCG,WAAA;GAC3BH,IAAGI,SAAU,CAAC,CAAAC,cAAe;EAAC;EAC/BN,EAAA,KAAAC;EAAAD,EAAA,KAAAI;CAAA,OAAAA,KAAAJ,EAAA;CAFD,MAAAO,WAAiBH;CAIjB,IAAI,CAACF,aAAW,OAAS;CAAK,OACvBK;AAAQ;;;;;;;;;;;;;AAoBjB,MAAaC,iCAAiCX,mBAC5C,mCACAE,wBACF;AAhCiC,SAAAI,MAAAQ,GAAA;CAAA,OAEQA,EAACN,SAASO,aAAc;AAAI"}
1
+ {"version":3,"file":"ComposerStopDictation.js","names":["c","_c","useCallback","useAui","ActionButtonElement","ActionButtonProps","createActionButton","useAuiState","useComposerStopDictation","$","aui","isDictating","_temp","t0","composer","stopDictation","callback","ComposerPrimitiveStopDictation","Element","Props","s","dictation"],"sources":["../../../src/primitives/composer/ComposerStopDictation.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport type {\n ActionButtonElement,\n ActionButtonProps,\n} from \"../../utils/createActionButton\";\nimport { createActionButton } from \"../../utils/createActionButton\";\nimport { useAuiState } from \"@assistant-ui/store\";\n\nconst useComposerStopDictation = () => {\n const aui = useAui();\n const isDictating = useAuiState((s) => s.composer.dictation != null);\n\n const callback = useCallback(() => {\n aui.composer.stopDictation();\n }, [aui]);\n\n if (!isDictating) return null;\n return callback;\n};\n\nexport namespace ComposerPrimitiveStopDictation {\n export type Element = ActionButtonElement;\n export type Props = ActionButtonProps<typeof useComposerStopDictation>;\n}\n\n/**\n * A button that stops the current dictation session.\n *\n * Only rendered when dictation is active.\n *\n * @example\n * ```tsx\n * <ComposerPrimitive.StopDictation>\n * <StopIcon />\n * </ComposerPrimitive.StopDictation>\n * ```\n */\nexport const ComposerPrimitiveStopDictation = createActionButton(\n \"ComposerPrimitive.StopDictation\",\n useComposerStopDictation,\n);\n"],"mappings":";;;;;;AAWA,MAAMQ,iCAA2B;CAAA,MAAAC,IAAAR,EAAA,CAAA;CAC/B,MAAAS,MAAYP,OAAO;CACnB,MAAAQ,cAAoBJ,YAAYK,KAAmC;CAAE,IAAAC;CAAA,IAAAJ,EAAA,OAAAC,IAAAI,UAAA;EAExCD,WAAA;GAC3BH,IAAGI,SAASC,cAAe;EAAC;EAC7BN,EAAA,KAAAC,IAAAI;EAAAL,EAAA,KAAAI;CAAA,OAAAA,KAAAJ,EAAA;CAFD,MAAAO,WAAiBH;CAIjB,IAAI,CAACF,aAAW,OAAS;CAAK,OACvBK;AAAQ;;;;;;;;;;;;;AAoBjB,MAAaC,iCAAiCX,mBAC5C,mCACAE,wBACF;AAhCiC,SAAAI,MAAAQ,GAAA;CAAA,OAEQA,EAACN,SAASO,aAAc;AAAI"}
@@ -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;;cA2FpB,sDAAwB,SAAA;EA/EzB,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;;cAyFpB,sDAAwB,SAAA;EA7EzB,UAAA;EACD,SAAA;EACJ,KAAA;EACQ;EACM,oBAAC;;EAER"}
@@ -26,18 +26,18 @@ const useTriggerSelectionResource = (t0) => {
26
26
  onSelected();
27
27
  return;
28
28
  }
29
- const currentText = aui.composer().getState().text;
29
+ const currentText = aui.composer.getState().text;
30
30
  const before = currentText.slice(0, trigger.offset);
31
31
  const after = currentText.slice(trigger.offset + triggerChar.length + trigger.query.length);
32
32
  const insertDirective = () => {
33
33
  const directive = behavior.formatter.serialize(item);
34
- aui.composer().setText(before + directive + (after.startsWith(" ") ? after : ` ${after}`));
34
+ aui.composer.setText(before + directive + (after.startsWith(" ") ? after : ` ${after}`));
35
35
  };
36
36
  if (behavior.kind === "directive") {
37
37
  insertDirective();
38
38
  behavior.onInserted?.(item);
39
39
  } else {
40
- if (behavior.removeOnExecute) aui.composer().setText(before + (after.startsWith(" ") ? after.slice(1) : after));
40
+ if (behavior.removeOnExecute) aui.composer.setText(before + (after.startsWith(" ") ? after.slice(1) : after));
41
41
  else insertDirective();
42
42
  behavior.onExecute(item);
43
43
  }
@@ -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\n .composer()\n .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\n .composer()\n .setText(before + (after.startsWith(\" \") ? after.slice(1) : after));\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,SAAU,CAAC,CAAAC,SAAU,CAAC,CAAAC;GAC7C,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,SACS,CAAC,CAAAY,QAETT,SAASO,aAAaJ,MAAKO,WAAY,GAAyB,IAA1CP,QAAA,IAAoCA,QAC5D;GAAC;GAGL,IAAInB,SAAQd,SAAU,aAAW;IAC/BoC,gBAAgB;IAChBtB,SAAQZ,aAAcJ,IAAI;GAAC,OAAA;IAE3B,IAAIgB,SAAQV,iBACVY,IAAGW,SACS,CAAC,CAAAY,QACFT,UAAUG,MAAKO,WAAY,GAA4B,IAArBP,MAAKF,MAAO,CAAS,IAA7CE,MAA+C;SAGpEG,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;CAvCD,MAAAN,aAAmBhB,eAAemC,EAuCjC;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 };\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 +1 @@
1
- {"version":3,"file":"MessagePartsGrouped.d.ts","names":[],"sources":["../../../src/primitives/message/MessagePartsGrouped.tsx"],"mappings":";;;KA8BK;EACH;EACA;;KAGU,oBAAoB,0BAA0B;kBAmDzC;OACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA4CV,kBAAkB;;;;;;;IAQlB;;MAGM,QAAQ;;MAER,OAAO;;MAEP,YAAY;;MAEZ,SAAS;;MAET,QAAQ;;MAER,OAAO;;MAEP,iBAAiB;;MAEjB;;QAGM,UACI,eAAe;;QAGnB,WAAW;;;MAIjB;;QAGM,UACI,eAAe;;QAGnB,WAAW,cAAc;;;QAIzB,UAAU,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAqC9B,QAAQ,cACN;QACE;QACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAuOD,uCAAuC,GAClD,sCAAsC;;;;;;;cA2C3B,iDAAiD,GAC5D,KAAK,sCAAsC"}
1
+ {"version":3,"file":"MessagePartsGrouped.d.ts","names":[],"sources":["../../../src/primitives/message/MessagePartsGrouped.tsx"],"mappings":";;;KA8BK;EACH;EACA;;KAGU,oBAAoB,0BAA0B;kBAmDzC;OACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA4CV,kBAAkB;;;;;;;IAQlB;;MAGM,QAAQ;;MAER,OAAO;;MAEP,YAAY;;MAEZ,SAAS;;MAET,QAAQ;;MAER,OAAO;;MAEP,iBAAiB;;MAEjB;;QAGM,UACI,eAAe;;QAGnB,WAAW;;;MAIjB;;QAGM,UACI,eAAe;;QAGnB,WAAW,cAAc;;;QAIzB,UAAU,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAqC9B,QAAQ,cACN;QACE;QACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAqOD,uCAAuC,GAClD,sCAAsC;;;;;;;cA2C3B,iDAAiD,GAC5D,KAAK,sCAAsC"}
@@ -72,21 +72,17 @@ const ToolUIDisplay = (t0) => {
72
72
  }
73
73
  let t1;
74
74
  if ($[3] !== Fallback || $[4] !== props.toolName) {
75
- t1 = (s) => {
76
- const Render = s.tools.tools[props.toolName] ?? Fallback;
77
- if (Array.isArray(Render)) return Render[0] ?? Fallback;
78
- return Render;
79
- };
75
+ t1 = (s) => s.tools.toolUIs[props.toolName]?.[0]?.render ?? Fallback;
80
76
  $[3] = Fallback;
81
77
  $[4] = props.toolName;
82
78
  $[5] = t1;
83
79
  } else t1 = $[5];
84
- const Render_0 = useAuiState(t1);
85
- if (!Render_0) return null;
80
+ const Render = useAuiState(t1);
81
+ if (!Render) return null;
86
82
  let t2;
87
- if ($[6] !== Render_0 || $[7] !== props) {
88
- t2 = /* @__PURE__ */ jsx(Render_0, { ...props });
89
- $[6] = Render_0;
83
+ if ($[6] !== Render || $[7] !== props) {
84
+ t2 = /* @__PURE__ */ jsx(Render, { ...props });
85
+ $[6] = Render;
90
86
  $[7] = props;
91
87
  $[8] = t2;
92
88
  } else t2 = $[8];
@@ -143,7 +139,7 @@ const defaultComponents = {
143
139
  Group: ({ children }) => children
144
140
  };
145
141
  const MessagePartComponent = (t0) => {
146
- const $ = c(43);
142
+ const $ = c(37);
147
143
  const { components: t1 } = t0;
148
144
  let t2;
149
145
  if ($[0] !== t1) {
@@ -169,138 +165,120 @@ const MessagePartComponent = (t0) => {
169
165
  const part = useAuiState(_temp2);
170
166
  const type = part.type;
171
167
  if (type === "tool-call") {
172
- let t11;
173
- if ($[4] !== aui) {
174
- t11 = aui.part();
175
- $[4] = aui;
176
- $[5] = t11;
177
- } else t11 = $[5];
178
- const addResult = t11.addToolResult;
179
- let t12;
180
- if ($[6] !== aui) {
181
- t12 = aui.part();
182
- $[6] = aui;
183
- $[7] = t12;
184
- } else t12 = $[7];
185
- const resume = t12.resumeToolCall;
186
- let t13;
187
- if ($[8] !== aui) {
188
- t13 = aui.part();
189
- $[8] = aui;
190
- $[9] = t13;
191
- } else t13 = $[9];
192
- const respondToApproval = t13.respondToToolApproval;
168
+ const addResult = aui.part.addToolResult;
169
+ const resume = aui.part.resumeToolCall;
170
+ const respondToApproval = aui.part.respondToToolApproval;
193
171
  if ("Override" in tools) {
194
- let t14;
195
- if ($[10] !== addResult || $[11] !== part || $[12] !== respondToApproval || $[13] !== resume || $[14] !== tools.Override) {
196
- t14 = /* @__PURE__ */ jsx(tools.Override, {
172
+ let t11;
173
+ if ($[4] !== addResult || $[5] !== part || $[6] !== respondToApproval || $[7] !== resume || $[8] !== tools.Override) {
174
+ t11 = /* @__PURE__ */ jsx(tools.Override, {
197
175
  ...part,
198
176
  addResult,
199
177
  resume,
200
178
  respondToApproval
201
179
  });
202
- $[10] = addResult;
203
- $[11] = part;
204
- $[12] = respondToApproval;
205
- $[13] = resume;
206
- $[14] = tools.Override;
207
- $[15] = t14;
208
- } else t14 = $[15];
209
- return t14;
180
+ $[4] = addResult;
181
+ $[5] = part;
182
+ $[6] = respondToApproval;
183
+ $[7] = resume;
184
+ $[8] = tools.Override;
185
+ $[9] = t11;
186
+ } else t11 = $[9];
187
+ return t11;
210
188
  }
211
189
  const Tool = tools.by_name?.[part.toolName] ?? tools.Fallback;
212
- let t14;
213
- if ($[16] !== Tool || $[17] !== addResult || $[18] !== part || $[19] !== respondToApproval || $[20] !== resume) {
214
- t14 = /* @__PURE__ */ jsx(ToolUIDisplay, {
190
+ let t11;
191
+ if ($[10] !== Tool || $[11] !== addResult || $[12] !== part || $[13] !== respondToApproval || $[14] !== resume) {
192
+ t11 = /* @__PURE__ */ jsx(ToolUIDisplay, {
215
193
  ...part,
216
194
  Fallback: Tool,
217
195
  addResult,
218
196
  resume,
219
197
  respondToApproval
220
198
  });
221
- $[16] = Tool;
222
- $[17] = addResult;
223
- $[18] = part;
224
- $[19] = respondToApproval;
225
- $[20] = resume;
226
- $[21] = t14;
227
- } else t14 = $[21];
228
- return t14;
199
+ $[10] = Tool;
200
+ $[11] = addResult;
201
+ $[12] = part;
202
+ $[13] = respondToApproval;
203
+ $[14] = resume;
204
+ $[15] = t11;
205
+ } else t11 = $[15];
206
+ return t11;
229
207
  }
230
208
  if (part.status?.type === "requires-action") throw new Error("Encountered unexpected requires-action status");
231
209
  switch (type) {
232
210
  case "text": {
233
211
  let t11;
234
- if ($[22] !== Text || $[23] !== part) {
212
+ if ($[16] !== Text || $[17] !== part) {
235
213
  t11 = /* @__PURE__ */ jsx(Text, { ...part });
236
- $[22] = Text;
237
- $[23] = part;
238
- $[24] = t11;
239
- } else t11 = $[24];
214
+ $[16] = Text;
215
+ $[17] = part;
216
+ $[18] = t11;
217
+ } else t11 = $[18];
240
218
  return t11;
241
219
  }
242
220
  case "reasoning": {
243
221
  let t11;
244
- if ($[25] !== Reasoning || $[26] !== part) {
222
+ if ($[19] !== Reasoning || $[20] !== part) {
245
223
  t11 = /* @__PURE__ */ jsx(Reasoning, { ...part });
246
- $[25] = Reasoning;
247
- $[26] = part;
248
- $[27] = t11;
249
- } else t11 = $[27];
224
+ $[19] = Reasoning;
225
+ $[20] = part;
226
+ $[21] = t11;
227
+ } else t11 = $[21];
250
228
  return t11;
251
229
  }
252
230
  case "source": {
253
231
  let t11;
254
- if ($[28] !== Source || $[29] !== part) {
232
+ if ($[22] !== Source || $[23] !== part) {
255
233
  t11 = /* @__PURE__ */ jsx(Source, { ...part });
256
- $[28] = Source;
257
- $[29] = part;
258
- $[30] = t11;
259
- } else t11 = $[30];
234
+ $[22] = Source;
235
+ $[23] = part;
236
+ $[24] = t11;
237
+ } else t11 = $[24];
260
238
  return t11;
261
239
  }
262
240
  case "image": {
263
241
  let t11;
264
- if ($[31] !== Image || $[32] !== part) {
242
+ if ($[25] !== Image || $[26] !== part) {
265
243
  t11 = /* @__PURE__ */ jsx(Image, { ...part });
266
- $[31] = Image;
267
- $[32] = part;
268
- $[33] = t11;
269
- } else t11 = $[33];
244
+ $[25] = Image;
245
+ $[26] = part;
246
+ $[27] = t11;
247
+ } else t11 = $[27];
270
248
  return t11;
271
249
  }
272
250
  case "file": {
273
251
  let t11;
274
- if ($[34] !== File || $[35] !== part) {
252
+ if ($[28] !== File || $[29] !== part) {
275
253
  t11 = /* @__PURE__ */ jsx(File, { ...part });
276
- $[34] = File;
277
- $[35] = part;
278
- $[36] = t11;
279
- } else t11 = $[36];
254
+ $[28] = File;
255
+ $[29] = part;
256
+ $[30] = t11;
257
+ } else t11 = $[30];
280
258
  return t11;
281
259
  }
282
260
  case "audio": {
283
261
  let t11;
284
- if ($[37] !== Audio || $[38] !== part) {
262
+ if ($[31] !== Audio || $[32] !== part) {
285
263
  t11 = /* @__PURE__ */ jsx(Audio, { ...part });
286
- $[37] = Audio;
287
- $[38] = part;
288
- $[39] = t11;
289
- } else t11 = $[39];
264
+ $[31] = Audio;
265
+ $[32] = part;
266
+ $[33] = t11;
267
+ } else t11 = $[33];
290
268
  return t11;
291
269
  }
292
270
  case "data": {
293
271
  const Data = data?.by_name?.[part.name] ?? data?.Fallback;
294
272
  let t11;
295
- if ($[40] !== Data || $[41] !== part) {
273
+ if ($[34] !== Data || $[35] !== part) {
296
274
  t11 = /* @__PURE__ */ jsx(DataUIDisplay, {
297
275
  ...part,
298
276
  Fallback: Data
299
277
  });
300
- $[40] = Data;
301
- $[41] = part;
302
- $[42] = t11;
303
- } else t11 = $[42];
278
+ $[34] = Data;
279
+ $[35] = part;
280
+ $[36] = t11;
281
+ } else t11 = $[36];
304
282
  return t11;
305
283
  }
306
284
  default: