@anvia/react-ui 1.2.0 → 1.3.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.
@@ -18,6 +18,8 @@ type ComposerSubmitMessageArgs<TData extends ClientDataMap = ClientDataMap> = {
18
18
  clear(): void;
19
19
  };
20
20
  type ComposerSubmitMessage<TData extends ClientDataMap = ClientDataMap> = (args: ComposerSubmitMessageArgs<TData>) => Promise<void> | void;
21
+ /** A mention token as the editor knows it; `range` is meaningful only in the saved message. */
22
+ type ComposerInputEntity = Omit<ComposerEntity, "range">;
21
23
  type ComposerTriggerMenuChildren = ReactNode | ((trigger: ComposerTriggerState) => ReactNode);
22
24
  type ComposerTriggerItemChildren = ReactNode | ((item: ComposerTriggerItem, trigger: ComposerTriggerState) => ReactNode);
23
25
  type ComposerAttachmentsChildren = ReactNode | ((attachment: UIAttachment) => ReactNode);
@@ -54,6 +56,12 @@ declare const ComposerPrimitive: {
54
56
  maxRows?: number;
55
57
  minRows?: number;
56
58
  placeholder?: string | undefined;
59
+ /**
60
+ * Customises how a mention token displays in the editor. The saved text and entities are
61
+ * unchanged. Return `null` or `undefined` to show the entity's text. Keep it a pure function of
62
+ * `entity`: a token re-renders only when its node changes, not when the function's closure does.
63
+ */
64
+ renderEntity?: ((entity: ComposerInputEntity) => ReactNode) | undefined;
57
65
  } & react.RefAttributes<HTMLDivElement>>;
58
66
  readonly TextareaInput: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.TextareaHTMLAttributes<HTMLTextAreaElement>, HTMLTextAreaElement>, "ref">, "asChild"> & {
59
67
  asChild?: boolean;
@@ -141,4 +149,4 @@ declare const ThreadPrimitive: {
141
149
  } & react.RefAttributes<HTMLButtonElement>>;
142
150
  };
143
151
 
144
- export { ChatController, ComposerEntity, ComposerPrimitive, ComposerQuote, type ComposerSubmitMessage, type ComposerSubmitMessageArgs, ComposerTriggerDefinition, ComposerTriggerItem, ComposerTriggerState, ThreadPrimitive };
152
+ export { ChatController, ComposerEntity, type ComposerInputEntity, ComposerPrimitive, ComposerQuote, type ComposerSubmitMessage, type ComposerSubmitMessageArgs, ComposerTriggerDefinition, ComposerTriggerItem, ComposerTriggerState, ThreadPrimitive };
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  ComposerPrimitive,
3
3
  ThreadPrimitive
4
- } from "../chunk-Y2KAMPVJ.js";
4
+ } from "../chunk-T4IYUEPH.js";
5
5
  import "../chunk-W2AHKMRS.js";
6
6
  import "../chunk-6XOJFLX4.js";
7
7
  import "../chunk-F6AKBUO3.js";
@@ -29,7 +29,12 @@ import Paragraph from "@tiptap/extension-paragraph";
29
29
  import Placeholder from "@tiptap/extension-placeholder";
30
30
  import Text from "@tiptap/extension-text";
31
31
  import { PluginKey } from "@tiptap/pm/state";
32
- import { EditorContent, useEditor } from "@tiptap/react";
32
+ import {
33
+ EditorContent,
34
+ NodeViewWrapper,
35
+ ReactNodeViewRenderer,
36
+ useEditor
37
+ } from "@tiptap/react";
33
38
  import {
34
39
  forwardRef,
35
40
  useCallback,
@@ -332,12 +337,16 @@ var ComposerInput = forwardRef(function ComposerInput2({
332
337
  minRows: minRowsProp,
333
338
  onKeyDown,
334
339
  placeholder,
340
+ renderEntity,
335
341
  style,
336
342
  ...props
337
343
  }, ref) {
338
344
  const composer = useComposer();
339
345
  const composerRef = useRef(composer);
340
346
  composerRef.current = composer;
347
+ const renderEntityRef = useRef(renderEntity);
348
+ renderEntityRef.current = renderEntity;
349
+ const customEntityView = renderEntity !== void 0;
341
350
  const editorReadyRef = useRef(false);
342
351
  const syncingFromEditorRef = useRef(false);
343
352
  const triggers = composer.triggers;
@@ -347,9 +356,10 @@ var ComposerInput = forwardRef(function ComposerInput2({
347
356
  () => composerInputExtensions({
348
357
  composerRef,
349
358
  placeholder,
359
+ renderEntityRef: customEntityView ? renderEntityRef : void 0,
350
360
  triggers
351
361
  }),
352
- [placeholder, triggers]
362
+ [customEntityView, placeholder, triggers]
353
363
  );
354
364
  const editor = useEditor(
355
365
  {
@@ -564,18 +574,38 @@ var ComposerEntityExtension = Mention.extend({
564
574
  };
565
575
  }
566
576
  });
577
+ function composerEntityView(renderEntityRef, composerRef) {
578
+ return function ComposerEntityView({ node }) {
579
+ const attrs = node.attrs;
580
+ const { range: _range, ...entity } = composerEntityFromAttrs(
581
+ attrs,
582
+ 0,
583
+ composerRef.current.entities,
584
+ composerRef.current.triggers
585
+ );
586
+ return /* @__PURE__ */ jsx(NodeViewWrapper, { as: "span", children: renderEntityRef.current?.(entity) ?? entity.text });
587
+ };
588
+ }
567
589
  function composerInputExtensions({
568
590
  composerRef,
569
591
  placeholder,
592
+ renderEntityRef,
570
593
  triggers
571
594
  }) {
595
+ const EntityExtension = renderEntityRef === void 0 ? ComposerEntityExtension : ComposerEntityExtension.extend({
596
+ addNodeView() {
597
+ return ReactNodeViewRenderer(composerEntityView(renderEntityRef, composerRef), {
598
+ as: "span"
599
+ });
600
+ }
601
+ });
572
602
  return [
573
603
  Document,
574
604
  Paragraph,
575
605
  Text,
576
606
  HardBreak,
577
607
  Placeholder.configure(placeholder === void 0 ? {} : { placeholder }),
578
- ComposerEntityExtension.configure({
608
+ EntityExtension.configure({
579
609
  HTMLAttributes: {},
580
610
  deleteTriggerWithBackspace: true,
581
611
  renderText: ({ node }) => composerEntityText(node.attrs),
@@ -1579,4 +1609,4 @@ export {
1579
1609
  ComposerPrimitive,
1580
1610
  ThreadPrimitive
1581
1611
  };
1582
- //# sourceMappingURL=chunk-Y2KAMPVJ.js.map
1612
+ //# sourceMappingURL=chunk-T4IYUEPH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/chat/composer.tsx","../src/chat/thread.tsx"],"sourcesContent":["import type {\n ClientDataMap,\n ClientMetadata,\n CreateUIAttachment,\n UIAttachment,\n} from \"@anvia/client\";\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 {\n EditorContent,\n type NodeViewProps,\n NodeViewWrapper,\n ReactNodeViewRenderer,\n useEditor,\n} 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 { AttachmentPrimitive } 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\";\nimport { isComposerEntityData } from \"../strict-json\";\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<TData extends ClientDataMap = ClientDataMap> = {\n input: string;\n attachments: UIAttachment[];\n entities: ComposerEntity[];\n chat: ChatController<ClientMetadata, TData>;\n quote?: ComposerQuote | undefined;\n clear(): void;\n};\n\nexport type ComposerSubmitMessage<TData extends ClientDataMap = ClientDataMap> = (\n args: ComposerSubmitMessageArgs<TData>,\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 active = chat.status === \"submitted\" || chat.status === \"streaming\";\n const canSubmit = hasMessageContent && !active;\n const canStop = active;\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 === \"submitted\" ||\n chat.status === \"streaming\"\n ) {\n return;\n }\n assertComposerEntitiesData(entities);\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 =\n metadata === undefined ? { text: submittedText } : { 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-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 } 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-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\n/** A mention token as the editor knows it; `range` is meaningful only in the saved message. */\nexport type ComposerInputEntity = Omit<ComposerEntity, \"range\">;\n\ntype ComposerInputProps = PrimitiveProps<\"div\"> & {\n autoResize?: boolean;\n disabled?: boolean | undefined;\n maxRows?: number;\n minRows?: number;\n placeholder?: string | undefined;\n /**\n * Customises how a mention token displays in the editor. The saved text and entities are\n * unchanged. Return `null` or `undefined` to show the entity's text. Keep it a pure function of\n * `entity`: a token re-renders only when its node changes, not when the function's closure does.\n */\n renderEntity?: ((entity: ComposerInputEntity) => ReactNode) | 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 renderEntity,\n style,\n ...props\n },\n ref,\n) {\n const composer = useComposer();\n const composerRef = useRef(composer);\n composerRef.current = composer;\n // Read through a ref so an inline function does not rebuild the editor on every render.\n const renderEntityRef = useRef(renderEntity);\n renderEntityRef.current = renderEntity;\n const customEntityView = renderEntity !== undefined;\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 renderEntityRef: customEntityView ? renderEntityRef : undefined,\n triggers,\n }),\n [customEntityView, placeholder, triggers],\n );\n const editor = useEditor(\n {\n extensions,\n content: plainTextToComposerContent(composer.input),\n editable: composer.status !== \"submitted\" && composer.status !== \"streaming\",\n editorProps: {\n attributes: {\n \"aria-label\": props[\"aria-label\"] ?? \"Message\",\n \"aria-multiline\": \"true\",\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 =\n disabled === true ||\n ariaDisabled ||\n composer.status === \"submitted\" ||\n 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-role\": \"editor\",\n \"data-state\": composerDisabled ? \"disabled\" : \"enabled\",\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:\n props.disabled ?? (composer.status === \"submitted\" || composer.status === \"streaming\"),\n onChange: handleChange,\n onKeyDown: handleKeyDown,\n rows: autoResize ? minRows : rows,\n value: composer.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 renderEntityRef?: { current: ComposerInputProps[\"renderEntity\"] } | 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: undefined,\n parseHTML: (element) => dataFromAttribute(element.getAttribute(\"data-entity-data\")),\n renderHTML: (attributes) => {\n if (attributes.data === undefined) return {};\n if (!isComposerEntityData(attributes.data)) {\n throw new TypeError(\"Composer entity data must be a JSON value.\");\n }\n return { \"data-entity-data\": JSON.stringify(attributes.data) };\n },\n },\n };\n },\n});\n\nfunction composerEntityView(\n renderEntityRef: { current: ComposerInputProps[\"renderEntity\"] },\n composerRef: ComposerRef,\n) {\n return function ComposerEntityView({ node }: NodeViewProps) {\n const attrs = node.attrs as ComposerEntityAttrs;\n const { range: _range, ...entity } = composerEntityFromAttrs(\n attrs,\n 0,\n composerRef.current.entities,\n composerRef.current.triggers,\n );\n return (\n <NodeViewWrapper as=\"span\">\n {renderEntityRef.current?.(entity) ?? entity.text}\n </NodeViewWrapper>\n );\n };\n}\n\nfunction composerInputExtensions({\n composerRef,\n placeholder,\n renderEntityRef,\n triggers,\n}: ComposerInputExtensionsOptions): Extensions {\n const EntityExtension =\n renderEntityRef === undefined\n ? ComposerEntityExtension\n : ComposerEntityExtension.extend({\n addNodeView() {\n return ReactNodeViewRenderer(composerEntityView(renderEntityRef, composerRef), {\n as: \"span\",\n });\n },\n });\n return [\n Document,\n Paragraph,\n Text,\n HardBreak,\n Placeholder.configure(placeholder === undefined ? {} : { placeholder }),\n EntityExtension.configure({\n HTMLAttributes: {},\n deleteTriggerWithBackspace: true,\n renderText: ({ node }) => composerEntityText(node.attrs as ComposerEntityAttrs),\n renderHTML: ({ node, options }) => [\n \"span\",\n mergeAttributes(options.HTMLAttributes, {}),\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 if (item.data !== undefined && !isComposerEntityData(item.data)) {\n throw new TypeError(\"Composer trigger item data must be a JSON value.\");\n }\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 === undefined ? previous?.data : attrs.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 | undefined {\n if (value === null) {\n return undefined;\n }\n try {\n const parsed: unknown = JSON.parse(value);\n return isComposerEntityData(parsed) ? parsed : undefined;\n } catch {\n return undefined;\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 = ClientMetadata & {\n quote?: ComposerQuote;\n composer?: ClientMetadata & {\n entities: readonly ClientMetadata[];\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) {\n metadata.composer = { entities: entities.map(composerEntityMetadata) };\n }\n return metadata;\n}\n\nfunction assertComposerEntitiesData(entities: readonly ComposerEntity[]): void {\n for (const entity of entities) {\n if (entity.data !== undefined && !isComposerEntityData(entity.data)) {\n throw new TypeError(\"Composer entity data must be a JSON value.\");\n }\n }\n}\n\nfunction composerEntityMetadata(entity: ComposerEntity): ClientMetadata {\n const metadata: ClientMetadata = {\n id: entity.id,\n triggerId: entity.triggerId,\n trigger: entity.trigger,\n label: entity.label,\n text: entity.text,\n range: { from: entity.range.from, to: entity.range.to },\n };\n if (entity.data !== undefined) {\n metadata.data = entity.data;\n }\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-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-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-state\":\n activeTrigger === undefined\n ? \"closed\"\n : activeTrigger.loading\n ? \"loading\"\n : empty\n ? \"empty\"\n : \"open\",\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-state\": disabled ? \"disabled\" : selected ? \"selected\" : \"idle\",\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 ?? <AttachmentPrimitive.Root />)}\n </InternalAttachmentProvider>\n )),\n \"data-role\": \"attachments\",\n \"data-state\": empty ? \"empty\" : \"populated\",\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 =\n props.disabled ?? (composer.status === \"submitted\" || 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-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 =\n props.disabled ?? (composer.status === \"submitted\" || 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-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 =\n disabledProp || composer.status === \"submitted\" || 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-state\": disabled ? \"disabled\" : dragging ? \"dragging\" : \"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 ComposerPrimitive = {\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 { UIMessage } from \"@anvia/client\";\nimport type { ChatSuggestion, 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 { MessagePrimitive } 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 messagesRef = 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, messagesRef, atBottom, setAtBottom, scrollToBottom }),\n [atBottom, scrollToBottom],\n );\n\n return (\n <InternalThreadProvider value={thread}>\n {renderPrimitive(\n \"div\",\n {\n ...props,\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 = thread.messagesRef.current;\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-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 } 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 } 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-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 !== \"submitted\" && chat.status !== \"streaming\") {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? \"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 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 thread = useThread();\n const composedRef = useMemo(\n () =>\n composeRefs<HTMLDivElement>(ref, (node) => {\n thread.messagesRef.current = node;\n }),\n [ref, thread.messagesRef],\n );\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-state\": empty ? \"empty\" : \"populated\",\n } as PrimitiveProps<\"div\">,\n composedRef,\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-role\": \"suggestions\",\n \"data-state\": empty ? \"empty\" : \"populated\",\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 ??\n (suggestionPrompt.length === 0 || chat.status === \"submitted\" || 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({ text: 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-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-state\": thread.atBottom ? \"bottom\" : \"away\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nfunction defaultMessage(): ReactNode {\n return (\n <MessagePrimitive.Root>\n <MessagePrimitive.Content>\n <MessagePrimitive.Parts />\n </MessagePrimitive.Content>\n <MessagePrimitive.Actions />\n </MessagePrimitive.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 ThreadPrimitive = {\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":";;;;;;;;;;;;;;;;;;;;;;;AAOA,SAAS,uBAAuB;AAChC,OAAO,cAAc;AACrB,OAAO,eAAe;AACtB,OAAO,aAAsC;AAC7C,OAAO,eAAe;AACtB,OAAO,iBAAiB;AACxB,OAAO,UAAU;AACjB,SAAS,iBAAiB;AAC1B;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAMP;AAAA,EAKE;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAqUH,SAytCE,UAztCF,KAytCE,YAztCF;AAhRJ,IAAM,eAAe,WAA+C,SAASA,cAC3E;AAAA,EACE,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,GAAG;AACL,GACA,KACA;AACA,QAAM,OAAO,eAAe;AAC5B,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,SAAS,YAAY;AACvE,QAAM,CAAC,yBAAyB,0BAA0B,IAAI,SAAyB,MAAM;AAAA,IAC3F,GAAI,sBAAsB,CAAC;AAAA,EAC7B,CAAC;AACD,QAAM,CAAC,sBAAsB,uBAAuB,IAAI,SAA2B,MAAM;AAAA,IACvF,GAAI,mBAAmB,CAAC;AAAA,EAC1B,CAAC;AACD,QAAM,CAAC,mBAAmB,oBAAoB,IAAI;AAAA,IAChD;AAAA,EACF;AACA,QAAM,CAAC,eAAe,qBAAqB,IAAI,SAA2C;AAC1F,QAAM,QAAQ,aAAa;AAC3B,QAAM,cAAc,mBAAmB;AACvC,QAAM,WAAW,gBAAgB;AACjC,QAAM,WAAW,gBAAgB;AACjC,QAAM,WAAW,aAAa;AAC9B,QAAM,oBAAoB,UAAU;AACpC,QAAM,eAAe,UAAU;AAC/B,QAAM,QAAQ;AAAA,IACZ,MACE,sBAAsB,UAAa,iBAAiB,SAChD,SACA,EAAE,WAAW,mBAAmB,MAAM,aAAa;AAAA,IACzD,CAAC,mBAAmB,YAAY;AAAA,EAClC;AACA,QAAM,iBAAiB,OAAO,WAAW;AACzC,iBAAe,UAAU;AACzB,QAAM,cAAc,OAAO,QAAQ;AACnC,cAAY,UAAU;AACtB,QAAM,+BAA+B,OAAO,KAAK;AACjD,QAAM,kBAAkB,cAAc;AACtC,QAAM,wBAAwB,oBAAoB;AAClD,QAAM,qBAAqB,iBAAiB;AAC5C,QAAM,kBAAkB,cAAc;AACtC,QAAM,oBACJ,MAAM,KAAK,EAAE,SAAS,KAAK,YAAY,SAAS,KAAK,SAAS,SAAS,KAAK,UAAU;AACxF,QAAM,SAAS,KAAK,WAAW,eAAe,KAAK,WAAW;AAC9D,QAAM,YAAY,qBAAqB,CAAC;AACxC,QAAM,UAAU;AAEhB,QAAM,WAAW;AAAA,IACf,CAAC,cAAsB;AACrB,UAAI,CAAC,iBAAiB;AACpB,6BAAqB,SAAS;AAAA,MAChC;AACA,sBAAgB,SAAS;AAAA,IAC3B;AAAA,IACA,CAAC,iBAAiB,aAAa;AAAA,EACjC;AAEA,QAAM,iBAAiB;AAAA,IACrB,CAAC,WAAsC;AACrC,YAAM,kBACJ,OAAO,WAAW,aAAa,OAAO,eAAe,OAAO,IAAI;AAClE,qBAAe,UAAU;AACzB,UAAI,CAAC,uBAAuB;AAC1B,mCAA2B,eAAe;AAAA,MAC5C;AACA,4BAAsB,eAAe;AAAA,IACvC;AAAA,IACA,CAAC,uBAAuB,mBAAmB;AAAA,EAC7C;AAEA,QAAM,cAAc;AAAA,IAClB,CAAC,WAAmC;AAClC,YAAM,eAAe,OAAO,WAAW,aAAa,OAAO,YAAY,OAAO,IAAI;AAClF,kBAAY,UAAU;AACtB,UAAI,CAAC,oBAAoB;AACvB,gCAAwB,YAAY;AAAA,MACtC;AACA,yBAAmB,YAAY;AAAA,IACjC;AAAA,IACA,CAAC,oBAAoB,gBAAgB;AAAA,EACvC;AAEA,QAAM,WAAW;AAAA,IACf,CAAC,cAAyC;AACxC,YAAM,kBAAkB,eAAe,SAAS;AAChD,UAAI,CAAC,iBAAiB;AACpB,6BAAqB,eAAe;AAAA,MACtC;AACA,sBAAgB,eAAe;AAAA,IACjC;AAAA,IACA,CAAC,eAAe,eAAe;AAAA,EACjC;AAEA,QAAM,gBAAgB;AAAA,IACpB,OAAO,eAA6C;AAClD,YAAM,aAAa,sBAAsB,UAAU,IAC/C,MAAM,mBAAmB,UAAU,IACnC,iBAAiB,UAAU;AAC/B,qBAAe,CAAC,YAAY,CAAC,GAAG,SAAS,UAAU,CAAC;AAAA,IACtD;AAAA,IACA,CAAC,cAAc;AAAA,EACjB;AAEA,QAAM,mBAAmB;AAAA,IACvB,CAAC,OAAe;AACd,qBAAe,CAAC,YAAY,QAAQ,OAAO,CAAC,eAAe,WAAW,OAAO,EAAE,CAAC;AAAA,IAClF;AAAA,IACA,CAAC,cAAc;AAAA,EACjB;AAEA,QAAM,mBAAmB,YAAY,MAAM;AACzC,mBAAe,CAAC,CAAC;AAAA,EACnB,GAAG,CAAC,cAAc,CAAC;AAEnB,QAAM,aAAa,YAAY,MAAM;AACnC,aAAS,MAAS;AAAA,EACpB,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,QAAQ,YAAY,MAAM;AAC9B,aAAS,EAAE;AACX,mBAAe,CAAC,CAAC;AACjB,gBAAY,CAAC,CAAC;AACd,0BAAsB,MAAS;AAC/B,eAAW;AAAA,EACb,GAAG,CAAC,YAAY,gBAAgB,aAAa,QAAQ,CAAC;AAEtD,QAAM,SAAS,YAAY,YAAY;AACrC,UAAM,SAAS;AACf,QACG,OAAO,KAAK,EAAE,WAAW,KACxB,YAAY,WAAW,KACvB,SAAS,WAAW,KACpB,UAAU,UACZ,KAAK,WAAW,eAChB,KAAK,WAAW,aAChB;AACA;AAAA,IACF;AACA,+BAA2B,QAAQ;AACnC,QAAI,kBAAkB,QAAW;AAC/B,YAAM,cAAc;AAAA,QAClB,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD;AAAA,IACF;AACA,QAAI,6BAA6B,SAAS;AACxC;AAAA,IACF;AAEA,UAAM,uBAAuB,CAAC,GAAG,WAAW;AAC5C,UAAM,iBAAiB,UAAU,SAAY,SAAY,EAAE,GAAG,MAAM;AACpE,UAAM,kBACJ,mBAAmB,SACf,EAAE,MAAM,QAAQ,cAAc,EAAE,IAChC,gBAAgB,QAAQ,cAAc;AAC5C,UAAM,oBAAoB;AAAA,MACxB,CAAC,GAAG,QAAQ;AAAA,MACZ,gBAAgB;AAAA,IAClB;AACA,UAAM,gBAAgB,gBAAgB;AACtC,UAAM,WAAW,uBAAuB,gBAAgB,iBAAiB;AACzE,QAAI;AACJ,QAAI,qBAAqB,WAAW,GAAG;AACrC,gBACE,aAAa,SAAY,EAAE,MAAM,cAAc,IAAI,EAAE,MAAM,eAAe,SAAS;AAAA,IACvF,OAAO;AACL,YAAM,oBAIF;AAAA,QACF,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AACA,UAAI,aAAa,OAAW,mBAAkB,WAAW;AACzD,gBAAU;AAAA,IACZ;AAEA,iCAA6B,UAAU;AACvC,QAAI;AACF,YAAM,aAAa,KAAK,YAAY,OAAO;AAC3C,YAAM;AACN,YAAM;AAAA,IACR,UAAE;AACA,mCAA6B,UAAU;AAAA,IACzC;AAAA,EACF,GAAG,CAAC,aAAa,MAAM,OAAO,UAAU,OAAO,OAAO,aAAa,CAAC;AAEpE,QAAM,mBAAmB,YAAY,CAAC,WAAwD;AAC5F,0BAAsB,MAAM;AAAA,EAC9B,GAAG,CAAC,CAAC;AAEL,QAAM,QAAQ;AAAA,IACZ,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM,KAAK;AAAA,MACX,QAAQ,KAAK;AAAA,MACb;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe;AAAA,IACnB,CAAC,UAAsC;AACrC,MAAC,WAAyE,KAAK;AAC/E,UAAI,MAAM,kBAAkB;AAC1B;AAAA,MACF;AACA,YAAM,eAAe;AACrB,WAAK,OAAO;AAAA,IACd;AAAA,IACA,CAAC,UAAU,MAAM;AAAA,EACnB;AAEA,SACE,oBAAC,4BAAyB,OACvB;AAAA,IACC;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,UAAU;AAAA,MACV,cAAc,KAAK;AAAA,IACrB;AAAA,IACA;AAAA,EACF,GACF;AAEJ,CAAC;AAMD,IAAM,uBAAuB;AAAA,EAC3B,SAASC,sBAAqB,EAAE,UAAU,GAAG,MAAM,GAAG,KAAK;AACzD,UAAM,WAAW,YAAY;AAC7B,UAAM,QAAQ,SAAS;AACvB,QAAI,UAAU,QAAW;AACvB,aAAO;AAAA,IACT;AACA,UAAM,mBACJ,OAAO,aAAa,aAAa,SAAS,KAAK,IAAK,YAAY,MAAM;AAExE,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,UAAU;AAAA,MACZ;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,qBAAqB;AAAA,EACzB,SAASC,oBAAmB,EAAE,SAAS,GAAG,MAAM,GAAG,KAAK;AACtD,UAAM,WAAW,YAAY;AAC7B,UAAM,WAAW,MAAM,YAAY,SAAS,UAAU;AAEtD,UAAM,cAAc;AAAA,MAClB,CAAC,UAAyC;AACxC,kBAAU,KAAK;AACf,YAAI,MAAM,oBAAoB,UAAU;AACtC;AAAA,QACF;AACA,iBAAS,WAAW;AAAA,MACtB;AAAA,MACA,CAAC,UAAU,UAAU,OAAO;AAAA,IAC9B;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,UAAU,MAAM,YAAY;AAAA,QAC5B;AAAA,QACA,SAAS;AAAA,QACT,MAAM,MAAM,QAAQ;AAAA,QACpB,cAAc,WAAW,aAAa;AAAA,MACxC;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAmBA,IAAM,gBAAgB,WAA+C,SAASC,eAC5E;AAAA,EACE,aAAa;AAAA,EACb;AAAA,EACA,SAAS;AAAA,EACT,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACA,KACA;AACA,QAAM,WAAW,YAAY;AAC7B,QAAM,cAAc,OAAO,QAAQ;AACnC,cAAY,UAAU;AAEtB,QAAM,kBAAkB,OAAO,YAAY;AAC3C,kBAAgB,UAAU;AAC1B,QAAM,mBAAmB,iBAAiB;AAC1C,QAAM,iBAAiB,OAAO,KAAK;AACnC,QAAM,uBAAuB,OAAO,KAAK;AACzC,QAAM,WAAW,SAAS;AAC1B,QAAM,UAAU,cAAc,eAAe,GAAG,CAAC;AACjD,QAAM,UAAU,cAAc,eAAe,GAAG,OAAO;AACvD,QAAM,aAAa;AAAA,IACjB,MACE,wBAAwB;AAAA,MACtB;AAAA,MACA;AAAA,MACA,iBAAiB,mBAAmB,kBAAkB;AAAA,MACtD;AAAA,IACF,CAAC;AAAA,IACH,CAAC,kBAAkB,aAAa,QAAQ;AAAA,EAC1C;AACA,QAAM,SAAS;AAAA,IACb;AAAA,MACE;AAAA,MACA,SAAS,2BAA2B,SAAS,KAAK;AAAA,MAClD,UAAU,SAAS,WAAW,eAAe,SAAS,WAAW;AAAA,MACjE,aAAa;AAAA,QACX,YAAY;AAAA,UACV,cAAc,MAAM,YAAY,KAAK;AAAA,UACrC,kBAAkB;AAAA,UAClB,MAAM;AAAA,QACR;AAAA,QACA,eAAe,CAAC,OAAO,UAAU,gCAAgC,OAAO,WAAW;AAAA,MACrF;AAAA,MACA,UAAU,CAAC,EAAE,QAAQ,cAAc,MAAM;AACvC,YAAI,CAAC,eAAe,SAAS;AAC3B;AAAA,QACF;AACA,cAAM,WAAW;AAAA,UACf;AAAA,UACA,YAAY,QAAQ;AAAA,UACpB,YAAY,QAAQ;AAAA,QACtB;AACA,6BAAqB,UAAU;AAC/B,oBAAY,QAAQ,SAAS,SAAS,KAAK;AAC3C,oBAAY,QAAQ,YAAY,SAAS,QAAQ;AAAA,MACnD;AAAA,IACF;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AACA,QAAM,eAAe,MAAM,eAAe,MAAM,QAAQ,MAAM,eAAe,MAAM;AACnF,QAAM,mBACJ,aAAa,QACb,gBACA,SAAS,WAAW,eACpB,SAAS,WAAW;AACtB,QAAM,aAAa,QAAmC,MAAM;AAC1D,QAAI,CAAC,YAAY;AACf,aAAO;AAAA,IACT;AACA,UAAM,YAA2B;AAAA,MAC/B,CAAC,2BAAqC,GAAG;AAAA,MACzC,CAAC,2BAAqC,GAAG;AAAA,IAC3C;AACA,WAAO,UAAU,SAAY,YAAY,EAAE,GAAG,WAAW,GAAG,MAAM;AAAA,EACpE,GAAG,CAAC,YAAY,SAAS,SAAS,KAAK,CAAC;AACxC,QAAM,gBAAgB;AAAA,IACpB,CAAC,UAA8C;AAC7C,kBAAY,KAAK;AACjB,UACE,MAAM,oBACN,MAAM,QAAQ,WACd,MAAM,YACN,MAAM,YAAY,aAClB;AACA;AAAA,MACF;AACA,YAAM,eAAe;AACrB,WAAK,YAAY,QAAQ,OAAO;AAAA,IAClC;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAEA,YAAU,MAAM;AACd,QAAI,WAAW,MAAM;AACnB;AAAA,IACF;AACA,WAAO,YAAY,CAAC,kBAAkB,KAAK;AAAA,EAC7C,GAAG,CAAC,kBAAkB,MAAM,CAAC;AAE7B,YAAU,MAAM;AACd,QAAI,WAAW,MAAM;AACnB;AAAA,IACF;AACA,WAAO,SAAS,WAAW,2BAA2B,YAAY,QAAQ,KAAK,GAAG;AAAA,MAChF,YAAY;AAAA,IACd,CAAC;AACD,mBAAe,UAAU;AACzB,WAAO,MAAM;AACX,qBAAe,UAAU;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,YAAU,MAAM;AACd,QAAI,WAAW,QAAQ,CAAC,eAAe,SAAS;AAC9C;AAAA,IACF;AACA,QAAI,qBAAqB,SAAS;AAChC,2BAAqB,UAAU;AAC/B;AAAA,IACF;AACA,UAAM,WAAW,2BAA2B,QAAQ,SAAS,UAAU,SAAS,QAAQ;AACxF,QAAI,SAAS,UAAU,SAAS,OAAO;AACrC;AAAA,IACF;AACA,WAAO,SAAS,WAAW,2BAA2B,SAAS,KAAK,GAAG;AAAA,MACrE,YAAY;AAAA,IACd,CAAC;AAAA,EACH,GAAG,CAAC,UAAU,MAAM,CAAC;AAErB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,UAAU,oBAAC,iBAAc,QAAgB;AAAA,MACzC,iBAAiB,mBAAmB,OAAO,MAAM,eAAe;AAAA,MAChE,aAAa;AAAA,MACb,cAAc,mBAAmB,aAAa;AAAA,MAC9C,WAAW;AAAA,MACX,OAAO;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACF,CAAC;AAQD,IAAM,wBAAwB;AAAA,EAC5B,SAASC,uBACP;AAAA,IACE,aAAa;AAAA,IACb,SAAS;AAAA,IACT,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,KACA;AACA,UAAM,WAAW,YAAY;AAC7B,UAAM,WAAW,OAAmC,IAAI;AACxD,UAAM,mBAAmB,OAAO,UAAU;AAC1C,UAAM,mBAAmB,QAAQ,MAAM,YAAY,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC;AACxE,UAAM,UAAU,cAAc,eAAe,QAAQ,GAAG,CAAC;AACzD,UAAM,UAAU,cAAc,eAAe,GAAG,OAAO;AAEvD,cAAU,MAAM;AACd,YAAM,gBAAgB,iBAAiB;AACvC,uBAAiB,UAAU;AAC3B,UAAI,CAAC,YAAY;AACf,YAAI,eAAe;AACjB,iCAAuB,SAAS,OAAO;AAAA,QACzC;AACA;AAAA,MACF;AACA,0BAAoB,SAAS,SAAS,EAAE,SAAS,QAAQ,CAAC;AAAA,IAC5D,CAAC;AAED,UAAM,eAAe;AAAA,MACnB,CAAC,UAA4C;AAC3C,mBAAW,KAAK;AAChB,YAAI,CAAC,MAAM,kBAAkB;AAC3B,mBAAS,SAAS,MAAM,cAAc,KAAK;AAC3C,mBAAS,YAAY,CAAC,CAAC;AACvB,cAAI,YAAY;AACd,gCAAoB,MAAM,eAAe,EAAE,SAAS,QAAQ,CAAC;AAAA,UAC/D;AAAA,QACF;AAAA,MACF;AAAA,MACA,CAAC,YAAY,UAAU,SAAS,SAAS,QAAQ;AAAA,IACnD;AAEA,UAAM,gBAAgB;AAAA,MACpB,CAAC,UAAmD;AAClD,oBAAY,KAAK;AACjB,YACE,MAAM,oBACN,MAAM,QAAQ,WACd,MAAM,YACN,MAAM,YAAY,aAClB;AACA;AAAA,QACF;AACA,cAAM,eAAe;AACrB,aAAK,SAAS,OAAO;AAAA,MACvB;AAAA,MACA,CAAC,UAAU,SAAS;AAAA,IACtB;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,cAAc,MAAM,YAAY,KAAK;AAAA,QACrC,UACE,MAAM,aAAa,SAAS,WAAW,eAAe,SAAS,WAAW;AAAA,QAC5E,UAAU;AAAA,QACV,WAAW;AAAA,QACX,MAAM,aAAa,UAAU;AAAA,QAC7B,OAAO,SAAS;AAAA,MAClB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,uBAAuB;AAC7B,IAAM,0BAAuD,CAAC;AA2B9D,IAAM,0BAA0B,QAAQ,OAEtC;AAAA,EACA,MAAM;AAAA,EAEN,gBAAgB;AACd,WAAO;AAAA,MACL,IAAI;AAAA,QACF,SAAS;AAAA,QACT,WAAW,CAAC,YAAY,QAAQ,aAAa,SAAS;AAAA,QACtD,YAAY,CAAC,eACX,WAAW,OAAO,UAAa,WAAW,OAAO,OAC7C,CAAC,IACD,EAAE,WAAW,OAAO,WAAW,EAAE,EAAE;AAAA,MAC3C;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,WAAW,CAAC,YAAY,QAAQ,aAAa,YAAY;AAAA,QACzD,YAAY,CAAC,eACX,WAAW,UAAU,UAAa,WAAW,UAAU,OACnD,CAAC,IACD,EAAE,cAAc,OAAO,WAAW,KAAK,EAAE;AAAA,MACjD;AAAA,MACA,uBAAuB;AAAA,QACrB,SAAS;AAAA,QACT,WAAW,CAAC,YAAY,QAAQ,aAAa,8BAA8B;AAAA,QAC3E,YAAY,CAAC,gBAAgB;AAAA,UAC3B,gCAAgC,WAAW;AAAA,QAC7C;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAAC,YAAY,QAAQ,aAAa,iBAAiB;AAAA,QAC9D,YAAY,CAAC,eACX,WAAW,cAAc,UAAa,WAAW,cAAc,OAC3D,CAAC,IACD,EAAE,mBAAmB,OAAO,WAAW,SAAS,EAAE;AAAA,MAC1D;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,WAAW,CAAC,YAAY,QAAQ,aAAa,WAAW;AAAA,QACxD,YAAY,CAAC,eACX,WAAW,SAAS,UAAa,WAAW,SAAS,OACjD,CAAC,IACD,EAAE,aAAa,OAAO,WAAW,IAAI,EAAE;AAAA,MAC/C;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,WAAW,CAAC,YAAY,kBAAkB,QAAQ,aAAa,kBAAkB,CAAC;AAAA,QAClF,YAAY,CAAC,eAAe;AAC1B,cAAI,WAAW,SAAS,OAAW,QAAO,CAAC;AAC3C,cAAI,CAAC,qBAAqB,WAAW,IAAI,GAAG;AAC1C,kBAAM,IAAI,UAAU,4CAA4C;AAAA,UAClE;AACA,iBAAO,EAAE,oBAAoB,KAAK,UAAU,WAAW,IAAI,EAAE;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,SAAS,mBACP,iBACA,aACA;AACA,SAAO,SAAS,mBAAmB,EAAE,KAAK,GAAkB;AAC1D,UAAM,QAAQ,KAAK;AACnB,UAAM,EAAE,OAAO,QAAQ,GAAG,OAAO,IAAI;AAAA,MACnC;AAAA,MACA;AAAA,MACA,YAAY,QAAQ;AAAA,MACpB,YAAY,QAAQ;AAAA,IACtB;AACA,WACE,oBAAC,mBAAgB,IAAG,QACjB,0BAAgB,UAAU,MAAM,KAAK,OAAO,MAC/C;AAAA,EAEJ;AACF;AAEA,SAAS,wBAAwB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA+C;AAC7C,QAAM,kBACJ,oBAAoB,SAChB,0BACA,wBAAwB,OAAO;AAAA,IAC7B,cAAc;AACZ,aAAO,sBAAsB,mBAAmB,iBAAiB,WAAW,GAAG;AAAA,QAC7E,IAAI;AAAA,MACN,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACP,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,UAAU,gBAAgB,SAAY,CAAC,IAAI,EAAE,YAAY,CAAC;AAAA,IACtE,gBAAgB,UAAU;AAAA,MACxB,gBAAgB,CAAC;AAAA,MACjB,4BAA4B;AAAA,MAC5B,YAAY,CAAC,EAAE,KAAK,MAAM,mBAAmB,KAAK,KAA4B;AAAA,MAC9E,YAAY,CAAC,EAAE,MAAM,QAAQ,MAAM;AAAA,QACjC;AAAA,QACA,gBAAgB,QAAQ,gBAAgB,CAAC,CAAC;AAAA,QAC1C,mBAAmB,KAAK,KAA4B;AAAA,MACtD;AAAA,MACA,aAAa,SAAS,IAAI,CAAC,YAAY,mBAAmB,SAAS,WAAW,CAAC;AAAA,IACjF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,gCAAgC,OAAsB,aAAmC;AAChG,MACE,MAAM,oBACN,MAAM,QAAQ,WACd,MAAM,YACN,MAAM,eACN,YAAY,QAAQ,kBAAkB,QACtC;AACA,WAAO;AAAA,EACT;AACA,QAAM,eAAe;AACrB,OAAK,YAAY,QAAQ,OAAO;AAChC,SAAO;AACT;AAOA,SAAS,mBACP,SACA,aAC2B;AAC3B,QAAM,YAAY,IAAI,UAAU,0BAA0B,QAAQ,EAAE,EAAE;AAEtE,QAAM,aAAwC;AAAA,IAC5C;AAAA,IACA,MAAM,QAAQ;AAAA,IACd,OAAO,CAAC,EAAE,OAAO,OAAO,MACtB,oBAAoB,SAAS,OAAO,YAAY,SAAS,MAAM;AAAA,IACjE,SAAS,CAAC;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAIM;AACJ,YAAM,YAAY,OAAO,MAAM,UAAU,IAAI;AAC7C,YAAM,gBAAgB,WAAW,MAAM,WAAW,GAAG;AACrD,YAAM,cAAc;AAAA,QAClB,MAAM,MAAM;AAAA,QACZ,IAAI,gBAAgB,MAAM,KAAK,IAAI,MAAM;AAAA,MAC3C;AACA,aACG,MAAM,EACN,MAAM,EACN,gBAAgB,aAAa;AAAA,QAC5B;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,MACF,CAAC,EACA,IAAI;AACP,kCAA4B,MAAM,GAAG,aAAa,aAAa,GAAG,cAAc;AAChF,kBAAY,QAAQ,iBAAiB,MAAS;AAAA,IAChD;AAAA,IACA,QAAQ,OAAO;AAAA,MACb,SAAS,CAAC,UAA0E;AAClF,mCAA2B,SAAS,OAAO,WAAW;AAAA,MACxD;AAAA,MACA,UAAU,CAAC,UAA0E;AACnF,mCAA2B,SAAS,OAAO,WAAW;AAAA,MACxD;AAAA,MACA,QAAQ,MAAM;AACZ,oBAAY,QAAQ;AAAA,UAAiB,CAAC,YACpC,SAAS,QAAQ,OAAO,QAAQ,KAAK,SAAY;AAAA,QACnD;AAAA,MACF;AAAA,MACA,WAAW,CAAC,UACV,6BAA6B,SAAS,OAAO,WAAW;AAAA,IAC5D;AAAA,EACF;AACA,MAAI,QAAQ,gBAAgB,OAAW,YAAW,cAAc,QAAQ;AACxE,MAAI,QAAQ,oBAAoB,QAAW;AACzC,eAAW,kBAAkB,QAAQ;AAAA,EACvC;AACA,MAAI,QAAQ,gBAAgB,OAAW,YAAW,cAAc,QAAQ;AACxE,MAAI,QAAQ,mBAAmB,QAAW;AACxC,eAAW,iBAAiB,QAAQ;AAAA,EACtC;AACA,SAAO;AACT;AAEA,SAAS,oBACP,SACA,OACA,UACA,QACkE;AAClE,MAAI,MAAM,QAAQ,QAAQ,KAAK,GAAG;AAChC,UAAM,kBAAkB,MAAM,YAAY;AAC1C,WAAO,QAAQ,MAAM,OAAO,CAAC,SAAS,KAAK,MAAM,YAAY,EAAE,SAAS,eAAe,CAAC;AAAA,EAC1F;AACA,SAAO,QAAQ,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA,OAAO,SAAS;AAAA,IAChB,UAAU,SAAS;AAAA,IACnB;AAAA,EACF,CAAC;AACH;AAEA,SAAS,4BAA4B,QAAsC;AACzE,QAAM,UAAU,OAAO,QAAQ;AAC/B,MAAI,YAAY,QAAQ,OAAO,YAAY,YAAY;AACrD,WAAO;AAAA,EACT;AACA,SAAO,WAAW,UAAU,QAAQ,MAAM,gBAAgB,QAAQ;AACpE;AAEA,SAAS,2BACP,SACA,OACA,aACM;AACN,QAAM,UAAU,YAAY,QAAQ;AACpC,QAAM,gBACJ,SAAS,QAAQ,OAAO,QAAQ,KAAK,WAAW,QAAQ,eAAe,MAAM,MAAM,MAAM,IAAI;AAC/F,QAAM,OAAO,mBAAmB,KAAK;AACrC,QAAM,QAA8B;AAAA,IAClC;AAAA,IACA,OAAO,MAAM;AAAA,IACb,OAAO,MAAM;AAAA,IACb,SAAS,MAAM;AAAA,IACf;AAAA,IACA,YAAY,CAAC,SAAS;AACpB,UAAI,KAAK,UAAU;AACjB;AAAA,MACF;AACA,YAAM,QAAQ,yBAAyB,SAAS,IAAI,CAAC;AAAA,IACvD;AAAA,IACA,kBAAkB,CAAC,UAAU;AAC3B,kBAAY,QAAQ;AAAA,QAAiB,CAAC,WACpC,QAAQ,QAAQ,OAAO,QAAQ,KAC3B,EAAE,GAAG,QAAQ,eAAe,WAAW,OAAO,OAAO,MAAM,MAAM,EAAE,IACnE;AAAA,MACN;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,OAAW,OAAM,OAAO;AACrC,cAAY,QAAQ,iBAAiB,KAAK;AAC5C;AAEA,SAAS,6BACP,SACA,EAAE,MAAM,GACR,aACS;AACT,QAAM,gBAAgB,YAAY,QAAQ;AAC1C,MAAI,eAAe,QAAQ,OAAO,QAAQ,IAAI;AAC5C,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,aAAa;AAC7B,UAAM,eAAe;AACrB,kBAAc,iBAAiB,cAAc,gBAAgB,CAAC;AAC9D,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,WAAW;AAC3B,UAAM,eAAe;AACrB,kBAAc,iBAAiB,cAAc,gBAAgB,CAAC;AAC9D,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,OAAO;AAChD,UAAM,eAAe;AACrB,UAAM,OAAO,cAAc,MAAM,cAAc,aAAa;AAC5D,QAAI,SAAS,QAAW;AACtB,oBAAc,WAAW,IAAI;AAAA,IAC/B;AACA,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,UAAU;AAC1B,gBAAY,QAAQ,iBAAiB,MAAS;AAC9C,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,yBACP,SACA,MACqB;AACrB,MAAI,KAAK,SAAS,UAAa,CAAC,qBAAqB,KAAK,IAAI,GAAG;AAC/D,UAAM,IAAI,UAAU,kDAAkD;AAAA,EACxE;AACA,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT,OAAO,KAAK;AAAA,IACZ,uBAAuB,QAAQ;AAAA,IAC/B,WAAW,QAAQ;AAAA,IACnB,MAAM,gBAAgB,SAAS,IAAI;AAAA,IACnC,MAAM,KAAK;AAAA,EACb;AACF;AAEA,SAAS,gBACP,SACA,MACQ;AACR,SAAO,KAAK,QAAQ,GAAG,QAAQ,IAAI,GAAG,KAAK,KAAK;AAClD;AAEA,SAAS,mBACP,OAC8B;AAC9B,QAAM,OAAO,MAAM,aAAa;AAChC,MAAI,SAAS,UAAa,SAAS,MAAM;AACvC,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,KAAK,KAAK;AAAA,IACV,OAAO,KAAK;AAAA,IACZ,QAAQ,KAAK;AAAA,IACb,MAAM,KAAK;AAAA,IACX,OAAO,KAAK;AAAA,IACZ,QAAQ,KAAK;AAAA,EACf;AACF;AAEA,SAAS,WAAW,OAAe,QAAwB;AACzD,MAAI,UAAU,GAAG;AACf,WAAO;AAAA,EACT;AACA,UAAQ,QAAQ,UAAU;AAC5B;AAEA,SAAS,2BAA2B,OAA4B;AAC9D,QAAM,QAAQ,MAAM,WAAW,IAAI,CAAC,EAAE,IAAI,MAAM,MAAM,OAAO;AAC7D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,MAAM,IAAI,CAAC,SAAS;AAC3B,YAAM,YAAyB,EAAE,MAAM,YAAY;AACnD,UAAI,KAAK,SAAS,GAAG;AACnB,kBAAU,UAAU,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,CAAC;AAAA,MACnD;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;AAEA,SAAS,2BACP,QACA,kBACA,UAC0B;AAC1B,SAAO,4BAA4B,OAAO,QAAQ,GAAG,kBAAkB,QAAQ;AACjF;AAEA,SAAS,4BACP,SACA,kBACA,UAC0B;AAC1B,QAAM,WAA6B,CAAC;AACpC,MAAI,QAAQ;AACZ,MAAI,aAAa;AAEjB,QAAM,aAAa,CAAC,SAA4B;AAC9C,QAAI,KAAK,SAAS,OAAO;AACvB,iBAAW,SAAS,KAAK,WAAW,CAAC,GAAG;AACtC,mBAAW,KAAK;AAAA,MAClB;AACA;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,aAAa;AAC7B,UAAI,aAAa,GAAG;AAClB,iBAAS;AAAA,MACX;AACA,oBAAc;AACd,iBAAW,SAAS,KAAK,WAAW,CAAC,GAAG;AACtC,mBAAW,KAAK;AAAA,MAClB;AACA;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,QAAQ;AACxB,eAAS,KAAK,QAAQ;AACtB;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,aAAa;AAC7B,eAAS;AACT;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,sBAAsB;AACtC,YAAM,QAAQ,KAAK;AACnB,YAAM,SAAS,wBAAwB,OAAO,MAAM,QAAQ,kBAAkB,QAAQ;AACtF,eAAS,OAAO;AAChB,eAAS,KAAK,MAAM;AACpB;AAAA,IACF;AAEA,eAAW,SAAS,KAAK,WAAW,CAAC,GAAG;AACtC,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,aAAW,OAAO;AAClB,SAAO,EAAE,OAAO,SAAS;AAC3B;AAEA,SAAS,wBACP,OACA,MACA,kBACA,UACgB;AAChB,QAAM,KAAK,WAAW,OAAO,EAAE,KAAK;AACpC,QAAM,UAAU,WAAW,OAAO,qBAAqB,KAAK;AAC5D,QAAM,YACJ,WAAW,OAAO,SAAS,KAC3B,SAAS,KAAK,CAAC,cAAc,UAAU,SAAS,OAAO,GAAG,MAC1D;AACF,QAAM,QAAQ,WAAW,OAAO,KAAK,KAAK;AAC1C,QAAM,OAAO,mBAAmB,KAAK;AACrC,QAAM,WAAW,iBAAiB;AAAA,IAChC,CAACC,YAAWA,QAAO,OAAO,MAAMA,QAAO,cAAc,aAAaA,QAAO,YAAY;AAAA,EACvF;AACA,QAAM,OAAO,OAAO,SAAS,SAAY,UAAU,OAAO,MAAM;AAChE,QAAM,SAAyB;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,MACL;AAAA,MACA,IAAI,OAAO,KAAK;AAAA,IAClB;AAAA,EACF;AACA,MAAI,SAAS,OAAW,QAAO,OAAO;AACtC,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAgD;AAC1E,QAAM,OAAO,WAAW,OAAO,IAAI;AACnC,MAAI,SAAS,QAAW;AACtB,WAAO;AAAA,EACT;AACA,QAAM,UAAU,WAAW,OAAO,qBAAqB,KAAK;AAC5D,SAAO,GAAG,OAAO,GAAG,WAAW,OAAO,KAAK,KAAK,WAAW,OAAO,EAAE,KAAK,EAAE;AAC7E;AAEA,SAAS,WAAW,OAAoC;AACtD,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,kBAAkB,OAAsD;AAC/E,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,SAAkB,KAAK,MAAM,KAAK;AACxC,WAAO,qBAAqB,MAAM,IAAI,SAAS;AAAA,EACjD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAOA,SAAS,oBACP,OACA,EAAE,SAAS,QAAQ,GACb;AACN,MAAI,UAAU,MAAM;AAClB;AAAA,EACF;AAEA,QAAM,QAAQ,iBAAiB,KAAK;AACpC,QAAM,aAAa,oBAAoB,KAAK;AAC5C,QAAM,gBAAgB,WAAW,MAAM,UAAU,IAAI,WAAW,MAAM,aAAa;AACnF,QAAM,eAAe,WAAW,MAAM,cAAc,IAAI,WAAW,MAAM,iBAAiB;AAC1F,QAAM,mBAAmB,aAAa;AACtC,QAAM,mBAAmB,KAAK,IAAI,kBAAkB,aAAa,OAAO;AAExE,QAAM,MAAM,SAAS;AACrB,QAAM,sBAAsB,KAAK,IAAI,MAAM,eAAe,eAAe,CAAC;AAC1E,QAAM,gBAAgB,MAAM,qBAAqB,kBAAkB,gBAAgB;AACnF,QAAM,aACJ,MAAM,cAAc,eAAe,gBAAgB,gBAAgB,eAAe;AAEpF,QAAM,MAAM,SAAS,GAAG,KAAK,KAAK,UAAU,CAAC;AAC7C,QAAM,MAAM,YAAY,sBAAsB,mBAAmB,SAAS;AAC5E;AAEA,SAAS,uBAAuB,OAAyC;AACvE,MAAI,UAAU,MAAM;AAClB;AAAA,EACF;AACA,QAAM,MAAM,SAAS;AACrB,QAAM,MAAM,YAAY;AAC1B;AAEA,SAAS,cAAc,OAAe,KAAqB;AACzD,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,WAAO;AAAA,EACT;AACA,SAAO,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,CAAC;AACxC;AAEA,SAAS,oBAAoB,OAAoC;AAC/D,SAAO,WAAW,MAAM,UAAU,MAAM,WAAW,MAAM,QAAQ,KAAK,MAAM;AAC9E;AAEA,SAAS,WAAW,OAAuB;AACzC,QAAM,SAAS,OAAO,WAAW,KAAK;AACtC,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEA,SAAS,MAAM,OAAe,KAAa,KAAqB;AAC9D,SAAO,KAAK,IAAI,KAAK,IAAI,OAAO,GAAG,GAAG,GAAG;AAC3C;AAEA,SAAS,gBACP,QACA,OACwC;AACxC,QAAM,aAAa,MAAM,KACtB,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,EACzB,KAAK,IAAI;AACZ,MAAI,OAAO,KAAK,EAAE,WAAW,GAAG;AAC9B,WAAO,EAAE,MAAM,YAAY,cAAc,EAAE;AAAA,EAC7C;AACA,QAAM,SAAS,GAAG,UAAU;AAAA;AAAA;AAC5B,SAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,IAAI,cAAc,OAAO,OAAO;AACnE;AAEA,SAAS,eAAe,OAA6D;AACnF,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ,WAAW,MAAM;AAAA,EACnB;AACF;AASA,SAAS,uBACP,OACA,UACoC;AACpC,MAAI,UAAU,UAAa,SAAS,WAAW,GAAG;AAChD,WAAO;AAAA,EACT;AACA,QAAM,WAAmC,CAAC;AAC1C,MAAI,UAAU,OAAW,UAAS,QAAQ;AAC1C,MAAI,SAAS,SAAS,GAAG;AACvB,aAAS,WAAW,EAAE,UAAU,SAAS,IAAI,sBAAsB,EAAE;AAAA,EACvE;AACA,SAAO;AACT;AAEA,SAAS,2BAA2B,UAA2C;AAC7E,aAAW,UAAU,UAAU;AAC7B,QAAI,OAAO,SAAS,UAAa,CAAC,qBAAqB,OAAO,IAAI,GAAG;AACnE,YAAM,IAAI,UAAU,4CAA4C;AAAA,IAClE;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,QAAwC;AACtE,QAAM,WAA2B;AAAA,IAC/B,IAAI,OAAO;AAAA,IACX,WAAW,OAAO;AAAA,IAClB,SAAS,OAAO;AAAA,IAChB,OAAO,OAAO;AAAA,IACd,MAAM,OAAO;AAAA,IACb,OAAO,EAAE,MAAM,OAAO,MAAM,MAAM,IAAI,OAAO,MAAM,GAAG;AAAA,EACxD;AACA,MAAI,OAAO,SAAS,QAAW;AAC7B,aAAS,OAAO,OAAO;AAAA,EACzB;AACA,SAAO;AACT;AAEA,IAAM,iBAAiB;AAAA,EACrB,SAASC,gBAAe,OAAO,KAAK;AAClC,UAAM,WAAW,YAAY;AAC7B,UAAM,WAAW,MAAM,YAAY,CAAC,SAAS;AAE7C,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,UAAU,MAAM,YAAY;AAAA,QAC5B;AAAA,QACA,MAAM,MAAM,QAAQ;AAAA,QACpB,cAAc,WAAW,aAAa;AAAA,MACxC;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,eAAe,WAAwD,SAASC,cACpF,EAAE,SAAS,GAAG,MAAM,GACpB,KACA;AACA,QAAM,WAAW,YAAY;AAC7B,QAAM,WAAW,MAAM,YAAY,CAAC,SAAS;AAE7C,QAAM,cAAc;AAAA,IAClB,CAAC,UAAyC;AACxC,gBAAU,KAAK;AACf,UAAI,MAAM,oBAAoB,UAAU;AACtC;AAAA,MACF;AACA,eAAS,KAAK;AAAA,IAChB;AAAA,IACA,CAAC,UAAU,UAAU,OAAO;AAAA,EAC9B;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,UAAU,MAAM,YAAY;AAAA,MAC5B;AAAA,MACA,SAAS;AAAA,MACT,MAAM,MAAM,QAAQ;AAAA,MACpB,cAAc,WAAW,aAAa;AAAA,IACxC;AAAA,IACA;AAAA,EACF;AACF,CAAC;AASD,IAAM,sBAAsB;AAAA,EAC1B,SAASC,qBAAoB,EAAE,UAAU,cAAc,OAAO,OAAO,GAAG,MAAM,GAAG,KAAK;AACpF,UAAM,WAAW,YAAY;AAC7B,UAAM,gBAAgB,SAAS;AAC/B,UAAM,QAAQ,kBAAkB;AAChC,QAAI,SAAS,CAAC,aAAa;AACzB,aAAO;AAAA,IACT;AAEA,UAAM,YACJ,eAAe,SAAS,SACpB,QACC;AAAA,MACC,UAAU;AAAA,MACV,KAAK,cAAc,KAAK;AAAA,MACxB,MAAM,cAAc,KAAK;AAAA,MACzB,GAAG;AAAA,IACL;AACN,UAAM,mBACJ,kBAAkB,SACd,OAAO,aAAa,aAClB,OACA,WACF,OAAO,aAAa,aAClB,SAAS,aAAa,IACrB,YACD,cAAc,MAAM,IAAI,CAAC,MAAM,UAC7B,oBAAC,uBAA2D,SAAlC,GAAG,KAAK,EAAE,IAAI,MAAM,SAAS,CAAC,EAAkB,CAC3E;AAET,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,UAAU;AAAA,QACV,MAAM,MAAM,QAAQ;AAAA,QACpB,OAAO;AAAA,QACP,cACE,kBAAkB,SACd,WACA,cAAc,UACZ,YACA,QACE,UACA;AAAA,MACZ;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAYA,IAAM,sBAAsB;AAAA,EAC1B,SAASC,qBACP,EAAE,UAAU,OAAO,MAAM,UAAU,SAAS,cAAc,GAAG,MAAM,GACnE,KACA;AACA,UAAM,WAAW,YAAY;AAC7B,UAAM,gBAAgB,SAAS;AAC/B,UAAM,YAAY,SAAS;AAC3B,UAAM,OAAO,YAAY,eAAe,MAAM,SAAS;AACvD,QAAI,kBAAkB,UAAa,SAAS,QAAW;AACrD,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,cAAc,kBAAkB;AACjD,UAAM,WAAW,MAAM,YAAY,KAAK,YAAY;AACpD,UAAM,mBACJ,OAAO,aAAa,aAAa,SAAS,MAAM,aAAa,IAAK,YAAY,KAAK;AAErF,UAAM,mBAAmB,CAAC,UAAyC;AACjE,qBAAe,KAAK;AACpB,UAAI,CAAC,MAAM,oBAAoB,CAAC,UAAU;AACxC,sBAAc,iBAAiB,SAAS;AAAA,MAC1C;AAAA,IACF;AACA,UAAM,cAAc,CAAC,UAAyC;AAC5D,gBAAU,KAAK;AACf,UAAI,CAAC,MAAM,oBAAoB,CAAC,UAAU;AACxC,sBAAc,WAAW,IAAI;AAAA,MAC/B;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,UAAU;AAAA,QACV;AAAA,QACA,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM,MAAM,QAAQ;AAAA,QACpB,MAAM,MAAM,QAAQ;AAAA,QACpB,iBAAiB;AAAA,QACjB,cAAc,WAAW,aAAa,WAAW,aAAa;AAAA,MAChE;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AASA,IAAM,sBAAsB;AAAA,EAC1B,SAASC,qBAAoB,EAAE,UAAU,cAAc,OAAO,GAAG,MAAM,GAAG,KAAK;AAC7E,UAAM,WAAW,YAAY;AAC7B,UAAM,QAAQ,SAAS,YAAY,WAAW;AAC9C,QAAI,SAAS,CAAC,aAAa;AACzB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,UAAU,SAAS,YAAY,IAAI,CAAC,eAClC;AAAA,UAAC;AAAA;AAAA,YAEC,OAAO;AAAA,cACL;AAAA,cACA,QAAQ,MAAM;AACZ,yBAAS,iBAAiB,WAAW,EAAE;AAAA,cACzC;AAAA,YACF;AAAA,YAEC,iBAAO,aAAa,aACjB,SAAS,UAAU,IAClB,YAAY,oBAAC,oBAAoB,MAApB,EAAyB;AAAA;AAAA,UAVtC,WAAW;AAAA,QAWlB,CACD;AAAA,QACD,aAAa;AAAA,QACb,cAAc,QAAQ,UAAU;AAAA,MAClC;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AASA,IAAM,0BAA0B;AAAA,EAC9B,SAASC,yBAAwB,EAAE,UAAU,GAAG,MAAM,GAAG,KAAK;AAC5D,UAAM,WAAW,YAAY;AAC7B,UAAM,WACJ,MAAM,aAAa,SAAS,WAAW,eAAe,SAAS,WAAW;AAE5E,UAAM,eAAe;AAAA,MACnB,OAAO,UAAyC;AAC9C,mBAAW,KAAK;AAChB,YAAI,MAAM,kBAAkB;AAC1B;AAAA,QACF;AACA,cAAM,QAAQ,MAAM,KAAK,MAAM,cAAc,SAAS,CAAC,CAAC;AACxD,cAAM,cAAc,QAAQ;AAC5B,mBAAW,QAAQ,OAAO;AACxB,gBAAM,SAAS,cAAc,IAAI;AAAA,QACnC;AAAA,MACF;AAAA,MACA,CAAC,UAAU,QAAQ;AAAA,IACrB;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH;AAAA,QACA,UAAU,CAAC,UAAU;AACnB,eAAK,aAAa,KAAK;AAAA,QACzB;AAAA,QACA,MAAM;AAAA,QACN,cAAc,WAAW,aAAa;AAAA,MACxC;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,wBAAwB;AAAA,EAC5B,SAASC,uBAAsB,EAAE,QAAQ,WAAW,OAAO,SAAS,GAAG,MAAM,GAAG,KAAK;AACnF,UAAM,WAAW,YAAY;AAC7B,UAAM,WAAW,OAAgC,IAAI;AACrD,UAAM,WACJ,MAAM,aAAa,SAAS,WAAW,eAAe,SAAS,WAAW;AAE5E,UAAM,cAAc;AAAA,MAClB,CAAC,UAAyC;AACxC,kBAAU,KAAK;AACf,YAAI,MAAM,oBAAoB,UAAU;AACtC;AAAA,QACF;AACA,iBAAS,SAAS,MAAM;AAAA,MAC1B;AAAA,MACA,CAAC,UAAU,OAAO;AAAA,IACpB;AAEA,WACE,iCACG;AAAA;AAAA,QACC;AAAA,QACA;AAAA,UACE,GAAG;AAAA,UACH,UAAU,MAAM,YAAY;AAAA,UAC5B;AAAA,UACA,SAAS;AAAA,UACT,MAAM,MAAM,QAAQ;AAAA,UACpB,cAAc,WAAW,aAAa;AAAA,QACxC;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,eAAY;AAAA,UACZ,QAAM;AAAA,UACN;AAAA,UACA,KAAK;AAAA,UACL,UAAU;AAAA;AAAA,MACZ;AAAA,OACF;AAAA,EAEJ;AACF;AAMA,IAAM,6BAA6B;AAAA,EACjC,SAASC,4BACP,EAAE,UAAU,eAAe,OAAO,aAAa,YAAY,QAAQ,GAAG,MAAM,GAC5E,KACA;AACA,UAAM,WAAW,YAAY;AAC7B,UAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,UAAM,WACJ,gBAAgB,SAAS,WAAW,eAAe,SAAS,WAAW;AAEzE,UAAM,iBAAiB;AAAA,MACrB,CAAC,UAAqC;AACpC,qBAAa,KAAK;AAClB,YAAI,MAAM,oBAAoB,UAAU;AACtC;AAAA,QACF;AACA,cAAM,eAAe;AACrB,oBAAY,IAAI;AAAA,MAClB;AAAA,MACA,CAAC,UAAU,UAAU;AAAA,IACvB;AAEA,UAAM,kBAAkB;AAAA,MACtB,CAAC,UAAqC;AACpC,sBAAc,KAAK;AACnB,YAAI,CAAC,MAAM,kBAAkB;AAC3B,sBAAY,KAAK;AAAA,QACnB;AAAA,MACF;AAAA,MACA,CAAC,WAAW;AAAA,IACd;AAEA,UAAM,aAAa;AAAA,MACjB,CAAC,UAAqC;AACpC,iBAAS,KAAK;AACd,YAAI,MAAM,oBAAoB,UAAU;AACtC;AAAA,QACF;AACA,cAAM,eAAe;AACrB,oBAAY,KAAK;AACjB,cAAM,QAAQ,MAAM,KAAK,MAAM,aAAa,KAAK;AACjD,aAAK,QAAQ,IAAI,MAAM,IAAI,CAAC,SAAS,SAAS,cAAc,IAAI,CAAC,CAAC;AAAA,MACpE;AAAA,MACA,CAAC,UAAU,UAAU,MAAM;AAAA,IAC7B;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,cAAc,WAAW,aAAa,WAAW,aAAa;AAAA,MAChE;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,YAA8C;AACtE,SAAO;AAAA,IACL,GAAG;AAAA,IACH,IAAI,WAAW,MAAM,mBAAmB;AAAA,EAC1C;AACF;AAEA,SAAS,sBAAsB,YAA2D;AACxF,SAAO,OAAO,SAAS,eAAe,sBAAsB;AAC9D;AAEA,eAAe,mBAAmB,MAAmC;AACnE,SAAO;AAAA,IACL,IAAI,mBAAmB;AAAA,IACvB,MAAM,KAAK,KAAK,WAAW,QAAQ,IAAI,UAAU;AAAA,IACjD,MAAM,KAAK;AAAA,IACX,WAAW,KAAK,KAAK,SAAS,IAAI,KAAK,OAAO;AAAA,IAC9C,MAAM,MAAM,aAAa,IAAI;AAAA,EAC/B;AACF;AAEA,eAAe,aAAa,MAA6B;AACvD,QAAM,UAAU,MAAM,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC7D,UAAM,SAAS,IAAI,WAAW;AAC9B,WAAO,iBAAiB,QAAQ,MAAM;AACpC,cAAQ,OAAO,OAAO,UAAU,EAAE,CAAC;AAAA,IACrC,CAAC;AACD,WAAO,iBAAiB,SAAS,MAAM;AACrC,aAAO,OAAO,SAAS,IAAI,MAAM,4BAA4B,CAAC;AAAA,IAChE,CAAC;AACD,WAAO,cAAc,IAAI;AAAA,EAC3B,CAAC;AACD,SAAO,QAAQ,SAAS,GAAG,IAAI,QAAQ,MAAM,QAAQ,QAAQ,GAAG,IAAI,CAAC,IAAI;AAC3E;AAEA,IAAI,mBAAmB;AAEvB,SAAS,qBAA6B;AACpC,QAAM,SAAS,WAAW,QAAQ,aAAa;AAC/C,MAAI,WAAW,QAAW;AACxB,WAAO,cAAc,MAAM;AAAA,EAC7B;AACA,sBAAoB;AACpB,SAAO,cAAc,iBAAiB,SAAS,EAAE,CAAC;AACpD;AAEO,IAAM,oBAAoB;AAAA,EAC/B,MAAM;AAAA,EACN,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,eAAe;AAAA,EACf,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,QAAQ;AAAA,EACR,MAAM;AACR;;;AC3tDA;AAAA,EACE,YAAAC;AAAA,EACA,cAAAC;AAAA,EAIA,eAAAC;AAAA,EACA,aAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OACK;AAkCD,gBAAAC,MAgUF,QAAAC,aAhUE;AAnBN,IAAM,aAAaC;AAAA,EACjB,SAASC,YAAW,OAAO,KAAK;AAC9B,UAAM,OAAO,eAAe;AAC5B,UAAM,cAAcC,QAA2B,IAAI;AACnD,UAAM,cAAcA,QAA2B,IAAI;AACnD,UAAM,CAAC,UAAU,WAAW,IAAIC,UAAS,IAAI;AAC7C,UAAM,iBAAiBC,aAAY,CAAC,WAA2B,aAAa;AAC1E,YAAM,WAAW,YAAY;AAC7B,UAAI,aAAa,MAAM;AACrB;AAAA,MACF;AACA,eAAS,SAAS,EAAE,KAAK,SAAS,cAAc,SAAS,CAAC;AAAA,IAC5D,GAAG,CAAC,CAAC;AACL,UAAM,SAASC;AAAA,MACb,OAAO,EAAE,aAAa,aAAa,UAAU,aAAa,eAAe;AAAA,MACzE,CAAC,UAAU,cAAc;AAAA,IAC3B;AAEA,WACE,gBAAAP,KAAC,0BAAuB,OAAO,QAC5B;AAAA,MACC;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,cAAc,KAAK;AAAA,MACrB;AAAA,MACA;AAAA,IACF,GACF;AAAA,EAEJ;AACF;AAMA,IAAM,iBAAiBE,YAAgD,SAASM,gBAC9E,EAAE,aAAa,MAAM,UAAU,GAAG,MAAM,GACxC,KACA;AACA,QAAM,OAAO,eAAe;AAC5B,QAAM,SAAS,UAAU;AACzB,QAAM,WAAW,KAAK;AACtB,QAAM,cAAcD;AAAA,IAClB,MACE,YAA4B,KAAK,CAAC,SAAS;AACzC,aAAO,YAAY,UAAU;AAAA,IAC/B,CAAC;AAAA,IACH,CAAC,KAAK,OAAO,WAAW;AAAA,EAC1B;AAEA,EAAAE,WAAU,MAAM;AACd,UAAM,cAAc,SAAS,SAAS;AACtC,QAAI,eAAe,OAAO,YAAY,CAAC,cAAc;AACnD,aAAO,eAAe,MAAM;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,YAAY,UAAU,MAAM,CAAC;AAEjC,EAAAA,WAAU,MAAM;AACd,UAAM,WAAW,OAAO,YAAY;AACpC,QAAI,aAAa,QAAQ,CAAC,cAAc,OAAO,mBAAmB,YAAY;AAC5E;AAAA,IACF;AACA,UAAM,UAAU,OAAO,YAAY;AACnC,QAAI,YAAY,MAAM;AACpB;AAAA,IACF;AACA,UAAM,WAAW,IAAI,eAAe,MAAM;AACxC,UAAI,OAAO,UAAU;AACnB,eAAO,eAAe,MAAM;AAAA,MAC9B;AAAA,IACF,CAAC;AACD,aAAS,QAAQ,QAAQ;AACzB,aAAS,QAAQ,OAAO;AACxB,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,YAAY,MAAM,CAAC;AAEvB,QAAM,eAAeH;AAAA,IACnB,CAAC,UAAmC;AAClC,iBAAW,KAAK;AAChB,YAAM,OAAO,MAAM;AACnB,YAAM,qBAAqB,KAAK,eAAe,KAAK,YAAY,KAAK;AACrE,aAAO,YAAY,qBAAqB,EAAE;AAAA,IAC5C;AAAA,IACA,CAAC,UAAU,MAAM;AAAA,EACnB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,UAAU;AAAA,MACV,cAAc,OAAO,WAAW,WAAW;AAAA,IAC7C;AAAA,IACA;AAAA,EACF;AACF,CAAC;AAED,IAAM,uBAAuBJ;AAAA,EAC3B,SAASQ,sBAAqB,OAAO,KAAK;AACxC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,cAAcR;AAAA,EAClB,SAASS,aAAY,OAAO,KAAK;AAC/B,UAAM,OAAO,eAAe;AAC5B,QAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAMA,IAAM,eAAeT,YAA8C,SAASU,cAC1E,EAAE,UAAU,GAAG,MAAM,GACrB,KACA;AACA,QAAM,OAAO,eAAe;AAC5B,QAAM,mBAAmB,OAAO,aAAa,aAAa,SAAS,KAAK,MAAM,IAAI;AAElF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,UAAU,oBAAoB,KAAK;AAAA,MACnC,cAAc,KAAK;AAAA,IACrB;AAAA,IACA;AAAA,EACF;AACF,CAAC;AAED,IAAM,gBAAgBV;AAAA,EACpB,SAASW,eAAc,OAAO,KAAK;AACjC,UAAM,OAAO,eAAe;AAC5B,QAAI,KAAK,WAAW,eAAe,KAAK,WAAW,aAAa;AAC9D,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,UAAU,MAAM,YAAY;AAAA,MAC9B;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAMA,IAAM,cAAcX,YAA6C,SAASY,aACxE,EAAE,UAAU,GAAG,MAAM,GACrB,KACA;AACA,QAAM,OAAO,eAAe;AAC5B,MAAI,KAAK,WAAW,WAAW,KAAK,UAAU,QAAW;AACvD,WAAO;AAAA,EACT;AACA,QAAM,mBAAmB,OAAO,aAAa,aAAa,SAAS,KAAK,KAAK,IAAI;AAEjF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,UAAU,oBAAoB,aAAa,KAAK,KAAK;AAAA,MACrD,MAAM,MAAM,QAAQ;AAAA,IACtB;AAAA,IACA;AAAA,EACF;AACF,CAAC;AAOD,IAAM,iBAAiBZ,YAAgD,SAASa,gBAC9E,EAAE,UAAU,cAAc,MAAM,GAAG,MAAM,GACzC,KACA;AACA,QAAM,OAAO,eAAe;AAC5B,QAAM,SAAS,UAAU;AACzB,QAAM,cAAcR;AAAA,IAClB,MACE,YAA4B,KAAK,CAAC,SAAS;AACzC,aAAO,YAAY,UAAU;AAAA,IAC/B,CAAC;AAAA,IACH,CAAC,KAAK,OAAO,WAAW;AAAA,EAC1B;AACA,QAAM,QAAQ,KAAK,SAAS,WAAW;AACvC,MAAI,SAAS,CAAC,aAAa;AACzB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,UAAU,KAAK,SAAS,IAAI,CAAC,YAC3B,gBAAAP,KAAC,2BAAyC,SACvC,iBAAO,aAAa,aAAa,SAAS,OAAO,IAAK,YAAY,eAAe,KADtD,QAAQ,EAEtC,CACD;AAAA,MACD,cAAc,QAAQ,UAAU;AAAA,IAClC;AAAA,IACA;AAAA,EACF;AACF,CAAC;AAOD,IAAM,oBAAoBE;AAAA,EACxB,SAASc,mBAAkB,EAAE,UAAU,cAAc,OAAO,GAAG,MAAM,GAAG,KAAK;AAC3E,UAAM,OAAO,eAAe;AAC5B,UAAM,cAAc,KAAK,eAAe,CAAC;AACzC,UAAM,QAAQ,YAAY,WAAW;AACrC,QAAI,SAAS,CAAC,aAAa;AACzB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,UAAU,YAAY;AAAA,UAAI,CAAC,eACzB,OAAO,aAAa,aAClB,gBAAAhB,KAACiB,WAAA,EAA8B,mBAAS,UAAU,KAAnC,WAAW,EAA0B,IAEpD,gBAAAjB,KAAC,oBAAqC,YACnC,YADoB,WAAW,EAElC;AAAA,QAEJ;AAAA,QACA,aAAa;AAAA,QACb,cAAc,QAAQ,UAAU;AAAA,MAClC;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAQA,IAAM,mBAAmBE;AAAA,EACvB,SAASgB,kBAAiB,EAAE,SAAS,QAAQ,YAAY,GAAG,MAAM,GAAG,KAAK;AACxE,UAAM,OAAO,eAAe;AAC5B,UAAM,mBAAmB,UAAU,YAAY,UAAU;AACzD,UAAM,WACJ,MAAM,aACL,iBAAiB,WAAW,KAAK,KAAK,WAAW,eAAe,KAAK,WAAW;AAEnF,UAAM,cAAcZ;AAAA,MAClB,CAAC,UAAyC;AACxC,kBAAU,KAAK;AACf,YAAI,MAAM,oBAAoB,UAAU;AACtC;AAAA,QACF;AACA,aAAK,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAAA,MAClD;AAAA,MACA,CAAC,MAAM,UAAU,SAAS,gBAAgB;AAAA,IAC5C;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,UAAU,MAAM,YAAY,YAAY,SAAS;AAAA,QACjD;AAAA,QACA,SAAS;AAAA,QACT,MAAM,MAAM,QAAQ;AAAA,QACpB,cAAc,WAAW,aAAa;AAAA,MACxC;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,uBAAuBJ;AAAA,EAC3B,SAASiB,sBAAqB,EAAE,SAAS,GAAG,MAAM,GAAG,KAAK;AACxD,UAAM,SAAS,UAAU;AACzB,UAAM,WAAW,MAAM,YAAY,OAAO;AAE1C,UAAM,cAAcb;AAAA,MAClB,CAAC,UAAyC;AACxC,kBAAU,KAAK;AACf,YAAI,MAAM,oBAAoB,UAAU;AACtC;AAAA,QACF;AACA,eAAO,eAAe;AAAA,MACxB;AAAA,MACA,CAAC,UAAU,SAAS,MAAM;AAAA,IAC5B;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,UAAU,MAAM,YAAY;AAAA,QAC5B;AAAA,QACA,SAAS;AAAA,QACT,MAAM,MAAM,QAAQ;AAAA,QACpB,cAAc,OAAO,WAAW,WAAW;AAAA,MAC7C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,iBAA4B;AACnC,SACE,gBAAAL,MAAC,iBAAiB,MAAjB,EACC;AAAA,oBAAAD,KAAC,iBAAiB,SAAjB,EACC,0BAAAA,KAAC,iBAAiB,OAAjB,EAAuB,GAC1B;AAAA,IACA,gBAAAA,KAAC,iBAAiB,SAAjB,EAAyB;AAAA,KAC5B;AAEJ;AAEA,SAAS,aAAa,OAAwB;AAC5C,MAAI,iBAAiB,OAAO;AAC1B,WAAO,MAAM;AAAA,EACf;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,IAAM,kBAAkB;AAAA,EAC7B,MAAM;AAAA,EACN,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,gBAAgB;AAClB;","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"]}
package/dist/index.d.ts CHANGED
@@ -9,7 +9,7 @@ export { M as MessageContextValue, a as MessagePartContextValue, u as useMessage
9
9
  export { S as SelectionToolbarContextValue, a as SelectionToolbarSelection, u as useSelectionToolbar } from './selection-toolbar-Cwjbuv5S.js';
10
10
  export { T as ThreadContextValue, u as useThread } from './thread-Bz6-1zaJ.js';
11
11
  export { T as ThreadListController, a as ThreadListItemContextValue, b as ThreadListProvider, c as ThreadListProviderProps, d as ThreadListRecord, u as useThreadList, e as useThreadListItem } from './thread-list-On8db4XL.js';
12
- export { ComposerPrimitive, ComposerSubmitMessage, ComposerSubmitMessageArgs, ThreadPrimitive } from './chat/index.js';
12
+ export { ComposerInputEntity, ComposerPrimitive, ComposerSubmitMessage, ComposerSubmitMessageArgs, ThreadPrimitive } from './chat/index.js';
13
13
  export { CompletionPrimitive } from './completion/index.js';
14
14
  import * as react from 'react';
15
15
  import { ReactNode } from 'react';
package/dist/index.js CHANGED
@@ -8,7 +8,7 @@ import {
8
8
  import {
9
9
  ComposerPrimitive,
10
10
  ThreadPrimitive
11
- } from "./chunk-Y2KAMPVJ.js";
11
+ } from "./chunk-T4IYUEPH.js";
12
12
  import {
13
13
  MessagePrimitive
14
14
  } from "./chunk-W2AHKMRS.js";
@@ -183,7 +183,7 @@ var SandboxDesktop = forwardRef(
183
183
  const [status, setStatus] = useState({ state: "loading" });
184
184
  const [control, setControl] = useState(void 0);
185
185
  const [notice, setNotice] = useState(void 0);
186
- const viewOnly = readOnly || control?.readOnly === true || control?.held === true && !control.you;
186
+ const viewOnly = readOnly || control?.readOnly === true || control?.you !== true;
187
187
  const latest = useRef({
188
188
  ticket,
189
189
  reconnect,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/sandbox-desktop/desktop.tsx","../../src/sandbox-desktop/vnc-channel.ts","../../src/sandbox-desktop/connection.ts"],"sourcesContent":["import type RFB from \"@novnc/novnc\";\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\n\nimport { type PrimitiveProps } from \"../primitives\";\nimport type { RelayReconnectOptions, RelayStatus } from \"../relay/connection\";\nimport { DefaultStatus } from \"../relay/status\";\nimport { type TicketSource, resolveTicket } from \"../relay/ticket\";\nimport { DesktopConnection, type SandboxDesktopControl } from \"./connection\";\n\nexport interface SandboxDesktopHandle {\n focus(): void;\n /** Reconnect now, after the viewer gave up. */\n reconnect(): void;\n /** Take control, which pauses the agent. */\n takeOver(): void;\n /** Hand control back. */\n release(): void;\n}\n\nexport interface SandboxDesktopNotice {\n code: string;\n message: string;\n}\n\n/** What `renderControls` is given to draw its own take-over bar. */\nexport interface SandboxDesktopControlsState {\n status: RelayStatus;\n /** Undefined until the relay has said who has control. */\n control: SandboxDesktopControl | undefined;\n /** This viewer cannot send input, because of the prop or because the ticket says so. */\n readOnly: boolean;\n /** The latest failed request, such as taking over while someone else holds control. */\n notice: SandboxDesktopNotice | undefined;\n takeOver(): void;\n release(): void;\n}\n\nexport type SandboxDesktopProps = Omit<PrimitiveProps<\"div\">, \"children\" | \"onError\"> & {\n /**\n * The hub's desktop endpoint (`hub.handleDesktopUpgrade`): `ws:`/`wss:`, `http:`/`https:`, or a\n * path relative to this page.\n */\n url: string;\n /**\n * A one-time ticket, or a function returning one. Pass a function: tickets are single use, so\n * each reconnect needs a fresh one. It travels as a WebSocket subprotocol, not in the URL.\n */\n ticket?: TicketSource;\n /** Watch only. The server enforces it too; this also stops the viewer sending input. */\n readOnly?: boolean;\n /** Scale the desktop to fit the element. Default true. */\n scaleToFit?: boolean;\n /**\n * JPEG quality asked of the server, 0 (smallest, blockiest) to 9 (best, most data). Default 6.\n * Lower it for a slow link; it applies to the live connection.\n */\n qualityLevel?: number;\n /**\n * How hard the server compresses, 0 (fastest, most data) to 9 (slowest, least data). Default 2,\n * which keeps the server's CPU low. Raise it for a slow link; it applies to the live connection.\n */\n compressionLevel?: number;\n reconnect?: RelayReconnectOptions;\n onStatusChange?: (status: RelayStatus) => void;\n /** Called whenever the relay reports who has control. */\n onControlChange?: (control: SandboxDesktopControl) => void;\n /** Replace the default status line. Return null to show nothing. */\n renderStatus?: (status: RelayStatus, retry: () => void) => ReactNode;\n /** Replace the default take-over bar. Return null to show nothing. */\n renderControls?: (state: SandboxDesktopControlsState) => ReactNode;\n};\n\nconst defaultQualityLevel = 6;\nconst defaultCompressionLevel = 2;\n\n/** A level noVNC accepts: a whole number from 0 to 9. Anything else falls back to the default. */\nfunction level(value: number | undefined, fallback: number): number {\n if (value === undefined || !Number.isFinite(value)) return fallback;\n return Math.min(9, Math.max(0, Math.round(value)));\n}\n\nconst rootStyle: CSSProperties = { position: \"relative\", width: \"100%\", height: \"100%\" };\nconst screenStyle: CSSProperties = { width: \"100%\", height: \"100%\" };\n\n/**\n * A viewer for a remote sandbox's desktop, drawn with noVNC. noVNC is loaded on demand, so it costs\n * nothing until a desktop mounts. It connects to the hub's desktop relay, reconnects with a fresh\n * ticket when the link drops, and lets a person take over control from the agent.\n */\nexport const SandboxDesktop = forwardRef<SandboxDesktopHandle, SandboxDesktopProps>(\n function SandboxDesktop(\n {\n url,\n ticket,\n readOnly = false,\n scaleToFit = true,\n qualityLevel,\n compressionLevel,\n reconnect,\n onStatusChange,\n onControlChange,\n renderStatus,\n renderControls,\n style,\n ...rest\n },\n ref,\n ) {\n const screen = useRef<HTMLDivElement>(null);\n const connection = useRef<DesktopConnection | undefined>(undefined);\n const viewer = useRef<RFB | undefined>(undefined);\n const [status, setStatus] = useState<RelayStatus>({ state: \"loading\" });\n const [control, setControl] = useState<SandboxDesktopControl | undefined>(undefined);\n const [notice, setNotice] = useState<SandboxDesktopNotice | undefined>(undefined);\n\n // The viewer may send input unless it is read-only, or someone else holds control.\n const viewOnly =\n readOnly || control?.readOnly === true || (control?.held === true && !control.you);\n\n // The latest props, read by long-lived callbacks without restarting the connection.\n const latest = useRef({\n ticket,\n reconnect,\n onStatusChange,\n onControlChange,\n scaleToFit,\n viewOnly,\n quality: level(qualityLevel, defaultQualityLevel),\n compression: level(compressionLevel, defaultCompressionLevel),\n });\n latest.current = {\n ticket,\n reconnect,\n onStatusChange,\n onControlChange,\n scaleToFit,\n viewOnly,\n quality: level(qualityLevel, defaultQualityLevel),\n compression: level(compressionLevel, defaultCompressionLevel),\n };\n\n useImperativeHandle(\n ref,\n () => ({\n focus: () => viewer.current?.focus(),\n reconnect: () => connection.current?.retry(),\n takeOver: () => connection.current?.takeOver(),\n release: () => connection.current?.release(),\n }),\n [],\n );\n\n useEffect(() => {\n if (viewer.current !== undefined) viewer.current.viewOnly = viewOnly;\n }, [viewOnly]);\n useEffect(() => {\n if (viewer.current !== undefined) viewer.current.scaleViewport = scaleToFit;\n }, [scaleToFit]);\n useEffect(() => {\n if (viewer.current !== undefined) viewer.current.qualityLevel = latest.current.quality;\n }, [qualityLevel]);\n useEffect(() => {\n if (viewer.current !== undefined) {\n viewer.current.compressionLevel = latest.current.compression;\n }\n }, [compressionLevel]);\n\n useEffect(() => {\n const container = screen.current;\n if (container === null) return undefined;\n let disposed = false;\n let teardown: (() => void) | undefined;\n\n const publish = (next: RelayStatus) => {\n if (disposed) return;\n setStatus(next);\n // Who has control is unknown while the link is down.\n if (next.state !== \"open\") setControl(undefined);\n latest.current.onStatusChange?.(next);\n };\n publish({ state: \"loading\" });\n\n void (async () => {\n const { default: Rfb } = await import(\"@novnc/novnc\");\n if (disposed) return;\n\n const link = new DesktopConnection({\n url,\n getTicket: resolveTicket(() => latest.current.ticket),\n reconnect: latest.current.reconnect,\n onStatus: publish,\n onChannel: (channel) => {\n // noVNC clients are single-use: each attachment gets a new one.\n viewer.current?.disconnect();\n const rfb = new Rfb(container, channel);\n rfb.scaleViewport = latest.current.scaleToFit;\n rfb.clipViewport = false;\n // The desktop's size is set through the hub's API, never by a viewer.\n rfb.resizeSession = false;\n rfb.viewOnly = latest.current.viewOnly;\n // Set outright, not left to noVNC's defaults, so what a viewer asks of the server is\n // stated here and can be changed.\n rfb.qualityLevel = latest.current.quality;\n rfb.compressionLevel = latest.current.compression;\n viewer.current = rfb;\n },\n onControl: (next) => {\n if (disposed) return;\n setControl(next);\n setNotice(undefined);\n latest.current.onControlChange?.(next);\n },\n onNotice: (next) => {\n if (!disposed) setNotice(next);\n },\n });\n connection.current = link;\n link.start();\n teardown = () => {\n link.dispose();\n viewer.current?.disconnect();\n viewer.current = undefined;\n connection.current = undefined;\n };\n })().catch((error: unknown) => {\n publish({\n state: \"failed\",\n message: error instanceof Error ? error.message : \"Could not load the desktop viewer.\",\n });\n });\n\n return () => {\n disposed = true;\n teardown?.();\n };\n }, [url]);\n\n const retry = () => connection.current?.retry();\n const takeOver = () => connection.current?.takeOver();\n const release = () => connection.current?.release();\n const statusNode =\n renderStatus === undefined ? (\n <DefaultStatus status={status} retry={retry} />\n ) : (\n renderStatus(status, retry)\n );\n const controlsState: SandboxDesktopControlsState = {\n status,\n control,\n readOnly: readOnly || control?.readOnly === true,\n notice,\n takeOver,\n release,\n };\n const controlsNode =\n renderControls === undefined ? (\n <DefaultControls {...controlsState} />\n ) : (\n renderControls(controlsState)\n );\n\n return (\n <div\n {...rest}\n data-state={status.state}\n data-readonly={viewOnly ? \"\" : undefined}\n data-control={control?.you === true ? \"you\" : control?.held === true ? \"other\" : \"none\"}\n style={{ ...rootStyle, ...style }}\n >\n <div ref={screen} style={screenStyle} />\n {controlsNode}\n {statusNode}\n </div>\n );\n },\n);\n\nconst controlsStyle: CSSProperties = {\n position: \"absolute\",\n top: 8,\n left: 8,\n zIndex: 1,\n display: \"flex\",\n gap: 8,\n alignItems: \"center\",\n padding: \"2px 8px\",\n borderRadius: 4,\n fontSize: 12,\n background: \"rgba(0, 0, 0, 0.7)\",\n color: \"#fff\",\n};\n\nfunction DefaultControls({\n status,\n control,\n readOnly,\n notice,\n takeOver,\n release,\n}: SandboxDesktopControlsState) {\n if (status.state !== \"open\" || control === undefined) return null;\n const who = control.you\n ? \"You have control\"\n : control.held\n ? `${control.holder ?? \"Someone\"} has control`\n : readOnly\n ? \"View only\"\n : \"The agent has control\";\n return (\n <div data-sandbox-desktop-controls=\"\" style={controlsStyle}>\n <span>{who}</span>\n {control.you ? (\n <button type=\"button\" onClick={release}>\n Release\n </button>\n ) : !readOnly && !control.held ? (\n <button type=\"button\" onClick={takeOver}>\n Take over\n </button>\n ) : null}\n {notice === undefined ? null : <span role=\"alert\">{notice.message}</span>}\n </div>\n );\n}\n","/** What a {@link VncChannel} needs from the socket it wraps. */\nexport interface VncLink {\n send(data: ArrayBufferLike | ArrayBufferView): void;\n close(): void;\n}\n\n// WebSocket ready states, written out so this works wherever noVNC's own checks do.\nconst OPEN = 1;\nconst CLOSED = 3;\n\n/**\n * A WebSocket-shaped channel for noVNC to attach to. The hub's desktop relay mixes binary VNC frames\n * with JSON control frames on one socket, and noVNC understands only the former, so the link\n * hands this channel just the binary ones.\n *\n * The VNC server speaks first, so frames can arrive before noVNC has attached. They wait here\n * until it installs its `onmessage`.\n *\n * noVNC checks a channel for these property names (`send`, `close`, `binaryType`, `onerror`,\n * `onmessage`, `onopen`, `protocol`, `readyState`), as it does for a WebSocket or an\n * RTCDataChannel, so they must all be present.\n */\nexport class VncChannel {\n binaryType = \"arraybuffer\";\n protocol: string;\n onerror: ((event: unknown) => void) | null = null;\n onopen: ((event: unknown) => void) | null = null;\n onclose: ((event: unknown) => void) | null = null;\n private handler: ((event: { data: ArrayBuffer }) => void) | null = null;\n private backlog: ArrayBuffer[] = [];\n private state = OPEN;\n\n constructor(\n private readonly link: VncLink,\n protocol = \"\",\n ) {\n this.protocol = protocol;\n }\n\n get readyState(): number {\n return this.state;\n }\n\n get onmessage(): ((event: { data: ArrayBuffer }) => void) | null {\n return this.handler;\n }\n\n set onmessage(handler: ((event: { data: ArrayBuffer }) => void) | null) {\n this.handler = handler;\n if (handler === null) return;\n for (const data of this.backlog.splice(0)) handler({ data });\n }\n\n send(data: ArrayBufferLike | ArrayBufferView): void {\n if (this.state === OPEN) this.link.send(data);\n }\n\n /** noVNC is done with the connection. */\n close(): void {\n if (this.state !== OPEN) return;\n this.state = CLOSED;\n this.link.close();\n }\n\n /** A VNC frame arrived from the relay. */\n receive(data: ArrayBuffer): void {\n if (this.handler === null) this.backlog.push(data);\n else this.handler({ data });\n }\n\n /** The relay closed the socket. */\n closed(event: { code: number; reason: string }): void {\n if (this.state === CLOSED) return;\n this.state = CLOSED;\n this.backlog = [];\n this.onclose?.(event);\n }\n}\n","import {\n type RelayProtocol,\n type RelayReconnectOptions,\n type RelaySession,\n type RelayStatus,\n RelayConnection,\n} from \"../relay/connection\";\nimport { VncChannel } from \"./vnc-channel\";\n\n/** Subprotocol the hub's `handleDesktopUpgrade` selects. */\nexport const desktopSubprotocol = \"anvia.desktop.v1\";\n\n/** Who is driving the desktop, as the relay reports it to this viewer. */\nexport interface SandboxDesktopControl {\n /** Someone has taken control, which pauses the agent. */\n held: boolean;\n /** Who. Present when `held`. */\n holder?: string;\n /** When the hold lapses unless renewed. */\n expiresAt?: string;\n /** This viewer is the holder. */\n you: boolean;\n /** This viewer may only watch. */\n readOnly: boolean;\n}\n\nexport interface DesktopConnectionOptions {\n url: string;\n getTicket?: (() => string | Promise<string>) | undefined;\n reconnect?: RelayReconnectOptions | undefined;\n onStatus: (status: RelayStatus) => void;\n /** The relay accepted this attachment. Attach a VNC client to the channel. */\n onChannel: (channel: VncChannel, reconnected: boolean) => void;\n onControl: (control: SandboxDesktopControl) => void;\n /** A request over the control channel failed, such as taking over while someone else holds it. */\n onNotice?: ((notice: { code: string; message: string }) => void) | undefined;\n}\n\n/** Errors worth another attempt: the sandbox may simply not be reachable yet. */\nconst retryableCodes = new Set([\"sandbox_unavailable\", \"timeout\"]);\n/** The hub closes a socket it could not set up with `<error code>: <message>`. */\nconst closeReason = /^([a-z_]+): (.*)$/s;\n/** The relay closes with this code when the viewer sent something it could not account for. */\nconst policyViolation = 1008;\n\ntype ControlMessage = { type: \"control\" } & SandboxDesktopControl;\ntype ErrorMessage = { type: \"error\"; code?: string; message?: string };\n\n/**\n * One browser link to the hub's desktop relay, over a {@link RelayConnection}. It hands each\n * accepted attachment to the owner as a channel for a VNC client, and speaks the relay's small\n * JSON control protocol (`takeover`, `release`, and the `control` updates that come back).\n */\nexport class DesktopConnection {\n private readonly relay: RelayConnection;\n\n constructor(options: DesktopConnectionOptions) {\n let channel: VncChannel | undefined;\n let accepted = false;\n const protocol: RelayProtocol = {\n subprotocol: desktopSubprotocol,\n label: \"desktop\",\n open: (socket) => {\n accepted = false;\n channel = new VncChannel(\n { send: (data) => socket.send(data), close: () => socket.close(1000) },\n socket.protocol,\n );\n },\n message: (event, session: RelaySession) => {\n // The first thing the relay sends means it set the viewer up; a failure closes instead.\n if (!accepted && channel !== undefined) {\n accepted = true;\n options.onChannel(channel, session.ready());\n }\n if (typeof event.data !== \"string\") {\n channel?.receive(event.data as ArrayBuffer);\n return;\n }\n const message = parseText(event.data);\n if (message?.type === \"control\") {\n const { type: _type, ...control } = message;\n options.onControl(control);\n } else if (message?.type === \"error\") {\n options.onNotice?.({\n code: message.code ?? \"protocol\",\n message: message.message ?? \"The request failed.\",\n });\n }\n },\n close: (event, session) => {\n channel?.closed(event);\n const match = closeReason.exec(event.reason);\n if (match !== null && !retryableCodes.has(match[1] ?? \"\")) {\n session.fatal(match[2] ?? \"The desktop could not be opened.\");\n } else if (event.code === policyViolation) {\n session.fatal(event.reason || \"The desktop relay refused what the viewer sent.\");\n }\n },\n };\n this.relay = new RelayConnection({\n url: options.url,\n getTicket: options.getTicket,\n onStatus: options.onStatus,\n reconnect: options.reconnect,\n protocol,\n });\n }\n\n start(): void {\n this.relay.start();\n }\n\n retry(): void {\n this.relay.retry();\n }\n\n /** Ask for control, which pauses the agent's inputs. The answer arrives as a `control` update. */\n takeOver(): void {\n this.relay.sendJson({ type: \"takeover\" });\n }\n\n release(): void {\n this.relay.sendJson({ type: \"release\" });\n }\n\n dispose(): void {\n this.relay.dispose();\n }\n}\n\nfunction parseText(text: string): ControlMessage | ErrorMessage | undefined {\n try {\n const value: unknown = JSON.parse(text);\n if (typeof value !== \"object\" || value === null) return undefined;\n const type = (value as { type?: unknown }).type;\n return type === \"control\" || type === \"error\"\n ? (value as ControlMessage | ErrorMessage)\n : undefined;\n } catch {\n return undefined;\n }\n}\n"],"mappings":";;;;;;;;AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;;;ACFP,IAAM,OAAO;AACb,IAAM,SAAS;AAcR,IAAM,aAAN,MAAiB;AAAA,EAUtB,YACmB,MACjB,WAAW,IACX;AAFiB;AAGjB,SAAK,WAAW;AAAA,EAClB;AAAA,EAJmB;AAAA,EAVnB,aAAa;AAAA,EACb;AAAA,EACA,UAA6C;AAAA,EAC7C,SAA4C;AAAA,EAC5C,UAA6C;AAAA,EACrC,UAA2D;AAAA,EAC3D,UAAyB,CAAC;AAAA,EAC1B,QAAQ;AAAA,EAShB,IAAI,aAAqB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,YAA6D;AAC/D,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,UAAU,SAA0D;AACtE,SAAK,UAAU;AACf,QAAI,YAAY,KAAM;AACtB,eAAW,QAAQ,KAAK,QAAQ,OAAO,CAAC,EAAG,SAAQ,EAAE,KAAK,CAAC;AAAA,EAC7D;AAAA,EAEA,KAAK,MAA+C;AAClD,QAAI,KAAK,UAAU,KAAM,MAAK,KAAK,KAAK,IAAI;AAAA,EAC9C;AAAA;AAAA,EAGA,QAAc;AACZ,QAAI,KAAK,UAAU,KAAM;AACzB,SAAK,QAAQ;AACb,SAAK,KAAK,MAAM;AAAA,EAClB;AAAA;AAAA,EAGA,QAAQ,MAAyB;AAC/B,QAAI,KAAK,YAAY,KAAM,MAAK,QAAQ,KAAK,IAAI;AAAA,QAC5C,MAAK,QAAQ,EAAE,KAAK,CAAC;AAAA,EAC5B;AAAA;AAAA,EAGA,OAAO,OAA+C;AACpD,QAAI,KAAK,UAAU,OAAQ;AAC3B,SAAK,QAAQ;AACb,SAAK,UAAU,CAAC;AAChB,SAAK,UAAU,KAAK;AAAA,EACtB;AACF;;;ACnEO,IAAM,qBAAqB;AA6BlC,IAAM,iBAAiB,oBAAI,IAAI,CAAC,uBAAuB,SAAS,CAAC;AAEjE,IAAM,cAAc;AAEpB,IAAM,kBAAkB;AAUjB,IAAM,oBAAN,MAAwB;AAAA,EACZ;AAAA,EAEjB,YAAY,SAAmC;AAC7C,QAAI;AACJ,QAAI,WAAW;AACf,UAAM,WAA0B;AAAA,MAC9B,aAAa;AAAA,MACb,OAAO;AAAA,MACP,MAAM,CAAC,WAAW;AAChB,mBAAW;AACX,kBAAU,IAAI;AAAA,UACZ,EAAE,MAAM,CAAC,SAAS,OAAO,KAAK,IAAI,GAAG,OAAO,MAAM,OAAO,MAAM,GAAI,EAAE;AAAA,UACrE,OAAO;AAAA,QACT;AAAA,MACF;AAAA,MACA,SAAS,CAAC,OAAO,YAA0B;AAEzC,YAAI,CAAC,YAAY,YAAY,QAAW;AACtC,qBAAW;AACX,kBAAQ,UAAU,SAAS,QAAQ,MAAM,CAAC;AAAA,QAC5C;AACA,YAAI,OAAO,MAAM,SAAS,UAAU;AAClC,mBAAS,QAAQ,MAAM,IAAmB;AAC1C;AAAA,QACF;AACA,cAAM,UAAU,UAAU,MAAM,IAAI;AACpC,YAAI,SAAS,SAAS,WAAW;AAC/B,gBAAM,EAAE,MAAM,OAAO,GAAG,QAAQ,IAAI;AACpC,kBAAQ,UAAU,OAAO;AAAA,QAC3B,WAAW,SAAS,SAAS,SAAS;AACpC,kBAAQ,WAAW;AAAA,YACjB,MAAM,QAAQ,QAAQ;AAAA,YACtB,SAAS,QAAQ,WAAW;AAAA,UAC9B,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,OAAO,CAAC,OAAO,YAAY;AACzB,iBAAS,OAAO,KAAK;AACrB,cAAM,QAAQ,YAAY,KAAK,MAAM,MAAM;AAC3C,YAAI,UAAU,QAAQ,CAAC,eAAe,IAAI,MAAM,CAAC,KAAK,EAAE,GAAG;AACzD,kBAAQ,MAAM,MAAM,CAAC,KAAK,kCAAkC;AAAA,QAC9D,WAAW,MAAM,SAAS,iBAAiB;AACzC,kBAAQ,MAAM,MAAM,UAAU,iDAAiD;AAAA,QACjF;AAAA,MACF;AAAA,IACF;AACA,SAAK,QAAQ,IAAI,gBAAgB;AAAA,MAC/B,KAAK,QAAQ;AAAA,MACb,WAAW,QAAQ;AAAA,MACnB,UAAU,QAAQ;AAAA,MAClB,WAAW,QAAQ;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,QAAc;AACZ,SAAK,MAAM,MAAM;AAAA,EACnB;AAAA,EAEA,QAAc;AACZ,SAAK,MAAM,MAAM;AAAA,EACnB;AAAA;AAAA,EAGA,WAAiB;AACf,SAAK,MAAM,SAAS,EAAE,MAAM,WAAW,CAAC;AAAA,EAC1C;AAAA,EAEA,UAAgB;AACd,SAAK,MAAM,SAAS,EAAE,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EAEA,UAAgB;AACd,SAAK,MAAM,QAAQ;AAAA,EACrB;AACF;AAEA,SAAS,UAAU,MAAyD;AAC1E,MAAI;AACF,UAAM,QAAiB,KAAK,MAAM,IAAI;AACtC,QAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,UAAM,OAAQ,MAA6B;AAC3C,WAAO,SAAS,aAAa,SAAS,UACjC,QACD;AAAA,EACN,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AF4GQ,cAoBF,YApBE;AA1KR,IAAM,sBAAsB;AAC5B,IAAM,0BAA0B;AAGhC,SAAS,MAAM,OAA2B,UAA0B;AAClE,MAAI,UAAU,UAAa,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AAC3D,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,CAAC;AACnD;AAEA,IAAM,YAA2B,EAAE,UAAU,YAAY,OAAO,QAAQ,QAAQ,OAAO;AACvF,IAAM,cAA6B,EAAE,OAAO,QAAQ,QAAQ,OAAO;AAO5D,IAAM,iBAAiB;AAAA,EAC5B,SAASA,gBACP;AAAA,IACE;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,KACA;AACA,UAAM,SAAS,OAAuB,IAAI;AAC1C,UAAM,aAAa,OAAsC,MAAS;AAClE,UAAM,SAAS,OAAwB,MAAS;AAChD,UAAM,CAAC,QAAQ,SAAS,IAAI,SAAsB,EAAE,OAAO,UAAU,CAAC;AACtE,UAAM,CAAC,SAAS,UAAU,IAAI,SAA4C,MAAS;AACnF,UAAM,CAAC,QAAQ,SAAS,IAAI,SAA2C,MAAS;AAGhF,UAAM,WACJ,YAAY,SAAS,aAAa,QAAS,SAAS,SAAS,QAAQ,CAAC,QAAQ;AAGhF,UAAM,SAAS,OAAO;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,MAAM,cAAc,mBAAmB;AAAA,MAChD,aAAa,MAAM,kBAAkB,uBAAuB;AAAA,IAC9D,CAAC;AACD,WAAO,UAAU;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,MAAM,cAAc,mBAAmB;AAAA,MAChD,aAAa,MAAM,kBAAkB,uBAAuB;AAAA,IAC9D;AAEA;AAAA,MACE;AAAA,MACA,OAAO;AAAA,QACL,OAAO,MAAM,OAAO,SAAS,MAAM;AAAA,QACnC,WAAW,MAAM,WAAW,SAAS,MAAM;AAAA,QAC3C,UAAU,MAAM,WAAW,SAAS,SAAS;AAAA,QAC7C,SAAS,MAAM,WAAW,SAAS,QAAQ;AAAA,MAC7C;AAAA,MACA,CAAC;AAAA,IACH;AAEA,cAAU,MAAM;AACd,UAAI,OAAO,YAAY,OAAW,QAAO,QAAQ,WAAW;AAAA,IAC9D,GAAG,CAAC,QAAQ,CAAC;AACb,cAAU,MAAM;AACd,UAAI,OAAO,YAAY,OAAW,QAAO,QAAQ,gBAAgB;AAAA,IACnE,GAAG,CAAC,UAAU,CAAC;AACf,cAAU,MAAM;AACd,UAAI,OAAO,YAAY,OAAW,QAAO,QAAQ,eAAe,OAAO,QAAQ;AAAA,IACjF,GAAG,CAAC,YAAY,CAAC;AACjB,cAAU,MAAM;AACd,UAAI,OAAO,YAAY,QAAW;AAChC,eAAO,QAAQ,mBAAmB,OAAO,QAAQ;AAAA,MACnD;AAAA,IACF,GAAG,CAAC,gBAAgB,CAAC;AAErB,cAAU,MAAM;AACd,YAAM,YAAY,OAAO;AACzB,UAAI,cAAc,KAAM,QAAO;AAC/B,UAAI,WAAW;AACf,UAAI;AAEJ,YAAM,UAAU,CAAC,SAAsB;AACrC,YAAI,SAAU;AACd,kBAAU,IAAI;AAEd,YAAI,KAAK,UAAU,OAAQ,YAAW,MAAS;AAC/C,eAAO,QAAQ,iBAAiB,IAAI;AAAA,MACtC;AACA,cAAQ,EAAE,OAAO,UAAU,CAAC;AAE5B,YAAM,YAAY;AAChB,cAAM,EAAE,SAAS,IAAI,IAAI,MAAM,OAAO,cAAc;AACpD,YAAI,SAAU;AAEd,cAAM,OAAO,IAAI,kBAAkB;AAAA,UACjC;AAAA,UACA,WAAW,cAAc,MAAM,OAAO,QAAQ,MAAM;AAAA,UACpD,WAAW,OAAO,QAAQ;AAAA,UAC1B,UAAU;AAAA,UACV,WAAW,CAAC,YAAY;AAEtB,mBAAO,SAAS,WAAW;AAC3B,kBAAM,MAAM,IAAI,IAAI,WAAW,OAAO;AACtC,gBAAI,gBAAgB,OAAO,QAAQ;AACnC,gBAAI,eAAe;AAEnB,gBAAI,gBAAgB;AACpB,gBAAI,WAAW,OAAO,QAAQ;AAG9B,gBAAI,eAAe,OAAO,QAAQ;AAClC,gBAAI,mBAAmB,OAAO,QAAQ;AACtC,mBAAO,UAAU;AAAA,UACnB;AAAA,UACA,WAAW,CAAC,SAAS;AACnB,gBAAI,SAAU;AACd,uBAAW,IAAI;AACf,sBAAU,MAAS;AACnB,mBAAO,QAAQ,kBAAkB,IAAI;AAAA,UACvC;AAAA,UACA,UAAU,CAAC,SAAS;AAClB,gBAAI,CAAC,SAAU,WAAU,IAAI;AAAA,UAC/B;AAAA,QACF,CAAC;AACD,mBAAW,UAAU;AACrB,aAAK,MAAM;AACX,mBAAW,MAAM;AACf,eAAK,QAAQ;AACb,iBAAO,SAAS,WAAW;AAC3B,iBAAO,UAAU;AACjB,qBAAW,UAAU;AAAA,QACvB;AAAA,MACF,GAAG,EAAE,MAAM,CAAC,UAAmB;AAC7B,gBAAQ;AAAA,UACN,OAAO;AAAA,UACP,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QACpD,CAAC;AAAA,MACH,CAAC;AAED,aAAO,MAAM;AACX,mBAAW;AACX,mBAAW;AAAA,MACb;AAAA,IACF,GAAG,CAAC,GAAG,CAAC;AAER,UAAM,QAAQ,MAAM,WAAW,SAAS,MAAM;AAC9C,UAAM,WAAW,MAAM,WAAW,SAAS,SAAS;AACpD,UAAM,UAAU,MAAM,WAAW,SAAS,QAAQ;AAClD,UAAM,aACJ,iBAAiB,SACf,oBAAC,iBAAc,QAAgB,OAAc,IAE7C,aAAa,QAAQ,KAAK;AAE9B,UAAM,gBAA6C;AAAA,MACjD;AAAA,MACA;AAAA,MACA,UAAU,YAAY,SAAS,aAAa;AAAA,MAC5C;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,eACJ,mBAAmB,SACjB,oBAAC,mBAAiB,GAAG,eAAe,IAEpC,eAAe,aAAa;AAGhC,WACE;AAAA,MAAC;AAAA;AAAA,QACE,GAAG;AAAA,QACJ,cAAY,OAAO;AAAA,QACnB,iBAAe,WAAW,KAAK;AAAA,QAC/B,gBAAc,SAAS,QAAQ,OAAO,QAAQ,SAAS,SAAS,OAAO,UAAU;AAAA,QACjF,OAAO,EAAE,GAAG,WAAW,GAAG,MAAM;AAAA,QAEhC;AAAA,8BAAC,SAAI,KAAK,QAAQ,OAAO,aAAa;AAAA,UACrC;AAAA,UACA;AAAA;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AAEA,IAAM,gBAA+B;AAAA,EACnC,UAAU;AAAA,EACV,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,cAAc;AAAA,EACd,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AACT;AAEA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAgC;AAC9B,MAAI,OAAO,UAAU,UAAU,YAAY,OAAW,QAAO;AAC7D,QAAM,MAAM,QAAQ,MAChB,qBACA,QAAQ,OACN,GAAG,QAAQ,UAAU,SAAS,iBAC9B,WACE,cACA;AACR,SACE,qBAAC,SAAI,iCAA8B,IAAG,OAAO,eAC3C;AAAA,wBAAC,UAAM,eAAI;AAAA,IACV,QAAQ,MACP,oBAAC,YAAO,MAAK,UAAS,SAAS,SAAS,qBAExC,IACE,CAAC,YAAY,CAAC,QAAQ,OACxB,oBAAC,YAAO,MAAK,UAAS,SAAS,UAAU,uBAEzC,IACE;AAAA,IACH,WAAW,SAAY,OAAO,oBAAC,UAAK,MAAK,SAAS,iBAAO,SAAQ;AAAA,KACpE;AAEJ;","names":["SandboxDesktop"]}
1
+ {"version":3,"sources":["../../src/sandbox-desktop/desktop.tsx","../../src/sandbox-desktop/vnc-channel.ts","../../src/sandbox-desktop/connection.ts"],"sourcesContent":["import type RFB from \"@novnc/novnc\";\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\n\nimport { type PrimitiveProps } from \"../primitives\";\nimport type { RelayReconnectOptions, RelayStatus } from \"../relay/connection\";\nimport { DefaultStatus } from \"../relay/status\";\nimport { type TicketSource, resolveTicket } from \"../relay/ticket\";\nimport { DesktopConnection, type SandboxDesktopControl } from \"./connection\";\n\nexport interface SandboxDesktopHandle {\n focus(): void;\n /** Reconnect now, after the viewer gave up. */\n reconnect(): void;\n /** Take control, which pauses the agent. */\n takeOver(): void;\n /** Hand control back. */\n release(): void;\n}\n\nexport interface SandboxDesktopNotice {\n code: string;\n message: string;\n}\n\n/** What `renderControls` is given to draw its own take-over bar. */\nexport interface SandboxDesktopControlsState {\n status: RelayStatus;\n /** Undefined until the relay has said who has control. */\n control: SandboxDesktopControl | undefined;\n /** This viewer cannot send input, because of the prop or because the ticket says so. */\n readOnly: boolean;\n /** The latest failed request, such as taking over while someone else holds control. */\n notice: SandboxDesktopNotice | undefined;\n takeOver(): void;\n release(): void;\n}\n\nexport type SandboxDesktopProps = Omit<PrimitiveProps<\"div\">, \"children\" | \"onError\"> & {\n /**\n * The hub's desktop endpoint (`hub.handleDesktopUpgrade`): `ws:`/`wss:`, `http:`/`https:`, or a\n * path relative to this page.\n */\n url: string;\n /**\n * A one-time ticket, or a function returning one. Pass a function: tickets are single use, so\n * each reconnect needs a fresh one. It travels as a WebSocket subprotocol, not in the URL.\n */\n ticket?: TicketSource;\n /** Watch only. The server enforces it too; this also stops the viewer sending input. */\n readOnly?: boolean;\n /** Scale the desktop to fit the element. Default true. */\n scaleToFit?: boolean;\n /**\n * JPEG quality asked of the server, 0 (smallest, blockiest) to 9 (best, most data). Default 6.\n * Lower it for a slow link; it applies to the live connection.\n */\n qualityLevel?: number;\n /**\n * How hard the server compresses, 0 (fastest, most data) to 9 (slowest, least data). Default 2,\n * which keeps the server's CPU low. Raise it for a slow link; it applies to the live connection.\n */\n compressionLevel?: number;\n reconnect?: RelayReconnectOptions;\n onStatusChange?: (status: RelayStatus) => void;\n /** Called whenever the relay reports who has control. */\n onControlChange?: (control: SandboxDesktopControl) => void;\n /** Replace the default status line. Return null to show nothing. */\n renderStatus?: (status: RelayStatus, retry: () => void) => ReactNode;\n /** Replace the default take-over bar. Return null to show nothing. */\n renderControls?: (state: SandboxDesktopControlsState) => ReactNode;\n};\n\nconst defaultQualityLevel = 6;\nconst defaultCompressionLevel = 2;\n\n/** A level noVNC accepts: a whole number from 0 to 9. Anything else falls back to the default. */\nfunction level(value: number | undefined, fallback: number): number {\n if (value === undefined || !Number.isFinite(value)) return fallback;\n return Math.min(9, Math.max(0, Math.round(value)));\n}\n\nconst rootStyle: CSSProperties = { position: \"relative\", width: \"100%\", height: \"100%\" };\nconst screenStyle: CSSProperties = { width: \"100%\", height: \"100%\" };\n\n/**\n * A viewer for a remote sandbox's desktop, drawn with noVNC. noVNC is loaded on demand, so it costs\n * nothing until a desktop mounts. It connects to the hub's desktop relay, reconnects with a fresh\n * ticket when the link drops, and lets a person take over control from the agent.\n */\nexport const SandboxDesktop = forwardRef<SandboxDesktopHandle, SandboxDesktopProps>(\n function SandboxDesktop(\n {\n url,\n ticket,\n readOnly = false,\n scaleToFit = true,\n qualityLevel,\n compressionLevel,\n reconnect,\n onStatusChange,\n onControlChange,\n renderStatus,\n renderControls,\n style,\n ...rest\n },\n ref,\n ) {\n const screen = useRef<HTMLDivElement>(null);\n const connection = useRef<DesktopConnection | undefined>(undefined);\n const viewer = useRef<RFB | undefined>(undefined);\n const [status, setStatus] = useState<RelayStatus>({ state: \"loading\" });\n const [control, setControl] = useState<SandboxDesktopControl | undefined>(undefined);\n const [notice, setNotice] = useState<SandboxDesktopNotice | undefined>(undefined);\n\n // The viewer sends input only while this viewer holds control, so the agent's input and a\n // person's never mix. Until the relay says who has control, nobody does.\n const viewOnly = readOnly || control?.readOnly === true || control?.you !== true;\n\n // The latest props, read by long-lived callbacks without restarting the connection.\n const latest = useRef({\n ticket,\n reconnect,\n onStatusChange,\n onControlChange,\n scaleToFit,\n viewOnly,\n quality: level(qualityLevel, defaultQualityLevel),\n compression: level(compressionLevel, defaultCompressionLevel),\n });\n latest.current = {\n ticket,\n reconnect,\n onStatusChange,\n onControlChange,\n scaleToFit,\n viewOnly,\n quality: level(qualityLevel, defaultQualityLevel),\n compression: level(compressionLevel, defaultCompressionLevel),\n };\n\n useImperativeHandle(\n ref,\n () => ({\n focus: () => viewer.current?.focus(),\n reconnect: () => connection.current?.retry(),\n takeOver: () => connection.current?.takeOver(),\n release: () => connection.current?.release(),\n }),\n [],\n );\n\n useEffect(() => {\n if (viewer.current !== undefined) viewer.current.viewOnly = viewOnly;\n }, [viewOnly]);\n useEffect(() => {\n if (viewer.current !== undefined) viewer.current.scaleViewport = scaleToFit;\n }, [scaleToFit]);\n useEffect(() => {\n if (viewer.current !== undefined) viewer.current.qualityLevel = latest.current.quality;\n }, [qualityLevel]);\n useEffect(() => {\n if (viewer.current !== undefined) {\n viewer.current.compressionLevel = latest.current.compression;\n }\n }, [compressionLevel]);\n\n useEffect(() => {\n const container = screen.current;\n if (container === null) return undefined;\n let disposed = false;\n let teardown: (() => void) | undefined;\n\n const publish = (next: RelayStatus) => {\n if (disposed) return;\n setStatus(next);\n // Who has control is unknown while the link is down.\n if (next.state !== \"open\") setControl(undefined);\n latest.current.onStatusChange?.(next);\n };\n publish({ state: \"loading\" });\n\n void (async () => {\n const { default: Rfb } = await import(\"@novnc/novnc\");\n if (disposed) return;\n\n const link = new DesktopConnection({\n url,\n getTicket: resolveTicket(() => latest.current.ticket),\n reconnect: latest.current.reconnect,\n onStatus: publish,\n onChannel: (channel) => {\n // noVNC clients are single-use: each attachment gets a new one.\n viewer.current?.disconnect();\n const rfb = new Rfb(container, channel);\n rfb.scaleViewport = latest.current.scaleToFit;\n rfb.clipViewport = false;\n // The desktop's size is set through the hub's API, never by a viewer.\n rfb.resizeSession = false;\n rfb.viewOnly = latest.current.viewOnly;\n // Set outright, not left to noVNC's defaults, so what a viewer asks of the server is\n // stated here and can be changed.\n rfb.qualityLevel = latest.current.quality;\n rfb.compressionLevel = latest.current.compression;\n viewer.current = rfb;\n },\n onControl: (next) => {\n if (disposed) return;\n setControl(next);\n setNotice(undefined);\n latest.current.onControlChange?.(next);\n },\n onNotice: (next) => {\n if (!disposed) setNotice(next);\n },\n });\n connection.current = link;\n link.start();\n teardown = () => {\n link.dispose();\n viewer.current?.disconnect();\n viewer.current = undefined;\n connection.current = undefined;\n };\n })().catch((error: unknown) => {\n publish({\n state: \"failed\",\n message: error instanceof Error ? error.message : \"Could not load the desktop viewer.\",\n });\n });\n\n return () => {\n disposed = true;\n teardown?.();\n };\n }, [url]);\n\n const retry = () => connection.current?.retry();\n const takeOver = () => connection.current?.takeOver();\n const release = () => connection.current?.release();\n const statusNode =\n renderStatus === undefined ? (\n <DefaultStatus status={status} retry={retry} />\n ) : (\n renderStatus(status, retry)\n );\n const controlsState: SandboxDesktopControlsState = {\n status,\n control,\n readOnly: readOnly || control?.readOnly === true,\n notice,\n takeOver,\n release,\n };\n const controlsNode =\n renderControls === undefined ? (\n <DefaultControls {...controlsState} />\n ) : (\n renderControls(controlsState)\n );\n\n return (\n <div\n {...rest}\n data-state={status.state}\n data-readonly={viewOnly ? \"\" : undefined}\n data-control={control?.you === true ? \"you\" : control?.held === true ? \"other\" : \"none\"}\n style={{ ...rootStyle, ...style }}\n >\n <div ref={screen} style={screenStyle} />\n {controlsNode}\n {statusNode}\n </div>\n );\n },\n);\n\nconst controlsStyle: CSSProperties = {\n position: \"absolute\",\n top: 8,\n left: 8,\n zIndex: 1,\n display: \"flex\",\n gap: 8,\n alignItems: \"center\",\n padding: \"2px 8px\",\n borderRadius: 4,\n fontSize: 12,\n background: \"rgba(0, 0, 0, 0.7)\",\n color: \"#fff\",\n};\n\nfunction DefaultControls({\n status,\n control,\n readOnly,\n notice,\n takeOver,\n release,\n}: SandboxDesktopControlsState) {\n if (status.state !== \"open\" || control === undefined) return null;\n const who = control.you\n ? \"You have control\"\n : control.held\n ? `${control.holder ?? \"Someone\"} has control`\n : readOnly\n ? \"View only\"\n : \"The agent has control\";\n return (\n <div data-sandbox-desktop-controls=\"\" style={controlsStyle}>\n <span>{who}</span>\n {control.you ? (\n <button type=\"button\" onClick={release}>\n Release\n </button>\n ) : !readOnly && !control.held ? (\n <button type=\"button\" onClick={takeOver}>\n Take over\n </button>\n ) : null}\n {notice === undefined ? null : <span role=\"alert\">{notice.message}</span>}\n </div>\n );\n}\n","/** What a {@link VncChannel} needs from the socket it wraps. */\nexport interface VncLink {\n send(data: ArrayBufferLike | ArrayBufferView): void;\n close(): void;\n}\n\n// WebSocket ready states, written out so this works wherever noVNC's own checks do.\nconst OPEN = 1;\nconst CLOSED = 3;\n\n/**\n * A WebSocket-shaped channel for noVNC to attach to. The hub's desktop relay mixes binary VNC frames\n * with JSON control frames on one socket, and noVNC understands only the former, so the link\n * hands this channel just the binary ones.\n *\n * The VNC server speaks first, so frames can arrive before noVNC has attached. They wait here\n * until it installs its `onmessage`.\n *\n * noVNC checks a channel for these property names (`send`, `close`, `binaryType`, `onerror`,\n * `onmessage`, `onopen`, `protocol`, `readyState`), as it does for a WebSocket or an\n * RTCDataChannel, so they must all be present.\n */\nexport class VncChannel {\n binaryType = \"arraybuffer\";\n protocol: string;\n onerror: ((event: unknown) => void) | null = null;\n onopen: ((event: unknown) => void) | null = null;\n onclose: ((event: unknown) => void) | null = null;\n private handler: ((event: { data: ArrayBuffer }) => void) | null = null;\n private backlog: ArrayBuffer[] = [];\n private state = OPEN;\n\n constructor(\n private readonly link: VncLink,\n protocol = \"\",\n ) {\n this.protocol = protocol;\n }\n\n get readyState(): number {\n return this.state;\n }\n\n get onmessage(): ((event: { data: ArrayBuffer }) => void) | null {\n return this.handler;\n }\n\n set onmessage(handler: ((event: { data: ArrayBuffer }) => void) | null) {\n this.handler = handler;\n if (handler === null) return;\n for (const data of this.backlog.splice(0)) handler({ data });\n }\n\n send(data: ArrayBufferLike | ArrayBufferView): void {\n if (this.state === OPEN) this.link.send(data);\n }\n\n /** noVNC is done with the connection. */\n close(): void {\n if (this.state !== OPEN) return;\n this.state = CLOSED;\n this.link.close();\n }\n\n /** A VNC frame arrived from the relay. */\n receive(data: ArrayBuffer): void {\n if (this.handler === null) this.backlog.push(data);\n else this.handler({ data });\n }\n\n /** The relay closed the socket. */\n closed(event: { code: number; reason: string }): void {\n if (this.state === CLOSED) return;\n this.state = CLOSED;\n this.backlog = [];\n this.onclose?.(event);\n }\n}\n","import {\n type RelayProtocol,\n type RelayReconnectOptions,\n type RelaySession,\n type RelayStatus,\n RelayConnection,\n} from \"../relay/connection\";\nimport { VncChannel } from \"./vnc-channel\";\n\n/** Subprotocol the hub's `handleDesktopUpgrade` selects. */\nexport const desktopSubprotocol = \"anvia.desktop.v1\";\n\n/** Who is driving the desktop, as the relay reports it to this viewer. */\nexport interface SandboxDesktopControl {\n /** Someone has taken control, which pauses the agent. */\n held: boolean;\n /** Who. Present when `held`. */\n holder?: string;\n /** When the hold lapses unless renewed. */\n expiresAt?: string;\n /** This viewer is the holder. */\n you: boolean;\n /** This viewer may only watch. */\n readOnly: boolean;\n}\n\nexport interface DesktopConnectionOptions {\n url: string;\n getTicket?: (() => string | Promise<string>) | undefined;\n reconnect?: RelayReconnectOptions | undefined;\n onStatus: (status: RelayStatus) => void;\n /** The relay accepted this attachment. Attach a VNC client to the channel. */\n onChannel: (channel: VncChannel, reconnected: boolean) => void;\n onControl: (control: SandboxDesktopControl) => void;\n /** A request over the control channel failed, such as taking over while someone else holds it. */\n onNotice?: ((notice: { code: string; message: string }) => void) | undefined;\n}\n\n/** Errors worth another attempt: the sandbox may simply not be reachable yet. */\nconst retryableCodes = new Set([\"sandbox_unavailable\", \"timeout\"]);\n/** The hub closes a socket it could not set up with `<error code>: <message>`. */\nconst closeReason = /^([a-z_]+): (.*)$/s;\n/** The relay closes with this code when the viewer sent something it could not account for. */\nconst policyViolation = 1008;\n\ntype ControlMessage = { type: \"control\" } & SandboxDesktopControl;\ntype ErrorMessage = { type: \"error\"; code?: string; message?: string };\n\n/**\n * One browser link to the hub's desktop relay, over a {@link RelayConnection}. It hands each\n * accepted attachment to the owner as a channel for a VNC client, and speaks the relay's small\n * JSON control protocol (`takeover`, `release`, and the `control` updates that come back).\n */\nexport class DesktopConnection {\n private readonly relay: RelayConnection;\n\n constructor(options: DesktopConnectionOptions) {\n let channel: VncChannel | undefined;\n let accepted = false;\n const protocol: RelayProtocol = {\n subprotocol: desktopSubprotocol,\n label: \"desktop\",\n open: (socket) => {\n accepted = false;\n channel = new VncChannel(\n { send: (data) => socket.send(data), close: () => socket.close(1000) },\n socket.protocol,\n );\n },\n message: (event, session: RelaySession) => {\n // The first thing the relay sends means it set the viewer up; a failure closes instead.\n if (!accepted && channel !== undefined) {\n accepted = true;\n options.onChannel(channel, session.ready());\n }\n if (typeof event.data !== \"string\") {\n channel?.receive(event.data as ArrayBuffer);\n return;\n }\n const message = parseText(event.data);\n if (message?.type === \"control\") {\n const { type: _type, ...control } = message;\n options.onControl(control);\n } else if (message?.type === \"error\") {\n options.onNotice?.({\n code: message.code ?? \"protocol\",\n message: message.message ?? \"The request failed.\",\n });\n }\n },\n close: (event, session) => {\n channel?.closed(event);\n const match = closeReason.exec(event.reason);\n if (match !== null && !retryableCodes.has(match[1] ?? \"\")) {\n session.fatal(match[2] ?? \"The desktop could not be opened.\");\n } else if (event.code === policyViolation) {\n session.fatal(event.reason || \"The desktop relay refused what the viewer sent.\");\n }\n },\n };\n this.relay = new RelayConnection({\n url: options.url,\n getTicket: options.getTicket,\n onStatus: options.onStatus,\n reconnect: options.reconnect,\n protocol,\n });\n }\n\n start(): void {\n this.relay.start();\n }\n\n retry(): void {\n this.relay.retry();\n }\n\n /** Ask for control, which pauses the agent's inputs. The answer arrives as a `control` update. */\n takeOver(): void {\n this.relay.sendJson({ type: \"takeover\" });\n }\n\n release(): void {\n this.relay.sendJson({ type: \"release\" });\n }\n\n dispose(): void {\n this.relay.dispose();\n }\n}\n\nfunction parseText(text: string): ControlMessage | ErrorMessage | undefined {\n try {\n const value: unknown = JSON.parse(text);\n if (typeof value !== \"object\" || value === null) return undefined;\n const type = (value as { type?: unknown }).type;\n return type === \"control\" || type === \"error\"\n ? (value as ControlMessage | ErrorMessage)\n : undefined;\n } catch {\n return undefined;\n }\n}\n"],"mappings":";;;;;;;;AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;;;ACFP,IAAM,OAAO;AACb,IAAM,SAAS;AAcR,IAAM,aAAN,MAAiB;AAAA,EAUtB,YACmB,MACjB,WAAW,IACX;AAFiB;AAGjB,SAAK,WAAW;AAAA,EAClB;AAAA,EAJmB;AAAA,EAVnB,aAAa;AAAA,EACb;AAAA,EACA,UAA6C;AAAA,EAC7C,SAA4C;AAAA,EAC5C,UAA6C;AAAA,EACrC,UAA2D;AAAA,EAC3D,UAAyB,CAAC;AAAA,EAC1B,QAAQ;AAAA,EAShB,IAAI,aAAqB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,YAA6D;AAC/D,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,UAAU,SAA0D;AACtE,SAAK,UAAU;AACf,QAAI,YAAY,KAAM;AACtB,eAAW,QAAQ,KAAK,QAAQ,OAAO,CAAC,EAAG,SAAQ,EAAE,KAAK,CAAC;AAAA,EAC7D;AAAA,EAEA,KAAK,MAA+C;AAClD,QAAI,KAAK,UAAU,KAAM,MAAK,KAAK,KAAK,IAAI;AAAA,EAC9C;AAAA;AAAA,EAGA,QAAc;AACZ,QAAI,KAAK,UAAU,KAAM;AACzB,SAAK,QAAQ;AACb,SAAK,KAAK,MAAM;AAAA,EAClB;AAAA;AAAA,EAGA,QAAQ,MAAyB;AAC/B,QAAI,KAAK,YAAY,KAAM,MAAK,QAAQ,KAAK,IAAI;AAAA,QAC5C,MAAK,QAAQ,EAAE,KAAK,CAAC;AAAA,EAC5B;AAAA;AAAA,EAGA,OAAO,OAA+C;AACpD,QAAI,KAAK,UAAU,OAAQ;AAC3B,SAAK,QAAQ;AACb,SAAK,UAAU,CAAC;AAChB,SAAK,UAAU,KAAK;AAAA,EACtB;AACF;;;ACnEO,IAAM,qBAAqB;AA6BlC,IAAM,iBAAiB,oBAAI,IAAI,CAAC,uBAAuB,SAAS,CAAC;AAEjE,IAAM,cAAc;AAEpB,IAAM,kBAAkB;AAUjB,IAAM,oBAAN,MAAwB;AAAA,EACZ;AAAA,EAEjB,YAAY,SAAmC;AAC7C,QAAI;AACJ,QAAI,WAAW;AACf,UAAM,WAA0B;AAAA,MAC9B,aAAa;AAAA,MACb,OAAO;AAAA,MACP,MAAM,CAAC,WAAW;AAChB,mBAAW;AACX,kBAAU,IAAI;AAAA,UACZ,EAAE,MAAM,CAAC,SAAS,OAAO,KAAK,IAAI,GAAG,OAAO,MAAM,OAAO,MAAM,GAAI,EAAE;AAAA,UACrE,OAAO;AAAA,QACT;AAAA,MACF;AAAA,MACA,SAAS,CAAC,OAAO,YAA0B;AAEzC,YAAI,CAAC,YAAY,YAAY,QAAW;AACtC,qBAAW;AACX,kBAAQ,UAAU,SAAS,QAAQ,MAAM,CAAC;AAAA,QAC5C;AACA,YAAI,OAAO,MAAM,SAAS,UAAU;AAClC,mBAAS,QAAQ,MAAM,IAAmB;AAC1C;AAAA,QACF;AACA,cAAM,UAAU,UAAU,MAAM,IAAI;AACpC,YAAI,SAAS,SAAS,WAAW;AAC/B,gBAAM,EAAE,MAAM,OAAO,GAAG,QAAQ,IAAI;AACpC,kBAAQ,UAAU,OAAO;AAAA,QAC3B,WAAW,SAAS,SAAS,SAAS;AACpC,kBAAQ,WAAW;AAAA,YACjB,MAAM,QAAQ,QAAQ;AAAA,YACtB,SAAS,QAAQ,WAAW;AAAA,UAC9B,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,OAAO,CAAC,OAAO,YAAY;AACzB,iBAAS,OAAO,KAAK;AACrB,cAAM,QAAQ,YAAY,KAAK,MAAM,MAAM;AAC3C,YAAI,UAAU,QAAQ,CAAC,eAAe,IAAI,MAAM,CAAC,KAAK,EAAE,GAAG;AACzD,kBAAQ,MAAM,MAAM,CAAC,KAAK,kCAAkC;AAAA,QAC9D,WAAW,MAAM,SAAS,iBAAiB;AACzC,kBAAQ,MAAM,MAAM,UAAU,iDAAiD;AAAA,QACjF;AAAA,MACF;AAAA,IACF;AACA,SAAK,QAAQ,IAAI,gBAAgB;AAAA,MAC/B,KAAK,QAAQ;AAAA,MACb,WAAW,QAAQ;AAAA,MACnB,UAAU,QAAQ;AAAA,MAClB,WAAW,QAAQ;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,QAAc;AACZ,SAAK,MAAM,MAAM;AAAA,EACnB;AAAA,EAEA,QAAc;AACZ,SAAK,MAAM,MAAM;AAAA,EACnB;AAAA;AAAA,EAGA,WAAiB;AACf,SAAK,MAAM,SAAS,EAAE,MAAM,WAAW,CAAC;AAAA,EAC1C;AAAA,EAEA,UAAgB;AACd,SAAK,MAAM,SAAS,EAAE,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EAEA,UAAgB;AACd,SAAK,MAAM,QAAQ;AAAA,EACrB;AACF;AAEA,SAAS,UAAU,MAAyD;AAC1E,MAAI;AACF,UAAM,QAAiB,KAAK,MAAM,IAAI;AACtC,QAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,UAAM,OAAQ,MAA6B;AAC3C,WAAO,SAAS,aAAa,SAAS,UACjC,QACD;AAAA,EACN,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AF4GQ,cAoBF,YApBE;AA1KR,IAAM,sBAAsB;AAC5B,IAAM,0BAA0B;AAGhC,SAAS,MAAM,OAA2B,UAA0B;AAClE,MAAI,UAAU,UAAa,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AAC3D,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,CAAC;AACnD;AAEA,IAAM,YAA2B,EAAE,UAAU,YAAY,OAAO,QAAQ,QAAQ,OAAO;AACvF,IAAM,cAA6B,EAAE,OAAO,QAAQ,QAAQ,OAAO;AAO5D,IAAM,iBAAiB;AAAA,EAC5B,SAASA,gBACP;AAAA,IACE;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,KACA;AACA,UAAM,SAAS,OAAuB,IAAI;AAC1C,UAAM,aAAa,OAAsC,MAAS;AAClE,UAAM,SAAS,OAAwB,MAAS;AAChD,UAAM,CAAC,QAAQ,SAAS,IAAI,SAAsB,EAAE,OAAO,UAAU,CAAC;AACtE,UAAM,CAAC,SAAS,UAAU,IAAI,SAA4C,MAAS;AACnF,UAAM,CAAC,QAAQ,SAAS,IAAI,SAA2C,MAAS;AAIhF,UAAM,WAAW,YAAY,SAAS,aAAa,QAAQ,SAAS,QAAQ;AAG5E,UAAM,SAAS,OAAO;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,MAAM,cAAc,mBAAmB;AAAA,MAChD,aAAa,MAAM,kBAAkB,uBAAuB;AAAA,IAC9D,CAAC;AACD,WAAO,UAAU;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,MAAM,cAAc,mBAAmB;AAAA,MAChD,aAAa,MAAM,kBAAkB,uBAAuB;AAAA,IAC9D;AAEA;AAAA,MACE;AAAA,MACA,OAAO;AAAA,QACL,OAAO,MAAM,OAAO,SAAS,MAAM;AAAA,QACnC,WAAW,MAAM,WAAW,SAAS,MAAM;AAAA,QAC3C,UAAU,MAAM,WAAW,SAAS,SAAS;AAAA,QAC7C,SAAS,MAAM,WAAW,SAAS,QAAQ;AAAA,MAC7C;AAAA,MACA,CAAC;AAAA,IACH;AAEA,cAAU,MAAM;AACd,UAAI,OAAO,YAAY,OAAW,QAAO,QAAQ,WAAW;AAAA,IAC9D,GAAG,CAAC,QAAQ,CAAC;AACb,cAAU,MAAM;AACd,UAAI,OAAO,YAAY,OAAW,QAAO,QAAQ,gBAAgB;AAAA,IACnE,GAAG,CAAC,UAAU,CAAC;AACf,cAAU,MAAM;AACd,UAAI,OAAO,YAAY,OAAW,QAAO,QAAQ,eAAe,OAAO,QAAQ;AAAA,IACjF,GAAG,CAAC,YAAY,CAAC;AACjB,cAAU,MAAM;AACd,UAAI,OAAO,YAAY,QAAW;AAChC,eAAO,QAAQ,mBAAmB,OAAO,QAAQ;AAAA,MACnD;AAAA,IACF,GAAG,CAAC,gBAAgB,CAAC;AAErB,cAAU,MAAM;AACd,YAAM,YAAY,OAAO;AACzB,UAAI,cAAc,KAAM,QAAO;AAC/B,UAAI,WAAW;AACf,UAAI;AAEJ,YAAM,UAAU,CAAC,SAAsB;AACrC,YAAI,SAAU;AACd,kBAAU,IAAI;AAEd,YAAI,KAAK,UAAU,OAAQ,YAAW,MAAS;AAC/C,eAAO,QAAQ,iBAAiB,IAAI;AAAA,MACtC;AACA,cAAQ,EAAE,OAAO,UAAU,CAAC;AAE5B,YAAM,YAAY;AAChB,cAAM,EAAE,SAAS,IAAI,IAAI,MAAM,OAAO,cAAc;AACpD,YAAI,SAAU;AAEd,cAAM,OAAO,IAAI,kBAAkB;AAAA,UACjC;AAAA,UACA,WAAW,cAAc,MAAM,OAAO,QAAQ,MAAM;AAAA,UACpD,WAAW,OAAO,QAAQ;AAAA,UAC1B,UAAU;AAAA,UACV,WAAW,CAAC,YAAY;AAEtB,mBAAO,SAAS,WAAW;AAC3B,kBAAM,MAAM,IAAI,IAAI,WAAW,OAAO;AACtC,gBAAI,gBAAgB,OAAO,QAAQ;AACnC,gBAAI,eAAe;AAEnB,gBAAI,gBAAgB;AACpB,gBAAI,WAAW,OAAO,QAAQ;AAG9B,gBAAI,eAAe,OAAO,QAAQ;AAClC,gBAAI,mBAAmB,OAAO,QAAQ;AACtC,mBAAO,UAAU;AAAA,UACnB;AAAA,UACA,WAAW,CAAC,SAAS;AACnB,gBAAI,SAAU;AACd,uBAAW,IAAI;AACf,sBAAU,MAAS;AACnB,mBAAO,QAAQ,kBAAkB,IAAI;AAAA,UACvC;AAAA,UACA,UAAU,CAAC,SAAS;AAClB,gBAAI,CAAC,SAAU,WAAU,IAAI;AAAA,UAC/B;AAAA,QACF,CAAC;AACD,mBAAW,UAAU;AACrB,aAAK,MAAM;AACX,mBAAW,MAAM;AACf,eAAK,QAAQ;AACb,iBAAO,SAAS,WAAW;AAC3B,iBAAO,UAAU;AACjB,qBAAW,UAAU;AAAA,QACvB;AAAA,MACF,GAAG,EAAE,MAAM,CAAC,UAAmB;AAC7B,gBAAQ;AAAA,UACN,OAAO;AAAA,UACP,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QACpD,CAAC;AAAA,MACH,CAAC;AAED,aAAO,MAAM;AACX,mBAAW;AACX,mBAAW;AAAA,MACb;AAAA,IACF,GAAG,CAAC,GAAG,CAAC;AAER,UAAM,QAAQ,MAAM,WAAW,SAAS,MAAM;AAC9C,UAAM,WAAW,MAAM,WAAW,SAAS,SAAS;AACpD,UAAM,UAAU,MAAM,WAAW,SAAS,QAAQ;AAClD,UAAM,aACJ,iBAAiB,SACf,oBAAC,iBAAc,QAAgB,OAAc,IAE7C,aAAa,QAAQ,KAAK;AAE9B,UAAM,gBAA6C;AAAA,MACjD;AAAA,MACA;AAAA,MACA,UAAU,YAAY,SAAS,aAAa;AAAA,MAC5C;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,eACJ,mBAAmB,SACjB,oBAAC,mBAAiB,GAAG,eAAe,IAEpC,eAAe,aAAa;AAGhC,WACE;AAAA,MAAC;AAAA;AAAA,QACE,GAAG;AAAA,QACJ,cAAY,OAAO;AAAA,QACnB,iBAAe,WAAW,KAAK;AAAA,QAC/B,gBAAc,SAAS,QAAQ,OAAO,QAAQ,SAAS,SAAS,OAAO,UAAU;AAAA,QACjF,OAAO,EAAE,GAAG,WAAW,GAAG,MAAM;AAAA,QAEhC;AAAA,8BAAC,SAAI,KAAK,QAAQ,OAAO,aAAa;AAAA,UACrC;AAAA,UACA;AAAA;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AAEA,IAAM,gBAA+B;AAAA,EACnC,UAAU;AAAA,EACV,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,cAAc;AAAA,EACd,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AACT;AAEA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAgC;AAC9B,MAAI,OAAO,UAAU,UAAU,YAAY,OAAW,QAAO;AAC7D,QAAM,MAAM,QAAQ,MAChB,qBACA,QAAQ,OACN,GAAG,QAAQ,UAAU,SAAS,iBAC9B,WACE,cACA;AACR,SACE,qBAAC,SAAI,iCAA8B,IAAG,OAAO,eAC3C;AAAA,wBAAC,UAAM,eAAI;AAAA,IACV,QAAQ,MACP,oBAAC,YAAO,MAAK,UAAS,SAAS,SAAS,qBAExC,IACE,CAAC,YAAY,CAAC,QAAQ,OACxB,oBAAC,YAAO,MAAK,UAAS,SAAS,UAAU,uBAEzC,IACE;AAAA,IACH,WAAW,SAAY,OAAO,oBAAC,UAAK,MAAK,SAAS,iBAAO,SAAQ;AAAA,KACpE;AAEJ;","names":["SandboxDesktop"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anvia/react-ui",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "Composable, headless React UI primitives for Anvia applications.",
5
5
  "author": "anvia",
6
6
  "license": "MIT",
@@ -88,7 +88,7 @@
88
88
  "@tiptap/pm": "^3.32.0",
89
89
  "@tiptap/react": "^3.32.0",
90
90
  "@tiptap/suggestion": "^3.32.0",
91
- "marked": "^18.1.1",
91
+ "marked": "^18.1.2",
92
92
  "react-markdown": "^10.1.0",
93
93
  "remark-gfm": "^4.0.1"
94
94
  },
@@ -99,8 +99,8 @@
99
99
  "@xterm/addon-fit": ">=0.10.0",
100
100
  "@novnc/novnc": ">=1.5.0",
101
101
  "@anvia/client": "^1.6.0",
102
- "@anvia/graph": "^1.1.5",
103
- "@anvia/react": "^1.1.5"
102
+ "@anvia/react": "^1.1.5",
103
+ "@anvia/graph": "^1.1.6"
104
104
  },
105
105
  "peerDependenciesMeta": {
106
106
  "@anvia/graph": {
@@ -123,17 +123,17 @@
123
123
  "@types/react": "^19.3.0",
124
124
  "@types/react-dom": "^19.3.0",
125
125
  "@vitest/coverage-v8": "4.1.11",
126
- "@xterm/addon-fit": "^0.10.0",
127
- "@xterm/xterm": "^5.5.0",
126
+ "@xterm/addon-fit": "^0.11.0",
127
+ "@xterm/xterm": "^6.0.0",
128
128
  "happy-dom": "20.9.0",
129
- "react": "19.3.0",
130
- "react-dom": "19.3.0",
129
+ "react": "19.3.1",
130
+ "react-dom": "19.3.1",
131
131
  "tsup": "^8.5.0",
132
132
  "typescript": "^5.9.3",
133
133
  "vitest": "^4.1.11",
134
- "@anvia/react": "1.1.5",
135
134
  "@anvia/client": "1.6.0",
136
- "@anvia/graph": "1.1.5"
135
+ "@anvia/react": "1.1.5",
136
+ "@anvia/graph": "1.1.6"
137
137
  },
138
138
  "scripts": {
139
139
  "build": "tsup src/index.ts src/attachment/index.ts src/chat/index.ts src/completion/index.ts src/graph-explorer/index.ts src/human-input/index.ts src/image/index.ts src/message/index.ts src/sandbox-desktop/index.ts src/sandbox-terminal/index.ts src/selection-toolbar/index.ts src/shared.ts src/stream/index.ts src/thread-list/index.ts --format esm --dts --sourcemap --clean --external react --external react-dom --external @xterm/xterm --external @xterm/addon-fit --external @novnc/novnc",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/chat/composer.tsx","../src/chat/thread.tsx"],"sourcesContent":["import type {\n ClientDataMap,\n ClientMetadata,\n CreateUIAttachment,\n UIAttachment,\n} from \"@anvia/client\";\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 { AttachmentPrimitive } 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\";\nimport { isComposerEntityData } from \"../strict-json\";\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<TData extends ClientDataMap = ClientDataMap> = {\n input: string;\n attachments: UIAttachment[];\n entities: ComposerEntity[];\n chat: ChatController<ClientMetadata, TData>;\n quote?: ComposerQuote | undefined;\n clear(): void;\n};\n\nexport type ComposerSubmitMessage<TData extends ClientDataMap = ClientDataMap> = (\n args: ComposerSubmitMessageArgs<TData>,\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 active = chat.status === \"submitted\" || chat.status === \"streaming\";\n const canSubmit = hasMessageContent && !active;\n const canStop = active;\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 === \"submitted\" ||\n chat.status === \"streaming\"\n ) {\n return;\n }\n assertComposerEntitiesData(entities);\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 =\n metadata === undefined ? { text: submittedText } : { 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-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 } 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-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 !== \"submitted\" && composer.status !== \"streaming\",\n editorProps: {\n attributes: {\n \"aria-label\": props[\"aria-label\"] ?? \"Message\",\n \"aria-multiline\": \"true\",\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 =\n disabled === true ||\n ariaDisabled ||\n composer.status === \"submitted\" ||\n 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-role\": \"editor\",\n \"data-state\": composerDisabled ? \"disabled\" : \"enabled\",\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:\n props.disabled ?? (composer.status === \"submitted\" || composer.status === \"streaming\"),\n onChange: handleChange,\n onKeyDown: handleKeyDown,\n rows: autoResize ? minRows : rows,\n value: composer.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: undefined,\n parseHTML: (element) => dataFromAttribute(element.getAttribute(\"data-entity-data\")),\n renderHTML: (attributes) => {\n if (attributes.data === undefined) return {};\n if (!isComposerEntityData(attributes.data)) {\n throw new TypeError(\"Composer entity data must be a JSON value.\");\n }\n return { \"data-entity-data\": JSON.stringify(attributes.data) };\n },\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 deleteTriggerWithBackspace: true,\n renderText: ({ node }) => composerEntityText(node.attrs as ComposerEntityAttrs),\n renderHTML: ({ node, options }) => [\n \"span\",\n mergeAttributes(options.HTMLAttributes, {}),\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 if (item.data !== undefined && !isComposerEntityData(item.data)) {\n throw new TypeError(\"Composer trigger item data must be a JSON value.\");\n }\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 === undefined ? previous?.data : attrs.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 | undefined {\n if (value === null) {\n return undefined;\n }\n try {\n const parsed: unknown = JSON.parse(value);\n return isComposerEntityData(parsed) ? parsed : undefined;\n } catch {\n return undefined;\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 = ClientMetadata & {\n quote?: ComposerQuote;\n composer?: ClientMetadata & {\n entities: readonly ClientMetadata[];\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) {\n metadata.composer = { entities: entities.map(composerEntityMetadata) };\n }\n return metadata;\n}\n\nfunction assertComposerEntitiesData(entities: readonly ComposerEntity[]): void {\n for (const entity of entities) {\n if (entity.data !== undefined && !isComposerEntityData(entity.data)) {\n throw new TypeError(\"Composer entity data must be a JSON value.\");\n }\n }\n}\n\nfunction composerEntityMetadata(entity: ComposerEntity): ClientMetadata {\n const metadata: ClientMetadata = {\n id: entity.id,\n triggerId: entity.triggerId,\n trigger: entity.trigger,\n label: entity.label,\n text: entity.text,\n range: { from: entity.range.from, to: entity.range.to },\n };\n if (entity.data !== undefined) {\n metadata.data = entity.data;\n }\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-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-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-state\":\n activeTrigger === undefined\n ? \"closed\"\n : activeTrigger.loading\n ? \"loading\"\n : empty\n ? \"empty\"\n : \"open\",\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-state\": disabled ? \"disabled\" : selected ? \"selected\" : \"idle\",\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 ?? <AttachmentPrimitive.Root />)}\n </InternalAttachmentProvider>\n )),\n \"data-role\": \"attachments\",\n \"data-state\": empty ? \"empty\" : \"populated\",\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 =\n props.disabled ?? (composer.status === \"submitted\" || 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-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 =\n props.disabled ?? (composer.status === \"submitted\" || 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-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 =\n disabledProp || composer.status === \"submitted\" || 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-state\": disabled ? \"disabled\" : dragging ? \"dragging\" : \"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 ComposerPrimitive = {\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 { UIMessage } from \"@anvia/client\";\nimport type { ChatSuggestion, 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 { MessagePrimitive } 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 messagesRef = 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, messagesRef, atBottom, setAtBottom, scrollToBottom }),\n [atBottom, scrollToBottom],\n );\n\n return (\n <InternalThreadProvider value={thread}>\n {renderPrimitive(\n \"div\",\n {\n ...props,\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 = thread.messagesRef.current;\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-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 } 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 } 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-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 !== \"submitted\" && chat.status !== \"streaming\") {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? \"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 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 thread = useThread();\n const composedRef = useMemo(\n () =>\n composeRefs<HTMLDivElement>(ref, (node) => {\n thread.messagesRef.current = node;\n }),\n [ref, thread.messagesRef],\n );\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-state\": empty ? \"empty\" : \"populated\",\n } as PrimitiveProps<\"div\">,\n composedRef,\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-role\": \"suggestions\",\n \"data-state\": empty ? \"empty\" : \"populated\",\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 ??\n (suggestionPrompt.length === 0 || chat.status === \"submitted\" || 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({ text: 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-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-state\": thread.atBottom ? \"bottom\" : \"away\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nfunction defaultMessage(): ReactNode {\n return (\n <MessagePrimitive.Root>\n <MessagePrimitive.Content>\n <MessagePrimitive.Parts />\n </MessagePrimitive.Content>\n <MessagePrimitive.Actions />\n </MessagePrimitive.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 ThreadPrimitive = {\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"]}