diff --git a/js/chat/chat.scss b/js/chat/chat.scss index 1e579658b..61131dacf 100644 --- a/js/chat/chat.scss +++ b/js/chat/chat.scss @@ -139,6 +139,12 @@ shiny-chat-message { } } +shiny-status-message { + opacity: 0.8; + text-align: center; + font-size: 0.9em; +} + shiny-chat-input { --_input-padding-top: 0; --_input-padding-bottom: var(--_chat-container-padding, 0.25rem); diff --git a/js/chat/chat.ts b/js/chat/chat.ts index 8c6281af5..74d071d7e 100644 --- a/js/chat/chat.ts +++ b/js/chat/chat.ts @@ -18,6 +18,7 @@ type Message = { icon?: string; operation: "append" | null; }; + type ShinyChatMessage = { id: string; handler: string; @@ -31,6 +32,12 @@ type UpdateUserInput = { focus?: false; }; +type StatusMessage = { + content: string; + content_type: Exclude; + type: "dynamic" | "static"; +}; + // https://github.com/microsoft/TypeScript/issues/28357#issuecomment-748550734 declare global { interface GlobalEventHandlersEventMap { @@ -40,11 +47,13 @@ declare global { "shiny-chat-clear-messages": CustomEvent; "shiny-chat-update-user-input": CustomEvent; "shiny-chat-remove-loading-message": CustomEvent; + "shiny-chat-append-status-message": CustomEvent; } } const CHAT_MESSAGE_TAG = "shiny-chat-message"; const CHAT_USER_MESSAGE_TAG = "shiny-user-message"; +const CHAT_STATUS_MESSAGE_TAG = "shiny-status-message"; const CHAT_MESSAGES_TAG = "shiny-chat-messages"; const CHAT_INPUT_TAG = "shiny-chat-input"; const CHAT_CONTAINER_TAG = "shiny-chat-container"; @@ -112,6 +121,32 @@ class ChatUserMessage extends LightElement { } } +class ChatStatusMessage extends LightElement { + @property() content = ""; + @property() content_type: Exclude = "text"; + @property() type: "dynamic" | "static" = "static"; + + render() { + const content = + this.content_type === "html" ? unsafeHTML(this.content) : this.content; + return html`${content}`; + } + + updated(changedProperties: Map) { + super.updated(changedProperties); + if ( + changedProperties.has("content") || + changedProperties.has("content_type") + ) { + this.#scrollIntoView(); + } + } + + #scrollIntoView() { + this.scrollIntoView({ behavior: "smooth", block: "end" }); + } +} + class ChatMessages extends LightElement { render() { return html``; @@ -277,7 +312,7 @@ class ChatContainer extends LightElement { } private get lastMessage(): ChatMessage | null { - const last = this.messages.lastElementChild; + const last = this.messages.querySelector("shiny-chat-message:last-child"); return last ? (last as ChatMessage) : null; } @@ -324,6 +359,10 @@ class ChatContainer extends LightElement { "shiny-chat-append-message-chunk", this.#onAppendChunk ); + this.addEventListener( + "shiny-chat-append-status-message", + this.#onAppendStatus + ); this.addEventListener("shiny-chat-clear-messages", this.#onClear); this.addEventListener( "shiny-chat-update-user-input", @@ -349,6 +388,10 @@ class ChatContainer extends LightElement { "shiny-chat-append-message-chunk", this.#onAppendChunk ); + this.removeEventListener( + "shiny-chat-append-status-message", + this.#onAppendStatus + ); this.removeEventListener("shiny-chat-clear-messages", this.#onClear); this.removeEventListener( "shiny-chat-update-user-input", @@ -443,6 +486,25 @@ class ChatContainer extends LightElement { } } + #onAppendStatus(event: CustomEvent): void { + if (event.detail.type === "dynamic") { + if (this.messages.lastChild instanceof ChatStatusMessage) { + if (this.messages.lastChild.type == "dynamic") { + // Update previous status message if last message was a status item + this.messages.lastChild.setAttribute("content", event.detail.content); + this.messages.lastChild.setAttribute( + "content_type", + event.detail.content_type + ); + return; + } + } + } + + const status = createElement(CHAT_STATUS_MESSAGE_TAG, event.detail); + this.messages.appendChild(status); + } + #onClear(): void { this.messages.innerHTML = ""; } @@ -523,6 +585,7 @@ class ChatContainer extends LightElement { customElements.define(CHAT_MESSAGE_TAG, ChatMessage); customElements.define(CHAT_USER_MESSAGE_TAG, ChatUserMessage); +customElements.define(CHAT_STATUS_MESSAGE_TAG, ChatStatusMessage); customElements.define(CHAT_MESSAGES_TAG, ChatMessages); customElements.define(CHAT_INPUT_TAG, ChatInput); customElements.define(CHAT_CONTAINER_TAG, ChatContainer); diff --git a/shiny/templates/chat/llms/ollama-multi/_template.json b/shiny/templates/chat/llms/ollama-multi/_template.json new file mode 100644 index 000000000..8aa9f036c --- /dev/null +++ b/shiny/templates/chat/llms/ollama-multi/_template.json @@ -0,0 +1,5 @@ +{ + "type": "app", + "id": "chat-ai-ollama", + "title": "Chat with local models using Ollama" +} diff --git a/shiny/templates/chat/llms/ollama-multi/app.py b/shiny/templates/chat/llms/ollama-multi/app.py new file mode 100644 index 000000000..e67ca0007 --- /dev/null +++ b/shiny/templates/chat/llms/ollama-multi/app.py @@ -0,0 +1,186 @@ +# ------------------------------------------------------------------------------------ +# Shiny Chat with local models, powered by Ollama +# ------------------------------------------------------------------------------------ + +# ChatOllama() requires an Ollama model server to be running locally. +# See the docs for more information on how to set up a local Ollama server. +# https://posit-dev.github.io/chatlas/reference/ChatOllama.html +import ollama +from chatlas import ChatOllama + +from shiny import reactive, req +from shiny.express import input, render, ui +from shiny.reactive import ExtendedTask + +# Get installed models and choose an initial model for the chat +models_all = [m.model for m in ollama.list().models] + +# Pick smallest llama3 if available, or default to the most recent model +default_model = models_all[0] +models_all.sort() +if any([x.startswith("llama3") for x in models_all]): + default_model = [x for x in models_all if x.startswith("llama3")][0] + + +# Set some Shiny page options +ui.page_opts( + title="Hello Ollama Chat", + fillable=True, + fillable_mobile=True, +) + +with ui.sidebar(title="Chat options"): + ui.input_select( + "model", + "Model", + choices=models_all, + selected=default_model, + ) + with ui.div(): + ui.input_slider("temperature", "Creativity", min=0, max=1, value=0.5, step=0.25) + with ui.help_text(style="text-align: right;"): + + @render.text + @reactive.event(input.temperature) + def text_creativity(): + if input.temperature() < 0.25: + return "No creativity" + elif input.temperature() < 0.5: + return "Low creativity" + elif input.temperature() < 0.75: + return "Medium creativity" + elif input.temperature() < 1: + return "High creativity" + else: + return "Max creativity" + + ui.input_action_button("edit_last", "Edit last message", disabled=True) + ui.input_action_button("clear", "Reset chat") + + +# Create and display a Shiny chat component +INITIAL_MESSAGE = "Hello! How can I help you today?" +chat = ui.Chat(id="chat", messages=[INITIAL_MESSAGE]) + +chat.ui() + +chat_client = reactive.value[ChatOllama](None) + + +async def cancel_chat_stream(chat: ChatOllama, stream: ExtendedTask): + if stream is not None and stream.status() == "running": + # Cancel current stream + stream.cancel() + # Tell chat that the message is complete + stream_id = chat._current_stream_id + await chat._append_message( + { + "type": "assistant", + "content": "... [cancelled].", + }, + chunk="end", + stream_id=stream_id, + ) + await chat.append_status_message( + ui.div( + "The previous response was cancelled.", + class_="alert alert-warning", + style="margin-inline: auto; width: max-content;", + ), + type="static", + ) + + +@reactive.effect +@reactive.event(input.model) +async def change_model(): + if chat_client.get() is None: + client = ChatOllama(model=input.model()) + await chat.append_status_message( + ui.HTML(f"Using model {input.model()}"), type="dynamic" + ) + else: + stream = streaming_task.get() + await cancel_chat_stream(chat, stream) + + # TODO: Turns are broken when you cancel an in-progress stream + turns = chat_client.get().get_turns() + client = ChatOllama(model=input.model(), turns=turns) + await chat.append_status_message( + ui.HTML(f"Model switched to {input.model()}"), type="dynamic" + ) + + chat_client.set(client) + + +streaming_task = reactive.value[ExtendedTask | None](None) + + +# Generate a response when the user submits a message +@chat.on_user_submit +async def handle_user_input(user_input: str): + response = chat_client.get().stream( + user_input, kwargs={"temperature": input.temperature()} + ) + task = await chat.append_message_stream(response) + streaming_task.set(task) + + +@reactive.effect +@reactive.event(input.clear) +async def reset_chat(): + stream = streaming_task.get() + if not isinstance(stream, ExtendedTask): + return + + is_streaming = stream.status() == "running" + + if is_streaming: + await cancel_chat_stream(chat, stream) + else: + await chat.clear_messages() + chat_client.set(ChatOllama(model=input.model())) + await chat.append_status_message( + ui.HTML(f"Using model {input.model()}") + ) + await chat.append_message(INITIAL_MESSAGE) + + +@reactive.effect +def toggle_last_message_button(): + task = streaming_task.get() + if not isinstance(task, ExtendedTask): + return + + is_streaming = task.status() == "running" + ui.update_action_button("edit_last", disabled=is_streaming) + ui.update_action_button( + "clear", label="Cancel chat" if is_streaming else "Reset chat" + ) + + +@reactive.effect +@reactive.event(input.edit_last) +async def edit_last_message(): + req(streaming_task.get().status() != "streaming") + + messages = chat.messages() + req(len(messages) > 1) + + # Find the index of the last user message + last_user_index = next( + (i for i, msg in reversed(list(enumerate(messages))) if msg["role"] == "user"), + None, + ) + if last_user_index is None: + raise ValueError("No user messages found") + + last_user_msg = messages[last_user_index]["content"] + messages = messages[:last_user_index] # Keep only messages before last user message + + # Reset chat UI state prior to last user message + await chat.clear_messages() + for message in messages: + await chat.append_message(message) + + chat.update_user_input(value=last_user_msg, focus=True) diff --git a/shiny/templates/chat/llms/ollama-multi/requirements.txt b/shiny/templates/chat/llms/ollama-multi/requirements.txt new file mode 100644 index 000000000..5901288be --- /dev/null +++ b/shiny/templates/chat/llms/ollama-multi/requirements.txt @@ -0,0 +1,4 @@ +shiny +tokenizers +chatlas +ollama diff --git a/shiny/templates/chat/llms/ollama/_template.json b/shiny/templates/chat/llms/ollama/_template.json index fb0fb217a..4994bc836 100644 --- a/shiny/templates/chat/llms/ollama/_template.json +++ b/shiny/templates/chat/llms/ollama/_template.json @@ -1,7 +1,7 @@ { "type": "app", "id": "chat-ai-ollama", - "title": "Chat AI using Ollama", + "title": "Basic Chat AI using Ollama", "next_steps": [ "If you haven't already, download the Ollama executable from https://ollama.com/", "Run the executable and download the relevant model (llama3.2)", diff --git a/shiny/ui/_chat.py b/shiny/ui/_chat.py index 1125c2e0c..2e417b051 100644 --- a/shiny/ui/_chat.py +++ b/shiny/ui/_chat.py @@ -38,7 +38,12 @@ as_provider_message, ) from ._chat_tokenizer import TokenEncoding, TokenizersEncoding, get_default_tokenizer -from ._chat_types import ChatMessage, ClientMessage, TransformedMessage +from ._chat_types import ( + ChatMessage, + ChatStatusMessage, + ClientMessage, + TransformedMessage, +) from ._html_deps_py_shiny import chat_deps from .fill import as_fill_item, as_fillable_container @@ -776,6 +781,34 @@ async def _send_append_message( # TODO: Joe said it's a good idea to yield here, but I'm not sure why? # await asyncio.sleep(0) + async def append_status_message( + self, + content: str | Tag | HTML, + type: Literal["dynamic", "static"] = "dynamic", + ) -> None: + """ + Append a status message to the chat. + + Adds or updates a status message in the chat messages area. + + Parameters + ---------- + content + The content of the message to append, as a string of plain text or as HTML + in the form of :class:`~htmltools.Tag` or :class:`~htmltools.HTML`. + type + Whether this status message is `"dynamic"` and can be replaced by a + subsequent status message before the next user or assistant turn, or if the + message should not be updated by subsequent status messages (`"static"`). + """ + + msg: ChatStatusMessage = { + "content": str(content), + "content_type": "html" if isinstance(content, (Tag, HTML)) else "text", + "type": type, + } + await self._send_custom_message("shiny-chat-append-status-message", msg) + @overload def transform_user_input( self, fn: TransformUserInput | TransformUserInputAsync @@ -1147,7 +1180,9 @@ def destroy(self): async def _remove_loading_message(self): await self._send_custom_message("shiny-chat-remove-loading-message", None) - async def _send_custom_message(self, handler: str, obj: ClientMessage | None): + async def _send_custom_message( + self, handler: str, obj: ClientMessage | ChatStatusMessage | None + ): await self._session.send_custom_message( "shinyChatMessage", { diff --git a/shiny/ui/_chat_types.py b/shiny/ui/_chat_types.py index b10bfdf29..3338d48fa 100644 --- a/shiny/ui/_chat_types.py +++ b/shiny/ui/_chat_types.py @@ -16,6 +16,12 @@ class ChatMessage(TypedDict): role: Role +class ChatStatusMessage(TypedDict): + content: str + content_type: Literal["html", "text"] + type: Literal["dynamic", "static"] + + # A message once transformed have been applied class TransformedMessage(TypedDict): content_client: str | HTML diff --git a/shiny/www/py-shiny/chat/chat.css b/shiny/www/py-shiny/chat/chat.css index 32717e613..e627a06da 100644 --- a/shiny/www/py-shiny/chat/chat.css +++ b/shiny/www/py-shiny/chat/chat.css @@ -1,2 +1,2 @@ -@charset "UTF-8";shiny-chat-container{--shiny-chat-border: var(--bs-border-width, 1px) solid var(--bs-border-color, #e9ecef);--shiny-chat-user-message-bg: RGBA(var(--bs-primary-rgb, 0, 123, 194), .06);--_chat-container-padding: .25rem;display:grid;grid-template-columns:1fr;grid-template-rows:1fr auto;margin:0 auto;gap:0;padding:var(--_chat-container-padding);padding-bottom:0}shiny-chat-container p:last-child{margin-bottom:0}shiny-chat-container .suggestion,shiny-chat-container [data-suggestion]{cursor:pointer}shiny-chat-container .suggestion{color:var(--bs-link-color, #007bc2);text-decoration-color:var(--bs-link-color, #007bc2);text-decoration-line:underline;text-decoration-style:dotted;text-underline-offset:2px;text-underline-offset:4px;text-decoration-thickness:2px;padding:2px}shiny-chat-container .suggestion:hover{text-decoration-style:solid}shiny-chat-container .suggestion:after{content:"\2726";display:inline-block;margin-inline-start:.15em}shiny-chat-container .suggestion.submit:after,shiny-chat-container .suggestion[data-suggestion-submit=""]:after,shiny-chat-container .suggestion[data-suggestion-submit=true]:after{content:"\21b5"}shiny-chat-container .card[data-suggestion]:hover{color:var(--bs-link-color, #007bc2);border-color:rgba(var(--bs-link-color-rgb),.5)}shiny-chat-messages{display:flex;flex-direction:column;gap:2rem;overflow:auto;margin-bottom:1rem;--_scroll-margin: 1rem;padding-right:var(--_scroll-margin);margin-right:calc(-1 * var(--_scroll-margin))}shiny-chat-message{display:grid;grid-template-columns:auto minmax(0,1fr);gap:1rem}shiny-chat-message>*{height:fit-content}shiny-chat-message .message-icon{border-radius:50%;border:var(--shiny-chat-border);height:2rem;width:2rem;display:grid;place-items:center;overflow:clip}shiny-chat-message .message-icon>*{height:100%;width:100%;max-width:100%;max-height:100%;margin:0!important;object-fit:contain}shiny-chat-message .message-icon>svg,shiny-chat-message .message-icon>.icon,shiny-chat-message .message-icon>.fa,shiny-chat-message .message-icon>.bi{max-height:66%;max-width:66%}shiny-chat-message .message-icon:has(> .border-0){border:none;border-radius:unset;overflow:unset}shiny-chat-message shiny-markdown-stream{align-self:center}shiny-user-message{align-self:flex-end;padding:.75rem 1rem;border-radius:10px;background-color:var(--shiny-chat-user-message-bg);max-width:100%}shiny-user-message[content_type=text],shiny-chat-message[content_type=text]{white-space:pre;overflow-x:auto}shiny-chat-input{--_input-padding-top: 0;--_input-padding-bottom: var(--_chat-container-padding, .25rem);margin-top:calc(-1 * var(--_input-padding-top));position:sticky;bottom:calc(-1 * var(--_input-padding-bottom));padding-block:var(--_input-padding-top) var(--_input-padding-bottom)}shiny-chat-input textarea{--bs-border-radius: 26px;resize:none;padding-right:36px!important;max-height:175px}shiny-chat-input textarea::placeholder{color:var(--bs-gray-600, #707782)!important}shiny-chat-input button{position:absolute;bottom:calc(6px + var(--_input-padding-bottom));right:8px;background-color:transparent;color:var(--bs-primary, #007bc2);transition:color .25s ease-in-out;border:none;padding:0;cursor:pointer;line-height:16px;border-radius:50%}shiny-chat-input button:disabled{cursor:not-allowed;color:var(--bs-gray-500, #8d959e)}.shiny-busy:has(shiny-chat-input[disabled]):after{display:none} +@charset "UTF-8";shiny-chat-container{--shiny-chat-border: var(--bs-border-width, 1px) solid var(--bs-border-color, #e9ecef);--shiny-chat-user-message-bg: RGBA(var(--bs-primary-rgb, 0, 123, 194), .06);--_chat-container-padding: .25rem;display:grid;grid-template-columns:1fr;grid-template-rows:1fr auto;margin:0 auto;gap:0;padding:var(--_chat-container-padding);padding-bottom:0}shiny-chat-container p:last-child{margin-bottom:0}shiny-chat-container .suggestion,shiny-chat-container [data-suggestion]{cursor:pointer}shiny-chat-container .suggestion{color:var(--bs-link-color, #007bc2);text-decoration-color:var(--bs-link-color, #007bc2);text-decoration-line:underline;text-decoration-style:dotted;text-underline-offset:2px;text-underline-offset:4px;text-decoration-thickness:2px;padding:2px}shiny-chat-container .suggestion:hover{text-decoration-style:solid}shiny-chat-container .suggestion:after{content:"\2726";display:inline-block;margin-inline-start:.15em}shiny-chat-container .suggestion.submit:after,shiny-chat-container .suggestion[data-suggestion-submit=""]:after,shiny-chat-container .suggestion[data-suggestion-submit=true]:after{content:"\21b5"}shiny-chat-container .card[data-suggestion]:hover{color:var(--bs-link-color, #007bc2);border-color:rgba(var(--bs-link-color-rgb),.5)}shiny-chat-messages{display:flex;flex-direction:column;gap:2rem;overflow:auto;margin-bottom:1rem;--_scroll-margin: 1rem;padding-right:var(--_scroll-margin);margin-right:calc(-1 * var(--_scroll-margin))}shiny-chat-message{display:grid;grid-template-columns:auto minmax(0,1fr);gap:1rem}shiny-chat-message>*{height:fit-content}shiny-chat-message .message-icon{border-radius:50%;border:var(--shiny-chat-border);height:2rem;width:2rem;display:grid;place-items:center;overflow:clip}shiny-chat-message .message-icon>*{height:100%;width:100%;max-width:100%;max-height:100%;margin:0!important;object-fit:contain}shiny-chat-message .message-icon>svg,shiny-chat-message .message-icon>.icon,shiny-chat-message .message-icon>.fa,shiny-chat-message .message-icon>.bi{max-height:66%;max-width:66%}shiny-chat-message .message-icon:has(> .border-0){border:none;border-radius:unset;overflow:unset}shiny-chat-message shiny-markdown-stream{align-self:center}shiny-user-message{align-self:flex-end;padding:.75rem 1rem;border-radius:10px;background-color:var(--shiny-chat-user-message-bg);max-width:100%}shiny-user-message[content_type=text],shiny-chat-message[content_type=text]{white-space:pre;overflow-x:auto}shiny-status-message{opacity:.8;text-align:center;font-size:.9em}shiny-chat-input{--_input-padding-top: 0;--_input-padding-bottom: var(--_chat-container-padding, .25rem);margin-top:calc(-1 * var(--_input-padding-top));position:sticky;bottom:calc(-1 * var(--_input-padding-bottom));padding-block:var(--_input-padding-top) var(--_input-padding-bottom)}shiny-chat-input textarea{--bs-border-radius: 26px;resize:none;padding-right:36px!important;max-height:175px}shiny-chat-input textarea::placeholder{color:var(--bs-gray-600, #707782)!important}shiny-chat-input button{position:absolute;bottom:calc(6px + var(--_input-padding-bottom));right:8px;background-color:transparent;color:var(--bs-primary, #007bc2);transition:color .25s ease-in-out;border:none;padding:0;cursor:pointer;line-height:16px;border-radius:50%}shiny-chat-input button:disabled{cursor:not-allowed;color:var(--bs-gray-500, #8d959e)}.shiny-busy:has(shiny-chat-input[disabled]):after{display:none} /*# sourceMappingURL=chat.css.map */ diff --git a/shiny/www/py-shiny/chat/chat.css.map b/shiny/www/py-shiny/chat/chat.css.map index 83dc46401..74dd0a8d4 100644 --- a/shiny/www/py-shiny/chat/chat.css.map +++ b/shiny/www/py-shiny/chat/chat.css.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../../../js/chat/chat.scss"], - "sourcesContent": ["@charset \"UTF-8\";\nshiny-chat-container {\n --shiny-chat-border: var(--bs-border-width, 1px) solid var(--bs-border-color, #e9ecef);\n --shiny-chat-user-message-bg: RGBA(var(--bs-primary-rgb, 0, 123, 194), 0.06);\n --_chat-container-padding: 0.25rem;\n display: grid;\n grid-template-columns: 1fr;\n grid-template-rows: 1fr auto;\n margin: 0 auto;\n gap: 0;\n padding: var(--_chat-container-padding);\n padding-bottom: 0;\n}\nshiny-chat-container p:last-child {\n margin-bottom: 0;\n}\nshiny-chat-container .suggestion,\nshiny-chat-container [data-suggestion] {\n cursor: pointer;\n}\nshiny-chat-container .suggestion {\n color: var(--bs-link-color, #007bc2);\n text-decoration-color: var(--bs-link-color, #007bc2);\n text-decoration-line: underline;\n text-decoration-style: dotted;\n text-decoration-thickness: 2px;\n text-underline-offset: 2px;\n text-underline-offset: 4px;\n text-decoration-thickness: 2px;\n padding: 2px;\n}\nshiny-chat-container .suggestion:hover {\n text-decoration-style: solid;\n}\nshiny-chat-container .suggestion::after {\n content: \"\u2726\";\n display: inline-block;\n margin-inline-start: 0.15em;\n}\nshiny-chat-container .suggestion.submit::after, shiny-chat-container .suggestion[data-suggestion-submit=\"\"]::after, shiny-chat-container .suggestion[data-suggestion-submit=true]::after {\n content: \"\u21B5\";\n}\nshiny-chat-container .card[data-suggestion]:hover {\n color: var(--bs-link-color, #007bc2);\n border-color: rgba(var(--bs-link-color-rgb), 0.5);\n}\n\nshiny-chat-messages {\n display: flex;\n flex-direction: column;\n gap: 2rem;\n overflow: auto;\n margin-bottom: 1rem;\n --_scroll-margin: 1rem;\n padding-right: var(--_scroll-margin);\n margin-right: calc(-1 * var(--_scroll-margin));\n}\n\nshiny-chat-message {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr);\n gap: 1rem;\n /* Vertically center the 2nd column (message content) */\n}\nshiny-chat-message > * {\n height: fit-content;\n}\nshiny-chat-message .message-icon {\n border-radius: 50%;\n border: var(--shiny-chat-border);\n height: 2rem;\n width: 2rem;\n display: grid;\n place-items: center;\n overflow: clip;\n}\nshiny-chat-message .message-icon > * {\n height: 100%;\n width: 100%;\n max-width: 100%;\n max-height: 100%;\n margin: 0 !important;\n object-fit: contain;\n}\nshiny-chat-message .message-icon > svg,\nshiny-chat-message .message-icon > .icon,\nshiny-chat-message .message-icon > .fa,\nshiny-chat-message .message-icon > .bi {\n max-height: 66%;\n max-width: 66%;\n}\nshiny-chat-message .message-icon:has(> .border-0) {\n border: none;\n border-radius: unset;\n overflow: unset;\n}\nshiny-chat-message shiny-markdown-stream {\n align-self: center;\n}\n\n/* Align the user message to the right */\nshiny-user-message {\n align-self: flex-end;\n padding: 0.75rem 1rem;\n border-radius: 10px;\n background-color: var(--shiny-chat-user-message-bg);\n max-width: 100%;\n}\n\nshiny-user-message[content_type=text],\nshiny-chat-message[content_type=text] {\n white-space: pre;\n overflow-x: auto;\n}\n\nshiny-chat-input {\n --_input-padding-top: 0;\n --_input-padding-bottom: var(--_chat-container-padding, 0.25rem);\n margin-top: calc(-1 * var(--_input-padding-top));\n position: sticky;\n bottom: calc(-1 * var(--_input-padding-bottom));\n padding-block: var(--_input-padding-top) var(--_input-padding-bottom);\n}\nshiny-chat-input textarea {\n --bs-border-radius: 26px;\n resize: none;\n padding-right: 36px !important;\n max-height: 175px;\n}\nshiny-chat-input textarea::placeholder {\n color: var(--bs-gray-600, #707782) !important;\n}\nshiny-chat-input button {\n position: absolute;\n bottom: calc(6px + var(--_input-padding-bottom));\n right: 8px;\n background-color: transparent;\n color: var(--bs-primary, #007bc2);\n transition: color 0.25s ease-in-out;\n border: none;\n padding: 0;\n cursor: pointer;\n line-height: 16px;\n border-radius: 50%;\n}\nshiny-chat-input button:disabled {\n cursor: not-allowed;\n color: var(--bs-gray-500, #8d959e);\n}\n\n/*\n Disable the page-level pulse when the chat input is disabled\n (i.e., when a response is being generated and brought into the chat)\n*/\n.shiny-busy:has(shiny-chat-input[disabled])::after {\n display: none;\n}"], - "mappings": "iBACA,qBACE,uFACA,4EACA,kCACA,aACA,0BACA,4BAPF,cASE,MACA,uCACA,iBAEF,kCACE,gBAEF,wEAEE,eAEF,iCACE,oCACA,oDACA,+BACA,6BAEA,0BACA,0BACA,8BA5BF,YA+BA,uCACE,4BAEF,uCACE,gBACA,qBACA,0BAEF,oLACE,gBAEF,kDACE,oCACA,+CAGF,oBACE,aACA,sBACA,SACA,cACA,mBACA,uBACA,oCACA,8CAGF,mBACE,aACA,yCACA,SAGF,qBACE,mBAEF,iCAnEA,kBAqEE,gCACA,YACA,WACA,aACA,mBACA,cAEF,mCACE,YACA,WACA,eACA,gBAhFF,mBAkFE,mBAEF,sJAIE,eACA,cAEF,kDACE,YACA,oBACA,eAEF,yCACE,kBAIF,mBACE,oBAtGF,uCAyGE,mDACA,eAGF,4EAEE,gBACA,gBAGF,iBACE,wBACA,gEACA,gDACA,gBACA,+CACA,qEAEF,0BACE,yBACA,YACA,6BACA,iBAEF,uCACE,4CAEF,wBACE,kBACA,gDACA,UACA,6BACA,iCACA,kCACA,YA3IF,UA6IE,eACA,iBA9IF,kBAiJA,iCACE,mBACA,kCAOF,kDACE", + "sourcesContent": ["@charset \"UTF-8\";\nshiny-chat-container {\n --shiny-chat-border: var(--bs-border-width, 1px) solid var(--bs-border-color, #e9ecef);\n --shiny-chat-user-message-bg: RGBA(var(--bs-primary-rgb, 0, 123, 194), 0.06);\n --_chat-container-padding: 0.25rem;\n display: grid;\n grid-template-columns: 1fr;\n grid-template-rows: 1fr auto;\n margin: 0 auto;\n gap: 0;\n padding: var(--_chat-container-padding);\n padding-bottom: 0;\n}\nshiny-chat-container p:last-child {\n margin-bottom: 0;\n}\nshiny-chat-container .suggestion,\nshiny-chat-container [data-suggestion] {\n cursor: pointer;\n}\nshiny-chat-container .suggestion {\n color: var(--bs-link-color, #007bc2);\n text-decoration-color: var(--bs-link-color, #007bc2);\n text-decoration-line: underline;\n text-decoration-style: dotted;\n text-decoration-thickness: 2px;\n text-underline-offset: 2px;\n text-underline-offset: 4px;\n text-decoration-thickness: 2px;\n padding: 2px;\n}\nshiny-chat-container .suggestion:hover {\n text-decoration-style: solid;\n}\nshiny-chat-container .suggestion::after {\n content: \"\u2726\";\n display: inline-block;\n margin-inline-start: 0.15em;\n}\nshiny-chat-container .suggestion.submit::after, shiny-chat-container .suggestion[data-suggestion-submit=\"\"]::after, shiny-chat-container .suggestion[data-suggestion-submit=true]::after {\n content: \"\u21B5\";\n}\nshiny-chat-container .card[data-suggestion]:hover {\n color: var(--bs-link-color, #007bc2);\n border-color: rgba(var(--bs-link-color-rgb), 0.5);\n}\n\nshiny-chat-messages {\n display: flex;\n flex-direction: column;\n gap: 2rem;\n overflow: auto;\n margin-bottom: 1rem;\n --_scroll-margin: 1rem;\n padding-right: var(--_scroll-margin);\n margin-right: calc(-1 * var(--_scroll-margin));\n}\n\nshiny-chat-message {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr);\n gap: 1rem;\n /* Vertically center the 2nd column (message content) */\n}\nshiny-chat-message > * {\n height: fit-content;\n}\nshiny-chat-message .message-icon {\n border-radius: 50%;\n border: var(--shiny-chat-border);\n height: 2rem;\n width: 2rem;\n display: grid;\n place-items: center;\n overflow: clip;\n}\nshiny-chat-message .message-icon > * {\n height: 100%;\n width: 100%;\n max-width: 100%;\n max-height: 100%;\n margin: 0 !important;\n object-fit: contain;\n}\nshiny-chat-message .message-icon > svg,\nshiny-chat-message .message-icon > .icon,\nshiny-chat-message .message-icon > .fa,\nshiny-chat-message .message-icon > .bi {\n max-height: 66%;\n max-width: 66%;\n}\nshiny-chat-message .message-icon:has(> .border-0) {\n border: none;\n border-radius: unset;\n overflow: unset;\n}\nshiny-chat-message shiny-markdown-stream {\n align-self: center;\n}\n\n/* Align the user message to the right */\nshiny-user-message {\n align-self: flex-end;\n padding: 0.75rem 1rem;\n border-radius: 10px;\n background-color: var(--shiny-chat-user-message-bg);\n max-width: 100%;\n}\n\nshiny-user-message[content_type=text],\nshiny-chat-message[content_type=text] {\n white-space: pre;\n overflow-x: auto;\n}\n\nshiny-status-message {\n opacity: 0.8;\n text-align: center;\n font-size: 0.9em;\n}\n\nshiny-chat-input {\n --_input-padding-top: 0;\n --_input-padding-bottom: var(--_chat-container-padding, 0.25rem);\n margin-top: calc(-1 * var(--_input-padding-top));\n position: sticky;\n bottom: calc(-1 * var(--_input-padding-bottom));\n padding-block: var(--_input-padding-top) var(--_input-padding-bottom);\n}\nshiny-chat-input textarea {\n --bs-border-radius: 26px;\n resize: none;\n padding-right: 36px !important;\n max-height: 175px;\n}\nshiny-chat-input textarea::placeholder {\n color: var(--bs-gray-600, #707782) !important;\n}\nshiny-chat-input button {\n position: absolute;\n bottom: calc(6px + var(--_input-padding-bottom));\n right: 8px;\n background-color: transparent;\n color: var(--bs-primary, #007bc2);\n transition: color 0.25s ease-in-out;\n border: none;\n padding: 0;\n cursor: pointer;\n line-height: 16px;\n border-radius: 50%;\n}\nshiny-chat-input button:disabled {\n cursor: not-allowed;\n color: var(--bs-gray-500, #8d959e);\n}\n\n/*\n Disable the page-level pulse when the chat input is disabled\n (i.e., when a response is being generated and brought into the chat)\n*/\n.shiny-busy:has(shiny-chat-input[disabled])::after {\n display: none;\n}"], + "mappings": "iBACA,qBACE,uFACA,4EACA,kCACA,aACA,0BACA,4BAPF,cASE,MACA,uCACA,iBAEF,kCACE,gBAEF,wEAEE,eAEF,iCACE,oCACA,oDACA,+BACA,6BAEA,0BACA,0BACA,8BA5BF,YA+BA,uCACE,4BAEF,uCACE,gBACA,qBACA,0BAEF,oLACE,gBAEF,kDACE,oCACA,+CAGF,oBACE,aACA,sBACA,SACA,cACA,mBACA,uBACA,oCACA,8CAGF,mBACE,aACA,yCACA,SAGF,qBACE,mBAEF,iCAnEA,kBAqEE,gCACA,YACA,WACA,aACA,mBACA,cAEF,mCACE,YACA,WACA,eACA,gBAhFF,mBAkFE,mBAEF,sJAIE,eACA,cAEF,kDACE,YACA,oBACA,eAEF,yCACE,kBAIF,mBACE,oBAtGF,uCAyGE,mDACA,eAGF,4EAEE,gBACA,gBAGF,qBACE,WACA,kBACA,eAGF,iBACE,wBACA,gEACA,gDACA,gBACA,+CACA,qEAEF,0BACE,yBACA,YACA,6BACA,iBAEF,uCACE,4CAEF,wBACE,kBACA,gDACA,UACA,6BACA,iCACA,kCACA,YAjJF,UAmJE,eACA,iBApJF,kBAuJA,iCACE,mBACA,kCAOF,kDACE", "names": [] } diff --git a/shiny/www/py-shiny/chat/chat.js b/shiny/www/py-shiny/chat/chat.js index cb85101c6..af365be04 100644 --- a/shiny/www/py-shiny/chat/chat.js +++ b/shiny/www/py-shiny/chat/chat.js @@ -1,7 +1,7 @@ -var Ot=Object.defineProperty;var kt=Object.getOwnPropertyDescriptor;var g=(n,t,e,s)=>{for(var i=s>1?void 0:s?kt(t,e):t,r=n.length-1,o;r>=0;r--)(o=n[r])&&(i=(s?o(t,e,i):o(i))||i);return s&&i&&Ot(t,e,i),i};var q=globalThis,j=q.ShadowRoot&&(q.ShadyCSS===void 0||q.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,ct=Symbol(),lt=new WeakMap,B=class{constructor(t,e,s){if(this._$cssResult$=!0,s!==ct)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=e}get styleSheet(){let t=this.o,e=this.t;if(j&&t===void 0){let s=e!==void 0&&e.length===1;s&&(t=lt.get(e)),t===void 0&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),s&<.set(e,t))}return t}toString(){return this.cssText}},dt=n=>new B(typeof n=="string"?n:n+"",void 0,ct);var Q=(n,t)=>{if(j)n.adoptedStyleSheets=t.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet);else for(let e of t){let s=document.createElement("style"),i=q.litNonce;i!==void 0&&s.setAttribute("nonce",i),s.textContent=e.cssText,n.appendChild(s)}},V=j?n=>n:n=>n instanceof CSSStyleSheet?(t=>{let e="";for(let s of t.cssRules)e+=s.cssText;return dt(e)})(n):n;var{is:Nt,defineProperty:Rt,getOwnPropertyDescriptor:It,getOwnPropertyNames:Dt,getOwnPropertySymbols:qt,getPrototypeOf:Bt}=Object,z=globalThis,ut=z.trustedTypes,jt=ut?ut.emptyScript:"",Vt=z.reactiveElementPolyfillSupport,P=(n,t)=>n,U={toAttribute(n,t){switch(t){case Boolean:n=n?jt:null;break;case Object:case Array:n=n==null?n:JSON.stringify(n)}return n},fromAttribute(n,t){let e=n;switch(t){case Boolean:e=n!==null;break;case Number:e=n===null?null:Number(n);break;case Object:case Array:try{e=JSON.parse(n)}catch{e=null}}return e}},K=(n,t)=>!Nt(n,t),pt={attribute:!0,type:String,converter:U,reflect:!1,hasChanged:K};Symbol.metadata??=Symbol("metadata"),z.litPropertyMetadata??=new WeakMap;var f=class extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,e=pt){if(e.state&&(e.attribute=!1),this._$Ei(),this.elementProperties.set(t,e),!e.noAccessor){let s=Symbol(),i=this.getPropertyDescriptor(t,s,e);i!==void 0&&Rt(this.prototype,t,i)}}static getPropertyDescriptor(t,e,s){let{get:i,set:r}=It(this.prototype,t)??{get(){return this[e]},set(o){this[e]=o}};return{get(){return i?.call(this)},set(o){let c=i?.call(this);r.call(this,o),this.requestUpdate(t,c,s)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??pt}static _$Ei(){if(this.hasOwnProperty(P("elementProperties")))return;let t=Bt(this);t.finalize(),t.l!==void 0&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(P("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(P("properties"))){let e=this.properties,s=[...Dt(e),...qt(e)];for(let i of s)this.createProperty(i,e[i])}let t=this[Symbol.metadata];if(t!==null){let e=litPropertyMetadata.get(t);if(e!==void 0)for(let[s,i]of e)this.elementProperties.set(s,i)}this._$Eh=new Map;for(let[e,s]of this.elementProperties){let i=this._$Eu(e,s);i!==void 0&&this._$Eh.set(i,e)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){let e=[];if(Array.isArray(t)){let s=new Set(t.flat(1/0).reverse());for(let i of s)e.unshift(V(i))}else t!==void 0&&e.push(V(t));return e}static _$Eu(t,e){let s=e.attribute;return s===!1?void 0:typeof s=="string"?s:typeof t=="string"?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),this.renderRoot!==void 0&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){let t=new Map,e=this.constructor.elementProperties;for(let s of e.keys())this.hasOwnProperty(s)&&(t.set(s,this[s]),delete this[s]);t.size>0&&(this._$Ep=t)}createRenderRoot(){let t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return Q(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,e,s){this._$AK(t,s)}_$EC(t,e){let s=this.constructor.elementProperties.get(t),i=this.constructor._$Eu(t,s);if(i!==void 0&&s.reflect===!0){let r=(s.converter?.toAttribute!==void 0?s.converter:U).toAttribute(e,s.type);this._$Em=t,r==null?this.removeAttribute(i):this.setAttribute(i,r),this._$Em=null}}_$AK(t,e){let s=this.constructor,i=s._$Eh.get(t);if(i!==void 0&&this._$Em!==i){let r=s.getPropertyOptions(i),o=typeof r.converter=="function"?{fromAttribute:r.converter}:r.converter?.fromAttribute!==void 0?r.converter:U;this._$Em=i,this[i]=o.fromAttribute(e,r.type),this._$Em=null}}requestUpdate(t,e,s){if(t!==void 0){if(s??=this.constructor.getPropertyOptions(t),!(s.hasChanged??K)(this[t],e))return;this.P(t,e,s)}this.isUpdatePending===!1&&(this._$ES=this._$ET())}P(t,e,s){this._$AL.has(t)||this._$AL.set(t,e),s.reflect===!0&&this._$Em!==t&&(this._$Ej??=new Set).add(t)}async _$ET(){this.isUpdatePending=!0;try{await this._$ES}catch(e){Promise.reject(e)}let t=this.scheduleUpdate();return t!=null&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(let[i,r]of this._$Ep)this[i]=r;this._$Ep=void 0}let s=this.constructor.elementProperties;if(s.size>0)for(let[i,r]of s)r.wrapped!==!0||this._$AL.has(i)||this[i]===void 0||this.P(i,this[i],r)}let t=!1,e=this._$AL;try{t=this.shouldUpdate(e),t?(this.willUpdate(e),this._$EO?.forEach(s=>s.hostUpdate?.()),this.update(e)):this._$EU()}catch(s){throw t=!1,this._$EU(),s}t&&this._$AE(e)}willUpdate(t){}_$AE(t){this._$EO?.forEach(e=>e.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EU(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Ej&&=this._$Ej.forEach(e=>this._$EC(e,this[e])),this._$EU()}updated(t){}firstUpdated(t){}};f.elementStyles=[],f.shadowRootOptions={mode:"open"},f[P("elementProperties")]=new Map,f[P("finalized")]=new Map,Vt?.({ReactiveElement:f}),(z.reactiveElementVersions??=[]).push("2.0.4");var rt=globalThis,G=rt.trustedTypes,mt=G?G.createPolicy("lit-html",{createHTML:n=>n}):void 0,$t="$lit$",_=`lit$${Math.random().toFixed(9).slice(2)}$`,At="?"+_,zt=`<${At}>`,C=document,H=()=>C.createComment(""),O=n=>n===null||typeof n!="object"&&typeof n!="function",Et=Array.isArray,Kt=n=>Et(n)||typeof n?.[Symbol.iterator]=="function",X=`[ -\f\r]`,L=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,gt=/-->/g,ft=/>/g,b=RegExp(`>|${X}(?:([^\\s"'>=/]+)(${X}*=${X}*(?:[^ -\f\r"'\`<>=]|("|')|))|$)`,"g"),vt=/'/g,yt=/"/g,bt=/^(?:script|style|textarea|title)$/i,St=n=>(t,...e)=>({_$litType$:n,strings:t,values:e}),T=St(1),ne=St(2),v=Symbol.for("lit-noChange"),l=Symbol.for("lit-nothing"),_t=new WeakMap,S=C.createTreeWalker(C,129);function Ct(n,t){if(!Array.isArray(n)||!n.hasOwnProperty("raw"))throw Error("invalid template strings array");return mt!==void 0?mt.createHTML(t):t}var Gt=(n,t)=>{let e=n.length-1,s=[],i,r=t===2?"":"",o=L;for(let c=0;c"?(o=i??L,h=-1):u[1]===void 0?h=-2:(h=o.lastIndex-u[2].length,d=u[1],o=u[3]===void 0?b:u[3]==='"'?yt:vt):o===yt||o===vt?o=b:o===gt||o===ft?o=L:(o=b,i=void 0);let y=o===b&&n[c+1].startsWith("/>")?" ":"";r+=o===L?a+zt:h>=0?(s.push(d),a.slice(0,h)+$t+a.slice(h)+_+y):a+_+(h===-2?c:y)}return[Ct(n,r+(n[e]||"")+(t===2?"":"")),s]},k=class n{constructor({strings:t,_$litType$:e},s){let i;this.parts=[];let r=0,o=0,c=t.length-1,a=this.parts,[d,u]=Gt(t,e);if(this.el=n.createElement(d,s),S.currentNode=this.el.content,e===2){let h=this.el.content.firstChild;h.replaceWith(...h.childNodes)}for(;(i=S.nextNode())!==null&&a.length0){i.textContent=G?G.emptyScript:"";for(let y=0;y2||s[0]!==""||s[1]!==""?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=l}_$AI(t,e=this,s,i){let r=this.strings,o=!1;if(r===void 0)t=w(this,t,e,0),o=!O(t)||t!==this._$AH&&t!==v,o&&(this._$AH=t);else{let c=t,a,d;for(t=r[0],a=0;a{let s=e?.renderBefore??t,i=s._$litPart$;if(i===void 0){let r=e?.renderBefore??null;s._$litPart$=i=new N(t.insertBefore(H(),r),r,void 0,e??{})}return i._$AI(n),i};var A=class extends f{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){let t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){let e=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=xt(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return v}};A._$litElement$=!0,A["finalized"]=!0,globalThis.litElementHydrateSupport?.({LitElement:A});var Ft=globalThis.litElementPolyfillSupport;Ft?.({LitElement:A});(globalThis.litElementVersions??=[]).push("4.0.5");var wt={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},Mt=n=>(...t)=>({_$litDirective$:n,values:t}),W=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,s){this._$Ct=t,this._$AM=e,this._$Ci=s}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}};var R=class extends W{constructor(t){if(super(t),this.it=l,t.type!==wt.CHILD)throw Error(this.constructor.directiveName+"() can only be used in child bindings")}render(t){if(t===l||t==null)return this._t=void 0,this.it=t;if(t===v)return t;if(typeof t!="string")throw Error(this.constructor.directiveName+"() called with a non-string value");if(t===this.it)return this._t;this.it=t;let e=[t];return e.raw=e,this._t={_$litType$:this.constructor.resultType,strings:e,values:[]}}};R.directiveName="unsafeHTML",R.resultType=1;var ot=Mt(R);var Jt={attribute:!0,type:String,converter:U,reflect:!1,hasChanged:K},Zt=(n=Jt,t,e)=>{let{kind:s,metadata:i}=e,r=globalThis.litPropertyMetadata.get(i);if(r===void 0&&globalThis.litPropertyMetadata.set(i,r=new Map),r.set(e.name,n),s==="accessor"){let{name:o}=e;return{set(c){let a=t.get.call(this);t.set.call(this,c),this.requestUpdate(o,a,n)},init(c){return c!==void 0&&this.P(o,void 0,n),c}}}if(s==="setter"){let{name:o}=e;return function(c){let a=this[o];t.call(this,c),this.requestUpdate(o,a,n)}}throw Error("Unsupported decorator location: "+s)};function p(n){return(t,e)=>typeof e=="object"?Zt(n,t,e):((s,i,r)=>{let o=i.hasOwnProperty(r);return i.constructor.createProperty(r,o?{...s,wrapped:!0}:s),o?Object.getOwnPropertyDescriptor(i,r):void 0})(n,t,e)}function J(n,t){let e=document.createElement(n);for(let[s,i]of Object.entries(t))i!==null&&e.setAttribute(s,i);return e}var E=class extends A{createRenderRoot(){return this}};function Tt({headline:n="",message:t,status:e="warning"}){document.dispatchEvent(new CustomEvent("shiny:client-message",{detail:{headline:n,message:t,status:e}}))}var at="shiny-chat-message",Ut="shiny-user-message",Lt="shiny-chat-messages",Ht="shiny-chat-input",Yt="shiny-chat-container",Pt={robot:'',dots_fade:''},x=class extends E{constructor(){super(...arguments);this.content="...";this.content_type="markdown";this.streaming=!1;this.icon=""}render(){let s=this.content.trim().length===0?Pt.dots_fade:this.icon||Pt.robot;return T` -
${ot(s)}
+var Nt=Object.defineProperty;var Rt=Object.getOwnPropertyDescriptor;var m=(n,t,e,s)=>{for(var i=s>1?void 0:s?Rt(t,e):t,r=n.length-1,o;r>=0;r--)(o=n[r])&&(i=(s?o(t,e,i):o(i))||i);return s&&i&&Nt(t,e,i),i};var B=globalThis,z=B.ShadowRoot&&(B.ShadyCSS===void 0||B.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,dt=Symbol(),ct=new WeakMap,j=class{constructor(t,e,s){if(this._$cssResult$=!0,s!==dt)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=e}get styleSheet(){let t=this.o,e=this.t;if(z&&t===void 0){let s=e!==void 0&&e.length===1;s&&(t=ct.get(e)),t===void 0&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),s&&ct.set(e,t))}return t}toString(){return this.cssText}},ut=n=>new j(typeof n=="string"?n:n+"",void 0,dt);var tt=(n,t)=>{if(z)n.adoptedStyleSheets=t.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet);else for(let e of t){let s=document.createElement("style"),i=B.litNonce;i!==void 0&&s.setAttribute("nonce",i),s.textContent=e.cssText,n.appendChild(s)}},G=z?n=>n:n=>n instanceof CSSStyleSheet?(t=>{let e="";for(let s of t.cssRules)e+=s.cssText;return ut(e)})(n):n;var{is:It,defineProperty:Dt,getOwnPropertyDescriptor:qt,getOwnPropertyNames:Vt,getOwnPropertySymbols:Bt,getPrototypeOf:jt}=Object,K=globalThis,pt=K.trustedTypes,zt=pt?pt.emptyScript:"",Gt=K.reactiveElementPolyfillSupport,L=(n,t)=>n,P={toAttribute(n,t){switch(t){case Boolean:n=n?zt:null;break;case Object:case Array:n=n==null?n:JSON.stringify(n)}return n},fromAttribute(n,t){let e=n;switch(t){case Boolean:e=n!==null;break;case Number:e=n===null?null:Number(n);break;case Object:case Array:try{e=JSON.parse(n)}catch{e=null}}return e}},W=(n,t)=>!It(n,t),mt={attribute:!0,type:String,converter:P,reflect:!1,hasChanged:W};Symbol.metadata??=Symbol("metadata"),K.litPropertyMetadata??=new WeakMap;var f=class extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,e=mt){if(e.state&&(e.attribute=!1),this._$Ei(),this.elementProperties.set(t,e),!e.noAccessor){let s=Symbol(),i=this.getPropertyDescriptor(t,s,e);i!==void 0&&Dt(this.prototype,t,i)}}static getPropertyDescriptor(t,e,s){let{get:i,set:r}=qt(this.prototype,t)??{get(){return this[e]},set(o){this[e]=o}};return{get(){return i?.call(this)},set(o){let c=i?.call(this);r.call(this,o),this.requestUpdate(t,c,s)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??mt}static _$Ei(){if(this.hasOwnProperty(L("elementProperties")))return;let t=jt(this);t.finalize(),t.l!==void 0&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(L("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(L("properties"))){let e=this.properties,s=[...Vt(e),...Bt(e)];for(let i of s)this.createProperty(i,e[i])}let t=this[Symbol.metadata];if(t!==null){let e=litPropertyMetadata.get(t);if(e!==void 0)for(let[s,i]of e)this.elementProperties.set(s,i)}this._$Eh=new Map;for(let[e,s]of this.elementProperties){let i=this._$Eu(e,s);i!==void 0&&this._$Eh.set(i,e)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){let e=[];if(Array.isArray(t)){let s=new Set(t.flat(1/0).reverse());for(let i of s)e.unshift(G(i))}else t!==void 0&&e.push(G(t));return e}static _$Eu(t,e){let s=e.attribute;return s===!1?void 0:typeof s=="string"?s:typeof t=="string"?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),this.renderRoot!==void 0&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){let t=new Map,e=this.constructor.elementProperties;for(let s of e.keys())this.hasOwnProperty(s)&&(t.set(s,this[s]),delete this[s]);t.size>0&&(this._$Ep=t)}createRenderRoot(){let t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return tt(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,e,s){this._$AK(t,s)}_$EC(t,e){let s=this.constructor.elementProperties.get(t),i=this.constructor._$Eu(t,s);if(i!==void 0&&s.reflect===!0){let r=(s.converter?.toAttribute!==void 0?s.converter:P).toAttribute(e,s.type);this._$Em=t,r==null?this.removeAttribute(i):this.setAttribute(i,r),this._$Em=null}}_$AK(t,e){let s=this.constructor,i=s._$Eh.get(t);if(i!==void 0&&this._$Em!==i){let r=s.getPropertyOptions(i),o=typeof r.converter=="function"?{fromAttribute:r.converter}:r.converter?.fromAttribute!==void 0?r.converter:P;this._$Em=i,this[i]=o.fromAttribute(e,r.type),this._$Em=null}}requestUpdate(t,e,s){if(t!==void 0){if(s??=this.constructor.getPropertyOptions(t),!(s.hasChanged??W)(this[t],e))return;this.P(t,e,s)}this.isUpdatePending===!1&&(this._$ES=this._$ET())}P(t,e,s){this._$AL.has(t)||this._$AL.set(t,e),s.reflect===!0&&this._$Em!==t&&(this._$Ej??=new Set).add(t)}async _$ET(){this.isUpdatePending=!0;try{await this._$ES}catch(e){Promise.reject(e)}let t=this.scheduleUpdate();return t!=null&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(let[i,r]of this._$Ep)this[i]=r;this._$Ep=void 0}let s=this.constructor.elementProperties;if(s.size>0)for(let[i,r]of s)r.wrapped!==!0||this._$AL.has(i)||this[i]===void 0||this.P(i,this[i],r)}let t=!1,e=this._$AL;try{t=this.shouldUpdate(e),t?(this.willUpdate(e),this._$EO?.forEach(s=>s.hostUpdate?.()),this.update(e)):this._$EU()}catch(s){throw t=!1,this._$EU(),s}t&&this._$AE(e)}willUpdate(t){}_$AE(t){this._$EO?.forEach(e=>e.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EU(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Ej&&=this._$Ej.forEach(e=>this._$EC(e,this[e])),this._$EU()}updated(t){}firstUpdated(t){}};f.elementStyles=[],f.shadowRootOptions={mode:"open"},f[L("elementProperties")]=new Map,f[L("finalized")]=new Map,Gt?.({ReactiveElement:f}),(K.reactiveElementVersions??=[]).push("2.0.4");var at=globalThis,F=at.trustedTypes,gt=F?F.createPolicy("lit-html",{createHTML:n=>n}):void 0,At="$lit$",A=`lit$${Math.random().toFixed(9).slice(2)}$`,Et="?"+A,Kt=`<${Et}>`,C=document,k=()=>C.createComment(""),O=n=>n===null||typeof n!="object"&&typeof n!="function",bt=Array.isArray,Wt=n=>bt(n)||typeof n?.[Symbol.iterator]=="function",et=`[ +\f\r]`,H=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,ft=/-->/g,yt=/>/g,b=RegExp(`>|${et}(?:([^\\s"'>=/]+)(${et}*=${et}*(?:[^ +\f\r"'\`<>=]|("|')|))|$)`,"g"),vt=/'/g,_t=/"/g,St=/^(?:script|style|textarea|title)$/i,Ct=n=>(t,...e)=>({_$litType$:n,strings:t,values:e}),x=Ct(1),oe=Ct(2),y=Symbol.for("lit-noChange"),l=Symbol.for("lit-nothing"),$t=new WeakMap,S=C.createTreeWalker(C,129);function xt(n,t){if(!Array.isArray(n)||!n.hasOwnProperty("raw"))throw Error("invalid template strings array");return gt!==void 0?gt.createHTML(t):t}var Ft=(n,t)=>{let e=n.length-1,s=[],i,r=t===2?"":"",o=H;for(let c=0;c"?(o=i??H,h=-1):u[1]===void 0?h=-2:(h=o.lastIndex-u[2].length,d=u[1],o=u[3]===void 0?b:u[3]==='"'?_t:vt):o===_t||o===vt?o=b:o===ft||o===yt?o=H:(o=b,i=void 0);let _=o===b&&n[c+1].startsWith("/>")?" ":"";r+=o===H?a+Kt:h>=0?(s.push(d),a.slice(0,h)+At+a.slice(h)+A+_):a+A+(h===-2?c:_)}return[xt(n,r+(n[e]||"")+(t===2?"":"")),s]},N=class n{constructor({strings:t,_$litType$:e},s){let i;this.parts=[];let r=0,o=0,c=t.length-1,a=this.parts,[d,u]=Ft(t,e);if(this.el=n.createElement(d,s),S.currentNode=this.el.content,e===2){let h=this.el.content.firstChild;h.replaceWith(...h.childNodes)}for(;(i=S.nextNode())!==null&&a.length0){i.textContent=F?F.emptyScript:"";for(let _=0;_2||s[0]!==""||s[1]!==""?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=l}_$AI(t,e=this,s,i){let r=this.strings,o=!1;if(r===void 0)t=M(this,t,e,0),o=!O(t)||t!==this._$AH&&t!==y,o&&(this._$AH=t);else{let c=t,a,d;for(t=r[0],a=0;a{let s=e?.renderBefore??t,i=s._$litPart$;if(i===void 0){let r=e?.renderBefore??null;s._$litPart$=i=new R(t.insertBefore(k(),r),r,void 0,e??{})}return i._$AI(n),i};var E=class extends f{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){let t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){let e=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=wt(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return y}};E._$litElement$=!0,E["finalized"]=!0,globalThis.litElementHydrateSupport?.({LitElement:E});var Zt=globalThis.litElementPolyfillSupport;Zt?.({LitElement:E});(globalThis.litElementVersions??=[]).push("4.0.5");var Tt={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},Mt=n=>(...t)=>({_$litDirective$:n,values:t}),J=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,s){this._$Ct=t,this._$AM=e,this._$Ci=s}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}};var I=class extends J{constructor(t){if(super(t),this.it=l,t.type!==Tt.CHILD)throw Error(this.constructor.directiveName+"() can only be used in child bindings")}render(t){if(t===l||t==null)return this._t=void 0,this.it=t;if(t===y)return t;if(typeof t!="string")throw Error(this.constructor.directiveName+"() called with a non-string value");if(t===this.it)return this._t;this.it=t;let e=[t];return e.raw=e,this._t={_$litType$:this.constructor.resultType,strings:e,values:[]}}};I.directiveName="unsafeHTML",I.resultType=1;var Z=Mt(I);var Yt={attribute:!0,type:String,converter:P,reflect:!1,hasChanged:W},Qt=(n=Yt,t,e)=>{let{kind:s,metadata:i}=e,r=globalThis.litPropertyMetadata.get(i);if(r===void 0&&globalThis.litPropertyMetadata.set(i,r=new Map),r.set(e.name,n),s==="accessor"){let{name:o}=e;return{set(c){let a=t.get.call(this);t.set.call(this,c),this.requestUpdate(o,a,n)},init(c){return c!==void 0&&this.P(o,void 0,n),c}}}if(s==="setter"){let{name:o}=e;return function(c){let a=this[o];t.call(this,c),this.requestUpdate(o,a,n)}}throw Error("Unsupported decorator location: "+s)};function p(n){return(t,e)=>typeof e=="object"?Qt(n,t,e):((s,i,r)=>{let o=i.hasOwnProperty(r);return i.constructor.createProperty(r,o?{...s,wrapped:!0}:s),o?Object.getOwnPropertyDescriptor(i,r):void 0})(n,t,e)}function D(n,t){let e=document.createElement(n);for(let[s,i]of Object.entries(t))i!==null&&e.setAttribute(s,i);return e}var v=class extends E{createRenderRoot(){return this}};function Ut({headline:n="",message:t,status:e="warning"}){document.dispatchEvent(new CustomEvent("shiny:client-message",{detail:{headline:n,message:t,status:e}}))}var ht="shiny-chat-message",Pt="shiny-user-message",Ht="shiny-status-message",kt="shiny-chat-messages",Ot="shiny-chat-input",Xt="shiny-chat-container",Lt={robot:'',dots_fade:''},w=class extends v{constructor(){super(...arguments);this.content="...";this.content_type="markdown";this.streaming=!1;this.icon=""}render(){let s=this.content.trim().length===0?Lt.dots_fade:this.icon||Lt.robot;return x` +
${Z(s)}
- `}#e(){this.streaming||this.#t()}#t(){this.querySelectorAll(".suggestion,[data-suggestion]").forEach(e=>{if(!(e instanceof HTMLElement)||e.hasAttribute("tabindex"))return;e.setAttribute("tabindex","0"),e.setAttribute("role","button");let s=e.dataset.suggestion||e.textContent;e.setAttribute("aria-label",`Use chat suggestion: ${s}`)})}};g([p()],x.prototype,"content",2),g([p()],x.prototype,"content_type",2),g([p({type:Boolean,reflect:!0})],x.prototype,"streaming",2),g([p()],x.prototype,"icon",2);var Z=class extends E{constructor(){super(...arguments);this.content="..."}render(){return T` + `}#e(){this.streaming||this.#t()}#t(){this.querySelectorAll(".suggestion,[data-suggestion]").forEach(e=>{if(!(e instanceof HTMLElement)||e.hasAttribute("tabindex"))return;e.setAttribute("tabindex","0"),e.setAttribute("role","button");let s=e.dataset.suggestion||e.textContent;e.setAttribute("aria-label",`Use chat suggestion: ${s}`)})}};m([p()],w.prototype,"content",2),m([p()],w.prototype,"content_type",2),m([p({type:Boolean,reflect:!0})],w.prototype,"streaming",2),m([p()],w.prototype,"icon",2);var Q=class extends v{constructor(){super(...arguments);this.content="..."}render(){return x` - `}};g([p()],Z.prototype,"content",2);var ht=class extends E{render(){return T``}},I=class extends E{constructor(){super(...arguments);this._disabled=!1;this.placeholder="Enter a message..."}get disabled(){return this._disabled}set disabled(e){let s=this._disabled;e!==s&&(this._disabled=e,e?this.setAttribute("disabled",""):this.removeAttribute("disabled"),this.requestUpdate("disabled",s),this.#t())}attributeChangedCallback(e,s,i){super.attributeChangedCallback(e,s,i),e==="disabled"&&(this.disabled=i!==null)}get textarea(){return this.querySelector("textarea")}get value(){return this.textarea.value}get valueIsEmpty(){return this.value.trim().length===0}get button(){return this.querySelector("button")}render(){let e='';return T` + `}};m([p()],Q.prototype,"content",2);var T=class extends v{constructor(){super(...arguments);this.content="";this.content_type="text";this.type="static"}render(){let e=this.content_type==="html"?Z(this.content):this.content;return x`${e}`}updated(e){super.updated(e),(e.has("content")||e.has("content_type"))&&this.#e()}#e(){this.scrollIntoView({behavior:"smooth",block:"end"})}};m([p()],T.prototype,"content",2),m([p()],T.prototype,"content_type",2),m([p()],T.prototype,"type",2);var lt=class extends v{render(){return x``}},q=class extends v{constructor(){super(...arguments);this._disabled=!1;this.placeholder="Enter a message..."}get disabled(){return this._disabled}set disabled(e){let s=this._disabled;e!==s&&(this._disabled=e,e?this.setAttribute("disabled",""):this.removeAttribute("disabled"),this.requestUpdate("disabled",s),this.#t())}attributeChangedCallback(e,s,i){super.attributeChangedCallback(e,s,i),e==="disabled"&&(this.disabled=i!==null)}get textarea(){return this.querySelector("textarea")}get value(){return this.textarea.value}get valueIsEmpty(){return this.value.trim().length===0}get button(){return this.querySelector("button")}render(){let e='';return x` \n \n ${unsafeHTML(icon)}\n \n `;\n }\n\n // Pressing enter sends the message (if not empty)\n #onKeyDown(e: KeyboardEvent): void {\n const isEnter = e.code === \"Enter\" && !e.shiftKey;\n if (isEnter && !this.valueIsEmpty) {\n e.preventDefault();\n this.#sendInput();\n }\n }\n\n #onInput(): void {\n this.button.disabled = this.disabled\n ? true\n : this.value.trim().length === 0;\n }\n\n // Determine whether the button should be enabled/disabled on first render\n protected firstUpdated(): void {\n this.#onInput();\n }\n\n #sendInput(focus = true): void {\n if (this.valueIsEmpty) return;\n if (this.disabled) return;\n\n Shiny.setInputValue!(this.id, this.value, { priority: \"event\" });\n\n // Emit event so parent element knows to insert the message\n const sentEvent = new CustomEvent(\"shiny-chat-input-sent\", {\n detail: { content: this.value, role: \"user\" },\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(sentEvent);\n\n this.setInputValue(\"\");\n this.disabled = true;\n\n if (focus) this.textarea.focus();\n }\n\n setInputValue(\n value: string,\n { submit = false, focus = false }: ChatInputSetInputOptions = {}\n ): void {\n // Store previous value to restore post-submit (if submitting)\n const oldValue = this.textarea.value;\n\n this.textarea.value = value;\n\n // Simulate an input event (to trigger the textarea autoresize)\n const inputEvent = new Event(\"input\", { bubbles: true, cancelable: true });\n this.textarea.dispatchEvent(inputEvent);\n\n if (submit) {\n this.#sendInput(false);\n if (oldValue) this.setInputValue(oldValue);\n }\n\n if (focus) {\n this.textarea.focus();\n }\n }\n}\n\nclass ChatContainer extends LightElement {\n @property({ attribute: \"icon-assistant\" }) iconAssistant = \"\";\n inputSentinelObserver?: IntersectionObserver;\n\n private get input(): ChatInput {\n return this.querySelector(CHAT_INPUT_TAG) as ChatInput;\n }\n\n private get messages(): ChatMessages {\n return this.querySelector(CHAT_MESSAGES_TAG) as ChatMessages;\n }\n\n private get lastMessage(): ChatMessage | null {\n const last = this.messages.lastElementChild;\n return last ? (last as ChatMessage) : null;\n }\n\n render() {\n return html``;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n\n // We use a sentinel element that we place just above the shiny-chat-input. When it\n // moves off-screen we know that the text area input is now floating, add shadow.\n let sentinel = this.querySelector(\"div\");\n if (!sentinel) {\n sentinel = createElement(\"div\", {\n style: \"width: 100%; height: 0;\",\n }) as HTMLElement;\n this.input.insertAdjacentElement(\"afterend\", sentinel);\n }\n\n this.inputSentinelObserver = new IntersectionObserver(\n (entries) => {\n const inputTextarea = this.input.querySelector(\"textarea\");\n if (!inputTextarea) return;\n const addShadow = entries[0]?.intersectionRatio === 0;\n inputTextarea.classList.toggle(\"shadow\", addShadow);\n },\n {\n threshold: [0, 1],\n rootMargin: \"0px\",\n }\n );\n\n this.inputSentinelObserver.observe(sentinel);\n }\n\n firstUpdated(): void {\n // Don't attach event listeners until child elements are rendered\n if (!this.messages) return;\n\n this.addEventListener(\"shiny-chat-input-sent\", this.#onInputSent);\n this.addEventListener(\"shiny-chat-append-message\", this.#onAppend);\n this.addEventListener(\n \"shiny-chat-append-message-chunk\",\n this.#onAppendChunk\n );\n this.addEventListener(\"shiny-chat-clear-messages\", this.#onClear);\n this.addEventListener(\n \"shiny-chat-update-user-input\",\n this.#onUpdateUserInput\n );\n this.addEventListener(\n \"shiny-chat-remove-loading-message\",\n this.#onRemoveLoadingMessage\n );\n this.addEventListener(\"click\", this.#onInputSuggestionClick);\n this.addEventListener(\"keydown\", this.#onInputSuggestionKeydown);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n\n this.inputSentinelObserver?.disconnect();\n this.inputSentinelObserver = undefined;\n\n this.removeEventListener(\"shiny-chat-input-sent\", this.#onInputSent);\n this.removeEventListener(\"shiny-chat-append-message\", this.#onAppend);\n this.removeEventListener(\n \"shiny-chat-append-message-chunk\",\n this.#onAppendChunk\n );\n this.removeEventListener(\"shiny-chat-clear-messages\", this.#onClear);\n this.removeEventListener(\n \"shiny-chat-update-user-input\",\n this.#onUpdateUserInput\n );\n this.removeEventListener(\n \"shiny-chat-remove-loading-message\",\n this.#onRemoveLoadingMessage\n );\n this.removeEventListener(\"click\", this.#onInputSuggestionClick);\n this.removeEventListener(\"keydown\", this.#onInputSuggestionKeydown);\n }\n\n // When user submits input, append it to the chat, and add a loading message\n #onInputSent(event: CustomEvent): void {\n this.#appendMessage(event.detail);\n this.#addLoadingMessage();\n }\n\n // Handle an append message event from server\n #onAppend(event: CustomEvent): void {\n this.#appendMessage(event.detail);\n }\n\n #initMessage(): void {\n this.#removeLoadingMessage();\n if (!this.input.disabled) {\n this.input.disabled = true;\n }\n }\n\n #appendMessage(message: Message, finalize = true): void {\n this.#initMessage();\n\n const TAG_NAME =\n message.role === \"user\" ? CHAT_USER_MESSAGE_TAG : CHAT_MESSAGE_TAG;\n\n if (this.iconAssistant) {\n message.icon = message.icon || this.iconAssistant;\n }\n\n const msg = createElement(TAG_NAME, message);\n this.messages.appendChild(msg);\n\n if (finalize) {\n this.#finalizeMessage();\n }\n }\n\n // Loading message is just an empty message\n #addLoadingMessage(): void {\n const loading_message = {\n content: \"\",\n role: \"assistant\",\n };\n const message = createElement(CHAT_MESSAGE_TAG, loading_message);\n this.messages.appendChild(message);\n }\n\n #removeLoadingMessage(): void {\n const content = this.lastMessage?.content;\n if (!content) this.lastMessage?.remove();\n }\n\n #onAppendChunk(event: CustomEvent): void {\n this.#appendMessageChunk(event.detail);\n }\n\n #appendMessageChunk(message: Message): void {\n if (message.chunk_type === \"message_start\") {\n this.#appendMessage(message, false);\n }\n\n const lastMessage = this.lastMessage;\n if (!lastMessage) throw new Error(\"No messages found in the chat output\");\n\n if (message.chunk_type === \"message_start\") {\n lastMessage.setAttribute(\"streaming\", \"\");\n return;\n }\n\n const content =\n message.operation === \"append\"\n ? lastMessage.getAttribute(\"content\") + message.content\n : message.content;\n\n lastMessage.setAttribute(\"content\", content);\n\n if (message.chunk_type === \"message_end\") {\n this.lastMessage?.removeAttribute(\"streaming\");\n this.#finalizeMessage();\n }\n }\n\n #onClear(): void {\n this.messages.innerHTML = \"\";\n }\n\n #onUpdateUserInput(event: CustomEvent): void {\n const { value, placeholder, submit, focus } = event.detail;\n if (value !== undefined) {\n this.input.setInputValue(value, { submit, focus });\n }\n if (placeholder !== undefined) {\n this.input.placeholder = placeholder;\n }\n }\n\n #onInputSuggestionClick(e: MouseEvent): void {\n this.#onInputSuggestionEvent(e);\n }\n\n #onInputSuggestionKeydown(e: KeyboardEvent): void {\n const isEnterOrSpace = e.key === \"Enter\" || e.key === \" \";\n if (!isEnterOrSpace) return;\n\n this.#onInputSuggestionEvent(e);\n }\n\n #onInputSuggestionEvent(e: MouseEvent | KeyboardEvent): void {\n const { suggestion, submit } = this.#getSuggestion(e.target);\n if (!suggestion) return;\n\n e.preventDefault();\n // Cmd/Ctrl + (event) = force submitting\n // Alt/Opt + (event) = force setting without submitting\n const shouldSubmit =\n e.metaKey || e.ctrlKey ? true : e.altKey ? false : submit;\n\n this.input.setInputValue(suggestion, {\n submit: shouldSubmit,\n focus: !shouldSubmit,\n });\n }\n\n #getSuggestion(x: EventTarget | null): {\n suggestion?: string;\n submit?: boolean;\n } {\n if (!(x instanceof HTMLElement)) return {};\n\n const el = x.closest(\".suggestion, [data-suggestion]\");\n if (!(el instanceof HTMLElement)) return {};\n\n const isSuggestion =\n el.classList.contains(\"suggestion\") ||\n el.dataset.suggestion !== undefined;\n if (!isSuggestion) return {};\n\n const suggestion = el.dataset.suggestion || el.textContent;\n\n return {\n suggestion: suggestion || undefined,\n submit:\n el.classList.contains(\"submit\") ||\n el.dataset.suggestionSubmit === \"\" ||\n el.dataset.suggestionSubmit === \"true\",\n };\n }\n\n #onRemoveLoadingMessage(): void {\n this.#removeLoadingMessage();\n this.#finalizeMessage();\n }\n\n #finalizeMessage(): void {\n this.input.disabled = false;\n }\n}\n\n// ------- Register custom elements and shiny bindings ---------\n\ncustomElements.define(CHAT_MESSAGE_TAG, ChatMessage);\ncustomElements.define(CHAT_USER_MESSAGE_TAG, ChatUserMessage);\ncustomElements.define(CHAT_MESSAGES_TAG, ChatMessages);\ncustomElements.define(CHAT_INPUT_TAG, ChatInput);\ncustomElements.define(CHAT_CONTAINER_TAG, ChatContainer);\n\n$(function () {\n Shiny.addCustomMessageHandler(\n \"shinyChatMessage\",\n function (message: ShinyChatMessage) {\n const evt = new CustomEvent(message.handler, {\n detail: message.obj,\n });\n\n const el = document.getElementById(message.id);\n\n if (!el) {\n showShinyClientMessage({\n status: \"error\",\n message: `Unable to handle Chat() message since element with id\n ${message.id} wasn't found. Do you need to call .ui() (Express) or need a\n chat_ui('${message.id}') in the UI (Core)?\n `,\n });\n return;\n }\n\n el.dispatchEvent(evt);\n }\n );\n});\n"], - "mappings": "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", - "names": ["global", "globalThis", "supportsAdoptingStyleSheets", "ShadowRoot", "ShadyCSS", "nativeShadow", "Document", "prototype", "CSSStyleSheet", "constructionToken", "Symbol", "cssTagCache", "WeakMap", "CSSResult", "cssText", "strings", "safeToken", "this", "Error", "_strings", "styleSheet", "_styleSheet", "cacheable", "length", "get", "replaceSync", "set", "toString", "unsafeCSS", "value", "String", "adoptStyles", "renderRoot", "styles", "supportsAdoptingStyleSheets", "adoptedStyleSheets", "map", "s", "CSSStyleSheet", "styleSheet", "style", "document", "createElement", "nonce", "global", "setAttribute", "textContent", "cssText", "appendChild", "getCompatibleStyle", "sheet", "rule", "cssRules", "unsafeCSS", "is", "defineProperty", "getOwnPropertyDescriptor", "getOwnPropertyNames", "getOwnPropertySymbols", "getPrototypeOf", "Object", "global", "globalThis", "trustedTypes", "emptyStringForBooleanAttribute", "emptyScript", "polyfillSupport", "reactiveElementPolyfillSupport", "JSCompiler_renameProperty", "prop", "_obj", "defaultConverter", "value", "type", "Boolean", "Array", "JSON", "stringify", "fromValue", "Number", "parse", "e", "notEqual", "old", "defaultPropertyDeclaration", "attribute", "String", "converter", "reflect", "hasChanged", "Symbol", "metadata", "litPropertyMetadata", "WeakMap", "ReactiveElement", "HTMLElement", "initializer", "this", "__prepare", "_initializers", "push", "observedAttributes", "finalize", "__attributeToPropertyMap", "keys", "name", "options", "state", "elementProperties", "set", "noAccessor", "key", "descriptor", "getPropertyDescriptor", "prototype", "get", "v", "call", "oldValue", "requestUpdate", "configurable", "enumerable", "hasOwnProperty", "superCtor", "Map", "finalized", "props", "properties", "propKeys", "p", "createProperty", "attr", "__attributeNameForProperty", "elementStyles", "finalizeStyles", "styles", "isArray", "Set", "flat", "Infinity", "reverse", "s", "unshift", "getCompatibleStyle", "toLowerCase", "constructor", "super", "__instanceProperties", "isUpdatePending", "hasUpdated", "__reflectingProperty", "__initialize", "__updatePromise", "Promise", "res", "enableUpdating", "_$changedProperties", "__saveInstanceProperties", "forEach", "i", "controller", "__controllers", "add", "renderRoot", "isConnected", "hostConnected", "delete", "instanceProperties", "size", "createRenderRoot", "shadowRoot", "attachShadow", "shadowRootOptions", "adoptStyles", "connectedCallback", "c", "_requestedUpdate", "disconnectedCallback", "hostDisconnected", "_old", "_$attributeToProperty", "attrValue", "toAttribute", "removeAttribute", "setAttribute", "ctor", "propName", "getPropertyOptions", "fromAttribute", "_$changeProperty", "__enqueueUpdate", "has", "__reflectingProperties", "reject", "result", "scheduleUpdate", "performUpdate", "wrapped", "shouldUpdate", "changedProperties", "willUpdate", "hostUpdate", "update", "__markUpdated", "_$didUpdate", "_changedProperties", "hostUpdated", "firstUpdated", "updated", "updateComplete", "getUpdateComplete", "__propertyToAttribute", "mode", "reactiveElementVersions", "global", "globalThis", "trustedTypes", "policy", "createPolicy", "createHTML", "s", "boundAttributeSuffix", "marker", "Math", "random", "toFixed", "slice", "markerMatch", "nodeMarker", "d", "document", "createMarker", "createComment", "isPrimitive", "value", "isArray", "Array", "isIterable", "Symbol", "iterator", "SPACE_CHAR", "textEndRegex", "commentEndRegex", "comment2EndRegex", "tagEndRegex", "RegExp", "singleQuoteAttrEndRegex", "doubleQuoteAttrEndRegex", "rawTextElement", "tag", "type", "strings", "values", "_$litType$", "html", "svg", "noChange", "for", "nothing", "templateCache", "WeakMap", "walker", "createTreeWalker", "trustFromTemplateString", "tsa", "stringFromTSA", "hasOwnProperty", "Error", "getTemplateHtml", "l", "length", "attrNames", "rawTextEndRegex", "regex", "i", "attrName", "match", "attrNameEndIndex", "lastIndex", "exec", "test", "end", "startsWith", "push", "Template", "constructor", "options", "node", "this", "parts", "nodeIndex", "attrNameIndex", "partCount", "el", "createElement", "currentNode", "content", "svgElement", "firstChild", "replaceWith", "childNodes", "nextNode", "nodeType", "hasAttributes", "name", "getAttributeNames", "endsWith", "realName", "statics", "getAttribute", "split", "m", "index", "ctor", "PropertyPart", "BooleanAttributePart", "EventPart", "AttributePart", "removeAttribute", "tagName", "textContent", "emptyScript", "append", "data", "indexOf", "_options", "innerHTML", "resolveDirective", "part", "parent", "attributeIndex", "currentDirective", "__directives", "__directive", "nextDirectiveConstructor", "_$initialize", "_$resolve", "TemplateInstance", "template", "_$parts", "_$disconnectableChildren", "_$template", "_$parent", "parentNode", "_$isConnected", "fragment", "creationScope", "importNode", "partIndex", "templatePart", "ChildPart", "nextSibling", "ElementPart", "_$setValue", "__isConnected", "startNode", "endNode", "_$committedValue", "_$startNode", "_$endNode", "isConnected", "directiveParent", "_$clear", "_commitText", "_commitTemplateResult", "_commitNode", "_commitIterable", "insertBefore", "_insert", "createTextNode", "result", "_$getTemplate", "h", "_update", "instance", "_clone", "get", "set", "itemParts", "itemPart", "item", "start", "from", "_$notifyConnectionChanged", "n", "remove", "element", "fill", "String", "valueIndex", "noCommit", "change", "v", "_commitValue", "setAttribute", "toggleAttribute", "super", "newListener", "oldListener", "shouldRemoveListener", "capture", "once", "passive", "shouldAddListener", "removeEventListener", "addEventListener", "event", "call", "host", "handleEvent", "polyfillSupport", "global", "litHtmlPolyfillSupport", "Template", "ChildPart", "litHtmlVersions", "push", "render", "value", "container", "options", "partOwnerNode", "renderBefore", "part", "endNode", "insertBefore", "createMarker", "_$setValue", "LitElement", "ReactiveElement", "constructor", "this", "renderOptions", "host", "__childPart", "createRenderRoot", "renderRoot", "super", "renderBefore", "firstChild", "changedProperties", "value", "render", "hasUpdated", "isConnected", "update", "connectedCallback", "setConnected", "disconnectedCallback", "noChange", "globalThis", "litElementHydrateSupport", "polyfillSupport", "litElementPolyfillSupport", "globalThis", "litElementVersions", "push", "PartType", "ATTRIBUTE", "CHILD", "PROPERTY", "BOOLEAN_ATTRIBUTE", "EVENT", "ELEMENT", "directive", "c", "values", "_$litDirective$", "Directive", "_partInfo", "_$isConnected", "this", "_$parent", "part", "parent", "attributeIndex", "__part", "__attributeIndex", "props", "update", "_part", "render", "UnsafeHTMLDirective", "Directive", "partInfo", "super", "this", "_value", "nothing", "type", "PartType", "CHILD", "Error", "constructor", "directiveName", "value", "_templateResult", "noChange", "strings", "raw", "_$litType$", "resultType", "values", "unsafeHTML", "directive", "defaultPropertyDeclaration", "attribute", "type", "String", "converter", "defaultConverter", "reflect", "hasChanged", "notEqual", "standardProperty", "options", "target", "context", "kind", "metadata", "properties", "globalThis", "litPropertyMetadata", "get", "set", "Map", "name", "v", "oldValue", "call", "this", "requestUpdate", "_$changeProperty", "value", "Error", "property", "protoOrTarget", "nameOrContext", "proto", "hasOwnProperty", "constructor", "createProperty", "wrapped", "Object", "getOwnPropertyDescriptor", "createElement", "tag_name", "attrs", "el", "key", "value", "LightElement", "s", "showShinyClientMessage", "headline", "message", "status", "CHAT_MESSAGE_TAG", "CHAT_USER_MESSAGE_TAG", "CHAT_MESSAGES_TAG", "CHAT_INPUT_TAG", "CHAT_CONTAINER_TAG", "ICONS", "ChatMessage", "LightElement", "icon", "x", "o", "#onContentChange", "#makeSuggestionsAccessible", "el", "suggestion", "__decorateClass", "n", "ChatUserMessage", "ChatMessages", "ChatInput", "value", "oldValue", "#onInput", "name", "_old", "#onKeyDown", "#sendInput", "focus", "sentEvent", "submit", "inputEvent", "ChatContainer", "last", "sentinel", "createElement", "entries", "inputTextarea", "addShadow", "#onInputSent", "#onAppend", "#onAppendChunk", "#onClear", "#onUpdateUserInput", "#onRemoveLoadingMessage", "#onInputSuggestionClick", "#onInputSuggestionKeydown", "event", "#appendMessage", "#addLoadingMessage", "#initMessage", "#removeLoadingMessage", "message", "finalize", "TAG_NAME", "msg", "#finalizeMessage", "#appendMessageChunk", "lastMessage", "content", "placeholder", "#onInputSuggestionEvent", "#getSuggestion", "shouldSubmit", "evt", "showShinyClientMessage"] + "sourcesContent": ["/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\nconst NODE_MODE = false;\n\n// Allows minifiers to rename references to globalThis\nconst global = globalThis;\n\n/**\n * Whether the current browser supports `adoptedStyleSheets`.\n */\nexport const supportsAdoptingStyleSheets: boolean =\n global.ShadowRoot &&\n (global.ShadyCSS === undefined || global.ShadyCSS.nativeShadow) &&\n 'adoptedStyleSheets' in Document.prototype &&\n 'replace' in CSSStyleSheet.prototype;\n\n/**\n * A CSSResult or native CSSStyleSheet.\n *\n * In browsers that support constructible CSS style sheets, CSSStyleSheet\n * object can be used for styling along side CSSResult from the `css`\n * template tag.\n */\nexport type CSSResultOrNative = CSSResult | CSSStyleSheet;\n\nexport type CSSResultArray = Array;\n\n/**\n * A single CSSResult, CSSStyleSheet, or an array or nested arrays of those.\n */\nexport type CSSResultGroup = CSSResultOrNative | CSSResultArray;\n\nconst constructionToken = Symbol();\n\nconst cssTagCache = new WeakMap();\n\n/**\n * A container for a string of CSS text, that may be used to create a CSSStyleSheet.\n *\n * CSSResult is the return value of `css`-tagged template literals and\n * `unsafeCSS()`. In order to ensure that CSSResults are only created via the\n * `css` tag and `unsafeCSS()`, CSSResult cannot be constructed directly.\n */\nexport class CSSResult {\n // This property needs to remain unminified.\n ['_$cssResult$'] = true;\n readonly cssText: string;\n private _styleSheet?: CSSStyleSheet;\n private _strings: TemplateStringsArray | undefined;\n\n private constructor(\n cssText: string,\n strings: TemplateStringsArray | undefined,\n safeToken: symbol\n ) {\n if (safeToken !== constructionToken) {\n throw new Error(\n 'CSSResult is not constructable. Use `unsafeCSS` or `css` instead.'\n );\n }\n this.cssText = cssText;\n this._strings = strings;\n }\n\n // This is a getter so that it's lazy. In practice, this means stylesheets\n // are not created until the first element instance is made.\n get styleSheet(): CSSStyleSheet | undefined {\n // If `supportsAdoptingStyleSheets` is true then we assume CSSStyleSheet is\n // constructable.\n let styleSheet = this._styleSheet;\n const strings = this._strings;\n if (supportsAdoptingStyleSheets && styleSheet === undefined) {\n const cacheable = strings !== undefined && strings.length === 1;\n if (cacheable) {\n styleSheet = cssTagCache.get(strings);\n }\n if (styleSheet === undefined) {\n (this._styleSheet = styleSheet = new CSSStyleSheet()).replaceSync(\n this.cssText\n );\n if (cacheable) {\n cssTagCache.set(strings, styleSheet);\n }\n }\n }\n return styleSheet;\n }\n\n toString(): string {\n return this.cssText;\n }\n}\n\ntype ConstructableCSSResult = CSSResult & {\n new (\n cssText: string,\n strings: TemplateStringsArray | undefined,\n safeToken: symbol\n ): CSSResult;\n};\n\nconst textFromCSSResult = (value: CSSResultGroup | number) => {\n // This property needs to remain unminified.\n if ((value as CSSResult)['_$cssResult$'] === true) {\n return (value as CSSResult).cssText;\n } else if (typeof value === 'number') {\n return value;\n } else {\n throw new Error(\n `Value passed to 'css' function must be a 'css' function result: ` +\n `${value}. Use 'unsafeCSS' to pass non-literal values, but take care ` +\n `to ensure page security.`\n );\n }\n};\n\n/**\n * Wrap a value for interpolation in a {@linkcode css} tagged template literal.\n *\n * This is unsafe because untrusted CSS text can be used to phone home\n * or exfiltrate data to an attacker controlled site. Take care to only use\n * this with trusted input.\n */\nexport const unsafeCSS = (value: unknown) =>\n new (CSSResult as ConstructableCSSResult)(\n typeof value === 'string' ? value : String(value),\n undefined,\n constructionToken\n );\n\n/**\n * A template literal tag which can be used with LitElement's\n * {@linkcode LitElement.styles} property to set element styles.\n *\n * For security reasons, only literal string values and number may be used in\n * embedded expressions. To incorporate non-literal values {@linkcode unsafeCSS}\n * may be used inside an expression.\n */\nexport const css = (\n strings: TemplateStringsArray,\n ...values: (CSSResultGroup | number)[]\n): CSSResult => {\n const cssText =\n strings.length === 1\n ? strings[0]\n : values.reduce(\n (acc, v, idx) => acc + textFromCSSResult(v) + strings[idx + 1],\n strings[0]\n );\n return new (CSSResult as ConstructableCSSResult)(\n cssText,\n strings,\n constructionToken\n );\n};\n\n/**\n * Applies the given styles to a `shadowRoot`. When Shadow DOM is\n * available but `adoptedStyleSheets` is not, styles are appended to the\n * `shadowRoot` to [mimic spec behavior](https://wicg.github.io/construct-stylesheets/#using-constructed-stylesheets).\n * Note, when shimming is used, any styles that are subsequently placed into\n * the shadowRoot should be placed *before* any shimmed adopted styles. This\n * will match spec behavior that gives adopted sheets precedence over styles in\n * shadowRoot.\n */\nexport const adoptStyles = (\n renderRoot: ShadowRoot,\n styles: Array\n) => {\n if (supportsAdoptingStyleSheets) {\n (renderRoot as ShadowRoot).adoptedStyleSheets = styles.map((s) =>\n s instanceof CSSStyleSheet ? s : s.styleSheet!\n );\n } else {\n for (const s of styles) {\n const style = document.createElement('style');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const nonce = (global as any)['litNonce'];\n if (nonce !== undefined) {\n style.setAttribute('nonce', nonce);\n }\n style.textContent = (s as CSSResult).cssText;\n renderRoot.appendChild(style);\n }\n }\n};\n\nconst cssResultFromStyleSheet = (sheet: CSSStyleSheet) => {\n let cssText = '';\n for (const rule of sheet.cssRules) {\n cssText += rule.cssText;\n }\n return unsafeCSS(cssText);\n};\n\nexport const getCompatibleStyle =\n supportsAdoptingStyleSheets ||\n (NODE_MODE && global.CSSStyleSheet === undefined)\n ? (s: CSSResultOrNative) => s\n : (s: CSSResultOrNative) =>\n s instanceof CSSStyleSheet ? cssResultFromStyleSheet(s) : s;\n", "/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/**\n * Use this module if you want to create your own base class extending\n * {@link ReactiveElement}.\n * @packageDocumentation\n */\n\nimport {\n getCompatibleStyle,\n adoptStyles,\n CSSResultGroup,\n CSSResultOrNative,\n} from './css-tag.js';\nimport type {\n ReactiveController,\n ReactiveControllerHost,\n} from './reactive-controller.js';\n\n// In the Node build, this import will be injected by Rollup:\n// import {HTMLElement, customElements} from '@lit-labs/ssr-dom-shim';\n\nexport * from './css-tag.js';\nexport type {\n ReactiveController,\n ReactiveControllerHost,\n} from './reactive-controller.js';\n\n/**\n * Removes the `readonly` modifier from properties in the union K.\n *\n * This is a safer way to cast a value to a type with a mutable version of a\n * readonly field, than casting to an interface with the field re-declared\n * because it preserves the type of all the fields and warns on typos.\n */\ntype Mutable = Omit & {\n -readonly [P in keyof Pick]: P extends K ? T[P] : never;\n};\n\n// TODO (justinfagnani): Add `hasOwn` here when we ship ES2022\nconst {\n is,\n defineProperty,\n getOwnPropertyDescriptor,\n getOwnPropertyNames,\n getOwnPropertySymbols,\n getPrototypeOf,\n} = Object;\n\nconst NODE_MODE = false;\n\n// Lets a minifier replace globalThis references with a minified name\nconst global = globalThis;\n\nif (NODE_MODE) {\n global.customElements ??= customElements;\n}\n\nconst DEV_MODE = true;\n\nlet issueWarning: (code: string, warning: string) => void;\n\nconst trustedTypes = (global as unknown as {trustedTypes?: {emptyScript: ''}})\n .trustedTypes;\n\n// Temporary workaround for https://crbug.com/993268\n// Currently, any attribute starting with \"on\" is considered to be a\n// TrustedScript source. Such boolean attributes must be set to the equivalent\n// trusted emptyScript value.\nconst emptyStringForBooleanAttribute = trustedTypes\n ? (trustedTypes.emptyScript as unknown as '')\n : '';\n\nconst polyfillSupport = DEV_MODE\n ? global.reactiveElementPolyfillSupportDevMode\n : global.reactiveElementPolyfillSupport;\n\nif (DEV_MODE) {\n // Ensure warnings are issued only 1x, even if multiple versions of Lit\n // are loaded.\n const issuedWarnings: Set = (global.litIssuedWarnings ??=\n new Set());\n\n // Issue a warning, if we haven't already.\n issueWarning = (code: string, warning: string) => {\n warning += ` See https://lit.dev/msg/${code} for more information.`;\n if (!issuedWarnings.has(warning)) {\n console.warn(warning);\n issuedWarnings.add(warning);\n }\n };\n\n issueWarning(\n 'dev-mode',\n `Lit is in dev mode. Not recommended for production!`\n );\n\n // Issue polyfill support warning.\n if (global.ShadyDOM?.inUse && polyfillSupport === undefined) {\n issueWarning(\n 'polyfill-support-missing',\n `Shadow DOM is being polyfilled via \\`ShadyDOM\\` but ` +\n `the \\`polyfill-support\\` module has not been loaded.`\n );\n }\n}\n\n/**\n * Contains types that are part of the unstable debug API.\n *\n * Everything in this API is not stable and may change or be removed in the future,\n * even on patch releases.\n */\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace ReactiveUnstable {\n /**\n * When Lit is running in dev mode and `window.emitLitDebugLogEvents` is true,\n * we will emit 'lit-debug' events to window, with live details about the update and render\n * lifecycle. These can be useful for writing debug tooling and visualizations.\n *\n * Please be aware that running with window.emitLitDebugLogEvents has performance overhead,\n * making certain operations that are normally very cheap (like a no-op render) much slower,\n * because we must copy data and dispatch events.\n */\n // eslint-disable-next-line @typescript-eslint/no-namespace\n export namespace DebugLog {\n export type Entry = Update;\n export interface Update {\n kind: 'update';\n }\n }\n}\n\ninterface DebugLoggingWindow {\n // Even in dev mode, we generally don't want to emit these events, as that's\n // another level of cost, so only emit them when DEV_MODE is true _and_ when\n // window.emitLitDebugEvents is true.\n emitLitDebugLogEvents?: boolean;\n}\n\n/**\n * Useful for visualizing and logging insights into what the Lit template system is doing.\n *\n * Compiled out of prod mode builds.\n */\nconst debugLogEvent = DEV_MODE\n ? (event: ReactiveUnstable.DebugLog.Entry) => {\n const shouldEmit = (global as unknown as DebugLoggingWindow)\n .emitLitDebugLogEvents;\n if (!shouldEmit) {\n return;\n }\n global.dispatchEvent(\n new CustomEvent('lit-debug', {\n detail: event,\n })\n );\n }\n : undefined;\n\n/*\n * When using Closure Compiler, JSCompiler_renameProperty(property, object) is\n * replaced at compile time by the munged name for object[property]. We cannot\n * alias this function, so we have to use a small shim that has the same\n * behavior when not compiling.\n */\n/*@__INLINE__*/\nconst JSCompiler_renameProperty =

(\n prop: P,\n _obj: unknown\n): P => prop;\n\n/**\n * Converts property values to and from attribute values.\n */\nexport interface ComplexAttributeConverter {\n /**\n * Called to convert an attribute value to a property\n * value.\n */\n fromAttribute?(value: string | null, type?: TypeHint): Type;\n\n /**\n * Called to convert a property value to an attribute\n * value.\n *\n * It returns unknown instead of string, to be compatible with\n * https://github.com/WICG/trusted-types (and similar efforts).\n */\n toAttribute?(value: Type, type?: TypeHint): unknown;\n}\n\ntype AttributeConverter =\n | ComplexAttributeConverter\n | ((value: string | null, type?: TypeHint) => Type);\n\n/**\n * Defines options for a property accessor.\n */\nexport interface PropertyDeclaration {\n /**\n * When set to `true`, indicates the property is internal private state. The\n * property should not be set by users. When using TypeScript, this property\n * should be marked as `private` or `protected`, and it is also a common\n * practice to use a leading `_` in the name. The property is not added to\n * `observedAttributes`.\n */\n readonly state?: boolean;\n\n /**\n * Indicates how and whether the property becomes an observed attribute.\n * If the value is `false`, the property is not added to `observedAttributes`.\n * If true or absent, the lowercased property name is observed (e.g. `fooBar`\n * becomes `foobar`). If a string, the string value is observed (e.g\n * `attribute: 'foo-bar'`).\n */\n readonly attribute?: boolean | string;\n\n /**\n * Indicates the type of the property. This is used only as a hint for the\n * `converter` to determine how to convert the attribute\n * to/from a property.\n */\n readonly type?: TypeHint;\n\n /**\n * Indicates how to convert the attribute to/from a property. If this value\n * is a function, it is used to convert the attribute value a the property\n * value. If it's an object, it can have keys for `fromAttribute` and\n * `toAttribute`. If no `toAttribute` function is provided and\n * `reflect` is set to `true`, the property value is set directly to the\n * attribute. A default `converter` is used if none is provided; it supports\n * `Boolean`, `String`, `Number`, `Object`, and `Array`. Note,\n * when a property changes and the converter is used to update the attribute,\n * the property is never updated again as a result of the attribute changing,\n * and vice versa.\n */\n readonly converter?: AttributeConverter;\n\n /**\n * Indicates if the property should reflect to an attribute.\n * If `true`, when the property is set, the attribute is set using the\n * attribute name determined according to the rules for the `attribute`\n * property option and the value of the property converted using the rules\n * from the `converter` property option.\n */\n readonly reflect?: boolean;\n\n /**\n * A function that indicates if a property should be considered changed when\n * it is set. The function should take the `newValue` and `oldValue` and\n * return `true` if an update should be requested.\n */\n hasChanged?(value: Type, oldValue: Type): boolean;\n\n /**\n * Indicates whether an accessor will be created for this property. By\n * default, an accessor will be generated for this property that requests an\n * update when set. If this flag is `true`, no accessor will be created, and\n * it will be the user's responsibility to call\n * `this.requestUpdate(propertyName, oldValue)` to request an update when\n * the property changes.\n */\n readonly noAccessor?: boolean;\n\n /**\n * Whether this property is wrapping accessors. This is set by `@property`\n * to control the initial value change and reflection logic.\n *\n * @internal\n */\n wrapped?: boolean;\n}\n\n/**\n * Map of properties to PropertyDeclaration options. For each property an\n * accessor is made, and the property is processed according to the\n * PropertyDeclaration options.\n */\nexport interface PropertyDeclarations {\n readonly [key: string]: PropertyDeclaration;\n}\n\ntype PropertyDeclarationMap = Map;\n\ntype AttributeMap = Map;\n\n/**\n * A Map of property keys to values.\n *\n * Takes an optional type parameter T, which when specified as a non-any,\n * non-unknown type, will make the Map more strongly-typed, associating the map\n * keys with their corresponding value type on T.\n *\n * Use `PropertyValues` when overriding ReactiveElement.update() and\n * other lifecycle methods in order to get stronger type-checking on keys\n * and values.\n */\n// This type is conditional so that if the parameter T is not specified, or\n// is `any`, the type will include `Map`. Since T is not\n// given in the uses of PropertyValues in this file, all uses here fallback to\n// meaning `Map`, but if a developer uses\n// `PropertyValues` (or any other value for T) they will get a\n// strongly-typed Map type.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type PropertyValues = T extends object\n ? PropertyValueMap\n : Map;\n\n/**\n * Do not use, instead prefer {@linkcode PropertyValues}.\n */\n// This type must be exported such that JavaScript generated by the Google\n// Closure Compiler can import a type reference.\nexport interface PropertyValueMap extends Map {\n get(k: K): T[K] | undefined;\n set(key: K, value: T[K]): this;\n has(k: K): boolean;\n delete(k: K): boolean;\n}\n\nexport const defaultConverter: ComplexAttributeConverter = {\n toAttribute(value: unknown, type?: unknown): unknown {\n switch (type) {\n case Boolean:\n value = value ? emptyStringForBooleanAttribute : null;\n break;\n case Object:\n case Array:\n // if the value is `null` or `undefined` pass this through\n // to allow removing/no change behavior.\n value = value == null ? value : JSON.stringify(value);\n break;\n }\n return value;\n },\n\n fromAttribute(value: string | null, type?: unknown) {\n let fromValue: unknown = value;\n switch (type) {\n case Boolean:\n fromValue = value !== null;\n break;\n case Number:\n fromValue = value === null ? null : Number(value);\n break;\n case Object:\n case Array:\n // Do *not* generate exception when invalid JSON is set as elements\n // don't normally complain on being mis-configured.\n // TODO(sorvell): Do generate exception in *dev mode*.\n try {\n // Assert to adhere to Bazel's \"must type assert JSON parse\" rule.\n fromValue = JSON.parse(value!) as unknown;\n } catch (e) {\n fromValue = null;\n }\n break;\n }\n return fromValue;\n },\n};\n\nexport interface HasChanged {\n (value: unknown, old: unknown): boolean;\n}\n\n/**\n * Change function that returns true if `value` is different from `oldValue`.\n * This method is used as the default for a property's `hasChanged` function.\n */\nexport const notEqual: HasChanged = (value: unknown, old: unknown): boolean =>\n !is(value, old);\n\nconst defaultPropertyDeclaration: PropertyDeclaration = {\n attribute: true,\n type: String,\n converter: defaultConverter,\n reflect: false,\n hasChanged: notEqual,\n};\n\n/**\n * A string representing one of the supported dev mode warning categories.\n */\nexport type WarningKind =\n | 'change-in-update'\n | 'migration'\n | 'async-perform-update';\n\nexport type Initializer = (element: ReactiveElement) => void;\n\n// Temporary, until google3 is on TypeScript 5.2\ndeclare global {\n interface SymbolConstructor {\n readonly metadata: unique symbol;\n }\n}\n\n// Ensure metadata is enabled. TypeScript does not polyfill\n// Symbol.metadata, so we must ensure that it exists.\n(Symbol as {metadata: symbol}).metadata ??= Symbol('metadata');\n\ndeclare global {\n // This is public global API, do not change!\n // eslint-disable-next-line no-var\n var litPropertyMetadata: WeakMap<\n object,\n Map\n >;\n}\n\n// Map from a class's metadata object to property options\n// Note that we must use nullish-coalescing assignment so that we only use one\n// map even if we load multiple version of this module.\nglobal.litPropertyMetadata ??= new WeakMap<\n object,\n Map\n>();\n\n/**\n * Base element class which manages element properties and attributes. When\n * properties change, the `update` method is asynchronously called. This method\n * should be supplied by subclasses to render updates as desired.\n * @noInheritDoc\n */\nexport abstract class ReactiveElement\n // In the Node build, this `extends` clause will be substituted with\n // `(globalThis.HTMLElement ?? HTMLElement)`.\n //\n // This way, we will first prefer any global `HTMLElement` polyfill that the\n // user has assigned, and then fall back to the `HTMLElement` shim which has\n // been imported (see note at the top of this file about how this import is\n // generated by Rollup). Note that the `HTMLElement` variable has been\n // shadowed by this import, so it no longer refers to the global.\n extends HTMLElement\n implements ReactiveControllerHost\n{\n // Note: these are patched in only in DEV_MODE.\n /**\n * Read or set all the enabled warning categories for this class.\n *\n * This property is only used in development builds.\n *\n * @nocollapse\n * @category dev-mode\n */\n static enabledWarnings?: WarningKind[];\n\n /**\n * Enable the given warning category for this class.\n *\n * This method only exists in development builds, so it should be accessed\n * with a guard like:\n *\n * ```ts\n * // Enable for all ReactiveElement subclasses\n * ReactiveElement.enableWarning?.('migration');\n *\n * // Enable for only MyElement and subclasses\n * MyElement.enableWarning?.('migration');\n * ```\n *\n * @nocollapse\n * @category dev-mode\n */\n static enableWarning?: (warningKind: WarningKind) => void;\n\n /**\n * Disable the given warning category for this class.\n *\n * This method only exists in development builds, so it should be accessed\n * with a guard like:\n *\n * ```ts\n * // Disable for all ReactiveElement subclasses\n * ReactiveElement.disableWarning?.('migration');\n *\n * // Disable for only MyElement and subclasses\n * MyElement.disableWarning?.('migration');\n * ```\n *\n * @nocollapse\n * @category dev-mode\n */\n static disableWarning?: (warningKind: WarningKind) => void;\n\n /**\n * Adds an initializer function to the class that is called during instance\n * construction.\n *\n * This is useful for code that runs against a `ReactiveElement`\n * subclass, such as a decorator, that needs to do work for each\n * instance, such as setting up a `ReactiveController`.\n *\n * ```ts\n * const myDecorator = (target: typeof ReactiveElement, key: string) => {\n * target.addInitializer((instance: ReactiveElement) => {\n * // This is run during construction of the element\n * new MyController(instance);\n * });\n * }\n * ```\n *\n * Decorating a field will then cause each instance to run an initializer\n * that adds a controller:\n *\n * ```ts\n * class MyElement extends LitElement {\n * @myDecorator foo;\n * }\n * ```\n *\n * Initializers are stored per-constructor. Adding an initializer to a\n * subclass does not add it to a superclass. Since initializers are run in\n * constructors, initializers will run in order of the class hierarchy,\n * starting with superclasses and progressing to the instance's class.\n *\n * @nocollapse\n */\n static addInitializer(initializer: Initializer) {\n this.__prepare();\n (this._initializers ??= []).push(initializer);\n }\n\n static _initializers?: Initializer[];\n\n /*\n * Due to closure compiler ES6 compilation bugs, @nocollapse is required on\n * all static methods and properties with initializers. Reference:\n * - https://github.com/google/closure-compiler/issues/1776\n */\n\n /**\n * Maps attribute names to properties; for example `foobar` attribute to\n * `fooBar` property. Created lazily on user subclasses when finalizing the\n * class.\n * @nocollapse\n */\n private static __attributeToPropertyMap: AttributeMap;\n\n /**\n * Marks class as having been finalized, which includes creating properties\n * from `static properties`, but does *not* include all properties created\n * from decorators.\n * @nocollapse\n */\n protected static finalized: true | undefined;\n\n /**\n * Memoized list of all element properties, including any superclass\n * properties. Created lazily on user subclasses when finalizing the class.\n *\n * @nocollapse\n * @category properties\n */\n static elementProperties: PropertyDeclarationMap;\n\n /**\n * User-supplied object that maps property names to `PropertyDeclaration`\n * objects containing options for configuring reactive properties. When\n * a reactive property is set the element will update and render.\n *\n * By default properties are public fields, and as such, they should be\n * considered as primarily settable by element users, either via attribute or\n * the property itself.\n *\n * Generally, properties that are changed by the element should be private or\n * protected fields and should use the `state: true` option. Properties\n * marked as `state` do not reflect from the corresponding attribute\n *\n * However, sometimes element code does need to set a public property. This\n * should typically only be done in response to user interaction, and an event\n * should be fired informing the user; for example, a checkbox sets its\n * `checked` property when clicked and fires a `changed` event. Mutating\n * public properties should typically not be done for non-primitive (object or\n * array) properties. In other cases when an element needs to manage state, a\n * private property set with the `state: true` option should be used. When\n * needed, state properties can be initialized via public properties to\n * facilitate complex interactions.\n * @nocollapse\n * @category properties\n */\n static properties: PropertyDeclarations;\n\n /**\n * Memoized list of all element styles.\n * Created lazily on user subclasses when finalizing the class.\n * @nocollapse\n * @category styles\n */\n static elementStyles: Array = [];\n\n /**\n * Array of styles to apply to the element. The styles should be defined\n * using the {@linkcode css} tag function, via constructible stylesheets, or\n * imported from native CSS module scripts.\n *\n * Note on Content Security Policy:\n *\n * Element styles are implemented with `',\n};\n\nclass ChatMessage extends LightElement {\n @property() content = \"...\";\n @property() content_type: ContentType = \"markdown\";\n @property({ type: Boolean, reflect: true }) streaming = false;\n @property() icon = \"\";\n\n render() {\n // Show dots until we have content\n const isEmpty = this.content.trim().length === 0;\n const icon = isEmpty ? ICONS.dots_fade : this.icon || ICONS.robot;\n\n return html`\n

${unsafeHTML(icon)}
\n \n `;\n }\n\n #onContentChange(): void {\n if (!this.streaming) this.#makeSuggestionsAccessible();\n }\n\n #makeSuggestionsAccessible(): void {\n this.querySelectorAll(\".suggestion,[data-suggestion]\").forEach((el) => {\n if (!(el instanceof HTMLElement)) return;\n if (el.hasAttribute(\"tabindex\")) return;\n\n el.setAttribute(\"tabindex\", \"0\");\n el.setAttribute(\"role\", \"button\");\n\n const suggestion = el.dataset.suggestion || el.textContent;\n el.setAttribute(\"aria-label\", `Use chat suggestion: ${suggestion}`);\n });\n }\n}\n\nclass ChatUserMessage extends LightElement {\n @property() content = \"...\";\n\n render() {\n return html`\n \n `;\n }\n}\n\nclass ChatStatusMessage extends LightElement {\n @property() content = \"\";\n @property() content_type: Exclude = \"text\";\n @property() type: \"dynamic\" | \"static\" = \"static\";\n\n render() {\n const content =\n this.content_type === \"html\" ? unsafeHTML(this.content) : this.content;\n return html`${content}`;\n }\n\n updated(changedProperties: Map) {\n super.updated(changedProperties);\n if (\n changedProperties.has(\"content\") ||\n changedProperties.has(\"content_type\")\n ) {\n this.#scrollIntoView();\n }\n }\n\n #scrollIntoView() {\n this.scrollIntoView({ behavior: \"smooth\", block: \"end\" });\n }\n}\n\nclass ChatMessages extends LightElement {\n render() {\n return html``;\n }\n}\n\ninterface ChatInputSetInputOptions {\n submit?: boolean;\n focus?: boolean;\n}\n\nclass ChatInput extends LightElement {\n private _disabled = false;\n\n @property() placeholder = \"Enter a message...\";\n // disabled is reflected manually because `reflect: true` doesn't work with LightElement\n @property({ type: Boolean })\n get disabled() {\n return this._disabled;\n }\n\n set disabled(value: boolean) {\n const oldValue = this._disabled;\n if (value === oldValue) {\n return;\n }\n\n this._disabled = value;\n value\n ? this.setAttribute(\"disabled\", \"\")\n : this.removeAttribute(\"disabled\");\n\n this.requestUpdate(\"disabled\", oldValue);\n this.#onInput();\n }\n\n attributeChangedCallback(\n name: string,\n _old: string | null,\n value: string | null\n ) {\n super.attributeChangedCallback(name, _old, value);\n if (name === \"disabled\") {\n this.disabled = value !== null;\n }\n }\n\n private get textarea(): HTMLTextAreaElement {\n return this.querySelector(\"textarea\") as HTMLTextAreaElement;\n }\n\n private get value(): string {\n return this.textarea.value;\n }\n\n private get valueIsEmpty(): boolean {\n return this.value.trim().length === 0;\n }\n\n private get button(): HTMLButtonElement {\n return this.querySelector(\"button\") as HTMLButtonElement;\n }\n\n render() {\n const icon =\n '';\n\n return html`\n \n \n ${unsafeHTML(icon)}\n \n `;\n }\n\n // Pressing enter sends the message (if not empty)\n #onKeyDown(e: KeyboardEvent): void {\n const isEnter = e.code === \"Enter\" && !e.shiftKey;\n if (isEnter && !this.valueIsEmpty) {\n e.preventDefault();\n this.#sendInput();\n }\n }\n\n #onInput(): void {\n this.button.disabled = this.disabled\n ? true\n : this.value.trim().length === 0;\n }\n\n // Determine whether the button should be enabled/disabled on first render\n protected firstUpdated(): void {\n this.#onInput();\n }\n\n #sendInput(focus = true): void {\n if (this.valueIsEmpty) return;\n if (this.disabled) return;\n\n Shiny.setInputValue!(this.id, this.value, { priority: \"event\" });\n\n // Emit event so parent element knows to insert the message\n const sentEvent = new CustomEvent(\"shiny-chat-input-sent\", {\n detail: { content: this.value, role: \"user\" },\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(sentEvent);\n\n this.setInputValue(\"\");\n this.disabled = true;\n\n if (focus) this.textarea.focus();\n }\n\n setInputValue(\n value: string,\n { submit = false, focus = false }: ChatInputSetInputOptions = {}\n ): void {\n // Store previous value to restore post-submit (if submitting)\n const oldValue = this.textarea.value;\n\n this.textarea.value = value;\n\n // Simulate an input event (to trigger the textarea autoresize)\n const inputEvent = new Event(\"input\", { bubbles: true, cancelable: true });\n this.textarea.dispatchEvent(inputEvent);\n\n if (submit) {\n this.#sendInput(false);\n if (oldValue) this.setInputValue(oldValue);\n }\n\n if (focus) {\n this.textarea.focus();\n }\n }\n}\n\nclass ChatContainer extends LightElement {\n @property({ attribute: \"icon-assistant\" }) iconAssistant = \"\";\n inputSentinelObserver?: IntersectionObserver;\n\n private get input(): ChatInput {\n return this.querySelector(CHAT_INPUT_TAG) as ChatInput;\n }\n\n private get messages(): ChatMessages {\n return this.querySelector(CHAT_MESSAGES_TAG) as ChatMessages;\n }\n\n private get lastMessage(): ChatMessage | null {\n const last = this.messages.querySelector(\"shiny-chat-message:last-child\");\n return last ? (last as ChatMessage) : null;\n }\n\n render() {\n return html``;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n\n // We use a sentinel element that we place just above the shiny-chat-input. When it\n // moves off-screen we know that the text area input is now floating, add shadow.\n let sentinel = this.querySelector(\"div\");\n if (!sentinel) {\n sentinel = createElement(\"div\", {\n style: \"width: 100%; height: 0;\",\n }) as HTMLElement;\n this.input.insertAdjacentElement(\"afterend\", sentinel);\n }\n\n this.inputSentinelObserver = new IntersectionObserver(\n (entries) => {\n const inputTextarea = this.input.querySelector(\"textarea\");\n if (!inputTextarea) return;\n const addShadow = entries[0]?.intersectionRatio === 0;\n inputTextarea.classList.toggle(\"shadow\", addShadow);\n },\n {\n threshold: [0, 1],\n rootMargin: \"0px\",\n }\n );\n\n this.inputSentinelObserver.observe(sentinel);\n }\n\n firstUpdated(): void {\n // Don't attach event listeners until child elements are rendered\n if (!this.messages) return;\n\n this.addEventListener(\"shiny-chat-input-sent\", this.#onInputSent);\n this.addEventListener(\"shiny-chat-append-message\", this.#onAppend);\n this.addEventListener(\n \"shiny-chat-append-message-chunk\",\n this.#onAppendChunk\n );\n this.addEventListener(\n \"shiny-chat-append-status-message\",\n this.#onAppendStatus\n );\n this.addEventListener(\"shiny-chat-clear-messages\", this.#onClear);\n this.addEventListener(\n \"shiny-chat-update-user-input\",\n this.#onUpdateUserInput\n );\n this.addEventListener(\n \"shiny-chat-remove-loading-message\",\n this.#onRemoveLoadingMessage\n );\n this.addEventListener(\"click\", this.#onInputSuggestionClick);\n this.addEventListener(\"keydown\", this.#onInputSuggestionKeydown);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n\n this.inputSentinelObserver?.disconnect();\n this.inputSentinelObserver = undefined;\n\n this.removeEventListener(\"shiny-chat-input-sent\", this.#onInputSent);\n this.removeEventListener(\"shiny-chat-append-message\", this.#onAppend);\n this.removeEventListener(\n \"shiny-chat-append-message-chunk\",\n this.#onAppendChunk\n );\n this.removeEventListener(\n \"shiny-chat-append-status-message\",\n this.#onAppendStatus\n );\n this.removeEventListener(\"shiny-chat-clear-messages\", this.#onClear);\n this.removeEventListener(\n \"shiny-chat-update-user-input\",\n this.#onUpdateUserInput\n );\n this.removeEventListener(\n \"shiny-chat-remove-loading-message\",\n this.#onRemoveLoadingMessage\n );\n this.removeEventListener(\"click\", this.#onInputSuggestionClick);\n this.removeEventListener(\"keydown\", this.#onInputSuggestionKeydown);\n }\n\n // When user submits input, append it to the chat, and add a loading message\n #onInputSent(event: CustomEvent): void {\n this.#appendMessage(event.detail);\n this.#addLoadingMessage();\n }\n\n // Handle an append message event from server\n #onAppend(event: CustomEvent): void {\n this.#appendMessage(event.detail);\n }\n\n #initMessage(): void {\n this.#removeLoadingMessage();\n if (!this.input.disabled) {\n this.input.disabled = true;\n }\n }\n\n #appendMessage(message: Message, finalize = true): void {\n this.#initMessage();\n\n const TAG_NAME =\n message.role === \"user\" ? CHAT_USER_MESSAGE_TAG : CHAT_MESSAGE_TAG;\n\n if (this.iconAssistant) {\n message.icon = message.icon || this.iconAssistant;\n }\n\n const msg = createElement(TAG_NAME, message);\n this.messages.appendChild(msg);\n\n if (finalize) {\n this.#finalizeMessage();\n }\n }\n\n // Loading message is just an empty message\n #addLoadingMessage(): void {\n const loading_message = {\n content: \"\",\n role: \"assistant\",\n };\n const message = createElement(CHAT_MESSAGE_TAG, loading_message);\n this.messages.appendChild(message);\n }\n\n #removeLoadingMessage(): void {\n const content = this.lastMessage?.content;\n if (!content) this.lastMessage?.remove();\n }\n\n #onAppendChunk(event: CustomEvent): void {\n this.#appendMessageChunk(event.detail);\n }\n\n #appendMessageChunk(message: Message): void {\n if (message.chunk_type === \"message_start\") {\n this.#appendMessage(message, false);\n }\n\n const lastMessage = this.lastMessage;\n if (!lastMessage) throw new Error(\"No messages found in the chat output\");\n\n if (message.chunk_type === \"message_start\") {\n lastMessage.setAttribute(\"streaming\", \"\");\n return;\n }\n\n const content =\n message.operation === \"append\"\n ? lastMessage.getAttribute(\"content\") + message.content\n : message.content;\n\n lastMessage.setAttribute(\"content\", content);\n\n if (message.chunk_type === \"message_end\") {\n this.lastMessage?.removeAttribute(\"streaming\");\n this.#finalizeMessage();\n }\n }\n\n #onAppendStatus(event: CustomEvent): void {\n if (event.detail.type === \"dynamic\") {\n if (this.messages.lastChild instanceof ChatStatusMessage) {\n if (this.messages.lastChild.type == \"dynamic\") {\n // Update previous status message if last message was a status item\n this.messages.lastChild.setAttribute(\"content\", event.detail.content);\n this.messages.lastChild.setAttribute(\n \"content_type\",\n event.detail.content_type\n );\n return;\n }\n }\n }\n\n const status = createElement(CHAT_STATUS_MESSAGE_TAG, event.detail);\n this.messages.appendChild(status);\n }\n\n #onClear(): void {\n this.messages.innerHTML = \"\";\n }\n\n #onUpdateUserInput(event: CustomEvent): void {\n const { value, placeholder, submit, focus } = event.detail;\n if (value !== undefined) {\n this.input.setInputValue(value, { submit, focus });\n }\n if (placeholder !== undefined) {\n this.input.placeholder = placeholder;\n }\n }\n\n #onInputSuggestionClick(e: MouseEvent): void {\n this.#onInputSuggestionEvent(e);\n }\n\n #onInputSuggestionKeydown(e: KeyboardEvent): void {\n const isEnterOrSpace = e.key === \"Enter\" || e.key === \" \";\n if (!isEnterOrSpace) return;\n\n this.#onInputSuggestionEvent(e);\n }\n\n #onInputSuggestionEvent(e: MouseEvent | KeyboardEvent): void {\n const { suggestion, submit } = this.#getSuggestion(e.target);\n if (!suggestion) return;\n\n e.preventDefault();\n // Cmd/Ctrl + (event) = force submitting\n // Alt/Opt + (event) = force setting without submitting\n const shouldSubmit =\n e.metaKey || e.ctrlKey ? true : e.altKey ? false : submit;\n\n this.input.setInputValue(suggestion, {\n submit: shouldSubmit,\n focus: !shouldSubmit,\n });\n }\n\n #getSuggestion(x: EventTarget | null): {\n suggestion?: string;\n submit?: boolean;\n } {\n if (!(x instanceof HTMLElement)) return {};\n\n const el = x.closest(\".suggestion, [data-suggestion]\");\n if (!(el instanceof HTMLElement)) return {};\n\n const isSuggestion =\n el.classList.contains(\"suggestion\") ||\n el.dataset.suggestion !== undefined;\n if (!isSuggestion) return {};\n\n const suggestion = el.dataset.suggestion || el.textContent;\n\n return {\n suggestion: suggestion || undefined,\n submit:\n el.classList.contains(\"submit\") ||\n el.dataset.suggestionSubmit === \"\" ||\n el.dataset.suggestionSubmit === \"true\",\n };\n }\n\n #onRemoveLoadingMessage(): void {\n this.#removeLoadingMessage();\n this.#finalizeMessage();\n }\n\n #finalizeMessage(): void {\n this.input.disabled = false;\n }\n}\n\n// ------- Register custom elements and shiny bindings ---------\n\ncustomElements.define(CHAT_MESSAGE_TAG, ChatMessage);\ncustomElements.define(CHAT_USER_MESSAGE_TAG, ChatUserMessage);\ncustomElements.define(CHAT_STATUS_MESSAGE_TAG, ChatStatusMessage);\ncustomElements.define(CHAT_MESSAGES_TAG, ChatMessages);\ncustomElements.define(CHAT_INPUT_TAG, ChatInput);\ncustomElements.define(CHAT_CONTAINER_TAG, ChatContainer);\n\n$(function () {\n Shiny.addCustomMessageHandler(\n \"shinyChatMessage\",\n function (message: ShinyChatMessage) {\n const evt = new CustomEvent(message.handler, {\n detail: message.obj,\n });\n\n const el = document.getElementById(message.id);\n\n if (!el) {\n showShinyClientMessage({\n status: \"error\",\n message: `Unable to handle Chat() message since element with id\n ${message.id} wasn't found. Do you need to call .ui() (Express) or need a\n chat_ui('${message.id}') in the UI (Core)?\n `,\n });\n return;\n }\n\n el.dispatchEvent(evt);\n }\n );\n});\n"], + "mappings": "4MAMA,IAGMA,EAASC,WAKFC,EACXF,EAAOG,aACNH,EAAOI,WADDD,QAC2BH,EAAOI,SAASC,eAClD,uBAAwBC,SAASC,WACjC,YAAaC,cAAcD,UAkBvBE,GAAoBC,OAAAA,EAEpBC,GAAc,IAAIC,QASXC,EATWD,KASXC,CAOX,YACEC,EACAC,EACAC,EAAAA,CAEA,GAVFC,KAAe,aAAA,GAUTD,IAAcP,GAChB,MAAUS,MACR,mEAAA,EAGJD,KAAKH,QAAUA,EACfG,KAAKE,EAAWJ,CACjB,CAID,IAAA,YAAIK,CAGF,IAAIA,EAAaH,KAAKI,EAChBN,EAAUE,KAAKE,EACrB,GAAIjB,GAA+BkB,IAA/BlB,OAAyD,CAC3D,IAAMoB,EAAYP,IAAZO,QAAqCP,EAAQQ,SAAW,EAC1DD,IACFF,EAAaT,GAAYa,IAAIT,CAAAA,GAE3BK,IAF2BL,UAG5BE,KAAKI,EAAcD,EAAa,IAAIZ,eAAiBiB,YACpDR,KAAKH,OAAAA,EAEHQ,GACFX,GAAYe,IAAIX,EAASK,CAAAA,EAG9B,CACD,OAAOA,CACR,CAED,UAAAO,CACE,OAAOV,KAAKH,OACb,CAAA,EAiCUc,GAAaC,GACxB,IAAKhB,EACc,OAAVgB,GAAU,SAAWA,EAAeA,EAAPC,GAAAA,OAEpCrB,EAAAA,EA1BJ,IAgEasB,GAAc,CACzBC,EACAC,IAAAA,CAEA,GAAIC,EACDF,EAA0BG,mBAAqBF,EAAOG,IAAKC,GAC1DA,aAAaC,cAAgBD,EAAIA,EAAEE,UAAAA,MAGrC,SAAWF,KAAKJ,EAAQ,CACtB,IAAMO,EAAQC,SAASC,cAAc,OAAA,EAE/BC,EAASC,EAAyB,SACpCD,IADoC,QAEtCH,EAAMK,aAAa,QAASF,CAAAA,EAE9BH,EAAMM,YAAeT,EAAgBU,QACrCf,EAAWgB,YAAYR,CAAAA,CACxB,CACF,EAWUS,EACXf,EAEKG,GAAyBA,EACzBA,GACCA,aAAaC,eAbYY,GAAAA,CAC/B,IAAIH,EAAU,GACd,QAAWI,KAAQD,EAAME,SACvBL,GAAWI,EAAKJ,QAElB,OAAOM,GAAUN,CAAAA,CAAQ,GAQkCV,CAAAA,EAAKA,EChKlE,GAAA,CAAMiB,GACJA,GAAEC,eACFA,GAAcC,yBACdA,GAAwBC,oBACxBA,GAAmBC,sBACnBA,GAAqBC,eACrBA,EAAAA,EACEC,OAKEC,EAASC,WAUTC,GAAgBF,EACnBE,aAMGC,GAAiCD,GAClCA,GAAaE,YACd,GAEEC,GAEFL,EAAOM,+BA4FLC,EAA4B,CAChCC,EACAC,IACMD,EAuJKE,EAA8C,CACzD,YAAYC,EAAgBC,EAAAA,CAC1B,OAAQA,EAAAA,CACN,KAAKC,QACHF,EAAQA,EAAQR,GAAiC,KACjD,MACF,KAAKJ,OACL,KAAKe,MAGHH,EAAQA,GAAS,KAAOA,EAAQI,KAAKC,UAAUL,CAAAA,CAAAA,CAGnD,OAAOA,CACR,EAED,cAAcA,EAAsBC,EAAAA,CAClC,IAAIK,EAAqBN,EACzB,OAAQC,EAAAA,CACN,KAAKC,QACHI,EAAYN,IAAU,KACtB,MACF,KAAKO,OACHD,EAAYN,IAAU,KAAO,KAAOO,OAAOP,CAAAA,EAC3C,MACF,KAAKZ,OACL,KAAKe,MAIH,GAAA,CAEEG,EAAYF,KAAKI,MAAMR,CAAAA,CACxB,MAAQS,CACPH,EAAY,IACb,CAAA,CAGL,OAAOA,CACR,CAAA,EAWUI,EAAuB,CAACV,EAAgBW,IAAAA,CAClD7B,GAAGkB,EAAOW,CAAAA,EAEPC,GAAkD,CACtDC,UAAAA,GACAZ,KAAMa,OACNC,UAAWhB,EACXiB,QAAAA,GACAC,WAAYP,CAAAA,EAsBbQ,OAA8BC,WAAaD,OAAO,UAAA,EAcnD7B,EAAO+B,sBAAwB,IAAIC,QAAAA,IAWbC,EAXaD,cAoBzBE,WAAAA,CAqFR,OAAA,eAAsBC,EAAAA,CACpBC,KAAKC,KAAAA,GACJD,KAAKE,IAAkB,CAAA,GAAIC,KAAKJ,CAAAA,CAClC,CAuGD,WAAA,oBAAWK,CAOT,OALAJ,KAAKK,SAAAA,EAMHL,KAAKM,MAA4B,CAAA,GAAIN,KAAKM,KAAyBC,KAAAA,CAAAA,CAEtE,CA6BD,OAAA,eACEC,EACAC,EAA+BtB,GAAAA,CAQ/B,GALIsB,EAAQC,QACTD,EAAsDrB,UAAAA,IAEzDY,KAAKC,KAAAA,EACLD,KAAKW,kBAAkBC,IAAIJ,EAAMC,CAAAA,EAAAA,CAC5BA,EAAQI,WAAY,CACvB,IAAMC,EAIFrB,OAAAA,EACEsB,EAAaf,KAAKgB,sBAAsBR,EAAMM,EAAKL,CAAAA,EACrDM,IADqDN,QAEvDnD,GAAe0C,KAAKiB,UAAWT,EAAMO,CAAAA,CAExC,CACF,CA6BS,OAAA,sBACRP,EACAM,EACAL,EAAAA,CAEA,GAAA,CAAMS,IAACA,EAAGN,IAAEA,CAAAA,EAAOrD,GAAyByC,KAAKiB,UAAWT,CAAAA,GAAS,CACnE,KAAAU,CACE,OAAOlB,KAAKc,CAAAA,CACb,EACD,IAA2BK,EAAAA,CACxBnB,KAAqDc,CAAAA,EAAOK,CAC9D,CAAA,EAmBH,MAAO,CACL,KAAAD,CACE,OAAOA,GAAKE,KAAKpB,IAAAA,CAClB,EACD,IAA2BzB,EAAAA,CACzB,IAAM8C,EAAWH,GAAKE,KAAKpB,IAAAA,EAC3BY,EAAKQ,KAAKpB,KAAMzB,CAAAA,EAChByB,KAAKsB,cAAcd,EAAMa,EAAUZ,CAAAA,CACpC,EACDc,aAAAA,GACAC,WAAAA,EAAY,CAEf,CAgBD,OAAA,mBAA0BhB,EAAAA,CACxB,OAAOR,KAAKW,kBAAkBO,IAAIV,CAAAA,GAASrB,EAC5C,CAgBO,OAAA,MAAOc,CACb,GACED,KAAKyB,eAAetD,EAA0B,mBAAA,CAAA,EAG9C,OAGF,IAAMuD,EAAYhE,GAAesC,IAAAA,EACjC0B,EAAUrB,SAAAA,EAKNqB,EAAUxB,IALJG,SAMRL,KAAKE,EAAgB,CAAA,GAAIwB,EAAUxB,CAAAA,GAGrCF,KAAKW,kBAAoB,IAAIgB,IAAID,EAAUf,iBAAAA,CAC5C,CAaS,OAAA,UAAON,CACf,GAAIL,KAAKyB,eAAetD,EAA0B,WAAA,CAAA,EAChD,OAMF,GAJA6B,KAAK4B,UAAAA,GACL5B,KAAKC,KAAAA,EAGDD,KAAKyB,eAAetD,EAA0B,YAAA,CAAA,EAAsB,CACtE,IAAM0D,EAAQ7B,KAAK8B,WACbC,EAAW,CAAA,GACZvE,GAAoBqE,CAAAA,EAAAA,GACpBpE,GAAsBoE,CAAAA,CAAAA,EAE3B,QAAWG,KAAKD,EACd/B,KAAKiC,eAAeD,EAAGH,EAAMG,CAAAA,CAAAA,CAEhC,CAGD,IAAMtC,EAAWM,KAAKP,OAAOC,QAAAA,EAC7B,GAAIA,IAAa,KAAM,CACrB,IAAMoC,EAAanC,oBAAoBuB,IAAIxB,CAAAA,EAC3C,GAAIoC,IAAJ,OACE,OAAK,CAAOE,EAAGvB,CAAAA,IAAYqB,EACzB9B,KAAKW,kBAAkBC,IAAIoB,EAAGvB,CAAAA,CAGnC,CAGDT,KAAKM,KAA2B,IAAIqB,IACpC,OAAK,CAAOK,EAAGvB,CAAAA,IAAYT,KAAKW,kBAAmB,CACjD,IAAMuB,EAAOlC,KAAKmC,KAA2BH,EAAGvB,CAAAA,EAC5CyB,IAD4CzB,QAE9CT,KAAKM,KAAyBM,IAAIsB,EAAMF,CAAAA,CAE3C,CAEDhC,KAAKoC,cAAgBpC,KAAKqC,eAAerC,KAAKsC,MAAAA,CAkB/C,CA4BS,OAAA,eACRA,EAAAA,CAEA,IAAMF,EAAgB,CAAA,EACtB,GAAI1D,MAAM6D,QAAQD,CAAAA,EAAS,CAIzB,IAAM1B,EAAM,IAAI4B,IAAKF,EAA0BG,KAAKC,GAAAA,EAAUC,QAAAA,CAAAA,EAE9D,QAAWC,KAAKhC,EACdwB,EAAcS,QAAQC,EAAmBF,CAAAA,CAAAA,CAE5C,MAAUN,IAAV,QACCF,EAAcjC,KAAK2C,EAAmBR,CAAAA,CAAAA,EAExC,OAAOF,CACR,CAaO,OAAA,KACN5B,EACAC,EAAAA,CAEA,IAAMrB,EAAYqB,EAAQrB,UAC1B,OAAOA,IAAP,GAAOA,OAEkB,OAAdA,GAAc,SACrBA,EACgB,OAAToB,GAAS,SAChBA,EAAKuC,YAAAA,EAAAA,MAEV,CA2CD,aAAAC,CACEC,MAAAA,EApWMjD,KAAoBkD,KAAAA,OAmU5BlD,KAAemD,gBAAAA,GAOfnD,KAAUoD,WAAAA,GAkBFpD,KAAoBqD,KAAuB,KASjDrD,KAAKsD,KAAAA,CACN,CAMO,MAAAA,CACNtD,KAAKuD,KAAkB,IAAIC,QACxBC,GAASzD,KAAK0D,eAAiBD,CAAAA,EAElCzD,KAAK2D,KAAsB,IAAIhC,IAG/B3B,KAAK4D,KAAAA,EAGL5D,KAAKsB,cAAAA,EACJtB,KAAKgD,YAAuC9C,GAAe2D,QAASC,GACnEA,EAAE9D,IAAAA,CAAAA,CAEL,CAWD,cAAc+D,EAAAA,EACX/D,KAAKgE,OAAkB,IAAIxB,KAAOyB,IAAIF,CAAAA,EAKnC/D,KAAKkE,aAL8BH,QAKF/D,KAAKmE,aACxCJ,EAAWK,gBAAAA,CAEd,CAMD,iBAAiBL,EAAAA,CACf/D,KAAKgE,MAAeK,OAAON,CAAAA,CAC5B,CAcO,MAAAH,CACN,IAAMU,EAAqB,IAAI3C,IACzBhB,EAAqBX,KAAKgD,YAC7BrC,kBACH,QAAWqB,KAAKrB,EAAkBJ,KAAAA,EAC5BP,KAAKyB,eAAeO,CAAAA,IACtBsC,EAAmB1D,IAAIoB,EAAGhC,KAAKgC,CAAAA,CAAAA,EAAAA,OACxBhC,KAAKgC,CAAAA,GAGZsC,EAAmBC,KAAO,IAC5BvE,KAAKkD,KAAuBoB,EAE/B,CAWS,kBAAAE,CACR,IAAMN,EACJlE,KAAKyE,YACLzE,KAAK0E,aACF1E,KAAKgD,YAAuC2B,iBAAAA,EAMjD,OAJAC,GACEV,EACClE,KAAKgD,YAAuCZ,aAAAA,EAExC8B,CACR,CAOD,mBAAAW,CAEG7E,KAA4CkE,aAC3ClE,KAAKwE,iBAAAA,EACPxE,KAAK0D,eAAAA,EAAe,EACpB1D,KAAKgE,MAAeH,QAASiB,GAAMA,EAAEV,gBAAAA,CAAAA,CACtC,CAQS,eAAeW,EAAAA,CAA6B,CAQtD,sBAAAC,CACEhF,KAAKgE,MAAeH,QAASiB,GAAMA,EAAEG,mBAAAA,CAAAA,CACtC,CAcD,yBACEzE,EACA0E,EACA3G,EAAAA,CAEAyB,KAAKmF,KAAsB3E,EAAMjC,CAAAA,CAClC,CAEO,KAAsBiC,EAAmBjC,EAAAA,CAC/C,IAGMkC,EAFJT,KAAKgD,YACLrC,kBAC6BO,IAAIV,CAAAA,EAC7B0B,EACJlC,KAAKgD,YACLb,KAA2B3B,EAAMC,CAAAA,EACnC,GAAIyB,IAAJ,QAA0BzB,EAAQlB,UAA9B2C,GAAgD,CAClD,IAKMkD,GAJH3E,EAAQnB,WAAyC+F,cAI9CD,OAFC3E,EAAQnB,UACThB,GACsB+G,YAAa9G,EAAOkC,EAAQjC,IAAAA,EAwBxDwB,KAAKqD,KAAuB7C,EACxB4E,GAAa,KACfpF,KAAKsF,gBAAgBpD,CAAAA,EAErBlC,KAAKuF,aAAarD,EAAMkD,CAAAA,EAG1BpF,KAAKqD,KAAuB,IAC7B,CACF,CAGD,KAAsB7C,EAAcjC,EAAAA,CAClC,IAAMiH,EAAOxF,KAAKgD,YAGZyC,EAAYD,EAAKlF,KAA0CY,IAAIV,CAAAA,EAGrE,GAAIiF,IAAJ,QAA8BzF,KAAKqD,OAAyBoC,EAAU,CACpE,IAAMhF,EAAU+E,EAAKE,mBAAmBD,CAAAA,EAClCnG,EACyB,OAAtBmB,EAAQnB,WAAc,WACzB,CAACqG,cAAelF,EAAQnB,SAAAA,EACxBmB,EAAQnB,WAAWqG,gBADKrG,OAExBmB,EAAQnB,UACRhB,EAEN0B,KAAKqD,KAAuBoC,EAC5BzF,KAAKyF,CAAAA,EAA0BnG,EAAUqG,cACvCpH,EACAkC,EAAQjC,IAAAA,EAIVwB,KAAKqD,KAAuB,IAC7B,CACF,CAgBD,cACE7C,EACAa,EACAZ,EAAAA,CAGA,GAAID,IAAJ,OAAwB,CAYtB,GALAC,IACET,KAAKgD,YACL0C,mBAAmBlF,CAAAA,EAAAA,EACFC,EAAQjB,YAAcP,GACxBe,KAAKQ,CAAAA,EACGa,CAAAA,EAIvB,OAHArB,KAAK4F,EAAiBpF,EAAMa,EAAUZ,CAAAA,CAKzC,CACGT,KAAKmD,kBADR,KAECnD,KAAKuD,KAAkBvD,KAAK6F,KAAAA,EAE/B,CAKD,EACErF,EACAa,EACAZ,EAAAA,CAIKT,KAAK2D,KAAoBmC,IAAItF,CAAAA,GAChCR,KAAK2D,KAAoB/C,IAAIJ,EAAMa,CAAAA,EAMjCZ,EAAQlB,UANyB8B,IAMLrB,KAAKqD,OAAyB7C,IAC3DR,KAAK+F,OAA2B,IAAIvD,KAAoByB,IAAIzD,CAAAA,CAEhE,CAKO,MAAA,MAAMqF,CACZ7F,KAAKmD,gBAAAA,GACL,GAAA,CAAA,MAGQnD,KAAKuD,IACZ,OAAQvE,EAAAA,CAKPwE,QAAQwC,OAAOhH,CAAAA,CAChB,CACD,IAAMiH,EAASjG,KAAKkG,eAAAA,EAOpB,OAHID,GAAU,MAAVA,MACIA,EAAAA,CAEAjG,KAAKmD,eACd,CAmBS,gBAAA+C,CAiBR,OAhBelG,KAAKmG,cAAAA,CAiBrB,CAYS,eAAAA,CAIR,GAAA,CAAKnG,KAAKmD,gBACR,OAGF,GAAA,CAAKnD,KAAKoD,WAAY,CA2BpB,GAxBCpD,KAA4CkE,aAC3ClE,KAAKwE,iBAAAA,EAuBHxE,KAAKkD,KAAsB,CAG7B,OAAK,CAAOlB,EAAGzD,CAAAA,IAAUyB,KAAKkD,KAC5BlD,KAAKgC,CAAAA,EAAmBzD,EAE1ByB,KAAKkD,KAAAA,MACN,CAWD,IAAMvC,EAAqBX,KAAKgD,YAC7BrC,kBACH,GAAIA,EAAkB4D,KAAO,EAC3B,OAAK,CAAOvC,EAAGvB,CAAAA,IAAYE,EAEvBF,EAAQ2F,UAFezF,IAGtBX,KAAK2D,KAAoBmC,IAAI9D,CAAAA,GAC9BhC,KAAKgC,CAAAA,IADyBA,QAG9BhC,KAAK4F,EAAiB5D,EAAGhC,KAAKgC,CAAAA,EAAkBvB,CAAAA,CAIvD,CACD,IAAI4F,EAAAA,GACEC,EAAoBtG,KAAK2D,KAC/B,GAAA,CACE0C,EAAerG,KAAKqG,aAAaC,CAAAA,EAC7BD,GACFrG,KAAKuG,WAAWD,CAAAA,EAChBtG,KAAKgE,MAAeH,QAASiB,GAAMA,EAAE0B,aAAAA,CAAAA,EACrCxG,KAAKyG,OAAOH,CAAAA,GAEZtG,KAAK0G,KAAAA,CAER,OAAQ1H,EAAAA,CAMP,MAHAqH,EAAAA,GAEArG,KAAK0G,KAAAA,EACC1H,CACP,CAEGqH,GACFrG,KAAK2G,KAAYL,CAAAA,CAEpB,CAuBS,WAAWM,EAAAA,CAA4C,CAIjE,KAAYN,EAAAA,CACVtG,KAAKgE,MAAeH,QAASiB,GAAMA,EAAE+B,cAAAA,CAAAA,EAChC7G,KAAKoD,aACRpD,KAAKoD,WAAAA,GACLpD,KAAK8G,aAAaR,CAAAA,GAEpBtG,KAAK+G,QAAQT,CAAAA,CAiBd,CAEO,MAAAI,CACN1G,KAAK2D,KAAsB,IAAIhC,IAC/B3B,KAAKmD,gBAAAA,EACN,CAkBD,IAAA,gBAAI6D,CACF,OAAOhH,KAAKiH,kBAAAA,CACb,CAyBS,mBAAAA,CACR,OAAOjH,KAAKuD,IACb,CAUS,aAAaqD,EAAAA,CACrB,MAAA,EACD,CAWS,OAAOA,EAAAA,CAIf5G,KAAK+F,OAA2B/F,KAAK+F,KAAuBlC,QAAS7B,GACnEhC,KAAKkH,KAAsBlF,EAAGhC,KAAKgC,CAAAA,CAAAA,CAAAA,EAErChC,KAAK0G,KAAAA,CACN,CAYS,QAAQE,EAAAA,CAAsC,CAkB9C,aAAaA,EAAAA,CAAsC,CAAA,EAhgCtD/G,EAAauC,cAA6B,CAAA,EA6S1CvC,EAAA8E,kBAAoC,CAACwC,KAAM,MAAA,EAwtBnDtH,EACC1B,EAA0B,mBAAA,CAAA,EACxB,IAAIwD,IACP9B,EACC1B,EAA0B,WAAA,CAAA,EACxB,IAAIwD,IAGR1D,KAAkB,CAAC4B,gBAAAA,CAAAA,CAAAA,GAuClBjC,EAAOwJ,0BAA4B,CAAA,GAAIjH,KAAK,OAAA,ECxnD7C,IAAMkH,GAASC,WAmOTC,EAAgBF,GAA6BE,aAU7CC,GAASD,EACXA,EAAaE,aAAa,WAAY,CACpCC,WAAaC,GAAMA,CAAAA,CAAAA,EAAAA,OA8EnBC,GAAuB,QAMvBC,EAAS,OAAOC,KAAKC,OAAAA,EAASC,QAAQ,CAAA,EAAGC,MAAM,CAAA,CAAA,IAG/CC,GAAc,IAAML,EAIpBM,GAAa,IAAID,EAAAA,IAEjBE,EAOAC,SAGAC,EAAe,IAAMF,EAAEG,cAAc,EAAA,EAIrCC,EAAeC,GACnBA,IAAU,MAAyB,OAATA,GAAS,UAA4B,OAATA,GAAS,WAC3DC,GAAUC,MAAMD,QAChBE,GAAcH,GAClBC,GAAQD,CAAAA,GAEqC,OAArCA,IAAgBI,OAAOC,QAAAA,GAAc,WAEzCC,GAAa;OAkBbC,EAAe,sDAKfC,GAAkB,OAIlBC,GAAmB,KAwBnBC,EAAkBC,OACtB,KAAKL,EAAAA,qBAAgCA,EAAAA,KAAeA,EAAAA;0BACpD,GAAA,EAOIM,GAA0B,KAC1BC,GAA0B,KAO1BC,GAAiB,qCAsGjBC,GACmBC,GACvB,CAACC,KAAkCC,KAwB1B,CAELC,WAAgBH,EAChBC,QAAAA,EACAC,OAAAA,CAAAA,GAiBOE,EAAOL,GAlJA,CAAA,EA2KPM,GAAMN,GA1KA,CAAA,EAgLNO,EAAWlB,OAAOmB,IAAI,cAAA,EAqBtBC,EAAUpB,OAAOmB,IAAI,aAAA,EAS5BE,GAAgB,IAAIC,QAqCpBC,EAAShC,EAAEiC,iBACfjC,EACA,GAAA,EAqBF,SAASkC,GACPC,EACAC,EAAAA,CAOA,GAAA,CAAK7B,MAAMD,QAAQ6B,CAAAA,GAAAA,CAASA,EAAIE,eAAe,KAAA,EAiB7C,MAAUC,MAhBI,gCAAA,EAkBhB,OAAOlD,KAAP,OACIA,GAAOE,WAAW8C,CAAAA,EACjBA,CACP,CAcA,IAAMG,GAAkB,CACtBjB,EACAD,IAAAA,CAQA,IAAMmB,EAAIlB,EAAQmB,OAAS,EAIrBC,EAA2B,CAAA,EAM7BC,EALAlB,EAAOJ,IAtUM,EAsUgB,QAAU,GASvCuB,EAAQhC,EAEZ,QAASiC,EAAI,EAAGA,EAAIL,EAAGK,IAAK,CAC1B,IAAMtD,EAAI+B,EAAQuB,CAAAA,EAOdC,EAEAC,EAHAC,EAAAA,GAEAC,EAAY,EAKhB,KAAOA,EAAY1D,EAAEkD,SAEnBG,EAAMK,UAAYA,EAClBF,EAAQH,EAAMM,KAAK3D,CAAAA,EACfwD,IAAU,OAGdE,EAAYL,EAAMK,UACdL,IAAUhC,EACRmC,EA7ZU,CAAA,IA6Ze,MAC3BH,EAAQ/B,GACCkC,EA/ZG,CAAA,IA8ZJlC,OAGR+B,EAAQ9B,GACCiC,EAjaF,CAAA,IAgaCjC,QAEJK,GAAegC,KAAKJ,EAlajB,CAAA,CAAA,IAqaLJ,EAAsB3B,OAAO,KAAK+B,EAra7B,CAAA,EAqagD,GAAA,GAEvDH,EAAQ7B,GACCgC,EAvaM,CAAA,IAsaPhC,SAQR6B,EAAQ7B,GAED6B,IAAU7B,EACfgC,EA/YS,CAAA,IA+Ye,KAG1BH,EAAQD,GAAmB/B,EAG3BoC,EAAAA,IACSD,EArZI,CAAA,IAoZO,OAGpBC,EAAAA,IAEAA,EAAmBJ,EAAMK,UAAYF,EAxZrB,CAAA,EAwZ8CN,OAC9DK,EAAWC,EA1ZE,CAAA,EA2ZbH,EACEG,EA1ZO,CAAA,IAyZTH,OAEM7B,EACAgC,EA5ZG,CAAA,IA4ZmB,IACpB7B,GACAD,IAGV2B,IAAU1B,IACV0B,IAAU3B,GAEV2B,EAAQ7B,EACC6B,IAAU/B,IAAmB+B,IAAU9B,GAChD8B,EAAQhC,GAIRgC,EAAQ7B,EACR4B,EAAAA,QA8BJ,IAAMS,EACJR,IAAU7B,GAAeO,EAAQuB,EAAI,CAAA,EAAGQ,WAAW,IAAA,EAAQ,IAAM,GACnE5B,GACEmB,IAAUhC,EACNrB,EAAIQ,GACJiD,GAAoB,GACjBN,EAAUY,KAAKR,CAAAA,EAChBvD,EAAEM,MAAM,EAAGmD,CAAAA,EACTxD,GACAD,EAAEM,MAAMmD,CAAAA,EACVvD,EACA2D,GACA7D,EAAIE,GAAUuD,IAAVvD,GAAoCoD,EAAIO,EACrD,CAMD,MAAO,CAAClB,GAAwBZ,EAH9BG,GAAQH,EAAQkB,CAAAA,GAAM,QAAUnB,IA3cjB,EA2cuC,SAAW,GAAA,EAGbqB,CAAAA,CAAU,EAK5Da,EAAN,MAAMA,CAAAA,CAMJ,YAAAC,CAEElC,QAACA,EAASE,WAAgBH,CAAAA,EAC1BoC,EAAAA,CAEA,IAAIC,EAPNC,KAAKC,MAAwB,CAAA,EAQ3B,IAAIC,EAAY,EACZC,EAAgB,EACdC,EAAYzC,EAAQmB,OAAS,EAC7BmB,EAAQD,KAAKC,MAAAA,CAGZnC,EAAMiB,CAAAA,EAAaH,GAAgBjB,EAASD,CAAAA,EAKnD,GAJAsC,KAAKK,GAAKT,EAASU,cAAcxC,EAAMgC,CAAAA,EACvCzB,EAAOkC,YAAcP,KAAKK,GAAGG,QAGzB9C,IA1eW,EA0eU,CACvB,IAAM+C,EAAaT,KAAKK,GAAGG,QAAQE,WACnCD,EAAWE,YAAAA,GAAeF,EAAWG,UAAAA,CACtC,CAGD,MAAQb,EAAO1B,EAAOwC,SAAAA,KAAgB,MAAQZ,EAAMnB,OAASsB,GAAW,CACtE,GAAIL,EAAKe,WAAa,EAAG,CAuBvB,GAAKf,EAAiBgB,cAAAA,EACpB,QAAWC,KAASjB,EAAiBkB,kBAAAA,EACnC,GAAID,EAAKE,SAASrF,EAAAA,EAAuB,CACvC,IAAMsF,EAAWpC,EAAUoB,GAAAA,EAErBiB,EADSrB,EAAiBsB,aAAaL,CAAAA,EACvBM,MAAMxF,CAAAA,EACtByF,EAAI,eAAehC,KAAK4B,CAAAA,EAC9BlB,EAAMN,KAAK,CACTjC,KA1gBO,EA2gBP8D,MAAOtB,EACPc,KAAMO,EAAE,CAAA,EACR5D,QAASyD,EACTK,KACEF,EAAE,CAAA,IAAO,IACLG,GACAH,EAAE,CAAA,IAAO,IACPI,GACAJ,EAAE,CAAA,IAAO,IACPK,GACAC,CAAAA,CAAAA,EAEX9B,EAAiB+B,gBAAgBd,CAAAA,CACnC,MAAUA,EAAKtB,WAAW5D,CAAAA,IACzBmE,EAAMN,KAAK,CACTjC,KArhBK,EAshBL8D,MAAOtB,CAAAA,CAAAA,EAERH,EAAiB+B,gBAAgBd,CAAAA,GAMxC,GAAIxD,GAAegC,KAAMO,EAAiBgC,OAAAA,EAAU,CAIlD,IAAMpE,EAAWoC,EAAiBiC,YAAaV,MAAMxF,CAAAA,EAC/CwD,EAAY3B,EAAQmB,OAAS,EACnC,GAAIQ,EAAY,EAAG,CAChBS,EAAiBiC,YAAcxG,EAC3BA,EAAayG,YACd,GAMJ,QAAS/C,EAAI,EAAGA,EAAII,EAAWJ,IAC5Ba,EAAiBmC,OAAOvE,EAAQuB,CAAAA,EAAI3C,EAAAA,CAAAA,EAErC8B,EAAOwC,SAAAA,EACPZ,EAAMN,KAAK,CAACjC,KArjBP,EAqjByB8D,MAAAA,EAAStB,CAAAA,CAAAA,EAKxCH,EAAiBmC,OAAOvE,EAAQ2B,CAAAA,EAAY/C,EAAAA,CAAAA,CAC9C,CACF,CACF,SAAUwD,EAAKe,WAAa,EAE3B,GADcf,EAAiBoC,OAClBhG,GACX8D,EAAMN,KAAK,CAACjC,KAhkBH,EAgkBqB8D,MAAOtB,CAAAA,CAAAA,MAChC,CACL,IAAIhB,EAAAA,GACJ,MAAQA,EAAKa,EAAiBoC,KAAKC,QAAQtG,EAAQoD,EAAI,CAAA,KAAvD,IAGEe,EAAMN,KAAK,CAACjC,KAjkBH,EAikBuB8D,MAAOtB,CAAAA,CAAAA,EAEvChB,GAAKpD,EAAOgD,OAAS,CAExB,CAEHoB,GACD,CAkCF,CAID,OAAA,cAAqBpC,EAAmBuE,EAAAA,CACtC,IAAMhC,EAAKhE,EAAEiE,cAAc,UAAA,EAE3B,OADAD,EAAGiC,UAAYxE,EACRuC,CACR,CAAA,EAgBH,SAASkC,EACPC,EACA9F,EACA+F,EAA0BD,EAC1BE,EAAAA,CAIA,GAAIhG,IAAUsB,EACZ,OAAOtB,EAET,IAAIiG,EACFD,IADEC,OAEGF,EAAyBG,OAAeF,CAAAA,EACxCD,EAA+CI,KAChDC,EAA2BrG,EAAYC,CAAAA,EAAAA,OAGxCA,EAA2C,gBAyBhD,OAxBIiG,GAAkB9C,cAAgBiD,IAEpCH,GAAuD,OAAA,EAAI,EACvDG,IADuD,OAEzDH,EAAAA,QAEAA,EAAmB,IAAIG,EAAyBN,CAAAA,EAChDG,EAAiBI,KAAaP,EAAMC,EAAQC,CAAAA,GAE1CA,IAF0CA,QAG1CD,EAAyBG,OAAiB,CAAA,GAAIF,CAAAA,EAC9CC,EAEDF,EAAiCI,KAAcF,GAGhDA,IAHgDA,SAIlDjG,EAAQ6F,EACNC,EACAG,EAAiBK,KAAUR,EAAO9F,EAA0BkB,MAAAA,EAC5D+E,EACAD,CAAAA,GAGGhG,CACT,CAOA,IAAMuG,GAAN,KAAMA,CASJ,YAAYC,EAAoBT,EAAAA,CAPhCzC,KAAOmD,KAA4B,CAAA,EAKnCnD,KAAwBoD,KAAAA,OAGtBpD,KAAKqD,KAAaH,EAClBlD,KAAKsD,KAAWb,CACjB,CAGD,IAAA,YAAIc,CACF,OAAOvD,KAAKsD,KAASC,UACtB,CAGD,IAAA,MAAIC,CACF,OAAOxD,KAAKsD,KAASE,IACtB,CAID,EAAO1D,EAAAA,CACL,GAAA,CACEO,GAAAA,CAAIG,QAACA,CAAAA,EACLP,MAAOA,CAAAA,EACLD,KAAKqD,KACHI,GAAY3D,GAAS4D,eAAiBrH,GAAGsH,WAAWnD,EAAAA,EAAS,EACnEnC,EAAOkC,YAAckD,EAErB,IAAI1D,EAAO1B,EAAOwC,SAAAA,EACdX,EAAY,EACZ0D,EAAY,EACZC,EAAe5D,EAAM,CAAA,EAEzB,KAAO4D,IAAP,QAAmC,CACjC,GAAI3D,IAAc2D,EAAarC,MAAO,CACpC,IAAIgB,EACAqB,EAAanG,OApuBN,EAquBT8E,EAAO,IAAIsB,EACT/D,EACAA,EAAKgE,YACL/D,KACAF,CAAAA,EAEO+D,EAAanG,OA5uBT,EA6uBb8E,EAAO,IAAIqB,EAAapC,KACtB1B,EACA8D,EAAa7C,KACb6C,EAAalG,QACbqC,KACAF,CAAAA,EAEO+D,EAAanG,OA/uBX,IAgvBX8E,EAAO,IAAIwB,GAAYjE,EAAqBC,KAAMF,CAAAA,GAEpDE,KAAKmD,KAAQxD,KAAK6C,CAAAA,EAClBqB,EAAe5D,EAAAA,EAAQ2D,CAAAA,CACxB,CACG1D,IAAc2D,GAAcrC,QAC9BzB,EAAO1B,EAAOwC,SAAAA,EACdX,IAEH,CAKD,OADA7B,EAAOkC,YAAclE,EACdoH,CACR,CAED,EAAQ7F,EAAAA,CACN,IAAIsB,EAAI,EACR,QAAWsD,KAAQxC,KAAKmD,KAClBX,IADkBW,SAWfX,EAAuB7E,UAV1B6E,QAWCA,EAAuByB,KAAWrG,EAAQ4E,EAAuBtD,CAAAA,EAIlEA,GAAMsD,EAAuB7E,QAASmB,OAAS,GAE/C0D,EAAKyB,KAAWrG,EAAOsB,CAAAA,CAAAA,GAG3BA,GAEH,CAAA,EA8CG4E,EAAN,MAAMA,CAAAA,CAwBJ,IAAA,MAAIN,CAIF,OAAOxD,KAAKsD,MAAUE,MAAiBxD,KAAKkE,IAC7C,CAeD,YACEC,EACAC,EACA3B,EACA3C,EAAAA,CA/COE,KAAItC,KA70BI,EA+0BjBsC,KAAgBqE,KAAYnG,EA+B5B8B,KAAwBoD,KAAAA,OAgBtBpD,KAAKsE,KAAcH,EACnBnE,KAAKuE,KAAYH,EACjBpE,KAAKsD,KAAWb,EAChBzC,KAAKF,QAAUA,EAIfE,KAAKkE,KAAgBpE,GAAS0E,aAAAA,EAK/B,CAoBD,IAAA,YAAIjB,CACF,IAAIA,EAAwBvD,KAAKsE,KAAaf,WACxCd,EAASzC,KAAKsD,KAUpB,OAREb,IAQF,QAPEc,GAAYzC,WAAa,KAKzByC,EAAcd,EAAwCc,YAEjDA,CACR,CAMD,IAAA,WAAIY,CACF,OAAOnE,KAAKsE,IACb,CAMD,IAAA,SAAIF,CACF,OAAOpE,KAAKuE,IACb,CAED,KAAW7H,EAAgB+H,EAAmCzE,KAAAA,CAM5DtD,EAAQ6F,EAAiBvC,KAAMtD,EAAO+H,CAAAA,EAClChI,EAAYC,CAAAA,EAIVA,IAAUwB,GAAWxB,GAAS,MAAQA,IAAU,IAC9CsD,KAAKqE,OAAqBnG,GAS5B8B,KAAK0E,KAAAA,EAEP1E,KAAKqE,KAAmBnG,GACfxB,IAAUsD,KAAKqE,MAAoB3H,IAAUsB,GACtDgC,KAAK2E,EAAYjI,CAAAA,EAGTA,EAAqC,aAH5BA,OAInBsD,KAAK4E,EAAsBlI,CAAAA,EACjBA,EAAeoE,WADEpE,OAiB3BsD,KAAK6E,EAAYnI,CAAAA,EACRG,GAAWH,CAAAA,EACpBsD,KAAK8E,EAAgBpI,CAAAA,EAGrBsD,KAAK2E,EAAYjI,CAAAA,CAEpB,CAEO,EAAwBqD,EAAAA,CAC9B,OAAiBC,KAAKsE,KAAaf,WAAawB,aAC9ChF,EACAC,KAAKuE,IAAAA,CAER,CAEO,EAAY7H,EAAAA,CACdsD,KAAKqE,OAAqB3H,IAC5BsD,KAAK0E,KAAAA,EAoCL1E,KAAKqE,KAAmBrE,KAAKgF,EAAQtI,CAAAA,EAExC,CAEO,EAAYA,EAAAA,CAKhBsD,KAAKqE,OAAqBnG,GAC1BzB,EAAYuD,KAAKqE,IAAAA,EAECrE,KAAKsE,KAAaP,YAcrB5B,KAAOzF,EAsBpBsD,KAAK6E,EAAYxI,EAAE4I,eAAevI,CAAAA,CAAAA,EAUtCsD,KAAKqE,KAAmB3H,CACzB,CAEO,EACNwI,EAAAA,CAGA,GAAA,CAAMtH,OAACA,EAAQC,WAAgBH,CAAAA,EAAQwH,EAKjChC,EACY,OAATxF,GAAS,SACZsC,KAAKmF,KAAcD,CAAAA,GAClBxH,EAAK2C,KADa6E,SAEhBxH,EAAK2C,GAAKT,EAASU,cAClB/B,GAAwBb,EAAK0H,EAAG1H,EAAK0H,EAAE,CAAA,CAAA,EACvCpF,KAAKF,OAAAA,GAETpC,GAEN,GAAKsC,KAAKqE,MAAuChB,OAAeH,EAU7DlD,KAAKqE,KAAsCgB,EAAQzH,CAAAA,MAC/C,CACL,IAAM0H,EAAW,IAAIrC,GAAiBC,EAAsBlD,IAAAA,EACtDyD,EAAW6B,EAASC,EAAOvF,KAAKF,OAAAA,EAWtCwF,EAASD,EAAQzH,CAAAA,EAWjBoC,KAAK6E,EAAYpB,CAAAA,EACjBzD,KAAKqE,KAAmBiB,CACzB,CACF,CAID,KAAcJ,EAAAA,CACZ,IAAIhC,EAAW/E,GAAcqH,IAAIN,EAAOvH,OAAAA,EAIxC,OAHIuF,IAGJ,QAFE/E,GAAcsH,IAAIP,EAAOvH,QAAUuF,EAAW,IAAItD,EAASsF,CAAAA,CAAAA,EAEtDhC,CACR,CAEO,EAAgBxG,EAAAA,CAWjBC,GAAQqD,KAAKqE,IAAAA,IAChBrE,KAAKqE,KAAmB,CAAA,EACxBrE,KAAK0E,KAAAA,GAKP,IAAMgB,EAAY1F,KAAKqE,KAEnBsB,EADA/B,EAAY,EAGhB,QAAWgC,KAAQlJ,EACbkH,IAAc8B,EAAU5G,OAK1B4G,EAAU/F,KACPgG,EAAW,IAAI7B,EACd9D,KAAKgF,EAAQzI,EAAAA,CAAAA,EACbyD,KAAKgF,EAAQzI,EAAAA,CAAAA,EACbyD,KACAA,KAAKF,OAAAA,CAAAA,EAKT6F,EAAWD,EAAU9B,CAAAA,EAEvB+B,EAAS1B,KAAW2B,CAAAA,EACpBhC,IAGEA,EAAY8B,EAAU5G,SAExBkB,KAAK0E,KACHiB,GAAiBA,EAASpB,KAAYR,YACtCH,CAAAA,EAGF8B,EAAU5G,OAAS8E,EAEtB,CAaD,KACEiC,EAA+B7F,KAAKsE,KAAaP,YACjD+B,EAAAA,CAGA,IADA9F,KAAK+F,OAAAA,GAA4B,GAAaD,CAAAA,EACvCD,GAASA,IAAU7F,KAAKuE,MAAW,CACxC,IAAMyB,EAASH,EAAQ9B,YACjB8B,EAAoBI,OAAAA,EAC1BJ,EAAQG,CACT,CACF,CAQD,aAAaxB,EAAAA,CACPxE,KAAKsD,OADEkB,SAETxE,KAAKkE,KAAgBM,EACrBxE,KAAK+F,OAA4BvB,CAAAA,EAOpC,CAAA,EA2BG3C,EAAN,KAAMA,CA2BJ,IAAA,SAAIE,CACF,OAAO/B,KAAKkG,QAAQnE,OACrB,CAGD,IAAA,MAAIyB,CACF,OAAOxD,KAAKsD,KAASE,IACtB,CAED,YACE0C,EACAlF,EACArD,EACA8E,EACA3C,EAAAA,CAxCOE,KAAItC,KA9xCQ,EA8yCrBsC,KAAgBqE,KAA6BnG,EAM7C8B,KAAwBoD,KAAAA,OAoBtBpD,KAAKkG,QAAUA,EACflG,KAAKgB,KAAOA,EACZhB,KAAKsD,KAAWb,EAChBzC,KAAKF,QAAUA,EACXnC,EAAQmB,OAAS,GAAKnB,EAAQ,CAAA,IAAO,IAAMA,EAAQ,CAAA,IAAO,IAC5DqC,KAAKqE,KAAuBzH,MAAMe,EAAQmB,OAAS,CAAA,EAAGqH,KAAK,IAAIC,MAAAA,EAC/DpG,KAAKrC,QAAUA,GAEfqC,KAAKqE,KAAmBnG,CAK3B,CAwBD,KACExB,EACA+H,EAAmCzE,KACnCqG,EACAC,EAAAA,CAEA,IAAM3I,EAAUqC,KAAKrC,QAGjB4I,EAAAA,GAEJ,GAAI5I,IAAJ,OAEEjB,EAAQ6F,EAAiBvC,KAAMtD,EAAO+H,EAAiB,CAAA,EACvD8B,EAAAA,CACG9J,EAAYC,CAAAA,GACZA,IAAUsD,KAAKqE,MAAoB3H,IAAUsB,EAC5CuI,IACFvG,KAAKqE,KAAmB3H,OAErB,CAEL,IAAMkB,EAASlB,EAGXwC,EAAGsH,EACP,IAHA9J,EAAQiB,EAAQ,CAAA,EAGXuB,EAAI,EAAGA,EAAIvB,EAAQmB,OAAS,EAAGI,IAClCsH,EAAIjE,EAAiBvC,KAAMpC,EAAOyI,EAAcnH,CAAAA,EAAIuF,EAAiBvF,CAAAA,EAEjEsH,IAAMxI,IAERwI,EAAKxG,KAAKqE,KAAoCnF,CAAAA,GAEhDqH,IAAAA,CACG9J,EAAY+J,CAAAA,GAAMA,IAAOxG,KAAKqE,KAAoCnF,CAAAA,EACjEsH,IAAMtI,EACRxB,EAAQwB,EACCxB,IAAUwB,IACnBxB,IAAU8J,GAAK,IAAM7I,EAAQuB,EAAI,CAAA,GAIlCc,KAAKqE,KAAoCnF,CAAAA,EAAKsH,CAElD,CACGD,GAAAA,CAAWD,GACbtG,KAAKyG,EAAa/J,CAAAA,CAErB,CAGD,EAAaA,EAAAA,CACPA,IAAUwB,EACN8B,KAAKkG,QAAqBpE,gBAAgB9B,KAAKgB,IAAAA,EAoB/ChB,KAAKkG,QAAqBQ,aAC9B1G,KAAKgB,KACJtE,GAAS,EAAA,CAGf,CAAA,EAIGgF,GAAN,cAA2BG,CAAAA,CAA3B,aAAAhC,CAAAA,MAAAA,GAAAA,SAAAA,EACoBG,KAAItC,KA97CF,CAu9CrB,CAtBU,EAAahB,EAAAA,CAoBnBsD,KAAKkG,QAAgBlG,KAAKgB,IAAAA,EAAQtE,IAAUwB,EAAAA,OAAsBxB,CACpE,CAAA,EAIGiF,GAAN,cAAmCE,CAAAA,CAAnC,aAAAhC,CAAAA,MAAAA,GAAAA,SAAAA,EACoBG,KAAItC,KA19CO,CA2+C9B,CAdU,EAAahB,EAAAA,CASdsD,KAAKkG,QAAqBS,gBAC9B3G,KAAKgB,KAAAA,CAAAA,CACHtE,GAASA,IAAUwB,CAAAA,CAExB,CAAA,EAkBG0D,GAAN,cAAwBC,CAAAA,CAGtB,YACEqE,EACAlF,EACArD,EACA8E,EACA3C,EAAAA,CAEA8G,MAAMV,EAASlF,EAAMrD,EAAS8E,EAAQ3C,CAAAA,EATtBE,KAAItC,KA5/CL,CA8gDhB,CAKQ,KACPmJ,EACApC,EAAmCzE,KAAAA,CAInC,IAFA6G,EACEtE,EAAiBvC,KAAM6G,EAAapC,EAAiB,CAAA,GAAMvG,KACzCF,EAClB,OAEF,IAAM8I,EAAc9G,KAAKqE,KAInB0C,EACHF,IAAgB3I,GAAW4I,IAAgB5I,GAC3C2I,EAAyCG,UACvCF,EAAyCE,SAC3CH,EAAyCI,OACvCH,EAAyCG,MAC3CJ,EAAyCK,UACvCJ,EAAyCI,QAIxCC,EACJN,IAAgB3I,IACf4I,IAAgB5I,GAAW6I,GAa1BA,GACF/G,KAAKkG,QAAQkB,oBACXpH,KAAKgB,KACLhB,KACA8G,CAAAA,EAGAK,GAIFnH,KAAKkG,QAAQmB,iBACXrH,KAAKgB,KACLhB,KACA6G,CAAAA,EAGJ7G,KAAKqE,KAAmBwC,CACzB,CAED,YAAYS,EAAAA,CAC2B,OAA1BtH,KAAKqE,MAAqB,WACnCrE,KAAKqE,KAAiBkD,KAAKvH,KAAKF,SAAS0H,MAAQxH,KAAKkG,QAASoB,CAAAA,EAE9DtH,KAAKqE,KAAyCoD,YAAYH,CAAAA,CAE9D,CAAA,EAIGtD,GAAN,KAAMA,CAiBJ,YACSkC,EACPzD,EACA3C,EAAAA,CAFOE,KAAOkG,QAAPA,EAjBAlG,KAAItC,KAxlDM,EAomDnBsC,KAAwBoD,KAAAA,OAStBpD,KAAKsD,KAAWb,EAChBzC,KAAKF,QAAUA,CAChB,CAGD,IAAA,MAAI0D,CACF,OAAOxD,KAAKsD,KAASE,IACtB,CAED,KAAW9G,EAAAA,CAQT6F,EAAiBvC,KAAMtD,CAAAA,CACxB,CAAA,EAqBU,IAoBPgL,GAEFC,GAAOC,uBACXF,KAAkBG,EAAUC,CAAAA,GAI3BH,GAAOI,kBAAoB,CAAA,GAAIC,KAAK,OAAA,EAkCxB,IAAAC,GAAS,CACpBC,EACAC,EACAC,IAAAA,CAUA,IAAMC,EAAgBD,GAASE,cAAgBH,EAG3CI,EAAmBF,EAAkC,WAUzD,GAAIE,IAAJ,OAAwB,CACtB,IAAMC,EAAUJ,GAASE,cAAgB,KAGxCD,EAAkC,WAAIE,EAAO,IAAIT,EAChDK,EAAUM,aAAaC,EAAAA,EAAgBF,CAAAA,EACvCA,EAAAA,OAEAJ,GAAW,CAAE,CAAA,CAEhB,CAWD,OAVAG,EAAKI,KAAWT,CAAAA,EAUTK,CAAgB,EC3kEnB,IAAOK,EAAP,cAA0BC,CAAAA,CAAhC,aAAAC,CAAAA,MAAAA,GAAAA,SAAAA,EAOWC,KAAAC,cAA+B,CAACC,KAAMF,IAAAA,EAEvCA,KAAWG,KAAAA,MA8FpB,CAzFoB,kBAAAC,CACjB,IAAMC,EAAaC,MAAMF,iBAAAA,EAOzB,OADAJ,KAAKC,cAAcM,eAAiBF,EAAYG,WACzCH,CACR,CASkB,OAAOI,EAAAA,CAIxB,IAAMC,EAAQV,KAAKW,OAAAA,EACdX,KAAKY,aACRZ,KAAKC,cAAcY,YAAcb,KAAKa,aAExCP,MAAMQ,OAAOL,CAAAA,EACbT,KAAKG,KAAcQ,GAAOD,EAAOV,KAAKK,WAAYL,KAAKC,aAAAA,CACxD,CAsBQ,mBAAAc,CACPT,MAAMS,kBAAAA,EACNf,KAAKG,MAAaa,aAAAA,EAAa,CAChC,CAqBQ,sBAAAC,CACPX,MAAMW,qBAAAA,EACNjB,KAAKG,MAAaa,aAAAA,EAAa,CAChC,CASS,QAAAL,CACR,OAAOO,CACR,CAAA,EApGMrB,EAAgB,cAAA,GA8GxBA,EAC2B,WAAA,EAAA,GAI5BsB,WAAWC,2BAA2B,CAACvB,WAAAA,CAAAA,CAAAA,EAGvC,IAAMwB,GAEFF,WAAWG,0BACfD,KAAkB,CAACxB,WAAAA,CAAAA,CAAAA,GAmClB0B,WAAWC,qBAAuB,CAAA,GAAIC,KAAK,OAAA,EC9O/B,IAAAC,GAAW,CACtBC,UAAW,EACXC,MAAO,EACPC,SAAU,EACVC,kBAAmB,EACnBC,MAAO,EACPC,QAAS,CAAA,EAoCEC,GACgBC,GAC3B,IAAIC,KAAsE,CAExEC,gBAAqBF,EACrBC,OAAAA,CAAAA,GAQkBE,EARlBF,KAQkBE,CAkBpB,YAAYC,EAAAA,CAAuB,CAGnC,IAAA,MAAIC,CACF,OAAOC,KAAKC,KAASF,IACtB,CAGD,KACEG,EACAC,EACAC,EAAAA,CAEAJ,KAAKK,KAASH,EACdF,KAAKC,KAAWE,EAChBH,KAAKM,KAAmBF,CACzB,CAED,KAAUF,EAAYK,EAAAA,CACpB,OAAOP,KAAKQ,OAAON,EAAMK,CAAAA,CAC1B,CAID,OAAOE,EAAaF,EAAAA,CAClB,OAAOP,KAAKU,OAAAA,GAAUH,CAAAA,CACvB,CAAA,ECjIG,IAAOI,EAAP,cAAmCC,CAAAA,CAOvC,YAAYC,EAAAA,CAEV,GADAC,MAAMD,CAAAA,EAJAE,KAAMC,GAAYC,EAKpBJ,EAASK,OAASC,GAASC,MAC7B,MAAUC,MAELN,KAAKO,YAA2CC,cADnD,uCAAA,CAKL,CAED,OAAOC,EAAAA,CACL,GAAIA,IAAUP,GAAWO,GAAS,KAEhC,OADAT,KAAKU,GAAAA,OACGV,KAAKC,GAASQ,EAExB,GAAIA,IAAUE,EACZ,OAAOF,EAET,GAAoB,OAATA,GAAS,SAClB,MAAUH,MAELN,KAAKO,YAA2CC,cADnD,mCAAA,EAKJ,GAAIC,IAAUT,KAAKC,GACjB,OAAOD,KAAKU,GAEdV,KAAKC,GAASQ,EACd,IAAMG,EAAU,CAACH,CAAAA,EAKjB,OAHCG,EAAgBC,IAAMD,EAGfZ,KAAKU,GAAkB,CAI7BI,WAAiBd,KAAKO,YACnBQ,WACHH,QAAAA,EACAI,OAAQ,CAAA,CAAA,CAEX,CAAA,EAlDMpB,EAAaY,cAAG,aAChBZ,EAAUmB,WAJC,EAAA,IAkEPE,EAAaC,GAAUtB,CAAAA,ECTpC,IAuBMuB,GAAkD,CACtDC,UAAAA,GACAC,KAAMC,OACNC,UAAWC,EACXC,QAAAA,GACAC,WAAYC,CAAAA,EAaDC,GAAmB,CAC9BC,EAA+BV,GAC/BW,EACAC,IAAAA,CAEA,GAAA,CAAMC,KAACA,EAAIC,SAAEA,CAAAA,EAAYF,EAarBG,EAAaC,WAAWC,oBAAoBC,IAAIJ,CAAAA,EAMpD,GALIC,IAKJ,QAJEC,WAAWC,oBAAoBE,IAAIL,EAAWC,EAAa,IAAIK,GAAAA,EAEjEL,EAAWI,IAAIP,EAAQS,KAAMX,CAAAA,EAEzBG,IAAS,WAAY,CAIvB,GAAA,CAAMQ,KAACA,CAAAA,EAAQT,EACf,MAAO,CACL,IAA2BU,EAAAA,CACzB,IAAMC,EACJZ,EACAO,IAAIM,KAAKC,IAAAA,EACVd,EAA8CQ,IAAIK,KACjDC,KACAH,CAAAA,EAEFG,KAAKC,cAAcL,EAAME,EAAUb,CAAAA,CACpC,EACD,KAA4BY,EAAAA,CAI1B,OAHIA,IAGJ,QAFEG,KAAKE,EAAiBN,EAAAA,OAAiBX,CAAAA,EAElCY,CACR,CAAA,CAEJ,CAAM,GAAIT,IAAS,SAAU,CAC5B,GAAA,CAAMQ,KAACA,CAAAA,EAAQT,EACf,OAAO,SAAiCgB,EAAAA,CACtC,IAAML,EAAWE,KAAKJ,CAAAA,EACrBV,EAA8Ba,KAAKC,KAAMG,CAAAA,EAC1CH,KAAKC,cAAcL,EAAME,EAAUb,CAAAA,CACrC,CACD,CACD,MAAUmB,MAAM,mCAAmChB,CAAAA,CAAO,EAmCtD,SAAUiB,EAASpB,EAAAA,CACvB,MAAO,CACLqB,EAIAC,IAO2B,OAAlBA,GAAkB,SACrBvB,GACEC,EACAqB,EAGAC,CAAAA,GAtJW,CACrBtB,EACAuB,EACAZ,IAAAA,CAEA,IAAMa,EAAiBD,EAAMC,eAAeb,CAAAA,EAU5C,OATCY,EAAME,YAAuCC,eAC5Cf,EACAa,EAAiB,CAAA,GAAIxB,EAAS2B,QAAAA,EAAS,EAAQ3B,CAAAA,EAO1CwB,EACHI,OAAOC,yBAAyBN,EAAOZ,CAAAA,EAAAA,MAC9B,GAwIHX,EACAqB,EACAC,CAAAA,CAIZ,CC3NA,SAASQ,EACPC,EACAC,EACa,CACb,IAAMC,EAAK,SAAS,cAAcF,CAAQ,EAC1C,OAAW,CAACG,EAAKC,CAAK,IAAK,OAAO,QAAQH,CAAK,EACzCG,IAAU,MAAMF,EAAG,aAAaC,EAAKC,CAAK,EAEhD,OAAOF,CACT,CASA,IAAMG,EAAN,cAA2BC,CAAW,CACpC,kBAAmB,CACjB,OAAO,IACT,CACF,EAWA,SAASC,GAAuB,CAC9B,SAAAC,EAAW,GACX,QAAAC,EACA,OAAAC,EAAS,SACX,EAA6B,CAC3B,SAAS,cACP,IAAI,YAAY,uBAAwB,CACtC,OAAQ,CAAE,SAAUF,EAAU,QAASC,EAAS,OAAQC,CAAO,CACjE,CAAC,CACH,CACF,CCIA,IAAMC,GAAmB,qBACnBC,GAAwB,qBACxBC,GAA0B,uBAC1BC,GAAoB,sBACpBC,GAAiB,mBACjBC,GAAqB,uBAErBC,GAAQ,CACZ,MACE,y8BAEF,UACE,wfACJ,EAEMC,EAAN,cAA0BC,CAAa,CAAvC,kCACc,aAAU,MACV,kBAA4B,WACI,eAAY,GAC5C,UAAO,GAEnB,QAAS,CAGP,IAAMC,EADU,KAAK,QAAQ,KAAK,EAAE,SAAW,EACxBH,GAAM,UAAY,KAAK,MAAQA,GAAM,MAE5D,OAAO;AAAA,kCACuBI,EAAWD,CAAI,CAAC;AAAA;AAAA,kBAEhC,KAAK,OAAO;AAAA,uBACP,KAAK,YAAY;AAAA,qBACnB,KAAK,SAAS;AAAA;AAAA,2BAER,KAAKE,GAAiB,KAAK,IAAI,CAAC;AAAA,uBACpC,KAAKC,GAA2B,KAAK,IAAI,CAAC;AAAA;AAAA,KAG/D,CAEAD,IAAyB,CAClB,KAAK,WAAW,KAAKC,GAA2B,CACvD,CAEAA,IAAmC,CACjC,KAAK,iBAAiB,+BAA+B,EAAE,QAASC,GAAO,CAErE,GADI,EAAEA,aAAc,cAChBA,EAAG,aAAa,UAAU,EAAG,OAEjCA,EAAG,aAAa,WAAY,GAAG,EAC/BA,EAAG,aAAa,OAAQ,QAAQ,EAEhC,IAAMC,EAAaD,EAAG,QAAQ,YAAcA,EAAG,YAC/CA,EAAG,aAAa,aAAc,wBAAwBC,CAAU,EAAE,CACpE,CAAC,CACH,CACF,EAvCcC,EAAA,CAAXC,EAAS,GADNT,EACQ,uBACAQ,EAAA,CAAXC,EAAS,GAFNT,EAEQ,4BACgCQ,EAAA,CAA3CC,EAAS,CAAE,KAAM,QAAS,QAAS,EAAK,CAAC,GAHtCT,EAGwC,yBAChCQ,EAAA,CAAXC,EAAS,GAJNT,EAIQ,oBAsCd,IAAMU,EAAN,cAA8BT,CAAa,CAA3C,kCACc,aAAU,MAEtB,QAAS,CACP,OAAO;AAAA;AAAA,kBAEO,KAAK,OAAO;AAAA;AAAA;AAAA,KAI5B,CACF,EAVcO,EAAA,CAAXC,EAAS,GADNC,EACQ,uBAYd,IAAMC,EAAN,cAAgCV,CAAa,CAA7C,kCACc,aAAU,GACV,kBAAiD,OACjD,UAA6B,SAEzC,QAAS,CACP,IAAMW,EACJ,KAAK,eAAiB,OAAST,EAAW,KAAK,OAAO,EAAI,KAAK,QACjE,OAAO,IAAOS,CAAO,EACvB,CAEA,QAAQC,EAAyC,CAC/C,MAAM,QAAQA,CAAiB,GAE7BA,EAAkB,IAAI,SAAS,GAC/BA,EAAkB,IAAI,cAAc,IAEpC,KAAKC,GAAgB,CAEzB,CAEAA,IAAkB,CAChB,KAAK,eAAe,CAAE,SAAU,SAAU,MAAO,KAAM,CAAC,CAC1D,CACF,EAvBcN,EAAA,CAAXC,EAAS,GADNE,EACQ,uBACAH,EAAA,CAAXC,EAAS,GAFNE,EAEQ,4BACAH,EAAA,CAAXC,EAAS,GAHNE,EAGQ,oBAuBd,IAAMI,GAAN,cAA2Bd,CAAa,CACtC,QAAS,CACP,OAAO,GACT,CACF,EAOMe,EAAN,cAAwBf,CAAa,CAArC,kCACE,KAAQ,UAAY,GAER,iBAAc,qBAG1B,IAAI,UAAW,CACb,OAAO,KAAK,SACd,CAEA,IAAI,SAASgB,EAAgB,CAC3B,IAAMC,EAAW,KAAK,UAClBD,IAAUC,IAId,KAAK,UAAYD,EACjBA,EACI,KAAK,aAAa,WAAY,EAAE,EAChC,KAAK,gBAAgB,UAAU,EAEnC,KAAK,cAAc,WAAYC,CAAQ,EACvC,KAAKC,GAAS,EAChB,CAEA,yBACEC,EACAC,EACAJ,EACA,CACA,MAAM,yBAAyBG,EAAMC,EAAMJ,CAAK,EAC5CG,IAAS,aACX,KAAK,SAAWH,IAAU,KAE9B,CAEA,IAAY,UAAgC,CAC1C,OAAO,KAAK,cAAc,UAAU,CACtC,CAEA,IAAY,OAAgB,CAC1B,OAAO,KAAK,SAAS,KACvB,CAEA,IAAY,cAAwB,CAClC,OAAO,KAAK,MAAM,KAAK,EAAE,SAAW,CACtC,CAEA,IAAY,QAA4B,CACtC,OAAO,KAAK,cAAc,QAAQ,CACpC,CAEA,QAAS,CACP,IAAMf,EACJ,yTAEF,OAAO;AAAA;AAAA,cAEG,KAAK,EAAE;AAAA;AAAA;AAAA,uBAGE,KAAK,WAAW;AAAA,mBACpB,KAAKoB,EAAU;AAAA,iBACjB,KAAKH,EAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAOb,KAAKI,EAAU;AAAA;AAAA,UAEtBpB,EAAWD,CAAI,CAAC;AAAA;AAAA,KAGxB,CAGAoB,GAAW,EAAwB,CACjB,EAAE,OAAS,SAAW,CAAC,EAAE,UAC1B,CAAC,KAAK,eACnB,EAAE,eAAe,EACjB,KAAKC,GAAW,EAEpB,CAEAJ,IAAiB,CACf,KAAK,OAAO,SAAW,KAAK,SACxB,GACA,KAAK,MAAM,KAAK,EAAE,SAAW,CACnC,CAGU,cAAqB,CAC7B,KAAKA,GAAS,CAChB,CAEAI,GAAWC,EAAQ,GAAY,CAE7B,GADI,KAAK,cACL,KAAK,SAAU,OAEnB,MAAM,cAAe,KAAK,GAAI,KAAK,MAAO,CAAE,SAAU,OAAQ,CAAC,EAG/D,IAAMC,EAAY,IAAI,YAAY,wBAAyB,CACzD,OAAQ,CAAE,QAAS,KAAK,MAAO,KAAM,MAAO,EAC5C,QAAS,GACT,SAAU,EACZ,CAAC,EACD,KAAK,cAAcA,CAAS,EAE5B,KAAK,cAAc,EAAE,EACrB,KAAK,SAAW,GAEZD,GAAO,KAAK,SAAS,MAAM,CACjC,CAEA,cACEP,EACA,CAAE,OAAAS,EAAS,GAAO,MAAAF,EAAQ,EAAM,EAA8B,CAAC,EACzD,CAEN,IAAMN,EAAW,KAAK,SAAS,MAE/B,KAAK,SAAS,MAAQD,EAGtB,IAAMU,EAAa,IAAI,MAAM,QAAS,CAAE,QAAS,GAAM,WAAY,EAAK,CAAC,EACzE,KAAK,SAAS,cAAcA,CAAU,EAElCD,IACF,KAAKH,GAAW,EAAK,EACjBL,GAAU,KAAK,cAAcA,CAAQ,GAGvCM,GACF,KAAK,SAAS,MAAM,CAExB,CACF,EAxIchB,EAAA,CAAXC,EAAS,GAHNO,EAGQ,2BAGRR,EAAA,CADHC,EAAS,CAAE,KAAM,OAAQ,CAAC,GALvBO,EAMA,wBAuIN,IAAMY,EAAN,cAA4B3B,CAAa,CAAzC,kCAC6C,mBAAgB,GAG3D,IAAY,OAAmB,CAC7B,OAAO,KAAK,cAAcJ,EAAc,CAC1C,CAEA,IAAY,UAAyB,CACnC,OAAO,KAAK,cAAcD,EAAiB,CAC7C,CAEA,IAAY,aAAkC,CAC5C,IAAMiC,EAAO,KAAK,SAAS,cAAc,+BAA+B,EACxE,OAAOA,GAA+B,IACxC,CAEA,QAAS,CACP,OAAO,GACT,CAEA,mBAA0B,CACxB,MAAM,kBAAkB,EAIxB,IAAIC,EAAW,KAAK,cAA2B,KAAK,EAC/CA,IACHA,EAAWC,EAAc,MAAO,CAC9B,MAAO,yBACT,CAAC,EACD,KAAK,MAAM,sBAAsB,WAAYD,CAAQ,GAGvD,KAAK,sBAAwB,IAAI,qBAC9BE,GAAY,CACX,IAAMC,EAAgB,KAAK,MAAM,cAAc,UAAU,EACzD,GAAI,CAACA,EAAe,OACpB,IAAMC,EAAYF,EAAQ,CAAC,GAAG,oBAAsB,EACpDC,EAAc,UAAU,OAAO,SAAUC,CAAS,CACpD,EACA,CACE,UAAW,CAAC,EAAG,CAAC,EAChB,WAAY,KACd,CACF,EAEA,KAAK,sBAAsB,QAAQJ,CAAQ,CAC7C,CAEA,cAAqB,CAEd,KAAK,WAEV,KAAK,iBAAiB,wBAAyB,KAAKK,EAAY,EAChE,KAAK,iBAAiB,4BAA6B,KAAKC,EAAS,EACjE,KAAK,iBACH,kCACA,KAAKC,EACP,EACA,KAAK,iBACH,mCACA,KAAKC,EACP,EACA,KAAK,iBAAiB,4BAA6B,KAAKC,EAAQ,EAChE,KAAK,iBACH,+BACA,KAAKC,EACP,EACA,KAAK,iBACH,oCACA,KAAKC,EACP,EACA,KAAK,iBAAiB,QAAS,KAAKC,EAAuB,EAC3D,KAAK,iBAAiB,UAAW,KAAKC,EAAyB,EACjE,CAEA,sBAA6B,CAC3B,MAAM,qBAAqB,EAE3B,KAAK,uBAAuB,WAAW,EACvC,KAAK,sBAAwB,OAE7B,KAAK,oBAAoB,wBAAyB,KAAKR,EAAY,EACnE,KAAK,oBAAoB,4BAA6B,KAAKC,EAAS,EACpE,KAAK,oBACH,kCACA,KAAKC,EACP,EACA,KAAK,oBACH,mCACA,KAAKC,EACP,EACA,KAAK,oBAAoB,4BAA6B,KAAKC,EAAQ,EACnE,KAAK,oBACH,+BACA,KAAKC,EACP,EACA,KAAK,oBACH,oCACA,KAAKC,EACP,EACA,KAAK,oBAAoB,QAAS,KAAKC,EAAuB,EAC9D,KAAK,oBAAoB,UAAW,KAAKC,EAAyB,CACpE,CAGAR,GAAaS,EAAmC,CAC9C,KAAKC,GAAeD,EAAM,MAAM,EAChC,KAAKE,GAAmB,CAC1B,CAGAV,GAAUQ,EAAmC,CAC3C,KAAKC,GAAeD,EAAM,MAAM,CAClC,CAEAG,IAAqB,CACnB,KAAKC,GAAsB,EACtB,KAAK,MAAM,WACd,KAAK,MAAM,SAAW,GAE1B,CAEAH,GAAeI,EAAkBC,EAAW,GAAY,CACtD,KAAKH,GAAa,EAElB,IAAMI,EACJF,EAAQ,OAAS,OAASvD,GAAwBD,GAEhD,KAAK,gBACPwD,EAAQ,KAAOA,EAAQ,MAAQ,KAAK,eAGtC,IAAMG,EAAMrB,EAAcoB,EAAUF,CAAO,EAC3C,KAAK,SAAS,YAAYG,CAAG,EAEzBF,GACF,KAAKG,GAAiB,CAE1B,CAGAP,IAA2B,CAKzB,IAAMG,EAAUlB,EAActC,GAJN,CACtB,QAAS,GACT,KAAM,WACR,CAC+D,EAC/D,KAAK,SAAS,YAAYwD,CAAO,CACnC,CAEAD,IAA8B,CACZ,KAAK,aAAa,SACpB,KAAK,aAAa,OAAO,CACzC,CAEAX,GAAeO,EAAmC,CAChD,KAAKU,GAAoBV,EAAM,MAAM,CACvC,CAEAU,GAAoBL,EAAwB,CACtCA,EAAQ,aAAe,iBACzB,KAAKJ,GAAeI,EAAS,EAAK,EAGpC,IAAMM,EAAc,KAAK,YACzB,GAAI,CAACA,EAAa,MAAM,IAAI,MAAM,sCAAsC,EAExE,GAAIN,EAAQ,aAAe,gBAAiB,CAC1CM,EAAY,aAAa,YAAa,EAAE,EACxC,MACF,CAEA,IAAM3C,EACJqC,EAAQ,YAAc,SAClBM,EAAY,aAAa,SAAS,EAAIN,EAAQ,QAC9CA,EAAQ,QAEdM,EAAY,aAAa,UAAW3C,CAAO,EAEvCqC,EAAQ,aAAe,gBACzB,KAAK,aAAa,gBAAgB,WAAW,EAC7C,KAAKI,GAAiB,EAE1B,CAEAf,GAAgBM,EAAyC,CACvD,GAAIA,EAAM,OAAO,OAAS,WACpB,KAAK,SAAS,qBAAqBjC,GACjC,KAAK,SAAS,UAAU,MAAQ,UAAW,CAE7C,KAAK,SAAS,UAAU,aAAa,UAAWiC,EAAM,OAAO,OAAO,EACpE,KAAK,SAAS,UAAU,aACtB,eACAA,EAAM,OAAO,YACf,EACA,MACF,CAIJ,IAAMY,EAASzB,EAAcpC,GAAyBiD,EAAM,MAAM,EAClE,KAAK,SAAS,YAAYY,CAAM,CAClC,CAEAjB,IAAiB,CACf,KAAK,SAAS,UAAY,EAC5B,CAEAC,GAAmBI,EAA2C,CAC5D,GAAM,CAAE,MAAA3B,EAAO,YAAAwC,EAAa,OAAA/B,EAAQ,MAAAF,CAAM,EAAIoB,EAAM,OAChD3B,IAAU,QACZ,KAAK,MAAM,cAAcA,EAAO,CAAE,OAAAS,EAAQ,MAAAF,CAAM,CAAC,EAE/CiC,IAAgB,SAClB,KAAK,MAAM,YAAcA,EAE7B,CAEAf,GAAwB,EAAqB,CAC3C,KAAKgB,GAAwB,CAAC,CAChC,CAEAf,GAA0B,EAAwB,EACzB,EAAE,MAAQ,SAAW,EAAE,MAAQ,MAGtD,KAAKe,GAAwB,CAAC,CAChC,CAEAA,GAAwB,EAAqC,CAC3D,GAAM,CAAE,WAAAnD,EAAY,OAAAmB,CAAO,EAAI,KAAKiC,GAAe,EAAE,MAAM,EAC3D,GAAI,CAACpD,EAAY,OAEjB,EAAE,eAAe,EAGjB,IAAMqD,EACJ,EAAE,SAAW,EAAE,QAAU,GAAO,EAAE,OAAS,GAAQlC,EAErD,KAAK,MAAM,cAAcnB,EAAY,CACnC,OAAQqD,EACR,MAAO,CAACA,CACV,CAAC,CACH,CAEAD,GAAeE,EAGb,CACA,GAAI,EAAEA,aAAa,aAAc,MAAO,CAAC,EAEzC,IAAMvD,EAAKuD,EAAE,QAAQ,gCAAgC,EACrD,OAAMvD,aAAc,YAGlBA,EAAG,UAAU,SAAS,YAAY,GAClCA,EAAG,QAAQ,aAAe,OAKrB,CACL,WAHiBA,EAAG,QAAQ,YAAcA,EAAG,aAGnB,OAC1B,OACEA,EAAG,UAAU,SAAS,QAAQ,GAC9BA,EAAG,QAAQ,mBAAqB,IAChCA,EAAG,QAAQ,mBAAqB,MACpC,EAV0B,CAAC,EALc,CAAC,CAgB5C,CAEAmC,IAAgC,CAC9B,KAAKO,GAAsB,EAC3B,KAAKK,GAAiB,CACxB,CAEAA,IAAyB,CACvB,KAAK,MAAM,SAAW,EACxB,CACF,EAvR6C7C,EAAA,CAA1CC,EAAS,CAAE,UAAW,gBAAiB,CAAC,GADrCmB,EACuC,6BA2R7C,eAAe,OAAOnC,GAAkBO,CAAW,EACnD,eAAe,OAAON,GAAuBgB,CAAe,EAC5D,eAAe,OAAOf,GAAyBgB,CAAiB,EAChE,eAAe,OAAOf,GAAmBmB,EAAY,EACrD,eAAe,OAAOlB,GAAgBmB,CAAS,EAC/C,eAAe,OAAOlB,GAAoB8B,CAAa,EAEvD,EAAE,UAAY,CACZ,MAAM,wBACJ,mBACA,SAAUqB,EAA2B,CACnC,IAAMa,EAAM,IAAI,YAAYb,EAAQ,QAAS,CAC3C,OAAQA,EAAQ,GAClB,CAAC,EAEK3C,EAAK,SAAS,eAAe2C,EAAQ,EAAE,EAE7C,GAAI,CAAC3C,EAAI,CACPyD,GAAuB,CACrB,OAAQ,QACR,QAAS;AAAA,YACPd,EAAQ,EAAE;AAAA,qBACDA,EAAQ,EAAE;AAAA,SAEvB,CAAC,EACD,MACF,CAEA3C,EAAG,cAAcwD,CAAG,CACtB,CACF,CACF,CAAC", + "names": ["global", "globalThis", "supportsAdoptingStyleSheets", "ShadowRoot", "ShadyCSS", "nativeShadow", "Document", "prototype", "CSSStyleSheet", "constructionToken", "Symbol", "cssTagCache", "WeakMap", "CSSResult", "cssText", "strings", "safeToken", "this", "Error", "_strings", "styleSheet", "_styleSheet", "cacheable", "length", "get", "replaceSync", "set", "toString", "unsafeCSS", "value", "String", "adoptStyles", "renderRoot", "styles", "supportsAdoptingStyleSheets", "adoptedStyleSheets", "map", "s", "CSSStyleSheet", "styleSheet", "style", "document", "createElement", "nonce", "global", "setAttribute", "textContent", "cssText", "appendChild", "getCompatibleStyle", "sheet", "rule", "cssRules", "unsafeCSS", "is", "defineProperty", "getOwnPropertyDescriptor", "getOwnPropertyNames", "getOwnPropertySymbols", "getPrototypeOf", "Object", "global", "globalThis", "trustedTypes", "emptyStringForBooleanAttribute", "emptyScript", "polyfillSupport", "reactiveElementPolyfillSupport", "JSCompiler_renameProperty", "prop", "_obj", "defaultConverter", "value", "type", "Boolean", "Array", "JSON", "stringify", "fromValue", "Number", "parse", "e", "notEqual", "old", "defaultPropertyDeclaration", "attribute", "String", "converter", "reflect", "hasChanged", "Symbol", "metadata", "litPropertyMetadata", "WeakMap", "ReactiveElement", "HTMLElement", "initializer", "this", "__prepare", "_initializers", "push", "observedAttributes", "finalize", "__attributeToPropertyMap", "keys", "name", "options", "state", "elementProperties", "set", "noAccessor", "key", "descriptor", "getPropertyDescriptor", "prototype", "get", "v", "call", "oldValue", "requestUpdate", "configurable", "enumerable", "hasOwnProperty", "superCtor", "Map", "finalized", "props", "properties", "propKeys", "p", "createProperty", "attr", "__attributeNameForProperty", "elementStyles", "finalizeStyles", "styles", "isArray", "Set", "flat", "Infinity", "reverse", "s", "unshift", "getCompatibleStyle", "toLowerCase", "constructor", "super", "__instanceProperties", "isUpdatePending", "hasUpdated", "__reflectingProperty", "__initialize", "__updatePromise", "Promise", "res", "enableUpdating", "_$changedProperties", "__saveInstanceProperties", "forEach", "i", "controller", "__controllers", "add", "renderRoot", "isConnected", "hostConnected", "delete", "instanceProperties", "size", "createRenderRoot", "shadowRoot", "attachShadow", "shadowRootOptions", "adoptStyles", "connectedCallback", "c", "_requestedUpdate", "disconnectedCallback", "hostDisconnected", "_old", "_$attributeToProperty", "attrValue", "toAttribute", "removeAttribute", "setAttribute", "ctor", "propName", "getPropertyOptions", "fromAttribute", "_$changeProperty", "__enqueueUpdate", "has", "__reflectingProperties", "reject", "result", "scheduleUpdate", "performUpdate", "wrapped", "shouldUpdate", "changedProperties", "willUpdate", "hostUpdate", "update", "__markUpdated", "_$didUpdate", "_changedProperties", "hostUpdated", "firstUpdated", "updated", "updateComplete", "getUpdateComplete", "__propertyToAttribute", "mode", "reactiveElementVersions", "global", "globalThis", "trustedTypes", "policy", "createPolicy", "createHTML", "s", "boundAttributeSuffix", "marker", "Math", "random", "toFixed", "slice", "markerMatch", "nodeMarker", "d", "document", "createMarker", "createComment", "isPrimitive", "value", "isArray", "Array", "isIterable", "Symbol", "iterator", "SPACE_CHAR", "textEndRegex", "commentEndRegex", "comment2EndRegex", "tagEndRegex", "RegExp", "singleQuoteAttrEndRegex", "doubleQuoteAttrEndRegex", "rawTextElement", "tag", "type", "strings", "values", "_$litType$", "html", "svg", "noChange", "for", "nothing", "templateCache", "WeakMap", "walker", "createTreeWalker", "trustFromTemplateString", "tsa", "stringFromTSA", "hasOwnProperty", "Error", "getTemplateHtml", "l", "length", "attrNames", "rawTextEndRegex", "regex", "i", "attrName", "match", "attrNameEndIndex", "lastIndex", "exec", "test", "end", "startsWith", "push", "Template", "constructor", "options", "node", "this", "parts", "nodeIndex", "attrNameIndex", "partCount", "el", "createElement", "currentNode", "content", "svgElement", "firstChild", "replaceWith", "childNodes", "nextNode", "nodeType", "hasAttributes", "name", "getAttributeNames", "endsWith", "realName", "statics", "getAttribute", "split", "m", "index", "ctor", "PropertyPart", "BooleanAttributePart", "EventPart", "AttributePart", "removeAttribute", "tagName", "textContent", "emptyScript", "append", "data", "indexOf", "_options", "innerHTML", "resolveDirective", "part", "parent", "attributeIndex", "currentDirective", "__directives", "__directive", "nextDirectiveConstructor", "_$initialize", "_$resolve", "TemplateInstance", "template", "_$parts", "_$disconnectableChildren", "_$template", "_$parent", "parentNode", "_$isConnected", "fragment", "creationScope", "importNode", "partIndex", "templatePart", "ChildPart", "nextSibling", "ElementPart", "_$setValue", "__isConnected", "startNode", "endNode", "_$committedValue", "_$startNode", "_$endNode", "isConnected", "directiveParent", "_$clear", "_commitText", "_commitTemplateResult", "_commitNode", "_commitIterable", "insertBefore", "_insert", "createTextNode", "result", "_$getTemplate", "h", "_update", "instance", "_clone", "get", "set", "itemParts", "itemPart", "item", "start", "from", "_$notifyConnectionChanged", "n", "remove", "element", "fill", "String", "valueIndex", "noCommit", "change", "v", "_commitValue", "setAttribute", "toggleAttribute", "super", "newListener", "oldListener", "shouldRemoveListener", "capture", "once", "passive", "shouldAddListener", "removeEventListener", "addEventListener", "event", "call", "host", "handleEvent", "polyfillSupport", "global", "litHtmlPolyfillSupport", "Template", "ChildPart", "litHtmlVersions", "push", "render", "value", "container", "options", "partOwnerNode", "renderBefore", "part", "endNode", "insertBefore", "createMarker", "_$setValue", "LitElement", "ReactiveElement", "constructor", "this", "renderOptions", "host", "__childPart", "createRenderRoot", "renderRoot", "super", "renderBefore", "firstChild", "changedProperties", "value", "render", "hasUpdated", "isConnected", "update", "connectedCallback", "setConnected", "disconnectedCallback", "noChange", "globalThis", "litElementHydrateSupport", "polyfillSupport", "litElementPolyfillSupport", "globalThis", "litElementVersions", "push", "PartType", "ATTRIBUTE", "CHILD", "PROPERTY", "BOOLEAN_ATTRIBUTE", "EVENT", "ELEMENT", "directive", "c", "values", "_$litDirective$", "Directive", "_partInfo", "_$isConnected", "this", "_$parent", "part", "parent", "attributeIndex", "__part", "__attributeIndex", "props", "update", "_part", "render", "UnsafeHTMLDirective", "Directive", "partInfo", "super", "this", "_value", "nothing", "type", "PartType", "CHILD", "Error", "constructor", "directiveName", "value", "_templateResult", "noChange", "strings", "raw", "_$litType$", "resultType", "values", "unsafeHTML", "directive", "defaultPropertyDeclaration", "attribute", "type", "String", "converter", "defaultConverter", "reflect", "hasChanged", "notEqual", "standardProperty", "options", "target", "context", "kind", "metadata", "properties", "globalThis", "litPropertyMetadata", "get", "set", "Map", "name", "v", "oldValue", "call", "this", "requestUpdate", "_$changeProperty", "value", "Error", "property", "protoOrTarget", "nameOrContext", "proto", "hasOwnProperty", "constructor", "createProperty", "wrapped", "Object", "getOwnPropertyDescriptor", "createElement", "tag_name", "attrs", "el", "key", "value", "LightElement", "s", "showShinyClientMessage", "headline", "message", "status", "CHAT_MESSAGE_TAG", "CHAT_USER_MESSAGE_TAG", "CHAT_STATUS_MESSAGE_TAG", "CHAT_MESSAGES_TAG", "CHAT_INPUT_TAG", "CHAT_CONTAINER_TAG", "ICONS", "ChatMessage", "LightElement", "icon", "o", "#onContentChange", "#makeSuggestionsAccessible", "el", "suggestion", "__decorateClass", "n", "ChatUserMessage", "ChatStatusMessage", "content", "changedProperties", "#scrollIntoView", "ChatMessages", "ChatInput", "value", "oldValue", "#onInput", "name", "_old", "#onKeyDown", "#sendInput", "focus", "sentEvent", "submit", "inputEvent", "ChatContainer", "last", "sentinel", "createElement", "entries", "inputTextarea", "addShadow", "#onInputSent", "#onAppend", "#onAppendChunk", "#onAppendStatus", "#onClear", "#onUpdateUserInput", "#onRemoveLoadingMessage", "#onInputSuggestionClick", "#onInputSuggestionKeydown", "event", "#appendMessage", "#addLoadingMessage", "#initMessage", "#removeLoadingMessage", "message", "finalize", "TAG_NAME", "msg", "#finalizeMessage", "#appendMessageChunk", "lastMessage", "status", "placeholder", "#onInputSuggestionEvent", "#getSuggestion", "shouldSubmit", "x", "evt", "showShinyClientMessage"] } diff --git a/tests/playwright/shiny/components/chat/append_status_message/app.py b/tests/playwright/shiny/components/chat/append_status_message/app.py new file mode 100644 index 000000000..0112f3f57 --- /dev/null +++ b/tests/playwright/shiny/components/chat/append_status_message/app.py @@ -0,0 +1,46 @@ +from shiny import reactive +from shiny.express import input, ui + +# Set some Shiny page options +ui.page_opts(title="Hello Chat") + +# Create a chat instance, with an initial message +chat = ui.Chat( + id="chat", + messages=[ + {"content": "Hello! How can I help you today?", "role": "assistant"}, + ], +) + +# Display the chat +chat.ui() + +with ui.card(): + ui.card_header("Status Message") + + with ui.layout_columns(): + with ui.div(): + ui.input_text( + "content", "Message Content", "Using model llama3.2" + ) + ui.input_switch("content_is_html", "Raw HTML", True) + + ui.input_radio_buttons("type", "Status type", choices=["dynamic", "static"]) + + ui.input_action_button("submit", "Send status message") + + +# Define a callback to run when the user submits a message +@chat.on_user_submit +async def handle_user_input(user_input: str): + await chat.append_message(f"You said: {user_input}") + + +@reactive.effect +@reactive.event(input.submit) +async def send_status_message(): + content = input.content() + if input.content_is_html.get(): + content = ui.HTML(content) + + await chat.append_status_message(content, type=input.type()) diff --git a/tests/playwright/shiny/components/chat/append_status_message/test_chat_append_status_message.py b/tests/playwright/shiny/components/chat/append_status_message/test_chat_append_status_message.py new file mode 100644 index 000000000..e3efec449 --- /dev/null +++ b/tests/playwright/shiny/components/chat/append_status_message/test_chat_append_status_message.py @@ -0,0 +1,83 @@ +from playwright.sync_api import Page, expect +from utils.deploy_utils import skip_on_webkit + +from shiny.playwright import controller +from shiny.run import ShinyAppProc + + +@skip_on_webkit +def test_validate_chat_basic(page: Page, local_app: ShinyAppProc) -> None: + page.goto(local_app.url) + + chat = controller.Chat(page, "chat") + content = controller.InputText(page, "content") + content_is_html = controller.InputSwitch(page, "content_is_html") + status_type = controller.InputRadioButtons(page, "type") + submit = controller.InputActionButton(page, "submit") + + # Verify starting state + expect(chat.loc).to_be_visible(timeout=30 * 1000) + initial_message = "Hello! How can I help you today?" + chat.expect_latest_message(initial_message, timeout=30 * 1000) + + # Send a status message + content.set("Using model llama3.1") + content_is_html.set(True) + status_type.set("dynamic") + submit.click() + chat.expect_latest_message("Using model llama3.1") + expect(chat.loc_latest_message).to_have_attribute("content_type", "html") + expect(chat.loc_latest_message).to_have_attribute("type", "dynamic") + + # Send a status message that updates the original message + content.set("Using model phi4") + submit.click() + chat.expect_latest_message("Using model phi4") + expect(chat.loc_latest_message).to_have_attribute("content_type", "html") + expect(chat.loc_latest_message).to_have_attribute("type", "dynamic") + + # Send a new status message that is static (doesn't overwrite previous message) + html_message = ( + '
Lost connection with provider.
' + ) + content.set(html_message) + status_type.set("static") + submit.click() + chat.expect_latest_message("Lost connection with provider.") + expect(chat.loc_latest_message).to_have_attribute("content_type", "html") + expect(chat.loc_latest_message).to_have_attribute("type", "static") + expect(chat.loc_latest_message.locator("> :first-child")).to_have_class( + "alert alert-warning" + ) + # previous status message is still there + expect(chat.loc_messages.locator("> :nth-last-child(2)")).to_have_text( + "Using model phi4" + ) + + # Now another message as raw text + content.set("Using model deepseek-r1") + status_type.set("dynamic") + content_is_html.set(False) + submit.click() + chat.expect_latest_message("Using model deepseek-r1") + expect(chat.loc_latest_message).to_have_attribute("content_type", "text") + expect(chat.loc_latest_message).to_have_attribute("type", "dynamic") + + # Overwrite this message with one with raw html + content_is_html.set(True) + submit.click() + chat.expect_latest_message("Using model deepseek-r1") + expect(chat.loc_latest_message).to_have_attribute("content_type", "html") + expect(chat.loc_latest_message).to_have_attribute("type", "dynamic") + + chat.set_user_input("Hello") + chat.send_user_input() + chat.expect_latest_message("You said: Hello") + content.set("Disconnecting. Goodbye!") + submit.click() + chat.expect_latest_message("Disconnecting. Goodbye!") + expect(chat.loc_latest_message).to_have_attribute("content_type", "html") + expect(chat.loc_latest_message).to_have_attribute("type", "dynamic") + expect(chat.loc_messages.locator("> :nth-last-child(4)")).to_have_text( + "Using model deepseek-r1" + )