@anvia/react-ui 1.3.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/dist/attachment/index.d.ts +3 -21
  2. package/dist/attachment/index.js +3 -12
  3. package/dist/attachment-DsKTPumt.js +89 -0
  4. package/dist/attachment-DsKTPumt.js.map +1 -0
  5. package/dist/chat/index.d.ts +3 -152
  6. package/dist/chat/index.js +3 -25
  7. package/dist/chat-CAnvUEAv.js +1210 -0
  8. package/dist/chat-CAnvUEAv.js.map +1 -0
  9. package/dist/completion/index.d.ts +3 -29
  10. package/dist/completion/index.js +3 -16
  11. package/dist/completion-DDTKoZRJ.js +124 -0
  12. package/dist/completion-DDTKoZRJ.js.map +1 -0
  13. package/dist/connection-DeNq8wHS.js +203 -0
  14. package/dist/connection-DeNq8wHS.js.map +1 -0
  15. package/dist/contexts-B4ijG24z.js +212 -0
  16. package/dist/contexts-B4ijG24z.js.map +1 -0
  17. package/dist/elements-D4vmkkF8.js +19 -0
  18. package/dist/elements-D4vmkkF8.js.map +1 -0
  19. package/dist/graph-explorer/index.d.ts +54 -73
  20. package/dist/graph-explorer/index.d.ts.map +1 -0
  21. package/dist/graph-explorer/index.js +181 -248
  22. package/dist/graph-explorer/index.js.map +1 -1
  23. package/dist/human-input/index.d.ts +3 -78
  24. package/dist/human-input/index.js +3 -21
  25. package/dist/human-input-CsCbZomZ.js +314 -0
  26. package/dist/human-input-CsCbZomZ.js.map +1 -0
  27. package/dist/image/index.d.ts +3 -40
  28. package/dist/image/index.js +3 -12
  29. package/dist/image-D_7vaQCR.js +302 -0
  30. package/dist/image-D_7vaQCR.js.map +1 -0
  31. package/dist/index-B1Qs2Cjv.d.ts +145 -0
  32. package/dist/index-B1Qs2Cjv.d.ts.map +1 -0
  33. package/dist/index-BCBVcl0D.d.ts +277 -0
  34. package/dist/index-BCBVcl0D.d.ts.map +1 -0
  35. package/dist/index-CE22tsua.d.ts +20 -0
  36. package/dist/index-CE22tsua.d.ts.map +1 -0
  37. package/dist/index-CGqtpc6b.d.ts +25 -0
  38. package/dist/index-CGqtpc6b.d.ts.map +1 -0
  39. package/dist/index-DqdyM0Jm.d.ts +7 -0
  40. package/dist/index-DqdyM0Jm.d.ts.map +1 -0
  41. package/dist/index-Mw3ltwSG.d.ts +318 -0
  42. package/dist/index-Mw3ltwSG.d.ts.map +1 -0
  43. package/dist/index.d.ts +7 -40
  44. package/dist/index.js +34 -118
  45. package/dist/index.js.map +1 -1
  46. package/dist/message/index.d.ts +3 -105
  47. package/dist/message/index.js +3 -20
  48. package/dist/message-Dn3wW6yy.js +783 -0
  49. package/dist/message-Dn3wW6yy.js.map +1 -0
  50. package/dist/primitives-xfE7zfwJ.js +15 -0
  51. package/dist/primitives-xfE7zfwJ.js.map +1 -0
  52. package/dist/refs-Djj9rSvB.js +10 -0
  53. package/dist/refs-Djj9rSvB.js.map +1 -0
  54. package/dist/sandbox-desktop/index.d.ts +100 -104
  55. package/dist/sandbox-desktop/index.d.ts.map +1 -0
  56. package/dist/sandbox-desktop/index.js +344 -342
  57. package/dist/sandbox-desktop/index.js.map +1 -1
  58. package/dist/sandbox-terminal/index.d.ts +52 -56
  59. package/dist/sandbox-terminal/index.d.ts.map +1 -0
  60. package/dist/sandbox-terminal/index.js +217 -208
  61. package/dist/sandbox-terminal/index.js.map +1 -1
  62. package/dist/selection-toolbar/index.d.ts +3 -21
  63. package/dist/selection-toolbar/index.js +3 -13
  64. package/dist/selection-toolbar-CIkOoM-7.js +171 -0
  65. package/dist/selection-toolbar-CIkOoM-7.js.map +1 -0
  66. package/dist/shared-BSYElFU2.d.ts +2 -0
  67. package/dist/shared.d.ts +4 -14
  68. package/dist/shared.js +1 -43
  69. package/dist/stream/index.d.ts +2 -22
  70. package/dist/stream/index.js +1 -8
  71. package/dist/stream-CAO0x8_1.js +298 -0
  72. package/dist/stream-CAO0x8_1.js.map +1 -0
  73. package/dist/thread-list/index.d.ts +3 -47
  74. package/dist/thread-list/index.js +3 -18
  75. package/dist/thread-list-xJbGXFrE.js +228 -0
  76. package/dist/thread-list-xJbGXFrE.js.map +1 -0
  77. package/dist/ticket-CoJHBpdF.d.ts +32 -0
  78. package/dist/ticket-CoJHBpdF.d.ts.map +1 -0
  79. package/dist/value-BGGrx72L.js +13 -0
  80. package/dist/value-BGGrx72L.js.map +1 -0
  81. package/package.json +22 -22
  82. package/dist/attachment/index.js.map +0 -1
  83. package/dist/attachment-mbjsroli.d.ts +0 -9
  84. package/dist/chat/index.js.map +0 -1
  85. package/dist/chat-PSj1Fo4W.d.ts +0 -88
  86. package/dist/chunk-22EZJUPM.js +0 -120
  87. package/dist/chunk-22EZJUPM.js.map +0 -1
  88. package/dist/chunk-5FZKTDZR.js +0 -201
  89. package/dist/chunk-5FZKTDZR.js.map +0 -1
  90. package/dist/chunk-6XOJFLX4.js +0 -22
  91. package/dist/chunk-6XOJFLX4.js.map +0 -1
  92. package/dist/chunk-CKA4CE26.js +0 -25
  93. package/dist/chunk-CKA4CE26.js.map +0 -1
  94. package/dist/chunk-DLBNFBXQ.js +0 -425
  95. package/dist/chunk-DLBNFBXQ.js.map +0 -1
  96. package/dist/chunk-E73S3SOF.js +0 -404
  97. package/dist/chunk-E73S3SOF.js.map +0 -1
  98. package/dist/chunk-F6AKBUO3.js +0 -380
  99. package/dist/chunk-F6AKBUO3.js.map +0 -1
  100. package/dist/chunk-HGOPGZNQ.js +0 -195
  101. package/dist/chunk-HGOPGZNQ.js.map +0 -1
  102. package/dist/chunk-KHB5CHAU.js +0 -220
  103. package/dist/chunk-KHB5CHAU.js.map +0 -1
  104. package/dist/chunk-LHABOAOP.js +0 -316
  105. package/dist/chunk-LHABOAOP.js.map +0 -1
  106. package/dist/chunk-N5XQU36W.js +0 -410
  107. package/dist/chunk-N5XQU36W.js.map +0 -1
  108. package/dist/chunk-T3ZFZ3NP.js +0 -30
  109. package/dist/chunk-T3ZFZ3NP.js.map +0 -1
  110. package/dist/chunk-T4IYUEPH.js +0 -1612
  111. package/dist/chunk-T4IYUEPH.js.map +0 -1
  112. package/dist/chunk-W2AHKMRS.js +0 -1092
  113. package/dist/chunk-W2AHKMRS.js.map +0 -1
  114. package/dist/completion/index.js.map +0 -1
  115. package/dist/completion-input-DHlwrhxB.d.ts +0 -24
  116. package/dist/composer-6iCSIq6L.d.ts +0 -111
  117. package/dist/human-input/index.js.map +0 -1
  118. package/dist/human-input-CkLrZ8IC.d.ts +0 -27
  119. package/dist/image/index.js.map +0 -1
  120. package/dist/image-VZv6Ddsn.d.ts +0 -14
  121. package/dist/message/index.js.map +0 -1
  122. package/dist/message-CNRnZQwU.d.ts +0 -14
  123. package/dist/render-CRKWam2v.d.ts +0 -8
  124. package/dist/selection-toolbar/index.js.map +0 -1
  125. package/dist/selection-toolbar-Cwjbuv5S.d.ts +0 -14
  126. package/dist/shared.js.map +0 -1
  127. package/dist/stream/index.js.map +0 -1
  128. package/dist/thread-Bz6-1zaJ.d.ts +0 -12
  129. package/dist/thread-list/index.js.map +0 -1
  130. package/dist/thread-list-On8db4XL.d.ts +0 -34
  131. package/dist/ticket-pexI1zIa.d.ts +0 -33
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-CAnvUEAv.js","names":[],"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":"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"}
@@ -1,29 +1,3 @@
1
- import * as react from 'react';
2
- export { C as CompletionController, a as CompletionInputContextValue, b as CompletionProvider, c as CompletionProviderProps, u as useCompletionContext, d as useCompletionInput } from '../completion-input-DHlwrhxB.js';
3
- import '@anvia/client';
4
- import '@anvia/react';
5
-
6
- declare const CompletionPrimitive: {
7
- readonly Root: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "asChild"> & {
8
- asChild?: boolean;
9
- } & react.RefAttributes<HTMLDivElement>>;
10
- readonly Output: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "asChild"> & {
11
- asChild?: boolean;
12
- } & {
13
- children?: react.ReactNode | ((completion: string) => react.ReactNode);
14
- } & react.RefAttributes<HTMLDivElement>>;
15
- readonly Form: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.FormHTMLAttributes<HTMLFormElement>, HTMLFormElement>, "ref">, "asChild"> & {
16
- asChild?: boolean;
17
- } & react.RefAttributes<HTMLFormElement>>;
18
- readonly Input: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.TextareaHTMLAttributes<HTMLTextAreaElement>, HTMLTextAreaElement>, "ref">, "asChild"> & {
19
- asChild?: boolean;
20
- } & react.RefAttributes<HTMLTextAreaElement>>;
21
- readonly Submit: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref">, "asChild"> & {
22
- asChild?: boolean;
23
- } & react.RefAttributes<HTMLButtonElement>>;
24
- readonly Stop: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref">, "asChild"> & {
25
- asChild?: boolean;
26
- } & react.RefAttributes<HTMLButtonElement>>;
27
- };
28
-
29
- export { CompletionPrimitive };
1
+ import { $ as CompletionProvider, H as CompletionInputContextValue, Q as CompletionController, U as useCompletionInput, et as CompletionProviderProps, tt as useCompletionContext } from "../index-Mw3ltwSG.js";
2
+ import { t as CompletionPrimitive } from "../index-CGqtpc6b.js";
3
+ export { type CompletionController, type CompletionInputContextValue, CompletionPrimitive, CompletionProvider, type CompletionProviderProps, useCompletionContext, useCompletionInput };
@@ -1,16 +1,3 @@
1
- import {
2
- CompletionPrimitive
3
- } from "../chunk-HGOPGZNQ.js";
4
- import "../chunk-T3ZFZ3NP.js";
5
- import {
6
- CompletionProvider,
7
- useCompletionContext,
8
- useCompletionInput
9
- } from "../chunk-E73S3SOF.js";
10
- export {
11
- CompletionPrimitive,
12
- CompletionProvider,
13
- useCompletionContext,
14
- useCompletionInput
15
- };
16
- //# sourceMappingURL=index.js.map
1
+ import { D as useCompletionInput, N as CompletionProvider, P as useCompletionContext } from "../contexts-B4ijG24z.js";
2
+ import { t as CompletionPrimitive } from "../completion-DDTKoZRJ.js";
3
+ export { CompletionPrimitive, CompletionProvider, useCompletionContext, useCompletionInput };
@@ -0,0 +1,124 @@
1
+ import { D as useCompletionInput, E as InternalCompletionInputProvider, P as useCompletionContext } from "./contexts-B4ijG24z.js";
2
+ import { t as renderPrimitive } from "./primitives-xfE7zfwJ.js";
3
+ import { forwardRef, useCallback, useMemo } from "react";
4
+ import { jsx } from "react/jsx-runtime";
5
+ // src/completion/form.tsx
6
+ const CompletionForm = forwardRef(function CompletionForm({ onSubmit, ...props }, ref) {
7
+ const completion = useCompletionContext();
8
+ const active = completion.status === "submitted" || completion.status === "streaming";
9
+ const canSubmit = completion.input.trim().length > 0 && !active;
10
+ const canStop = active;
11
+ const submit = useCallback(async () => {
12
+ if (!canSubmit) return;
13
+ await completion.submit();
14
+ }, [canSubmit, completion]);
15
+ const value = useMemo(() => ({
16
+ input: completion.input,
17
+ setInput: completion.setInput,
18
+ submit,
19
+ stop: completion.stop,
20
+ status: completion.status,
21
+ canSubmit,
22
+ canStop
23
+ }), [
24
+ canStop,
25
+ canSubmit,
26
+ completion.input,
27
+ completion.setInput,
28
+ completion.status,
29
+ completion.stop,
30
+ submit
31
+ ]);
32
+ const handleSubmit = useCallback((event) => {
33
+ onSubmit?.(event);
34
+ if (event.defaultPrevented) return;
35
+ event.preventDefault();
36
+ submit();
37
+ }, [onSubmit, submit]);
38
+ return /* @__PURE__ */ jsx(InternalCompletionInputProvider, {
39
+ value,
40
+ children: renderPrimitive("form", {
41
+ ...props,
42
+ onSubmit: handleSubmit,
43
+ "data-state": completion.status
44
+ }, ref)
45
+ });
46
+ });
47
+ const CompletionInput = forwardRef(function CompletionInput({ onChange, onKeyDown, ...props }, ref) {
48
+ const input = useCompletionInput();
49
+ const handleChange = useCallback((event) => {
50
+ onChange?.(event);
51
+ if (!event.defaultPrevented) input.setInput(event.currentTarget.value);
52
+ }, [input, onChange]);
53
+ const handleKeyDown = useCallback((event) => {
54
+ onKeyDown?.(event);
55
+ if (event.defaultPrevented || event.key !== "Enter" || event.shiftKey || event.nativeEvent.isComposing) return;
56
+ event.preventDefault();
57
+ input.submit();
58
+ }, [input, onKeyDown]);
59
+ return renderPrimitive("textarea", {
60
+ ...props,
61
+ "aria-label": props["aria-label"] ?? "Prompt",
62
+ disabled: props.disabled ?? (input.status === "submitted" || input.status === "streaming"),
63
+ onChange: handleChange,
64
+ onKeyDown: handleKeyDown,
65
+ value: input.input
66
+ }, ref);
67
+ });
68
+ const CompletionSubmit = forwardRef(function CompletionSubmit(props, ref) {
69
+ const input = useCompletionInput();
70
+ const disabled = props.disabled ?? !input.canSubmit;
71
+ return renderPrimitive("button", {
72
+ ...props,
73
+ children: props.children ?? "Complete",
74
+ disabled,
75
+ type: props.type ?? "submit",
76
+ "data-state": disabled ? "disabled" : "enabled"
77
+ }, ref);
78
+ });
79
+ const CompletionStop = forwardRef(function CompletionStop({ onClick, ...props }, ref) {
80
+ const input = useCompletionInput();
81
+ const disabled = props.disabled ?? !input.canStop;
82
+ const handleClick = useCallback((event) => {
83
+ onClick?.(event);
84
+ if (event.defaultPrevented || disabled) return;
85
+ input.stop();
86
+ }, [
87
+ disabled,
88
+ input,
89
+ onClick
90
+ ]);
91
+ return renderPrimitive("button", {
92
+ ...props,
93
+ children: props.children ?? "Stop",
94
+ disabled,
95
+ onClick: handleClick,
96
+ type: props.type ?? "button",
97
+ "data-state": disabled ? "disabled" : "enabled"
98
+ }, ref);
99
+ });
100
+ // src/completion/index.ts
101
+ const CompletionPrimitive = {
102
+ Root: forwardRef(function CompletionRoot(props, ref) {
103
+ const completion = useCompletionContext();
104
+ return renderPrimitive("div", {
105
+ ...props,
106
+ "data-state": completion.status
107
+ }, ref);
108
+ }),
109
+ Output: forwardRef(function CompletionOutput({ children, ...props }, ref) {
110
+ const completion = useCompletionContext();
111
+ const renderedChildren = typeof children === "function" ? children(completion.completion) : children;
112
+ return renderPrimitive("div", {
113
+ ...props,
114
+ children: renderedChildren ?? completion.completion
115
+ }, ref);
116
+ }),
117
+ Form: CompletionForm,
118
+ Input: CompletionInput,
119
+ Submit: CompletionSubmit,
120
+ Stop: CompletionStop
121
+ };
122
+ export { CompletionPrimitive as t };
123
+
124
+ //# sourceMappingURL=completion-DDTKoZRJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion-DDTKoZRJ.js","names":[],"sources":["../src/completion/form.tsx","../src/completion/root.tsx","../src/completion/index.ts"],"sourcesContent":["import {\n type ChangeEvent,\n type FormEvent,\n forwardRef,\n type KeyboardEvent,\n type MouseEvent,\n useCallback,\n useMemo,\n} from \"react\";\n\nimport {\n type CompletionInputContextValue,\n InternalCompletionInputProvider,\n useCompletionContext,\n useCompletionInput,\n} from \"../contexts\";\nimport { type PrimitiveProps, renderPrimitive } from \"../primitives\";\n\nconst CompletionForm = forwardRef<HTMLFormElement, PrimitiveProps<\"form\">>(function CompletionForm(\n { onSubmit, ...props },\n ref,\n) {\n const completion = useCompletionContext();\n const active = completion.status === \"submitted\" || completion.status === \"streaming\";\n const canSubmit = completion.input.trim().length > 0 && !active;\n const canStop = active;\n\n const submit = useCallback(async () => {\n if (!canSubmit) {\n return;\n }\n await completion.submit();\n }, [canSubmit, completion]);\n\n const value = useMemo<CompletionInputContextValue>(\n () => ({\n input: completion.input,\n setInput: completion.setInput,\n submit,\n stop: completion.stop,\n status: completion.status,\n canSubmit,\n canStop,\n }),\n [\n canStop,\n canSubmit,\n completion.input,\n completion.setInput,\n completion.status,\n completion.stop,\n submit,\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 <InternalCompletionInputProvider value={value}>\n {renderPrimitive(\n \"form\",\n {\n ...props,\n onSubmit: handleSubmit,\n \"data-state\": completion.status,\n } as PrimitiveProps<\"form\">,\n ref,\n )}\n </InternalCompletionInputProvider>\n );\n});\n\nconst CompletionInput = forwardRef<HTMLTextAreaElement, PrimitiveProps<\"textarea\">>(\n function CompletionInput({ onChange, onKeyDown, ...props }, ref) {\n const input = useCompletionInput();\n\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLTextAreaElement>) => {\n onChange?.(event);\n if (!event.defaultPrevented) {\n input.setInput(event.currentTarget.value);\n }\n },\n [input, onChange],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<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 input.submit();\n },\n [input, onKeyDown],\n );\n\n return renderPrimitive(\n \"textarea\",\n {\n ...props,\n \"aria-label\": props[\"aria-label\"] ?? \"Prompt\",\n disabled: props.disabled ?? (input.status === \"submitted\" || input.status === \"streaming\"),\n onChange: handleChange,\n onKeyDown: handleKeyDown,\n value: input.input,\n } as PrimitiveProps<\"textarea\">,\n ref,\n );\n },\n);\n\nconst CompletionSubmit = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function CompletionSubmit(props, ref) {\n const input = useCompletionInput();\n const disabled = props.disabled ?? !input.canSubmit;\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Complete\",\n disabled,\n type: props.type ?? \"submit\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nconst CompletionStop = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function CompletionStop({ onClick, ...props }, ref) {\n const input = useCompletionInput();\n const disabled = props.disabled ?? !input.canStop;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n input.stop();\n },\n [disabled, input, 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);\n\nexport { CompletionForm, CompletionInput, CompletionStop, CompletionSubmit };\n","import { forwardRef, type ReactNode } from \"react\";\n\nimport { useCompletionContext } from \"../contexts\";\nimport { type PrimitiveProps, renderPrimitive } from \"../primitives\";\n\ntype CompletionOutputChildren = ReactNode | ((completion: string) => ReactNode);\n\nconst CompletionRoot = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function CompletionRoot(props, ref) {\n const completion = useCompletionContext();\n return renderPrimitive(\n \"div\",\n {\n ...props,\n \"data-state\": completion.status,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype CompletionOutputProps = PrimitiveProps<\"div\"> & {\n children?: CompletionOutputChildren;\n};\n\nconst CompletionOutput = forwardRef<HTMLDivElement, CompletionOutputProps>(\n function CompletionOutput({ children, ...props }, ref) {\n const completion = useCompletionContext();\n const renderedChildren =\n typeof children === \"function\" ? children(completion.completion) : children;\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren ?? completion.completion,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\nexport { CompletionOutput, CompletionRoot };\n","import { CompletionForm, CompletionInput, CompletionStop, CompletionSubmit } from \"./form\";\nimport { CompletionOutput, CompletionRoot } from \"./root\";\n\nexport const CompletionPrimitive = {\n Root: CompletionRoot,\n Output: CompletionOutput,\n Form: CompletionForm,\n Input: CompletionInput,\n Submit: CompletionSubmit,\n Stop: CompletionStop,\n} as const;\n\nexport type {\n CompletionController,\n CompletionInputContextValue,\n CompletionProviderProps,\n} from \"../contexts\";\nexport { CompletionProvider, useCompletionContext, useCompletionInput } from \"../contexts\";\n"],"mappings":"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"}
@@ -0,0 +1,203 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ // src/relay/status.tsx
3
+ const statusStyle = {
4
+ position: "absolute",
5
+ top: 8,
6
+ right: 8,
7
+ padding: "2px 8px",
8
+ borderRadius: 4,
9
+ fontSize: 12,
10
+ background: "rgba(0, 0, 0, 0.7)",
11
+ color: "#fff"
12
+ };
13
+ function DefaultStatus({ status, retry }) {
14
+ if (status.state === "open") return null;
15
+ return /* @__PURE__ */ jsxs("div", {
16
+ role: "status",
17
+ "data-relay-status": status.state,
18
+ style: statusStyle,
19
+ children: [describe(status), status.state === "failed" ? /* @__PURE__ */ jsxs(Fragment, { children: [" ", /* @__PURE__ */ jsx("button", {
20
+ type: "button",
21
+ onClick: retry,
22
+ children: "Retry"
23
+ })] }) : null]
24
+ });
25
+ }
26
+ function describe(status) {
27
+ switch (status.state) {
28
+ case "loading":
29
+ case "connecting": return "Connecting…";
30
+ case "reconnecting": return `Reconnecting in ${Math.max(1, Math.round((status.retryInMs ?? 0) / 1e3))}s…`;
31
+ case "ended": return status.exitCode === void 0 ? "Session ended" : `Session ended (exit ${status.exitCode})`;
32
+ case "failed": return status.message ?? "Disconnected";
33
+ case "open": return "";
34
+ }
35
+ }
36
+ // src/relay/ticket.ts
37
+ /**
38
+ * Turn the latest `ticket` prop into the per-attempt function a connection wants. The prop is read
39
+ * on every attempt, so a function is called afresh each time: tickets are single use.
40
+ */
41
+ function resolveTicket(read) {
42
+ if (read() === void 0) return void 0;
43
+ return () => {
44
+ const ticket = read();
45
+ return typeof ticket === "function" ? ticket() : ticket;
46
+ };
47
+ }
48
+ // src/relay/connection.ts
49
+ /** The prefix a ticket travels under in `Sec-WebSocket-Protocol`. */
50
+ const ticketSubprotocolPrefix = "anvia.ticket.";
51
+ const defaultInitialDelayMs = 500;
52
+ const defaultMaxDelayMs = 15e3;
53
+ const defaultMaxAttempts = 10;
54
+ /** Characters a ticket may use, since it travels as a WebSocket subprotocol (an HTTP token). */
55
+ const subprotocolToken = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
56
+ /**
57
+ * One browser link to a hub relay: opens the socket with a fresh ticket, reconnects with backoff,
58
+ * and reports its state. What the socket carries is the protocol's business, so this knows nothing
59
+ * about terminals or desktops and is shared by both.
60
+ */
61
+ var RelayConnection = class {
62
+ options;
63
+ socketInUse;
64
+ timer;
65
+ attempt = 0;
66
+ everReady = false;
67
+ disposed = false;
68
+ finished = false;
69
+ fatalMessage;
70
+ constructor(options) {
71
+ this.options = options;
72
+ }
73
+ start() {
74
+ this.connect();
75
+ }
76
+ /** Try again now, for a link that gave up. */
77
+ retry() {
78
+ if (this.disposed || !this.finished) return;
79
+ clearTimeout(this.timer);
80
+ this.finished = false;
81
+ this.attempt = 0;
82
+ this.connect();
83
+ }
84
+ /** Send a JSON message, if the socket is open. */
85
+ sendJson(value) {
86
+ if (this.socketInUse?.readyState === WebSocket.OPEN) this.socketInUse.send(JSON.stringify(value));
87
+ }
88
+ /** Send bytes, if the socket is open. */
89
+ sendBinary(data) {
90
+ if (this.socketInUse?.readyState === WebSocket.OPEN) this.socketInUse.send(data);
91
+ }
92
+ dispose() {
93
+ this.disposed = true;
94
+ clearTimeout(this.timer);
95
+ const socket = this.socketInUse;
96
+ this.socketInUse = void 0;
97
+ socket?.close(1e3);
98
+ }
99
+ async connect() {
100
+ if (this.disposed) return;
101
+ const { label } = this.options.protocol;
102
+ this.options.onStatus({ state: "connecting" });
103
+ this.fatalMessage = void 0;
104
+ let ticket;
105
+ try {
106
+ ticket = await this.options.getTicket?.();
107
+ } catch (error) {
108
+ if (this.disposed) return;
109
+ const detail = error instanceof Error ? `: ${error.message}` : "";
110
+ this.scheduleReconnect(`Could not get a ${label} ticket${detail}`);
111
+ return;
112
+ }
113
+ if (this.disposed) return;
114
+ let socket;
115
+ try {
116
+ socket = new WebSocket(this.resolveUrl(), this.resolveProtocols(ticket));
117
+ } catch (error) {
118
+ this.fail(error instanceof Error ? error.message : `Could not open the ${label}.`);
119
+ return;
120
+ }
121
+ if (this.disposed) {
122
+ socket.close(1e3);
123
+ return;
124
+ }
125
+ this.socketInUse = socket;
126
+ socket.binaryType = "arraybuffer";
127
+ const session = {
128
+ ready: () => {
129
+ const reconnected = this.everReady;
130
+ this.everReady = true;
131
+ this.attempt = 0;
132
+ this.options.onStatus({ state: "open" });
133
+ return reconnected;
134
+ },
135
+ ended: (info) => {
136
+ this.finished = true;
137
+ const status = {
138
+ state: "ended",
139
+ message: info.message ?? "ended"
140
+ };
141
+ if (info.exitCode !== void 0) status.exitCode = info.exitCode;
142
+ this.options.onStatus(status);
143
+ },
144
+ fatal: (message) => {
145
+ this.fatalMessage = message;
146
+ }
147
+ };
148
+ const { protocol } = this.options;
149
+ socket.addEventListener("open", () => protocol.open(socket, session));
150
+ socket.addEventListener("message", (event) => protocol.message(event, session));
151
+ socket.addEventListener("close", (event) => {
152
+ if (this.socketInUse === socket) this.socketInUse = void 0;
153
+ protocol.close?.(event, session);
154
+ if (this.disposed || this.finished) return;
155
+ if (this.fatalMessage !== void 0) this.fail(this.fatalMessage);
156
+ else this.scheduleReconnect();
157
+ });
158
+ }
159
+ scheduleReconnect(reason) {
160
+ const { initialDelayMs, maxDelayMs, maxAttempts } = {
161
+ initialDelayMs: defaultInitialDelayMs,
162
+ maxDelayMs: defaultMaxDelayMs,
163
+ maxAttempts: defaultMaxAttempts,
164
+ ...this.options.reconnect
165
+ };
166
+ if (this.attempt >= maxAttempts) {
167
+ this.fail(reason ?? `The connection to the ${this.options.protocol.label} was lost.`);
168
+ return;
169
+ }
170
+ const delay = Math.min(maxDelayMs, initialDelayMs * 2 ** this.attempt) * (.8 + Math.random() * .4);
171
+ this.attempt += 1;
172
+ this.options.onStatus({
173
+ state: "reconnecting",
174
+ attempt: this.attempt,
175
+ retryInMs: Math.round(delay)
176
+ });
177
+ this.timer = setTimeout(() => void this.connect(), delay);
178
+ }
179
+ fail(message) {
180
+ this.finished = true;
181
+ this.options.onStatus({
182
+ state: "failed",
183
+ message
184
+ });
185
+ }
186
+ resolveUrl() {
187
+ const url = new URL(this.options.url, globalThis.location?.href);
188
+ if (url.protocol === "http:") url.protocol = "ws:";
189
+ else if (url.protocol === "https:") url.protocol = "wss:";
190
+ if (this.options.sessionName !== void 0) url.searchParams.set("session", this.options.sessionName);
191
+ return url.toString();
192
+ }
193
+ /** The subprotocols to offer: the relay's, plus the ticket when there is one. */
194
+ resolveProtocols(ticket) {
195
+ const { subprotocol, label } = this.options.protocol;
196
+ if (ticket === void 0) return [subprotocol];
197
+ if (!subprotocolToken.test(ticket)) throw new Error(`The ${label} ticket must use only URL-safe characters (A-Z a-z 0-9 - _ .).`);
198
+ return [subprotocol, `${ticketSubprotocolPrefix}${ticket}`];
199
+ }
200
+ };
201
+ export { DefaultStatus as i, ticketSubprotocolPrefix as n, resolveTicket as r, RelayConnection as t };
202
+
203
+ //# sourceMappingURL=connection-DeNq8wHS.js.map