@k2b/ui 0.38.1 → 0.39.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/actions/Dropdown.js +42 -6
- package/dist/browser/actions/Dropdown.js.map +1 -1
- package/dist/browser/actions/SelectionToolbar.js +11 -6
- package/dist/browser/actions/SelectionToolbar.js.map +1 -1
- package/dist/browser/actions/Toolbar.js +5 -1
- package/dist/browser/actions/Toolbar.js.map +1 -1
- package/dist/browser/actions/index.js.map +1 -1
- package/dist/browser/chat/ChatComposer.js +11 -2
- package/dist/browser/chat/ChatComposer.js.map +1 -1
- package/dist/browser/text-editor/TextEditor.js +331 -214
- package/dist/browser/text-editor/TextEditor.js.map +1 -1
- package/dist/browser/text-editor/table.js +43 -6
- package/dist/browser/text-editor/table.js.map +1 -1
- package/dist/ssr/actions/Dropdown.js +38 -6
- package/dist/ssr/actions/Dropdown.js.map +1 -1
- package/dist/ssr/actions/SelectionToolbar.js +11 -6
- package/dist/ssr/actions/SelectionToolbar.js.map +1 -1
- package/dist/ssr/actions/Toolbar.js +5 -1
- package/dist/ssr/actions/Toolbar.js.map +1 -1
- package/dist/ssr/actions/index.js.map +1 -1
- package/dist/ssr/chat/ChatComposer.js +10 -2
- package/dist/ssr/chat/ChatComposer.js.map +1 -1
- package/dist/ssr/text-editor/TextEditor.js +225 -96
- package/dist/ssr/text-editor/TextEditor.js.map +1 -1
- package/dist/ssr/text-editor/table.js +43 -6
- package/dist/ssr/text-editor/table.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/Dropdown.d.ts +15 -1
- package/dist/types/actions/Toolbar.d.ts +6 -1
- package/dist/types/actions/index.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["chat/ChatComposer.tsx"],"sourcesContent":["import {\n batch,\n children,\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n Index,\n type JSX,\n on,\n onCleanup,\n onMount,\n Show,\n untrack,\n} from \"solid-js\";\nimport { Dropdown, type DropdownItem as DropdownItemData } from \"../actions/Dropdown\";\nimport { dialogHistorySettled, holdDialogHistory } from \"../feedback/dialog-core\";\nimport { Tooltip } from \"../feedback/Tooltip\";\nimport { replaceTextareaRange } from \"../inputs/editor-dom\";\nimport {\n completedEmojiShortcode,\n type EmojiIndex,\n emojiInTone,\n emojiName,\n emojiShortcodeQuery,\n loadEmojiIndex,\n suggestEmoji,\n} from \"../inputs/emoji/emoji-index\";\nimport { FileDropTarget } from \"../inputs/FileDropTarget\";\nimport { toggleBulletList, toggleInlineMarker } from \"../inputs/markdown/actions\";\nimport { openCodeFence } from \"../inputs/markdown/code-zone\";\nimport { type MarkdownToolbarMessages, useMarkdownToolbarMessages } from \"../inputs/markdown/toolbar-messages\";\nimport { SelectChip } from \"../inputs/SelectChip\";\nimport { useSelectMessages } from \"../inputs/select-messages\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { ChatContextUsage as ContextUsage } from \"./ChatPrimitives\";\nimport {\n chatCommandKey,\n conversationEnterAction,\n executeChatAction,\n nextChatCommandIndex,\n reportChatFailure,\n runChatSubmission,\n} from \"./chat-behavior\";\nimport { useChatMessages } from \"./chat-messages\";\nimport { chatCommandListModel, parseChatCommandQuery } from \"./command-search\";\nimport { chatCommandQuery, chatMentionSegments, chatPeopleQuery, reconcileChatMentions } from \"./composer-document\";\nimport type {\n ChatAction,\n ChatAttachment,\n ChatComposerEmoji,\n ChatComposerMicrophone,\n ChatComposerState,\n ChatContextUsageData,\n ChatMention,\n ChatModelOption,\n ChatSubmitInput,\n} from \"./types\";\n\nconst composerMaxInputHeight = 309;\nconst commandDoneMs = 3_000;\n/** Emoji suggestions for a `:shortcode`, as many as fit the list without scrolling on a phone. */\nconst emojiSuggestionLimit = 8;\n// Keep editor undo text within approximately 2 MiB, plus the current edit.\nconst composerUndoBudgetChars = 1_000_000;\n\nexport type ChatCommandContext = {\n setValue: (value: string) => void;\n submit: () => void;\n focus: () => void;\n openModelSelection: () => Promise<string | null>;\n};\n\n/**\n * An action can cancel and restore its token, report a short completion message, or hand back a reference chosen in a\n * dialog: `mention` takes the token's place exactly as a `mention` row does, and Ctrl/⌘+Z brings the token back.\n */\nexport type ChatCommandResult = void | \"cancelled\" | { done: string } | { mention: ChatAttachment };\n\n/** The draft as a successful `open` leaves it: without the `/…` token, with its references moved along. Save this one. */\nexport type ChatCommandDraft = { value: string; mentions: readonly ChatMention[] };\n\n/**\n * How an `open` row ends: on success (`void`) the token leaves as for an action; `\"cancelled\"` changes nothing; `failed`\n * keeps the list open and the draft unchanged, and its text replaces the row's description until the row runs again.\n */\nexport type ChatCommandOpenResult = void | \"cancelled\" | { failed: string };\n\n/** A fixed place in the slash list. Sections keep the given order, also while searching. */\nexport type ChatCommandSection = {\n id: string;\n label: string;\n /** Rows come from `searchCommands`: loading keeps a heading spinner; empty placeholders reserve the first search or retained rows. */\n searched?: boolean;\n /** Only while searching or narrowed: absent from the overview (empty query), including its loading placeholder. */\n searchOnly?: boolean;\n /** Only in the overview (empty query, no scope): absent while searching or narrowed, such as recently used rows. */\n overviewOnly?: boolean;\n /**\n * Its local rows are fixed when the list opens: a row that arrives while the list is open waits for the next opening,\n * so a section above others whose rows load in the background never pushes a visible row down. Rows that go away\n * still leave at once.\n */\n fixedWhileOpen?: boolean;\n /**\n * Local rows still on their way, such as Commands from a catalog: the section ends with placeholder rows, three in\n * the overview and one while searching, and its heading shows a spinner. Make it the last section, so rows that\n * arrive only fill the end of the list and no visible row moves.\n */\n pending?: boolean;\n};\n/** First-word narrowing; Tab writes `words[0]` followed by a space. */\nexport type ChatCommandScope = { id: string; title: string; words: readonly string[] };\n/** Passed as the third argument to `searchCommands`. */\nexport type ChatCommandSearch = {\n scope?: string;\n /** One list opening, unchanged across queries and narrowing; retries start another opening. */\n opening: number;\n};\n\nexport type ChatCommand = {\n /** Section id; unknown or missing ids render in a trailing part without a heading. */\n section?: string;\n /** Tab writes this scope's first word; a row without an action or mention also narrows on Enter. */\n scope?: string;\n /** Absent from the overview; appears when searched, including its unavailable reason. */\n hiddenUntilSearch?: boolean;\n /** A chosen value, independent of the row marked by keyboard navigation. */\n selected?: boolean;\n /** Retry discovery in a new opening, retaining the token and currently displayed rows. */\n searchAgain?: boolean;\n /** Stays in every search of its section, after the matches, such as a row that retries loading the section. */\n persistent?: boolean;\n /** Application name, searchable but not displayed. */\n app?: string;\n /**\n * Used recently by this person. While searching, a matching row moves one step up the ranking ladder of its section\n * and comes before rows of equal rank. The overview keeps consumer order.\n */\n recent?: boolean;\n /** Stable row key for option ids, marking and de-duplication. Defaults to `name`. */\n id?: string;\n name: string;\n description: string;\n icon?: string;\n /** Extra search words, for example in German and English. */\n keywords?: readonly string[];\n /** Unavailable now; this short reason replaces the description. */\n reason?: string;\n /** Shown in the status line while the action runs. */\n busyLabel?: string;\n /** Failures restore an unchanged draft and appear once in the status line, without calling `onError`. */\n action?: (context: ChatCommandContext) => ChatCommandResult | Promise<ChatCommandResult>;\n /**\n * Leaves the composer, such as opening another app. Runs with the token and the list in place: the row shows\n * `busyLabel` (default \"Opening …\") with a spinner instead of its description, and editing waits. A rejection ends like\n * an action's: the token stays, the list closes and the status line names the reason. Closing the list, such as with\n * Escape, cancels: `signal` aborts and the row ends at once. `signal` also aborts when the opening ends any other way\n * than by success, so the opener can save the draft with its token again. A new `draftKey` cancels too, unless the\n * opener calls `follow()` right before changing it itself: that next change keeps the opening, moves its busy line\n * to the status line, and Escape still cancels. See `ChatCommandOpenResult`.\n */\n open?: (draft: ChatCommandDraft, signal: AbortSignal, follow: () => void) => Promise<ChatCommandOpenResult>;\n /** Selecting a reference inserts its display name and retains its opaque payload. */\n mention?: ChatAttachment;\n /**\n * Opens the composer's own file selection, as \"Attach files\" in the add menu does, within the key or click that chose\n * the row, so the device's file dialog can still open. The token leaves; choosing nothing brings it back.\n */\n attachFiles?: boolean;\n label?: string;\n disabled?: boolean;\n};\n\nexport type ChatFileSelection = {\n onSelect: (files: readonly File[]) => void | Promise<void>;\n /**\n * Chooses files for \"Attach files\" instead of the device's file dialog, for example to offer other sources as well.\n * Called within the menu activation, so it may still open the device's dialog; resolve `[]` when the user cancels.\n * `multiple: false` keeps the first chosen file, and a rejection reaches `onError`.\n */\n choose?: () => Promise<readonly File[]>;\n onError?: (error: unknown) => void;\n accept?: string;\n multiple?: boolean;\n disabled?: boolean;\n label?: string;\n};\n\n/** A person `@` can mention: a member of the conversation, a person or an agent. */\nexport type ChatPersonSuggestion = { id: string; name: string; agent?: boolean };\n\n/** Suggests people for `@`; the composer inserts the chosen one as a mention named \"@Name\". */\nexport type ChatComposerPeople = {\n /** At most 8 matches are shown; a rejection only means no suggestions. */\n search: (query: string, signal: AbortSignal) => Promise<readonly ChatPersonSuggestion[]>;\n};\n\nexport type ChatPasteHandler = (event: ClipboardEvent & { currentTarget: HTMLTextAreaElement; target: Element }) => void;\n\nexport type ChatComposerReply = {\n /** Name of the answered message's author. */\n author: string;\n /** Plain text of the answered message; it shows at most two lines. */\n text: string;\n onCancel: () => void;\n onSelect?: () => void;\n};\n\nexport type ChatComposerProps = {\n value: string;\n onValueChange: (value: string) => void;\n onSubmit: (input: ChatSubmitInput) => boolean | void | Promise<boolean | void>;\n /** Submit intent used for drafts entered while a response is running. Defaults to `steer`. */\n runningSubmitIntent?: \"steer\" | \"queue\";\n onStop?: () => void | Promise<void>;\n onError?: (error: unknown) => void;\n state?: ChatComposerState;\n attachments?: readonly ChatAttachment[];\n onAttachmentsChange?: (attachments: readonly ChatAttachment[]) => void;\n fileSelection?: ChatFileSelection;\n /** Handle non-file clipboard content. Pasted files already use `fileSelection`. */\n onPaste?: ChatPasteHandler;\n /** The add menu's entries after \"Attach files\". Not shown with `addOpensCommands`. */\n menuActions?: readonly ChatAction[];\n /**\n * \"+\" opens the slash list with a search field on top instead of the add menu, for keyboards where \"/\" is hard to\n * reach, such as a phone's. The search field filters, narrows and chooses as typing after \"/\" does, and a reference\n * lands where the field's caret was when \"+\" was pressed. Escape, \"+\" again, Back on a phone or a press outside\n * closes the list without acting on what lies below, and the field gets its focus and selection back. `menuActions`\n * do not show then: offer them as `commands`, and file selection as a row with `attachFiles`.\n */\n addOpensCommands?: boolean;\n models?: readonly ChatModelOption[];\n selectedModelId?: string | null;\n onModelChange?: (modelId: string) => void;\n /** Compact application-owned details immediately after the model selector. */\n modelDetails?: JSX.Element;\n commands?: readonly ChatCommand[];\n commandSections?: readonly ChatCommandSection[];\n commandScopes?: readonly ChatCommandScope[];\n searchCommands?: (query: string, signal: AbortSignal, search: ChatCommandSearch) => Promise<readonly ChatCommand[]>;\n /**\n * The last row for typed text or a scope, built at once from the query, such as \"Search Cloud for “q3”\". It is no\n * match: unscoped it follows \"Nothing found for …\"; in a scope it ends the scope's rows. Not called for the overview.\n */\n commandFallback?: (search: { query: string; scope?: string }) => ChatCommand | undefined;\n mentions?: readonly ChatMention[];\n onMentionsChange?: (mentions: readonly ChatMention[]) => void;\n /** Suggests people after `@`; needs `mentions` and `onMentionsChange`. */\n people?: ChatComposerPeople;\n /** Shared surface above the editor; suggestions temporarily replace this content. */\n accessory?: JSX.Element;\n contextUsage?: ChatContextUsageData;\n contextActions?: readonly ChatAction[];\n /** Optional action inside the context details popup. */\n contextPopupAction?: ChatAction;\n /** Additional compact controls rendered with the add/model controls. */\n footerTools?: JSX.Element;\n /** Compact application controls immediately before the send/stop button. */\n submitTools?: JSX.Element;\n /** Replaces footer controls during an application-owned interaction, preserving the editor. */\n footerContent?: JSX.Element;\n placeholder?: string;\n label?: string;\n inputLabel?: string;\n disabled?: boolean;\n /** Keeps the draft editable but holds it back, such as while the chosen model cannot answer. */\n submitDisabled?: boolean;\n error?: string;\n focusToken?: unknown;\n draftKey?: unknown;\n class?: string;\n /**\n * `\"conversation\"` is the composer for messages between people: one row with attach, a pill-shaped field and Send,\n * without the assistant prompt's footer. The field starts with one line and grows to a third of its nearest size\n * container, a hint line of fixed height sits above it, its buttons keep it focused, and Enter breaks the line\n * inside an open code block and on touch-only devices. The default is the assistant prompt.\n */\n variant?: \"default\" | \"conversation\";\n /** `\"enter\"` (default): Enter sends and Shift+Enter breaks the line. `\"mod-enter\"`: Enter breaks the line. Ctrl/⌘+Enter always sends. */\n sendKey?: \"enter\" | \"mod-enter\";\n /**\n * Adds \"Aa\", which opens one row above the field with Bold, Italic and Bullet list (Ctrl/⌘+B, Ctrl/⌘+I, Ctrl/⌘+Shift+8);\n * the field and its controls stay put. Other Markdown is typed by hand.\n */\n formatting?: boolean;\n /** An emoji button at a fixed place. Touch-only devices hide it; their keyboard has emoji. */\n emoji?: ChatComposerEmoji;\n /** A microphone at a fixed place: a tap dictates, holding it or its menu asks for a voice message. */\n microphone?: ChatComposerMicrophone;\n /** One line above the field. The conversation variant always keeps its height; the default shows it only with content. */\n hint?: JSX.Element;\n /**\n * The message this draft answers, shown above the field on the same quiet tint as a quote in a message, with a\n * button that cancels the reply. `onSelect` makes the quote a button, for example to jump to the original.\n */\n reply?: ChatComposerReply;\n};\n\ntype FormatTool = {\n id: string;\n icon: string;\n label: (messages: MarkdownToolbarMessages) => string;\n run: (textarea: HTMLTextAreaElement) => void;\n /** Ctrl/⌘ plus this `event.key`. */\n key?: string;\n /** Ctrl/⌘+Shift plus this `event.code`, the physical key, so every keyboard layout agrees. */\n shiftCode?: string;\n};\n\n/** The row stays short: what a chat message needs. Other Markdown, typed by hand, keeps working. */\nconst formatTools: readonly FormatTool[] = [\n { id: \"bold\", icon: \"ti ti-bold\", label: (m) => m.boldShortcut, run: (textarea) => toggleInlineMarker(textarea, \"**\"), key: \"b\" },\n { id: \"italic\", icon: \"ti ti-italic\", label: (m) => m.italicShortcut, run: (textarea) => toggleInlineMarker(textarea, \"*\"), key: \"i\" },\n { id: \"bullet-list\", icon: \"ti ti-list\", label: (m) => m.bulletListShortcut, run: toggleBulletList, shiftCode: \"Digit8\" },\n];\n\nconst formatShortcut = (event: KeyboardEvent): FormatTool | undefined => {\n if (event.altKey || !(event.ctrlKey || event.metaKey)) return undefined;\n return formatTools.find((tool) => (event.shiftKey ? tool.shiftCode === event.code : tool.key === event.key.toLowerCase()));\n};\n\nconst touchOnlyQuery = \"(any-pointer: coarse) and (not (any-pointer: fine))\";\nconst isTouchOnly = () => typeof matchMedia === \"function\" && matchMedia(touchOnlyQuery).matches;\n/** How long a press on the microphone lasts before it asks for a voice message instead of dictation. */\nconst microphoneHoldMs = 500;\n/** Keeps the field focused (and a phone's keyboard open) when a composer button is pressed with a mouse or finger. */\nconst keepFieldFocus = (event: MouseEvent) => event.preventDefault();\n/**\n * Keeps one tap from reaching the page: its pointer, touch and mouse events stop at the window, and neither focus nor a\n * click happens. A finger's tap ends with `touchend`, a scroll with `pointercancel`, a mouse's press with `click`.\n */\nconst swallowTap = (down: PointerEvent) => {\n const blocked = [\"pointerup\", \"pointercancel\", \"touchstart\", \"touchend\", \"mousedown\", \"mouseup\", \"click\", \"contextmenu\"] as const;\n const stop = () => {\n window.removeEventListener(\"pointerdown\", next, true);\n for (const type of blocked) window.removeEventListener(type, block, true);\n };\n const block = (event: Event) => {\n event.stopPropagation();\n if (event.type !== \"pointercancel\" && event.type !== \"touchstart\" && event.type !== \"pointerup\") event.preventDefault();\n if (event.type === \"click\" || event.type === \"touchend\" || event.type === \"pointercancel\") stop();\n };\n // The next press is a new gesture, whatever became of this one.\n const next = (event: Event) => {\n if (event !== down) stop();\n };\n down.stopPropagation();\n down.preventDefault();\n window.addEventListener(\"pointerdown\", next, true);\n for (const type of blocked) window.addEventListener(type, block, { capture: true, passive: false });\n};\n\nconst attachmentIcon = (attachment: ChatAttachment): string =>\n attachment.icon ?? (attachment.kind === \"image\" ? \"ti ti-photo\" : attachment.kind === \"resource\" ? \"ti ti-link\" : \"ti ti-file\");\n\nconst hasContent = (items: unknown[]) => items.some((item) => item != null && typeof item !== \"boolean\" && item !== \"\");\n\nexport function ChatComposer(props: ChatComposerProps): JSX.Element {\n const accessory = children(() => props.accessory);\n const hasAccessory = () => hasContent(accessory.toArray());\n const hint = children(() => props.hint);\n const footer = children(() => props.footerContent);\n const messages = useUiMessages();\n const markdownToolbarMessages = useMarkdownToolbarMessages();\n const chatMessages = useChatMessages();\n const selectMessages = useSelectMessages();\n const commandListId = `k2b-chat-commands-${createUniqueId().replace(/[^A-Za-z0-9_-]/g, \"-\")}`;\n const formatGroupId = `${commandListId}-format`;\n // Emoji suggestions keep their index-based selection and ids.\n const [selectedCommandIndex, setSelectedCommandIndex] = createSignal(0);\n const [activeCommandKey, setActiveCommandKey] = createSignal<string>();\n const [commandMoved, setCommandMoved] = createSignal(false);\n const commandIds = new Map<string, number>();\n let commandIdCounter = 0;\n const commandOptionId = (command: ChatCommand) => {\n const key = chatCommandKey(command);\n if (!commandIds.has(key)) commandIds.set(key, commandIdCounter++);\n return `${commandListId}-c${commandIds.get(key)}`;\n };\n const [closedAt, setClosedAt] = createSignal<number>();\n /** The list opened from \"+\": the field's selection when \"+\" was pressed, and the search field's text. */\n const [addSearch, setAddSearch] = createSignal<{ start: number; end: number }>();\n const [addQuery, setAddQuery] = createSignal(\"\");\n let addSearchRef: HTMLInputElement | undefined;\n let addButtonRef: HTMLButtonElement | undefined;\n let addComposing = false;\n /** The `open` row running now, and why `open` rows failed in this opening, by row key. */\n const [openingRow, setOpeningRow] = createSignal<string>();\n const [openFailures, setOpenFailures] = createSignal<Readonly<Record<string, string>>>({});\n /** Cancels the `open` row running now; `key` follows announced draft moves, `label` is its busy line. */\n let openingRun: { controller: AbortController; key: unknown; label: string; follow: boolean; moved: boolean } | undefined;\n // Where the pending native edit starts; a selection replaced as a whole starts at its beginning.\n let inputStart: number | undefined;\n let inputEnd: number | undefined;\n const [commandStatus, setCommandStatus] = createSignal<{ tone: \"busy\" | \"done\" | \"error\"; text: string }>();\n const [announcement, setAnnouncement] = createSignal<{ text: string }>();\n let statusTimer: ReturnType<typeof setTimeout> | undefined;\n let disposed = false;\n const showCommandStatus = (status?: { tone: \"busy\" | \"done\" | \"error\"; text: string }) => {\n if (disposed) return;\n clearTimeout(statusTimer);\n setCommandStatus(status);\n if (status?.tone === \"done\") {\n statusTimer = setTimeout(() => setCommandStatus(undefined), commandDoneMs);\n }\n };\n onCleanup(() => {\n disposed = true;\n clearTimeout(statusTimer);\n });\n const [addingFiles, setAddingFiles] = createSignal(false);\n const [submitting, setSubmitting] = createSignal(false);\n let shellRef: HTMLDivElement | undefined;\n let composerRef: HTMLElement | undefined;\n let textareaRef: HTMLTextAreaElement | undefined;\n let fileInputRef: HTMLInputElement | undefined;\n let measureRef: HTMLTextAreaElement | undefined;\n let microphoneRef: HTMLDivElement | undefined;\n let sawRunning = props.state === \"running\";\n const conversation = () => props.variant === \"conversation\";\n const [formattingOpen, setFormattingOpen] = createSignal(false);\n const [microphoneMenuOpen, setMicrophoneMenuOpen] = createSignal(false);\n const dictation = () => props.microphone?.dictation ?? null;\n const showHint = () => conversation() || dictation() !== null || hasContent(hint.toArray());\n\n const state = () => props.state ?? \"idle\";\n const running = () => state() === \"running\";\n const stopping = () => state() === \"stopping\";\n const runningSubmitIntent = () => props.runningSubmitIntent ?? \"steer\";\n const attachments = () => props.attachments ?? [];\n const [caret, setCaret] = createSignal(0);\n const [selectionEnd, setSelectionEnd] = createSignal(0);\n const [dismissed, setDismissed] = createSignal(false);\n const [composing, setComposing] = createSignal(false);\n const [searchResults, setSearchResults] = createSignal<readonly ChatCommand[]>([]);\n const [searchResultsQuery, setSearchResultsQuery] = createSignal<string>();\n const [searchResultsScope, setSearchResultsScope] = createSignal<string>();\n const [suggestionAnnouncement, setSuggestionAnnouncement] = createSignal<{ text: string }>();\n const [searching, setSearching] = createSignal(false);\n const [searchError, setSearchError] = createSignal(false);\n const [executing, setExecuting] = createSignal(false);\n const [modelOpen, setModelOpen] = createSignal<boolean>();\n const [choosingModel, setChoosingModel] = createSignal(false);\n let resolveModel: ((id: string | null) => void) | undefined;\n const finishModelSelection = (id: string | null) => {\n const resolve = resolveModel;\n resolveModel = undefined;\n if (choosingModel()) {\n setModelOpen(false);\n // Let the controlled close reach Dropdown before returning normal clicks to its own state.\n queueMicrotask(() => {\n if (!choosingModel()) setModelOpen(undefined);\n });\n }\n setChoosingModel(false);\n resolve?.(id);\n };\n const blockedBesidesCommand = () => Boolean(props.disabled || stopping() || state() === \"submitting\" || addingFiles() || submitting());\n const usableModelControl = () =>\n !conversation() && !footer() && !blockedBesidesCommand() && !running() && Boolean(props.models?.length && props.onModelChange);\n const openModelSelection = (): Promise<string | null> => {\n if (!usableModelControl()) return Promise.resolve(null);\n finishModelSelection(null);\n return new Promise((resolve) => {\n resolveModel = resolve;\n setChoosingModel(true);\n setModelOpen(true);\n queueMicrotask(() => {\n if (!choosingModel() || !modelOpen()) return;\n // Start on the current model, as a click on the chip would show it checked.\n const menu = composerRef?.querySelector(\".k2b-chat-composer__model\");\n (\n menu?.querySelector<HTMLButtonElement>('[role=\"menuitemradio\"][aria-checked=\"true\"]:not(:disabled)') ??\n menu?.querySelector<HTMLButtonElement>('[role=\"menuitemradio\"]:not(:disabled)')\n )?.focus();\n });\n });\n };\n createEffect(() => {\n if (!usableModelControl()) finishModelSelection(null);\n });\n onCleanup(() => finishModelSelection(null));\n const [commandOpening, setCommandOpening] = createSignal(0);\n let retrySearch = false;\n let highlightRef: HTMLDivElement | undefined;\n let commandListRef: HTMLDivElement | undefined;\n const mentions = () => props.mentions ?? [];\n const locale = useLocale();\n const [emojiIndex, setEmojiIndex] = createSignal<EmojiIndex>();\n const emojiQuery = createMemo(() =>\n !props.emoji || dismissed() || composing() ? null : emojiShortcodeQuery(props.value, caret(), selectionEnd()),\n );\n // The emoji data loads with the first `:shortcode`; a failed load only means no suggestions.\n createEffect(() => {\n if (emojiQuery() && !emojiIndex()) loadEmojiIndex().then(setEmojiIndex, () => undefined);\n });\n const emojiMatches = createMemo(() => {\n const token = emojiQuery();\n const index = emojiIndex();\n return token && index ? suggestEmoji(index, token.query, emojiSuggestionLimit) : [];\n });\n const emojiOpen = () => emojiMatches().length > 0;\n // People for `@name`: each change of the query asks again and gives up the previous question.\n const peopleQuery = createMemo(() =>\n !props.people || dismissed() || composing() ? null : chatPeopleQuery(props.value, caret(), selectionEnd(), mentions()),\n );\n // Results belong to the query they answer; while a newer query is asked, the older results show nothing to pick.\n const [peopleResults, setPeopleResults] = createSignal<{ query: string; people: readonly ChatPersonSuggestion[] }>();\n const peopleMatches = () => {\n const results = peopleResults();\n return results && results.query === peopleQuery()?.query ? results.people : [];\n };\n const setPeopleMatches = (people: readonly ChatPersonSuggestion[], query = peopleQuery()?.query ?? \"\") =>\n setPeopleResults({ query, people });\n createEffect(\n on(\n () => [peopleQuery()?.start, peopleQuery()?.query] as const,\n ([start, query]) => {\n if (start === undefined || query === undefined || !props.people) {\n setPeopleMatches([]);\n return;\n }\n const abort = new AbortController();\n onCleanup(() => abort.abort());\n props.people.search(query, abort.signal).then(\n (found) => {\n if (!abort.signal.aborted) setPeopleMatches(found.slice(0, 8), query);\n },\n () => {\n if (!abort.signal.aborted) setPeopleMatches([], query);\n },\n );\n },\n ),\n );\n const peopleOpen = () => !emojiOpen() && Boolean(peopleQuery()) && peopleMatches().length > 0;\n // From \"+\", the search field's text is the query of an empty token at the field's stored caret.\n const caretCommandToken = createMemo(() => {\n const search = addSearch();\n if (!search) return chatCommandQuery(props.value, caret(), selectionEnd());\n const at = Math.min(search.end, props.value.length);\n return { start: at, end: at, query: addQuery() };\n });\n const caretCommandStart = createMemo(() => caretCommandToken()?.start);\n // Retained server rows belong to one `/`: they go when it does or when another `/` starts.\n createEffect(() => {\n caretCommandStart();\n setSearchResults([]);\n setSearchResultsQuery(undefined);\n });\n // Escape closes the list for one `/` character, wherever the caret or selection goes; only that `/` going away ends it.\n createEffect(() => {\n const closed = closedAt();\n if (closed !== undefined && props.value[closed] !== \"/\") setClosedAt(undefined);\n });\n const commandQuery = createMemo(() => {\n const token = caretCommandToken();\n if (addSearch()) return token;\n return dismissed() || composing() || token?.start === closedAt() ? null : token;\n });\n const openingStart = createMemo(() => commandQuery()?.start);\n createEffect(() => {\n props.draftKey;\n const start = openingStart();\n if (start !== undefined) setCommandOpening((opening) => opening + 1);\n });\n // A failed `open` row says so for the rest of its list opening.\n createEffect(() => {\n props.draftKey;\n commandOpening();\n setOpenFailures({});\n });\n const parsedCommandQuery = createMemo(() => parseChatCommandQuery(commandQuery()?.query ?? \"\", props.commandScopes ?? []));\n const commandFallbackRow = createMemo(() => {\n const parsed = parsedCommandQuery();\n const query = parsed.query.trim();\n return commandQuery() && (query || parsed.scope) ? props.commandFallback?.({ query, scope: parsed.scope?.id }) : undefined;\n });\n const currentCommandScope = createMemo(() => parsedCommandQuery().scope?.id);\n createEffect(() => {\n currentCommandScope();\n setSearchResults([]);\n setSearchResultsQuery(undefined);\n });\n // Rows of a `fixedWhileOpen` section are the ones it had when this `/` opened the list; later ones wait for the next\n // `/`. A retry row starts another opening in the same open list, so it does not count.\n const fixedCommandKeys = createMemo(() => {\n props.draftKey;\n if (openingStart() === undefined) return undefined;\n return untrack(() => {\n const fixed = new Set((props.commandSections ?? []).filter((section) => section.fixedWhileOpen).map((section) => section.id));\n return fixed.size\n ? new Set((props.commands ?? []).filter((command) => fixed.has(command.section ?? \"\")).map(chatCommandKey))\n : undefined;\n });\n });\n const localCommands = createMemo(() => {\n const commands = props.commands ?? [];\n const keys = fixedCommandKeys();\n if (!keys) return commands;\n const fixed = new Set((props.commandSections ?? []).filter((section) => section.fixedWhileOpen).map((section) => section.id));\n return commands.filter((command) => !fixed.has(command.section ?? \"\") || keys.has(chatCommandKey(command)));\n });\n const commandModel = createMemo(() =>\n chatCommandListModel({\n query: commandQuery()?.query ?? \"\",\n scopes: props.commandScopes,\n sections: props.commandSections,\n commands: localCommands(),\n searchResults: searchResultsScope() === parsedCommandQuery().scope?.id ? searchResults() : [],\n searchResultsFresh: searchResultsQuery() === commandQuery()?.query && searchResultsScope() === parsedCommandQuery().scope?.id,\n searchSettled: searchResultsQuery() !== undefined && searchResultsScope() === parsedCommandQuery().scope?.id,\n searching: searching(),\n fallback: commandFallbackRow(),\n }),\n );\n const commandMatches = createMemo(() => (commandQuery() ? commandModel().rows.map((row) => row.command) : []));\n /** Rows that matched; an unscoped fallback row only follows them. */\n const foundCommandCount = () => commandMatches().length - (commandModel().fallback ? 1 : 0);\n const currentCommandQuery = createMemo(() => caretCommandToken()?.query);\n // Arrow marking belongs to one token in one draft; another draft or `/` starts at the top row again.\n createEffect(() => {\n props.draftKey;\n caretCommandStart();\n currentCommandQuery();\n setCommandMoved(false);\n });\n const commandsOpen = () =>\n Boolean(!emojiOpen() && !peopleOpen() && commandQuery() && (localCommands().length || props.searchCommands || commandFallbackRow()));\n // Rows that arrive for a pending section never move a visible row of the overview: until the person types, the list\n // keeps the height it had with its placeholders and scrolls what does not fit. A list below its maximum height grows\n // upward from the field, so a change of height alone would move its first row. While searching, the rows arrive\n // with the search's own answer, which changes the list anyway.\n // From \"+\", the whole panel keeps the height it opened with instead.\n const commandsPending = createMemo(\n () =>\n commandsOpen() &&\n !addSearch() &&\n !parsedCommandQuery().scope &&\n !parsedCommandQuery().query.trim() &&\n commandModel().groups.some((group) => group.pendingRows > 0),\n );\n // Typing, another opening or closing the list lets it size itself again.\n const commandListSizeKey = createMemo(() => (commandsOpen() ? `${commandOpening()}\\u0000${caretCommandToken()?.query}` : undefined));\n // The list's height with its placeholders, for the size key it was measured under.\n let pendingList: { height: number; key: string | undefined } | undefined;\n createEffect(() => {\n const list = commandListRef;\n if (!commandsPending() || !list || typeof ResizeObserver === \"undefined\") return;\n const measure = () => {\n pendingList = { height: list.getBoundingClientRect().height, key: untrack(commandListSizeKey) };\n };\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(list);\n onCleanup(() => observer.disconnect());\n });\n createEffect(\n on(commandsPending, (pending, wasPending) => {\n const held = pendingList;\n pendingList = undefined;\n // Only rows arriving hold the list; the person's typing or closing it does not.\n if (pending || !wasPending || !held || held.key !== commandListSizeKey() || !commandListRef?.isConnected) return;\n commandListRef.style.height = `${held.height}px`;\n commandListRef.setAttribute(\"data-held\", \"\");\n }),\n );\n createEffect(\n on(\n commandListSizeKey,\n () => {\n commandListRef?.style.removeProperty(\"height\");\n commandListRef?.removeAttribute(\"data-held\");\n },\n { defer: true },\n ),\n );\n // Escape, a press outside, or moving the caret away closes the list; while an `open` row runs, that cancels it, so\n // nothing opens after the person backed out. Success ends the opening and closes the list in one step. A new draft\n // cancels too, unless the opener announced that next move with `follow()`: its busy line moves to the status line,\n // and Escape still cancels there. Any later unannounced draft change cancels.\n createEffect(() => {\n const draftKey = props.draftKey;\n const open = commandsOpen();\n const row = openingRow();\n const run = openingRun;\n if (!run || row === undefined) return;\n if (draftKey !== run.key) {\n if (run.follow) {\n run.follow = false;\n run.key = draftKey;\n run.moved = true;\n showCommandStatus({ tone: \"busy\", text: run.label });\n } else run.controller.abort();\n return;\n }\n if (!open && !run.moved) run.controller.abort();\n });\n onCleanup(() => openingRun?.controller.abort());\n // An `open` row gives the sheet's Back entry up first, so it never races the navigation it starts.\n const commandSheetHeld = createMemo(() => commandsOpen() && isTouchOnly() && openingRow() === undefined);\n createEffect(() => {\n if (!commandSheetHeld()) return;\n onCleanup(holdDialogHistory(() => closeCommandList()));\n });\n const suggestionsOpen = () => commandsOpen() || emojiOpen() || peopleOpen();\n const fieldOwnsList = () => suggestionsOpen() && !addSearch();\n // From \"+\", the panel keeps the height it opened with while the person types or rows arrive, so neither the search\n // field nor the first row moves; what does not fit scrolls. The space above the field still bounds it.\n const addPanelOpen = createMemo(() => addSearch() !== undefined && commandsOpen());\n createEffect(() => {\n const accessory = addPanelOpen() ? commandListRef?.parentElement : undefined;\n if (!accessory) return;\n const frame = requestAnimationFrame(() =>\n accessory.style.setProperty(\"--k2b-chat-command-held\", `${accessory.getBoundingClientRect().height}px`),\n );\n onCleanup(() => cancelAnimationFrame(frame));\n });\n createEffect(() => {\n if (!suggestionsOpen()) return;\n let disposed = false;\n const measure = () => {\n if (disposed || !commandListRef) return;\n const accessory = commandListRef.parentElement!;\n const viewportTop = window.visualViewport?.offsetTop ?? 0;\n let top = viewportTop;\n // The column a phone sheet spans: the nearest ancestor that clips sideways, or the page.\n let column: { left: number; right: number } | undefined;\n for (let parent = accessory.parentElement; parent; parent = parent.parentElement) {\n const style = window.getComputedStyle(parent);\n if (/(auto|scroll|hidden|clip)/.test(style.overflowY)) {\n top = Math.max(top, parent.getBoundingClientRect().top);\n }\n if (!column && /(auto|scroll|hidden|clip)/.test(style.overflowX)) {\n const left = parent.getBoundingClientRect().left + parent.clientLeft;\n column = { left, right: left + parent.clientWidth };\n }\n }\n const page = document.documentElement.clientWidth;\n const left = Math.max(0, column?.left ?? 0);\n const right = Math.min(page, column?.right ?? page);\n const slot = accessory.parentElement!.getBoundingClientRect();\n // From its place in the slot, not its box: the sheet opened from \"+\" rises into place, and a box measured during\n // that animation would include its offset.\n const bottom = slot.bottom - (Number.parseFloat(window.getComputedStyle(accessory).bottom) || 0);\n // On the accessory, so a panel opened from \"+\" is bounded as a whole, with its search field.\n accessory.style.setProperty(\"--k2b-chat-command-space\", `${Math.max(40, bottom - top - 8)}px`);\n // Only a list that reaches the screen's top edge keeps clear of a notch or the status bar.\n accessory.style.setProperty(\"--k2b-chat-command-safe-top\", top === viewportTop ? \"env(safe-area-inset-top, 0px)\" : \"0px\");\n accessory.style.setProperty(\"--k2b-chat-command-reach-left\", `${Math.max(0, slot.left - left)}px`);\n accessory.style.setProperty(\"--k2b-chat-command-reach-right\", `${Math.max(0, right - slot.right)}px`);\n };\n queueMicrotask(measure);\n window.addEventListener(\"resize\", measure);\n window.addEventListener(\"scroll\", measure, true);\n window.visualViewport?.addEventListener(\"resize\", measure);\n onCleanup(() => {\n disposed = true;\n window.removeEventListener(\"resize\", measure);\n window.removeEventListener(\"scroll\", measure, true);\n window.visualViewport?.removeEventListener(\"resize\", measure);\n });\n });\n // A press outside the command list and the field closes the list, as Escape does; the text stays. With a mouse or a\n // trackpad the press then acts as usual. On a touch-only device a tap outside the composer closes only the list: it\n // reaches nothing beneath, and the field keeps focus, so the keyboard stays open.\n // A list opened from \"+\" is a menu: any press outside it closes only the list, with every pointer, and the field gets\n // its focus back. \"+\" itself toggles with its click; a press in the field closes the list and lands there as usual.\n createEffect(() => {\n if (!commandsOpen()) return;\n const onPointerDown = (event: PointerEvent) => {\n const target = event.target;\n if (!(target instanceof Node) || commandListRef?.parentElement?.contains(target)) return;\n if (addSearch()) {\n if (addButtonRef?.contains(target) && !addButtonRef.disabled) return;\n if (textareaRef?.parentElement?.contains(target)) {\n // The field takes the focus before the search field goes, so a phone keeps its keyboard; the press itself\n // then places the caret.\n textareaRef.focus({ preventScroll: true });\n endAddSearch(false);\n return;\n }\n swallowTap(event);\n endAddSearch(true);\n return;\n }\n if (textareaRef?.parentElement?.contains(target)) return;\n setClosedAt(commandQuery()?.start);\n if (isTouchOnly() && !shellRef?.contains(target)) swallowTap(event);\n };\n window.addEventListener(\"pointerdown\", onPointerDown, true);\n onCleanup(() => window.removeEventListener(\"pointerdown\", onPointerDown, true));\n });\n createEffect(() => {\n props.draftKey;\n const token = commandQuery();\n setSearchError(false);\n if (!token || !props.searchCommands) {\n setSearching(false);\n return;\n }\n running();\n const parsed = parsedCommandQuery();\n const opening = commandOpening();\n const abort = new AbortController();\n setSearching(true);\n const delay = retrySearch ? 0 : 120;\n retrySearch = false;\n const timer = setTimeout(() => {\n Promise.resolve()\n .then(() => props.searchCommands!(parsed.query, abort.signal, { scope: parsed.scope?.id, opening }))\n .then((results) => {\n if (!abort.signal.aborted) {\n batch(() => {\n setSearchResults(results);\n setSearchResultsQuery(token.query);\n setSearchResultsScope(parsed.scope?.id);\n });\n }\n })\n .catch(() => {\n if (!abort.signal.aborted) {\n setSearchResults([]);\n setSearchResultsQuery(undefined);\n setSearchError(true);\n }\n })\n .finally(() => {\n if (!abort.signal.aborted) setSearching(false);\n });\n }, delay);\n onCleanup(() => {\n clearTimeout(timer);\n abort.abort();\n });\n });\n let settledEmpty: { start: number; query: string } | undefined;\n // A space after \"Nothing found\" ends the `/…` as plain text; a search field opened from \"+\" just keeps its text.\n createEffect(() => {\n const token = commandQuery();\n if (!token || addSearch() || parsedCommandQuery().scope || searchError()) {\n settledEmpty = undefined;\n return;\n }\n const previous = settledEmpty;\n if (/\\s$/.test(token.query) && previous?.start === token.start && previous.query.trimEnd() === token.query.trimEnd()) {\n setClosedAt(token.start);\n return;\n }\n const settled = !searching() && (!props.searchCommands || searchResultsQuery() === token.query);\n if (settled && commandModel().empty) {\n settledEmpty = { start: token.start, query: token.query };\n if (/\\s$/.test(token.query)) setClosedAt(token.start);\n } else if (!searching()) settledEmpty = undefined;\n });\n let lastSuggestion: { query: string; text: string } | undefined;\n createEffect(() => {\n const model = commandModel();\n const query = commandQuery()?.query;\n if (!commandsOpen()) {\n setSuggestionAnnouncement(undefined);\n lastSuggestion = undefined;\n return;\n }\n if (searching() || searchError() || (props.searchCommands && searchResultsQuery() !== query)) return;\n const text = chatMessages().commandSuggestions({ count: model.rows.length });\n const timer = setTimeout(() => {\n if (lastSuggestion && lastSuggestion.query === query && lastSuggestion.text === text) return;\n lastSuggestion = { query: query ?? \"\", text };\n setSuggestionAnnouncement({ text });\n }, 350);\n onCleanup(() => clearTimeout(timer));\n });\n const history: { value: string; mentions: readonly ChatMention[]; caret: number }[] = [];\n let historyIndex = -1;\n createEffect(() => {\n props.draftKey;\n untrack(() => {\n history.length = 0;\n historyIndex = -1;\n finishModelSelection(null);\n endAddSearch(false);\n setDismissed(true);\n setClosedAt(undefined);\n setSearchResults([]);\n setSearchResultsQuery(undefined);\n // A failure belongs to the draft it happened in; success notes may follow a command into the chat it opened.\n if (commandStatus()?.tone === \"error\") showCommandStatus();\n });\n });\n const snapshot = () => ({ value: props.value, mentions: [...mentions()], caret: textareaRef?.selectionStart ?? 0 });\n const sameMentions = (a: readonly ChatMention[], b: readonly ChatMention[]) =>\n a.length === b.length &&\n a.every((item, index) => item.start === b[index]?.start && item.end === b[index]?.end && item.attachment === b[index]?.attachment);\n const record = () => {\n if (history[historyIndex]?.value !== props.value || !sameMentions(history[historyIndex]?.mentions ?? [], mentions())) {\n history.splice(historyIndex + 1);\n history.push(snapshot());\n let size = history.reduce((total, entry) => total + entry.value.length, 0);\n while (history.length > 2 && size > composerUndoBudgetChars) size -= history.shift()!.value.length;\n historyIndex = history.length - 1;\n }\n };\n const edit = (value: string, nextMentions = reconcileChatMentions(props.value, value, mentions())) => {\n if (commandStatus()?.tone === \"error\") showCommandStatus();\n // Replacing `/` can leave its position and query identical, but starts a new opening.\n if (inputStart !== undefined && inputEnd !== undefined && props.value.slice(inputStart, inputEnd).includes(\"/\")) {\n setCommandOpening((opening) => opening + 1);\n setSearchResults([]);\n setSearchResultsQuery(undefined);\n setCommandMoved(false);\n }\n // An edit that starts at or before the closed `/` (select all, then type `/`) replaces it; the new `/` may open again.\n const closed = closedAt();\n if (closed !== undefined) {\n let same = 0;\n while (same <= closed && props.value[same] === value[same]) same++;\n if (Math.min(same, inputStart ?? same) <= closed) setClosedAt(undefined);\n }\n inputStart = undefined;\n inputEnd = undefined;\n record();\n props.onValueChange(value);\n props.onMentionsChange?.(nextMentions);\n record();\n setDismissed(false);\n };\n const restoreHistory = (direction: -1 | 1) => {\n // A field that only stays enabled to keep focus, while an `open` row runs, is not edited by undo either.\n if (editBlocked()) return;\n record();\n const next = history[historyIndex + direction];\n if (!next) return;\n historyIndex += direction;\n props.onValueChange(next.value);\n props.onMentionsChange?.(next.mentions);\n queueMicrotask(() => {\n textareaRef?.setSelectionRange(next.caret, next.caret);\n syncCaret();\n });\n };\n const syncCaret = () => {\n // One update, so no effect sees a half-moved selection (it would read as \"no `/` here\" and reopen a closed list).\n batch(() => {\n setCaret(textareaRef?.selectionStart ?? props.value.length);\n setSelectionEnd(textareaRef?.selectionEnd ?? props.value.length);\n });\n };\n /** Closes the list opened from \"+\"; `refocus` gives the field its focus and the selection it had when \"+\" was pressed. */\n const endAddSearch = (refocus: boolean) => {\n const search = addSearch();\n if (!search) return;\n addComposing = false;\n batch(() => {\n setAddSearch(undefined);\n setAddQuery(\"\");\n });\n if (!refocus || !textareaRef) return;\n const length = textareaRef.value.length;\n textareaRef.focus();\n textareaRef.setSelectionRange(Math.min(search.start, length), Math.min(search.end, length));\n syncCaret();\n };\n /** Escape, Back, a press outside: the list closes and the text stays. */\n const closeCommandList = (refocus = true) => {\n if (addSearch()) endAddSearch(refocus);\n else setClosedAt(commandQuery()?.start);\n };\n const toggleAddSearch = () => {\n if (addSearch()) {\n endAddSearch(true);\n return;\n }\n if (blocked() || !textareaRef) return;\n const start = textareaRef.selectionStart;\n const end = textareaRef.selectionEnd;\n batch(() => {\n // Emoji suggestions for a `:shortcode` at the caret give way; they would hold the list closed.\n setDismissed(true);\n setAddQuery(\"\");\n setAddSearch({ start, end });\n });\n // Within the press, so a phone opens its keyboard for the search field.\n addSearchRef?.focus();\n };\n const selectedCommand = createMemo(() => {\n const rows = commandMatches();\n return (commandMoved() && rows.find((command) => chatCommandKey(command) === activeCommandKey())) || rows[0];\n });\n const selectedCommandKey = createMemo(() => {\n const command = selectedCommand();\n return command ? chatCommandKey(command) : undefined;\n });\n createEffect(() => {\n if (!commandsOpen()) commandIds.clear();\n selectedCommandKey();\n setAnnouncement(undefined);\n });\n const busy = () => Boolean(props.disabled || stopping() || state() === \"submitting\" || executing() || addingFiles());\n const blocked = () => busy() || submitting();\n /** The conversation field stays editable while a message is sent, so it keeps the focus and a phone its keyboard. */\n const editBlocked = () => (conversation() ? busy() : blocked());\n const hasDraft = () => Boolean(props.value.trim() || (!running() && attachments().length > 0));\n /** The draft may go out now, apart from a submission that is already on its way. */\n const submittable = () =>\n !busy() && !props.submitDisabled && hasDraft() && !(running() && runningSubmitIntent() === \"steer\" && mentions().length);\n const canSubmit = () => !submitting() && submittable();\n const canSelectFiles = () => Boolean(props.fileSelection && !props.fileSelection.disabled && !running() && !blocked());\n const hasAddMenu = () => Boolean(props.fileSelection || props.menuActions?.length);\n /** \"+\" opens the slash list, as long as there is one; otherwise it stays the add menu. */\n const addOpensCommands = () => Boolean(props.addOpensCommands && (props.commands?.length || props.searchCommands));\n const hasContextUsage = () => {\n if (props.contextPopupAction) return true;\n const context = props.contextUsage;\n if (!context || typeof context.contextWindow !== \"number\" || !Number.isFinite(context.contextWindow) || context.contextWindow <= 0) {\n return false;\n }\n return [context.usage?.total, context.usage?.input, context.usage?.output].some(\n (value) => typeof value === \"number\" && Number.isFinite(value) && value >= 0,\n );\n };\n\n const menuItems = (): readonly DropdownItemData[] => {\n const items: DropdownItemData[] = [];\n if (props.fileSelection) {\n items.push({\n icon: addingFiles() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-paperclip\",\n label: props.fileSelection.label ?? chatMessages().attachFiles,\n disabled: !canSelectFiles(),\n action: () => chooseFiles(),\n });\n }\n for (const action of props.menuActions ?? []) {\n items.push({\n icon: action.icon,\n label: action.label,\n variant: action.variant,\n disabled: action.disabled,\n action: () =>\n reportChatFailure(async () => {\n await executeChatAction(action);\n // Like attaching files, an add action returns to the field when the focus is still on this composer's add\n // button or nowhere; focus the action moved somewhere on purpose stays there.\n queueMicrotask(() => {\n const active = textareaRef?.ownerDocument.activeElement;\n const root = textareaRef?.closest(\".k2b-chat-composer\");\n if (!active || active === active.ownerDocument.body || (root?.contains(active) && active.matches(\"[data-chat-composer-add]\")))\n focus();\n });\n }, props.onError),\n });\n }\n return items;\n };\n\n const autoResize = () => {\n if (!textareaRef) return;\n if (conversation()) {\n // A hidden copy measures the text. Collapsing the field itself would shrink the composer for a frame, and\n // WebKit then clamps the scroll position of the conversation above it. CSS caps the height.\n if (!measureRef) return;\n measureRef.value = textareaRef.value;\n textareaRef.style.height = `${measureRef.scrollHeight}px`;\n return;\n }\n textareaRef.style.height = \"auto\";\n textareaRef.style.height = `${Math.min(textareaRef.scrollHeight, composerMaxInputHeight)}px`;\n };\n\n const focus = () => textareaRef?.focus();\n\n onMount(() => {\n autoResize();\n if (props.focusToken !== undefined) focus();\n // The copy follows the field's width, so a narrower composer measures more lines.\n if (measureRef && typeof ResizeObserver === \"function\") {\n const observer = new ResizeObserver(() => autoResize());\n observer.observe(measureRef);\n onCleanup(() => observer.disconnect());\n }\n });\n\n createEffect(() => {\n emojiMatches();\n peopleMatches();\n setSelectedCommandIndex(0);\n });\n\n createEffect(() => {\n const command = selectedCommand();\n const id = emojiOpen() || peopleOpen() ? `${commandListId}-${selectedCommandIndex()}` : command ? commandOptionId(command) : undefined;\n queueMicrotask(() => {\n const list = commandListRef;\n const item = id ? list?.querySelector<HTMLElement>(`[id=\"${id}\"]`) : undefined;\n if (!list || !item?.isConnected) return;\n // Measured against the visible part of the list: a sticky section heading covers the top of it.\n const heading = item.closest(\".k2b-chat-composer__command-group\")?.querySelector<HTMLElement>(\".k2b-chat-composer__command-heading\");\n const listTop = list.getBoundingClientRect().top + list.clientTop;\n const box = item.getBoundingClientRect();\n const top = box.top - listTop - (heading?.offsetHeight ?? 0);\n const bottom = box.bottom - listTop - list.clientHeight;\n if (top < 0) list.scrollTop += top;\n else if (bottom > 0) list.scrollTop += bottom;\n });\n });\n\n createEffect(() => {\n props.value;\n queueMicrotask(autoResize);\n });\n\n createEffect(() => {\n props.focusToken;\n if (props.focusToken !== undefined) queueMicrotask(focus);\n });\n\n createEffect(() => {\n const active = running();\n if (sawRunning && !active && !props.disabled && typeof document !== \"undefined\") {\n const focused = document.activeElement as HTMLElement | null;\n const insideComposer = Boolean(focused && composerRef?.contains(focused));\n const editingElsewhere = Boolean(\n focused &&\n focused !== document.body &&\n !insideComposer &&\n (focused.matches(\"input, textarea, select\") || focused.isContentEditable || focused.closest(\"[role='dialog'], [popover]\")),\n );\n if (!editingElsewhere) queueMicrotask(focus);\n }\n sawRunning = active;\n });\n\n const setAttachments = (next: readonly ChatAttachment[]) => props.onAttachmentsChange?.(next);\n\n const renderAttachmentCopy = (attachment: ChatAttachment) => (\n <span>\n <strong title={attachment.name}>{attachment.name}</strong>\n </span>\n );\n\n /** `onNothing` runs when the person closes the selection without a file. */\n const chooseFiles = (onNothing?: () => void) => {\n const selection = props.fileSelection;\n if (!selection?.choose) {\n const input = fileInputRef;\n if (input && onNothing) {\n const done = new AbortController();\n input.addEventListener(\n \"cancel\",\n () => {\n done.abort();\n onNothing();\n },\n { signal: done.signal },\n );\n input.addEventListener(\"change\", () => done.abort(), { signal: done.signal });\n }\n return input?.click();\n }\n const failed = (error: unknown) => {\n onNothing?.();\n (props.fileSelection?.onError ?? props.onError)?.(error);\n };\n let chosen: Promise<readonly File[]>;\n try {\n chosen = selection.choose();\n } catch (error) {\n failed(error);\n return;\n }\n chosen.then(\n // A single-file composer keeps the first chosen file, as its file dialog and drops do.\n (files) => {\n if (files.length === 0) onNothing?.();\n else void runFiles(selection.multiple === false ? files.slice(0, 1) : files);\n },\n failed,\n );\n };\n\n /**\n * \"Attach files\" from the slash list: the token leaves as one edit, and the selection opens synchronously, inside the\n * key or click that chose the row, because the device's file dialog needs that activation. Closing the selection\n * without a file brings the token back, unless the draft changed meanwhile.\n */\n const attachFilesFromCommand = (token: { start: number; end: number }, selection?: { start: number; end: number }) => {\n if (!canSelectFiles()) return;\n const key = props.draftKey;\n const previous = snapshot();\n const previousHistory = { entries: [...history], index: historyIndex };\n const nextValue = props.value.slice(0, token.start) + props.value.slice(token.end);\n edit(nextValue, reconcileChatMentions(props.value, nextValue, mentions()));\n setDismissed(true);\n chooseFiles(() => {\n if (props.draftKey !== key || props.value !== nextValue) return;\n setDismissed(true);\n props.onValueChange(previous.value);\n props.onMentionsChange?.(previous.mentions);\n history.splice(0, history.length, ...previousHistory.entries);\n historyIndex = previousHistory.index;\n queueMicrotask(() => {\n textareaRef?.setSelectionRange(selection?.start ?? token.end, selection?.end ?? token.end);\n syncCaret();\n focus();\n });\n });\n queueMicrotask(() => {\n if (props.draftKey !== key || props.value !== nextValue) return;\n textareaRef?.setSelectionRange(token.start, token.start);\n syncCaret();\n });\n };\n\n const runFiles = async (files: FileList | readonly File[]) => {\n if (!canSelectFiles()) return;\n const selected = Array.from(files);\n if (selected.length === 0) return;\n setAddingFiles(true);\n try {\n await props.fileSelection?.onSelect(selected);\n } catch (error) {\n (props.fileSelection?.onError ?? props.onError)?.(error);\n } finally {\n setAddingFiles(false);\n if (fileInputRef) fileInputRef.value = \"\";\n queueMicrotask(focus);\n }\n };\n\n const submit = async () => {\n if (!canSubmit()) return;\n const key = props.draftKey;\n setSubmitting(true);\n try {\n if (isTouchOnly()) {\n if (commandSheetHeld()) closeCommandList(false);\n // The sheet's Back entry leaves first, so a submit handler that navigates finds the history settled.\n await dialogHistorySettled();\n // A draft that another one replaced, or that may no longer go out, is not sent and keeps its text.\n if (disposed || props.draftKey !== key || !submittable()) return;\n }\n const intent = running() ? runningSubmitIntent() : \"send\";\n const previousValue = props.value;\n const previousAttachments = attachments();\n const previousMentions = mentions();\n const input: ChatSubmitInput = {\n intent,\n text: previousValue,\n mentions: previousMentions,\n attachments: intent !== \"steer\" ? previousAttachments : [],\n };\n await runChatSubmission({\n clear: () => {\n props.onValueChange(\"\");\n props.onMentionsChange?.([]);\n if (intent !== \"steer\") setAttachments([]);\n },\n perform: () => props.onSubmit(input),\n restore: () => {\n // Text typed while the submission ran stays, after the returned draft. Its mentions are read first, because\n // an application may already move them when the text changes.\n const typed = props.value;\n const typedMentions = mentions();\n const shift = previousValue.length + 1;\n props.onValueChange(typed ? `${previousValue}\\n${typed}` : previousValue);\n props.onMentionsChange?.(\n typed\n ? [\n ...previousMentions,\n ...typedMentions.map((mention) => ({ ...mention, start: mention.start + shift, end: mention.end + shift })),\n ]\n : previousMentions,\n );\n if (intent !== \"steer\") setAttachments(previousAttachments);\n },\n onError: props.onError,\n });\n } finally {\n setSubmitting(false);\n queueMicrotask(() => {\n autoResize();\n focus();\n });\n }\n };\n\n const narrowCommand = (command: ChatCommand): boolean => {\n const scope = props.commandScopes?.find((scope) => scope.id === command.scope);\n const word = scope?.words[0];\n const token = commandQuery();\n if (!word || !token || !textareaRef) return false;\n if (addSearch()) {\n setAddQuery(`${word} `);\n return true;\n }\n replaceTextareaRange(textareaRef, token.start + 1, token.end, `${word} `);\n syncCaret();\n return true;\n };\n const executeCommand = async (command: ChatCommand, tab = false) => {\n const token = commandQuery();\n const heldHistory = commandSheetHeld();\n const addSelection = addSearch();\n const fromAdd = addSelection !== undefined;\n if (!token || blocked()) return;\n if (command.disabled || command.reason) {\n // A new object each time, so choosing the same row again inserts and announces its reason again.\n setAnnouncement(command.reason ? { text: command.reason } : undefined);\n return;\n }\n if (command.searchAgain) {\n retrySearch = true;\n setCommandOpening((opening) => opening + 1);\n return;\n }\n if (command.scope && (tab || (!command.action && !command.mention && !command.attachFiles)) && narrowCommand(command)) return;\n if (command.attachFiles) {\n if (!canSelectFiles()) return;\n // The field has the focus before the selection opens, so closing it without a file comes back there.\n endAddSearch(true);\n attachFilesFromCommand(token, addSelection);\n return;\n }\n if (command.open) {\n await openFromCommand(command, command.open, token);\n return;\n }\n // The field has the focus again before an action opens a dialog, so the dialog gives it back there.\n endAddSearch(true);\n // From \"+\" a reference joins the text at the caret, apart from a word right before it.\n const lead = (value: string) => (fromAdd && token.start > 0 && !/\\s/.test(value[token.start - 1] ?? \"\") ? \" \" : \"\");\n const previous = snapshot();\n const key = props.draftKey;\n const replacement = command.mention ? lead(props.value) + command.mention.name + \" \" : \"\";\n const nextValue = props.value.slice(0, token.start) + replacement + props.value.slice(token.end);\n const nextMentions = reconcileChatMentions(props.value, nextValue, mentions());\n if (command.mention) {\n const start = token.start + lead(props.value).length;\n nextMentions.push({ start, end: start + command.mention.name.length, attachment: command.mention });\n }\n // A cancelled or failed command leaves no undo step behind: restoring puts the history back as well.\n const previousHistory = { entries: [...history], index: historyIndex };\n edit(nextValue, nextMentions);\n setDismissed(true);\n setExecuting(true);\n let submitRequested = false;\n let restored = false;\n let mentioned: { value: string; caret: number } | undefined;\n const restore = () => {\n if (props.draftKey !== key || props.value !== nextValue) return;\n setDismissed(true);\n props.onValueChange(previous.value);\n props.onMentionsChange?.(previous.mentions);\n history.splice(0, history.length, ...previousHistory.entries);\n historyIndex = previousHistory.index;\n restored = true;\n };\n showCommandStatus(command.busyLabel ? { tone: \"busy\", text: command.busyLabel } : undefined);\n try {\n // The sheet's Back entry leaves first, so an action that navigates or opens a dialog finds the history settled.\n if (heldHistory && command.action) {\n await dialogHistorySettled();\n // Another draft or no composer any more: the command does not run against it.\n if (disposed || props.draftKey !== key) return;\n }\n const result = await command.action?.({\n setValue: (value) => edit(value),\n submit: () => {\n submitRequested = true;\n },\n focus,\n openModelSelection,\n });\n if (result === \"cancelled\") {\n submitRequested = false;\n restore();\n showCommandStatus();\n } else if (result && \"mention\" in result) {\n // One undo step from the token to the reference, as if the row had been a reference itself.\n if (props.draftKey === key && props.value === nextValue) {\n restore();\n restored = false;\n const name = result.mention.name;\n const start = token.start + lead(previous.value).length;\n const withMention = previous.value.slice(0, token.start) + lead(previous.value) + name + \" \" + previous.value.slice(token.end);\n edit(withMention, [\n ...reconcileChatMentions(previous.value, withMention, previous.mentions),\n { start, end: start + name.length, attachment: result.mention },\n ]);\n setDismissed(true);\n mentioned = { value: withMention, caret: start + name.length + 1 };\n showCommandStatus();\n } else {\n // The pick is lost; say so, also when the draft moved to another key meanwhile (such as a new chat saved\n // while the dialog was open), so it never ends in silence.\n showCommandStatus({ tone: \"error\", text: chatMessages().commandDraftChanged });\n }\n } else if (result) {\n showCommandStatus({ tone: \"done\", text: result.done });\n }\n } catch (error) {\n submitRequested = false;\n restore();\n // An unmounted composer has no status line left; the app's error channel keeps the failure from going silent.\n if (disposed) props.onError?.(error);\n else\n showCommandStatus({ tone: \"error\", text: error instanceof Error && error.message ? error.message : chatMessages().commandFailed });\n } finally {\n if (commandStatus()?.tone === \"busy\") showCommandStatus();\n setExecuting(false);\n }\n if (submitRequested && props.draftKey === key) await submit();\n queueMicrotask(() => {\n if (props.draftKey !== key) return;\n if (restored || props.value === nextValue || (mentioned && props.value === mentioned.value)) {\n const position = restored ? token.end : (mentioned?.caret ?? token.start + replacement.length);\n textareaRef?.setSelectionRange(\n restored && addSelection ? addSelection.start : position,\n restored && addSelection ? addSelection.end : position,\n );\n }\n syncCaret();\n autoResize();\n focus();\n });\n };\n\n /**\n * Runs an `open` row with the token and the list in place. Success removes the token in one undo step; `failed`\n * stays in the row while the list is still there, otherwise the status line says it, so it never ends in silence.\n */\n const openFromCommand = async (command: ChatCommand, open: NonNullable<ChatCommand[\"open\"]>, token: { start: number; end: number }) => {\n const key = props.draftKey;\n const row = chatCommandKey(command);\n const value = props.value;\n const nextValue = value.slice(0, token.start) + value.slice(token.end);\n const nextMentions = reconcileChatMentions(value, nextValue, mentions());\n // Still the same draft and `/…`, so the row is where the person chose it.\n const inPlace = () => !disposed && props.draftKey === key && props.value === value && commandQuery()?.start === token.start;\n const heldHistory = commandSheetHeld();\n // Closing the list or leaving the composer cancels the opening; the row ends at once, without waiting for it.\n const controller = new AbortController();\n const run = { controller, key, label: command.busyLabel ?? chatMessages().commandOpening, follow: false, moved: false };\n openingRun = run;\n const cancelled = new Promise<\"cancelled\">((resolve) =>\n controller.signal.addEventListener(\"abort\", () => resolve(\"cancelled\"), { once: true }),\n );\n setOpenFailures(({ [row]: _, ...rest }) => rest);\n setOpeningRow(row);\n setExecuting(true);\n // An opening that ends without leaving, by failure, rejection or cancelling, also aborts `signal`, so the opener\n // can put back what it saved without the token.\n const finish = (left = false) => {\n if (!left) controller.abort();\n if (openingRun === run) openingRun = undefined;\n if (commandStatus()?.tone === \"busy\") showCommandStatus();\n setOpeningRow(undefined);\n setExecuting(false);\n };\n let result: ChatCommandOpenResult;\n try {\n if (heldHistory) {\n await dialogHistorySettled();\n if (!inPlace()) {\n finish();\n return;\n }\n }\n result = await Promise.race([\n open({ value: nextValue, mentions: nextMentions }, controller.signal, () => {\n run.follow = true;\n }),\n cancelled,\n ]);\n } catch (error) {\n finish();\n if (disposed) {\n props.onError?.(error);\n return;\n }\n if (inPlace()) closeCommandList();\n showCommandStatus({ tone: \"error\", text: error instanceof Error && error.message ? error.message : chatMessages().commandFailed });\n return;\n }\n if (!result) {\n // Success: the token leaves and the list closes in the same step that ends the opening, so a phone sheet never\n // takes its Back entry again while the page navigates.\n batch(() => {\n if (!disposed && props.draftKey === key && props.value === value) {\n edit(nextValue, nextMentions);\n setDismissed(true);\n }\n endAddSearch(!disposed && props.draftKey === key);\n finish(true);\n });\n queueMicrotask(() => {\n if (disposed || props.draftKey !== key || props.value !== nextValue) return;\n textareaRef?.setSelectionRange(token.start, token.start);\n syncCaret();\n autoResize();\n });\n return;\n }\n finish();\n if (result === \"cancelled\") return;\n if (inPlace()) {\n setOpenFailures((failures) => ({ ...failures, [row]: result.failed }));\n setAnnouncement({ text: result.failed });\n } else if (disposed) props.onError?.(new Error(result.failed));\n else showCommandStatus({ tone: \"error\", text: result.failed });\n };\n\n /** Replaces `start`–`end` with the emoji through the editing path, so the browser's undo restores the shortcode. */\n const insertEmoji = (start: number, end: number, emoji: string) => {\n if (!textareaRef || editBlocked()) return;\n replaceTextareaRange(textareaRef, start, end, emoji);\n syncCaret();\n reportChatFailure(() => props.emoji?.onPick?.(emoji), props.onError);\n };\n /** Replaces `@query` with \"@Name\" as a mention and a space, as one edit the person can undo. */\n const pickPersonSuggestion = (position: number) => {\n const token = peopleQuery();\n const person = peopleMatches()[position];\n if (!token || !person || !textareaRef || editBlocked()) return;\n const text = `@${person.name}`;\n const nextValue = `${props.value.slice(0, token.start)}${text} ${props.value.slice(token.end)}`;\n const nextMentions = reconcileChatMentions(props.value, nextValue, mentions());\n nextMentions.push({\n start: token.start,\n end: token.start + text.length,\n attachment: { id: person.id, name: text, kind: \"resource\", icon: person.agent ? \"ti ti-robot\" : \"ti ti-user\" },\n });\n edit(nextValue, nextMentions);\n setPeopleMatches([]);\n const after = token.start + text.length + 1;\n queueMicrotask(() => {\n textareaRef?.setSelectionRange(after, after);\n syncCaret();\n });\n };\n const pickEmojiSuggestion = (position: number) => {\n const token = emojiQuery();\n const entry = emojiMatches()[position];\n if (!token || !entry) return;\n insertEmoji(token.start, token.end, emojiInTone(entry, props.emoji?.skinTone ?? 0));\n };\n /**\n * A typed colon loads the emoji data, and the closing colon of a known `:shortcode:` turns it into its emoji. A\n * shortcode closed before the data arrived turns when it arrives, as long as nothing changed in the meantime.\n */\n const completeShortcode = () => {\n const textarea = textareaRef;\n if (!props.emoji || !textarea) return;\n const { value, selectionStart: caret } = textarea;\n const completed = completedEmojiShortcode(value, caret);\n const convert = (index: EmojiIndex) => {\n const entry = completed && index.byShortcode.get(completed.shortcode.toLowerCase());\n if (completed && entry) insertEmoji(completed.start, completed.end, emojiInTone(entry, props.emoji?.skinTone ?? 0));\n };\n const index = emojiIndex();\n if (index) {\n convert(index);\n return;\n }\n loadEmojiIndex().then(\n (loaded) => {\n setEmojiIndex(loaded);\n const untouched = textarea.value === value && textarea.selectionStart === caret && textarea.selectionEnd === caret;\n if (untouched && textarea.matches(\":focus\")) convert(loaded);\n },\n () => undefined,\n );\n };\n\n /** Moving through and choosing in the command list, from the field or from the search field opened by \"+\". */\n const commandListKey = (event: KeyboardEvent): boolean => {\n if (!commandsOpen()) return false;\n const matches = commandMatches();\n if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n const index = matches.indexOf(selectedCommand()!);\n const next = matches[nextChatCommandIndex(index, matches.length, event.key === \"ArrowUp\" ? -1 : 1)];\n setActiveCommandKey(next ? chatCommandKey(next) : undefined);\n setCommandMoved(true);\n setAnnouncement(undefined);\n return true;\n }\n // Ctrl/⌘+Enter sends, also while suggestions are open.\n const plain = !event.shiftKey && !event.altKey && !event.ctrlKey && !event.metaKey;\n if (plain && (event.key === \"Tab\" || event.key === \"Enter\") && matches.length > 0) {\n event.preventDefault();\n const command = selectedCommand();\n // A server row answering an earlier query may no longer match; wait for fresh results. Local rows match now.\n const row = commandModel().rows.find((row) => chatCommandKey(row.command) === selectedCommandKey());\n const staleServerRow =\n row?.server && (searchResultsQuery() !== commandQuery()?.query || searchResultsScope() !== parsedCommandQuery().scope?.id);\n if (staleServerRow) return true;\n if (command) void executeCommand(command, event.key === \"Tab\");\n return true;\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n closeCommandList();\n return true;\n }\n return false;\n };\n\n const onAddSearchKeyDown = (event: KeyboardEvent) => {\n // Nothing chooses while an input method composes, as in the field.\n if (event.isComposing || event.keyCode === 229 || addComposing) return;\n if (event.key === \"Escape\" && openingRun) {\n event.preventDefault();\n openingRun.controller.abort();\n endAddSearch(true);\n return;\n }\n if (commandListKey(event)) return;\n // Ctrl/⌘+Enter sends from the search field as from the field, with the list closed first.\n if (event.key === \"Enter\" && (event.ctrlKey || event.metaKey) && !event.shiftKey && !event.altKey) {\n event.preventDefault();\n endAddSearch(true);\n void submit();\n }\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n // WebKit ends the composition before the keydown of the Enter that confirms it; that keydown keeps keyCode 229.\n if (event.isComposing || event.keyCode === 229 || composing()) return;\n // Escape cancels a running `open` row, also once its list is gone because the draft moved to a new chat.\n if (event.key === \"Escape\" && openingRun) {\n event.preventDefault();\n openingRun.controller.abort();\n if (commandsOpen()) closeCommandList();\n return;\n }\n if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === \"z\") {\n event.preventDefault();\n restoreHistory(event.shiftKey ? 1 : -1);\n return;\n }\n if (emojiOpen() || peopleOpen()) {\n const count = emojiOpen() ? emojiMatches().length : peopleMatches().length;\n if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n setSelectedCommandIndex((index) => nextChatCommandIndex(index, count, event.key === \"ArrowUp\" ? -1 : 1));\n return;\n }\n // Only a plain Enter or Tab picks: Shift+Enter still breaks the line, Shift+Tab still moves the focus back.\n const plain = !event.shiftKey && !event.altKey && !event.ctrlKey && !event.metaKey;\n if (plain && (event.key === \"Enter\" || event.key === \"Tab\")) {\n event.preventDefault();\n if (emojiOpen()) pickEmojiSuggestion(selectedCommandIndex());\n else pickPersonSuggestion(selectedCommandIndex());\n return;\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n setDismissed(true);\n return;\n }\n }\n if (commandListKey(event)) return;\n const format = props.formatting && textareaRef ? formatShortcut(event) : undefined;\n if (format && textareaRef) {\n event.preventDefault();\n if (editBlocked()) return;\n format.run(textareaRef);\n return;\n }\n if (event.key !== \"Enter\") return;\n if (conversation()) {\n const action = conversationEnterAction(event, {\n sendKey: props.sendKey ?? \"enter\",\n touchOnly: isTouchOnly(),\n inCodeBlock: openCodeFence(props.value, textareaRef?.selectionStart ?? props.value.length) !== null,\n });\n if (action === \"send\") {\n event.preventDefault();\n void submit();\n }\n return;\n }\n const send = props.sendKey === \"mod-enter\" ? event.ctrlKey || event.metaKey : !event.shiftKey;\n if (send && !event.isComposing) {\n event.preventDefault();\n void submit();\n }\n };\n\n const insertText = (text: string) => {\n if (!textareaRef || editBlocked()) return;\n replaceTextareaRange(textareaRef, textareaRef.selectionStart, textareaRef.selectionEnd, text);\n };\n\n let holdTimer: ReturnType<typeof setTimeout> | undefined;\n let held = false;\n const releaseHold = () => {\n clearTimeout(holdTimer);\n holdTimer = undefined;\n };\n onCleanup(releaseHold);\n const microphoneDisabled = () => Boolean(props.microphone?.disabled || blocked() || dictation() === \"refining\");\n const microphoneItems = (): readonly DropdownItemData[] => {\n const microphone = props.microphone;\n const items: DropdownItemData[] = [];\n if (microphone?.onDictate) {\n const dictate = microphone.onDictate;\n items.push({ icon: \"ti ti-microphone\", label: chatMessages().dictate, action: () => reportChatFailure(dictate, props.onError) });\n }\n if (microphone?.onVoiceMessage) {\n const record = microphone.onVoiceMessage;\n items.push({\n icon: \"ti ti-player-record\",\n label: chatMessages().recordVoiceMessage,\n action: () => reportChatFailure(record, props.onError),\n });\n }\n return items;\n };\n const dictationStatus = (): { icon: string; text: string } | null => {\n switch (dictation()) {\n case \"listening\":\n return { icon: \"ti ti-microphone\", text: chatMessages().dictationListening };\n case \"refining\":\n return { icon: \"ti ti-loader-2 k2b-spin\", text: chatMessages().dictationRefining };\n case \"refined\":\n return { icon: \"ti ti-sparkles\", text: chatMessages().dictationRefined };\n case \"unrefined\":\n return { icon: \"ti ti-microphone\", text: chatMessages().dictationUnrefined };\n case \"interrupted\":\n return { icon: \"ti ti-alert-triangle\", text: chatMessages().dictationInterrupted };\n default:\n return null;\n }\n };\n\n const fileInput = () => (\n <Show when={props.fileSelection}>\n <input\n ref={fileInputRef}\n class=\"k2b-sr-only\"\n type=\"file\"\n tabIndex={-1}\n aria-hidden=\"true\"\n accept={props.fileSelection?.accept}\n multiple={props.fileSelection?.multiple ?? true}\n onChange={(event) => {\n if (event.currentTarget.files?.length) void runFiles(event.currentTarget.files);\n }}\n />\n </Show>\n );\n\n const addMenu = (icon: string, extraClass = \"\") => (\n <Dropdown.Root position=\"top-right\" label={chatMessages().addToChat} items={menuItems()} disabled={blocked()}>\n <Dropdown.Trigger\n appearance=\"plain\"\n class={`k2b-chat-composer__icon-action${extraClass}`}\n data-chat-composer-add=\"\"\n label={chatMessages().addToChat}\n tooltip={chatMessages().addToChat}\n >\n <i class={icon} aria-hidden=\"true\" />\n </Dropdown.Trigger>\n </Dropdown.Root>\n );\n\n /** \"+\" as the way to the slash list on keyboards without a handy \"/\". */\n const addSearchButton = (extraClass = \"\") => (\n <Tooltip.Trigger\n ref={addButtonRef}\n type=\"button\"\n class={`k2b-chat-composer__icon-action${extraClass}`}\n aria-label={chatMessages().addMenu}\n aria-haspopup=\"listbox\"\n aria-expanded={addSearch() !== undefined}\n aria-controls={addSearch() ? commandListId : undefined}\n content={chatMessages().addMenu}\n disabled={blocked()}\n // The field keeps its focus and selection until the search field takes over, and a phone its keyboard.\n onMouseDown={keepFieldFocus}\n onClick={toggleAddSearch}\n >\n <i class={addingFiles() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-plus\"} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n );\n\n /** The conversation's attach button opens the file choice directly; other actions turn it into the add menu. */\n const attachControl = () => (\n <Show when={!addOpensCommands()} fallback={addSearchButton(\" k2b-chat-composer__attach\")}>\n {attachChoice()}\n </Show>\n );\n const attachChoice = () => (\n <Show\n when={props.menuActions?.length}\n fallback={\n <Show when={props.fileSelection}>\n {(selection) => (\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action k2b-chat-composer__attach\"\n aria-label={selection().label ?? chatMessages().attachFiles}\n content={selection().label ?? chatMessages().attachFiles}\n disabled={!canSelectFiles()}\n onClick={() => chooseFiles()}\n >\n <i class={addingFiles() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-plus\"} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n )}\n </Show>\n }\n >\n {addMenu(\"ti ti-plus\", \" k2b-chat-composer__attach\")}\n </Show>\n );\n\n const formatToggle = () => (\n <Show when={props.formatting}>\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action k2b-chat-composer__format-toggle\"\n aria-label={chatMessages().composerFormatting}\n aria-pressed={formattingOpen()}\n aria-controls={formattingOpen() ? formatGroupId : undefined}\n content={chatMessages().composerFormatting}\n onMouseDown={keepFieldFocus}\n onClick={() => setFormattingOpen((open) => !open)}\n >\n <i class=\"ti ti-letter-case\" aria-hidden=\"true\" />\n </Tooltip.Trigger>\n </Show>\n );\n\n /** One row of fixed height. It shows every button at once, also on a phone, so nothing hides behind a scroll. */\n const formatRow = () => (\n <Show when={props.formatting && formattingOpen()}>\n <div id={formatGroupId} class=\"k2b-chat-composer__format\" role=\"group\" aria-label={chatMessages().composerFormatting}>\n <For each={formatTools}>\n {(tool) => (\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action\"\n aria-label={tool.label(markdownToolbarMessages())}\n content={tool.label(markdownToolbarMessages())}\n disabled={editBlocked()}\n onMouseDown={keepFieldFocus}\n onClick={() => {\n if (textareaRef) tool.run(textareaRef);\n }}\n >\n <i class={tool.icon} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n )}\n </For>\n </div>\n </Show>\n );\n\n const emojiButton = () => (\n <Show when={props.emoji}>\n {(emoji) => (\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action k2b-chat-composer__emoji\"\n aria-label={chatMessages().insertEmoji}\n content={chatMessages().insertEmoji}\n disabled={editBlocked()}\n onMouseDown={keepFieldFocus}\n onClick={(event) => {\n const anchor = event.currentTarget;\n reportChatFailure(() => emoji().onOpen({ anchor, insert: insertText }), props.onError);\n }}\n >\n <i class=\"ti ti-mood-smile\" aria-hidden=\"true\" />\n </Tooltip.Trigger>\n )}\n </Show>\n );\n\n const microphoneControl = () => (\n <Show when={props.microphone?.onDictate || props.microphone?.onVoiceMessage ? props.microphone : undefined}>\n {(microphone) => (\n <div ref={microphoneRef} class=\"k2b-chat-composer__microphone\">\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action k2b-chat-composer__microphone-button\"\n data-state={dictation() ?? undefined}\n disabled={microphoneDisabled()}\n aria-pressed={microphone().onDictate ? dictation() === \"listening\" : undefined}\n aria-haspopup={microphone().onDictate ? undefined : \"menu\"}\n aria-expanded={microphone().onDictate ? undefined : microphoneMenuOpen()}\n // A toggle keeps its name; the pressed state says that dictation runs.\n aria-label={microphone().onDictate ? chatMessages().dictate : chatMessages().recordVoiceMessage}\n content={\n dictation() === \"listening\"\n ? chatMessages().stopDictation\n : microphone().onDictate\n ? microphone().onVoiceMessage\n ? chatMessages().dictateOrHold\n : chatMessages().dictate\n : chatMessages().recordVoiceMessage\n }\n onMouseDown={keepFieldFocus}\n onContextMenu={(event) => event.preventDefault()}\n onPointerDown={(event) => {\n held = false;\n releaseHold();\n const record = microphone().onVoiceMessage;\n if (event.button !== 0 || !record || dictation() === \"listening\") return;\n holdTimer = setTimeout(() => {\n // The composer may have become blocked, or recording withdrawn, during the press.\n const current = props.microphone?.onVoiceMessage;\n if (!current || microphoneDisabled()) return;\n held = true;\n reportChatFailure(current, props.onError);\n }, microphoneHoldMs);\n }}\n onPointerUp={releaseHold}\n onPointerCancel={releaseHold}\n onPointerLeave={releaseHold}\n onClick={(event) => {\n // A press that already asked for a voice message ends here; a key press never holds.\n if (held) {\n held = false;\n if (event.detail > 0) return;\n }\n const dictate = microphone().onDictate;\n if (dictate) {\n reportChatFailure(dictate, props.onError);\n return;\n }\n setMicrophoneMenuOpen(true);\n // From the keyboard it opens the menu like a menu button: the focus moves to the first item.\n if (event.detail === 0) {\n queueMicrotask(() => microphoneRef?.querySelector<HTMLElement>('[role=\"menuitem\"]:not(:disabled)')?.focus());\n }\n }}\n >\n <i\n class={\n dictation() === \"listening\"\n ? \"ti ti-player-stop\"\n : dictation() === \"refining\"\n ? \"ti ti-loader-2 k2b-spin\"\n : \"ti ti-microphone\"\n }\n aria-hidden=\"true\"\n />\n </Tooltip.Trigger>\n <Show when={microphone().onVoiceMessage}>\n <Dropdown.Root\n position=\"top-left\"\n label={chatMessages().microphoneOptions}\n items={microphoneItems()}\n disabled={microphoneDisabled()}\n open={microphoneMenuOpen()}\n onOpenChange={setMicrophoneMenuOpen}\n >\n <Dropdown.Trigger\n appearance=\"plain\"\n class=\"k2b-chat-composer__icon-action k2b-chat-composer__microphone-menu\"\n label={chatMessages().microphoneOptions}\n tooltip={chatMessages().microphoneOptions}\n >\n <i class=\"ti ti-chevron-up\" aria-hidden=\"true\" />\n </Dropdown.Trigger>\n </Dropdown.Root>\n </Show>\n </div>\n )}\n </Show>\n );\n\n const sendControl = () => (\n <Show\n when={running() && !hasDraft() && props.onStop}\n fallback={\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__send\"\n disabled={!canSubmit()}\n onMouseDown={(event) => {\n if (conversation()) keepFieldFocus(event);\n }}\n aria-label={\n submitting()\n ? running()\n ? runningSubmitIntent() === \"queue\"\n ? chatMessages().queueing\n : chatMessages().steering\n : chatMessages().sending\n : running()\n ? runningSubmitIntent() === \"queue\"\n ? chatMessages().queueMessage\n : chatMessages().steerResponse\n : chatMessages().sendMessage\n }\n content={\n running()\n ? runningSubmitIntent() === \"queue\"\n ? chatMessages().queueMessage\n : chatMessages().steerResponse\n : chatMessages().sendMessage\n }\n onClick={() => void submit()}\n >\n <i class={submitting() ? \"ti ti-loader-2 k2b-spin\" : conversation() ? \"ti ti-send\" : \"ti ti-arrow-up\"} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n }\n >\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__stop\"\n disabled={stopping()}\n aria-label={stopping() ? chatMessages().stopping : chatMessages().stopResponse}\n content={chatMessages().stopResponse}\n onClick={() => reportChatFailure(() => props.onStop?.(), props.onError)}\n >\n <i class={stopping() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-player-stop\"} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n </Show>\n );\n\n const field = () => (\n <div class=\"k2b-chat-composer__input\" role=\"group\" aria-label={chatMessages().messageInput}>\n <Show when={mentions().length > 0}>\n <div ref={highlightRef} class=\"k2b-chat-composer__highlight\" aria-hidden=\"true\">\n <For each={chatMentionSegments(props.value, mentions())}>\n {(part) => <span classList={{ \"k2b-chat-composer__mention\": Boolean(part.mention) }}>{part.text}</span>}\n </For>\n {\"\\n\"}\n </div>\n </Show>\n {/* biome-ignore lint/a11y/useAriaPropsSupportedByRole: popup attributes are conditional with the combobox role */}\n <textarea\n ref={textareaRef}\n classList={{ \"k2b-chat-composer__textarea--highlighted\": mentions().length > 0 }}\n rows={1}\n value={props.value}\n // An `open` row keeps the field focused, so the list stays, and only read-only while it runs.\n disabled={editBlocked() && openingRow() === undefined}\n readOnly={openingRow() !== undefined}\n enterkeyhint={conversation() ? \"enter\" : undefined}\n placeholder={\n props.placeholder ??\n (running() ? chatMessages().addGuidance : conversation() ? chatMessages().writeConversationMessage : chatMessages().writeMessage)\n }\n aria-label={props.inputLabel ?? messages().message}\n // A list opened from \"+\" belongs to its search field.\n role={fieldOwnsList() ? \"combobox\" : undefined}\n aria-autocomplete={fieldOwnsList() ? \"list\" : undefined}\n aria-controls={fieldOwnsList() ? commandListId : undefined}\n aria-expanded={fieldOwnsList() ? \"true\" : undefined}\n aria-activedescendant={\n !fieldOwnsList()\n ? undefined\n : emojiOpen() || peopleOpen()\n ? `${commandListId}-${selectedCommandIndex()}`\n : selectedCommand()\n ? commandOptionId(selectedCommand()!)\n : undefined\n }\n onInput={(event) => {\n batch(() => {\n edit(event.currentTarget.value);\n syncCaret();\n });\n autoResize();\n const input = event as InputEvent;\n if (input.inputType === \"insertText\" && input.data === \":\") queueMicrotask(completeShortcode);\n }}\n onPaste={(event) => {\n // Read-only while an `open` row runs: nothing may join the draft after it was saved.\n if (editBlocked()) {\n event.preventDefault();\n return;\n }\n const clipboardData = event.clipboardData;\n if (canSelectFiles() && clipboardData?.files.length) {\n event.preventDefault();\n void runFiles(clipboardData.files);\n return;\n }\n props.onPaste?.(event);\n }}\n onSelect={syncCaret}\n onBlur={() => setDismissed(true)}\n onClick={() => {\n setDismissed(false);\n syncCaret();\n }}\n onKeyUp={syncCaret}\n onCompositionStart={() => setComposing(true)}\n onCompositionEnd={() => {\n setComposing(false);\n syncCaret();\n }}\n onScroll={() => {\n if (highlightRef && textareaRef) highlightRef.scrollTop = textareaRef.scrollTop;\n }}\n onBeforeInput={(event) => {\n inputStart = event.currentTarget.selectionStart;\n inputEnd = event.currentTarget.selectionEnd;\n if (event.inputType === \"historyUndo\" || event.inputType === \"historyRedo\") {\n event.preventDefault();\n restoreHistory(event.inputType === \"historyUndo\" ? -1 : 1);\n }\n }}\n onKeyDown={onKeyDown}\n />\n <Show when={conversation()}>\n <textarea ref={measureRef} class=\"k2b-chat-composer__measure\" rows={1} tabIndex={-1} aria-hidden=\"true\" readOnly />\n </Show>\n </div>\n );\n\n // A press on a row remembers its command. The host can rebuild the list, or the whole menu, between press and release;\n // the browser then sends the click to a common ancestor (#2140). A release on the same command's new row runs it.\n let pressedCommand: { key: string; row: HTMLElement } | undefined;\n onMount(() => {\n const release = (event: PointerEvent) => {\n const pressed = pressedCommand;\n pressedCommand = undefined;\n if (!pressed || pressed.row.isConnected || event.type !== \"pointerup\") return;\n const under = document.elementFromPoint(event.clientX, event.clientY)?.closest<HTMLElement>(\"[data-command-key]\");\n if (!under || under.dataset.commandKey !== pressed.key || !shellRef?.contains(under)) return;\n const command = commandRowMap().get(pressed.key)?.command;\n if (command) void executeCommand(command);\n };\n window.addEventListener(\"pointerup\", release, true);\n window.addEventListener(\"pointercancel\", release, true);\n onCleanup(() => {\n window.removeEventListener(\"pointerup\", release, true);\n window.removeEventListener(\"pointercancel\", release, true);\n });\n });\n // Rows are keyed by the command's key, not its object: hosts rebuild their command objects whenever their inputs change,\n // and a row replaced between the press and the release would swallow the click (#2140).\n const commandRowMap = createMemo(() => new Map(commandModel().rows.map((row) => [chatCommandKey(row.command), row])));\n const commandGroupKey = (group: ReturnType<typeof commandModel>[\"groups\"][number]) =>\n group.scopeTitle ? \"scope\" : group.section ? `section:${group.section.id}` : \"flat\";\n const renderCommandRow = (initial: ChatCommand) => {\n const key = chatCommandKey(initial);\n const command = () => commandRowMap().get(key)?.command ?? initial;\n const highlight = () => commandRowMap().get(key)?.highlight;\n const title = () => command().label ?? command().name;\n const opening = () => openingRow() === key;\n const failure = () => openFailures()[key];\n return (\n <button\n class=\"k2b-chat-composer__command\"\n id={commandOptionId(command())}\n type=\"button\"\n role=\"option\"\n tabIndex={-1}\n aria-selected={selectedCommandKey() === key}\n aria-disabled={Boolean(command().disabled || command().reason)}\n aria-busy={opening() ? \"true\" : undefined}\n aria-describedby={command().reason ? `${commandOptionId(command())}-reason` : undefined}\n data-reason={command().reason ? \"true\" : undefined}\n data-active={selectedCommandKey() === key ? \"true\" : undefined}\n data-command-key={key}\n onPointerDown={(event) => {\n pressedCommand = { key, row: event.currentTarget };\n }}\n onMouseDown={keepFieldFocus}\n onClick={(event) => {\n event.preventDefault();\n void executeCommand(command());\n }}\n >\n <i class={command().icon ?? \"ti ti-slash\"} aria-hidden=\"true\" />\n <span class=\"k2b-chat-composer__command-text\">\n <strong>\n <Show when={highlight()} fallback={title()}>\n {(range) => (\n <>\n {title().slice(0, range()[0])}\n <b>{title().slice(range()[0], range()[1])}</b>\n {title().slice(range()[1])}\n </>\n )}\n </Show>\n </strong>\n <Show\n when={command().open && !command().reason}\n fallback={\n <Show when={command().reason ?? command().description}>\n <small id={command().reason ? `${commandOptionId(command())}-reason` : undefined}>\n {command().reason ?? command().description}\n </small>\n </Show>\n }\n >\n {/* The busy line shares the description's place, so the row keeps its height while it opens. */}\n <span class=\"k2b-chat-composer__command-detail\" data-state={opening() ? \"busy\" : failure() ? \"failed\" : undefined}>\n <small aria-hidden={opening() ? \"true\" : undefined}>{failure() ?? command().description}</small>\n <small aria-hidden={opening() ? undefined : \"true\"}>\n <i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />\n {command().busyLabel ?? chatMessages().commandOpening}\n </small>\n </span>\n </Show>\n </span>\n <Show when={command().selected}>\n <span class=\"k2b-chat-composer__command-end\">\n <i class=\"ti ti-check\" aria-hidden=\"true\" />\n <span class=\"k2b-sr-only\">{chatMessages().commandSelected}</span>\n </span>\n </Show>\n </button>\n );\n };\n const replyQuote = (reply: ChatComposerReply) => (\n <>\n <span class=\"k2b-message-row__quote-author\">\n <span class=\"k2b-sr-only\">{chatMessages().replyingTo} </span>\n {reply.author}\n </span>\n <span class=\"k2b-message-row__quote-text\">{reply.text}</span>\n </>\n );\n return (\n <div ref={shellRef} class=\"k2b-chat-composer-shell\">\n <Show when={suggestionsOpen() || hasAccessory()}>\n {/* Suggestions alone float above the composer; a row of the shell's grid would add its gap and move the composer. */}\n <div class=\"k2b-chat-composer-slot\" data-overlay={hasAccessory() ? undefined : \"true\"}>\n <div style={{ visibility: suggestionsOpen() ? \"hidden\" : undefined }} inert={suggestionsOpen()}>\n {accessory()}\n </div>\n <Show when={emojiOpen()}>\n <div class=\"k2b-chat-composer-accessory\">\n <div\n ref={commandListRef}\n id={commandListId}\n class=\"k2b-chat-composer__commands\"\n role=\"listbox\"\n aria-label={chatMessages().emojiSuggestions}\n >\n <For each={emojiMatches()}>\n {(entry, index) => (\n <button\n id={`${commandListId}-${index()}`}\n type=\"button\"\n role=\"option\"\n tabIndex={-1}\n aria-selected={index() === selectedCommandIndex()}\n aria-label={emojiName(entry, locale())}\n data-active={index() === selectedCommandIndex() ? \"true\" : undefined}\n onMouseDown={keepFieldFocus}\n onClick={() => pickEmojiSuggestion(index())}\n >\n <span class=\"k2b-chat-composer__emoji-glyph\" aria-hidden=\"true\">\n {emojiInTone(entry, props.emoji?.skinTone ?? 0)}\n </span>\n <strong>{emojiName(entry, locale())}</strong>\n <Show when={entry.shortcodes[0]}>{(code) => <small>:{code()}:</small>}</Show>\n </button>\n )}\n </For>\n </div>\n </div>\n </Show>\n <Show when={peopleOpen()}>\n <div class=\"k2b-chat-composer-accessory\">\n <div\n ref={commandListRef}\n id={commandListId}\n class=\"k2b-chat-composer__commands\"\n role=\"listbox\"\n aria-label={chatMessages().peopleSuggestions}\n >\n <For each={peopleMatches()}>\n {(person, index) => (\n <button\n id={`${commandListId}-${index()}`}\n type=\"button\"\n role=\"option\"\n tabIndex={-1}\n aria-selected={index() === selectedCommandIndex()}\n data-active={index() === selectedCommandIndex() ? \"true\" : undefined}\n onMouseDown={keepFieldFocus}\n onClick={() => pickPersonSuggestion(index())}\n >\n <i class={person.agent ? \"ti ti-robot\" : \"ti ti-user\"} aria-hidden=\"true\" />\n <strong>{person.name}</strong>\n <Show when={person.agent}>\n <small>{chatMessages().agentLabel}</small>\n </Show>\n </button>\n )}\n </For>\n </div>\n </div>\n </Show>\n <Show when={commandsOpen()}>\n {/* biome-ignore lint/a11y/noStaticElementInteractions: the search field inside is the keyboard target; a press elsewhere in the panel only keeps the focus there. */}\n <div\n class=\"k2b-chat-composer-accessory\"\n data-commands=\"\"\n data-search={addSearch() ? \"\" : undefined}\n onMouseDown={(event) => {\n if (addSearch() && event.target !== addSearchRef) event.preventDefault();\n }}\n >\n <Show when={addSearch()}>\n <label class=\"k2b-chat-composer__command-search\">\n <i class=\"ti ti-search\" aria-hidden=\"true\" />\n <input\n ref={addSearchRef}\n type=\"text\"\n role=\"combobox\"\n value={addQuery()}\n placeholder={chatMessages().commandSearch}\n aria-label={chatMessages().commandSearchLabel}\n aria-autocomplete=\"list\"\n aria-controls={commandListId}\n aria-expanded=\"true\"\n aria-activedescendant={selectedCommand() ? commandOptionId(selectedCommand()!) : undefined}\n autocomplete=\"off\"\n autocapitalize=\"off\"\n spellcheck={false}\n // Read-only while an `open` row runs, as the field is.\n readOnly={openingRow() !== undefined}\n onInput={(event) => setAddQuery(event.currentTarget.value)}\n onKeyDown={onAddSearchKeyDown}\n onCompositionStart={() => {\n addComposing = true;\n }}\n onCompositionEnd={() => {\n addComposing = false;\n }}\n onFocusOut={(event) => {\n const next = event.relatedTarget;\n if (next instanceof Node && commandListRef?.parentElement?.contains(next)) return;\n // Focus that leaves another way, such as with Shift+Tab, closes the list and stays where it went.\n queueMicrotask(() => {\n if (addSearch() && document.activeElement !== addSearchRef) endAddSearch(false);\n });\n }}\n />\n </label>\n </Show>\n <div\n ref={commandListRef}\n id={commandListId}\n class=\"k2b-chat-composer__commands\"\n role=\"listbox\"\n aria-label={chatMessages().commands}\n aria-busy={searching() ? \"true\" : undefined}\n >\n <For each={commandModel().groups.map(commandGroupKey)}>\n {(key) => {\n const group = createMemo(() => commandModel().groups.find((group) => commandGroupKey(group) === key));\n const headingId = () =>\n `${commandListId}-g-${key === \"scope\" ? \"scope\" : props.commandSections?.findIndex((section) => section.id === group()?.section?.id)}`;\n const rows = () => group()?.rows.map((row) => chatCommandKey(row.command)) ?? [];\n const row = (key: string) => commandRowMap().get(key)!.command;\n return (\n <Show when={key !== \"flat\"} fallback={<For each={rows()}>{(key) => renderCommandRow(row(key))}</For>}>\n <div class=\"k2b-chat-composer__command-group\" role=\"group\" aria-labelledby={headingId()}>\n <div class=\"k2b-chat-composer__command-heading\" id={headingId()} role=\"presentation\">\n <span>{group()?.scopeTitle ?? group()?.section?.label}</span>\n <Show when={group()?.loading}>\n <i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />\n </Show>\n </div>\n <For each={rows()}>{(key) => renderCommandRow(row(key))}</For>\n <Index each={Array.from({ length: Math.max(group()?.placeholder ? 1 : 0, group()?.pendingRows ?? 0) })}>\n {() => (\n <div class=\"k2b-chat-composer__command-placeholder\" aria-hidden=\"true\">\n <span />\n <span>\n <span />\n <span />\n </span>\n </div>\n )}\n </Index>\n </div>\n </Show>\n );\n }}\n </For>\n <Show\n when={\n searching() && foundCommandCount() === 0 && !commandModel().groups.some((group) => group.section || group.scopeTitle)\n }\n >\n <div role=\"status\" class=\"k2b-chat-composer__loading\">\n <i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />\n <strong>{messages().loading}</strong>\n </div>\n </Show>\n <Show when={searchError()}>\n <div role=\"status\">\n <i class=\"ti ti-alert-circle\" /> {messages().error}\n </div>\n </Show>\n <Show\n when={\n !searching() && !searchError() && foundCommandCount() === 0 && !commandModel().groups.some((group) => group.pendingRows)\n }\n >\n <div role=\"status\">\n {!parsedCommandQuery().query.trim()\n ? messages().noResults\n : chatMessages().commandsNothingFound({ query: parsedCommandQuery().query.trim() })}\n </div>\n </Show>\n {/* After \"Nothing found\", so the way to search further stays in the last place. */}\n {/* Keyed: the row is built anew from each query, and its title says the query. */}\n <Show when={commandModel().fallback?.command} keyed>\n {(command) => renderCommandRow(command)}\n </Show>\n </div>\n </div>\n </Show>\n </div>\n </Show>\n <section\n ref={composerRef}\n class={`k2b-chat-composer ${props.class ?? \"\"}`}\n data-running={running() ? \"true\" : undefined}\n data-variant={conversation() ? \"conversation\" : undefined}\n role=\"group\"\n aria-label={props.label ?? chatMessages().messageComposer}\n >\n <Show when={showHint()}>\n <div class=\"k2b-chat-composer__hint\" aria-live=\"polite\">\n <Show when={dictationStatus()} fallback={<span class=\"k2b-chat-composer__hint-text\">{hint()}</span>}>\n {(status) => (\n <>\n <span class=\"k2b-chat-composer__dictation\" data-state={dictation() ?? undefined}>\n <i class={status().icon} aria-hidden=\"true\" />\n <span>{status().text}</span>\n </span>\n <Show when={dictation() === \"refined\" ? props.microphone?.onRestoreOriginal : undefined}>\n {(restore) => (\n <button\n type=\"button\"\n class=\"k2b-chat-composer__hint-action\"\n disabled={microphoneDisabled()}\n onMouseDown={keepFieldFocus}\n onClick={() => reportChatFailure(restore(), props.onError)}\n >\n {chatMessages().restoreOriginal}\n </button>\n )}\n </Show>\n </>\n )}\n </Show>\n </div>\n </Show>\n <Show when={props.reply}>\n {(reply) => (\n <div class=\"k2b-chat-composer__reply\">\n <Show when={reply().onSelect} fallback={<div class=\"k2b-message-row__quote\">{replyQuote(reply())}</div>}>\n {(select) => (\n <button type=\"button\" class=\"k2b-message-row__quote\" onClick={() => select()()}>\n {replyQuote(reply())}\n </button>\n )}\n </Show>\n <button\n type=\"button\"\n class=\"k2b-chat-composer__icon-action k2b-chat-composer__reply-cancel\"\n aria-label={chatMessages().cancelReply}\n title={chatMessages().cancelReply}\n onMouseDown={keepFieldFocus}\n onClick={() => reply().onCancel()}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </div>\n )}\n </Show>\n <Show when={attachments().length > 0}>\n <div class=\"k2b-chat-composer__attachments\" role=\"list\" aria-label={chatMessages().attachments} tabIndex={0}>\n <For each={attachments()}>\n {(attachment) => (\n <div class=\"k2b-chat-composer__attachment\" role=\"listitem\">\n <div\n class=\"k2b-chat-composer__attachment-content\"\n classList={{ \"k2b-chat-composer__attachment-content--action\": Boolean(attachment.action) }}\n >\n <Show\n when={attachment.href}\n fallback={\n <div class=\"k2b-chat-composer__attachment-identity\">\n <Show\n when={attachment.kind === \"image\" && attachment.previewUrl}\n fallback={<i class={attachmentIcon(attachment)} aria-hidden=\"true\" />}\n >\n <img src={attachment.previewUrl} alt={attachment.alt ?? \"\"} />\n </Show>\n {renderAttachmentCopy(attachment)}\n </div>\n }\n >\n {(href) => (\n <a\n class=\"k2b-chat-composer__attachment-link\"\n href={href()}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={chatMessages().openInNewTab({ name: attachment.name })}\n >\n <Show\n when={attachment.kind === \"image\" && attachment.previewUrl}\n fallback={<i class={attachmentIcon(attachment)} aria-hidden=\"true\" />}\n >\n <img src={attachment.previewUrl} alt={attachment.alt ?? \"\"} />\n </Show>\n {renderAttachmentCopy(attachment)}\n </a>\n )}\n </Show>\n <Show when={attachment.action}>\n {(action) => (\n <button\n type=\"button\"\n class=\"k2b-chat-composer__attachment-action\"\n disabled={blocked() || action().disabled}\n onClick={() => reportChatFailure(() => executeChatAction(action()), props.onError)}\n >\n <Show when={action().icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n {action().label}\n </button>\n )}\n </Show>\n </div>\n <Show when={props.onAttachmentsChange}>\n <button\n type=\"button\"\n class=\"k2b-chat-composer__attachment-remove\"\n aria-label={selectMessages().removeNamed({ name: attachment.name })}\n disabled={blocked()}\n onClick={() => setAttachments(attachments().filter((candidate) => candidate.id !== attachment.id))}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n )}\n </For>\n </div>\n </Show>\n\n <Show\n when={conversation()}\n fallback={\n <>\n {field()}\n\n <Show when={props.error}>\n <div class=\"k2b-chat-composer__error\" role=\"alert\">\n <i class=\"ti ti-alert-circle\" aria-hidden=\"true\" />\n {props.error}\n </div>\n </Show>\n\n {formatRow()}\n\n <footer class=\"k2b-chat-composer__footer\">\n <Show\n when={footer()}\n fallback={\n <>\n <div class=\"k2b-chat-composer__tools\">\n {props.footerTools}\n <Show when={addOpensCommands()} fallback={<Show when={hasAddMenu()}>{addMenu(\"ti ti-plus\")}</Show>}>\n {addSearchButton()}\n </Show>\n {fileInput()}\n {formatToggle()}\n {emojiButton()}\n <Show when={(props.models?.length ?? 0) > 0}>\n <SelectChip\n aria-label={chatMessages().chooseModel}\n position=\"top-right\"\n class=\"k2b-chat-composer__model\"\n menuWidth=\"15rem\"\n placeholder={chatMessages().model}\n value={() => props.selectedModelId ?? \"\"}\n options={(props.models ?? []).map((model) => ({\n value: model.id,\n label: model.label,\n description: model.description,\n icon: model.icon,\n image: model.image,\n }))}\n open={modelOpen()}\n onOpenChange={(open) => {\n if (!choosingModel()) return;\n setModelOpen(open);\n // Dropdown closes before committing the choice; let onValueChange settle it first.\n if (!open)\n queueMicrotask(() => {\n if (!modelOpen()) finishModelSelection(null);\n });\n }}\n disabled={(choosingModel() ? blockedBesidesCommand() : blocked()) || running() || !props.onModelChange}\n onValueChange={(modelId) => {\n props.onModelChange?.(modelId);\n finishModelSelection(modelId);\n queueMicrotask(focus);\n }}\n />\n </Show>\n {props.modelDetails}\n </div>\n\n <div class=\"k2b-chat-composer__submit\">\n <For each={props.contextActions}>\n {(action) => (\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action\"\n data-tone={action.variant === \"danger\" ? \"danger\" : undefined}\n disabled={action.disabled}\n aria-pressed={action.pressed}\n aria-label={action.label}\n content={action.label}\n onClick={() => reportChatFailure(() => executeChatAction(action), props.onError)}\n >\n <i class={action.icon ?? \"ti ti-dots\"} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n )}\n </For>\n <Show when={hasContextUsage() ? (props.contextUsage ?? {}) : undefined}>\n {(usage) => <ContextUsage {...usage()} action={props.contextPopupAction} onActionError={props.onError} />}\n </Show>\n {props.submitTools}\n {microphoneControl()}\n {sendControl()}\n </div>\n </>\n }\n >\n {footer()}\n </Show>\n </footer>\n </>\n }\n >\n <Show when={props.error}>\n <div class=\"k2b-chat-composer__error\" role=\"alert\">\n <i class=\"ti ti-alert-circle\" aria-hidden=\"true\" />\n {props.error}\n </div>\n </Show>\n {formatRow()}\n {/* One row: attach, the field with its tools, and Send. */}\n <div class=\"k2b-chat-composer__row\">\n {attachControl()}\n {fileInput()}\n <div class=\"k2b-chat-composer__field\">\n {field()}\n <div class=\"k2b-chat-composer__field-tools\">\n {formatToggle()}\n {emojiButton()}\n {microphoneControl()}\n </div>\n </div>\n {sendControl()}\n </div>\n </Show>\n {/* Files dropped anywhere in the surrounding workspace area attach to the message. */}\n <Show when={props.fileSelection}>\n {(selection) => (\n <FileDropTarget\n label={chatMessages().dropFilesToAttach}\n accept={selection().accept}\n multiple={selection().multiple}\n disabled={!canSelectFiles()}\n onDrop={(files) => void runFiles(files)}\n />\n )}\n </Show>\n </section>\n <div class=\"k2b-sr-only\" role=\"status\" aria-live=\"polite\">\n <Show when={suggestionAnnouncement()} keyed>\n {(announced) => <span>{announced.text}</span>}\n </Show>\n </div>\n <div class=\"k2b-chat-composer__status\" role=\"status\">\n <Show when={!suggestionsOpen() && commandStatus()}>\n {(status) => (\n <div class=\"k2b-chat-composer__status-line\" data-tone={status().tone}>\n <i\n aria-hidden=\"true\"\n class={\n status().tone === \"busy\" ? \"ti ti-loader-2 k2b-spin\" : status().tone === \"done\" ? \"ti ti-check\" : \"ti ti-alert-circle\"\n }\n />\n <span>{status().text}</span>\n </div>\n )}\n </Show>\n <Show when={suggestionsOpen() && announcement()} keyed>\n {(announced) => <span class=\"k2b-sr-only\">{announced.text}</span>}\n </Show>\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["chat/ChatComposer.tsx"],"sourcesContent":["import {\n batch,\n children,\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n Index,\n type JSX,\n on,\n onCleanup,\n onMount,\n Show,\n untrack,\n} from \"solid-js\";\nimport { Dropdown, type DropdownItem as DropdownItemData } from \"../actions/Dropdown\";\nimport { dialogHistorySettled, holdDialogHistory } from \"../feedback/dialog-core\";\nimport { Tooltip } from \"../feedback/Tooltip\";\nimport { replaceTextareaRange } from \"../inputs/editor-dom\";\nimport {\n completedEmojiShortcode,\n type EmojiIndex,\n emojiInTone,\n emojiName,\n emojiShortcodeQuery,\n loadEmojiIndex,\n suggestEmoji,\n} from \"../inputs/emoji/emoji-index\";\nimport { FileDropTarget } from \"../inputs/FileDropTarget\";\nimport { toggleBulletList, toggleInlineMarker } from \"../inputs/markdown/actions\";\nimport { openCodeFence } from \"../inputs/markdown/code-zone\";\nimport { type MarkdownToolbarMessages, useMarkdownToolbarMessages } from \"../inputs/markdown/toolbar-messages\";\nimport { SelectChip } from \"../inputs/SelectChip\";\nimport { useSelectMessages } from \"../inputs/select-messages\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { ChatContextUsage as ContextUsage } from \"./ChatPrimitives\";\nimport {\n chatCommandKey,\n conversationEnterAction,\n executeChatAction,\n nextChatCommandIndex,\n reportChatFailure,\n runChatSubmission,\n} from \"./chat-behavior\";\nimport { useChatMessages } from \"./chat-messages\";\nimport { chatCommandListModel, parseChatCommandQuery } from \"./command-search\";\nimport { chatCommandQuery, chatMentionSegments, chatPeopleQuery, reconcileChatMentions } from \"./composer-document\";\nimport type {\n ChatAction,\n ChatAttachment,\n ChatComposerEmoji,\n ChatComposerMicrophone,\n ChatComposerState,\n ChatContextUsageData,\n ChatMention,\n ChatModelOption,\n ChatSubmitInput,\n} from \"./types\";\n\nconst composerMaxInputHeight = 309;\nconst commandDoneMs = 3_000;\n/** Emoji suggestions for a `:shortcode`, as many as fit the list without scrolling on a phone. */\nconst emojiSuggestionLimit = 8;\n// Keep editor undo text within approximately 2 MiB, plus the current edit.\nconst composerUndoBudgetChars = 1_000_000;\n\nexport type ChatCommandContext = {\n setValue: (value: string) => void;\n submit: () => void;\n focus: () => void;\n openModelSelection: () => Promise<string | null>;\n};\n\n/**\n * An action can cancel and restore its token, report a short completion message, or hand back a reference chosen in a\n * dialog: `mention` takes the token's place exactly as a `mention` row does, and Ctrl/⌘+Z brings the token back.\n */\nexport type ChatCommandResult = void | \"cancelled\" | { done: string } | { mention: ChatAttachment };\n\n/** The draft as a successful `open` leaves it: without the `/…` token, with its references moved along. Save this one. */\nexport type ChatCommandDraft = { value: string; mentions: readonly ChatMention[] };\n\n/**\n * How an `open` row ends: on success (`void`) the token leaves as for an action; `\"cancelled\"` changes nothing; `failed`\n * keeps the list open and the draft unchanged, and its text replaces the row's description until the row runs again.\n */\nexport type ChatCommandOpenResult = void | \"cancelled\" | { failed: string };\n\n/** A fixed place in the slash list. Sections keep the given order, also while searching. */\nexport type ChatCommandSection = {\n id: string;\n label: string;\n /** Rows come from `searchCommands`: loading keeps a heading spinner; empty placeholders reserve the first search or retained rows. */\n searched?: boolean;\n /** Only while searching or narrowed: absent from the overview (empty query), including its loading placeholder. */\n searchOnly?: boolean;\n /** Only in the overview (empty query, no scope): absent while searching or narrowed, such as recently used rows. */\n overviewOnly?: boolean;\n /**\n * Its local rows are fixed when the list opens: a row that arrives while the list is open waits for the next opening,\n * so a section above others whose rows load in the background never pushes a visible row down. Rows that go away\n * still leave at once.\n */\n fixedWhileOpen?: boolean;\n /**\n * Local rows still on their way, such as Commands from a catalog: the section ends with placeholder rows, three in\n * the overview and one while searching, and its heading shows a spinner. Make it the last section, so rows that\n * arrive only fill the end of the list and no visible row moves.\n */\n pending?: boolean;\n};\n/** First-word narrowing; Tab writes `words[0]` followed by a space. */\nexport type ChatCommandScope = { id: string; title: string; words: readonly string[] };\n/** Passed as the third argument to `searchCommands`. */\nexport type ChatCommandSearch = {\n scope?: string;\n /** One list opening, unchanged across queries and narrowing; retries start another opening. */\n opening: number;\n};\n\nexport type ChatCommand = {\n /** Section id; unknown or missing ids render in a trailing part without a heading. */\n section?: string;\n /** Tab writes this scope's first word; a row without an action or mention also narrows on Enter. */\n scope?: string;\n /** Absent from the overview; appears when searched, including its unavailable reason. */\n hiddenUntilSearch?: boolean;\n /** A chosen value, independent of the row marked by keyboard navigation. */\n selected?: boolean;\n /** Retry discovery in a new opening, retaining the token and currently displayed rows. */\n searchAgain?: boolean;\n /** Stays in every search of its section, after the matches, such as a row that retries loading the section. */\n persistent?: boolean;\n /** Application name, searchable but not displayed. */\n app?: string;\n /**\n * Used recently by this person. While searching, a matching row moves one step up the ranking ladder of its section\n * and comes before rows of equal rank. The overview keeps consumer order.\n */\n recent?: boolean;\n /** Stable row key for option ids, marking and de-duplication. Defaults to `name`. */\n id?: string;\n name: string;\n description: string;\n icon?: string;\n /** Extra search words, for example in German and English. */\n keywords?: readonly string[];\n /** Unavailable now; this short reason replaces the description. */\n reason?: string;\n /** Shown in the status line while the action runs. */\n busyLabel?: string;\n /** Failures restore an unchanged draft and appear once in the status line, without calling `onError`. */\n action?: (context: ChatCommandContext) => ChatCommandResult | Promise<ChatCommandResult>;\n /**\n * Leaves the composer, such as opening another app. Runs with the token and the list in place: the row shows\n * `busyLabel` (default \"Opening …\") with a spinner instead of its description, and editing waits. A rejection ends like\n * an action's: the token stays, the list closes and the status line names the reason. Closing the list, such as with\n * Escape, cancels: `signal` aborts and the row ends at once. `signal` also aborts when the opening ends any other way\n * than by success, so the opener can save the draft with its token again. A new `draftKey` cancels too, unless the\n * opener calls `follow()` right before changing it itself: that next change keeps the opening, moves its busy line\n * to the status line, and Escape still cancels. See `ChatCommandOpenResult`.\n */\n open?: (draft: ChatCommandDraft, signal: AbortSignal, follow: () => void) => Promise<ChatCommandOpenResult>;\n /** Selecting a reference inserts its display name and retains its opaque payload. */\n mention?: ChatAttachment;\n /**\n * Opens the composer's own file selection, as \"Attach files\" in the add menu does, within the key or click that chose\n * the row, so the device's file dialog can still open. The token leaves; choosing nothing brings it back.\n */\n attachFiles?: boolean;\n label?: string;\n disabled?: boolean;\n};\n\nexport type ChatFileSelection = {\n onSelect: (files: readonly File[]) => void | Promise<void>;\n /**\n * Chooses files for \"Attach files\" instead of the device's file dialog, for example to offer other sources as well.\n * Called within the menu activation, so it may still open the device's dialog; resolve `[]` when the user cancels.\n * `multiple: false` keeps the first chosen file, and a rejection reaches `onError`.\n */\n choose?: () => Promise<readonly File[]>;\n onError?: (error: unknown) => void;\n accept?: string;\n multiple?: boolean;\n disabled?: boolean;\n label?: string;\n};\n\n/** A person `@` can mention: a member of the conversation, a person or an agent. */\nexport type ChatPersonSuggestion = { id: string; name: string; agent?: boolean };\n\n/** Suggests people for `@`; the composer inserts the chosen one as a mention named \"@Name\". */\nexport type ChatComposerPeople = {\n /** At most 8 matches are shown; a rejection only means no suggestions. */\n search: (query: string, signal: AbortSignal) => Promise<readonly ChatPersonSuggestion[]>;\n};\n\nexport type ChatPasteHandler = (event: ClipboardEvent & { currentTarget: HTMLTextAreaElement; target: Element }) => void;\n\nexport type ChatComposerReply = {\n /** Name of the answered message's author. */\n author: string;\n /** Plain text of the answered message; it shows at most two lines. */\n text: string;\n onCancel: () => void;\n onSelect?: () => void;\n};\n\nexport type ChatComposerProps = {\n value: string;\n onValueChange: (value: string) => void;\n onSubmit: (input: ChatSubmitInput) => boolean | void | Promise<boolean | void>;\n /** Submit intent used for drafts entered while a response is running. Defaults to `steer`. */\n runningSubmitIntent?: \"steer\" | \"queue\";\n onStop?: () => void | Promise<void>;\n onError?: (error: unknown) => void;\n state?: ChatComposerState;\n attachments?: readonly ChatAttachment[];\n onAttachmentsChange?: (attachments: readonly ChatAttachment[]) => void;\n fileSelection?: ChatFileSelection;\n /** Handle non-file clipboard content. Pasted files already use `fileSelection`. */\n onPaste?: ChatPasteHandler;\n /** The add menu's entries after \"Attach files\". Not shown with `addOpensCommands`. */\n menuActions?: readonly ChatAction[];\n /**\n * \"+\" opens the slash list with a search field on top instead of the add menu, for keyboards where \"/\" is hard to\n * reach, such as a phone's. The search field filters, narrows and chooses as typing after \"/\" does, and a reference\n * lands where the field's caret was when \"+\" was pressed. Escape, \"+\" again, Back on a phone or a press outside\n * closes the list without acting on what lies below, and the field gets its focus and selection back. `menuActions`\n * do not show then: offer them as `commands`, and file selection as a row with `attachFiles`.\n */\n addOpensCommands?: boolean;\n models?: readonly ChatModelOption[];\n selectedModelId?: string | null;\n onModelChange?: (modelId: string) => void;\n /** Compact application-owned details immediately after the model selector. */\n modelDetails?: JSX.Element;\n commands?: readonly ChatCommand[];\n commandSections?: readonly ChatCommandSection[];\n commandScopes?: readonly ChatCommandScope[];\n searchCommands?: (query: string, signal: AbortSignal, search: ChatCommandSearch) => Promise<readonly ChatCommand[]>;\n /**\n * The last row for typed text or a scope, built at once from the query, such as \"Search Cloud for “q3”\". It is no\n * match: unscoped it follows \"Nothing found for …\"; in a scope it ends the scope's rows. Not called for the overview.\n */\n commandFallback?: (search: { query: string; scope?: string }) => ChatCommand | undefined;\n mentions?: readonly ChatMention[];\n onMentionsChange?: (mentions: readonly ChatMention[]) => void;\n /** Suggests people after `@`; needs `mentions` and `onMentionsChange`. */\n people?: ChatComposerPeople;\n /** Shared surface above the editor; suggestions temporarily replace this content. */\n accessory?: JSX.Element;\n contextUsage?: ChatContextUsageData;\n contextActions?: readonly ChatAction[];\n /** Optional action inside the context details popup. */\n contextPopupAction?: ChatAction;\n /** Additional compact controls rendered with the add/model controls. */\n footerTools?: JSX.Element;\n /** Compact application controls immediately before the send/stop button. */\n submitTools?: JSX.Element;\n /** Replaces footer controls during an application-owned interaction, preserving the editor. */\n footerContent?: JSX.Element;\n placeholder?: string;\n label?: string;\n inputLabel?: string;\n disabled?: boolean;\n /** Keeps the draft editable but holds it back, such as while the chosen model cannot answer. */\n submitDisabled?: boolean;\n error?: string;\n focusToken?: unknown;\n draftKey?: unknown;\n class?: string;\n /**\n * `\"conversation\"` is the composer for messages between people: one row with attach, a pill-shaped field and Send,\n * without the assistant prompt's footer. The field starts with one line and grows to a third of its nearest size\n * container, a hint line of fixed height sits above it, its buttons keep it focused, and Enter breaks the line\n * inside an open code block and on touch-only devices. The default is the assistant prompt.\n */\n variant?: \"default\" | \"conversation\";\n /** `\"enter\"` (default): Enter sends and Shift+Enter breaks the line. `\"mod-enter\"`: Enter breaks the line. Ctrl/⌘+Enter always sends. */\n sendKey?: \"enter\" | \"mod-enter\";\n /**\n * Adds \"Aa\", which opens one row above the field with Bold, Italic and Bullet list (Ctrl/⌘+B, Ctrl/⌘+I, Ctrl/⌘+Shift+8);\n * the field and its controls stay put. Other Markdown is typed by hand.\n */\n formatting?: boolean;\n /** An emoji button at a fixed place. Touch-only devices hide it; their keyboard has emoji. */\n emoji?: ChatComposerEmoji;\n /** A microphone at a fixed place: a tap dictates, holding it or its menu asks for a voice message. */\n microphone?: ChatComposerMicrophone;\n /** One line above the field. The conversation variant always keeps its height; the default shows it only with content. */\n hint?: JSX.Element;\n /**\n * The message this draft answers, shown above the field on the same quiet tint as a quote in a message, with a\n * button that cancels the reply. `onSelect` makes the quote a button, for example to jump to the original.\n */\n reply?: ChatComposerReply;\n};\n\ntype FormatTool = {\n id: string;\n icon: string;\n label: (messages: MarkdownToolbarMessages) => string;\n run: (textarea: HTMLTextAreaElement) => void;\n /** Ctrl/⌘ plus this `event.key`. */\n key?: string;\n /** Ctrl/⌘+Shift plus this `event.code`, the physical key, so every keyboard layout agrees. */\n shiftCode?: string;\n};\n\n/** The row stays short: what a chat message needs. Other Markdown, typed by hand, keeps working. */\nconst formatTools: readonly FormatTool[] = [\n { id: \"bold\", icon: \"ti ti-bold\", label: (m) => m.boldShortcut, run: (textarea) => toggleInlineMarker(textarea, \"**\"), key: \"b\" },\n { id: \"italic\", icon: \"ti ti-italic\", label: (m) => m.italicShortcut, run: (textarea) => toggleInlineMarker(textarea, \"*\"), key: \"i\" },\n { id: \"bullet-list\", icon: \"ti ti-list\", label: (m) => m.bulletListShortcut, run: toggleBulletList, shiftCode: \"Digit8\" },\n];\n\nconst formatShortcut = (event: KeyboardEvent): FormatTool | undefined => {\n if (event.altKey || !(event.ctrlKey || event.metaKey)) return undefined;\n return formatTools.find((tool) => (event.shiftKey ? tool.shiftCode === event.code : tool.key === event.key.toLowerCase()));\n};\n\nconst touchOnlyQuery = \"(any-pointer: coarse) and (not (any-pointer: fine))\";\nconst isTouchOnly = () => typeof matchMedia === \"function\" && matchMedia(touchOnlyQuery).matches;\n/** How long a press on the microphone lasts before it asks for a voice message instead of dictation. */\nconst microphoneHoldMs = 500;\n/** Keeps the field focused (and a phone's keyboard open) when a composer button is pressed with a mouse or finger. */\nconst keepFieldFocus = (event: MouseEvent) => event.preventDefault();\n/**\n * Keeps one tap from reaching the page: its pointer, touch and mouse events stop at the window, and neither focus nor a\n * click happens. A finger's tap ends with `touchend`, a scroll with `pointercancel`, a mouse's press with `click`.\n */\nconst swallowTap = (down: PointerEvent) => {\n const blocked = [\"pointerup\", \"pointercancel\", \"touchstart\", \"touchend\", \"mousedown\", \"mouseup\", \"click\", \"contextmenu\"] as const;\n const stop = () => {\n window.removeEventListener(\"pointerdown\", next, true);\n for (const type of blocked) window.removeEventListener(type, block, true);\n };\n const block = (event: Event) => {\n event.stopPropagation();\n if (event.type !== \"pointercancel\" && event.type !== \"touchstart\" && event.type !== \"pointerup\") event.preventDefault();\n if (event.type === \"click\" || event.type === \"touchend\" || event.type === \"pointercancel\") stop();\n };\n // The next press is a new gesture, whatever became of this one.\n const next = (event: Event) => {\n if (event !== down) stop();\n };\n down.stopPropagation();\n down.preventDefault();\n window.addEventListener(\"pointerdown\", next, true);\n for (const type of blocked) window.addEventListener(type, block, { capture: true, passive: false });\n};\n\nconst attachmentIcon = (attachment: ChatAttachment): string =>\n attachment.icon ?? (attachment.kind === \"image\" ? \"ti ti-photo\" : attachment.kind === \"resource\" ? \"ti ti-link\" : \"ti ti-file\");\n\nconst hasContent = (items: unknown[]) => items.some((item) => item != null && typeof item !== \"boolean\" && item !== \"\");\n\nexport function ChatComposer(props: ChatComposerProps): JSX.Element {\n const accessory = children(() => props.accessory);\n const hasAccessory = () => hasContent(accessory.toArray());\n const hint = children(() => props.hint);\n const footer = children(() => props.footerContent);\n const messages = useUiMessages();\n const markdownToolbarMessages = useMarkdownToolbarMessages();\n const chatMessages = useChatMessages();\n const selectMessages = useSelectMessages();\n const commandListId = `k2b-chat-commands-${createUniqueId().replace(/[^A-Za-z0-9_-]/g, \"-\")}`;\n const formatGroupId = `${commandListId}-format`;\n // Emoji suggestions keep their index-based selection and ids.\n const [selectedCommandIndex, setSelectedCommandIndex] = createSignal(0);\n const [activeCommandKey, setActiveCommandKey] = createSignal<string>();\n const [commandMoved, setCommandMoved] = createSignal(false);\n const commandIds = new Map<string, number>();\n let commandIdCounter = 0;\n const commandOptionId = (command: ChatCommand) => {\n const key = chatCommandKey(command);\n if (!commandIds.has(key)) commandIds.set(key, commandIdCounter++);\n return `${commandListId}-c${commandIds.get(key)}`;\n };\n const [closedAt, setClosedAt] = createSignal<number>();\n /** The list opened from \"+\": the field's selection when \"+\" was pressed, and the search field's text. */\n const [addSearch, setAddSearch] = createSignal<{ start: number; end: number }>();\n const [addQuery, setAddQuery] = createSignal(\"\");\n let addSearchRef: HTMLInputElement | undefined;\n let addButtonRef: HTMLButtonElement | undefined;\n let addComposing = false;\n /** The `open` row running now, and why `open` rows failed in this opening, by row key. */\n const [openingRow, setOpeningRow] = createSignal<string>();\n const [openFailures, setOpenFailures] = createSignal<Readonly<Record<string, string>>>({});\n /** Cancels the `open` row running now; `key` follows announced draft moves, `label` is its busy line. */\n let openingRun: { controller: AbortController; key: unknown; label: string; follow: boolean; moved: boolean } | undefined;\n // Where the pending native edit starts; a selection replaced as a whole starts at its beginning.\n let inputStart: number | undefined;\n let inputEnd: number | undefined;\n const [commandStatus, setCommandStatus] = createSignal<{ tone: \"busy\" | \"done\" | \"error\"; text: string }>();\n const [announcement, setAnnouncement] = createSignal<{ text: string }>();\n let statusTimer: ReturnType<typeof setTimeout> | undefined;\n let disposed = false;\n const showCommandStatus = (status?: { tone: \"busy\" | \"done\" | \"error\"; text: string }) => {\n if (disposed) return;\n clearTimeout(statusTimer);\n setCommandStatus(status);\n if (status?.tone === \"done\") {\n statusTimer = setTimeout(() => setCommandStatus(undefined), commandDoneMs);\n }\n };\n onCleanup(() => {\n disposed = true;\n clearTimeout(statusTimer);\n });\n const [addingFiles, setAddingFiles] = createSignal(false);\n const [submitting, setSubmitting] = createSignal(false);\n let shellRef: HTMLDivElement | undefined;\n let composerRef: HTMLElement | undefined;\n let textareaRef: HTMLTextAreaElement | undefined;\n let fileInputRef: HTMLInputElement | undefined;\n let measureRef: HTMLTextAreaElement | undefined;\n let microphoneRef: HTMLDivElement | undefined;\n let sawRunning = props.state === \"running\";\n const conversation = () => props.variant === \"conversation\";\n const [formattingOpen, setFormattingOpen] = createSignal(false);\n const [microphoneMenuOpen, setMicrophoneMenuOpen] = createSignal(false);\n const dictation = () => props.microphone?.dictation ?? null;\n const showHint = () => conversation() || dictation() !== null || hasContent(hint.toArray());\n\n const state = () => props.state ?? \"idle\";\n const running = () => state() === \"running\";\n const stopping = () => state() === \"stopping\";\n const runningSubmitIntent = () => props.runningSubmitIntent ?? \"steer\";\n const attachments = () => props.attachments ?? [];\n const [caret, setCaret] = createSignal(0);\n const [selectionEnd, setSelectionEnd] = createSignal(0);\n const [dismissed, setDismissed] = createSignal(false);\n const [composing, setComposing] = createSignal(false);\n const [searchResults, setSearchResults] = createSignal<readonly ChatCommand[]>([]);\n const [searchResultsQuery, setSearchResultsQuery] = createSignal<string>();\n const [searchResultsScope, setSearchResultsScope] = createSignal<string>();\n const [suggestionAnnouncement, setSuggestionAnnouncement] = createSignal<{ text: string }>();\n const [searching, setSearching] = createSignal(false);\n const [searchError, setSearchError] = createSignal(false);\n const [executing, setExecuting] = createSignal(false);\n const [modelOpen, setModelOpen] = createSignal<boolean>();\n const [choosingModel, setChoosingModel] = createSignal(false);\n let resolveModel: ((id: string | null) => void) | undefined;\n const finishModelSelection = (id: string | null) => {\n const resolve = resolveModel;\n resolveModel = undefined;\n if (choosingModel()) {\n setModelOpen(false);\n // Let the controlled close reach Dropdown before returning normal clicks to its own state.\n queueMicrotask(() => {\n if (!choosingModel()) setModelOpen(undefined);\n });\n }\n setChoosingModel(false);\n resolve?.(id);\n };\n const blockedBesidesCommand = () => Boolean(props.disabled || stopping() || state() === \"submitting\" || addingFiles() || submitting());\n const usableModelControl = () =>\n !conversation() && !footer() && !blockedBesidesCommand() && !running() && Boolean(props.models?.length && props.onModelChange);\n const openModelSelection = (): Promise<string | null> => {\n if (!usableModelControl()) return Promise.resolve(null);\n finishModelSelection(null);\n return new Promise((resolve) => {\n resolveModel = resolve;\n setChoosingModel(true);\n setModelOpen(true);\n queueMicrotask(() => {\n if (!choosingModel() || !modelOpen()) return;\n // Start on the current model, as a click on the chip would show it checked.\n const menu = composerRef?.querySelector(\".k2b-chat-composer__model\");\n (\n menu?.querySelector<HTMLButtonElement>('[role=\"menuitemradio\"][aria-checked=\"true\"]:not(:disabled)') ??\n menu?.querySelector<HTMLButtonElement>('[role=\"menuitemradio\"]:not(:disabled)')\n )?.focus();\n });\n });\n };\n createEffect(() => {\n if (!usableModelControl()) finishModelSelection(null);\n });\n onCleanup(() => finishModelSelection(null));\n const [commandOpening, setCommandOpening] = createSignal(0);\n let retrySearch = false;\n let highlightRef: HTMLDivElement | undefined;\n let commandListRef: HTMLDivElement | undefined;\n const mentions = () => props.mentions ?? [];\n const locale = useLocale();\n const [emojiIndex, setEmojiIndex] = createSignal<EmojiIndex>();\n const emojiQuery = createMemo(() =>\n !props.emoji || dismissed() || composing() ? null : emojiShortcodeQuery(props.value, caret(), selectionEnd()),\n );\n // The emoji data loads with the first `:shortcode`; a failed load only means no suggestions.\n createEffect(() => {\n if (emojiQuery() && !emojiIndex()) loadEmojiIndex().then(setEmojiIndex, () => undefined);\n });\n const emojiMatches = createMemo(() => {\n const token = emojiQuery();\n const index = emojiIndex();\n return token && index ? suggestEmoji(index, token.query, emojiSuggestionLimit) : [];\n });\n const emojiOpen = () => emojiMatches().length > 0;\n // People for `@name`: each change of the query asks again and gives up the previous question.\n const peopleQuery = createMemo(() =>\n !props.people || dismissed() || composing() ? null : chatPeopleQuery(props.value, caret(), selectionEnd(), mentions()),\n );\n // Results belong to the query they answer; while a newer query is asked, the older results show nothing to pick.\n const [peopleResults, setPeopleResults] = createSignal<{ query: string; people: readonly ChatPersonSuggestion[] }>();\n const peopleMatches = () => {\n const results = peopleResults();\n return results && results.query === peopleQuery()?.query ? results.people : [];\n };\n const setPeopleMatches = (people: readonly ChatPersonSuggestion[], query = peopleQuery()?.query ?? \"\") =>\n setPeopleResults({ query, people });\n createEffect(\n on(\n () => [peopleQuery()?.start, peopleQuery()?.query] as const,\n ([start, query]) => {\n if (start === undefined || query === undefined || !props.people) {\n setPeopleMatches([]);\n return;\n }\n const abort = new AbortController();\n onCleanup(() => abort.abort());\n props.people.search(query, abort.signal).then(\n (found) => {\n if (!abort.signal.aborted) setPeopleMatches(found.slice(0, 8), query);\n },\n () => {\n if (!abort.signal.aborted) setPeopleMatches([], query);\n },\n );\n },\n ),\n );\n const peopleOpen = () => !emojiOpen() && Boolean(peopleQuery()) && peopleMatches().length > 0;\n // From \"+\", the search field's text is the query of an empty token at the field's stored caret.\n const caretCommandToken = createMemo(() => {\n const search = addSearch();\n if (!search) return chatCommandQuery(props.value, caret(), selectionEnd());\n const at = Math.min(search.end, props.value.length);\n return { start: at, end: at, query: addQuery() };\n });\n const caretCommandStart = createMemo(() => caretCommandToken()?.start);\n // Retained server rows belong to one `/`: they go when it does or when another `/` starts.\n createEffect(() => {\n caretCommandStart();\n setSearchResults([]);\n setSearchResultsQuery(undefined);\n });\n // Escape closes the list for one `/` character, wherever the caret or selection goes; only that `/` going away ends it.\n createEffect(() => {\n const closed = closedAt();\n if (closed !== undefined && props.value[closed] !== \"/\") setClosedAt(undefined);\n });\n const commandQuery = createMemo(() => {\n const token = caretCommandToken();\n if (addSearch()) return token;\n return dismissed() || composing() || token?.start === closedAt() ? null : token;\n });\n const openingStart = createMemo(() => commandQuery()?.start);\n createEffect(() => {\n props.draftKey;\n const start = openingStart();\n if (start !== undefined) setCommandOpening((opening) => opening + 1);\n });\n // A failed `open` row says so for the rest of its list opening.\n createEffect(() => {\n props.draftKey;\n commandOpening();\n setOpenFailures({});\n });\n const parsedCommandQuery = createMemo(() => parseChatCommandQuery(commandQuery()?.query ?? \"\", props.commandScopes ?? []));\n const commandFallbackRow = createMemo(() => {\n const parsed = parsedCommandQuery();\n const query = parsed.query.trim();\n return commandQuery() && (query || parsed.scope) ? props.commandFallback?.({ query, scope: parsed.scope?.id }) : undefined;\n });\n const currentCommandScope = createMemo(() => parsedCommandQuery().scope?.id);\n createEffect(() => {\n currentCommandScope();\n setSearchResults([]);\n setSearchResultsQuery(undefined);\n });\n // Rows of a `fixedWhileOpen` section are the ones it had when this `/` opened the list; later ones wait for the next\n // `/`. A retry row starts another opening in the same open list, so it does not count.\n const fixedCommandKeys = createMemo(() => {\n props.draftKey;\n if (openingStart() === undefined) return undefined;\n return untrack(() => {\n const fixed = new Set((props.commandSections ?? []).filter((section) => section.fixedWhileOpen).map((section) => section.id));\n return fixed.size\n ? new Set((props.commands ?? []).filter((command) => fixed.has(command.section ?? \"\")).map(chatCommandKey))\n : undefined;\n });\n });\n const localCommands = createMemo(() => {\n const commands = props.commands ?? [];\n const keys = fixedCommandKeys();\n if (!keys) return commands;\n const fixed = new Set((props.commandSections ?? []).filter((section) => section.fixedWhileOpen).map((section) => section.id));\n return commands.filter((command) => !fixed.has(command.section ?? \"\") || keys.has(chatCommandKey(command)));\n });\n // While a pointer is down on a row, the list keeps the rows it showed at the press: rows arriving then would move the\n // pressed row away from under the pointer, and the release would land beside it (#2079). They show after the release.\n const [holdingRows, setHoldingRows] = createSignal(false);\n const liveCommandModel = createMemo(() =>\n chatCommandListModel({\n query: commandQuery()?.query ?? \"\",\n scopes: props.commandScopes,\n sections: props.commandSections,\n commands: localCommands(),\n searchResults: searchResultsScope() === parsedCommandQuery().scope?.id ? searchResults() : [],\n searchResultsFresh: searchResultsQuery() === commandQuery()?.query && searchResultsScope() === parsedCommandQuery().scope?.id,\n searchSettled: searchResultsQuery() !== undefined && searchResultsScope() === parsedCommandQuery().scope?.id,\n searching: searching(),\n fallback: commandFallbackRow(),\n }),\n );\n const commandModel = createMemo<ReturnType<typeof liveCommandModel>>((previous) =>\n holdingRows() && previous ? previous : liveCommandModel(),\n );\n const commandMatches = createMemo(() => (commandQuery() ? commandModel().rows.map((row) => row.command) : []));\n /** Rows that matched; an unscoped fallback row only follows them. */\n const foundCommandCount = () => commandMatches().length - (commandModel().fallback ? 1 : 0);\n const currentCommandQuery = createMemo(() => caretCommandToken()?.query);\n // Arrow marking belongs to one token in one draft; another draft or `/` starts at the top row again.\n createEffect(() => {\n props.draftKey;\n caretCommandStart();\n currentCommandQuery();\n setCommandMoved(false);\n });\n const commandsOpen = () =>\n Boolean(!emojiOpen() && !peopleOpen() && commandQuery() && (localCommands().length || props.searchCommands || commandFallbackRow()));\n // Rows that arrive for a pending section never move a visible row of the overview: until the person types, the list\n // keeps the height it had with its placeholders and scrolls what does not fit. A list below its maximum height grows\n // upward from the field, so a change of height alone would move its first row. While searching, the rows arrive\n // with the search's own answer, which changes the list anyway.\n // From \"+\", the whole panel keeps the height it opened with instead.\n const commandsPending = createMemo(\n () =>\n commandsOpen() &&\n !addSearch() &&\n !parsedCommandQuery().scope &&\n !parsedCommandQuery().query.trim() &&\n commandModel().groups.some((group) => group.pendingRows > 0),\n );\n // Typing, another opening or closing the list lets it size itself again.\n const commandListSizeKey = createMemo(() => (commandsOpen() ? `${commandOpening()}\\u0000${caretCommandToken()?.query}` : undefined));\n // The list's height with its placeholders, for the size key it was measured under.\n let pendingList: { height: number; key: string | undefined } | undefined;\n createEffect(() => {\n const list = commandListRef;\n if (!commandsPending() || !list || typeof ResizeObserver === \"undefined\") return;\n const measure = () => {\n pendingList = { height: list.getBoundingClientRect().height, key: untrack(commandListSizeKey) };\n };\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(list);\n onCleanup(() => observer.disconnect());\n });\n createEffect(\n on(commandsPending, (pending, wasPending) => {\n const held = pendingList;\n pendingList = undefined;\n // Only rows arriving hold the list; the person's typing or closing it does not.\n if (pending || !wasPending || !held || held.key !== commandListSizeKey() || !commandListRef?.isConnected) return;\n commandListRef.style.height = `${held.height}px`;\n commandListRef.setAttribute(\"data-held\", \"\");\n }),\n );\n createEffect(\n on(\n commandListSizeKey,\n () => {\n commandListRef?.style.removeProperty(\"height\");\n commandListRef?.removeAttribute(\"data-held\");\n },\n { defer: true },\n ),\n );\n // Escape, a press outside, or moving the caret away closes the list; while an `open` row runs, that cancels it, so\n // nothing opens after the person backed out. Success ends the opening and closes the list in one step. A new draft\n // cancels too, unless the opener announced that next move with `follow()`: its busy line moves to the status line,\n // and Escape still cancels there. Any later unannounced draft change cancels.\n createEffect(() => {\n const draftKey = props.draftKey;\n const open = commandsOpen();\n const row = openingRow();\n const run = openingRun;\n if (!run || row === undefined) return;\n if (draftKey !== run.key) {\n if (run.follow) {\n run.follow = false;\n run.key = draftKey;\n run.moved = true;\n showCommandStatus({ tone: \"busy\", text: run.label });\n } else run.controller.abort();\n return;\n }\n if (!open && !run.moved) run.controller.abort();\n });\n onCleanup(() => openingRun?.controller.abort());\n // An `open` row gives the sheet's Back entry up first, so it never races the navigation it starts.\n const commandSheetHeld = createMemo(() => commandsOpen() && isTouchOnly() && openingRow() === undefined);\n createEffect(() => {\n if (!commandSheetHeld()) return;\n onCleanup(holdDialogHistory(() => closeCommandList()));\n });\n const suggestionsOpen = () => commandsOpen() || emojiOpen() || peopleOpen();\n const fieldOwnsList = () => suggestionsOpen() && !addSearch();\n // From \"+\", the panel keeps the height it opened with while the person types or rows arrive, so neither the search\n // field nor the first row moves; what does not fit scrolls. The space above the field still bounds it.\n const addPanelOpen = createMemo(() => addSearch() !== undefined && commandsOpen());\n createEffect(() => {\n const accessory = addPanelOpen() ? commandListRef?.parentElement : undefined;\n if (!accessory) return;\n const frame = requestAnimationFrame(() =>\n accessory.style.setProperty(\"--k2b-chat-command-held\", `${accessory.getBoundingClientRect().height}px`),\n );\n onCleanup(() => cancelAnimationFrame(frame));\n });\n createEffect(() => {\n if (!suggestionsOpen()) return;\n let disposed = false;\n const measure = () => {\n if (disposed || !commandListRef) return;\n const accessory = commandListRef.parentElement!;\n const viewportTop = window.visualViewport?.offsetTop ?? 0;\n let top = viewportTop;\n // The column a phone sheet spans: the nearest ancestor that clips sideways, or the page.\n let column: { left: number; right: number } | undefined;\n for (let parent = accessory.parentElement; parent; parent = parent.parentElement) {\n const style = window.getComputedStyle(parent);\n if (/(auto|scroll|hidden|clip)/.test(style.overflowY)) {\n top = Math.max(top, parent.getBoundingClientRect().top);\n }\n if (!column && /(auto|scroll|hidden|clip)/.test(style.overflowX)) {\n const left = parent.getBoundingClientRect().left + parent.clientLeft;\n column = { left, right: left + parent.clientWidth };\n }\n }\n const page = document.documentElement.clientWidth;\n const left = Math.max(0, column?.left ?? 0);\n const right = Math.min(page, column?.right ?? page);\n const slot = accessory.parentElement!.getBoundingClientRect();\n // From its place in the slot, not its box: the sheet opened from \"+\" rises into place, and a box measured during\n // that animation would include its offset.\n const bottom = slot.bottom - (Number.parseFloat(window.getComputedStyle(accessory).bottom) || 0);\n // On the accessory, so a panel opened from \"+\" is bounded as a whole, with its search field.\n accessory.style.setProperty(\"--k2b-chat-command-space\", `${Math.max(40, bottom - top - 8)}px`);\n // Only a list that reaches the screen's top edge keeps clear of a notch or the status bar.\n accessory.style.setProperty(\"--k2b-chat-command-safe-top\", top === viewportTop ? \"env(safe-area-inset-top, 0px)\" : \"0px\");\n accessory.style.setProperty(\"--k2b-chat-command-reach-left\", `${Math.max(0, slot.left - left)}px`);\n accessory.style.setProperty(\"--k2b-chat-command-reach-right\", `${Math.max(0, right - slot.right)}px`);\n };\n queueMicrotask(measure);\n window.addEventListener(\"resize\", measure);\n window.addEventListener(\"scroll\", measure, true);\n window.visualViewport?.addEventListener(\"resize\", measure);\n onCleanup(() => {\n disposed = true;\n window.removeEventListener(\"resize\", measure);\n window.removeEventListener(\"scroll\", measure, true);\n window.visualViewport?.removeEventListener(\"resize\", measure);\n });\n });\n // A press outside the command list and the field closes the list, as Escape does; the text stays. With a mouse or a\n // trackpad the press then acts as usual. On a touch-only device a tap outside the composer closes only the list: it\n // reaches nothing beneath, and the field keeps focus, so the keyboard stays open.\n // A list opened from \"+\" is a menu: any press outside it closes only the list, with every pointer, and the field gets\n // its focus back. \"+\" itself toggles with its click; a press in the field closes the list and lands there as usual.\n createEffect(() => {\n if (!commandsOpen()) return;\n const onPointerDown = (event: PointerEvent) => {\n const target = event.target;\n if (!(target instanceof Node) || commandListRef?.parentElement?.contains(target)) return;\n if (addSearch()) {\n if (addButtonRef?.contains(target) && !addButtonRef.disabled) return;\n if (textareaRef?.parentElement?.contains(target)) {\n // The field takes the focus before the search field goes, so a phone keeps its keyboard; the press itself\n // then places the caret.\n textareaRef.focus({ preventScroll: true });\n endAddSearch(false);\n return;\n }\n swallowTap(event);\n endAddSearch(true);\n return;\n }\n if (textareaRef?.parentElement?.contains(target)) return;\n setClosedAt(commandQuery()?.start);\n if (isTouchOnly() && !shellRef?.contains(target)) swallowTap(event);\n };\n window.addEventListener(\"pointerdown\", onPointerDown, true);\n onCleanup(() => window.removeEventListener(\"pointerdown\", onPointerDown, true));\n });\n createEffect(() => {\n props.draftKey;\n const token = commandQuery();\n setSearchError(false);\n if (!token || !props.searchCommands) {\n setSearching(false);\n return;\n }\n running();\n const parsed = parsedCommandQuery();\n const opening = commandOpening();\n const abort = new AbortController();\n setSearching(true);\n const delay = retrySearch ? 0 : 120;\n retrySearch = false;\n const timer = setTimeout(() => {\n Promise.resolve()\n .then(() => props.searchCommands!(parsed.query, abort.signal, { scope: parsed.scope?.id, opening }))\n .then((results) => {\n if (!abort.signal.aborted) {\n batch(() => {\n setSearchResults(results);\n setSearchResultsQuery(token.query);\n setSearchResultsScope(parsed.scope?.id);\n });\n }\n })\n .catch(() => {\n if (!abort.signal.aborted) {\n setSearchResults([]);\n setSearchResultsQuery(undefined);\n setSearchError(true);\n }\n })\n .finally(() => {\n if (!abort.signal.aborted) setSearching(false);\n });\n }, delay);\n onCleanup(() => {\n clearTimeout(timer);\n abort.abort();\n });\n });\n let settledEmpty: { start: number; query: string } | undefined;\n // A space after \"Nothing found\" ends the `/…` as plain text; a search field opened from \"+\" just keeps its text.\n createEffect(() => {\n const token = commandQuery();\n if (!token || addSearch() || parsedCommandQuery().scope || searchError()) {\n settledEmpty = undefined;\n return;\n }\n const previous = settledEmpty;\n if (/\\s$/.test(token.query) && previous?.start === token.start && previous.query.trimEnd() === token.query.trimEnd()) {\n setClosedAt(token.start);\n return;\n }\n const settled = !searching() && (!props.searchCommands || searchResultsQuery() === token.query);\n if (settled && commandModel().empty) {\n settledEmpty = { start: token.start, query: token.query };\n if (/\\s$/.test(token.query)) setClosedAt(token.start);\n } else if (!searching()) settledEmpty = undefined;\n });\n let lastSuggestion: { query: string; text: string } | undefined;\n createEffect(() => {\n const model = commandModel();\n const query = commandQuery()?.query;\n if (!commandsOpen()) {\n setSuggestionAnnouncement(undefined);\n lastSuggestion = undefined;\n return;\n }\n if (searching() || searchError() || (props.searchCommands && searchResultsQuery() !== query)) return;\n const text = chatMessages().commandSuggestions({ count: model.rows.length });\n const timer = setTimeout(() => {\n if (lastSuggestion && lastSuggestion.query === query && lastSuggestion.text === text) return;\n lastSuggestion = { query: query ?? \"\", text };\n setSuggestionAnnouncement({ text });\n }, 350);\n onCleanup(() => clearTimeout(timer));\n });\n const history: { value: string; mentions: readonly ChatMention[]; caret: number }[] = [];\n let historyIndex = -1;\n createEffect(() => {\n props.draftKey;\n untrack(() => {\n history.length = 0;\n historyIndex = -1;\n finishModelSelection(null);\n endAddSearch(false);\n setDismissed(true);\n setClosedAt(undefined);\n setSearchResults([]);\n setSearchResultsQuery(undefined);\n // A failure belongs to the draft it happened in; success notes may follow a command into the chat it opened.\n if (commandStatus()?.tone === \"error\") showCommandStatus();\n });\n });\n const snapshot = () => ({ value: props.value, mentions: [...mentions()], caret: textareaRef?.selectionStart ?? 0 });\n const sameMentions = (a: readonly ChatMention[], b: readonly ChatMention[]) =>\n a.length === b.length &&\n a.every((item, index) => item.start === b[index]?.start && item.end === b[index]?.end && item.attachment === b[index]?.attachment);\n const record = () => {\n if (history[historyIndex]?.value !== props.value || !sameMentions(history[historyIndex]?.mentions ?? [], mentions())) {\n history.splice(historyIndex + 1);\n history.push(snapshot());\n let size = history.reduce((total, entry) => total + entry.value.length, 0);\n while (history.length > 2 && size > composerUndoBudgetChars) size -= history.shift()!.value.length;\n historyIndex = history.length - 1;\n }\n };\n const edit = (value: string, nextMentions = reconcileChatMentions(props.value, value, mentions())) => {\n if (commandStatus()?.tone === \"error\") showCommandStatus();\n // Replacing `/` can leave its position and query identical, but starts a new opening.\n if (inputStart !== undefined && inputEnd !== undefined && props.value.slice(inputStart, inputEnd).includes(\"/\")) {\n setCommandOpening((opening) => opening + 1);\n setSearchResults([]);\n setSearchResultsQuery(undefined);\n setCommandMoved(false);\n }\n // An edit that starts at or before the closed `/` (select all, then type `/`) replaces it; the new `/` may open again.\n const closed = closedAt();\n if (closed !== undefined) {\n let same = 0;\n while (same <= closed && props.value[same] === value[same]) same++;\n if (Math.min(same, inputStart ?? same) <= closed) setClosedAt(undefined);\n }\n inputStart = undefined;\n inputEnd = undefined;\n record();\n props.onValueChange(value);\n props.onMentionsChange?.(nextMentions);\n record();\n setDismissed(false);\n };\n const restoreHistory = (direction: -1 | 1) => {\n // A field that only stays enabled to keep focus, while an `open` row runs, is not edited by undo either.\n if (editBlocked()) return;\n record();\n const next = history[historyIndex + direction];\n if (!next) return;\n historyIndex += direction;\n props.onValueChange(next.value);\n props.onMentionsChange?.(next.mentions);\n queueMicrotask(() => {\n textareaRef?.setSelectionRange(next.caret, next.caret);\n syncCaret();\n });\n };\n const syncCaret = () => {\n // One update, so no effect sees a half-moved selection (it would read as \"no `/` here\" and reopen a closed list).\n batch(() => {\n setCaret(textareaRef?.selectionStart ?? props.value.length);\n setSelectionEnd(textareaRef?.selectionEnd ?? props.value.length);\n });\n };\n /** Closes the list opened from \"+\"; `refocus` gives the field its focus and the selection it had when \"+\" was pressed. */\n const endAddSearch = (refocus: boolean) => {\n const search = addSearch();\n if (!search) return;\n addComposing = false;\n batch(() => {\n setAddSearch(undefined);\n setAddQuery(\"\");\n });\n if (!refocus || !textareaRef) return;\n const length = textareaRef.value.length;\n textareaRef.focus();\n textareaRef.setSelectionRange(Math.min(search.start, length), Math.min(search.end, length));\n syncCaret();\n };\n /** Escape, Back, a press outside: the list closes and the text stays. */\n const closeCommandList = (refocus = true) => {\n if (addSearch()) endAddSearch(refocus);\n else setClosedAt(commandQuery()?.start);\n };\n const toggleAddSearch = () => {\n if (addSearch()) {\n endAddSearch(true);\n return;\n }\n if (blocked() || !textareaRef) return;\n const start = textareaRef.selectionStart;\n const end = textareaRef.selectionEnd;\n batch(() => {\n // Emoji suggestions for a `:shortcode` at the caret give way; they would hold the list closed.\n setDismissed(true);\n setAddQuery(\"\");\n setAddSearch({ start, end });\n });\n // Within the press, so a phone opens its keyboard for the search field.\n addSearchRef?.focus();\n };\n const selectedCommand = createMemo(() => {\n const rows = commandMatches();\n return (commandMoved() && rows.find((command) => chatCommandKey(command) === activeCommandKey())) || rows[0];\n });\n const selectedCommandKey = createMemo(() => {\n const command = selectedCommand();\n return command ? chatCommandKey(command) : undefined;\n });\n createEffect(() => {\n if (!commandsOpen()) commandIds.clear();\n selectedCommandKey();\n setAnnouncement(undefined);\n });\n const busy = () => Boolean(props.disabled || stopping() || state() === \"submitting\" || executing() || addingFiles());\n const blocked = () => busy() || submitting();\n /** The conversation field stays editable while a message is sent, so it keeps the focus and a phone its keyboard. */\n const editBlocked = () => (conversation() ? busy() : blocked());\n const hasDraft = () => Boolean(props.value.trim() || (!running() && attachments().length > 0));\n /** The draft may go out now, apart from a submission that is already on its way. */\n const submittable = () =>\n !busy() && !props.submitDisabled && hasDraft() && !(running() && runningSubmitIntent() === \"steer\" && mentions().length);\n const canSubmit = () => !submitting() && submittable();\n const canSelectFiles = () => Boolean(props.fileSelection && !props.fileSelection.disabled && !running() && !blocked());\n const hasAddMenu = () => Boolean(props.fileSelection || props.menuActions?.length);\n /** \"+\" opens the slash list, as long as there is one; otherwise it stays the add menu. */\n const addOpensCommands = () => Boolean(props.addOpensCommands && (props.commands?.length || props.searchCommands));\n const hasContextUsage = () => {\n if (props.contextPopupAction) return true;\n const context = props.contextUsage;\n if (!context || typeof context.contextWindow !== \"number\" || !Number.isFinite(context.contextWindow) || context.contextWindow <= 0) {\n return false;\n }\n return [context.usage?.total, context.usage?.input, context.usage?.output].some(\n (value) => typeof value === \"number\" && Number.isFinite(value) && value >= 0,\n );\n };\n\n const menuItems = (): readonly DropdownItemData[] => {\n const items: DropdownItemData[] = [];\n if (props.fileSelection) {\n items.push({\n icon: addingFiles() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-paperclip\",\n label: props.fileSelection.label ?? chatMessages().attachFiles,\n disabled: !canSelectFiles(),\n action: () => chooseFiles(),\n });\n }\n for (const action of props.menuActions ?? []) {\n items.push({\n icon: action.icon,\n label: action.label,\n variant: action.variant,\n disabled: action.disabled,\n action: () =>\n reportChatFailure(async () => {\n await executeChatAction(action);\n // Like attaching files, an add action returns to the field when the focus is still on this composer's add\n // button or nowhere; focus the action moved somewhere on purpose stays there.\n queueMicrotask(() => {\n const active = textareaRef?.ownerDocument.activeElement;\n const root = textareaRef?.closest(\".k2b-chat-composer\");\n if (!active || active === active.ownerDocument.body || (root?.contains(active) && active.matches(\"[data-chat-composer-add]\")))\n focus();\n });\n }, props.onError),\n });\n }\n return items;\n };\n\n const autoResize = () => {\n if (!textareaRef) return;\n if (conversation()) {\n // A hidden copy measures the text. Collapsing the field itself would shrink the composer for a frame, and\n // WebKit then clamps the scroll position of the conversation above it. CSS caps the height.\n if (!measureRef) return;\n measureRef.value = textareaRef.value;\n textareaRef.style.height = `${measureRef.scrollHeight}px`;\n return;\n }\n textareaRef.style.height = \"auto\";\n textareaRef.style.height = `${Math.min(textareaRef.scrollHeight, composerMaxInputHeight)}px`;\n };\n\n const focus = () => textareaRef?.focus();\n\n onMount(() => {\n autoResize();\n if (props.focusToken !== undefined) focus();\n // The copy follows the field's width, so a narrower composer measures more lines.\n if (measureRef && typeof ResizeObserver === \"function\") {\n const observer = new ResizeObserver(() => autoResize());\n observer.observe(measureRef);\n onCleanup(() => observer.disconnect());\n }\n });\n\n createEffect(() => {\n emojiMatches();\n peopleMatches();\n setSelectedCommandIndex(0);\n });\n\n createEffect(() => {\n const command = selectedCommand();\n const id = emojiOpen() || peopleOpen() ? `${commandListId}-${selectedCommandIndex()}` : command ? commandOptionId(command) : undefined;\n queueMicrotask(() => {\n const list = commandListRef;\n const item = id ? list?.querySelector<HTMLElement>(`[id=\"${id}\"]`) : undefined;\n if (!list || !item?.isConnected) return;\n // Measured against the visible part of the list: a sticky section heading covers the top of it.\n const heading = item.closest(\".k2b-chat-composer__command-group\")?.querySelector<HTMLElement>(\".k2b-chat-composer__command-heading\");\n const listTop = list.getBoundingClientRect().top + list.clientTop;\n const box = item.getBoundingClientRect();\n const top = box.top - listTop - (heading?.offsetHeight ?? 0);\n const bottom = box.bottom - listTop - list.clientHeight;\n if (top < 0) list.scrollTop += top;\n else if (bottom > 0) list.scrollTop += bottom;\n });\n });\n\n createEffect(() => {\n props.value;\n queueMicrotask(autoResize);\n });\n\n createEffect(() => {\n props.focusToken;\n if (props.focusToken !== undefined) queueMicrotask(focus);\n });\n\n createEffect(() => {\n const active = running();\n if (sawRunning && !active && !props.disabled && typeof document !== \"undefined\") {\n const focused = document.activeElement as HTMLElement | null;\n const insideComposer = Boolean(focused && composerRef?.contains(focused));\n const editingElsewhere = Boolean(\n focused &&\n focused !== document.body &&\n !insideComposer &&\n (focused.matches(\"input, textarea, select\") || focused.isContentEditable || focused.closest(\"[role='dialog'], [popover]\")),\n );\n if (!editingElsewhere) queueMicrotask(focus);\n }\n sawRunning = active;\n });\n\n const setAttachments = (next: readonly ChatAttachment[]) => props.onAttachmentsChange?.(next);\n\n const renderAttachmentCopy = (attachment: ChatAttachment) => (\n <span>\n <strong title={attachment.name}>{attachment.name}</strong>\n </span>\n );\n\n /** `onNothing` runs when the person closes the selection without a file. */\n const chooseFiles = (onNothing?: () => void) => {\n const selection = props.fileSelection;\n if (!selection?.choose) {\n const input = fileInputRef;\n if (input && onNothing) {\n const done = new AbortController();\n input.addEventListener(\n \"cancel\",\n () => {\n done.abort();\n onNothing();\n },\n { signal: done.signal },\n );\n input.addEventListener(\"change\", () => done.abort(), { signal: done.signal });\n }\n return input?.click();\n }\n const failed = (error: unknown) => {\n onNothing?.();\n (props.fileSelection?.onError ?? props.onError)?.(error);\n };\n let chosen: Promise<readonly File[]>;\n try {\n chosen = selection.choose();\n } catch (error) {\n failed(error);\n return;\n }\n chosen.then(\n // A single-file composer keeps the first chosen file, as its file dialog and drops do.\n (files) => {\n if (files.length === 0) onNothing?.();\n else void runFiles(selection.multiple === false ? files.slice(0, 1) : files);\n },\n failed,\n );\n };\n\n /**\n * \"Attach files\" from the slash list: the token leaves as one edit, and the selection opens synchronously, inside the\n * key or click that chose the row, because the device's file dialog needs that activation. Closing the selection\n * without a file brings the token back, unless the draft changed meanwhile.\n */\n const attachFilesFromCommand = (token: { start: number; end: number }, selection?: { start: number; end: number }) => {\n if (!canSelectFiles()) return;\n const key = props.draftKey;\n const previous = snapshot();\n const previousHistory = { entries: [...history], index: historyIndex };\n const nextValue = props.value.slice(0, token.start) + props.value.slice(token.end);\n edit(nextValue, reconcileChatMentions(props.value, nextValue, mentions()));\n setDismissed(true);\n chooseFiles(() => {\n if (props.draftKey !== key || props.value !== nextValue) return;\n setDismissed(true);\n props.onValueChange(previous.value);\n props.onMentionsChange?.(previous.mentions);\n history.splice(0, history.length, ...previousHistory.entries);\n historyIndex = previousHistory.index;\n queueMicrotask(() => {\n textareaRef?.setSelectionRange(selection?.start ?? token.end, selection?.end ?? token.end);\n syncCaret();\n focus();\n });\n });\n queueMicrotask(() => {\n if (props.draftKey !== key || props.value !== nextValue) return;\n textareaRef?.setSelectionRange(token.start, token.start);\n syncCaret();\n });\n };\n\n const runFiles = async (files: FileList | readonly File[]) => {\n if (!canSelectFiles()) return;\n const selected = Array.from(files);\n if (selected.length === 0) return;\n setAddingFiles(true);\n try {\n await props.fileSelection?.onSelect(selected);\n } catch (error) {\n (props.fileSelection?.onError ?? props.onError)?.(error);\n } finally {\n setAddingFiles(false);\n if (fileInputRef) fileInputRef.value = \"\";\n queueMicrotask(focus);\n }\n };\n\n const submit = async () => {\n if (!canSubmit()) return;\n const key = props.draftKey;\n setSubmitting(true);\n try {\n if (isTouchOnly()) {\n if (commandSheetHeld()) closeCommandList(false);\n // The sheet's Back entry leaves first, so a submit handler that navigates finds the history settled.\n await dialogHistorySettled();\n // A draft that another one replaced, or that may no longer go out, is not sent and keeps its text.\n if (disposed || props.draftKey !== key || !submittable()) return;\n }\n const intent = running() ? runningSubmitIntent() : \"send\";\n const previousValue = props.value;\n const previousAttachments = attachments();\n const previousMentions = mentions();\n const input: ChatSubmitInput = {\n intent,\n text: previousValue,\n mentions: previousMentions,\n attachments: intent !== \"steer\" ? previousAttachments : [],\n };\n await runChatSubmission({\n clear: () => {\n props.onValueChange(\"\");\n props.onMentionsChange?.([]);\n if (intent !== \"steer\") setAttachments([]);\n },\n perform: () => props.onSubmit(input),\n restore: () => {\n // Text typed while the submission ran stays, after the returned draft. Its mentions are read first, because\n // an application may already move them when the text changes.\n const typed = props.value;\n const typedMentions = mentions();\n const shift = previousValue.length + 1;\n props.onValueChange(typed ? `${previousValue}\\n${typed}` : previousValue);\n props.onMentionsChange?.(\n typed\n ? [\n ...previousMentions,\n ...typedMentions.map((mention) => ({ ...mention, start: mention.start + shift, end: mention.end + shift })),\n ]\n : previousMentions,\n );\n if (intent !== \"steer\") setAttachments(previousAttachments);\n },\n onError: props.onError,\n });\n } finally {\n setSubmitting(false);\n queueMicrotask(() => {\n autoResize();\n focus();\n });\n }\n };\n\n const narrowCommand = (command: ChatCommand): boolean => {\n const scope = props.commandScopes?.find((scope) => scope.id === command.scope);\n const word = scope?.words[0];\n const token = commandQuery();\n if (!word || !token || !textareaRef) return false;\n if (addSearch()) {\n setAddQuery(`${word} `);\n return true;\n }\n replaceTextareaRange(textareaRef, token.start + 1, token.end, `${word} `);\n syncCaret();\n return true;\n };\n const executeCommand = async (command: ChatCommand, tab = false) => {\n const token = commandQuery();\n const heldHistory = commandSheetHeld();\n const addSelection = addSearch();\n const fromAdd = addSelection !== undefined;\n if (!token || blocked()) return;\n if (command.disabled || command.reason) {\n // A new object each time, so choosing the same row again inserts and announces its reason again.\n setAnnouncement(command.reason ? { text: command.reason } : undefined);\n return;\n }\n if (command.searchAgain) {\n retrySearch = true;\n setCommandOpening((opening) => opening + 1);\n return;\n }\n if (command.scope && (tab || (!command.action && !command.mention && !command.attachFiles)) && narrowCommand(command)) return;\n if (command.attachFiles) {\n if (!canSelectFiles()) return;\n // The field has the focus before the selection opens, so closing it without a file comes back there.\n endAddSearch(true);\n attachFilesFromCommand(token, addSelection);\n return;\n }\n if (command.open) {\n await openFromCommand(command, command.open, token);\n return;\n }\n // The field has the focus again before an action opens a dialog, so the dialog gives it back there.\n endAddSearch(true);\n // From \"+\" a reference joins the text at the caret, apart from a word right before it.\n const lead = (value: string) => (fromAdd && token.start > 0 && !/\\s/.test(value[token.start - 1] ?? \"\") ? \" \" : \"\");\n const previous = snapshot();\n const key = props.draftKey;\n const replacement = command.mention ? lead(props.value) + command.mention.name + \" \" : \"\";\n const nextValue = props.value.slice(0, token.start) + replacement + props.value.slice(token.end);\n const nextMentions = reconcileChatMentions(props.value, nextValue, mentions());\n if (command.mention) {\n const start = token.start + lead(props.value).length;\n nextMentions.push({ start, end: start + command.mention.name.length, attachment: command.mention });\n }\n // A cancelled or failed command leaves no undo step behind: restoring puts the history back as well.\n const previousHistory = { entries: [...history], index: historyIndex };\n edit(nextValue, nextMentions);\n setDismissed(true);\n setExecuting(true);\n let submitRequested = false;\n let restored = false;\n let mentioned: { value: string; caret: number } | undefined;\n const restore = () => {\n if (props.draftKey !== key || props.value !== nextValue) return;\n setDismissed(true);\n props.onValueChange(previous.value);\n props.onMentionsChange?.(previous.mentions);\n history.splice(0, history.length, ...previousHistory.entries);\n historyIndex = previousHistory.index;\n restored = true;\n };\n showCommandStatus(command.busyLabel ? { tone: \"busy\", text: command.busyLabel } : undefined);\n try {\n // The sheet's Back entry leaves first, so an action that navigates or opens a dialog finds the history settled.\n if (heldHistory && command.action) {\n await dialogHistorySettled();\n // Another draft or no composer any more: the command does not run against it.\n if (disposed || props.draftKey !== key) return;\n }\n const result = await command.action?.({\n setValue: (value) => edit(value),\n submit: () => {\n submitRequested = true;\n },\n focus,\n openModelSelection,\n });\n if (result === \"cancelled\") {\n submitRequested = false;\n restore();\n showCommandStatus();\n } else if (result && \"mention\" in result) {\n // One undo step from the token to the reference, as if the row had been a reference itself.\n if (props.draftKey === key && props.value === nextValue) {\n restore();\n restored = false;\n const name = result.mention.name;\n const start = token.start + lead(previous.value).length;\n const withMention = previous.value.slice(0, token.start) + lead(previous.value) + name + \" \" + previous.value.slice(token.end);\n edit(withMention, [\n ...reconcileChatMentions(previous.value, withMention, previous.mentions),\n { start, end: start + name.length, attachment: result.mention },\n ]);\n setDismissed(true);\n mentioned = { value: withMention, caret: start + name.length + 1 };\n showCommandStatus();\n } else {\n // The pick is lost; say so, also when the draft moved to another key meanwhile (such as a new chat saved\n // while the dialog was open), so it never ends in silence.\n showCommandStatus({ tone: \"error\", text: chatMessages().commandDraftChanged });\n }\n } else if (result) {\n showCommandStatus({ tone: \"done\", text: result.done });\n }\n } catch (error) {\n submitRequested = false;\n restore();\n // An unmounted composer has no status line left; the app's error channel keeps the failure from going silent.\n if (disposed) props.onError?.(error);\n else\n showCommandStatus({ tone: \"error\", text: error instanceof Error && error.message ? error.message : chatMessages().commandFailed });\n } finally {\n if (commandStatus()?.tone === \"busy\") showCommandStatus();\n setExecuting(false);\n }\n if (submitRequested && props.draftKey === key) await submit();\n queueMicrotask(() => {\n if (props.draftKey !== key) return;\n if (restored || props.value === nextValue || (mentioned && props.value === mentioned.value)) {\n const position = restored ? token.end : (mentioned?.caret ?? token.start + replacement.length);\n textareaRef?.setSelectionRange(\n restored && addSelection ? addSelection.start : position,\n restored && addSelection ? addSelection.end : position,\n );\n }\n syncCaret();\n autoResize();\n focus();\n });\n };\n\n /**\n * Runs an `open` row with the token and the list in place. Success removes the token in one undo step; `failed`\n * stays in the row while the list is still there, otherwise the status line says it, so it never ends in silence.\n */\n const openFromCommand = async (command: ChatCommand, open: NonNullable<ChatCommand[\"open\"]>, token: { start: number; end: number }) => {\n const key = props.draftKey;\n const row = chatCommandKey(command);\n const value = props.value;\n const nextValue = value.slice(0, token.start) + value.slice(token.end);\n const nextMentions = reconcileChatMentions(value, nextValue, mentions());\n // Still the same draft and `/…`, so the row is where the person chose it.\n const inPlace = () => !disposed && props.draftKey === key && props.value === value && commandQuery()?.start === token.start;\n const heldHistory = commandSheetHeld();\n // Closing the list or leaving the composer cancels the opening; the row ends at once, without waiting for it.\n const controller = new AbortController();\n const run = { controller, key, label: command.busyLabel ?? chatMessages().commandOpening, follow: false, moved: false };\n openingRun = run;\n const cancelled = new Promise<\"cancelled\">((resolve) =>\n controller.signal.addEventListener(\"abort\", () => resolve(\"cancelled\"), { once: true }),\n );\n setOpenFailures(({ [row]: _, ...rest }) => rest);\n setOpeningRow(row);\n setExecuting(true);\n // An opening that ends without leaving, by failure, rejection or cancelling, also aborts `signal`, so the opener\n // can put back what it saved without the token.\n const finish = (left = false) => {\n if (!left) controller.abort();\n if (openingRun === run) openingRun = undefined;\n if (commandStatus()?.tone === \"busy\") showCommandStatus();\n setOpeningRow(undefined);\n setExecuting(false);\n };\n let result: ChatCommandOpenResult;\n try {\n if (heldHistory) {\n await dialogHistorySettled();\n if (!inPlace()) {\n finish();\n return;\n }\n }\n result = await Promise.race([\n open({ value: nextValue, mentions: nextMentions }, controller.signal, () => {\n run.follow = true;\n }),\n cancelled,\n ]);\n } catch (error) {\n finish();\n if (disposed) {\n props.onError?.(error);\n return;\n }\n if (inPlace()) closeCommandList();\n showCommandStatus({ tone: \"error\", text: error instanceof Error && error.message ? error.message : chatMessages().commandFailed });\n return;\n }\n if (!result) {\n // Success: the token leaves and the list closes in the same step that ends the opening, so a phone sheet never\n // takes its Back entry again while the page navigates.\n batch(() => {\n if (!disposed && props.draftKey === key && props.value === value) {\n edit(nextValue, nextMentions);\n setDismissed(true);\n }\n endAddSearch(!disposed && props.draftKey === key);\n finish(true);\n });\n queueMicrotask(() => {\n if (disposed || props.draftKey !== key || props.value !== nextValue) return;\n textareaRef?.setSelectionRange(token.start, token.start);\n syncCaret();\n autoResize();\n });\n return;\n }\n finish();\n if (result === \"cancelled\") return;\n if (inPlace()) {\n setOpenFailures((failures) => ({ ...failures, [row]: result.failed }));\n setAnnouncement({ text: result.failed });\n } else if (disposed) props.onError?.(new Error(result.failed));\n else showCommandStatus({ tone: \"error\", text: result.failed });\n };\n\n /** Replaces `start`–`end` with the emoji through the editing path, so the browser's undo restores the shortcode. */\n const insertEmoji = (start: number, end: number, emoji: string) => {\n if (!textareaRef || editBlocked()) return;\n replaceTextareaRange(textareaRef, start, end, emoji);\n syncCaret();\n reportChatFailure(() => props.emoji?.onPick?.(emoji), props.onError);\n };\n /** Replaces `@query` with \"@Name\" as a mention and a space, as one edit the person can undo. */\n const pickPersonSuggestion = (position: number) => {\n const token = peopleQuery();\n const person = peopleMatches()[position];\n if (!token || !person || !textareaRef || editBlocked()) return;\n const text = `@${person.name}`;\n const nextValue = `${props.value.slice(0, token.start)}${text} ${props.value.slice(token.end)}`;\n const nextMentions = reconcileChatMentions(props.value, nextValue, mentions());\n nextMentions.push({\n start: token.start,\n end: token.start + text.length,\n attachment: { id: person.id, name: text, kind: \"resource\", icon: person.agent ? \"ti ti-robot\" : \"ti ti-user\" },\n });\n edit(nextValue, nextMentions);\n setPeopleMatches([]);\n const after = token.start + text.length + 1;\n queueMicrotask(() => {\n textareaRef?.setSelectionRange(after, after);\n syncCaret();\n });\n };\n const pickEmojiSuggestion = (position: number) => {\n const token = emojiQuery();\n const entry = emojiMatches()[position];\n if (!token || !entry) return;\n insertEmoji(token.start, token.end, emojiInTone(entry, props.emoji?.skinTone ?? 0));\n };\n /**\n * A typed colon loads the emoji data, and the closing colon of a known `:shortcode:` turns it into its emoji. A\n * shortcode closed before the data arrived turns when it arrives, as long as nothing changed in the meantime.\n */\n const completeShortcode = () => {\n const textarea = textareaRef;\n if (!props.emoji || !textarea) return;\n const { value, selectionStart: caret } = textarea;\n const completed = completedEmojiShortcode(value, caret);\n const convert = (index: EmojiIndex) => {\n const entry = completed && index.byShortcode.get(completed.shortcode.toLowerCase());\n if (completed && entry) insertEmoji(completed.start, completed.end, emojiInTone(entry, props.emoji?.skinTone ?? 0));\n };\n const index = emojiIndex();\n if (index) {\n convert(index);\n return;\n }\n loadEmojiIndex().then(\n (loaded) => {\n setEmojiIndex(loaded);\n const untouched = textarea.value === value && textarea.selectionStart === caret && textarea.selectionEnd === caret;\n if (untouched && textarea.matches(\":focus\")) convert(loaded);\n },\n () => undefined,\n );\n };\n\n /** Moving through and choosing in the command list, from the field or from the search field opened by \"+\". */\n const commandListKey = (event: KeyboardEvent): boolean => {\n if (!commandsOpen()) return false;\n const matches = commandMatches();\n if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n const index = matches.indexOf(selectedCommand()!);\n const next = matches[nextChatCommandIndex(index, matches.length, event.key === \"ArrowUp\" ? -1 : 1)];\n setActiveCommandKey(next ? chatCommandKey(next) : undefined);\n setCommandMoved(true);\n setAnnouncement(undefined);\n return true;\n }\n // Ctrl/⌘+Enter sends, also while suggestions are open.\n const plain = !event.shiftKey && !event.altKey && !event.ctrlKey && !event.metaKey;\n if (plain && (event.key === \"Tab\" || event.key === \"Enter\") && matches.length > 0) {\n event.preventDefault();\n const command = selectedCommand();\n // A server row answering an earlier query may no longer match; wait for fresh results. Local rows match now.\n const row = commandModel().rows.find((row) => chatCommandKey(row.command) === selectedCommandKey());\n const staleServerRow =\n row?.server && (searchResultsQuery() !== commandQuery()?.query || searchResultsScope() !== parsedCommandQuery().scope?.id);\n if (staleServerRow) return true;\n if (command) void executeCommand(command, event.key === \"Tab\");\n return true;\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n closeCommandList();\n return true;\n }\n return false;\n };\n\n const onAddSearchKeyDown = (event: KeyboardEvent) => {\n // Nothing chooses while an input method composes, as in the field.\n if (event.isComposing || event.keyCode === 229 || addComposing) return;\n if (event.key === \"Escape\" && openingRun) {\n event.preventDefault();\n openingRun.controller.abort();\n endAddSearch(true);\n return;\n }\n if (commandListKey(event)) return;\n // Ctrl/⌘+Enter sends from the search field as from the field, with the list closed first.\n if (event.key === \"Enter\" && (event.ctrlKey || event.metaKey) && !event.shiftKey && !event.altKey) {\n event.preventDefault();\n endAddSearch(true);\n void submit();\n }\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n // WebKit ends the composition before the keydown of the Enter that confirms it; that keydown keeps keyCode 229.\n if (event.isComposing || event.keyCode === 229 || composing()) return;\n // Escape cancels a running `open` row, also once its list is gone because the draft moved to a new chat.\n if (event.key === \"Escape\" && openingRun) {\n event.preventDefault();\n openingRun.controller.abort();\n if (commandsOpen()) closeCommandList();\n return;\n }\n if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === \"z\") {\n event.preventDefault();\n restoreHistory(event.shiftKey ? 1 : -1);\n return;\n }\n if (emojiOpen() || peopleOpen()) {\n const count = emojiOpen() ? emojiMatches().length : peopleMatches().length;\n if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n setSelectedCommandIndex((index) => nextChatCommandIndex(index, count, event.key === \"ArrowUp\" ? -1 : 1));\n return;\n }\n // Only a plain Enter or Tab picks: Shift+Enter still breaks the line, Shift+Tab still moves the focus back.\n const plain = !event.shiftKey && !event.altKey && !event.ctrlKey && !event.metaKey;\n if (plain && (event.key === \"Enter\" || event.key === \"Tab\")) {\n event.preventDefault();\n if (emojiOpen()) pickEmojiSuggestion(selectedCommandIndex());\n else pickPersonSuggestion(selectedCommandIndex());\n return;\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n setDismissed(true);\n return;\n }\n }\n if (commandListKey(event)) return;\n const format = props.formatting && textareaRef ? formatShortcut(event) : undefined;\n if (format && textareaRef) {\n event.preventDefault();\n if (editBlocked()) return;\n format.run(textareaRef);\n return;\n }\n if (event.key !== \"Enter\") return;\n if (conversation()) {\n const action = conversationEnterAction(event, {\n sendKey: props.sendKey ?? \"enter\",\n touchOnly: isTouchOnly(),\n inCodeBlock: openCodeFence(props.value, textareaRef?.selectionStart ?? props.value.length) !== null,\n });\n if (action === \"send\") {\n event.preventDefault();\n void submit();\n }\n return;\n }\n const send = props.sendKey === \"mod-enter\" ? event.ctrlKey || event.metaKey : !event.shiftKey;\n if (send && !event.isComposing) {\n event.preventDefault();\n void submit();\n }\n };\n\n const insertText = (text: string) => {\n if (!textareaRef || editBlocked()) return;\n replaceTextareaRange(textareaRef, textareaRef.selectionStart, textareaRef.selectionEnd, text);\n };\n\n let holdTimer: ReturnType<typeof setTimeout> | undefined;\n let held = false;\n const releaseHold = () => {\n clearTimeout(holdTimer);\n holdTimer = undefined;\n };\n onCleanup(releaseHold);\n const microphoneDisabled = () => Boolean(props.microphone?.disabled || blocked() || dictation() === \"refining\");\n const microphoneItems = (): readonly DropdownItemData[] => {\n const microphone = props.microphone;\n const items: DropdownItemData[] = [];\n if (microphone?.onDictate) {\n const dictate = microphone.onDictate;\n items.push({ icon: \"ti ti-microphone\", label: chatMessages().dictate, action: () => reportChatFailure(dictate, props.onError) });\n }\n if (microphone?.onVoiceMessage) {\n const record = microphone.onVoiceMessage;\n items.push({\n icon: \"ti ti-player-record\",\n label: chatMessages().recordVoiceMessage,\n action: () => reportChatFailure(record, props.onError),\n });\n }\n return items;\n };\n const dictationStatus = (): { icon: string; text: string } | null => {\n switch (dictation()) {\n case \"listening\":\n return { icon: \"ti ti-microphone\", text: chatMessages().dictationListening };\n case \"refining\":\n return { icon: \"ti ti-loader-2 k2b-spin\", text: chatMessages().dictationRefining };\n case \"refined\":\n return { icon: \"ti ti-sparkles\", text: chatMessages().dictationRefined };\n case \"unrefined\":\n return { icon: \"ti ti-microphone\", text: chatMessages().dictationUnrefined };\n case \"interrupted\":\n return { icon: \"ti ti-alert-triangle\", text: chatMessages().dictationInterrupted };\n default:\n return null;\n }\n };\n\n const fileInput = () => (\n <Show when={props.fileSelection}>\n <input\n ref={fileInputRef}\n class=\"k2b-sr-only\"\n type=\"file\"\n tabIndex={-1}\n aria-hidden=\"true\"\n accept={props.fileSelection?.accept}\n multiple={props.fileSelection?.multiple ?? true}\n onChange={(event) => {\n if (event.currentTarget.files?.length) void runFiles(event.currentTarget.files);\n }}\n />\n </Show>\n );\n\n const addMenu = (icon: string, extraClass = \"\") => (\n <Dropdown.Root position=\"top-right\" label={chatMessages().addToChat} items={menuItems()} disabled={blocked()}>\n <Dropdown.Trigger\n appearance=\"plain\"\n class={`k2b-chat-composer__icon-action${extraClass}`}\n data-chat-composer-add=\"\"\n label={chatMessages().addToChat}\n tooltip={chatMessages().addToChat}\n >\n <i class={icon} aria-hidden=\"true\" />\n </Dropdown.Trigger>\n </Dropdown.Root>\n );\n\n /** \"+\" as the way to the slash list on keyboards without a handy \"/\". */\n const addSearchButton = (extraClass = \"\") => (\n <Tooltip.Trigger\n ref={addButtonRef}\n type=\"button\"\n class={`k2b-chat-composer__icon-action${extraClass}`}\n aria-label={chatMessages().addMenu}\n aria-haspopup=\"listbox\"\n aria-expanded={addSearch() !== undefined}\n aria-controls={addSearch() ? commandListId : undefined}\n content={chatMessages().addMenu}\n disabled={blocked()}\n // The field keeps its focus and selection until the search field takes over, and a phone its keyboard.\n onMouseDown={keepFieldFocus}\n onClick={toggleAddSearch}\n >\n <i class={addingFiles() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-plus\"} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n );\n\n /** The conversation's attach button opens the file choice directly; other actions turn it into the add menu. */\n const attachControl = () => (\n <Show when={!addOpensCommands()} fallback={addSearchButton(\" k2b-chat-composer__attach\")}>\n {attachChoice()}\n </Show>\n );\n const attachChoice = () => (\n <Show\n when={props.menuActions?.length}\n fallback={\n <Show when={props.fileSelection}>\n {(selection) => (\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action k2b-chat-composer__attach\"\n aria-label={selection().label ?? chatMessages().attachFiles}\n content={selection().label ?? chatMessages().attachFiles}\n disabled={!canSelectFiles()}\n onClick={() => chooseFiles()}\n >\n <i class={addingFiles() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-plus\"} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n )}\n </Show>\n }\n >\n {addMenu(\"ti ti-plus\", \" k2b-chat-composer__attach\")}\n </Show>\n );\n\n const formatToggle = () => (\n <Show when={props.formatting}>\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action k2b-chat-composer__format-toggle\"\n aria-label={chatMessages().composerFormatting}\n aria-pressed={formattingOpen()}\n aria-controls={formattingOpen() ? formatGroupId : undefined}\n content={chatMessages().composerFormatting}\n onMouseDown={keepFieldFocus}\n onClick={() => setFormattingOpen((open) => !open)}\n >\n <i class=\"ti ti-letter-case\" aria-hidden=\"true\" />\n </Tooltip.Trigger>\n </Show>\n );\n\n /** One row of fixed height. It shows every button at once, also on a phone, so nothing hides behind a scroll. */\n const formatRow = () => (\n <Show when={props.formatting && formattingOpen()}>\n <div id={formatGroupId} class=\"k2b-chat-composer__format\" role=\"group\" aria-label={chatMessages().composerFormatting}>\n <For each={formatTools}>\n {(tool) => (\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action\"\n aria-label={tool.label(markdownToolbarMessages())}\n content={tool.label(markdownToolbarMessages())}\n disabled={editBlocked()}\n onMouseDown={keepFieldFocus}\n onClick={() => {\n if (textareaRef) tool.run(textareaRef);\n }}\n >\n <i class={tool.icon} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n )}\n </For>\n </div>\n </Show>\n );\n\n const emojiButton = () => (\n <Show when={props.emoji}>\n {(emoji) => (\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action k2b-chat-composer__emoji\"\n aria-label={chatMessages().insertEmoji}\n content={chatMessages().insertEmoji}\n disabled={editBlocked()}\n onMouseDown={keepFieldFocus}\n onClick={(event) => {\n const anchor = event.currentTarget;\n reportChatFailure(() => emoji().onOpen({ anchor, insert: insertText }), props.onError);\n }}\n >\n <i class=\"ti ti-mood-smile\" aria-hidden=\"true\" />\n </Tooltip.Trigger>\n )}\n </Show>\n );\n\n const microphoneControl = () => (\n <Show when={props.microphone?.onDictate || props.microphone?.onVoiceMessage ? props.microphone : undefined}>\n {(microphone) => (\n <div ref={microphoneRef} class=\"k2b-chat-composer__microphone\">\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action k2b-chat-composer__microphone-button\"\n data-state={dictation() ?? undefined}\n disabled={microphoneDisabled()}\n aria-pressed={microphone().onDictate ? dictation() === \"listening\" : undefined}\n aria-haspopup={microphone().onDictate ? undefined : \"menu\"}\n aria-expanded={microphone().onDictate ? undefined : microphoneMenuOpen()}\n // A toggle keeps its name; the pressed state says that dictation runs.\n aria-label={microphone().onDictate ? chatMessages().dictate : chatMessages().recordVoiceMessage}\n content={\n dictation() === \"listening\"\n ? chatMessages().stopDictation\n : microphone().onDictate\n ? microphone().onVoiceMessage\n ? chatMessages().dictateOrHold\n : chatMessages().dictate\n : chatMessages().recordVoiceMessage\n }\n onMouseDown={keepFieldFocus}\n onContextMenu={(event) => event.preventDefault()}\n onPointerDown={(event) => {\n held = false;\n releaseHold();\n const record = microphone().onVoiceMessage;\n if (event.button !== 0 || !record || dictation() === \"listening\") return;\n holdTimer = setTimeout(() => {\n // The composer may have become blocked, or recording withdrawn, during the press.\n const current = props.microphone?.onVoiceMessage;\n if (!current || microphoneDisabled()) return;\n held = true;\n reportChatFailure(current, props.onError);\n }, microphoneHoldMs);\n }}\n onPointerUp={releaseHold}\n onPointerCancel={releaseHold}\n onPointerLeave={releaseHold}\n onClick={(event) => {\n // A press that already asked for a voice message ends here; a key press never holds.\n if (held) {\n held = false;\n if (event.detail > 0) return;\n }\n const dictate = microphone().onDictate;\n if (dictate) {\n reportChatFailure(dictate, props.onError);\n return;\n }\n setMicrophoneMenuOpen(true);\n // From the keyboard it opens the menu like a menu button: the focus moves to the first item.\n if (event.detail === 0) {\n queueMicrotask(() => microphoneRef?.querySelector<HTMLElement>('[role=\"menuitem\"]:not(:disabled)')?.focus());\n }\n }}\n >\n <i\n class={\n dictation() === \"listening\"\n ? \"ti ti-player-stop\"\n : dictation() === \"refining\"\n ? \"ti ti-loader-2 k2b-spin\"\n : \"ti ti-microphone\"\n }\n aria-hidden=\"true\"\n />\n </Tooltip.Trigger>\n <Show when={microphone().onVoiceMessage}>\n <Dropdown.Root\n position=\"top-left\"\n label={chatMessages().microphoneOptions}\n items={microphoneItems()}\n disabled={microphoneDisabled()}\n open={microphoneMenuOpen()}\n onOpenChange={setMicrophoneMenuOpen}\n >\n <Dropdown.Trigger\n appearance=\"plain\"\n class=\"k2b-chat-composer__icon-action k2b-chat-composer__microphone-menu\"\n label={chatMessages().microphoneOptions}\n tooltip={chatMessages().microphoneOptions}\n >\n <i class=\"ti ti-chevron-up\" aria-hidden=\"true\" />\n </Dropdown.Trigger>\n </Dropdown.Root>\n </Show>\n </div>\n )}\n </Show>\n );\n\n const sendControl = () => (\n <Show\n when={running() && !hasDraft() && props.onStop}\n fallback={\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__send\"\n disabled={!canSubmit()}\n onMouseDown={(event) => {\n if (conversation()) keepFieldFocus(event);\n }}\n aria-label={\n submitting()\n ? running()\n ? runningSubmitIntent() === \"queue\"\n ? chatMessages().queueing\n : chatMessages().steering\n : chatMessages().sending\n : running()\n ? runningSubmitIntent() === \"queue\"\n ? chatMessages().queueMessage\n : chatMessages().steerResponse\n : chatMessages().sendMessage\n }\n content={\n running()\n ? runningSubmitIntent() === \"queue\"\n ? chatMessages().queueMessage\n : chatMessages().steerResponse\n : chatMessages().sendMessage\n }\n onClick={() => void submit()}\n >\n <i class={submitting() ? \"ti ti-loader-2 k2b-spin\" : conversation() ? \"ti ti-send\" : \"ti ti-arrow-up\"} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n }\n >\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__stop\"\n disabled={stopping()}\n aria-label={stopping() ? chatMessages().stopping : chatMessages().stopResponse}\n content={chatMessages().stopResponse}\n onClick={() => reportChatFailure(() => props.onStop?.(), props.onError)}\n >\n <i class={stopping() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-player-stop\"} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n </Show>\n );\n\n const field = () => (\n <div class=\"k2b-chat-composer__input\" role=\"group\" aria-label={chatMessages().messageInput}>\n <Show when={mentions().length > 0}>\n <div ref={highlightRef} class=\"k2b-chat-composer__highlight\" aria-hidden=\"true\">\n <For each={chatMentionSegments(props.value, mentions())}>\n {(part) => <span classList={{ \"k2b-chat-composer__mention\": Boolean(part.mention) }}>{part.text}</span>}\n </For>\n {\"\\n\"}\n </div>\n </Show>\n {/* biome-ignore lint/a11y/useAriaPropsSupportedByRole: popup attributes are conditional with the combobox role */}\n <textarea\n ref={textareaRef}\n classList={{ \"k2b-chat-composer__textarea--highlighted\": mentions().length > 0 }}\n rows={1}\n value={props.value}\n // An `open` row keeps the field focused, so the list stays, and only read-only while it runs.\n disabled={editBlocked() && openingRow() === undefined}\n readOnly={openingRow() !== undefined}\n enterkeyhint={conversation() ? \"enter\" : undefined}\n placeholder={\n props.placeholder ??\n (running() ? chatMessages().addGuidance : conversation() ? chatMessages().writeConversationMessage : chatMessages().writeMessage)\n }\n aria-label={props.inputLabel ?? messages().message}\n // A list opened from \"+\" belongs to its search field.\n role={fieldOwnsList() ? \"combobox\" : undefined}\n aria-autocomplete={fieldOwnsList() ? \"list\" : undefined}\n aria-controls={fieldOwnsList() ? commandListId : undefined}\n aria-expanded={fieldOwnsList() ? \"true\" : undefined}\n aria-activedescendant={\n !fieldOwnsList()\n ? undefined\n : emojiOpen() || peopleOpen()\n ? `${commandListId}-${selectedCommandIndex()}`\n : selectedCommand()\n ? commandOptionId(selectedCommand()!)\n : undefined\n }\n onInput={(event) => {\n batch(() => {\n edit(event.currentTarget.value);\n syncCaret();\n });\n autoResize();\n const input = event as InputEvent;\n if (input.inputType === \"insertText\" && input.data === \":\") queueMicrotask(completeShortcode);\n }}\n onPaste={(event) => {\n // Read-only while an `open` row runs: nothing may join the draft after it was saved.\n if (editBlocked()) {\n event.preventDefault();\n return;\n }\n const clipboardData = event.clipboardData;\n if (canSelectFiles() && clipboardData?.files.length) {\n event.preventDefault();\n void runFiles(clipboardData.files);\n return;\n }\n props.onPaste?.(event);\n }}\n onSelect={syncCaret}\n onBlur={() => setDismissed(true)}\n onClick={() => {\n setDismissed(false);\n syncCaret();\n }}\n onKeyUp={syncCaret}\n onCompositionStart={() => setComposing(true)}\n onCompositionEnd={() => {\n setComposing(false);\n syncCaret();\n }}\n onScroll={() => {\n if (highlightRef && textareaRef) highlightRef.scrollTop = textareaRef.scrollTop;\n }}\n onBeforeInput={(event) => {\n inputStart = event.currentTarget.selectionStart;\n inputEnd = event.currentTarget.selectionEnd;\n if (event.inputType === \"historyUndo\" || event.inputType === \"historyRedo\") {\n event.preventDefault();\n restoreHistory(event.inputType === \"historyUndo\" ? -1 : 1);\n }\n }}\n onKeyDown={onKeyDown}\n />\n <Show when={conversation()}>\n <textarea ref={measureRef} class=\"k2b-chat-composer__measure\" rows={1} tabIndex={-1} aria-hidden=\"true\" readOnly />\n </Show>\n </div>\n );\n\n // A press on a row remembers its command. The host can rebuild the list, or the whole menu, between press and release;\n // the browser then sends the click to a common ancestor (#2140). A release on the same command's new row runs it.\n let pressedCommand: { key: string; row: HTMLElement } | undefined;\n onMount(() => {\n const release = (event: PointerEvent | FocusEvent) => {\n const pressed = pressedCommand;\n pressedCommand = undefined;\n // After this release's click, which the browser dispatches in the same task.\n if (holdingRows()) setTimeout(() => setHoldingRows(false));\n if (!pressed || pressed.row.isConnected || !(event instanceof PointerEvent) || event.type !== \"pointerup\") return;\n const under = document.elementFromPoint(event.clientX, event.clientY)?.closest<HTMLElement>(\"[data-command-key]\");\n if (!under || under.dataset.commandKey !== pressed.key || !shellRef?.contains(under)) return;\n const command = commandRowMap().get(pressed.key)?.command;\n if (command) void executeCommand(command);\n };\n window.addEventListener(\"pointerup\", release, true);\n window.addEventListener(\"pointercancel\", release, true);\n window.addEventListener(\"blur\", release);\n onCleanup(() => {\n window.removeEventListener(\"pointerup\", release, true);\n window.removeEventListener(\"pointercancel\", release, true);\n window.removeEventListener(\"blur\", release);\n });\n });\n // Rows are keyed by the command's key, not its object: hosts rebuild their command objects whenever their inputs change,\n // and a row replaced between the press and the release would swallow the click (#2140).\n const commandRowMap = createMemo(() => new Map(commandModel().rows.map((row) => [chatCommandKey(row.command), row])));\n const commandGroupKey = (group: ReturnType<typeof commandModel>[\"groups\"][number]) =>\n group.scopeTitle ? \"scope\" : group.section ? `section:${group.section.id}` : \"flat\";\n const renderCommandRow = (initial: ChatCommand) => {\n const key = chatCommandKey(initial);\n const command = () => commandRowMap().get(key)?.command ?? initial;\n const highlight = () => commandRowMap().get(key)?.highlight;\n const title = () => command().label ?? command().name;\n const opening = () => openingRow() === key;\n const failure = () => openFailures()[key];\n return (\n <button\n class=\"k2b-chat-composer__command\"\n id={commandOptionId(command())}\n type=\"button\"\n role=\"option\"\n tabIndex={-1}\n aria-selected={selectedCommandKey() === key}\n aria-disabled={Boolean(command().disabled || command().reason)}\n aria-busy={opening() ? \"true\" : undefined}\n aria-describedby={command().reason ? `${commandOptionId(command())}-reason` : undefined}\n data-reason={command().reason ? \"true\" : undefined}\n data-active={selectedCommandKey() === key ? \"true\" : undefined}\n data-command-key={key}\n onPointerDown={(event) => {\n pressedCommand = { key, row: event.currentTarget };\n setHoldingRows(true);\n }}\n onMouseDown={keepFieldFocus}\n onClick={(event) => {\n event.preventDefault();\n void executeCommand(command());\n }}\n >\n <i class={command().icon ?? \"ti ti-slash\"} aria-hidden=\"true\" />\n <span class=\"k2b-chat-composer__command-text\">\n <strong>\n <Show when={highlight()} fallback={title()}>\n {(range) => (\n <>\n {title().slice(0, range()[0])}\n <b>{title().slice(range()[0], range()[1])}</b>\n {title().slice(range()[1])}\n </>\n )}\n </Show>\n </strong>\n <Show\n when={command().open && !command().reason}\n fallback={\n <Show when={command().reason ?? command().description}>\n <small id={command().reason ? `${commandOptionId(command())}-reason` : undefined}>\n {command().reason ?? command().description}\n </small>\n </Show>\n }\n >\n {/* The busy line shares the description's place, so the row keeps its height while it opens. */}\n <span class=\"k2b-chat-composer__command-detail\" data-state={opening() ? \"busy\" : failure() ? \"failed\" : undefined}>\n <small aria-hidden={opening() ? \"true\" : undefined}>{failure() ?? command().description}</small>\n <small aria-hidden={opening() ? undefined : \"true\"}>\n <i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />\n {command().busyLabel ?? chatMessages().commandOpening}\n </small>\n </span>\n </Show>\n </span>\n <Show when={command().selected}>\n <span class=\"k2b-chat-composer__command-end\">\n <i class=\"ti ti-check\" aria-hidden=\"true\" />\n <span class=\"k2b-sr-only\">{chatMessages().commandSelected}</span>\n </span>\n </Show>\n </button>\n );\n };\n const replyQuote = (reply: ChatComposerReply) => (\n <>\n <span class=\"k2b-message-row__quote-author\">\n <span class=\"k2b-sr-only\">{chatMessages().replyingTo} </span>\n {reply.author}\n </span>\n <span class=\"k2b-message-row__quote-text\">{reply.text}</span>\n </>\n );\n return (\n <div ref={shellRef} class=\"k2b-chat-composer-shell\">\n <Show when={suggestionsOpen() || hasAccessory()}>\n {/* Suggestions alone float above the composer; a row of the shell's grid would add its gap and move the composer. */}\n <div class=\"k2b-chat-composer-slot\" data-overlay={hasAccessory() ? undefined : \"true\"}>\n <div style={{ visibility: suggestionsOpen() ? \"hidden\" : undefined }} inert={suggestionsOpen()}>\n {accessory()}\n </div>\n <Show when={emojiOpen()}>\n <div class=\"k2b-chat-composer-accessory\">\n <div\n ref={commandListRef}\n id={commandListId}\n class=\"k2b-chat-composer__commands\"\n role=\"listbox\"\n aria-label={chatMessages().emojiSuggestions}\n >\n <For each={emojiMatches()}>\n {(entry, index) => (\n <button\n id={`${commandListId}-${index()}`}\n type=\"button\"\n role=\"option\"\n tabIndex={-1}\n aria-selected={index() === selectedCommandIndex()}\n aria-label={emojiName(entry, locale())}\n data-active={index() === selectedCommandIndex() ? \"true\" : undefined}\n onMouseDown={keepFieldFocus}\n onClick={() => pickEmojiSuggestion(index())}\n >\n <span class=\"k2b-chat-composer__emoji-glyph\" aria-hidden=\"true\">\n {emojiInTone(entry, props.emoji?.skinTone ?? 0)}\n </span>\n <strong>{emojiName(entry, locale())}</strong>\n <Show when={entry.shortcodes[0]}>{(code) => <small>:{code()}:</small>}</Show>\n </button>\n )}\n </For>\n </div>\n </div>\n </Show>\n <Show when={peopleOpen()}>\n <div class=\"k2b-chat-composer-accessory\">\n <div\n ref={commandListRef}\n id={commandListId}\n class=\"k2b-chat-composer__commands\"\n role=\"listbox\"\n aria-label={chatMessages().peopleSuggestions}\n >\n <For each={peopleMatches()}>\n {(person, index) => (\n <button\n id={`${commandListId}-${index()}`}\n type=\"button\"\n role=\"option\"\n tabIndex={-1}\n aria-selected={index() === selectedCommandIndex()}\n data-active={index() === selectedCommandIndex() ? \"true\" : undefined}\n onMouseDown={keepFieldFocus}\n onClick={() => pickPersonSuggestion(index())}\n >\n <i class={person.agent ? \"ti ti-robot\" : \"ti ti-user\"} aria-hidden=\"true\" />\n <strong>{person.name}</strong>\n <Show when={person.agent}>\n <small>{chatMessages().agentLabel}</small>\n </Show>\n </button>\n )}\n </For>\n </div>\n </div>\n </Show>\n <Show when={commandsOpen()}>\n {/* biome-ignore lint/a11y/noStaticElementInteractions: the search field inside is the keyboard target; a press elsewhere in the panel only keeps the focus there. */}\n <div\n class=\"k2b-chat-composer-accessory\"\n data-commands=\"\"\n data-search={addSearch() ? \"\" : undefined}\n onMouseDown={(event) => {\n if (addSearch() && event.target !== addSearchRef) event.preventDefault();\n }}\n >\n <Show when={addSearch()}>\n <label class=\"k2b-chat-composer__command-search\">\n <i class=\"ti ti-search\" aria-hidden=\"true\" />\n <input\n ref={addSearchRef}\n type=\"text\"\n role=\"combobox\"\n value={addQuery()}\n placeholder={chatMessages().commandSearch}\n aria-label={chatMessages().commandSearchLabel}\n aria-autocomplete=\"list\"\n aria-controls={commandListId}\n aria-expanded=\"true\"\n aria-activedescendant={selectedCommand() ? commandOptionId(selectedCommand()!) : undefined}\n autocomplete=\"off\"\n autocapitalize=\"off\"\n spellcheck={false}\n // Read-only while an `open` row runs, as the field is.\n readOnly={openingRow() !== undefined}\n onInput={(event) => setAddQuery(event.currentTarget.value)}\n onKeyDown={onAddSearchKeyDown}\n onCompositionStart={() => {\n addComposing = true;\n }}\n onCompositionEnd={() => {\n addComposing = false;\n }}\n onFocusOut={(event) => {\n const next = event.relatedTarget;\n if (next instanceof Node && commandListRef?.parentElement?.contains(next)) return;\n // Focus that leaves another way, such as with Shift+Tab, closes the list and stays where it went.\n queueMicrotask(() => {\n if (addSearch() && document.activeElement !== addSearchRef) endAddSearch(false);\n });\n }}\n />\n </label>\n </Show>\n <div\n ref={commandListRef}\n id={commandListId}\n class=\"k2b-chat-composer__commands\"\n role=\"listbox\"\n aria-label={chatMessages().commands}\n aria-busy={searching() ? \"true\" : undefined}\n >\n <For each={commandModel().groups.map(commandGroupKey)}>\n {(key) => {\n const group = createMemo(() => commandModel().groups.find((group) => commandGroupKey(group) === key));\n const headingId = () =>\n `${commandListId}-g-${key === \"scope\" ? \"scope\" : props.commandSections?.findIndex((section) => section.id === group()?.section?.id)}`;\n const rows = () => group()?.rows.map((row) => chatCommandKey(row.command)) ?? [];\n const row = (key: string) => commandRowMap().get(key)!.command;\n return (\n <Show when={key !== \"flat\"} fallback={<For each={rows()}>{(key) => renderCommandRow(row(key))}</For>}>\n <div class=\"k2b-chat-composer__command-group\" role=\"group\" aria-labelledby={headingId()}>\n <div class=\"k2b-chat-composer__command-heading\" id={headingId()} role=\"presentation\">\n <span>{group()?.scopeTitle ?? group()?.section?.label}</span>\n <Show when={group()?.loading}>\n <i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />\n </Show>\n </div>\n <For each={rows()}>{(key) => renderCommandRow(row(key))}</For>\n <Index each={Array.from({ length: Math.max(group()?.placeholder ? 1 : 0, group()?.pendingRows ?? 0) })}>\n {() => (\n <div class=\"k2b-chat-composer__command-placeholder\" aria-hidden=\"true\">\n <span />\n <span>\n <span />\n <span />\n </span>\n </div>\n )}\n </Index>\n </div>\n </Show>\n );\n }}\n </For>\n <Show\n when={\n searching() && foundCommandCount() === 0 && !commandModel().groups.some((group) => group.section || group.scopeTitle)\n }\n >\n <div role=\"status\" class=\"k2b-chat-composer__loading\">\n <i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />\n <strong>{messages().loading}</strong>\n </div>\n </Show>\n <Show when={searchError()}>\n <div role=\"status\">\n <i class=\"ti ti-alert-circle\" /> {messages().error}\n </div>\n </Show>\n <Show\n when={\n !searching() && !searchError() && foundCommandCount() === 0 && !commandModel().groups.some((group) => group.pendingRows)\n }\n >\n <div role=\"status\">\n {!parsedCommandQuery().query.trim()\n ? messages().noResults\n : chatMessages().commandsNothingFound({ query: parsedCommandQuery().query.trim() })}\n </div>\n </Show>\n {/* After \"Nothing found\", so the way to search further stays in the last place. */}\n {/* Keyed: the row is built anew from each query, and its title says the query. */}\n <Show when={commandModel().fallback?.command} keyed>\n {(command) => renderCommandRow(command)}\n </Show>\n </div>\n </div>\n </Show>\n </div>\n </Show>\n <section\n ref={composerRef}\n class={`k2b-chat-composer ${props.class ?? \"\"}`}\n data-running={running() ? \"true\" : undefined}\n data-variant={conversation() ? \"conversation\" : undefined}\n role=\"group\"\n aria-label={props.label ?? chatMessages().messageComposer}\n >\n <Show when={showHint()}>\n <div class=\"k2b-chat-composer__hint\" aria-live=\"polite\">\n <Show when={dictationStatus()} fallback={<span class=\"k2b-chat-composer__hint-text\">{hint()}</span>}>\n {(status) => (\n <>\n <span class=\"k2b-chat-composer__dictation\" data-state={dictation() ?? undefined}>\n <i class={status().icon} aria-hidden=\"true\" />\n <span>{status().text}</span>\n </span>\n <Show when={dictation() === \"refined\" ? props.microphone?.onRestoreOriginal : undefined}>\n {(restore) => (\n <button\n type=\"button\"\n class=\"k2b-chat-composer__hint-action\"\n disabled={microphoneDisabled()}\n onMouseDown={keepFieldFocus}\n onClick={() => reportChatFailure(restore(), props.onError)}\n >\n {chatMessages().restoreOriginal}\n </button>\n )}\n </Show>\n </>\n )}\n </Show>\n </div>\n </Show>\n <Show when={props.reply}>\n {(reply) => (\n <div class=\"k2b-chat-composer__reply\">\n <Show when={reply().onSelect} fallback={<div class=\"k2b-message-row__quote\">{replyQuote(reply())}</div>}>\n {(select) => (\n <button type=\"button\" class=\"k2b-message-row__quote\" onClick={() => select()()}>\n {replyQuote(reply())}\n </button>\n )}\n </Show>\n <button\n type=\"button\"\n class=\"k2b-chat-composer__icon-action k2b-chat-composer__reply-cancel\"\n aria-label={chatMessages().cancelReply}\n title={chatMessages().cancelReply}\n onMouseDown={keepFieldFocus}\n onClick={() => reply().onCancel()}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </div>\n )}\n </Show>\n <Show when={attachments().length > 0}>\n <div class=\"k2b-chat-composer__attachments\" role=\"list\" aria-label={chatMessages().attachments} tabIndex={0}>\n <For each={attachments()}>\n {(attachment) => (\n <div class=\"k2b-chat-composer__attachment\" role=\"listitem\">\n <div\n class=\"k2b-chat-composer__attachment-content\"\n classList={{ \"k2b-chat-composer__attachment-content--action\": Boolean(attachment.action) }}\n >\n <Show\n when={attachment.href}\n fallback={\n <div class=\"k2b-chat-composer__attachment-identity\">\n <Show\n when={attachment.kind === \"image\" && attachment.previewUrl}\n fallback={<i class={attachmentIcon(attachment)} aria-hidden=\"true\" />}\n >\n <img src={attachment.previewUrl} alt={attachment.alt ?? \"\"} />\n </Show>\n {renderAttachmentCopy(attachment)}\n </div>\n }\n >\n {(href) => (\n <a\n class=\"k2b-chat-composer__attachment-link\"\n href={href()}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={chatMessages().openInNewTab({ name: attachment.name })}\n >\n <Show\n when={attachment.kind === \"image\" && attachment.previewUrl}\n fallback={<i class={attachmentIcon(attachment)} aria-hidden=\"true\" />}\n >\n <img src={attachment.previewUrl} alt={attachment.alt ?? \"\"} />\n </Show>\n {renderAttachmentCopy(attachment)}\n </a>\n )}\n </Show>\n <Show when={attachment.action}>\n {(action) => (\n <button\n type=\"button\"\n class=\"k2b-chat-composer__attachment-action\"\n disabled={blocked() || action().disabled}\n onClick={() => reportChatFailure(() => executeChatAction(action()), props.onError)}\n >\n <Show when={action().icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n {action().label}\n </button>\n )}\n </Show>\n </div>\n <Show when={props.onAttachmentsChange}>\n <button\n type=\"button\"\n class=\"k2b-chat-composer__attachment-remove\"\n aria-label={selectMessages().removeNamed({ name: attachment.name })}\n disabled={blocked()}\n onClick={() => setAttachments(attachments().filter((candidate) => candidate.id !== attachment.id))}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n )}\n </For>\n </div>\n </Show>\n\n <Show\n when={conversation()}\n fallback={\n <>\n {field()}\n\n <Show when={props.error}>\n <div class=\"k2b-chat-composer__error\" role=\"alert\">\n <i class=\"ti ti-alert-circle\" aria-hidden=\"true\" />\n {props.error}\n </div>\n </Show>\n\n {formatRow()}\n\n <footer class=\"k2b-chat-composer__footer\">\n <Show\n when={footer()}\n fallback={\n <>\n <div class=\"k2b-chat-composer__tools\">\n {props.footerTools}\n <Show when={addOpensCommands()} fallback={<Show when={hasAddMenu()}>{addMenu(\"ti ti-plus\")}</Show>}>\n {addSearchButton()}\n </Show>\n {fileInput()}\n {formatToggle()}\n {emojiButton()}\n <Show when={(props.models?.length ?? 0) > 0}>\n <SelectChip\n aria-label={chatMessages().chooseModel}\n position=\"top-right\"\n class=\"k2b-chat-composer__model\"\n menuWidth=\"15rem\"\n placeholder={chatMessages().model}\n value={() => props.selectedModelId ?? \"\"}\n options={(props.models ?? []).map((model) => ({\n value: model.id,\n label: model.label,\n description: model.description,\n icon: model.icon,\n image: model.image,\n }))}\n open={modelOpen()}\n onOpenChange={(open) => {\n if (!choosingModel()) return;\n setModelOpen(open);\n // Dropdown closes before committing the choice; let onValueChange settle it first.\n if (!open)\n queueMicrotask(() => {\n if (!modelOpen()) finishModelSelection(null);\n });\n }}\n disabled={(choosingModel() ? blockedBesidesCommand() : blocked()) || running() || !props.onModelChange}\n onValueChange={(modelId) => {\n props.onModelChange?.(modelId);\n finishModelSelection(modelId);\n queueMicrotask(focus);\n }}\n />\n </Show>\n {props.modelDetails}\n </div>\n\n <div class=\"k2b-chat-composer__submit\">\n <For each={props.contextActions}>\n {(action) => (\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action\"\n data-tone={action.variant === \"danger\" ? \"danger\" : undefined}\n disabled={action.disabled}\n aria-pressed={action.pressed}\n aria-label={action.label}\n content={action.label}\n onClick={() => reportChatFailure(() => executeChatAction(action), props.onError)}\n >\n <i class={action.icon ?? \"ti ti-dots\"} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n )}\n </For>\n <Show when={hasContextUsage() ? (props.contextUsage ?? {}) : undefined}>\n {(usage) => <ContextUsage {...usage()} action={props.contextPopupAction} onActionError={props.onError} />}\n </Show>\n {props.submitTools}\n {microphoneControl()}\n {sendControl()}\n </div>\n </>\n }\n >\n {footer()}\n </Show>\n </footer>\n </>\n }\n >\n <Show when={props.error}>\n <div class=\"k2b-chat-composer__error\" role=\"alert\">\n <i class=\"ti ti-alert-circle\" aria-hidden=\"true\" />\n {props.error}\n </div>\n </Show>\n {formatRow()}\n {/* One row: attach, the field with its tools, and Send. */}\n <div class=\"k2b-chat-composer__row\">\n {attachControl()}\n {fileInput()}\n <div class=\"k2b-chat-composer__field\">\n {field()}\n <div class=\"k2b-chat-composer__field-tools\">\n {formatToggle()}\n {emojiButton()}\n {microphoneControl()}\n </div>\n </div>\n {sendControl()}\n </div>\n </Show>\n {/* Files dropped anywhere in the surrounding workspace area attach to the message. */}\n <Show when={props.fileSelection}>\n {(selection) => (\n <FileDropTarget\n label={chatMessages().dropFilesToAttach}\n accept={selection().accept}\n multiple={selection().multiple}\n disabled={!canSelectFiles()}\n onDrop={(files) => void runFiles(files)}\n />\n )}\n </Show>\n </section>\n <div class=\"k2b-sr-only\" role=\"status\" aria-live=\"polite\">\n <Show when={suggestionAnnouncement()} keyed>\n {(announced) => <span>{announced.text}</span>}\n </Show>\n </div>\n <div class=\"k2b-chat-composer__status\" role=\"status\">\n <Show when={!suggestionsOpen() && commandStatus()}>\n {(status) => (\n <div class=\"k2b-chat-composer__status-line\" data-tone={status().tone}>\n <i\n aria-hidden=\"true\"\n class={\n status().tone === \"busy\" ? \"ti ti-loader-2 k2b-spin\" : status().tone === \"done\" ? \"ti ti-check\" : \"ti ti-alert-circle\"\n }\n />\n <span>{status().text}</span>\n </div>\n )}\n </Show>\n <Show when={suggestionsOpen() && announcement()} keyed>\n {(announced) => <span class=\"k2b-sr-only\">{announced.text}</span>}\n </Show>\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|