@anvia/react-ui 0.5.0 → 0.6.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 (46) hide show
  1. package/README.md +19 -12
  2. package/dist/attachment/index.js +2 -2
  3. package/dist/chat/index.js +5 -4
  4. package/dist/{chunk-YQJLVBQD.js → chunk-43U2XQP2.js} +8 -2
  5. package/dist/{chunk-YQJLVBQD.js.map → chunk-43U2XQP2.js.map} +1 -1
  6. package/dist/{chunk-TVWD2LX4.js → chunk-56CV6S76.js} +7 -11
  7. package/dist/chunk-56CV6S76.js.map +1 -0
  8. package/dist/{chunk-7PBLYIKR.js → chunk-7HR34SOF.js} +10 -10
  9. package/dist/chunk-7HR34SOF.js.map +1 -0
  10. package/dist/{chunk-YUK4ASXB.js → chunk-7I6XUWM7.js} +133 -62
  11. package/dist/chunk-7I6XUWM7.js.map +1 -0
  12. package/dist/{chunk-2N5PXLAS.js → chunk-7RMRM7W3.js} +2 -2
  13. package/dist/{chunk-L3ZUEIB6.js → chunk-LM5SU5AP.js} +63 -43
  14. package/dist/chunk-LM5SU5AP.js.map +1 -0
  15. package/dist/{chunk-I4L25QXW.js → chunk-R3NA6BWW.js} +7 -6
  16. package/dist/chunk-R3NA6BWW.js.map +1 -0
  17. package/dist/{chunk-WUMACFYS.js → chunk-SBYUKODG.js} +2 -2
  18. package/dist/chunk-UESNSQGQ.js +302 -0
  19. package/dist/chunk-UESNSQGQ.js.map +1 -0
  20. package/dist/{chunk-T6GPGCK4.js → chunk-VEYJNQVW.js} +2 -2
  21. package/dist/completion/index.js +2 -2
  22. package/dist/human-input/index.js +2 -2
  23. package/dist/image/index.js +2 -2
  24. package/dist/index.d.ts +3 -2
  25. package/dist/index.js +18 -14
  26. package/dist/message/index.d.ts +8 -13
  27. package/dist/message/index.js +4 -3
  28. package/dist/{message-Beb4ZLNU.d.ts → message-CkEnKhAn.d.ts} +2 -0
  29. package/dist/selection-toolbar/index.js +2 -2
  30. package/dist/shared.d.ts +1 -1
  31. package/dist/shared.js +1 -1
  32. package/dist/stream/index.d.ts +20 -0
  33. package/dist/stream/index.js +8 -0
  34. package/dist/stream/index.js.map +1 -0
  35. package/dist/stream/styles.css +9 -0
  36. package/dist/styles.css +5 -8
  37. package/dist/thread-list/index.js +2 -2
  38. package/package.json +10 -4
  39. package/dist/chunk-7PBLYIKR.js.map +0 -1
  40. package/dist/chunk-I4L25QXW.js.map +0 -1
  41. package/dist/chunk-L3ZUEIB6.js.map +0 -1
  42. package/dist/chunk-TVWD2LX4.js.map +0 -1
  43. package/dist/chunk-YUK4ASXB.js.map +0 -1
  44. /package/dist/{chunk-2N5PXLAS.js.map → chunk-7RMRM7W3.js.map} +0 -0
  45. /package/dist/{chunk-WUMACFYS.js.map → chunk-SBYUKODG.js.map} +0 -0
  46. /package/dist/{chunk-T6GPGCK4.js.map → chunk-VEYJNQVW.js.map} +0 -0
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  Message,
3
3
  shiftComposerEntityRanges
4
- } from "./chunk-YUK4ASXB.js";
4
+ } from "./chunk-7I6XUWM7.js";
5
5
  import {
6
6
  Attachment
7
- } from "./chunk-WUMACFYS.js";
7
+ } from "./chunk-SBYUKODG.js";
8
8
  import {
9
9
  composeRefs,
10
10
  renderPrimitive
@@ -17,7 +17,7 @@ import {
17
17
  useChatContext,
18
18
  useComposer,
19
19
  useThread
20
- } from "./chunk-YQJLVBQD.js";
20
+ } from "./chunk-43U2XQP2.js";
21
21
 
22
22
  // src/chat/composer.tsx
23
23
  import { mergeAttributes } from "@tiptap/core";
@@ -186,14 +186,17 @@ var ComposerRoot = forwardRef(function ComposerRoot2({
186
186
  );
187
187
  const submittedText = formattedPrompt.text;
188
188
  const metadata = composerSubmitMetadata(submittedQuote, submittedEntities);
189
- const payload = submittedAttachments.length === 0 ? metadata === void 0 ? prompt : {
190
- text: submittedText,
191
- metadata
192
- } : {
193
- text: submittedText,
194
- attachments: submittedAttachments,
195
- ...metadata === void 0 ? {} : { metadata }
196
- };
189
+ let payload;
190
+ if (submittedAttachments.length === 0) {
191
+ payload = metadata === void 0 ? prompt : { text: submittedText, metadata };
192
+ } else {
193
+ const attachmentPayload = {
194
+ text: submittedText,
195
+ attachments: submittedAttachments
196
+ };
197
+ if (metadata !== void 0) attachmentPayload.metadata = metadata;
198
+ payload = attachmentPayload;
199
+ }
197
200
  defaultSubmissionInFlightRef.current = true;
198
201
  try {
199
202
  const submission = chat.sendMessage(payload);
@@ -598,13 +601,9 @@ function submitComposerFromEditorKeyDown(event, composerRef) {
598
601
  }
599
602
  function composerSuggestion(trigger, composerRef) {
600
603
  const pluginKey = new PluginKey(`anvia-composer-trigger-${trigger.id}`);
601
- return {
604
+ const suggestion = {
602
605
  pluginKey,
603
606
  char: trigger.char,
604
- ...trigger.allowSpaces === void 0 ? {} : { allowSpaces: trigger.allowSpaces },
605
- ...trigger.allowedPrefixes === void 0 ? {} : { allowedPrefixes: trigger.allowedPrefixes },
606
- ...trigger.startOfLine === void 0 ? {} : { startOfLine: trigger.startOfLine },
607
- ...trigger.minQueryLength === void 0 ? {} : { minQueryLength: trigger.minQueryLength },
608
607
  items: ({ query, signal }) => resolveTriggerItems(trigger, query, composerRef.current, signal),
609
608
  command: ({
610
609
  editor,
@@ -645,6 +644,15 @@ function composerSuggestion(trigger, composerRef) {
645
644
  onKeyDown: (props) => handleComposerTriggerKeyDown(trigger, props, composerRef)
646
645
  })
647
646
  };
647
+ if (trigger.allowSpaces !== void 0) suggestion.allowSpaces = trigger.allowSpaces;
648
+ if (trigger.allowedPrefixes !== void 0) {
649
+ suggestion.allowedPrefixes = trigger.allowedPrefixes;
650
+ }
651
+ if (trigger.startOfLine !== void 0) suggestion.startOfLine = trigger.startOfLine;
652
+ if (trigger.minQueryLength !== void 0) {
653
+ suggestion.minQueryLength = trigger.minQueryLength;
654
+ }
655
+ return suggestion;
648
656
  }
649
657
  function resolveTriggerItems(trigger, query, composer, signal) {
650
658
  if (Array.isArray(trigger.items)) {
@@ -670,13 +678,12 @@ function updateComposerTriggerState(trigger, props, composerRef) {
670
678
  const current = composerRef.current.activeTrigger;
671
679
  const selectedIndex = current?.trigger.id === trigger.id ? clampIndex(current.selectedIndex, props.items.length) : 0;
672
680
  const rect = rectFromSuggestion(props);
673
- composerRef.current.setActiveTrigger({
681
+ const state = {
674
682
  trigger,
675
683
  query: props.query,
676
684
  items: props.items,
677
685
  loading: props.loading,
678
686
  selectedIndex,
679
- ...rect === void 0 ? {} : { rect },
680
687
  selectItem: (item) => {
681
688
  if (item.disabled) {
682
689
  return;
@@ -688,7 +695,9 @@ function updateComposerTriggerState(trigger, props, composerRef) {
688
695
  (active) => active?.trigger.id === trigger.id ? { ...active, selectedIndex: clampIndex(index, active.items.length) } : active
689
696
  );
690
697
  }
691
- });
698
+ };
699
+ if (rect !== void 0) state.rect = rect;
700
+ composerRef.current.setActiveTrigger(state);
692
701
  }
693
702
  function handleComposerTriggerKeyDown(trigger, { event }, composerRef) {
694
703
  const activeTrigger = composerRef.current.activeTrigger;
@@ -756,17 +765,13 @@ function plainTextToComposerContent(input) {
756
765
  const lines = input.length === 0 ? [""] : input.split(/\r?\n/);
757
766
  return {
758
767
  type: "doc",
759
- content: lines.map((line) => ({
760
- type: "paragraph",
761
- ...line.length === 0 ? {} : {
762
- content: [
763
- {
764
- type: "text",
765
- text: line
766
- }
767
- ]
768
+ content: lines.map((line) => {
769
+ const paragraph = { type: "paragraph" };
770
+ if (line.length > 0) {
771
+ paragraph.content = [{ type: "text", text: line }];
768
772
  }
769
- }))
773
+ return paragraph;
774
+ })
770
775
  };
771
776
  }
772
777
  function composerSnapshotFromEditor(editor, previousEntities, triggers) {
@@ -822,10 +827,10 @@ function composerEntityFromAttrs(attrs, from, previousEntities, triggers) {
822
827
  const label = stringAttr(attrs?.label) ?? id;
823
828
  const text = composerEntityText(attrs);
824
829
  const previous = previousEntities.find(
825
- (entity) => entity.id === id && entity.triggerId === triggerId && entity.trigger === trigger
830
+ (entity2) => entity2.id === id && entity2.triggerId === triggerId && entity2.trigger === trigger
826
831
  );
827
832
  const data = attrs?.data ?? previous?.data;
828
- return {
833
+ const entity = {
829
834
  id,
830
835
  triggerId,
831
836
  trigger,
@@ -834,9 +839,10 @@ function composerEntityFromAttrs(attrs, from, previousEntities, triggers) {
834
839
  range: {
835
840
  from,
836
841
  to: from + text.length
837
- },
838
- ...data === void 0 ? {} : { data }
842
+ }
839
843
  };
844
+ if (data !== void 0) entity.data = data;
845
+ return entity;
840
846
  }
841
847
  function composerEntityText(attrs) {
842
848
  const text = stringAttr(attrs?.text);
@@ -922,14 +928,10 @@ function composerSubmitMetadata(quote, entities) {
922
928
  if (quote === void 0 && entities.length === 0) {
923
929
  return void 0;
924
930
  }
925
- return {
926
- ...quote === void 0 ? {} : { quote },
927
- ...entities.length === 0 ? {} : {
928
- composer: {
929
- entities
930
- }
931
- }
932
- };
931
+ const metadata = {};
932
+ if (quote !== void 0) metadata.quote = quote;
933
+ if (entities.length > 0) metadata.composer = { entities };
934
+ return metadata;
933
935
  }
934
936
  var ComposerSubmit = forwardRef(
935
937
  function ComposerSubmit2(props, ref) {
@@ -1325,12 +1327,30 @@ var ThreadViewport = forwardRef2(function ThreadViewport2({ autoScroll = true, o
1325
1327
  thread.scrollToBottom("auto");
1326
1328
  }
1327
1329
  }, [autoScroll, messages, thread]);
1330
+ useEffect2(() => {
1331
+ const viewport = thread.viewportRef.current;
1332
+ if (viewport === null || !autoScroll || typeof ResizeObserver !== "function") {
1333
+ return;
1334
+ }
1335
+ const content = viewport.querySelector("[data-anvia-thread-messages]");
1336
+ if (content === null) {
1337
+ return;
1338
+ }
1339
+ const observer = new ResizeObserver(() => {
1340
+ if (thread.atBottom) {
1341
+ thread.scrollToBottom("auto");
1342
+ }
1343
+ });
1344
+ observer.observe(viewport);
1345
+ observer.observe(content);
1346
+ return () => observer.disconnect();
1347
+ }, [autoScroll, thread]);
1328
1348
  const handleScroll = useCallback2(
1329
1349
  (event) => {
1330
1350
  onScroll?.(event);
1331
1351
  const node = event.currentTarget;
1332
1352
  const distanceFromBottom = node.scrollHeight - node.scrollTop - node.clientHeight;
1333
- thread.setAtBottom(distanceFromBottom < 8);
1353
+ thread.setAtBottom(distanceFromBottom < 80);
1334
1354
  },
1335
1355
  [onScroll, thread]
1336
1356
  );
@@ -1552,4 +1572,4 @@ export {
1552
1572
  Composer,
1553
1573
  Thread
1554
1574
  };
1555
- //# sourceMappingURL=chunk-L3ZUEIB6.js.map
1575
+ //# sourceMappingURL=chunk-LM5SU5AP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/chat/composer.tsx","../src/chat/thread.tsx"],"sourcesContent":["import type { CreateUIAttachment, UIAttachment } from \"@anvia/react\";\nimport type { Editor, Extensions, JSONContent } from \"@tiptap/core\";\nimport { mergeAttributes } from \"@tiptap/core\";\nimport Document from \"@tiptap/extension-document\";\nimport HardBreak from \"@tiptap/extension-hard-break\";\nimport Mention, { type MentionOptions } from \"@tiptap/extension-mention\";\nimport Paragraph from \"@tiptap/extension-paragraph\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport Text from \"@tiptap/extension-text\";\nimport { PluginKey } from \"@tiptap/pm/state\";\nimport { EditorContent, useEditor } from \"@tiptap/react\";\nimport type {\n SuggestionKeyDownProps,\n SuggestionOptions,\n SuggestionProps,\n} from \"@tiptap/suggestion\";\nimport {\n type ChangeEvent,\n type CSSProperties,\n type DragEvent,\n type FormEvent,\n forwardRef,\n type MouseEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { Attachment } from \"../attachment/index\";\nimport {\n type ChatController,\n type ComposerAttachmentInput as ComposerAttachmentInputValue,\n type ComposerAttachmentsUpdate,\n type ComposerContextValue,\n type ComposerEntitiesUpdate,\n type ComposerEntity,\n type ComposerEntityData,\n type ComposerQuote,\n type ComposerTriggerDefinition,\n type ComposerTriggerItem as ComposerTriggerItemValue,\n type ComposerTriggerState,\n InternalAttachmentProvider,\n InternalComposerProvider,\n useChatContext,\n useComposer,\n} from \"../contexts\";\nimport { shiftComposerEntityRanges } from \"../entities\";\nimport { composeRefs, type PrimitiveProps, renderPrimitive } from \"../primitives\";\n\ntype ComposerRootProps = PrimitiveProps<\"form\"> & {\n attachments?: UIAttachment[];\n defaultAttachments?: UIAttachment[];\n defaultEntities?: ComposerEntity[];\n defaultInput?: string;\n defaultQuote?: ComposerQuote | undefined;\n entities?: ComposerEntity[];\n input?: string;\n onAttachmentsChange?: (attachments: UIAttachment[]) => void;\n onEntitiesChange?: (entities: ComposerEntity[]) => void;\n onInputChange?: (input: string) => void;\n onQuoteChange?: (quote: ComposerQuote | undefined) => void;\n quote?: ComposerQuote | undefined;\n submitMessage?: ComposerSubmitMessage;\n triggers?: ComposerTriggerDefinition[];\n};\n\nexport type ComposerSubmitMessageArgs<TEvent = unknown> = {\n input: string;\n attachments: UIAttachment[];\n entities: ComposerEntity[];\n chat: ChatController<TEvent>;\n quote?: ComposerQuote | undefined;\n clear(): void;\n};\n\nexport type ComposerSubmitMessage<TEvent = unknown> = (\n args: ComposerSubmitMessageArgs<TEvent>,\n) => Promise<void> | void;\n\nconst ComposerRoot = forwardRef<HTMLFormElement, ComposerRootProps>(function ComposerRoot(\n {\n attachments: attachmentsProp,\n defaultAttachments,\n defaultEntities,\n defaultInput = \"\",\n defaultQuote,\n entities: entitiesProp,\n input: inputProp,\n onAttachmentsChange,\n onEntitiesChange,\n onInputChange,\n onQuoteChange,\n quote: quoteProp,\n submitMessage,\n triggers: triggersProp,\n onSubmit,\n ...props\n },\n ref,\n) {\n const chat = useChatContext();\n const [uncontrolledInput, setUncontrolledInput] = useState(defaultInput);\n const [uncontrolledAttachments, setUncontrolledAttachments] = useState<UIAttachment[]>(() => [\n ...(defaultAttachments ?? []),\n ]);\n const [uncontrolledEntities, setUncontrolledEntities] = useState<ComposerEntity[]>(() => [\n ...(defaultEntities ?? []),\n ]);\n const [uncontrolledQuote, setUncontrolledQuote] = useState<ComposerQuote | undefined>(\n defaultQuote,\n );\n const [activeTrigger, setActiveTriggerState] = useState<ComposerTriggerState | undefined>();\n const input = inputProp ?? uncontrolledInput;\n const attachments = attachmentsProp ?? uncontrolledAttachments;\n const entities = entitiesProp ?? uncontrolledEntities;\n const triggers = triggersProp ?? EMPTY_COMPOSER_TRIGGERS;\n const rawQuote = quoteProp ?? uncontrolledQuote;\n const rawQuoteMessageId = rawQuote?.messageId;\n const rawQuoteText = rawQuote?.text;\n const quote = useMemo(\n () =>\n rawQuoteMessageId === undefined || rawQuoteText === undefined\n ? undefined\n : { messageId: rawQuoteMessageId, text: rawQuoteText },\n [rawQuoteMessageId, rawQuoteText],\n );\n const attachmentsRef = useRef(attachments);\n attachmentsRef.current = attachments;\n const entitiesRef = useRef(entities);\n entitiesRef.current = entities;\n const defaultSubmissionInFlightRef = useRef(false);\n const inputControlled = inputProp !== undefined;\n const attachmentsControlled = attachmentsProp !== undefined;\n const entitiesControlled = entitiesProp !== undefined;\n const quoteControlled = quoteProp !== undefined;\n const hasMessageContent =\n input.trim().length > 0 || attachments.length > 0 || entities.length > 0 || quote !== undefined;\n const canSubmit = hasMessageContent && chat.status !== \"streaming\";\n const canStop = chat.status === \"streaming\";\n\n const setInput = useCallback(\n (nextInput: string) => {\n if (!inputControlled) {\n setUncontrolledInput(nextInput);\n }\n onInputChange?.(nextInput);\n },\n [inputControlled, onInputChange],\n );\n\n const setAttachments = useCallback(\n (update: ComposerAttachmentsUpdate) => {\n const nextAttachments =\n typeof update === \"function\" ? update(attachmentsRef.current) : update;\n attachmentsRef.current = nextAttachments;\n if (!attachmentsControlled) {\n setUncontrolledAttachments(nextAttachments);\n }\n onAttachmentsChange?.(nextAttachments);\n },\n [attachmentsControlled, onAttachmentsChange],\n );\n\n const setEntities = useCallback(\n (update: ComposerEntitiesUpdate) => {\n const nextEntities = typeof update === \"function\" ? update(entitiesRef.current) : update;\n entitiesRef.current = nextEntities;\n if (!entitiesControlled) {\n setUncontrolledEntities(nextEntities);\n }\n onEntitiesChange?.(nextEntities);\n },\n [entitiesControlled, onEntitiesChange],\n );\n\n const setQuote = useCallback(\n (nextQuote: ComposerQuote | undefined) => {\n const normalizedQuote = normalizeQuote(nextQuote);\n if (!quoteControlled) {\n setUncontrolledQuote(normalizedQuote);\n }\n onQuoteChange?.(normalizedQuote);\n },\n [onQuoteChange, quoteControlled],\n );\n\n const addAttachment = useCallback(\n async (attachment: ComposerAttachmentInputValue) => {\n const normalized = isFileAttachmentInput(attachment)\n ? await attachmentFromFile(attachment)\n : createAttachment(attachment);\n setAttachments((current) => [...current, normalized]);\n },\n [setAttachments],\n );\n\n const removeAttachment = useCallback(\n (id: string) => {\n setAttachments((current) => current.filter((attachment) => attachment.id !== id));\n },\n [setAttachments],\n );\n\n const clearAttachments = useCallback(() => {\n setAttachments([]);\n }, [setAttachments]);\n\n const clearQuote = useCallback(() => {\n setQuote(undefined);\n }, [setQuote]);\n\n const clear = useCallback(() => {\n setInput(\"\");\n setAttachments([]);\n setEntities([]);\n setActiveTriggerState(undefined);\n clearQuote();\n }, [clearQuote, setAttachments, setEntities, setInput]);\n\n const submit = useCallback(async () => {\n const prompt = input;\n if (\n (prompt.trim().length === 0 &&\n attachments.length === 0 &&\n entities.length === 0 &&\n quote === undefined) ||\n chat.status === \"streaming\"\n ) {\n return;\n }\n if (submitMessage !== undefined) {\n await submitMessage({\n input: prompt,\n attachments,\n entities,\n chat,\n quote,\n clear,\n });\n return;\n }\n if (defaultSubmissionInFlightRef.current) {\n return;\n }\n\n const submittedAttachments = [...attachments];\n const submittedQuote = quote === undefined ? undefined : { ...quote };\n const formattedPrompt =\n submittedQuote === undefined\n ? { text: prompt, prefixLength: 0 }\n : promptWithQuote(prompt, submittedQuote);\n const submittedEntities = shiftComposerEntityRanges(\n [...entities],\n formattedPrompt.prefixLength,\n );\n const submittedText = formattedPrompt.text;\n const metadata = composerSubmitMetadata(submittedQuote, submittedEntities);\n let payload: Parameters<typeof chat.sendMessage>[0];\n if (submittedAttachments.length === 0) {\n payload = metadata === undefined ? prompt : { text: submittedText, metadata };\n } else {\n const attachmentPayload: {\n text: string;\n attachments: UIAttachment[];\n metadata?: NonNullable<ReturnType<typeof composerSubmitMetadata>>;\n } = {\n text: submittedText,\n attachments: submittedAttachments,\n };\n if (metadata !== undefined) attachmentPayload.metadata = metadata;\n payload = attachmentPayload;\n }\n\n defaultSubmissionInFlightRef.current = true;\n try {\n const submission = chat.sendMessage(payload);\n clear();\n await submission;\n } finally {\n defaultSubmissionInFlightRef.current = false;\n }\n }, [attachments, chat, clear, entities, input, quote, submitMessage]);\n\n const setActiveTrigger = useCallback((update: Parameters<typeof setActiveTriggerState>[0]) => {\n setActiveTriggerState(update);\n }, []);\n\n const value = useMemo<ComposerContextValue>(\n () => ({\n input,\n setInput,\n attachments,\n setAttachments,\n addAttachment,\n removeAttachment,\n clearAttachments,\n entities,\n setEntities,\n quote,\n setQuote,\n clearQuote,\n triggers,\n activeTrigger,\n setActiveTrigger,\n submit,\n stop: chat.stop,\n status: chat.status,\n canSubmit,\n canStop,\n }),\n [\n addAttachment,\n attachments,\n activeTrigger,\n canStop,\n canSubmit,\n chat.status,\n chat.stop,\n clearAttachments,\n clearQuote,\n entities,\n input,\n quote,\n removeAttachment,\n setAttachments,\n setActiveTrigger,\n setEntities,\n setInput,\n setQuote,\n submit,\n triggers,\n ],\n );\n\n const handleSubmit = useCallback(\n (event: FormEvent<HTMLFormElement>) => {\n (onSubmit as ((event: FormEvent<HTMLFormElement>) => void) | undefined)?.(event);\n if (event.defaultPrevented) {\n return;\n }\n event.preventDefault();\n void submit();\n },\n [onSubmit, submit],\n );\n\n return (\n <InternalComposerProvider value={value}>\n {renderPrimitive(\n \"form\",\n {\n ...props,\n onSubmit: handleSubmit,\n \"data-anvia-composer\": \"\",\n \"data-state\": chat.status,\n } as PrimitiveProps<\"form\">,\n ref,\n )}\n </InternalComposerProvider>\n );\n});\n\ntype ComposerQuoteProps = Omit<PrimitiveProps<\"blockquote\">, \"children\"> & {\n children?: ReactNode | ((quote: ComposerQuote) => ReactNode);\n};\n\nconst ComposerQuotePreview = forwardRef<HTMLQuoteElement, ComposerQuoteProps>(\n function ComposerQuotePreview({ children, ...props }, ref) {\n const composer = useComposer();\n const quote = composer.quote;\n if (quote === undefined) {\n return null;\n }\n const renderedChildren =\n typeof children === \"function\" ? children(quote) : (children ?? quote.text);\n\n return renderPrimitive(\n \"blockquote\",\n {\n ...props,\n children: renderedChildren,\n \"data-anvia-composer-quote\": \"\",\n \"data-message-id\": quote.messageId,\n } as PrimitiveProps<\"blockquote\">,\n ref,\n );\n },\n);\n\nconst ComposerClearQuote = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function ComposerClearQuote({ onClick, ...props }, ref) {\n const composer = useComposer();\n const disabled = props.disabled ?? composer.quote === undefined;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n composer.clearQuote();\n },\n [composer, disabled, onClick],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Clear quote\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-anvia-clear-quote\": \"\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\ntype ComposerInputProps = PrimitiveProps<\"div\"> & {\n autoResize?: boolean;\n disabled?: boolean | undefined;\n maxRows?: number;\n minRows?: number;\n placeholder?: string | undefined;\n};\n\nconst ComposerInput = forwardRef<HTMLDivElement, ComposerInputProps>(function ComposerInput(\n {\n autoResize = true,\n disabled,\n maxRows: maxRowsProp,\n minRows: minRowsProp,\n onKeyDown,\n placeholder,\n style,\n ...props\n },\n ref,\n) {\n const composer = useComposer();\n const composerRef = useRef(composer);\n composerRef.current = composer;\n const editorReadyRef = useRef(false);\n const syncingFromEditorRef = useRef(false);\n const triggers = composer.triggers;\n const minRows = normalizeRows(minRowsProp ?? 1, 1);\n const maxRows = normalizeRows(maxRowsProp ?? 6, minRows);\n const extensions = useMemo(\n () =>\n composerInputExtensions({\n composerRef,\n placeholder,\n triggers,\n }),\n [placeholder, triggers],\n );\n const editor = useEditor(\n {\n extensions,\n content: plainTextToComposerContent(composer.input),\n editable: composer.status !== \"streaming\",\n editorProps: {\n attributes: {\n \"aria-label\": props[\"aria-label\"] ?? \"Message\",\n \"aria-multiline\": \"true\",\n \"data-anvia-composer-editor\": \"\",\n role: \"textbox\",\n },\n handleKeyDown: (_view, event) => submitComposerFromEditorKeyDown(event, composerRef),\n },\n onUpdate: ({ editor: updatedEditor }) => {\n if (!editorReadyRef.current) {\n return;\n }\n const snapshot = composerSnapshotFromEditor(\n updatedEditor,\n composerRef.current.entities,\n composerRef.current.triggers,\n );\n syncingFromEditorRef.current = true;\n composerRef.current.setInput(snapshot.input);\n composerRef.current.setEntities(snapshot.entities);\n },\n },\n [extensions],\n );\n const ariaDisabled = props[\"aria-disabled\"] === true || props[\"aria-disabled\"] === \"true\";\n const composerDisabled = disabled === true || ariaDisabled || composer.status === \"streaming\";\n const inputStyle = useMemo<CSSProperties | undefined>(() => {\n if (!autoResize) {\n return style;\n }\n const rowsStyle: CSSProperties = {\n [\"--anvia-composer-min-rows\" as string]: minRows,\n [\"--anvia-composer-max-rows\" as string]: maxRows,\n };\n return style === undefined ? rowsStyle : { ...rowsStyle, ...style };\n }, [autoResize, maxRows, minRows, style]);\n const handleKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n if (\n event.defaultPrevented ||\n event.key !== \"Enter\" ||\n event.shiftKey ||\n event.nativeEvent.isComposing\n ) {\n return;\n }\n event.preventDefault();\n void composerRef.current.submit();\n },\n [onKeyDown],\n );\n\n useEffect(() => {\n if (editor === null) {\n return;\n }\n editor.setEditable(!composerDisabled, false);\n }, [composerDisabled, editor]);\n\n useEffect(() => {\n if (editor === null) {\n return;\n }\n editor.commands.setContent(plainTextToComposerContent(composerRef.current.input), {\n emitUpdate: false,\n });\n editorReadyRef.current = true;\n return () => {\n editorReadyRef.current = false;\n };\n }, [editor]);\n\n useEffect(() => {\n if (editor === null || !editorReadyRef.current) {\n return;\n }\n if (syncingFromEditorRef.current) {\n syncingFromEditorRef.current = false;\n return;\n }\n const snapshot = composerSnapshotFromEditor(editor, composer.entities, composer.triggers);\n if (snapshot.input === composer.input) {\n return;\n }\n editor.commands.setContent(plainTextToComposerContent(composer.input), {\n emitUpdate: false,\n });\n }, [composer, editor]);\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: <EditorContent editor={editor} />,\n \"aria-disabled\": composerDisabled ? true : props[\"aria-disabled\"],\n \"data-anvia-composer-input\": \"\",\n \"data-state\": composerDisabled ? \"disabled\" : \"enabled\",\n \"data-auto-resize\": autoResize ? \"\" : undefined,\n onKeyDown: handleKeyDown,\n style: inputStyle,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\ntype ComposerTextareaInputProps = PrimitiveProps<\"textarea\"> & {\n autoResize?: boolean;\n maxRows?: number;\n minRows?: number;\n};\n\nconst ComposerTextareaInput = forwardRef<HTMLTextAreaElement, ComposerTextareaInputProps>(\n function ComposerTextareaInput(\n {\n autoResize = true,\n maxRows: maxRowsProp,\n minRows: minRowsProp,\n onChange,\n onKeyDown,\n rows,\n ...props\n },\n ref,\n ) {\n const composer = useComposer();\n const inputRef = useRef<HTMLTextAreaElement | null>(null);\n const wasAutoResizeRef = useRef(autoResize);\n const composedInputRef = useMemo(() => composeRefs(inputRef, ref), [ref]);\n const minRows = normalizeRows(minRowsProp ?? rows ?? 1, 1);\n const maxRows = normalizeRows(maxRowsProp ?? 6, minRows);\n\n useEffect(() => {\n const wasAutoResize = wasAutoResizeRef.current;\n wasAutoResizeRef.current = autoResize;\n if (!autoResize) {\n if (wasAutoResize) {\n resetComposerInputSize(inputRef.current);\n }\n return;\n }\n resizeComposerInput(inputRef.current, { maxRows, minRows });\n });\n\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLTextAreaElement>) => {\n onChange?.(event);\n if (!event.defaultPrevented) {\n composer.setInput(event.currentTarget.value);\n composer.setEntities([]);\n if (autoResize) {\n resizeComposerInput(event.currentTarget, { maxRows, minRows });\n }\n }\n },\n [autoResize, composer, maxRows, minRows, onChange],\n );\n\n const handleKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLTextAreaElement>) => {\n onKeyDown?.(event);\n if (\n event.defaultPrevented ||\n event.key !== \"Enter\" ||\n event.shiftKey ||\n event.nativeEvent.isComposing\n ) {\n return;\n }\n event.preventDefault();\n void composer.submit();\n },\n [composer, onKeyDown],\n );\n\n return renderPrimitive(\n \"textarea\",\n {\n ...props,\n \"aria-label\": props[\"aria-label\"] ?? \"Message\",\n disabled: props.disabled ?? composer.status === \"streaming\",\n onChange: handleChange,\n onKeyDown: handleKeyDown,\n rows: autoResize ? minRows : rows,\n value: composer.input,\n \"data-anvia-composer-input\": \"\",\n \"data-anvia-composer-textarea-input\": \"\",\n } as PrimitiveProps<\"textarea\">,\n composedInputRef,\n );\n },\n);\n\nconst COMPOSER_ENTITY_NODE = \"composerEntity\";\nconst EMPTY_COMPOSER_TRIGGERS: ComposerTriggerDefinition[] = [];\n\ntype ComposerRef = {\n current: ComposerContextValue;\n};\n\ntype ComposerEntityAttrs = {\n id?: string | null | undefined;\n label?: string | null | undefined;\n mentionSuggestionChar?: string | null | undefined;\n triggerId?: string | null | undefined;\n text?: string | null | undefined;\n data?: ComposerEntityData | undefined;\n};\n\ntype ComposerInputExtensionsOptions = {\n composerRef: ComposerRef;\n placeholder?: string | undefined;\n triggers: ComposerTriggerDefinition[];\n};\n\ntype ComposerDocumentSnapshot = {\n input: string;\n entities: ComposerEntity[];\n};\n\nconst ComposerEntityExtension = Mention.extend<\n MentionOptions<ComposerTriggerItemValue, ComposerEntityAttrs>\n>({\n name: COMPOSER_ENTITY_NODE,\n\n addAttributes() {\n return {\n id: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-id\"),\n renderHTML: (attributes) =>\n attributes.id === undefined || attributes.id === null\n ? {}\n : { \"data-id\": String(attributes.id) },\n },\n label: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-label\"),\n renderHTML: (attributes) =>\n attributes.label === undefined || attributes.label === null\n ? {}\n : { \"data-label\": String(attributes.label) },\n },\n mentionSuggestionChar: {\n default: \"@\",\n parseHTML: (element) => element.getAttribute(\"data-mention-suggestion-char\"),\n renderHTML: (attributes) => ({\n \"data-mention-suggestion-char\": attributes.mentionSuggestionChar,\n }),\n },\n triggerId: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-trigger-id\"),\n renderHTML: (attributes) =>\n attributes.triggerId === undefined || attributes.triggerId === null\n ? {}\n : { \"data-trigger-id\": String(attributes.triggerId) },\n },\n text: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-text\"),\n renderHTML: (attributes) =>\n attributes.text === undefined || attributes.text === null\n ? {}\n : { \"data-text\": String(attributes.text) },\n },\n data: {\n default: null,\n parseHTML: (element) => dataFromAttribute(element.getAttribute(\"data-entity-data\")),\n renderHTML: (attributes) =>\n attributes.data === undefined || attributes.data === null\n ? {}\n : { \"data-entity-data\": JSON.stringify(attributes.data) },\n },\n };\n },\n});\n\nfunction composerInputExtensions({\n composerRef,\n placeholder,\n triggers,\n}: ComposerInputExtensionsOptions): Extensions {\n return [\n Document,\n Paragraph,\n Text,\n HardBreak,\n Placeholder.configure(placeholder === undefined ? {} : { placeholder }),\n ComposerEntityExtension.configure({\n HTMLAttributes: {\n \"data-anvia-composer-entity\": \"\",\n },\n deleteTriggerWithBackspace: true,\n renderText: ({ node }) => composerEntityText(node.attrs as ComposerEntityAttrs),\n renderHTML: ({ node, options }) => [\n \"span\",\n mergeAttributes(options.HTMLAttributes, {\n \"data-anvia-composer-entity\": \"\",\n }),\n composerEntityText(node.attrs as ComposerEntityAttrs),\n ],\n suggestions: triggers.map((trigger) => composerSuggestion(trigger, composerRef)),\n }),\n ];\n}\n\nfunction submitComposerFromEditorKeyDown(event: KeyboardEvent, composerRef: ComposerRef): boolean {\n if (\n event.defaultPrevented ||\n event.key !== \"Enter\" ||\n event.shiftKey ||\n event.isComposing ||\n composerRef.current.activeTrigger !== undefined\n ) {\n return false;\n }\n event.preventDefault();\n void composerRef.current.submit();\n return true;\n}\n\ntype ComposerSuggestionOptions = Omit<\n SuggestionOptions<ComposerTriggerItemValue, ComposerEntityAttrs>,\n \"editor\"\n>;\n\nfunction composerSuggestion(\n trigger: ComposerTriggerDefinition,\n composerRef: ComposerRef,\n): ComposerSuggestionOptions {\n const pluginKey = new PluginKey(`anvia-composer-trigger-${trigger.id}`);\n\n const suggestion: ComposerSuggestionOptions = {\n pluginKey,\n char: trigger.char,\n items: ({ query, signal }: { query: string; signal: AbortSignal }) =>\n resolveTriggerItems(trigger, query, composerRef.current, signal),\n command: ({\n editor,\n range,\n props,\n }: {\n editor: Editor;\n range: { from: number; to: number };\n props: ComposerEntityAttrs;\n }) => {\n const nodeAfter = editor.state.selection.$to.nodeAfter;\n const overrideSpace = nodeAfter?.text?.startsWith(\" \");\n const insertRange = {\n from: range.from,\n to: overrideSpace ? range.to + 1 : range.to,\n };\n editor\n .chain()\n .focus()\n .insertContentAt(insertRange, [\n {\n type: COMPOSER_ENTITY_NODE,\n attrs: props,\n },\n {\n type: \"text\",\n text: \" \",\n },\n ])\n .run();\n composerEditorOwnerDocument(editor)?.defaultView?.getSelection()?.collapseToEnd();\n composerRef.current.setActiveTrigger(undefined);\n },\n render: () => ({\n onStart: (props: SuggestionProps<ComposerTriggerItemValue, ComposerEntityAttrs>) => {\n updateComposerTriggerState(trigger, props, composerRef);\n },\n onUpdate: (props: SuggestionProps<ComposerTriggerItemValue, ComposerEntityAttrs>) => {\n updateComposerTriggerState(trigger, props, composerRef);\n },\n onExit: () => {\n composerRef.current.setActiveTrigger((current) =>\n current?.trigger.id === trigger.id ? undefined : current,\n );\n },\n onKeyDown: (props: SuggestionKeyDownProps) =>\n handleComposerTriggerKeyDown(trigger, props, composerRef),\n }),\n };\n if (trigger.allowSpaces !== undefined) suggestion.allowSpaces = trigger.allowSpaces;\n if (trigger.allowedPrefixes !== undefined) {\n suggestion.allowedPrefixes = trigger.allowedPrefixes;\n }\n if (trigger.startOfLine !== undefined) suggestion.startOfLine = trigger.startOfLine;\n if (trigger.minQueryLength !== undefined) {\n suggestion.minQueryLength = trigger.minQueryLength;\n }\n return suggestion;\n}\n\nfunction resolveTriggerItems(\n trigger: ComposerTriggerDefinition,\n query: string,\n composer: ComposerContextValue,\n signal: AbortSignal,\n): ComposerTriggerItemValue[] | Promise<ComposerTriggerItemValue[]> {\n if (Array.isArray(trigger.items)) {\n const normalizedQuery = query.toLowerCase();\n return trigger.items.filter((item) => item.label.toLowerCase().includes(normalizedQuery));\n }\n return trigger.items({\n trigger,\n query,\n input: composer.input,\n entities: composer.entities,\n signal,\n });\n}\n\nfunction composerEditorOwnerDocument(editor: Editor): Document | undefined {\n const element = editor.options.element;\n if (element === null || typeof element === \"function\") {\n return undefined;\n }\n return \"mount\" in element ? element.mount.ownerDocument : element.ownerDocument;\n}\n\nfunction updateComposerTriggerState(\n trigger: ComposerTriggerDefinition,\n props: SuggestionProps<ComposerTriggerItemValue, ComposerEntityAttrs>,\n composerRef: ComposerRef,\n): void {\n const current = composerRef.current.activeTrigger;\n const selectedIndex =\n current?.trigger.id === trigger.id ? clampIndex(current.selectedIndex, props.items.length) : 0;\n const rect = rectFromSuggestion(props);\n const state: ComposerTriggerState = {\n trigger,\n query: props.query,\n items: props.items,\n loading: props.loading,\n selectedIndex,\n selectItem: (item) => {\n if (item.disabled) {\n return;\n }\n props.command(triggerItemToEntityAttrs(trigger, item));\n },\n setSelectedIndex: (index) => {\n composerRef.current.setActiveTrigger((active) =>\n active?.trigger.id === trigger.id\n ? { ...active, selectedIndex: clampIndex(index, active.items.length) }\n : active,\n );\n },\n };\n if (rect !== undefined) state.rect = rect;\n composerRef.current.setActiveTrigger(state);\n}\n\nfunction handleComposerTriggerKeyDown(\n trigger: ComposerTriggerDefinition,\n { event }: SuggestionKeyDownProps,\n composerRef: ComposerRef,\n): boolean {\n const activeTrigger = composerRef.current.activeTrigger;\n if (activeTrigger?.trigger.id !== trigger.id) {\n return false;\n }\n\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n activeTrigger.setSelectedIndex(activeTrigger.selectedIndex + 1);\n return true;\n }\n\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n activeTrigger.setSelectedIndex(activeTrigger.selectedIndex - 1);\n return true;\n }\n\n if (event.key === \"Enter\" || event.key === \"Tab\") {\n event.preventDefault();\n const item = activeTrigger.items[activeTrigger.selectedIndex];\n if (item !== undefined) {\n activeTrigger.selectItem(item);\n }\n return true;\n }\n\n if (event.key === \"Escape\") {\n composerRef.current.setActiveTrigger(undefined);\n return false;\n }\n\n return false;\n}\n\nfunction triggerItemToEntityAttrs(\n trigger: ComposerTriggerDefinition,\n item: ComposerTriggerItemValue,\n): ComposerEntityAttrs {\n return {\n id: item.id,\n label: item.label,\n mentionSuggestionChar: trigger.char,\n triggerId: trigger.id,\n text: triggerItemText(trigger, item),\n data: item.data,\n };\n}\n\nfunction triggerItemText(\n trigger: ComposerTriggerDefinition,\n item: ComposerTriggerItemValue,\n): string {\n return item.text ?? `${trigger.char}${item.label}`;\n}\n\nfunction rectFromSuggestion(\n props: SuggestionProps<ComposerTriggerItemValue, ComposerEntityAttrs>,\n): ComposerTriggerState[\"rect\"] {\n const rect = props.clientRect?.();\n if (rect === undefined || rect === null) {\n return undefined;\n }\n return {\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n };\n}\n\nfunction clampIndex(index: number, length: number): number {\n if (length <= 0) {\n return 0;\n }\n return (index + length) % length;\n}\n\nfunction plainTextToComposerContent(input: string): JSONContent {\n const lines = input.length === 0 ? [\"\"] : input.split(/\\r?\\n/);\n return {\n type: \"doc\",\n content: lines.map((line) => {\n const paragraph: JSONContent = { type: \"paragraph\" };\n if (line.length > 0) {\n paragraph.content = [{ type: \"text\", text: line }];\n }\n return paragraph;\n }),\n };\n}\n\nfunction composerSnapshotFromEditor(\n editor: Editor,\n previousEntities: ComposerEntity[],\n triggers: ComposerTriggerDefinition[],\n): ComposerDocumentSnapshot {\n return composerSnapshotFromContent(editor.getJSON(), previousEntities, triggers);\n}\n\nfunction composerSnapshotFromContent(\n content: JSONContent,\n previousEntities: ComposerEntity[],\n triggers: ComposerTriggerDefinition[],\n): ComposerDocumentSnapshot {\n const entities: ComposerEntity[] = [];\n let input = \"\";\n let blockIndex = 0;\n\n const appendNode = (node: JSONContent): void => {\n if (node.type === \"doc\") {\n for (const child of node.content ?? []) {\n appendNode(child);\n }\n return;\n }\n\n if (node.type === \"paragraph\") {\n if (blockIndex > 0) {\n input += \"\\n\";\n }\n blockIndex += 1;\n for (const child of node.content ?? []) {\n appendNode(child);\n }\n return;\n }\n\n if (node.type === \"text\") {\n input += node.text ?? \"\";\n return;\n }\n\n if (node.type === \"hardBreak\") {\n input += \"\\n\";\n return;\n }\n\n if (node.type === COMPOSER_ENTITY_NODE) {\n const attrs = node.attrs as ComposerEntityAttrs | undefined;\n const entity = composerEntityFromAttrs(attrs, input.length, previousEntities, triggers);\n input += entity.text;\n entities.push(entity);\n return;\n }\n\n for (const child of node.content ?? []) {\n appendNode(child);\n }\n };\n\n appendNode(content);\n return { input, entities };\n}\n\nfunction composerEntityFromAttrs(\n attrs: ComposerEntityAttrs | undefined,\n from: number,\n previousEntities: ComposerEntity[],\n triggers: ComposerTriggerDefinition[],\n): ComposerEntity {\n const id = stringAttr(attrs?.id) ?? \"\";\n const trigger = stringAttr(attrs?.mentionSuggestionChar) ?? \"@\";\n const triggerId =\n stringAttr(attrs?.triggerId) ??\n triggers.find((candidate) => candidate.char === trigger)?.id ??\n trigger;\n const label = stringAttr(attrs?.label) ?? id;\n const text = composerEntityText(attrs);\n const previous = previousEntities.find(\n (entity) => entity.id === id && entity.triggerId === triggerId && entity.trigger === trigger,\n );\n const data = attrs?.data ?? previous?.data;\n const entity: ComposerEntity = {\n id,\n triggerId,\n trigger,\n label,\n text,\n range: {\n from,\n to: from + text.length,\n },\n };\n if (data !== undefined) entity.data = data;\n return entity;\n}\n\nfunction composerEntityText(attrs: ComposerEntityAttrs | undefined): string {\n const text = stringAttr(attrs?.text);\n if (text !== undefined) {\n return text;\n }\n const trigger = stringAttr(attrs?.mentionSuggestionChar) ?? \"@\";\n return `${trigger}${stringAttr(attrs?.label) ?? stringAttr(attrs?.id) ?? \"\"}`;\n}\n\nfunction stringAttr(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction dataFromAttribute(value: string | null): ComposerEntityData | null {\n if (value === null) {\n return null;\n }\n try {\n return JSON.parse(value) as ComposerEntityData;\n } catch {\n return null;\n }\n}\n\ntype ComposerInputResizeOptions = {\n maxRows: number;\n minRows: number;\n};\n\nfunction resizeComposerInput(\n input: HTMLTextAreaElement | null,\n { maxRows, minRows }: ComposerInputResizeOptions,\n): void {\n if (input === null) {\n return;\n }\n\n const style = getComputedStyle(input);\n const lineHeight = lineHeightFromStyle(style);\n const paddingHeight = pixelValue(style.paddingTop) + pixelValue(style.paddingBottom);\n const borderHeight = pixelValue(style.borderTopWidth) + pixelValue(style.borderBottomWidth);\n const minContentHeight = lineHeight * minRows;\n const maxContentHeight = Math.max(minContentHeight, lineHeight * maxRows);\n\n input.style.height = \"auto\";\n const scrollContentHeight = Math.max(input.scrollHeight - paddingHeight, 0);\n const contentHeight = clamp(scrollContentHeight, minContentHeight, maxContentHeight);\n const nextHeight =\n style.boxSizing === \"border-box\" ? contentHeight + paddingHeight + borderHeight : contentHeight;\n\n input.style.height = `${Math.ceil(nextHeight)}px`;\n input.style.overflowY = scrollContentHeight > maxContentHeight ? \"auto\" : \"hidden\";\n}\n\nfunction resetComposerInputSize(input: HTMLTextAreaElement | null): void {\n if (input === null) {\n return;\n }\n input.style.height = \"\";\n input.style.overflowY = \"\";\n}\n\nfunction normalizeRows(value: number, min: number): number {\n if (!Number.isFinite(value)) {\n return min;\n }\n return Math.max(min, Math.floor(value));\n}\n\nfunction lineHeightFromStyle(style: CSSStyleDeclaration): number {\n return pixelValue(style.lineHeight) || (pixelValue(style.fontSize) || 16) * 1.2;\n}\n\nfunction pixelValue(value: string): number {\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction promptWithQuote(\n prompt: string,\n quote: ComposerQuote,\n): { text: string; prefixLength: number } {\n const quotedText = quote.text\n .split(/\\r?\\n/)\n .map((line) => `> ${line}`)\n .join(\"\\n\");\n if (prompt.trim().length === 0) {\n return { text: quotedText, prefixLength: 0 };\n }\n const prefix = `${quotedText}\\n\\n`;\n return { text: `${prefix}${prompt}`, prefixLength: prefix.length };\n}\n\nfunction normalizeQuote(quote: ComposerQuote | undefined): ComposerQuote | undefined {\n if (quote === undefined) {\n return undefined;\n }\n return {\n text: quote.text,\n messageId: quote.messageId,\n };\n}\n\ntype ComposerSubmitMetadata = {\n quote?: ComposerQuote;\n composer?: {\n entities: ComposerEntity[];\n };\n};\n\nfunction composerSubmitMetadata(\n quote: ComposerQuote | undefined,\n entities: ComposerEntity[],\n): ComposerSubmitMetadata | undefined {\n if (quote === undefined && entities.length === 0) {\n return undefined;\n }\n const metadata: ComposerSubmitMetadata = {};\n if (quote !== undefined) metadata.quote = quote;\n if (entities.length > 0) metadata.composer = { entities };\n return metadata;\n}\n\nconst ComposerSubmit = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function ComposerSubmit(props, ref) {\n const composer = useComposer();\n const disabled = props.disabled ?? !composer.canSubmit;\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Send\",\n disabled,\n type: props.type ?? \"submit\",\n \"data-anvia-submit\": \"\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nconst ComposerStop = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(function ComposerStop(\n { onClick, ...props },\n ref,\n) {\n const composer = useComposer();\n const disabled = props.disabled ?? !composer.canStop;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n composer.stop();\n },\n [composer, disabled, onClick],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Stop\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-anvia-stop\": \"\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n});\n\ntype ComposerTriggerMenuChildren = ReactNode | ((trigger: ComposerTriggerState) => ReactNode);\n\ntype ComposerTriggerMenuProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: ComposerTriggerMenuChildren;\n keepMounted?: boolean;\n};\n\nconst ComposerTriggerMenu = forwardRef<HTMLDivElement, ComposerTriggerMenuProps>(\n function ComposerTriggerMenu({ children, keepMounted = false, style, ...props }, ref) {\n const composer = useComposer();\n const activeTrigger = composer.activeTrigger;\n const empty = activeTrigger === undefined;\n if (empty && !keepMounted) {\n return null;\n }\n\n const menuStyle =\n activeTrigger?.rect === undefined\n ? style\n : ({\n position: \"fixed\",\n top: activeTrigger.rect.bottom,\n left: activeTrigger.rect.left,\n ...style,\n } satisfies CSSProperties);\n const renderedChildren =\n activeTrigger === undefined\n ? typeof children === \"function\"\n ? null\n : children\n : typeof children === \"function\"\n ? children(activeTrigger)\n : (children ??\n activeTrigger.items.map((item, index) => (\n <ComposerTriggerItem key={`${item.id}:${index.toString()}`} index={index} />\n )));\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren,\n role: props.role ?? \"listbox\",\n style: menuStyle,\n \"data-anvia-composer-trigger-menu\": \"\",\n \"data-empty\": empty ? \"\" : undefined,\n \"data-loading\": activeTrigger?.loading ? \"\" : undefined,\n \"data-trigger\": activeTrigger?.trigger.char,\n \"data-trigger-id\": activeTrigger?.trigger.id,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype ComposerTriggerItemChildren =\n | ReactNode\n | ((item: ComposerTriggerItemValue, trigger: ComposerTriggerState) => ReactNode);\n\ntype ComposerTriggerItemProps = Omit<PrimitiveProps<\"button\">, \"children\"> & {\n children?: ComposerTriggerItemChildren;\n index?: number | undefined;\n item?: ComposerTriggerItemValue | undefined;\n};\n\nconst ComposerTriggerItem = forwardRef<HTMLButtonElement, ComposerTriggerItemProps>(\n function ComposerTriggerItem(\n { children, index, item: itemProp, onClick, onMouseEnter, ...props },\n ref,\n ) {\n const composer = useComposer();\n const activeTrigger = composer.activeTrigger;\n const itemIndex = index ?? 0;\n const item = itemProp ?? activeTrigger?.items[itemIndex];\n if (activeTrigger === undefined || item === undefined) {\n return null;\n }\n\n const selected = activeTrigger.selectedIndex === itemIndex;\n const disabled = props.disabled ?? item.disabled ?? false;\n const renderedChildren =\n typeof children === \"function\" ? children(item, activeTrigger) : (children ?? item.label);\n\n const handleMouseEnter = (event: MouseEvent<HTMLButtonElement>) => {\n onMouseEnter?.(event);\n if (!event.defaultPrevented && !disabled) {\n activeTrigger.setSelectedIndex(itemIndex);\n }\n };\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (!event.defaultPrevented && !disabled) {\n activeTrigger.selectItem(item);\n }\n };\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: renderedChildren,\n disabled,\n onClick: handleClick,\n onMouseEnter: handleMouseEnter,\n role: props.role ?? \"option\",\n type: props.type ?? \"button\",\n \"aria-selected\": selected,\n \"data-anvia-composer-trigger-item\": \"\",\n \"data-disabled\": disabled ? \"\" : undefined,\n \"data-item-id\": item.id,\n \"data-selected\": selected ? \"\" : undefined,\n \"data-trigger\": activeTrigger.trigger.char,\n \"data-trigger-id\": activeTrigger.trigger.id,\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\ntype ComposerAttachmentsChildren = ReactNode | ((attachment: UIAttachment) => ReactNode);\n\ntype ComposerAttachmentsProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: ComposerAttachmentsChildren;\n keepMounted?: boolean;\n};\n\nconst ComposerAttachments = forwardRef<HTMLDivElement, ComposerAttachmentsProps>(\n function ComposerAttachments({ children, keepMounted = false, ...props }, ref) {\n const composer = useComposer();\n const empty = composer.attachments.length === 0;\n if (empty && !keepMounted) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: composer.attachments.map((attachment) => (\n <InternalAttachmentProvider\n key={attachment.id}\n value={{\n attachment,\n remove: () => {\n composer.removeAttachment(attachment.id);\n },\n }}\n >\n {typeof children === \"function\"\n ? children(attachment)\n : (children ?? <Attachment.Root />)}\n </InternalAttachmentProvider>\n )),\n \"data-anvia-composer-attachments\": \"\",\n \"data-empty\": empty ? \"\" : undefined,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype ComposerAddAttachmentProps = PrimitiveProps<\"button\"> & {\n accept?: string;\n multiple?: boolean;\n};\n\ntype ComposerAttachmentInputProps = PrimitiveProps<\"input\">;\n\nconst ComposerAttachmentInput = forwardRef<HTMLInputElement, ComposerAttachmentInputProps>(\n function ComposerAttachmentInput({ onChange, ...props }, ref) {\n const composer = useComposer();\n const disabled = props.disabled ?? composer.status === \"streaming\";\n\n const handleChange = useCallback(\n async (event: ChangeEvent<HTMLInputElement>) => {\n onChange?.(event);\n if (event.defaultPrevented) {\n return;\n }\n const files = Array.from(event.currentTarget.files ?? []);\n event.currentTarget.value = \"\";\n for (const file of files) {\n await composer.addAttachment(file);\n }\n },\n [composer, onChange],\n );\n\n return renderPrimitive(\n \"input\",\n {\n ...props,\n disabled,\n onChange: (event) => {\n void handleChange(event);\n },\n type: \"file\",\n \"data-anvia-attachment-input\": \"\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"input\">,\n ref,\n );\n },\n);\n\nconst ComposerAddAttachment = forwardRef<HTMLButtonElement, ComposerAddAttachmentProps>(\n function ComposerAddAttachment({ accept, multiple = false, onClick, ...props }, ref) {\n const composer = useComposer();\n const inputRef = useRef<HTMLInputElement | null>(null);\n const disabled = props.disabled ?? composer.status === \"streaming\";\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n inputRef.current?.click();\n },\n [disabled, onClick],\n );\n\n return (\n <>\n {renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Attach\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-anvia-add-attachment\": \"\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n )}\n <ComposerAttachmentInput\n accept={accept}\n aria-hidden=\"true\"\n hidden\n multiple={multiple}\n ref={inputRef}\n tabIndex={-1}\n />\n </>\n );\n },\n);\n\ntype ComposerAttachmentDropzoneProps = PrimitiveProps<\"div\"> & {\n disabled?: boolean;\n};\n\nconst ComposerAttachmentDropzone = forwardRef<HTMLDivElement, ComposerAttachmentDropzoneProps>(\n function ComposerAttachmentDropzone(\n { disabled: disabledProp = false, onDragLeave, onDragOver, onDrop, ...props },\n ref,\n ) {\n const composer = useComposer();\n const [dragging, setDragging] = useState(false);\n const disabled = disabledProp || composer.status === \"streaming\";\n\n const handleDragOver = useCallback(\n (event: DragEvent<HTMLDivElement>) => {\n onDragOver?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n event.preventDefault();\n setDragging(true);\n },\n [disabled, onDragOver],\n );\n\n const handleDragLeave = useCallback(\n (event: DragEvent<HTMLDivElement>) => {\n onDragLeave?.(event);\n if (!event.defaultPrevented) {\n setDragging(false);\n }\n },\n [onDragLeave],\n );\n\n const handleDrop = useCallback(\n (event: DragEvent<HTMLDivElement>) => {\n onDrop?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n event.preventDefault();\n setDragging(false);\n const files = Array.from(event.dataTransfer.files);\n void Promise.all(files.map((file) => composer.addAttachment(file)));\n },\n [composer, disabled, onDrop],\n );\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n onDragLeave: handleDragLeave,\n onDragOver: handleDragOver,\n onDrop: handleDrop,\n \"data-anvia-attachment-dropzone\": \"\",\n \"data-dragging\": dragging ? \"\" : undefined,\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\nfunction createAttachment(attachment: CreateUIAttachment): UIAttachment {\n return {\n ...attachment,\n id: attachment.id ?? createAttachmentId(),\n };\n}\n\nfunction isFileAttachmentInput(attachment: File | CreateUIAttachment): attachment is File {\n return typeof File !== \"undefined\" && attachment instanceof File;\n}\n\nasync function attachmentFromFile(file: File): Promise<UIAttachment> {\n return {\n id: createAttachmentId(),\n type: file.type.startsWith(\"image/\") ? \"image\" : \"document\",\n name: file.name,\n mediaType: file.type.length > 0 ? file.type : \"application/octet-stream\",\n data: await readFileData(file),\n };\n}\n\nasync function readFileData(file: File): Promise<string> {\n const dataUrl = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.addEventListener(\"load\", () => {\n resolve(String(reader.result ?? \"\"));\n });\n reader.addEventListener(\"error\", () => {\n reject(reader.error ?? new Error(\"Failed to read attachment.\"));\n });\n reader.readAsDataURL(file);\n });\n return dataUrl.includes(\",\") ? dataUrl.slice(dataUrl.indexOf(\",\") + 1) : dataUrl;\n}\n\nlet nextAttachmentId = 0;\n\nfunction createAttachmentId(): string {\n const random = globalThis.crypto?.randomUUID?.();\n if (random !== undefined) {\n return `attachment_${random}`;\n }\n nextAttachmentId += 1;\n return `attachment_${nextAttachmentId.toString(36)}`;\n}\n\nexport const Composer = {\n Root: ComposerRoot,\n Quote: ComposerQuotePreview,\n ClearQuote: ComposerClearQuote,\n Input: ComposerInput,\n TextareaInput: ComposerTextareaInput,\n TriggerMenu: ComposerTriggerMenu,\n TriggerItem: ComposerTriggerItem,\n Attachments: ComposerAttachments,\n AddAttachment: ComposerAddAttachment,\n AttachmentInput: ComposerAttachmentInput,\n AttachmentDropzone: ComposerAttachmentDropzone,\n Submit: ComposerSubmit,\n Stop: ComposerStop,\n} as const;\n","import type { ChatSuggestion, UIMessage, UseChatStatus } from \"@anvia/react\";\nimport {\n Fragment,\n forwardRef,\n type MouseEvent,\n type ReactNode,\n type UIEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport {\n InternalMessageProvider,\n InternalThreadProvider,\n type ThreadContextValue,\n useChatContext,\n useThread,\n} from \"../contexts\";\nimport { Message } from \"../message/index\";\nimport { composeRefs, type PrimitiveProps, renderPrimitive } from \"../primitives\";\n\ntype ThreadMessagesChildren = ReactNode | ((message: UIMessage) => ReactNode);\ntype ThreadSuggestionChildren = ReactNode | ((suggestion: ChatSuggestion) => ReactNode);\n\nconst ThreadRoot = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function ThreadRoot(props, ref) {\n const chat = useChatContext();\n const viewportRef = useRef<HTMLElement | null>(null);\n const [atBottom, setAtBottom] = useState(true);\n const scrollToBottom = useCallback((behavior: ScrollBehavior = \"smooth\") => {\n const viewport = viewportRef.current;\n if (viewport === null) {\n return;\n }\n viewport.scrollTo({ top: viewport.scrollHeight, behavior });\n }, []);\n const thread = useMemo<ThreadContextValue>(\n () => ({ viewportRef, atBottom, setAtBottom, scrollToBottom }),\n [atBottom, scrollToBottom],\n );\n\n return (\n <InternalThreadProvider value={thread}>\n {renderPrimitive(\n \"div\",\n {\n ...props,\n \"data-anvia-thread\": \"\",\n \"data-state\": chat.status,\n } as PrimitiveProps<\"div\">,\n ref,\n )}\n </InternalThreadProvider>\n );\n },\n);\n\ntype ThreadViewportProps = PrimitiveProps<\"div\"> & {\n autoScroll?: boolean;\n};\n\nconst ThreadViewport = forwardRef<HTMLDivElement, ThreadViewportProps>(function ThreadViewport(\n { autoScroll = true, onScroll, ...props },\n ref,\n) {\n const chat = useChatContext();\n const thread = useThread();\n const messages = chat.messages;\n const composedRef = useMemo(\n () =>\n composeRefs<HTMLDivElement>(ref, (node) => {\n thread.viewportRef.current = node;\n }),\n [ref, thread.viewportRef],\n );\n\n useEffect(() => {\n const hasMessages = messages.length > 0;\n if (autoScroll && (thread.atBottom || !hasMessages)) {\n thread.scrollToBottom(\"auto\");\n }\n }, [autoScroll, messages, thread]);\n\n useEffect(() => {\n const viewport = thread.viewportRef.current;\n if (viewport === null || !autoScroll || typeof ResizeObserver !== \"function\") {\n return;\n }\n const content = viewport.querySelector<HTMLElement>(\"[data-anvia-thread-messages]\");\n if (content === null) {\n return;\n }\n const observer = new ResizeObserver(() => {\n if (thread.atBottom) {\n thread.scrollToBottom(\"auto\");\n }\n });\n observer.observe(viewport);\n observer.observe(content);\n return () => observer.disconnect();\n }, [autoScroll, thread]);\n\n const handleScroll = useCallback(\n (event: UIEvent<HTMLDivElement>) => {\n onScroll?.(event);\n const node = event.currentTarget;\n const distanceFromBottom = node.scrollHeight - node.scrollTop - node.clientHeight;\n thread.setAtBottom(distanceFromBottom < 80);\n },\n [onScroll, thread],\n );\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n onScroll: handleScroll,\n \"data-anvia-thread-viewport\": \"\",\n \"data-state\": thread.atBottom ? \"bottom\" : \"away\",\n } as PrimitiveProps<\"div\">,\n composedRef,\n );\n});\n\nconst ThreadViewportFooter = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function ThreadViewportFooter(props, ref) {\n return renderPrimitive(\n \"div\",\n {\n ...props,\n \"data-anvia-thread-viewport-footer\": \"\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\nconst ThreadEmpty = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function ThreadEmpty(props, ref) {\n const chat = useChatContext();\n if (chat.messages.length > 0) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n \"data-anvia-thread-empty\": \"\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype ThreadStatusProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: ReactNode | ((status: UseChatStatus) => ReactNode);\n};\n\nconst ThreadStatus = forwardRef<HTMLDivElement, ThreadStatusProps>(function ThreadStatus(\n { children, ...props },\n ref,\n) {\n const chat = useChatContext();\n const renderedChildren = typeof children === \"function\" ? children(chat.status) : children;\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren ?? chat.status,\n \"data-anvia-thread-status\": \"\",\n \"data-state\": chat.status,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\nconst ThreadLoading = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function ThreadLoading(props, ref) {\n const chat = useChatContext();\n if (chat.status !== \"streaming\") {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? \"Loading\",\n \"data-anvia-thread-loading\": \"\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype ThreadErrorProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: ReactNode | ((error: unknown) => ReactNode);\n};\n\nconst ThreadError = forwardRef<HTMLDivElement, ThreadErrorProps>(function ThreadError(\n { children, ...props },\n ref,\n) {\n const chat = useChatContext();\n if (chat.status !== \"error\" && chat.error === undefined) {\n return null;\n }\n const renderedChildren = typeof children === \"function\" ? children(chat.error) : children;\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren ?? errorMessage(chat.error),\n \"data-anvia-thread-error\": \"\",\n role: props.role ?? \"alert\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\ntype ThreadMessagesProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: ThreadMessagesChildren;\n keepMounted?: boolean;\n};\n\nconst ThreadMessages = forwardRef<HTMLDivElement, ThreadMessagesProps>(function ThreadMessages(\n { children, keepMounted = true, ...props },\n ref,\n) {\n const chat = useChatContext();\n const empty = chat.messages.length === 0;\n if (empty && !keepMounted) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: chat.messages.map((message) => (\n <InternalMessageProvider key={message.id} message={message}>\n {typeof children === \"function\" ? children(message) : (children ?? defaultMessage())}\n </InternalMessageProvider>\n )),\n \"data-anvia-thread-messages\": \"\",\n \"data-empty\": empty ? \"\" : undefined,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\ntype ThreadSuggestionsProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: ThreadSuggestionChildren;\n keepMounted?: boolean;\n};\n\nconst ThreadSuggestions = forwardRef<HTMLDivElement, ThreadSuggestionsProps>(\n function ThreadSuggestions({ children, keepMounted = false, ...props }, ref) {\n const chat = useChatContext();\n const suggestions = chat.suggestions ?? [];\n const empty = suggestions.length === 0;\n if (empty && !keepMounted) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: suggestions.map((suggestion) =>\n typeof children === \"function\" ? (\n <Fragment key={suggestion.id}>{children(suggestion)}</Fragment>\n ) : (\n <ThreadSuggestion key={suggestion.id} suggestion={suggestion}>\n {children}\n </ThreadSuggestion>\n ),\n ),\n \"data-anvia-thread-suggestions\": \"\",\n \"data-empty\": empty ? \"\" : undefined,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype ThreadSuggestionProps = Omit<PrimitiveProps<\"button\">, \"children\"> & {\n children?: ReactNode;\n prompt?: string;\n suggestion?: ChatSuggestion;\n};\n\nconst ThreadSuggestion = forwardRef<HTMLButtonElement, ThreadSuggestionProps>(\n function ThreadSuggestion({ onClick, prompt, suggestion, ...props }, ref) {\n const chat = useChatContext();\n const suggestionPrompt = prompt ?? suggestion?.prompt ?? \"\";\n const disabled =\n props.disabled ?? (suggestionPrompt.length === 0 || chat.status === \"streaming\");\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n void chat.sendMessage(suggestionPrompt);\n },\n [chat, disabled, onClick, suggestionPrompt],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? suggestion?.label ?? suggestionPrompt,\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-anvia-thread-suggestion\": \"\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nconst ThreadScrollToBottom = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function ThreadScrollToBottom({ onClick, ...props }, ref) {\n const thread = useThread();\n const disabled = props.disabled ?? thread.atBottom;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n thread.scrollToBottom();\n },\n [disabled, onClick, thread],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Scroll to bottom\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-anvia-scroll-to-bottom\": \"\",\n \"data-state\": thread.atBottom ? \"bottom\" : \"away\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nfunction defaultMessage(): ReactNode {\n return (\n <Message.Root>\n <Message.Content>\n <Message.Parts />\n </Message.Content>\n <Message.Actions />\n </Message.Root>\n );\n}\n\nfunction errorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === \"string\") {\n return error;\n }\n return \"Something went wrong.\";\n}\n\nexport const Thread = {\n Root: ThreadRoot,\n Viewport: ThreadViewport,\n ViewportFooter: ThreadViewportFooter,\n Messages: ThreadMessages,\n Empty: ThreadEmpty,\n Status: ThreadStatus,\n Loading: ThreadLoading,\n Error: ThreadError,\n Suggestions: ThreadSuggestions,\n Suggestion: ThreadSuggestion,\n ScrollToBottom: ThreadScrollToBottom,\n} as const;\n"],"mappings":"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","names":["ComposerRoot","ComposerQuotePreview","ComposerClearQuote","ComposerInput","ComposerTextareaInput","entity","ComposerSubmit","ComposerStop","ComposerTriggerMenu","ComposerTriggerItem","ComposerAttachments","ComposerAttachmentInput","ComposerAddAttachment","ComposerAttachmentDropzone","Fragment","forwardRef","useCallback","useEffect","useMemo","useRef","useState","jsx","jsxs","forwardRef","ThreadRoot","useRef","useState","useCallback","useMemo","ThreadViewport","useEffect","ThreadViewportFooter","ThreadEmpty","ThreadStatus","ThreadLoading","ThreadError","ThreadMessages","ThreadSuggestions","Fragment","ThreadSuggestion","ThreadScrollToBottom"]}
@@ -10,7 +10,7 @@ import {
10
10
  useHumanInput,
11
11
  useQuestion,
12
12
  useQuestionPrompt
13
- } from "./chunk-YQJLVBQD.js";
13
+ } from "./chunk-43U2XQP2.js";
14
14
 
15
15
  // src/human-input/approvals.tsx
16
16
  import { forwardRef, useCallback } from "react";
@@ -243,12 +243,13 @@ var HumanInputQuestionChoice = forwardRef2(
243
243
  if (event.defaultPrevented || choiceValue.length === 0) {
244
244
  return;
245
245
  }
246
- question.setAnswer(prompt, {
246
+ const nextAnswer = {
247
247
  questionId: prompt.id,
248
248
  answer: answer ?? choice?.label ?? choiceValue,
249
- choice: choiceValue,
250
- ...custom ? { custom: true } : {}
251
- });
249
+ choice: choiceValue
250
+ };
251
+ if (custom) nextAnswer.custom = true;
252
+ question.setAnswer(prompt, nextAnswer);
252
253
  },
253
254
  [answer, choice?.label, choiceValue, custom, onClick, prompt, question]
254
255
  );
@@ -408,4 +409,4 @@ var HumanInput = {
408
409
  export {
409
410
  HumanInput
410
411
  };
411
- //# sourceMappingURL=chunk-I4L25QXW.js.map
412
+ //# sourceMappingURL=chunk-R3NA6BWW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/human-input/approvals.tsx","../src/human-input/panel.tsx","../src/human-input/questions.tsx","../src/human-input/index.ts"],"sourcesContent":["import type { ToolApproval } from \"@anvia/react\";\nimport { type ChangeEvent, forwardRef, type MouseEvent, type ReactNode, useCallback } from \"react\";\n\nimport { InternalApprovalProvider, useApproval, useChatContext, useHumanInput } from \"../contexts\";\nimport { type PrimitiveProps, renderPrimitive } from \"../primitives\";\n\ntype ApprovalChildren = ReactNode | ((approval: ToolApproval) => ReactNode);\ntype HumanInputFilter = \"pending\" | \"all\";\n\ntype HumanInputStatusProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: ReactNode | ((state: ReturnType<typeof useHumanInput>) => ReactNode);\n};\n\nconst HumanInputStatus = forwardRef<HTMLDivElement, HumanInputStatusProps>(\n function HumanInputStatus({ children, ...props }, ref) {\n const humanInput = useHumanInput();\n const renderedChildren = typeof children === \"function\" ? children(humanInput) : children;\n const pendingCount = humanInput.approvals.pending.length + humanInput.questions.pending.length;\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren ?? `${pendingCount} pending`,\n \"data-anvia-human-input-status\": \"\",\n \"data-pending\": String(pendingCount),\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype HumanInputApprovalsProps = PrimitiveProps<\"div\"> & {\n filter?: HumanInputFilter;\n keepMounted?: boolean;\n children?: ApprovalChildren;\n};\n\nconst HumanInputApprovals = forwardRef<HTMLDivElement, HumanInputApprovalsProps>(\n function HumanInputApprovals(\n { children, filter = \"pending\", keepMounted = false, ...props },\n ref,\n ) {\n const humanInput = useHumanInput();\n const approvals = filter === \"all\" ? humanInput.approvals.all : humanInput.approvals.pending;\n const empty = approvals.length === 0;\n if (empty && !keepMounted) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: approvals.map((approval) => (\n <InternalApprovalProvider key={approval.id} approval={approval}>\n {typeof children === \"function\"\n ? children(approval)\n : (children ?? <HumanInputApproval />)}\n </InternalApprovalProvider>\n )),\n \"data-anvia-approvals\": \"\",\n \"data-empty\": empty ? \"\" : undefined,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype HumanInputApprovalProps = PrimitiveProps<\"div\"> & {\n children?: ApprovalChildren;\n};\n\nconst HumanInputApproval = forwardRef<HTMLDivElement, HumanInputApprovalProps>(\n function HumanInputApproval({ children, ...props }, ref) {\n const { approval } = useApproval();\n const renderedChildren =\n typeof children === \"function\"\n ? children(approval)\n : (children ?? defaultApprovalContent(approval));\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren,\n \"data-anvia-approval\": \"\",\n \"data-state\": approval.status,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\nconst HumanInputApprove = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function HumanInputApprove({ onClick, ...props }, ref) {\n const chat = useChatContext();\n const { approval, reason } = useApproval();\n const disabled =\n props.disabled ?? (approval.status !== \"pending\" || chat.decidingApprovals.has(approval.id));\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n const decisionReason = reason.trim().length > 0 ? reason : undefined;\n void (decisionReason === undefined\n ? chat.approveTool(approval.id)\n : chat.approveTool(approval.id, decisionReason));\n },\n [approval.id, chat, disabled, onClick, reason],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Approve\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-anvia-approve\": \"\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nconst HumanInputReject = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function HumanInputReject({ onClick, ...props }, ref) {\n const chat = useChatContext();\n const { approval, reason } = useApproval();\n const disabled =\n props.disabled ?? (approval.status !== \"pending\" || chat.decidingApprovals.has(approval.id));\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n const decisionReason = reason.trim().length > 0 ? reason : undefined;\n void (decisionReason === undefined\n ? chat.rejectTool(approval.id)\n : chat.rejectTool(approval.id, decisionReason));\n },\n [approval.id, chat, disabled, onClick, reason],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Reject\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-anvia-reject\": \"\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nconst HumanInputApprovalReason = forwardRef<HTMLTextAreaElement, PrimitiveProps<\"textarea\">>(\n function HumanInputApprovalReason({ onChange, ...props }, ref) {\n const approval = useApproval();\n\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLTextAreaElement>) => {\n onChange?.(event);\n if (!event.defaultPrevented) {\n approval.setReason(event.currentTarget.value);\n }\n },\n [approval, onChange],\n );\n\n return renderPrimitive(\n \"textarea\",\n {\n ...props,\n \"aria-label\": props[\"aria-label\"] ?? \"Approval reason\",\n onChange: handleChange,\n value: approval.reason,\n \"data-anvia-approval-reason\": \"\",\n } as PrimitiveProps<\"textarea\">,\n ref,\n );\n },\n);\n\nfunction defaultApprovalContent(approval: ToolApproval): ReactNode {\n return (\n <>\n <div data-anvia-approval-tool=\"\">{approval.toolName}</div>\n {approval.args !== undefined ? <pre data-anvia-approval-args=\"\">{approval.args}</pre> : null}\n <HumanInputApprovalReason />\n <HumanInputApprove />\n <HumanInputReject />\n </>\n );\n}\n\nexport type { ApprovalChildren, HumanInputFilter };\nexport {\n HumanInputApproval,\n HumanInputApprovalReason,\n HumanInputApprovals,\n HumanInputApprove,\n HumanInputReject,\n HumanInputStatus,\n};\n","import { forwardRef } from \"react\";\n\nimport { useHumanInput } from \"../contexts\";\nimport { type PrimitiveProps, renderPrimitive } from \"../primitives\";\nimport { HumanInputApprovals, type HumanInputFilter } from \"./approvals\";\nimport { HumanInputQuestions } from \"./questions\";\n\ntype HumanInputPanelProps = PrimitiveProps<\"div\"> & {\n filter?: HumanInputFilter;\n};\n\nconst HumanInputPanel = forwardRef<HTMLDivElement, HumanInputPanelProps>(function HumanInputPanel(\n { children, filter = \"pending\", ...props },\n ref,\n) {\n const humanInput = useHumanInput();\n const approvals = filter === \"all\" ? humanInput.approvals.all : humanInput.approvals.pending;\n const questions = filter === \"all\" ? humanInput.questions.all : humanInput.questions.pending;\n if (approvals.length === 0 && questions.length === 0) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: children ?? (\n <>\n <HumanInputApprovals filter={filter} />\n <HumanInputQuestions filter={filter} />\n </>\n ),\n \"data-anvia-human-input-panel\": \"\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\nexport { HumanInputPanel };\n","import type { ToolQuestion, ToolQuestionAnswer, ToolQuestionPrompt } from \"@anvia/react\";\nimport {\n type ChangeEvent,\n forwardRef,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useMemo,\n useState,\n} from \"react\";\n\nimport {\n InternalQuestionPromptProvider,\n InternalQuestionProvider,\n type QuestionContextValue,\n useChatContext,\n useHumanInput,\n useQuestion,\n useQuestionPrompt,\n} from \"../contexts\";\nimport { type PrimitiveProps, renderPrimitive } from \"../primitives\";\nimport type { HumanInputFilter } from \"./approvals\";\n\ntype QuestionChildren = ReactNode | ((question: ToolQuestion) => ReactNode);\n\ntype HumanInputQuestionsProps = PrimitiveProps<\"div\"> & {\n filter?: HumanInputFilter;\n keepMounted?: boolean;\n children?: QuestionChildren;\n};\n\nconst HumanInputQuestions = forwardRef<HTMLDivElement, HumanInputQuestionsProps>(\n function HumanInputQuestions(\n { children, filter = \"pending\", keepMounted = false, ...props },\n ref,\n ) {\n const humanInput = useHumanInput();\n const questions = filter === \"all\" ? humanInput.questions.all : humanInput.questions.pending;\n const empty = questions.length === 0;\n if (empty && !keepMounted) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: questions.map((question) => (\n <QuestionProvider key={question.id} question={question}>\n {typeof children === \"function\"\n ? children(question)\n : (children ?? <HumanInputQuestion />)}\n </QuestionProvider>\n )),\n \"data-anvia-questions\": \"\",\n \"data-empty\": empty ? \"\" : undefined,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype HumanInputQuestionProps = PrimitiveProps<\"div\"> & {\n children?: QuestionChildren;\n};\n\nconst HumanInputQuestion = forwardRef<HTMLDivElement, HumanInputQuestionProps>(\n function HumanInputQuestion({ children, ...props }, ref) {\n const { question } = useQuestion();\n const renderedChildren =\n typeof children === \"function\"\n ? children(question)\n : (children ?? defaultQuestionContent(question));\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren,\n \"data-anvia-question\": \"\",\n \"data-state\": question.status,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype HumanInputQuestionPromptProps = PrimitiveProps<\"div\"> & {\n promptId?: string;\n};\n\nconst HumanInputQuestionPrompt = forwardRef<HTMLDivElement, HumanInputQuestionPromptProps>(\n function HumanInputQuestionPrompt({ promptId, ...props }, ref) {\n const { question } = useQuestion();\n const prompt = question.questions.find((item) => item.id === promptId) ?? question.questions[0];\n if (prompt === undefined) {\n return null;\n }\n\n return (\n <InternalQuestionPromptProvider prompt={prompt}>\n {renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? defaultQuestionPrompt(prompt),\n \"data-anvia-question-prompt\": \"\",\n } as PrimitiveProps<\"div\">,\n ref,\n )}\n </InternalQuestionPromptProvider>\n );\n },\n);\n\ntype HumanInputQuestionChoiceProps = PrimitiveProps<\"button\"> & {\n value?: string;\n answer?: string;\n custom?: boolean;\n};\n\nconst HumanInputQuestionChoice = forwardRef<HTMLButtonElement, HumanInputQuestionChoiceProps>(\n function HumanInputQuestionChoice({ answer, custom = false, onClick, value, ...props }, ref) {\n const { prompt } = useQuestionPrompt();\n const question = useQuestion();\n const choiceValue = value ?? prompt.choices[0]?.value ?? \"\";\n const choice = prompt.choices.find((item) => item.value === choiceValue);\n const selected = question.answers[prompt.id]?.choice === choiceValue;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || choiceValue.length === 0) {\n return;\n }\n const nextAnswer: ToolQuestionAnswer = {\n questionId: prompt.id,\n answer: answer ?? choice?.label ?? choiceValue,\n choice: choiceValue,\n };\n if (custom) nextAnswer.custom = true;\n question.setAnswer(prompt, nextAnswer);\n },\n [answer, choice?.label, choiceValue, custom, onClick, prompt, question],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? choice?.label ?? choiceValue,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-anvia-question-choice\": \"\",\n \"data-state\": selected ? \"selected\" : \"idle\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nconst HumanInputQuestionTextAnswer = forwardRef<HTMLTextAreaElement, PrimitiveProps<\"textarea\">>(\n function HumanInputQuestionTextAnswer({ onChange, ...props }, ref) {\n const { prompt } = useQuestionPrompt();\n const question = useQuestion();\n const value = question.answers[prompt.id]?.answer ?? \"\";\n\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLTextAreaElement>) => {\n onChange?.(event);\n if (event.defaultPrevented) {\n return;\n }\n const answer = event.currentTarget.value;\n question.setAnswer(prompt, {\n questionId: prompt.id,\n answer,\n custom: true,\n });\n },\n [onChange, prompt, question],\n );\n\n return renderPrimitive(\n \"textarea\",\n {\n ...props,\n \"aria-label\": props[\"aria-label\"] ?? prompt.question,\n onChange: handleChange,\n value,\n \"data-anvia-question-text-answer\": \"\",\n } as PrimitiveProps<\"textarea\">,\n ref,\n );\n },\n);\n\nconst HumanInputQuestionSubmit = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function HumanInputQuestionSubmit({ onClick, ...props }, ref) {\n const chat = useChatContext();\n const question = useQuestion();\n const answers = useMemo(\n () =>\n question.question.questions.flatMap((prompt) => {\n const answer = question.answers[prompt.id];\n return answer === undefined || answer.answer.trim().length === 0 ? [] : [answer];\n }),\n [question],\n );\n const disabled =\n props.disabled ??\n (question.question.status !== \"pending\" ||\n chat.answeringQuestions.has(question.question.id) ||\n answers.length === 0);\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n void chat.answerToolQuestion(question.question.id, answers);\n },\n [answers, chat, disabled, onClick, question.question.id],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Submit\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-anvia-question-submit\": \"\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nfunction QuestionProvider({\n question,\n children,\n}: {\n question: ToolQuestion;\n children?: ReactNode;\n}) {\n const [answers, setAnswers] = useState<Record<string, ToolQuestionAnswer>>({});\n const setAnswer = useCallback((prompt: ToolQuestionPrompt, answer: ToolQuestionAnswer) => {\n setAnswers((current) => ({ ...current, [prompt.id]: answer }));\n }, []);\n const value = useMemo<QuestionContextValue>(\n () => ({ question, answers, setAnswer }),\n [answers, question, setAnswer],\n );\n\n return <InternalQuestionProvider value={value}>{children}</InternalQuestionProvider>;\n}\n\nfunction defaultQuestionContent(question: ToolQuestion): ReactNode {\n return (\n <>\n <div data-anvia-question-tool=\"\">{question.toolName}</div>\n {question.args !== undefined ? <pre data-anvia-question-args=\"\">{question.args}</pre> : null}\n {question.questions.map((prompt) => (\n <HumanInputQuestionPrompt key={prompt.id} promptId={prompt.id} />\n ))}\n <HumanInputQuestionSubmit />\n </>\n );\n}\n\nfunction defaultQuestionPrompt(prompt: ToolQuestionPrompt): ReactNode {\n return (\n <>\n <div data-anvia-question-text=\"\">{prompt.question}</div>\n {prompt.choices.length > 0 ? (\n <div data-anvia-question-choices=\"\">\n {prompt.choices.map((choice) => (\n <HumanInputQuestionChoice key={choice.value} value={choice.value}>\n {choice.label}\n </HumanInputQuestionChoice>\n ))}\n </div>\n ) : (\n <HumanInputQuestionTextAnswer />\n )}\n </>\n );\n}\n\nexport type { QuestionChildren };\nexport {\n HumanInputQuestion,\n HumanInputQuestionChoice,\n HumanInputQuestionPrompt,\n HumanInputQuestionSubmit,\n HumanInputQuestions,\n HumanInputQuestionTextAnswer,\n};\n","import {\n HumanInputApproval,\n HumanInputApprovalReason,\n HumanInputApprovals,\n HumanInputApprove,\n HumanInputReject,\n HumanInputStatus,\n} from \"./approvals\";\nimport { HumanInputPanel } from \"./panel\";\nimport {\n HumanInputQuestion,\n HumanInputQuestionChoice,\n HumanInputQuestionPrompt,\n HumanInputQuestionSubmit,\n HumanInputQuestions,\n HumanInputQuestionTextAnswer,\n} from \"./questions\";\n\nexport const HumanInput = {\n Panel: HumanInputPanel,\n Status: HumanInputStatus,\n Approvals: HumanInputApprovals,\n Approval: HumanInputApproval,\n ApprovalReason: HumanInputApprovalReason,\n Approve: HumanInputApprove,\n Reject: HumanInputReject,\n Questions: HumanInputQuestions,\n Question: HumanInputQuestion,\n QuestionPrompt: HumanInputQuestionPrompt,\n QuestionChoice: HumanInputQuestionChoice,\n QuestionTextAnswer: HumanInputQuestionTextAnswer,\n QuestionSubmit: HumanInputQuestionSubmit,\n} as const;\n\nexport type {\n ApprovalContextValue,\n QuestionContextValue,\n QuestionPromptContextValue,\n} from \"../contexts\";\nexport {\n useApproval,\n useChatContext,\n useHumanInput,\n useQuestion,\n useQuestionPrompt,\n} from \"../contexts\";\n"],"mappings":"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","names":["HumanInputStatus","HumanInputApprovals","HumanInputApproval","HumanInputApprove","HumanInputReject","HumanInputApprovalReason","forwardRef","forwardRef","useCallback","Fragment","jsx","jsxs","forwardRef","HumanInputQuestions","HumanInputQuestion","HumanInputQuestionPrompt","HumanInputQuestionChoice","useCallback","HumanInputQuestionTextAnswer","HumanInputQuestionSubmit","Fragment","jsx","jsxs","forwardRef","HumanInputPanel"]}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-T3ZFZ3NP.js";
4
4
  import {
5
5
  useAttachment
6
- } from "./chunk-YQJLVBQD.js";
6
+ } from "./chunk-43U2XQP2.js";
7
7
 
8
8
  // src/attachment/parts.tsx
9
9
  import { forwardRef, useCallback } from "react";
@@ -122,4 +122,4 @@ var Attachment = {
122
122
  export {
123
123
  Attachment
124
124
  };
125
- //# sourceMappingURL=chunk-WUMACFYS.js.map
125
+ //# sourceMappingURL=chunk-SBYUKODG.js.map