@sarchauhan/chat 0.0.0-stage → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/components/Chat.tsx","../src/theme/theme.context.tsx","../src/theme/theme.toggle.tsx","../src/components/Chat/chat.tsx","../src/lib/utils.ts","../src/motion/classes.ts","../src/motion/helpers.ts","../src/motion/text-swap.tsx","../src/motion/use-dropdown-presence.ts","../src/components/Chat/chat.attachments.tsx","../src/components/Chat/context/index.ts","../src/components/Chat/context/composer.context.tsx","../src/components/Chat/chat.tooltip.tsx","../src/components/Chat/context/message.helpers.ts","../src/components/Chat/context/messages.context.tsx","../src/lib/message/user.ts","../src/components/Chat/context/model.context.tsx","../src/components/Chat/context/types.ts","../src/components/Chat/context/thread.context.tsx","../src/components/Chat/context/chat.provider.tsx","../src/components/Chat/chat.input.tsx","../src/components/Chat/chat.references.tsx","../src/components/Chat/chat.send.tsx","../src/components/Chat/chat.select.tsx","../src/ui/select.tsx","../src/components/Message/message.item.tsx","../src/components/Message/message.content.tsx","../src/lib/message/segment.ts","../src/widgets/artifact.tsx","../src/widgets/responsive-detail.tsx","../src/widgets/compute.ts","../src/widgets/registry.tsx","../src/widgets/subagent.tsx","../src/widgets/patch.tsx","../src/widgets/tool-frame.tsx","../src/widgets/question.tsx","../src/widgets/read-file.tsx","../src/widgets/search.tsx","../src/components/Widget/widget.context.tsx","../src/ui/button.tsx","../src/components/Message/message.skeleton.tsx","../src/components/Widget/widget.renderer.tsx","../src/components/Widget/base.widget.tsx","../src/components/Message/message.markdown.tsx","../src/components/Message/message.markdown.theme.ts","../src/components/Message/message.thinking.tsx","../src/components/Message/message.loading.tsx","../src/components/Message/message.feedback.tsx","../src/components/Message/message.copy.tsx","../src/components/Message/message.regenerate.tsx","../src/components/Message/message.usage.tsx","../src/components/Message/message.tsx","../src/widgets/index.ts"],"sourcesContent":["export { Chat } from \"./components/Chat\";\nexport { ChatComposer, type ComposerCollapsedVariant } from \"./components/Chat/chat\";\nexport {\n ChatContextProvider,\n ProviderId,\n isProviderId,\n parseRegistryConfig,\n useChat,\n useComposer,\n useMessages,\n useModel,\n useThread,\n type ChatReference,\n type ComposerAttachment,\n type ComposerFile,\n type SendMessage,\n} from \"./components/Chat/chat.context\";\nexport type {\n RegistryConfig,\n RegistryModel,\n RegistryProvider,\n} from \"./components/Chat/chat.context\";\nexport { Message } from \"./components/Message/message\";\nexport { MessageFeedback } from \"./components/Message/message.feedback\";\nexport { MessageUsage } from \"./components/Message/message.usage\";\nexport { LoadingState, formatElapsed, formatElapsedWords } from \"./components/Message/message.loading\";\nexport { ThinkingBlock } from \"./components/Message/message.thinking\";\nexport { MessageContent } from \"./components/Message/message.content\";\nexport { ThemeProvider, useTheme, type ChatTheme } from \"./theme/theme.context\";\nexport { ThemeToggle } from \"./theme/theme.toggle\";\nexport { BaseWidget, type BaseWidgetProps } from \"./components/Widget/base.widget\";\nexport {\n useWidgets,\n WidgetProvider,\n createWidgetRegistry,\n defineWidget,\n type ChatWidgetDefinition,\n type ChatWidgetComponent,\n type ChatWidgetEntry,\n type ChatWidgetInput,\n type ChatWidgetProps,\n type ChatWidgetRegistry,\n type DefineWidgetOptions,\n type WidgetComponentProps,\n type WidgetControls,\n type WidgetResponse,\n} from \"./components/Widget/widget.context\";\nexport { WidgetRenderer } from \"./components/Widget/widget.renderer\";\nexport type {\n ChatAdapter,\n ChatMessage,\n ChatMessagePart,\n ChatRole,\n ChatStatus,\n ChatThread,\n EditMessageInput,\n SendMessageInput,\n} from \"@sarchauhan/adapter\";\nexport { defineAdapter } from \"@sarchauhan/adapter\";\nexport type {\n AgentEvent,\n AgentMessage,\n AgentPart,\n AgentToolPart,\n AgentWidgetPart,\n} from \"@sarchauhan/protocol\";\nexport {\n TextSwap,\n calibrateCheckPath,\n clearErrorShake,\n closeDropdown,\n dropdownOrigins,\n iconSwapStates,\n motion,\n motionData,\n motionRoot,\n openDropdown,\n prefersReducedMotion,\n readDurationMs,\n successCheckStates,\n swapText,\n triggerErrorShake,\n useDropdownPresence,\n type DropdownOrigin,\n type DropdownPhase,\n type IconSwapState,\n type MotionClass,\n type SuccessCheckState,\n} from \"./motion\";\nexport {\n applyAgentEvent,\n createAgentMessageState,\n createWidgetData,\n normalizeAgentMessage,\n normalizeAgentParts,\n reduceAgentEvents,\n} from \"@sarchauhan/protocol\";\n\nexport * from \"./widgets/index\";\n","\"use client\";\n\nimport { PenSquare } from \"lucide-react\";\nimport type { CSSProperties } from \"react\";\nimport { useCallback, useLayoutEffect, useMemo, useRef } from \"react\";\nimport type { ChatAdapter } from \"../types\";\nimport { ThemeProvider, useTheme, type ChatTheme } from \"../theme/theme.context\";\nimport { ThemeToggle } from \"../theme/theme.toggle\";\nimport { ChatComposer, type ComposerCollapsedVariant } from \"./Chat/chat\";\nimport { ChatContextProvider, useMessages } from \"./Chat/chat.context\";\nimport { useThread } from \"./Chat/context\";\nimport { Message } from \"./Message/message\";\nimport {\n createWidgetRegistry,\n WidgetProvider,\n type ChatWidgetInput,\n type WidgetResponse,\n} from \"./Widget/widget.context\";\n\ntype ChatProps = {\n adapter: ChatAdapter;\n className?: string;\n defaultThreadId?: string;\n defaultProvider?: string;\n registryUrl?: string;\n style?: CSSProperties;\n /** Widget map or defineWidget(...) array. */\n widgets?: ChatWidgetInput;\n /** Controlled theme. Omit to manage theme internally. */\n theme?: ChatTheme;\n defaultTheme?: ChatTheme;\n onThemeChange?: (theme: ChatTheme) => void;\n showThemeToggle?: boolean;\n showModelSelector?: boolean;\n collapsedVariant?: ComposerCollapsedVariant;\n defaultExpanded?: boolean;\n};\n\nfunction ChatShell({\n className,\n style,\n widgets,\n showThemeToggle = true,\n showModelSelector = true,\n collapsedVariant = \"pill\",\n defaultExpanded = false,\n}: {\n className?: string;\n style?: CSSProperties;\n widgets?: ChatWidgetInput;\n showThemeToggle?: boolean;\n showModelSelector?: boolean;\n collapsedVariant?: ComposerCollapsedVariant;\n defaultExpanded?: boolean;\n}) {\n const { sendMessage, isSending, messages, status } = useMessages();\n const { createThread } = useThread();\n const { resolvedTheme } = useTheme();\n const registry = useMemo(() => createWidgetRegistry(widgets), [widgets]);\n const messagesRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n const container = messagesRef.current;\n if (!container) {\n return;\n }\n\n container.scrollTop = container.scrollHeight;\n }, [messages, status]);\n\n useLayoutEffect(() => {\n const container = messagesRef.current;\n if (!container || (status !== \"submitted\" && status !== \"streaming\")) {\n return;\n }\n\n const scrollToEnd = () => {\n container.scrollTop = container.scrollHeight;\n };\n\n const observer = new ResizeObserver(scrollToEnd);\n observer.observe(container);\n const inner = container.firstElementChild;\n if (inner) {\n observer.observe(inner);\n }\n\n scrollToEnd();\n\n return () => observer.disconnect();\n }, [status]);\n\n const respondToWidget = useCallback(\n async (response: WidgetResponse) => {\n const text =\n response.label ??\n response.actionId ??\n (typeof response.value === \"string\" ? response.value : JSON.stringify(response.value));\n\n if (!text.trim()) {\n return;\n }\n\n await sendMessage({ text });\n },\n [sendMessage],\n );\n\n return (\n <WidgetProvider\n widgets={registry}\n respondToWidget={respondToWidget}\n disabled={isSending}\n >\n <div\n className={[\"chat-root\", className].filter(Boolean).join(\" \")}\n style={style}\n data-theme={resolvedTheme}\n >\n <div className=\"chat-toolbar\">\n <button\n type=\"button\"\n className=\"chat-theme-toggle\"\n onClick={() => void createThread()}\n aria-label=\"Start a new chat\"\n title=\"New chat\"\n disabled={isSending}\n >\n <PenSquare size={16} strokeWidth={1.75} />\n </button>\n {showThemeToggle && (\n <ThemeToggle />\n )}\n </div>\n <div className=\"chat-messages\" ref={messagesRef}>\n <Message />\n </div>\n <div className=\"chat-composer\">\n <ChatComposer\n showModelSelector={showModelSelector}\n collapsedVariant={collapsedVariant}\n defaultExpanded={defaultExpanded}\n />\n </div>\n </div>\n </WidgetProvider>\n );\n}\n\nexport function Chat({\n adapter,\n className,\n defaultThreadId,\n defaultProvider,\n registryUrl,\n style,\n widgets,\n theme,\n defaultTheme = \"system\",\n onThemeChange,\n showThemeToggle = true,\n showModelSelector = true,\n collapsedVariant = \"pill\",\n defaultExpanded = false,\n}: ChatProps) {\n return (\n <ThemeProvider\n theme={theme}\n defaultTheme={defaultTheme}\n onThemeChange={onThemeChange}\n >\n <ChatContextProvider\n adapter={adapter}\n defaultThreadId={defaultThreadId}\n defaultProvider={defaultProvider}\n registryUrl={registryUrl}\n >\n <ChatShell\n className={className}\n style={style}\n widgets={widgets}\n showThemeToggle={showThemeToggle}\n showModelSelector={showModelSelector}\n collapsedVariant={collapsedVariant}\n defaultExpanded={defaultExpanded}\n />\n </ChatContextProvider>\n </ThemeProvider>\n );\n}\n","\"use client\";\n\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from \"react\";\n\nexport type ChatTheme = \"light\" | \"dark\" | \"system\";\n\ntype ThemeContextValue = {\n theme: ChatTheme;\n resolvedTheme: \"light\" | \"dark\";\n setTheme: (theme: ChatTheme) => void;\n toggleTheme: () => void;\n};\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nconst STORAGE_KEY = \"sarchauhan-chat-theme\";\n\nconst getSystemTheme = (): \"light\" | \"dark\" => {\n if (typeof window === \"undefined\" || !window.matchMedia) {\n return \"light\";\n }\n\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\";\n};\n\nconst resolveTheme = (theme: ChatTheme): \"light\" | \"dark\" =>\n theme === \"system\" ? getSystemTheme() : theme;\n\ntype ThemeProviderProps = {\n children: ReactNode;\n defaultTheme?: ChatTheme;\n theme?: ChatTheme;\n onThemeChange?: (theme: ChatTheme) => void;\n storageKey?: string;\n};\n\nexport function ThemeProvider({\n children,\n defaultTheme = \"system\",\n theme: controlledTheme,\n onThemeChange,\n storageKey = STORAGE_KEY,\n}: ThemeProviderProps) {\n const [uncontrolledTheme, setUncontrolledTheme] =\n useState<ChatTheme>(defaultTheme);\n\n const theme = controlledTheme ?? uncontrolledTheme;\n const [resolvedTheme, setResolvedTheme] = useState<\"light\" | \"dark\">(\n theme === \"dark\" ? \"dark\" : \"light\",\n );\n\n useEffect(() => {\n if (controlledTheme !== undefined) {\n return;\n }\n\n const stored = window.localStorage.getItem(storageKey);\n if (stored === \"light\" || stored === \"dark\" || stored === \"system\") {\n setUncontrolledTheme(stored);\n }\n }, [controlledTheme, storageKey]);\n\n useEffect(() => {\n setResolvedTheme(resolveTheme(theme));\n\n if (theme !== \"system\" || typeof window === \"undefined\") {\n return;\n }\n\n const media = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const onChange = () => setResolvedTheme(getSystemTheme());\n media.addEventListener(\"change\", onChange);\n return () => media.removeEventListener(\"change\", onChange);\n }, [theme]);\n\n const setTheme = useCallback(\n (next: ChatTheme) => {\n onThemeChange?.(next);\n\n if (controlledTheme === undefined) {\n setUncontrolledTheme(next);\n if (typeof window !== \"undefined\") {\n window.localStorage.setItem(storageKey, next);\n }\n }\n },\n [controlledTheme, onThemeChange, storageKey],\n );\n\n const toggleTheme = useCallback(() => {\n const next = resolvedTheme === \"dark\" ? \"light\" : \"dark\";\n setTheme(next);\n }, [resolvedTheme, setTheme]);\n\n const value = useMemo(\n () => ({\n theme,\n resolvedTheme,\n setTheme,\n toggleTheme,\n }),\n [resolvedTheme, setTheme, theme, toggleTheme],\n );\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n}\n\nexport function useTheme() {\n const context = useContext(ThemeContext);\n\n if (!context) {\n throw new Error(\"useTheme must be used inside ThemeProvider\");\n }\n\n return context;\n}\n","\"use client\";\n\nimport { Moon, Sun } from \"lucide-react\";\nimport { useTheme } from \"./theme.context\";\n\nexport function ThemeToggle({ className }: { className?: string }) {\n const { resolvedTheme, toggleTheme } = useTheme();\n const isDark = resolvedTheme === \"dark\";\n\n return (\n <button\n type=\"button\"\n className={[\"chat-theme-toggle\", className].filter(Boolean).join(\" \")}\n onClick={toggleTheme}\n aria-label={isDark ? \"Switch to light theme\" : \"Switch to dark theme\"}\n title={isDark ? \"Light mode\" : \"Dark mode\"}\n >\n {isDark ? <Sun size={16} strokeWidth={1.75} /> : <Moon size={16} strokeWidth={1.75} />}\n </button>\n );\n}\n","\"use client\";\n\nimport { MessageCircle } from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { motion, triggerErrorShake } from \"../../motion\";\nimport { ChatAttachButton, ChatAttachments } from \"./chat.attachments\";\nimport { ChatInput } from \"./chat.input\";\nimport { ChatReferences } from \"./chat.references\";\nimport { ChatSend } from \"./chat.send\";\nimport { ChatSelect } from \"./chat.select\";\nimport { useComposer, useMessages } from \"./context\";\n\nconst focusStaysInComposer = (shell: HTMLElement, node: Node | null) => {\n if (node && shell.contains(node)) {\n return true;\n }\n\n return node instanceof Element && node.closest(\"[data-slot='select-content']\") !== null;\n};\n\nexport type ComposerCollapsedVariant = \"pill\" | \"circle\";\n\nexport const ChatComposer = ({\n showModelSelector = true,\n collapsedVariant = \"pill\",\n defaultExpanded = false,\n}: {\n showModelSelector?: boolean;\n /** Resting shape when the composer is empty and blurred. Default is the wide pill. */\n collapsedVariant?: ComposerCollapsedVariant;\n /** Open on the large composer. Used so a story can show the model picker without a click. */\n defaultExpanded?: boolean;\n}) => {\n const { status } = useMessages();\n const { input, attachments, references } = useComposer();\n const shellRef = useRef<HTMLDivElement>(null);\n const [focused, setFocused] = useState(defaultExpanded);\n const expanded =\n focused || input.trim().length > 0 || attachments.length > 0 || references.length > 0;\n\n useEffect(() => {\n if (status !== \"error\" || !shellRef.current) {\n return;\n }\n\n triggerErrorShake(shellRef.current);\n }, [status]);\n\n useEffect(() => {\n if (!focused) {\n return;\n }\n\n const onFocusIn = () => {\n const shell = shellRef.current;\n if (!shell) {\n return;\n }\n if (focusStaysInComposer(shell, document.activeElement)) {\n return;\n }\n setFocused(false);\n };\n\n document.addEventListener(\"focusin\", onFocusIn, true);\n return () => document.removeEventListener(\"focusin\", onFocusIn, true);\n }, [focused]);\n\n return (\n <div\n ref={shellRef}\n className={cn(\"chat-composer-shell\", motion.inputWrap, motion.input)}\n data-expanded={expanded ? \"true\" : \"false\"}\n data-collapsed={collapsedVariant}\n onFocus={() => setFocused(true)}\n onBlur={(event) => {\n const shell = event.currentTarget;\n const next = event.relatedTarget;\n if (next instanceof Node && focusStaysInComposer(shell, next)) {\n return;\n }\n\n window.setTimeout(() => {\n if (focusStaysInComposer(shell, document.activeElement)) {\n return;\n }\n setFocused(false);\n }, 0);\n }}\n >\n {expanded || collapsedVariant !== \"circle\" ? null : (\n <MessageCircle className=\"chat-composer-collapsed-icon\" size={18} aria-hidden=\"true\" />\n )}\n <ChatAttachments />\n <ChatReferences />\n <ChatInput expanded={expanded} />\n <div className=\"chat-composer-row\">\n <div className=\"chat-composer-tools\">\n <ChatAttachButton />\n {showModelSelector && expanded && collapsedVariant === \"circle\" ? <ChatSelect /> : null}\n </div>\n <ChatSend />\n </div>\n </div>\n );\n};\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","/**\n * Public motion class names and data-attribute hooks from the\n * transitions.dev recipes packaged with `@sarchauhan/chat`.\n *\n * Consumers should import these constants instead of hard-coding\n * `t-*` strings so class names stay autocomplete-safe and typechecked.\n */\n\nexport const motion = {\n textSwap: \"t-text-swap\",\n isExit: \"is-exit\",\n isEnterStart: \"is-enter-start\",\n iconSwap: \"t-icon-swap\",\n icon: \"t-icon\",\n successCheck: \"t-success-check\",\n dropdown: \"t-dropdown\",\n isOpen: \"is-open\",\n isClosing: \"is-closing\",\n inputWrap: \"t-input-wrap\",\n input: \"t-input\",\n errorMsg: \"t-error-msg\",\n isError: \"is-error\",\n isShaking: \"is-shaking\",\n} as const;\n\nexport type MotionClass = (typeof motion)[keyof typeof motion];\n\nexport const iconSwapStates = [\"a\", \"b\"] as const;\nexport type IconSwapState = (typeof iconSwapStates)[number];\n\nexport const successCheckStates = [\"out\", \"in\"] as const;\nexport type SuccessCheckState = (typeof successCheckStates)[number];\n\nexport const dropdownOrigins = [\n \"top-left\",\n \"top-center\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-center\",\n \"bottom-right\",\n] as const;\nexport type DropdownOrigin = (typeof dropdownOrigins)[number];\n\nexport const motionData = {\n state: \"data-state\",\n icon: \"data-icon\",\n origin: \"data-origin\",\n open: \"data-open\",\n} as const;\n\nexport type MotionDataAttr = (typeof motionData)[keyof typeof motionData];\n\nexport const textSwapPhases = [\"rest\", \"exit\", \"enter-start\"] as const;\nexport type TextSwapPhase = (typeof textSwapPhases)[number];\n\nexport const dropdownPhases = [\"rest\", \"open\", \"closing\"] as const;\nexport type DropdownPhase = (typeof dropdownPhases)[number];\n","import { motion } from \"./classes\";\n\nconst CHAT_ROOT = \".chat-root\";\n\nexport const prefersReducedMotion = () =>\n typeof window !== \"undefined\" && window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n\nexport const motionRoot = (node?: Element | null) =>\n node?.closest(CHAT_ROOT) ?? (typeof document !== \"undefined\" ? document.querySelector(CHAT_ROOT) : null);\n\nconst readRaw = (name: string, node?: Element | null) => {\n const root = motionRoot(node);\n if (!root) {\n return \"\";\n }\n\n return getComputedStyle(root).getPropertyValue(name);\n};\n\n/** Read a duration custom property (ms) from `.chat-root`, with a numeric fallback. */\nexport const readDurationMs = (name: string, fallback: number, node?: Element | null) => {\n const value = parseFloat(readRaw(name, node));\n return Number.isFinite(value) ? value : fallback;\n};\n\nconst revertTimers = new WeakMap<HTMLElement, number>();\nconst shakeTimers = new WeakMap<HTMLElement, number>();\n\nexport type SwapTextOptions = {\n onSwap?: () => void;\n};\n\n/**\n * Three-phase text swap from transitions.dev (04-text-states-swap):\n * exit → swap content → enter-start (no transition) → rest.\n */\nexport const swapText = (el: HTMLElement, next: string, options?: SwapTextOptions) => {\n if (prefersReducedMotion()) {\n el.textContent = next;\n options?.onSwap?.();\n return;\n }\n\n const dur = readDurationMs(\"--text-swap-dur\", 200, el);\n el.classList.add(motion.isExit);\n\n return window.setTimeout(() => {\n el.classList.remove(motion.isExit);\n el.classList.add(motion.isEnterStart);\n el.textContent = next;\n options?.onSwap?.();\n void el.offsetHeight;\n el.classList.remove(motion.isEnterStart);\n }, dur);\n};\n\nexport const openDropdown = (el: HTMLElement) => {\n el.classList.remove(motion.isClosing);\n el.classList.add(motion.isOpen);\n};\n\nexport const closeDropdown = (el: HTMLElement, onClosed?: () => void) => {\n el.classList.remove(motion.isOpen);\n el.classList.add(motion.isClosing);\n\n const closeMs = prefersReducedMotion() ? 0 : readDurationMs(\"--dropdown-close-dur\", 150, el);\n\n return window.setTimeout(() => {\n el.classList.remove(motion.isClosing);\n onClosed?.();\n }, closeMs);\n};\n\nexport type TriggerErrorShakeOptions = {\n /** Keep `.is-error` after the shake (persistent tool errors). Default: auto-revert. */\n revert?: boolean;\n};\n\n/**\n * Replay the error shake from a clean baseline (12-error-state-shake).\n * `.is-error` and `.is-shaking` stay orthogonal so the shake can restart\n * without flickering the error treatment.\n */\nexport const triggerErrorShake = (wrap: HTMLElement, options?: TriggerErrorShakeOptions) => {\n const input =\n wrap.matches(`.${motion.input}`)\n ? wrap\n : (wrap.querySelector<HTMLElement>(`.${motion.input}`) ?? wrap);\n\n wrap.classList.add(motion.isError);\n input.classList.add(motion.isError);\n\n input.classList.remove(motion.isShaking);\n void input.offsetWidth;\n input.classList.add(motion.isShaking);\n\n const existingShake = shakeTimers.get(input);\n if (existingShake) {\n window.clearTimeout(existingShake);\n }\n\n const shakeMs =\n readDurationMs(\"--shake-dur-a\", 80, wrap) * 2 + readDurationMs(\"--shake-dur-b\", 60, wrap) * 2;\n shakeTimers.set(\n input,\n window.setTimeout(() => {\n input.classList.remove(motion.isShaking);\n shakeTimers.delete(input);\n }, shakeMs + 20),\n );\n\n const existingRevert = revertTimers.get(wrap);\n if (existingRevert) {\n window.clearTimeout(existingRevert);\n revertTimers.delete(wrap);\n }\n\n if (options?.revert === false) {\n return;\n }\n\n const hold = readDurationMs(\"--revert-hold\", 3000, wrap);\n revertTimers.set(\n wrap,\n window.setTimeout(() => {\n revertTimers.delete(wrap);\n wrap.classList.remove(motion.isError);\n input.classList.remove(motion.isError);\n }, shakeMs + hold),\n );\n};\n\nexport const clearErrorShake = (wrap: HTMLElement) => {\n const input =\n wrap.matches(`.${motion.input}`)\n ? wrap\n : (wrap.querySelector<HTMLElement>(`.${motion.input}`) ?? wrap);\n\n const existingRevert = revertTimers.get(wrap);\n if (existingRevert) {\n window.clearTimeout(existingRevert);\n revertTimers.delete(wrap);\n }\n\n const existingShake = shakeTimers.get(input);\n if (existingShake) {\n window.clearTimeout(existingShake);\n shakeTimers.delete(input);\n }\n\n wrap.classList.remove(motion.isError);\n input.classList.remove(motion.isError, motion.isShaking);\n};\n\n/** Measure an SVG path and set stroke-dasharray for the success-check draw. */\nexport const calibrateCheckPath = (path: SVGPathElement) => {\n const len = Math.ceil(path.getTotalLength());\n path.style.strokeDasharray = String(len);\n path.style.strokeDashoffset = String(len);\n};\n","\"use client\";\n\nimport { useEffect, useRef, type HTMLAttributes } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { motion } from \"./classes\";\nimport { prefersReducedMotion, readDurationMs } from \"./helpers\";\n\ntype TextSwapProps = {\n text: string;\n} & Omit<HTMLAttributes<HTMLSpanElement>, \"children\">;\n\n/**\n * Status-line text that swaps in place (transitions.dev text-states-swap).\n * React keeps the outgoing string painted until the exit phase finishes.\n */\nexport function TextSwap({ text, className, ...props }: TextSwapProps) {\n const ref = useRef<HTMLSpanElement>(null);\n const shownRef = useRef(text);\n\n useEffect(() => {\n const el = ref.current;\n if (!el || shownRef.current === text) {\n return;\n }\n\n if (prefersReducedMotion()) {\n shownRef.current = text;\n el.textContent = text;\n return;\n }\n\n const dur = readDurationMs(\"--text-swap-dur\", 200, el);\n el.classList.add(motion.isExit);\n\n const timer = window.setTimeout(() => {\n el.classList.remove(motion.isExit);\n el.classList.add(motion.isEnterStart);\n el.textContent = text;\n shownRef.current = text;\n void el.offsetHeight;\n el.classList.remove(motion.isEnterStart);\n }, dur);\n\n return () => window.clearTimeout(timer);\n }, [text]);\n\n return (\n <span ref={ref} className={cn(motion.textSwap, className)} {...props}>\n {shownRef.current}\n </span>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState, type RefObject } from \"react\";\nimport { motion, type DropdownPhase } from \"./classes\";\nimport { prefersReducedMotion, readDurationMs } from \"./helpers\";\n\nconst resolveRoot = (root?: Element | RefObject<Element | null> | null) =>\n root && \"current\" in root ? root.current : (root ?? null);\n\n/**\n * Keep a dropdown mounted through the close tween and apply the\n * documented `.is-open` / `.is-closing` hooks (05-menu-dropdown).\n *\n * Mounts at rest (pre-scale, opacity 0), then adds `.is-open` on the\n * next frame so the open transition actually plays.\n */\nexport function useDropdownPresence(\n open: boolean,\n root?: Element | RefObject<Element | null> | null,\n) {\n const [mounted, setMounted] = useState(open);\n const [phase, setPhase] = useState<DropdownPhase>(open ? \"open\" : \"rest\");\n const mountedRef = useRef(open);\n mountedRef.current = mounted;\n\n useEffect(() => {\n const node = resolveRoot(root);\n\n if (open) {\n setMounted(true);\n setPhase(\"rest\");\n const frame = window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => setPhase(\"open\"));\n });\n return () => window.cancelAnimationFrame(frame);\n }\n\n if (!mountedRef.current) {\n return;\n }\n\n setPhase(\"closing\");\n const closeMs = prefersReducedMotion() ? 0 : readDurationMs(\"--dropdown-close-dur\", 150, node);\n const timer = window.setTimeout(() => {\n setMounted(false);\n setPhase(\"rest\");\n }, closeMs);\n\n return () => window.clearTimeout(timer);\n }, [open, root]);\n\n const className =\n phase === \"open\" ? motion.isOpen : phase === \"closing\" ? motion.isClosing : undefined;\n\n return { mounted, phase, className } as const;\n}\n","\"use client\";\n\nimport { FileText, Paperclip, X } from \"lucide-react\";\nimport { useRef } from \"react\";\nimport { useComposer } from \"./context\";\n\nconst isImageMediaType = (mediaType: string) => mediaType.startsWith(\"image/\");\n\nexport const ChatAttachments = () => {\n const { attachments, removeAttachment } = useComposer();\n\n if (attachments.length === 0) {\n return null;\n }\n\n return (\n <div className=\"chat-attachments\">\n {attachments.map((attachment) => {\n const image = isImageMediaType(attachment.mediaType);\n\n return (\n <div\n key={attachment.id}\n className={image ? \"chat-attachment chat-attachment-image\" : \"chat-attachment chat-attachment-file\"}\n >\n {image ? (\n <img src={attachment.url} alt={attachment.filename} />\n ) : (\n <>\n <FileText size={14} aria-hidden=\"true\" />\n <span className=\"chat-attachment-name\">{attachment.filename}</span>\n </>\n )}\n <button\n type=\"button\"\n className=\"chat-attachment-remove\"\n aria-label={`Remove ${attachment.filename}`}\n onClick={() => removeAttachment(attachment.id)}\n >\n <X size={12} />\n </button>\n </div>\n );\n })}\n </div>\n );\n};\n\nexport const ChatAttachButton = () => {\n const { disabled, addFiles } = useComposer();\n const inputRef = useRef<HTMLInputElement>(null);\n\n return (\n <>\n <button\n type=\"button\"\n className=\"chat-attach\"\n aria-label=\"Add attachment\"\n disabled={disabled}\n onClick={() => inputRef.current?.click()}\n >\n <Paperclip size={16} />\n </button>\n <input\n ref={inputRef}\n className=\"chat-attach-input\"\n type=\"file\"\n multiple\n tabIndex={-1}\n aria-hidden=\"true\"\n onChange={(event) => {\n const files = event.currentTarget.files;\n if (files && files.length > 0) {\n void addFiles(files);\n }\n event.currentTarget.value = \"\";\n }}\n />\n </>\n );\n};\n","\"use client\";\n\nimport { useMemo, type Dispatch } from \"react\";\nimport { useComposer } from \"./composer.context\";\nimport { useMessages } from \"./messages.context\";\nimport { useModel } from \"./model.context\";\nimport { useThread } from \"./thread.context\";\n\ntype CompatAction =\n | { type: \"setInput\"; data: { input: string } }\n | { type: \"setProvider\"; data: { provider: string; model?: string } }\n | { type: \"setModel\"; data: { model: string } }\n | { type: \"addReference\"; data: { text: string } }\n | { type: \"removeReference\"; data: { id: string } }\n | { type: \"clearReferences\" };\n\n/**\n * Compatibility facade over split contexts.\n * Prefer useComposer / useMessages / useModel / useThread in UI components\n * so typing and streaming do not share one render subscription.\n */\nexport function useChat() {\n const composer = useComposer();\n const messages = useMessages();\n const model = useModel();\n const thread = useThread();\n\n return useMemo(() => {\n const dispatch: Dispatch<CompatAction> = (action) => {\n switch (action.type) {\n case \"setInput\":\n composer.setInput(action.data.input);\n break;\n case \"setProvider\":\n model.setProvider(action.data.provider, action.data.model);\n break;\n case \"setModel\":\n model.setModel(action.data.model);\n break;\n case \"addReference\":\n composer.addReference(action.data.text);\n break;\n case \"removeReference\":\n composer.removeReference(action.data.id);\n break;\n case \"clearReferences\":\n composer.clearReferences();\n break;\n default:\n break;\n }\n };\n\n return {\n state: {\n input: composer.input,\n provider: model.provider,\n model: model.model,\n references: composer.references,\n disabled: composer.disabled,\n sendDisabled: !composer.canSend,\n },\n dispatch,\n messages: messages.messages,\n status: messages.status,\n activeThreadId: thread.activeThreadId,\n threads: thread.threads,\n isLoadingThread: thread.isLoadingThread,\n registry: model.registry,\n sendMessage: messages.sendMessage,\n submitInput: composer.submitInput,\n editAndResendMessage: messages.editAndResendMessage,\n stopResponse: messages.stopResponse,\n selectThread: thread.selectThread,\n createThread: thread.createThread,\n deleteThread: thread.deleteThread,\n };\n }, [composer, messages, model, thread]);\n}\n\nexport {\n ChatContextProvider,\n type ChatContextProviderProps,\n} from \"./chat.provider\";\nexport { useComposer } from \"./composer.context\";\nexport { useMessages } from \"./messages.context\";\nexport { useModel } from \"./model.context\";\nexport { useThread } from \"./thread.context\";\nexport {\n ProviderId,\n defaultRegistry,\n isProviderId,\n parseRegistryConfig,\n type ChatReference,\n type ComposerAttachment,\n type ComposerFile,\n type RegistryConfig,\n type RegistryModel,\n type RegistryProvider,\n type SendMessage,\n} from \"./types\";\n","\"use client\";\n\nimport {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { ChatTooltip } from \"../chat.tooltip\";\nimport { createMessageId, normalizeReferenceText } from \"./message.helpers\";\nimport { useMessages } from \"./messages.context\";\nimport { useModel } from \"./model.context\";\nimport { useThread } from \"./thread.context\";\nimport type { ChatReference, ComposerAttachment } from \"./types\";\n\nconst readFileAsDataUrl = (file: File) =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result === \"string\") {\n resolve(reader.result);\n return;\n }\n reject(new Error(\"Could not read file\"));\n };\n reader.onerror = () => {\n reject(reader.error ?? new Error(\"Could not read file\"));\n };\n reader.readAsDataURL(file);\n });\n\ntype ComposerContextValue = {\n input: string;\n setInput: (value: string) => void;\n references: ChatReference[];\n addReference: (text: string) => void;\n removeReference: (id: string) => void;\n clearReferences: () => void;\n attachments: ComposerAttachment[];\n addFiles: (files: FileList | readonly File[]) => Promise<void>;\n removeAttachment: (id: string) => void;\n disabled: boolean;\n canSend: boolean;\n submitInput: () => Promise<void>;\n};\n\nconst ComposerContext = createContext<ComposerContextValue | null>(null);\n\ntype ComposerProviderProps = {\n children: ReactNode;\n};\n\nexport function ComposerProvider({ children }: ComposerProviderProps) {\n const { activeThreadId, activeThreadIdRef, isLoadingThread, setThreads } = useThread();\n const { providerRef, modelRef } = useModel();\n const { sendMessage, isSending } = useMessages();\n\n // Local composer state — typing does not hop through a shared reducer/context mega-object.\n const [input, setInputState] = useState(\"\");\n const [references, setReferences] = useState<ChatReference[]>([]);\n const [attachments, setAttachments] = useState<ComposerAttachment[]>([]);\n const inputRef = useRef(input);\n const referencesRef = useRef(references);\n const attachmentsRef = useRef(attachments);\n inputRef.current = input;\n referencesRef.current = references;\n attachmentsRef.current = attachments;\n\n const setInput = useCallback((value: string) => {\n setInputState(value);\n }, []);\n\n const addReference = useCallback((text: string) => {\n const normalized = normalizeReferenceText(text);\n if (!normalized) {\n return;\n }\n\n setReferences((current) => {\n if (current.some((reference) => reference.text === normalized)) {\n return current;\n }\n\n return [\n ...current,\n {\n id: createMessageId(\"ref\"),\n text: normalized,\n },\n ];\n });\n }, []);\n\n const removeReference = useCallback((id: string) => {\n setReferences((current) => current.filter((reference) => reference.id !== id));\n }, []);\n\n const clearReferences = useCallback(() => {\n setReferences([]);\n }, []);\n\n const addFiles = useCallback(async (list: FileList | readonly File[]) => {\n const incoming = Array.from(list);\n const next: ComposerAttachment[] = [];\n\n for (const file of incoming) {\n try {\n const url = await readFileAsDataUrl(file);\n next.push({\n id: createMessageId(\"file\"),\n filename: file.name || \"file\",\n mediaType: file.type || \"application/octet-stream\",\n url,\n });\n } catch {\n // Skip a file the browser could not read. The rest still attach.\n }\n }\n\n if (next.length === 0) {\n return;\n }\n\n setAttachments((current) => [...current, ...next]);\n }, []);\n\n const removeAttachment = useCallback((id: string) => {\n setAttachments((current) => current.filter((attachment) => attachment.id !== id));\n }, []);\n\n const disabled = isSending || isLoadingThread || !activeThreadId;\n const canSend = !disabled && (!!input.trim() || attachments.length > 0);\n const disabledRef = useRef(disabled);\n disabledRef.current = disabled;\n\n const submitInput = useCallback(async () => {\n const text = inputRef.current.trim();\n const threadId = activeThreadIdRef.current;\n const attachmentsSnapshot = attachmentsRef.current;\n\n if ((!text && attachmentsSnapshot.length === 0) || !threadId || disabledRef.current) {\n return;\n }\n\n const nextTitle = (text || attachmentsSnapshot[0]?.filename || \"\").slice(0, 60);\n const referencesSnapshot = referencesRef.current;\n const referenceText = referencesSnapshot\n .map(\n (reference, index) =>\n `<reference ${index + 1}>\\n${reference.text}\\n</reference ${index + 1}>`,\n )\n .join(\"\\n\\n\");\n\n const messageText = referenceText\n ? `Use the following selected references as context:\\n\\n${referenceText}\\n\\nUser message:\\n${text}`\n : text;\n\n setInputState(\"\");\n setReferences([]);\n setAttachments([]);\n\n setThreads((current) => {\n const next = current.map((thread) =>\n thread.id === threadId && thread.title === \"New chat\"\n ? { ...thread, title: nextTitle || thread.title }\n : thread,\n );\n const selected = next.find((thread) => thread.id === threadId);\n const remaining = next.filter((thread) => thread.id !== threadId);\n return selected ? [selected, ...remaining] : next;\n });\n\n try {\n await sendMessage(\n {\n text: messageText,\n files: attachmentsSnapshot.map((file) => ({\n mediaType: file.mediaType,\n url: file.url,\n filename: file.filename,\n })),\n },\n {\n body: {\n provider: providerRef.current,\n model: modelRef.current,\n },\n },\n );\n } catch (error) {\n setInputState(text);\n setReferences(referencesSnapshot);\n setAttachments(attachmentsSnapshot);\n throw error;\n }\n }, [activeThreadIdRef, modelRef, providerRef, sendMessage, setThreads]);\n\n const value = useMemo<ComposerContextValue>(\n () => ({\n input,\n setInput,\n references,\n addReference,\n removeReference,\n clearReferences,\n attachments,\n addFiles,\n removeAttachment,\n disabled,\n canSend,\n submitInput,\n }),\n [\n addReference,\n canSend,\n clearReferences,\n disabled,\n input,\n addFiles,\n attachments,\n references,\n removeAttachment,\n removeReference,\n setInput,\n submitInput,\n ],\n );\n\n return (\n <ComposerContext.Provider value={value}>\n {children}\n <ChatTooltip onAddReference={addReference} />\n </ComposerContext.Provider>\n );\n}\n\nexport function useComposer() {\n const context = useContext(ComposerContext);\n if (!context) {\n throw new Error(\"useComposer must be used inside ComposerProvider\");\n }\n return context;\n}\n","\"use client\";\n\nimport { memo, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\ntype SelectionAction = {\n text: string;\n top: number;\n left: number;\n container: HTMLElement;\n};\n\nconst isEditableSelection = (selection: Selection) => {\n const anchorElement = selection.anchorNode?.parentElement;\n const focusElement = selection.focusNode?.parentElement;\n\n return Boolean(\n anchorElement?.closest(\"textarea,input,[contenteditable='true']\") ||\n focusElement?.closest(\"textarea,input,[contenteditable='true']\"),\n );\n};\n\nconst getSelectionRect = (range: Range) => {\n const rect = range.getBoundingClientRect();\n const fallbackRect = range.getClientRects()[0];\n return rect.width || rect.height ? rect : fallbackRect;\n};\n\nconst positionFromRange = (\n range: Range,\n container: HTMLElement,\n): Pick<SelectionAction, \"top\" | \"left\"> | null => {\n const selectionRect = getSelectionRect(range);\n if (!selectionRect) {\n return null;\n }\n\n const containerRect = container.getBoundingClientRect();\n\n return {\n top: Math.max(8, selectionRect.top - containerRect.top + container.scrollTop),\n left: selectionRect.left - containerRect.left + container.scrollLeft + selectionRect.width / 2,\n };\n};\n\nconst readSelection = (): { text: string; range: Range } | null => {\n const selection = window.getSelection();\n const text = selection?.toString().replace(/\\s+/g, \" \").trim();\n\n if (!selection || !text || selection.rangeCount === 0 || selection.isCollapsed) {\n return null;\n }\n\n if (isEditableSelection(selection)) {\n return null;\n }\n\n return {\n text,\n range: selection.getRangeAt(0).cloneRange(),\n };\n};\n\nconst getPortalContainer = (range: Range) => {\n const node = range.commonAncestorContainer;\n const element = node instanceof Element ? node : node.parentElement;\n const found = element?.closest(\".chat-messages\");\n return found instanceof HTMLElement ? found : null;\n};\n\ntype ChatTooltipProps = {\n onAddReference: (text: string) => void;\n};\n\nexport const ChatTooltip = memo(function ChatTooltip({\n onAddReference,\n}: ChatTooltipProps) {\n const [selectionAction, setSelectionAction] = useState<SelectionAction | null>(null);\n const rangeRef = useRef<Range | null>(null);\n const textRef = useRef(\"\");\n\n useEffect(() => {\n const clearSelectionAction = () => {\n rangeRef.current = null;\n textRef.current = \"\";\n setSelectionAction(null);\n };\n\n const syncPosition = () => {\n const range = rangeRef.current;\n if (!range) {\n return;\n }\n\n const container = getPortalContainer(range);\n if (!container) {\n clearSelectionAction();\n return;\n }\n\n const position = positionFromRange(range, container);\n if (!position) {\n clearSelectionAction();\n return;\n }\n\n setSelectionAction({\n text: textRef.current,\n top: position.top,\n left: position.left,\n container,\n });\n };\n\n const captureSelection = () => {\n const next = readSelection();\n if (!next) {\n clearSelectionAction();\n return;\n }\n\n rangeRef.current = next.range;\n textRef.current = next.text;\n syncPosition();\n };\n\n document.addEventListener(\"mouseup\", captureSelection);\n document.addEventListener(\"keyup\", captureSelection);\n document.addEventListener(\"selectionchange\", captureSelection);\n window.addEventListener(\"scroll\", syncPosition, true);\n window.addEventListener(\"resize\", syncPosition);\n\n return () => {\n document.removeEventListener(\"mouseup\", captureSelection);\n document.removeEventListener(\"keyup\", captureSelection);\n document.removeEventListener(\"selectionchange\", captureSelection);\n window.removeEventListener(\"scroll\", syncPosition, true);\n window.removeEventListener(\"resize\", syncPosition);\n };\n }, [onAddReference]);\n\n if (!selectionAction) {\n return null;\n }\n\n return createPortal(\n <button\n type=\"button\"\n className=\"chat-reference-action\"\n style={{ top: selectionAction.top, left: selectionAction.left }}\n aria-label=\"Add selected text as reference\"\n onPointerDown={(event) => event.preventDefault()}\n onClick={() => {\n onAddReference(selectionAction.text);\n window.getSelection()?.removeAllRanges();\n rangeRef.current = null;\n textRef.current = \"\";\n setSelectionAction(null);\n }}\n >\n Add reference\n </button>,\n selectionAction.container,\n );\n});\n","import type { ChatMessage } from \"../../../types\";\nimport type { ComposerFile } from \"./types\";\n\nexport const normalizeReferenceText = (text: string) =>\n text.replace(/\\s+/g, \" \").trim().slice(0, 4000);\n\nexport const createMessageId = (prefix: string) =>\n globalThis.crypto?.randomUUID?.() ?? `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\nexport const createUserMessage = (text: string, files: ComposerFile[] = []): ChatMessage => ({\n id: createMessageId(\"msg\"),\n role: \"user\",\n parts: [\n ...files.map((file) => ({\n type: \"file\" as const,\n mediaType: file.mediaType,\n url: file.url,\n filename: file.filename,\n })),\n ...(text ? [{ type: \"text\" as const, text }] : []),\n ],\n});\n\nexport const updateMessageText = (message: ChatMessage, text: string): ChatMessage => ({\n ...message,\n parts: [{ type: \"text\", text }],\n});\n\nexport const upsertAssistantMessage = (current: ChatMessage[], nextMessage: ChatMessage) => {\n const existingIndex = current.findIndex((message) => message.id === nextMessage.id);\n\n if (existingIndex === -1) {\n return [...current, nextMessage];\n }\n\n return current.map((message, index) => (index === existingIndex ? nextMessage : message));\n};\n","\"use client\";\n\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { flushSync } from \"react-dom\";\nimport type { ChatAdapter, ChatMessage, ChatStatus } from \"../../../types\";\nimport { getUserDisplayText } from \"../../../lib/message/user\";\nimport {\n createUserMessage,\n updateMessageText,\n upsertAssistantMessage,\n} from \"./message.helpers\";\nimport { useModel } from \"./model.context\";\nimport { useThread } from \"./thread.context\";\nimport type { SendMessage } from \"./types\";\n\nconst MINIMUM_RESPONSE_LOADING_MS = 350;\nconst wait = (milliseconds: number) => new Promise<void>((resolve) => window.setTimeout(resolve, milliseconds));\n\nconst hasVisibleAssistantContent = (message: ChatMessage) =>\n message.parts.some((part) => {\n if (part.type === \"text\") {\n return \"text\" in part && typeof part.text === \"string\" && part.text.trim().length > 0;\n }\n\n if (part.type === \"data\") {\n return \"name\" in part && part.name !== \"usage\" && part.name !== \"context\" && part.name !== \"context-warning\";\n }\n\n return [\"reasoning\", \"tool\", \"widget\", \"source-url\", \"source-document\", \"file\", \"unknown\"].includes(part.type);\n });\n\ntype MessagesContextValue = {\n messages: ChatMessage[];\n status: ChatStatus;\n isSending: boolean;\n isWaitingForResponse: boolean;\n sendMessage: SendMessage;\n editAndResendMessage: (messageId: string, text: string) => Promise<void>;\n stopResponse: () => void;\n};\n\nconst MessagesContext = createContext<MessagesContextValue | null>(null);\n\ntype MessagesProviderProps = {\n adapter: ChatAdapter;\n children: ReactNode;\n};\n\nexport function MessagesProvider({ adapter, children }: MessagesProviderProps) {\n const { activeThreadId, activeThreadIdRef, setThreads, setIsLoadingThread } = useThread();\n const { providerRef, modelRef, thinkingLevelsRef } = useModel();\n\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [status, setStatus] = useState<ChatStatus>(\"ready\");\n const [isWaitingForResponse, setIsWaitingForResponse] = useState(false);\n\n const messagesRef = useRef(messages);\n const statusRef = useRef(status);\n const adapterRef = useRef(adapter);\n const abortRef = useRef<AbortController | null>(null);\n\n messagesRef.current = messages;\n statusRef.current = status;\n adapterRef.current = adapter;\n\n useEffect(() => {\n let cancelled = false;\n\n const loadMessages = async () => {\n if (!activeThreadId) {\n setMessages([]);\n setIsLoadingThread(false);\n return;\n }\n\n const currentAdapter = adapterRef.current;\n if (!currentAdapter.loadMessages) {\n setIsLoadingThread(false);\n return;\n }\n\n setIsLoadingThread(true);\n try {\n const nextMessages = await currentAdapter.loadMessages(activeThreadId);\n if (cancelled) {\n return;\n }\n setMessages(nextMessages);\n setIsLoadingThread(false);\n } catch {\n if (!cancelled) {\n setMessages([]);\n setIsLoadingThread(false);\n setStatus(\"error\");\n }\n }\n };\n\n void loadMessages();\n return () => {\n cancelled = true;\n };\n }, [activeThreadId, setIsLoadingThread]);\n\n const streamMessage = useCallback(\n async ({\n message,\n nextMessages,\n provider,\n model,\n thinkingLevel,\n }: {\n message: ChatMessage;\n nextMessages: ChatMessage[];\n provider?: string;\n model?: string;\n thinkingLevel?: string;\n }) => {\n const threadId = activeThreadIdRef.current;\n if (!threadId) {\n setIsWaitingForResponse(false);\n return;\n }\n\n abortRef.current?.abort();\n const abortController = new AbortController();\n abortRef.current = abortController;\n setStatus(\"submitted\");\n const responseStartedAt = Date.now();\n let receivedVisibleResponse = false;\n\n try {\n for await (const assistantMessage of adapterRef.current.sendMessage({\n threadId,\n message,\n messages: nextMessages,\n provider,\n model,\n thinkingLevel,\n signal: abortController.signal,\n })) {\n if (!receivedVisibleResponse && hasVisibleAssistantContent(assistantMessage)) {\n receivedVisibleResponse = true;\n const remaining = MINIMUM_RESPONSE_LOADING_MS - (Date.now() - responseStartedAt);\n\n if (remaining > 0) {\n await wait(remaining);\n }\n\n if (abortController.signal.aborted) {\n setIsWaitingForResponse(false);\n setStatus(\"ready\");\n return;\n }\n }\n\n if (receivedVisibleResponse) {\n setIsWaitingForResponse(false);\n setStatus(\"streaming\");\n }\n setMessages((current) => upsertAssistantMessage(current, assistantMessage));\n }\n\n setStatus(\"ready\");\n } catch (error) {\n setIsWaitingForResponse(false);\n if (abortController.signal.aborted) {\n setStatus(\"ready\");\n return;\n }\n\n setStatus(\"error\");\n throw error;\n } finally {\n setIsWaitingForResponse(false);\n if (abortRef.current === abortController) {\n abortRef.current = null;\n }\n }\n },\n [activeThreadIdRef],\n );\n\n const sendMessage = useCallback<SendMessage>(\n async (message, options) => {\n const text = message.text.trim();\n const files = message.files ?? [];\n const threadId = activeThreadIdRef.current;\n\n if ((!text && files.length === 0) || !threadId) {\n return;\n }\n\n const userMessage = createUserMessage(text, files);\n const nextMessages = [...messagesRef.current, userMessage];\n flushSync(() => {\n setMessages(nextMessages);\n setIsWaitingForResponse(true);\n });\n\n const resolvedProvider = options?.body?.provider ?? providerRef.current;\n const resolvedModel = options?.body?.model ?? modelRef.current;\n const thinkingLevel = thinkingLevelsRef.current[`${resolvedProvider}::${resolvedModel}`];\n await streamMessage({\n message: userMessage,\n nextMessages,\n provider: resolvedProvider,\n model: resolvedModel,\n thinkingLevel,\n });\n },\n [activeThreadIdRef, modelRef, providerRef, streamMessage],\n );\n\n const editAndResendMessage = useCallback(\n async (messageId: string, text: string) => {\n const trimmedText = text.trim();\n const threadId = activeThreadIdRef.current;\n const isSending =\n statusRef.current === \"submitted\" || statusRef.current === \"streaming\";\n\n if (!trimmedText || !threadId || isSending) {\n return;\n }\n\n const previousMessages = messagesRef.current;\n const messageIndex = previousMessages.findIndex((message) => message.id === messageId);\n const message = previousMessages[messageIndex];\n\n if (!message || message.role !== \"user\") {\n return;\n }\n\n let editedMessages = previousMessages\n .slice(0, messageIndex + 1)\n .map((currentMessage) =>\n currentMessage.id === messageId\n ? updateMessageText(currentMessage, trimmedText)\n : currentMessage,\n );\n\n setThreads((current) => {\n const firstUserMessage = editedMessages.find(\n (currentMessage) => currentMessage.role === \"user\",\n );\n const firstUserTitle = firstUserMessage\n ? getUserDisplayText(firstUserMessage).trim().slice(0, 60)\n : \"\";\n\n return current.map((thread) =>\n thread.id === threadId && firstUserTitle\n ? { ...thread, title: firstUserTitle }\n : thread,\n );\n });\n\n try {\n if (adapterRef.current.editMessage) {\n editedMessages = await adapterRef.current.editMessage({\n threadId,\n messageId,\n text: trimmedText,\n });\n }\n\n const editedMessage =\n editedMessages.find((currentMessage) => currentMessage.id === messageId) ??\n updateMessageText(message, trimmedText);\n\n setMessages(editedMessages);\n setIsWaitingForResponse(true);\n\n const thinkingLevel = thinkingLevelsRef.current[`${providerRef.current}::${modelRef.current}`];\n await streamMessage({\n message: editedMessage,\n nextMessages: editedMessages,\n provider: providerRef.current,\n model: modelRef.current,\n thinkingLevel,\n });\n } catch (error) {\n setIsWaitingForResponse(false);\n setMessages(previousMessages);\n throw error;\n }\n },\n [activeThreadIdRef, modelRef, providerRef, setThreads, streamMessage],\n );\n\n const stopResponse = useCallback(() => {\n const isSending =\n statusRef.current === \"submitted\" || statusRef.current === \"streaming\";\n if (!isSending) {\n return;\n }\n\n abortRef.current?.abort();\n setIsWaitingForResponse(false);\n setStatus(\"ready\");\n }, []);\n\n const isSending = status === \"submitted\" || status === \"streaming\";\n\n const value = useMemo<MessagesContextValue>(\n () => ({\n messages,\n status,\n isSending,\n isWaitingForResponse,\n sendMessage,\n editAndResendMessage,\n stopResponse,\n }),\n [editAndResendMessage, isSending, isWaitingForResponse, messages, sendMessage, status, stopResponse],\n );\n\n return <MessagesContext.Provider value={value}>{children}</MessagesContext.Provider>;\n}\n\nexport function useMessages() {\n const context = useContext(MessagesContext);\n if (!context) {\n throw new Error(\"useMessages must be used inside MessagesProvider\");\n }\n return context;\n}\n","import type { ChatMessage } from \"../../types\";\n\nexport type UserReferenceMessage = {\n references: string[];\n message: string;\n};\n\nexport const REFERENCE_PREFIX = \"Use the following selected references as context:\\n\\n\";\nexport const USER_MESSAGE_MARKER = \"\\n\\nUser message:\\n\";\nconst REFERENCE_PATTERN = /<reference \\d+>\\n([\\s\\S]*?)\\n<\\/reference \\d+>/g;\n\nexport const getMessageTextContent = (message: ChatMessage) =>\n message.parts\n .filter((part): part is { type: \"text\"; text: string } => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\\n\");\n\nexport const parseUserReferenceMessage = (content: string): UserReferenceMessage | null => {\n if (!content.startsWith(REFERENCE_PREFIX)) {\n return null;\n }\n\n const markerIndex = content.indexOf(USER_MESSAGE_MARKER);\n\n if (markerIndex === -1) {\n return null;\n }\n\n const references = [...content.slice(REFERENCE_PREFIX.length, markerIndex).matchAll(REFERENCE_PATTERN)]\n .map((match) => match[1].trim())\n .filter(Boolean);\n\n return references.length\n ? { references, message: content.slice(markerIndex + USER_MESSAGE_MARKER.length) }\n : null;\n};\n\nexport const getUserDisplayText = (message: ChatMessage) => {\n const text = getMessageTextContent(message);\n return parseUserReferenceMessage(text)?.message ?? text;\n};\n","\"use client\";\n\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport {\n defaultRegistry,\n parseRegistryConfig,\n ProviderId,\n type RegistryConfig,\n} from \"./types\";\n\ntype ModelContextValue = {\n registry: RegistryConfig;\n provider: string;\n model: string;\n thinkingLevels: Record<string, string>;\n getThinkingLevel: (providerId: string, modelId: string) => string | undefined;\n setThinkingLevel: (providerId: string, modelId: string, level: string) => void;\n setProvider: (provider: string, model?: string) => void;\n setModel: (model: string) => void;\n providerRef: React.MutableRefObject<string>;\n modelRef: React.MutableRefObject<string>;\n thinkingLevelsRef: React.MutableRefObject<Record<string, string>>;\n};\n\nconst ModelContext = createContext<ModelContextValue | null>(null);\n\ntype ModelProviderProps = {\n children: ReactNode;\n defaultProvider?: string;\n registryUrl?: string;\n};\n\nexport function ModelProvider({\n children,\n defaultProvider = ProviderId.MOCK,\n registryUrl = \"/api/ai/registry\",\n}: ModelProviderProps) {\n const [registry, setRegistry] = useState<RegistryConfig>(defaultRegistry);\n const [provider, setProviderState] = useState(defaultProvider);\n const [model, setModelState] = useState(\n () =>\n defaultRegistry.providers.find((entry) => entry.id === defaultProvider)?.defaultModel ?? \"\",\n );\n const [thinkingLevels, setThinkingLevelsState] = useState<Record<string, string>>(() => {\n const initial: Record<string, string> = {};\n for (const p of defaultRegistry.providers) {\n for (const m of p.models) {\n const levels = m.thinkingLevels;\n if (levels?.length) initial[`${p.id}::${m.id}`] = levels.includes(\"medium\") ? \"medium\" : levels[0];\n }\n }\n return initial;\n });\n\n const providerRef = useRef(provider);\n const modelRef = useRef(model);\n const thinkingLevelsRef = useRef(thinkingLevels);\n providerRef.current = provider;\n modelRef.current = model;\n thinkingLevelsRef.current = thinkingLevels;\n\n useEffect(() => {\n let cancelled = false;\n\n const loadRegistry = async () => {\n try {\n const response = await fetch(registryUrl, { cache: \"no-store\" });\n if (!response.ok) {\n throw new Error(\"Failed to load registry\");\n }\n\n const data = parseRegistryConfig(await response.json());\n if (cancelled || !data) {\n return;\n }\n\n setRegistry(data);\n const nextThinking: Record<string, string> = {};\n for (const p of data.providers) {\n for (const m of p.models) {\n const levels = m.thinkingLevels;\n if (levels?.length) nextThinking[`${p.id}::${m.id}`] = levels.includes(\"medium\") ? \"medium\" : levels[0];\n }\n }\n setThinkingLevelsState((prev) => ({ ...nextThinking, ...prev }));\n const preferred =\n data.providers.find((entry) => entry.id === data.defaultProviderId) ??\n data.providers[0];\n if (preferred) {\n setProviderState(preferred.id);\n setModelState(preferred.defaultModel);\n }\n } catch {\n if (!cancelled) {\n setRegistry(defaultRegistry);\n }\n }\n };\n\n void loadRegistry();\n return () => {\n cancelled = true;\n };\n }, [registryUrl]);\n\n useEffect(() => {\n const nextProvider =\n registry.providers.find((entry) => entry.id === provider) ??\n registry.providers.find((entry) => entry.id === registry.defaultProviderId) ??\n registry.providers[0];\n\n if (!nextProvider) {\n return;\n }\n\n const hasModel = nextProvider.models.some((entry) => entry.id === model);\n if (!hasModel) {\n setProviderState(nextProvider.id);\n setModelState(nextProvider.defaultModel);\n }\n }, [model, provider, registry]);\n\n const setProvider = useCallback((nextProvider: string, nextModel?: string) => {\n setProviderState(nextProvider);\n if (nextModel) {\n setModelState(nextModel);\n }\n }, []);\n\n const getThinkingLevel = useCallback(\n (providerId: string, modelId: string) => thinkingLevels[`${providerId}::${modelId}`],\n [thinkingLevels],\n );\n\n const setThinkingLevel = useCallback((providerId: string, modelId: string, level: string) => {\n setThinkingLevelsState((prev) => ({ ...prev, [`${providerId}::${modelId}`]: level }));\n }, []);\n\n const setModel = useCallback((nextModel: string) => {\n setModelState(nextModel);\n }, []);\n\n const value = useMemo<ModelContextValue>(\n () => ({\n registry,\n provider,\n model,\n thinkingLevels,\n getThinkingLevel,\n setThinkingLevel,\n setProvider,\n setModel,\n providerRef,\n modelRef,\n thinkingLevelsRef,\n }),\n [model, provider, registry, setModel, setProvider, thinkingLevels, getThinkingLevel, setThinkingLevel],\n );\n\n return <ModelContext.Provider value={value}>{children}</ModelContext.Provider>;\n}\n\nexport function useModel() {\n const context = useContext(ModelContext);\n if (!context) {\n throw new Error(\"useModel must be used inside ModelProvider\");\n }\n return context;\n}\n","import type { ChatAdapter, ChatMessage, ChatStatus, ChatThread } from \"../../../types\";\n\nexport enum ProviderId {\n SYMPHONY = \"symphony\",\n MOCK = \"mock\",\n OPENAI = \"openai\",\n GOOGLE = \"google\",\n GEMINI = \"gemini\",\n CLAUDE = \"anthropic\",\n GROK = \"grok\",\n OLLAMA = \"ollama\",\n LOCAL = \"local\",\n}\n\nexport type RegistryModel = {\n id: string;\n label: string;\n description?: string;\n thinkingLevels?: string[];\n};\n\nexport type RegistryProvider = {\n /** Known `ProviderId` values or a Symphony / custom registry id. */\n id: string;\n name?: string;\n label: string;\n logo?: string;\n defaultModel: string;\n models: RegistryModel[];\n};\n\nexport type RegistryConfig = {\n defaultProviderId: string;\n providers: RegistryProvider[];\n};\n\nconst PROVIDER_IDS: ReadonlySet<string> = new Set(Object.values(ProviderId));\n\nexport const isProviderId = (value: unknown): value is ProviderId =>\n typeof value === \"string\" && PROVIDER_IDS.has(value);\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isRegistryModel = (value: unknown): value is RegistryModel => {\n if (!isRecord(value) || typeof value.id !== \"string\" || typeof value.label !== \"string\") {\n return false;\n }\n\n if (value.description !== undefined && typeof value.description !== \"string\") {\n return false;\n }\n\n if (\n value.thinkingLevels !== undefined &&\n (!Array.isArray(value.thinkingLevels) ||\n !value.thinkingLevels.every((level) => typeof level === \"string\"))\n ) {\n return false;\n }\n\n return true;\n};\n\nconst isRegistryProvider = (value: unknown): value is RegistryProvider =>\n isRecord(value) &&\n typeof value.id === \"string\" &&\n typeof value.label === \"string\" &&\n typeof value.defaultModel === \"string\" &&\n Array.isArray(value.models) &&\n value.models.every(isRegistryModel) &&\n (value.name === undefined || typeof value.name === \"string\") &&\n (value.logo === undefined || typeof value.logo === \"string\");\n\nexport const parseRegistryConfig = (value: unknown): RegistryConfig | undefined => {\n if (!isRecord(value) || typeof value.defaultProviderId !== \"string\" || !Array.isArray(value.providers)) {\n return undefined;\n }\n\n const providers = value.providers.filter(isRegistryProvider);\n if (providers.length === 0) {\n return undefined;\n }\n\n return {\n defaultProviderId: value.defaultProviderId,\n providers,\n };\n};\n\nexport type ChatReference = {\n id: string;\n text: string;\n};\n\n/** File part carried on the existing send payload. `url` is a data URL. */\nexport type ComposerFile = {\n mediaType: string;\n url: string;\n filename?: string;\n};\n\nexport type ComposerAttachment = ComposerFile & {\n id: string;\n filename: string;\n};\n\nexport type SendMessage = (\n message: { text: string; files?: ComposerFile[] },\n options?: { body?: { provider?: string; model?: string } },\n) => Promise<void>;\n\nexport type { ChatAdapter, ChatMessage, ChatStatus, ChatThread };\n\nexport const defaultRegistry: RegistryConfig = {\n defaultProviderId: ProviderId.MOCK,\n providers: [\n {\n id: ProviderId.SYMPHONY,\n label: \"Symphony (custom harness)\",\n defaultModel: \"\",\n models: [],\n },\n {\n id: ProviderId.MOCK,\n label: \"Mock\",\n defaultModel: \"canned\",\n models: [{ id: \"canned\", label: \"Canned replies\" }],\n },\n {\n id: ProviderId.OPENAI,\n label: \"OpenAI\",\n defaultModel: \"gpt-4.1\",\n models: [{ id: \"gpt-4.1\", label: \"GPT-4.1\" }],\n },\n {\n id: ProviderId.CLAUDE,\n label: \"Anthropic\",\n defaultModel: \"claude-3-7-sonnet-20250219\",\n models: [{ id: \"claude-3-7-sonnet-20250219\", label: \"Claude 3.7 Sonnet\" }],\n },\n {\n id: ProviderId.GOOGLE,\n label: \"Google\",\n defaultModel: \"gemini-2.5-flash\",\n models: [{ id: \"gemini-2.5-flash\", label: \"Gemini 2.5 Flash\" }],\n },\n {\n id: ProviderId.OLLAMA,\n label: \"Ollama\",\n defaultModel: \"smallthinker:latest\",\n models: [{ id: \"smallthinker:latest\", label: \"smallthinker:latest\" }],\n },\n ],\n};\n","\"use client\";\n\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport type { ChatAdapter, ChatThread } from \"../../../types\";\nimport { createMessageId } from \"./message.helpers\";\n\ntype ThreadContextValue = {\n threads: ChatThread[];\n activeThreadId: string | null;\n isLoadingThread: boolean;\n activeThreadIdRef: React.MutableRefObject<string | null>;\n setThreads: React.Dispatch<React.SetStateAction<ChatThread[]>>;\n setIsLoadingThread: React.Dispatch<React.SetStateAction<boolean>>;\n selectThread: (threadId: string) => Promise<void>;\n createThread: () => Promise<void>;\n deleteThread: (threadId: string) => Promise<void>;\n};\n\nconst ThreadContext = createContext<ThreadContextValue | null>(null);\n\ntype ThreadProviderProps = {\n adapter: ChatAdapter;\n children: ReactNode;\n defaultThreadId?: string;\n};\n\nexport function ThreadProvider({\n adapter,\n children,\n defaultThreadId,\n}: ThreadProviderProps) {\n const [threads, setThreads] = useState<ChatThread[]>([]);\n const [activeThreadId, setActiveThreadId] = useState<string | null>(defaultThreadId ?? null);\n const [isLoadingThread, setIsLoadingThread] = useState(true);\n\n const activeThreadIdRef = useRef(activeThreadId);\n activeThreadIdRef.current = activeThreadId;\n const adapterRef = useRef(adapter);\n adapterRef.current = adapter;\n\n useEffect(() => {\n let cancelled = false;\n\n const bootstrap = async () => {\n setIsLoadingThread(true);\n\n if (defaultThreadId) {\n setThreads((current) =>\n current.some((thread) => thread.id === defaultThreadId)\n ? current\n : [{ id: defaultThreadId, title: \"New chat\" }, ...current],\n );\n setActiveThreadId(defaultThreadId);\n setIsLoadingThread(false);\n return;\n }\n\n const currentAdapter = adapterRef.current;\n\n if (!currentAdapter.listThreads || !currentAdapter.createThread) {\n const localThread = { id: createMessageId(\"thread\"), title: \"New chat\" };\n setThreads([localThread]);\n setActiveThreadId(localThread.id);\n setIsLoadingThread(false);\n return;\n }\n\n const nextThreads = await currentAdapter.listThreads();\n if (cancelled) {\n return;\n }\n\n if (nextThreads.length > 0) {\n setThreads(nextThreads);\n setActiveThreadId(nextThreads[0].id);\n setIsLoadingThread(false);\n return;\n }\n\n const thread = await currentAdapter.createThread();\n if (cancelled) {\n return;\n }\n\n setThreads([thread]);\n setActiveThreadId(thread.id);\n setIsLoadingThread(false);\n };\n\n bootstrap().catch(() => {\n if (!cancelled) {\n setIsLoadingThread(false);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [defaultThreadId]);\n\n const selectThread = useCallback(async (threadId: string) => {\n setActiveThreadId((current) => (current === threadId ? current : threadId));\n }, []);\n\n const createThread = useCallback(async () => {\n const currentAdapter = adapterRef.current;\n const thread = currentAdapter.createThread\n ? await currentAdapter.createThread()\n : { id: createMessageId(\"thread\"), title: \"New chat\" };\n\n setThreads((current) => [thread, ...current]);\n setActiveThreadId(thread.id);\n }, []);\n\n const deleteThread = useCallback(\n async (threadId: string) => {\n await adapterRef.current.deleteThread?.(threadId);\n\n setThreads((current) => {\n const remaining = current.filter((thread) => thread.id !== threadId);\n\n setActiveThreadId((active) => {\n if (active !== threadId) {\n return active;\n }\n\n const nextActive = remaining[0]?.id ?? null;\n if (!nextActive) {\n void createThread();\n }\n return nextActive;\n });\n\n return remaining;\n });\n },\n [createThread],\n );\n\n const value = useMemo<ThreadContextValue>(\n () => ({\n threads,\n activeThreadId,\n isLoadingThread,\n activeThreadIdRef,\n setThreads,\n setIsLoadingThread,\n selectThread,\n createThread,\n deleteThread,\n }),\n [\n activeThreadId,\n createThread,\n deleteThread,\n isLoadingThread,\n selectThread,\n threads,\n ],\n );\n\n return <ThreadContext.Provider value={value}>{children}</ThreadContext.Provider>;\n}\n\nexport function useThread() {\n const context = useContext(ThreadContext);\n if (!context) {\n throw new Error(\"useThread must be used inside ThreadProvider\");\n }\n return context;\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport type { ChatAdapter } from \"../../../types\";\nimport { ComposerProvider } from \"./composer.context\";\nimport { MessagesProvider } from \"./messages.context\";\nimport { ModelProvider } from \"./model.context\";\nimport { ThreadProvider } from \"./thread.context\";\nimport { ProviderId } from \"./types\";\n\nexport type ChatContextProviderProps = {\n adapter: ChatAdapter;\n children: ReactNode;\n defaultProvider?: string;\n defaultThreadId?: string;\n registryUrl?: string;\n};\n\nexport function ChatContextProvider({\n adapter,\n children,\n defaultProvider = ProviderId.MOCK,\n defaultThreadId,\n registryUrl = \"/api/ai/registry\",\n}: ChatContextProviderProps) {\n return (\n <ModelProvider defaultProvider={defaultProvider} registryUrl={registryUrl}>\n <ThreadProvider adapter={adapter} defaultThreadId={defaultThreadId}>\n <MessagesProvider adapter={adapter}>\n <ComposerProvider>{children}</ComposerProvider>\n </MessagesProvider>\n </ThreadProvider>\n </ModelProvider>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef } from \"react\";\nimport { clearErrorShake, motion, triggerErrorShake } from \"../../motion\";\nimport { useComposer } from \"./context\";\n\nexport const ChatInput = ({\n placeholder = \"Message...\",\n expanded = true,\n}: {\n placeholder?: string;\n expanded?: boolean;\n}) => {\n const { input, setInput, disabled, submitInput, attachments } = useComposer();\n const ref = useRef<HTMLTextAreaElement>(null);\n const hasDraft = input.trim().length > 0 || attachments.length > 0;\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n if (!expanded) {\n el.style.height = \"\";\n el.style.overflowY = \"hidden\";\n return;\n }\n el.style.height = \"auto\";\n const shell = el.closest<HTMLElement>(\".chat-composer-shell\");\n const isSmall = shell?.dataset.variant === \"small\";\n const max = isSmall ? 128 : 320;\n el.style.height = `${Math.min(el.scrollHeight, max)}px`;\n el.style.overflowY = el.scrollHeight > max ? \"auto\" : \"hidden\";\n }, [expanded, input]);\n\n return (\n <div className=\"chat-composer-input\">\n <textarea\n ref={ref}\n value={input}\n onChange={(event) => {\n const wrap = event.currentTarget.closest<HTMLElement>(`.${motion.inputWrap}`);\n if (wrap) {\n clearErrorShake(wrap);\n }\n setInput(event.target.value);\n }}\n placeholder={placeholder}\n disabled={disabled}\n rows={1}\n onKeyDown={(event) => {\n if (event.key !== \"Enter\" || event.shiftKey) return;\n if (event.nativeEvent.isComposing) return;\n event.preventDefault();\n if (disabled) {\n return;\n }\n if (!hasDraft) {\n const wrap = event.currentTarget.closest<HTMLElement>(`.${motion.inputWrap}`);\n if (wrap) {\n triggerErrorShake(wrap);\n }\n return;\n }\n void submitInput();\n }}\n />\n </div>\n );\n};\n","\"use client\";\n\nimport { X } from \"lucide-react\";\nimport { useComposer } from \"./context\";\n\nexport const ChatReferences = () => {\n const { references, removeReference } = useComposer();\n\n if (references.length === 0) {\n return null;\n }\n\n return (\n <div className=\"chat-references\">\n {references.map((reference, index) => (\n <div key={reference.id} className=\"chat-reference\" title={reference.text}>\n <span className=\"chat-reference-text\">{reference.text}</span>\n <button\n type=\"button\"\n className=\"chat-icon-button\"\n aria-label={`Remove reference ${index + 1}`}\n onClick={() => removeReference(reference.id)}\n >\n <X size={12} />\n </button>\n </div>\n ))}\n </div>\n );\n};\n","\"use client\";\n\nimport { Send, Square } from \"lucide-react\";\nimport { useComposer, useMessages } from \"./context\";\n\nexport const ChatSend = () => {\n const { canSend, submitInput } = useComposer();\n const { status, stopResponse, isSending } = useMessages();\n\n return (\n <button\n className=\"chat-send\"\n type=\"button\"\n data-state={isSending ? \"stop\" : \"send\"}\n onClick={isSending ? stopResponse : submitInput}\n disabled={isSending ? false : !canSend}\n aria-label={isSending ? \"Stop response\" : \"Send message\"}\n >\n {isSending ? <Square size={14} fill=\"currentColor\" /> : <Send size={16} />}\n </button>\n );\n};\n","\"use client\";\n\nimport { Fragment, useCallback, useMemo, useRef, useState } from \"react\";\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectLabel,\n SelectTrigger,\n SelectItem,\n} from \"../../ui/select\";\nimport { Check, Ellipsis } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\nimport { motion, useDropdownPresence, type DropdownOrigin } from \"../../motion\";\nimport { useMessages, useModel } from \"./context\";\n\nconst SELECT_ORIGIN: DropdownOrigin = \"top-left\";\nconst THINKING_ORIGIN: DropdownOrigin = \"top-right\";\n\nconst ProviderBadge = ({ logo, name }: { logo?: string; name: string }) => {\n if (logo) {\n return (\n <img\n className=\"chat-model-provider-logo\"\n src={logo}\n alt=\"\"\n aria-hidden=\"true\"\n />\n );\n }\n\n return (\n <span className=\"chat-model-provider-logo chat-model-provider-fallback\" aria-hidden=\"true\">\n {name.slice(0, 1)}\n </span>\n );\n};\n\nexport const ChatSelect = () => {\n const { provider, model, registry, setProvider, getThinkingLevel, setThinkingLevel } = useModel();\n const { isSending } = useMessages();\n const [portalContainer, setPortalContainer] = useState<HTMLElement | null>(null);\n const [query, setQuery] = useState(\"\");\n const [thinkingOpen, setThinkingOpen] = useState<string | null>(null);\n const [menuOpen, setMenuOpen] = useState(false);\n const rootRef = useRef<HTMLElement | null>(null);\n const menu = useDropdownPresence(menuOpen, rootRef);\n const selectedValue = `${provider}::${model}`;\n const selectedProvider = registry.providers.find((entry) => entry.id === provider);\n const selectedModel = selectedProvider?.models.find((entry) => entry.id === model);\n const providerName = selectedProvider?.name ?? selectedProvider?.label ?? provider;\n const modelLabel = selectedModel?.label ?? (model || \"Loading models…\");\n const filteredProviders = useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return registry.providers;\n return registry.providers\n .map((entry) => ({\n ...entry,\n models: entry.models.filter(\n (item) =>\n item.label.toLowerCase().includes(q) ||\n item.id.toLowerCase().includes(q) ||\n (item.description && item.description.toLowerCase().includes(q)) ||\n entry.label.toLowerCase().includes(q),\n ),\n }))\n .filter((entry) => entry.models.length > 0);\n }, [registry.providers, query]);\n const setRootElement = useCallback((node: HTMLDivElement | null) => {\n const found = node?.closest(\".chat-root\");\n rootRef.current = found instanceof HTMLElement ? found : null;\n setPortalContainer(found instanceof HTMLElement ? found : null);\n }, []);\n\n return (\n <div ref={setRootElement}>\n <Select\n open={menuOpen || menu.mounted}\n onOpenChange={setMenuOpen}\n value={selectedValue}\n onValueChange={(value) => {\n const separator = value.indexOf(\"::\");\n if (separator <= 0) {\n return;\n }\n\n const nextProvider = value.slice(0, separator);\n const nextModel = value.slice(separator + 2);\n const match = registry.providers.find((entry) => entry.id === nextProvider);\n if (!match || !nextModel) {\n return;\n }\n\n setProvider(match.id, nextModel);\n }}\n disabled={isSending}\n >\n <SelectTrigger className=\"chat-model-trigger\">\n <span className=\"chat-model-selected\">\n {selectedModel ? (\n <ProviderBadge logo={selectedProvider?.logo} name={providerName} />\n ) : null}\n <span>{modelLabel}</span>\n </span>\n </SelectTrigger>\n <SelectContent\n align=\"start\"\n position=\"popper\"\n sideOffset={6}\n collisionPadding={12}\n className={cn(\"chat-model-content\", motion.dropdown, menu.className)}\n data-origin={SELECT_ORIGIN}\n portalContainer={portalContainer}\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n setQuery(\"\");\n setThinkingOpen(null);\n }}\n onPointerDownOutside={() => setThinkingOpen(null)}\n >\n <div className=\"chat-model-search\">\n <input\n autoFocus\n placeholder=\"Search models\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={(event) => event.stopPropagation()}\n className=\"chat-model-search-input\"\n />\n </div>\n <div className=\"chat-model-list\">\n {filteredProviders.length === 0 ? (\n <div className=\"chat-model-empty\">No models found</div>\n ) : (\n filteredProviders.map((entry) => {\n const providerName = entry.name ?? entry.label;\n const hideLabel = filteredProviders.length === 1;\n\n return (\n <Fragment key={entry.id}>\n <SelectGroup className=\"chat-model-group\">\n {hideLabel ? null : (\n <SelectLabel className=\"chat-model-label\">\n <ProviderBadge logo={entry.logo} name={providerName} />\n <span>{providerName}</span>\n </SelectLabel>\n )}\n {entry.models.map((item) => {\n const key = `${entry.id}::${item.id}`;\n const levels = item.thinkingLevels;\n const defaultThinking =\n levels && levels.length > 0\n ? (levels.includes(\"medium\") ? \"medium\" : levels[0])\n : undefined;\n const thinking = defaultThinking && levels ? { levels } : undefined;\n const activeThinking = defaultThinking\n ? (getThinkingLevel(entry.id, item.id) ?? defaultThinking)\n : undefined;\n const isOpen = thinkingOpen === key;\n\n return (\n <ModelRow\n key={key}\n itemKey={key}\n item={item}\n thinking={thinking}\n activeThinking={activeThinking}\n isOpen={isOpen}\n onToggleThinking={() => setThinkingOpen(isOpen ? null : key)}\n onPickThinking={(level) => {\n setThinkingLevel(entry.id, item.id, level);\n setThinkingOpen(null);\n }}\n />\n );\n })}\n </SelectGroup>\n </Fragment>\n );\n })\n )}\n </div>\n </SelectContent>\n </Select>\n </div>\n );\n};\n\nconst ModelRow = ({\n itemKey,\n item,\n thinking,\n activeThinking,\n isOpen,\n onToggleThinking,\n onPickThinking,\n}: {\n itemKey: string;\n item: { id: string; label: string; description?: string };\n thinking?: { levels: string[] };\n activeThinking?: string;\n isOpen: boolean;\n onToggleThinking: () => void;\n onPickThinking: (level: string) => void;\n}) => {\n const menu = useDropdownPresence(isOpen);\n\n return (\n <div className=\"chat-model-row\">\n <SelectItem value={itemKey} className=\"chat-model-item\">\n <span className=\"chat-model-item-label\">{item.label}</span>\n {item.description ? (\n <span className=\"chat-model-item-hint\">{item.description}</span>\n ) : thinking && activeThinking ? (\n <span className=\"chat-model-item-hint\">{activeThinking}</span>\n ) : null}\n </SelectItem>\n {thinking ? (\n <>\n <button\n type=\"button\"\n aria-label=\"Thinking settings\"\n className=\"chat-model-thinking-trigger\"\n data-open={isOpen ? \"true\" : \"false\"}\n onPointerDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onToggleThinking();\n }}\n >\n <Ellipsis className=\"chat-model-thinking-icon\" />\n </button>\n {menu.mounted ? (\n <div\n className={cn(\"chat-model-thinking-menu\", motion.dropdown, menu.className)}\n data-origin={THINKING_ORIGIN}\n onPointerDown={(event) => event.stopPropagation()}\n onClick={(event) => event.stopPropagation()}\n >\n {thinking.levels.map((level) => {\n const isActive = level === activeThinking;\n return (\n <button\n key={level}\n type=\"button\"\n className=\"chat-model-thinking-option\"\n data-active={isActive ? \"true\" : \"false\"}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onPickThinking(level);\n }}\n >\n <span>{level}</span>\n {isActive ? <Check className=\"chat-model-thinking-check\" /> : null}\n </button>\n );\n })}\n </div>\n ) : null}\n </>\n ) : null}\n </div>\n );\n};\n","\"use client\"\n\nimport * as React from \"react\"\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from \"lucide-react\"\nimport { Select as SelectPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../lib/utils\"\n\nfunction Select({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectGroup({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />\n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon className=\"size-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n portalContainer,\n position = \"item-aligned\",\n align = \"center\",\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content> & {\n portalContainer?: HTMLElement | null\n}) {\n return (\n <SelectPrimitive.Portal container={portalContainer}>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n \"bg-popover text-popover-foreground relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] overflow-x-hidden overflow-y-auto rounded-md border shadow-md\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n align={align}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n data-slot=\"select-viewport\"\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"text-muted-foreground px-2 py-1.5 text-xs\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n className\n )}\n {...props}\n >\n <span\n data-slot=\"select-item-indicator\"\n className=\"absolute right-2 flex size-3.5 items-center justify-center\"\n >\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"bg-border pointer-events-none -mx-1 my-1 h-px\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronUpIcon className=\"size-4\" />\n </SelectPrimitive.ScrollUpButton>\n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronDownIcon className=\"size-4\" />\n </SelectPrimitive.ScrollDownButton>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n","\"use client\";\n\nimport { Pencil } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { normalizeAgentParts, type AgentDataPart } from \"@sarchauhan/protocol\";\nimport type { ChatMessage } from \"../../types\";\nimport { getUserDisplayText } from \"../../lib/message/user\";\nimport { useMessages } from \"../Chat/context\";\nimport { MessageContent } from \"../Message/message.content\";\nimport { MessageFeedback } from \"../Message/message.feedback\";\nimport { MessageUsage } from \"../Message/message.usage\";\n\nconst getMessageTargetId = (messageId: string) => `chat-message-${messageId}`;\n\nexport const MessageItem = ({ message }: { message: ChatMessage }) => {\n const { editAndResendMessage, isSending, messages } = useMessages();\n const [isEditing, setIsEditing] = useState(false);\n const [draft, setDraft] = useState(() => getUserDisplayText(message));\n const [isSubmittingEdit, setIsSubmittingEdit] = useState(false);\n const isUser = message.role === \"user\";\n const isActiveAssistantMessage =\n isSending && messages[messages.length - 1]?.id === message.id;\n\n const assistantText = message.parts\n .filter((part) => part.type === \"text\")\n .map((part) => (\"text\" in part ? String(part.text) : \"\"))\n .join(\"\\n\")\n .trim();\n const dataParts = normalizeAgentParts(message.parts).filter(\n (part): part is AgentDataPart => part.type === \"data\",\n );\n\n const previousUserMessage = [...messages].reverse().find((item) => item.role === \"user\");\n\n const cancelEdit = () => {\n setDraft(getUserDisplayText(message));\n setIsEditing(false);\n };\n\n const submitEdit = async () => {\n if (!draft.trim() || isSending || isSubmittingEdit) {\n return;\n }\n\n setIsSubmittingEdit(true);\n try {\n await editAndResendMessage(message.id, draft);\n setIsEditing(false);\n } finally {\n setIsSubmittingEdit(false);\n }\n };\n\n if (isUser) {\n return (\n <div id={getMessageTargetId(message.id)} className=\"chat-message chat-message-user\">\n <div className={`chat-message-user-inner${isEditing ? \" is-editing\" : \"\"}`}>\n <div className=\"chat-message-bubble\">\n {isEditing ? (\n <textarea\n className=\"chat-edit-area\"\n value={draft}\n disabled={isSubmittingEdit}\n autoFocus\n onChange={(event) => setDraft(event.target.value)}\n onKeyDown={(event) => {\n if (event.key !== \"Enter\" || event.shiftKey) return;\n if (event.nativeEvent.isComposing) return;\n event.preventDefault();\n void submitEdit();\n }}\n />\n ) : (\n <MessageContent parts={message.parts} isUser />\n )}\n </div>\n {isEditing ? (\n <div className=\"chat-message-actions\">\n <button\n type=\"button\"\n className=\"chat-text-button\"\n onClick={cancelEdit}\n disabled={isSubmittingEdit}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"chat-text-button chat-text-button-done\"\n onClick={submitEdit}\n disabled={!draft.trim() || isSubmittingEdit || isSending}\n >\n Done\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n className=\"chat-icon-button\"\n onClick={() => {\n setDraft(getUserDisplayText(message));\n setIsEditing(true);\n }}\n disabled={isSending}\n aria-label=\"Edit and resend message\"\n >\n <Pencil size={14} />\n </button>\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"chat-message chat-message-assistant\">\n <div className=\"chat-message-assistant-inner\">\n <MessageContent parts={message.parts} isUser={false} />\n <MessageUsage parts={dataParts} />\n {isActiveAssistantMessage ? null : (\n <MessageFeedback\n responseText={assistantText}\n canRegenerate={!!previousUserMessage}\n disabled={isSending}\n onRegenerate={() => {\n if (previousUserMessage) {\n void editAndResendMessage(\n previousUserMessage.id,\n getUserDisplayText(previousUserMessage),\n );\n }\n }}\n />\n )}\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport {\n normalizeAgentParts,\n parseArtifact,\n parseSubagent,\n type AgentDataPart,\n type AgentFilePart,\n type AgentPart,\n type AgentReasoningPart,\n type AgentSourceDocumentPart,\n type AgentSourceUrlPart,\n type AgentToolPart,\n type AgentWidgetPart,\n type AgentWidgetProps,\n} from \"@sarchauhan/protocol\";\nimport { ChevronDown } from \"lucide-react\";\nimport { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { splitThinkingSegments } from \"../../lib/message/segment\";\nimport { parseUserReferenceMessage } from \"../../lib/message/user\";\nimport { cn } from \"../../lib/utils\";\nimport {\n TextSwap,\n calibrateCheckPath,\n motion,\n triggerErrorShake,\n type IconSwapState,\n type SuccessCheckState,\n} from \"../../motion\";\nimport { ArtifactWidget } from \"../../widgets/artifact\";\nimport { computeToolWidget } from \"../../widgets/compute\";\nimport { prebuiltWidgets } from \"../../widgets/registry\";\nimport { useWidgets } from \"../Widget/widget.context\";\nimport { TextSkeleton } from \"./message.skeleton\";\nimport { WidgetRenderer } from \"../Widget/widget.renderer\";\nimport { MarkdownContent } from \"./message.markdown\";\nimport { ThinkingBlock } from \"./message.thinking\";\n\ntype MessageContentProps = {\n parts: Array<{ type: string; [key: string]: unknown }>;\n isUser?: boolean;\n};\n\nconst isPropsRecord = (value: unknown): value is AgentWidgetProps =>\n !!value && typeof value === \"object\" && !Array.isArray(value);\n\nconst formatJson = (value: unknown) => {\n if (typeof value === \"string\") {\n return value;\n }\n\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n};\n\nconst toolDetail = (part: AgentToolPart) => {\n const source = part.output ?? part.input;\n\n if (!isPropsRecord(source)) {\n return null;\n }\n\n const value = source.path ?? source.file ?? source.filename ?? source.query ?? source.command ?? source.url;\n\n return typeof value === \"string\" && value.trim() ? value : null;\n};\n\nconst toolStateLabel = (state: AgentToolPart[\"state\"]) => {\n switch (state) {\n case \"input-streaming\":\n return \"Preparing\";\n case \"input-available\":\n return \"Ready\";\n case \"approval-requested\":\n return \"Needs approval\";\n case \"approval-responded\":\n return \"Approval sent\";\n case \"output-available\":\n return \"Done\";\n case \"output-error\":\n return \"Error\";\n case \"output-denied\":\n return \"Denied\";\n default:\n return state;\n }\n};\n\nconst ReasoningBlock = ({ part }: { part: AgentReasoningPart }) => {\n const isComplete = part.state !== \"streaming\";\n\n return (\n <ThinkingBlock isComplete={isComplete}>\n {!!part.text.trim() && (\n <div className=\"md-thinking-body\">\n <MarkdownContent>{part.text}</MarkdownContent>\n </div>\n )}\n </ThinkingBlock>\n );\n};\n\nconst ToolStatusIcon = ({\n isPending,\n isDone,\n}: {\n isPending: boolean;\n isDone: boolean;\n}) => {\n const pathRef = useRef<SVGPathElement>(null);\n const [sawPending, setSawPending] = useState(isPending);\n const iconState: IconSwapState = isPending ? \"a\" : \"b\";\n const playCheck = Boolean(sawPending && isDone);\n const checkState: SuccessCheckState = playCheck ? \"in\" : \"out\";\n\n if (isPending && !sawPending) {\n setSawPending(true);\n }\n\n useLayoutEffect(() => {\n if (pathRef.current) {\n calibrateCheckPath(pathRef.current);\n }\n }, [playCheck]);\n\n return (\n <span className=\"agent-tool-dot\" aria-hidden=\"true\">\n <span className={motion.iconSwap} data-state={iconState}>\n <span className={motion.icon} data-icon=\"a\">\n <span className=\"agent-tool-spinner\" />\n </span>\n <span className={motion.icon} data-icon=\"b\">\n {isDone ? (\n playCheck ? (\n <span className={motion.successCheck} data-state={checkState}>\n <svg viewBox=\"0 0 12 12\" width=\"10\" height=\"10\" fill=\"none\">\n <path\n ref={pathRef}\n d=\"M2.5 6.5 5 9l4.5-6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n ) : (\n <svg viewBox=\"0 0 12 12\" width=\"10\" height=\"10\" fill=\"none\">\n <path\n d=\"M2.5 6.5 5 9l4.5-6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n ) : (\n <svg viewBox=\"0 0 12 12\" width=\"10\" height=\"10\" fill=\"none\">\n <path\n d=\"M3.2 3.2 8.8 8.8M8.8 3.2 3.2 8.8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n </svg>\n )}\n </span>\n </span>\n </span>\n );\n};\n\nconst ToolBlock = ({ part }: { part: AgentToolPart }) => {\n const wrapRef = useRef<HTMLDetailsElement>(null);\n const isPending =\n part.state === \"input-streaming\" ||\n part.state === \"input-available\" ||\n part.state === \"approval-requested\";\n const isError = part.state === \"output-error\" || part.state === \"output-denied\";\n const isDone = !isPending && !isError;\n const detail = toolDetail(part);\n\n useEffect(() => {\n if (!isError || !wrapRef.current) {\n return;\n }\n\n triggerErrorShake(wrapRef.current, { revert: false });\n }, [isError]);\n\n return (\n <details\n ref={wrapRef}\n className={cn(\n \"agent-tool\",\n motion.inputWrap,\n isPending ? \"agent-tool-pending\" : isError ? \"agent-tool-error\" : \"agent-tool-complete\",\n )}\n open={isPending || isError}\n >\n <summary className={cn(motion.input, isError && motion.isError)}>\n <ChevronDown className=\"agent-tool-chevron\" aria-hidden=\"true\" />\n <ToolStatusIcon isPending={isPending} isDone={isDone} />\n <span className=\"agent-tool-name\">{part.title ?? part.toolName}</span>\n {detail ? <span className=\"agent-tool-chip\">{detail}</span> : null}\n <TextSwap className=\"agent-tool-state\" text={toolStateLabel(part.state)} />\n </summary>\n <div className=\"agent-tool-body\">\n {part.input !== undefined && (\n <div className=\"agent-tool-section\">\n <div className=\"agent-tool-section-label\">Input</div>\n <pre className=\"agent-tool-code\">{formatJson(part.input)}</pre>\n </div>\n )}\n {part.output !== undefined && (\n <div className=\"agent-tool-section\">\n <div className=\"agent-tool-section-label\">Output</div>\n <pre className=\"agent-tool-code\">{formatJson(part.output)}</pre>\n </div>\n )}\n {part.errorText && (\n <div className=\"agent-tool-section\">\n <div className=\"agent-tool-section-label\">Error</div>\n <pre className=\"agent-tool-code agent-tool-error\">{part.errorText}</pre>\n </div>\n )}\n </div>\n </details>\n );\n};\n\nconst SourceUrlBlock = ({ part }: { part: AgentSourceUrlPart }) => (\n <a className=\"agent-source\" href={part.url} target=\"_blank\" rel=\"noreferrer\">\n <span className=\"agent-source-label\">Source</span>\n <span className=\"agent-source-title\">{part.title || part.url}</span>\n </a>\n);\n\nconst SourceDocumentBlock = ({ part }: { part: AgentSourceDocumentPart }) => (\n <div className=\"agent-source agent-source-document\">\n <span className=\"agent-source-label\">Document</span>\n <span className=\"agent-source-title\">{part.title}</span>\n {part.filename && <span className=\"agent-source-meta\">{part.filename}</span>}\n </div>\n);\n\nconst FileBlock = ({ part }: { part: AgentFilePart }) => (\n <ArtifactWidget artifact={{\n id: part.url, filename: part.filename || (part.mediaType.startsWith(\"image/\") ? \"Generated image\" : \"Generated file\"),\n mediaType: part.mediaType, url: part.url, status: \"ready\",\n }} />\n);\n\nconst AgentEventBlock = ({ part }: { part: AgentDataPart }) => (\n <details className=\"agent-tool agent-event\">\n <summary>\n <span className=\"agent-event-marker\" aria-hidden=\"true\" />\n <span className=\"agent-tool-name\">data.{part.name}</span>\n </summary>\n <div className=\"agent-tool-body\">\n <pre className=\"agent-tool-code\">{formatJson(part.data)}</pre>\n </div>\n </details>\n);\n\nconst TextWithLegacyThinking = ({ text, isUser }: { text: string; isUser: boolean }) => {\n const userReferenceMessage = isUser ? parseUserReferenceMessage(text) : null;\n const content = userReferenceMessage?.message ?? text;\n const segments = splitThinkingSegments(content);\n\n return (\n <>\n {userReferenceMessage && (\n <div className=\"chat-user-reference\">\n {userReferenceMessage.references.map((reference, index) => (\n <div\n key={`${index}-${reference.slice(0, 16)}`}\n className=\"chat-user-reference-item\"\n >\n <div className=\"chat-reference-label\">\n Reference {index + 1}\n </div>\n <div className=\"chat-reference-text\">{reference}</div>\n </div>\n ))}\n </div>\n )}\n {segments.map((segment, index) => {\n if (!segment.content.trim() && segment.type !== \"thinking\") {\n return null;\n }\n\n if (segment.type === \"thinking\" && !isUser) {\n const isComplete = segment.isComplete ?? true;\n\n return (\n <ThinkingBlock key={`thinking-${index}`} isComplete={isComplete}>\n {!!segment.content.trim() && (\n <div className=\"md-thinking-body\">\n <MarkdownContent>{segment.content}</MarkdownContent>\n </div>\n )}\n </ThinkingBlock>\n );\n }\n\n return <MarkdownContent key={`md-${index}`}>{segment.content}</MarkdownContent>;\n })}\n </>\n );\n};\n\nconst asWidgetFromTool = (part: AgentToolPart): AgentWidgetPart | null => {\n const source =\n part.state === \"output-available\" && part.output !== undefined\n ? part.output\n : part.input;\n\n if (!isPropsRecord(source)) {\n return null;\n }\n\n return {\n type: \"widget\",\n name: part.toolName,\n id: part.toolCallId,\n props: source,\n interactive: part.toolName === \"question\" || source.interactive === true,\n };\n};\n\nconst asWidgetFromData = (part: AgentDataPart): AgentWidgetPart => ({\n type: \"widget\",\n name: part.name,\n id: part.id,\n props: isPropsRecord(part.data) ? part.data : { value: part.data },\n interactive: isPropsRecord(part.data) ? part.data.interactive === true : false,\n});\n\nconst PartView = ({ part, index, isUser }: { part: AgentPart; index: number; isUser: boolean }) => {\n const { widgets } = useWidgets();\n\n if (part.type === \"widget\") {\n return isUser ? null : <WidgetRenderer key={`widget-${part.id || index}`} part={part} />;\n }\n\n if (part.type === \"tool\" && !isUser) {\n const entry = widgets[part.toolName];\n const isCustom = entry && entry !== prebuiltWidgets[part.toolName];\n const widgetPart = isCustom ? asWidgetFromTool(part) : computeToolWidget(part);\n if (widgetPart) {\n return (\n <WidgetRenderer\n key={`tool-widget-${part.toolCallId || index}`}\n part={widgetPart}\n pending={part.state === \"input-streaming\"}\n />\n );\n }\n }\n\n if (part.type === \"data\" && !isUser && widgets[part.name]) {\n // Malformed builtin snapshots retain the generic data view. Host overrides remain unrestricted.\n const builtin = widgets[part.name] === prebuiltWidgets[part.name];\n if (builtin && ((part.name === \"artifact\" && !parseArtifact(part.data)) ||\n (part.name === \"subagent\" && !parseSubagent(part.data)))) return <AgentEventBlock part={part} />;\n return (\n <WidgetRenderer\n key={`data-widget-${part.name}-${part.id || index}`}\n part={asWidgetFromData(part)}\n />\n );\n }\n\n switch (part.type) {\n case \"text\":\n if (!isUser && part.state === \"streaming\" && part.text.trim().length === 0) {\n return <TextSkeleton key={`text-${index}`} />;\n }\n return <TextWithLegacyThinking key={`text-${index}`} text={part.text} isUser={isUser} />;\n case \"reasoning\":\n return isUser ? null : <ReasoningBlock key={`reasoning-${index}`} part={part} />;\n case \"tool\":\n return isUser ? null : <ToolBlock key={`tool-${part.toolCallId || index}`} part={part} />;\n case \"source-url\":\n return <SourceUrlBlock key={`source-url-${part.sourceId || index}`} part={part} />;\n case \"source-document\":\n return <SourceDocumentBlock key={`source-doc-${part.sourceId || index}`} part={part} />;\n case \"file\":\n return <FileBlock key={`file-${index}`} part={part} />;\n case \"data\":\n if (part.name === \"usage\" || part.name === \"context\" || part.name === \"context-warning\") {\n return null;\n }\n return <AgentEventBlock key={`data-${part.name}-${part.id || index}`} part={part} />;\n case \"unknown\":\n return (\n <details key={`unknown-${index}`} className=\"agent-tool agent-event\">\n <summary>\n <span className=\"agent-event-marker\" aria-hidden=\"true\" />\n <span className=\"agent-tool-name\">{part.rawType}</span>\n </summary>\n <div className=\"agent-tool-body\">\n <pre className=\"agent-tool-code\">{formatJson(part.raw)}</pre>\n </div>\n </details>\n );\n default:\n return null;\n }\n};\n\nexport const MessageContent = ({ parts, isUser = false }: MessageContentProps) => {\n const agentParts = normalizeAgentParts(parts);\n\n return (\n <div\n className={cn(\n \"chat-message-content break-words\",\n isUser ? \"md-content-user\" : \"md-content-assistant\",\n )}\n >\n {agentParts.map((part, index) => (\n <PartView key={`${part.type}-${index}`} part={part} index={index} isUser={isUser} />\n ))}\n </div>\n );\n};\n","\nexport type ContentSegment = {\n type: \"markdown\" | \"thinking\";\n content: string;\n isComplete?: boolean;\n};\n\n/**\n * Split thinking segments of the AI message. \n * @param content \n * @returns \n */\nexport const splitThinkingSegments = (content: string): ContentSegment[] => {\n const segments: ContentSegment[] = [];\n let cursor = 0;\n\n while (cursor < content.length) {\n const openingIndex = content.indexOf(\"<thinking>\", cursor);\n\n if (openingIndex === -1) {\n segments.push({\n type: \"markdown\",\n content: content.slice(cursor),\n });\n break;\n }\n\n if (openingIndex > cursor) {\n segments.push({\n type: \"markdown\",\n content: content.slice(cursor, openingIndex),\n });\n }\n\n const thinkingStart = openingIndex + \"<thinking>\".length;\n const closingIndex = content.indexOf(\"</thinking>\", thinkingStart);\n\n if (closingIndex === -1) {\n segments.push({\n type: \"thinking\",\n content: content.slice(thinkingStart).trim(),\n isComplete: false,\n });\n break;\n }\n\n segments.push({\n type: \"thinking\",\n content: content.slice(thinkingStart, closingIndex).trim(),\n isComplete: true,\n });\n cursor = closingIndex + \"</thinking>\".length;\n }\n\n if (!segments.length) {\n return [{ type: \"markdown\", content }];\n }\n\n return segments;\n};\n","\"use client\";\nimport { useState } from \"react\";\nimport { Download, FileText, Image as ImageIcon, ExternalLink } from \"lucide-react\";\nimport type { AgentArtifact } from \"@sarchauhan/protocol\";\nimport { ResponsiveDetail } from \"./responsive-detail\";\n\nexport type ArtifactWidgetProps = { artifact: AgentArtifact; className?: string };\nexport type ArtifactsWidgetProps = { artifacts: AgentArtifact[]; className?: string };\n/** Same-origin relative URLs, HTTP(S), blob URLs, and raster-image data URLs only. */\nexport function safeArtifactUrl(value?: string, image = false): string | undefined {\n if (!value || /[\\u0000-\\u0020\\u007f]/.test(value)) return undefined;\n if (/^blob:/i.test(value)) {\n try { new URL(value); return value; } catch { return undefined; }\n }\n if (image && /^data:image\\/(?:png|jpeg|gif|webp|avif);base64,[a-z0-9+/=]+$/i.test(value)) return value;\n try {\n const parsed = new URL(value, \"https://chat.invalid\");\n if (![\"https:\", \"http:\"].includes(parsed.protocol)) return undefined;\n return value;\n } catch { return undefined; }\n}\nexport function formatArtifactSize(bytes?: number): string | undefined {\n if (bytes === undefined || !Number.isFinite(bytes) || bytes < 0) return undefined;\n if (bytes < 1024) return bytes + \" B\";\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + \" KB\";\n return (bytes / (1024 * 1024)).toFixed(1) + \" MB\";\n}\nexport function ArtifactWidget({ artifact, className = \"\" }: ArtifactWidgetProps) {\n const { filename, mediaType, content, sizeBytes, error } = artifact;\n const state = artifact.status ?? \"ready\";\n const image = mediaType.startsWith(\"image/\");\n const [failedUrl, setFailedUrl] = useState<string>();\n const previewUrl = image ? safeArtifactUrl(artifact.url, true) : undefined;\n const link = safeArtifactUrl(artifact.url, image);\n const ready = state === \"ready\";\n const preview = ready && ((previewUrl && failedUrl !== previewUrl) || content !== undefined);\n const Icon = image ? ImageIcon : FileText;\n const label = state === \"creating\" ? \"Creating…\" : state === \"error\" ? \"Could not create file\" : \"Created\";\n const metadata = [mediaType, formatArtifactSize(sizeBytes)].filter(Boolean).join(\" · \");\n return <section className={\"chat-prebuilt chat-artifact \" + className} aria-label={\"Artifact: \" + filename} data-state={state}>\n {ready && previewUrl && failedUrl !== previewUrl ? <div className=\"chat-artifact-thumbnail\">\n <img src={previewUrl} alt={filename} loading=\"lazy\" onError={() => setFailedUrl(previewUrl)} />\n </div> : null}\n <div className=\"chat-artifact-row\">\n <span className=\"chat-artifact-icon\"><Icon size={20} aria-hidden=\"true\" /></span>\n <div className=\"chat-artifact-heading\"><strong title={filename}>{filename}</strong><span>{metadata}</span></div>\n <span className=\"chat-artifact-state\" role=\"status\">{label}</span>\n </div>\n {state === \"error\" && error ? <p className=\"chat-widget-error\" role=\"alert\">{error}</p> : null}\n {ready && image && previewUrl && failedUrl === previewUrl ? <p className=\"chat-widget-empty\">Image preview unavailable.</p> : null}\n {ready && (preview || link) ? <footer className=\"chat-artifact-actions\">\n {preview ? <ResponsiveDetail title={filename} description={metadata} trigger={<button type=\"button\">Preview</button>}>\n {image && previewUrl && failedUrl !== previewUrl\n ? <img className=\"chat-artifact-full-image\" src={previewUrl} alt={filename} onError={() => setFailedUrl(previewUrl)} />\n : <pre className=\"chat-artifact-text\" tabIndex={0}>{content}</pre>}\n </ResponsiveDetail> : null}\n {link ? <>\n <a href={link} target=\"_blank\" rel=\"noreferrer\"><ExternalLink size={14} aria-hidden=\"true\" />Open</a>\n <a href={link} download={filename} target=\"_blank\" rel=\"noreferrer\"><Download size={14} aria-hidden=\"true\" />Download</a>\n </> : null}\n </footer> : null}\n </section>;\n}\nexport function ArtifactsWidget({ artifacts, className = \"\" }: ArtifactsWidgetProps) {\n return <div className={\"chat-artifacts \" + className}>{artifacts.map((artifact) => <ArtifactWidget key={artifact.id} artifact={artifact} />)}</div>;\n}\n","\"use client\";\nimport { useRef, useState, type CSSProperties, type ReactElement, type ReactNode } from \"react\";\nimport { Dialog } from \"radix-ui\";\nimport { X } from \"lucide-react\";\n\nexport type ResponsiveDetailProps = {\n title: string;\n description?: string;\n trigger: ReactElement;\n children: ReactNode;\n};\n/** One accessible dialog; CSS changes its presentation to a bottom sheet below 640px. */\nexport function ResponsiveDetail({ title, description = \"Details from this conversation\", trigger, children }: ResponsiveDetailProps) {\n const origin = useRef<HTMLDivElement>(null);\n const [presentation, setPresentation] = useState<{ theme: string; style: CSSProperties }>({ theme: \"light\", style: {} });\n return <div ref={origin} className=\"chat-detail-origin\">\n <Dialog.Root onOpenChange={(open) => {\n if (!open || !origin.current) return;\n const host = origin.current.closest(\".chat-root\") ?? origin.current;\n const computed = window.getComputedStyle(host);\n const tokens: Record<string, string> = {};\n for (let index = 0; index < computed.length; index++) {\n const name = computed.item(index);\n if (name.startsWith(\"--chat-\")) tokens[name] = computed.getPropertyValue(name);\n }\n const requested = host.getAttribute(\"data-theme\");\n const dark = requested === \"dark\" || (requested === \"system\" && window.matchMedia?.(\"(prefers-color-scheme: dark)\").matches);\n setPresentation({ theme: dark ? \"dark\" : \"light\", style: tokens as CSSProperties });\n }}>\n <Dialog.Trigger asChild>{trigger}</Dialog.Trigger>\n <Dialog.Portal>\n <Dialog.Overlay className=\"chat-detail-overlay\" />\n <Dialog.Content className=\"chat-root chat-detail-panel\" data-theme={presentation.theme} style={presentation.style}>\n <div className=\"chat-detail-handle\" aria-hidden=\"true\" />\n <header className=\"chat-detail-header\">\n <div><Dialog.Title className=\"chat-detail-title\">{title}</Dialog.Title>\n <Dialog.Description className=\"chat-detail-description\">{description}</Dialog.Description></div>\n <Dialog.Close className=\"chat-detail-close\" aria-label=\"Close details\"><X size={18} aria-hidden=\"true\" /></Dialog.Close>\n </header>\n <div className=\"chat-detail-body\">{children}</div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n </div>;\n}\n","import { parseArtifact } from \"@sarchauhan/protocol\";\nimport type { AgentToolPart, AgentWidgetPart } from \"@sarchauhan/protocol\";\nimport type { SearchResult, WidgetState } from \"./types\";\n\nconst record = (value: unknown): Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\nconst string = (...values: unknown[]) =>\n values.find((value): value is string => typeof value === \"string\");\nconst number = (...values: unknown[]) =>\n values.find(\n (value): value is number =>\n typeof value === \"number\" && Number.isFinite(value),\n );\nconst aliases: Record<string, string> = {\n read: \"read-file\",\n read_file: \"read-file\",\n readFile: \"read-file\",\n \"read-file\": \"read-file\",\n patch: \"patch\",\n apply_patch: \"patch\",\n edit_file: \"patch\",\n edit: \"patch\",\n search: \"search\",\n grep: \"search\",\n file_search: \"search\",\n web_search: \"search\",\n question: \"question\",\n ask_question: \"question\",\n};\nexport function computeToolState(part: AgentToolPart): WidgetState {\n if (part.state === \"output-error\") return \"error\";\n if (part.state === \"output-denied\") return \"denied\";\n if (part.state === \"approval-requested\") return \"approval\";\n return part.state === \"output-available\" && !part.preliminary\n ? \"complete\"\n : \"running\";\n}\nexport function normalizeSearchResults(value: unknown): SearchResult[] {\n if (!Array.isArray(value)) return [];\n return value.flatMap((item) => {\n const result = record(item);\n const path = string(result.path, result.file, result.url);\n if (!path) return [];\n return [\n {\n path,\n line: number(result.line, result.lineNumber),\n text: string(result.text, result.snippet, result.content),\n title: string(result.title),\n url: string(result.url),\n },\n ];\n });\n}\n/** Convert known tool payloads; unknown or incomplete formats retain the raw tool view. */\nexport function computeToolWidget(part: AgentToolPart): AgentWidgetPart | null {\n const name = aliases[part.toolName];\n if (!name) {\n // Explicit artifact envelopes work across harnesses without guessing filesystem paths.\n const output = record(part.output);\n if (part.state !== \"output-available\") return null;\n if (Array.isArray(output.artifacts)) {\n const artifacts = output.artifacts.flatMap((value) => {\n const artifact = parseArtifact(value); return artifact ? [artifact] : [];\n });\n return artifacts.length ? { type: \"widget\", name: \"artifacts\", id: part.toolCallId, props: { artifacts } } : null;\n }\n const artifact = parseArtifact(output.artifact);\n return artifact ? { type: \"widget\", name: \"artifact\", id: part.toolCallId, props: { artifact } } : null;\n }\n const input = record(part.input),\n output = record(part.output);\n const values = { ...input, ...output };\n const common = { state: computeToolState(part), error: part.errorText };\n let props: Record<string, unknown>;\n if (name === \"read-file\") {\n const path = string(\n values.path,\n values.file,\n values.filename,\n values.file_path,\n );\n if (!path) return null;\n props = {\n ...common,\n path,\n content: string(output.content, output.text, part.output),\n startLine: number(values.startLine, values.start_line, values.offset),\n language: string(values.language),\n };\n if (part.state === \"output-available\" && props.content === undefined)\n return null;\n } else if (name === \"patch\") {\n const before = string(values.before, values.old_string, values.oldText);\n const after = string(values.after, values.new_string, values.newText);\n const diff =\n string(\n output.diff,\n output.patch,\n input.diff,\n input.patch,\n part.input,\n part.output,\n ) ??\n (before !== undefined && after !== undefined\n ? computeTextDiff(\n before,\n after,\n string(values.path, values.file_path, \"file\"),\n )\n : undefined);\n if (\n diff === undefined ||\n (diff && !/^(@@|diff --git|--- |\\*\\*\\* Begin Patch)/m.test(diff))\n )\n return null;\n props = {\n ...common,\n path: string(values.path, values.file, values.file_path),\n diff,\n };\n } else if (name === \"search\") {\n const query = string(values.query, values.pattern, values.search);\n if (query === undefined) return null;\n const results =\n output.results ??\n output.matches ??\n (Array.isArray(part.output) ? part.output : undefined);\n if (part.state === \"output-available\" && !Array.isArray(results))\n return null;\n props = {\n ...common,\n query,\n results: normalizeSearchResults(results),\n total: number(output.total, output.totalCount),\n };\n } else {\n if (\n [\"output-error\", \"output-denied\", \"approval-requested\"].includes(\n part.state,\n )\n )\n return null;\n // The answer output is not a new question. Keep the original prompt and choices.\n const prompt = string(input.prompt, input.question);\n if (!prompt) return null;\n props = { ...input, prompt };\n }\n return {\n type: \"widget\",\n name,\n id: part.toolCallId,\n props,\n interactive: name === \"question\" && part.state === \"input-available\",\n };\n}\n\nexport type DiffLine = {\n kind: \"add\" | \"remove\" | \"context\" | \"header\";\n text: string;\n oldLine?: number;\n newLine?: number;\n};\n/** Parse unified diffs (including multiple files) without counting file headers as edits. */\nexport function computeDiff(diff: string) {\n let oldLine = 0,\n newLine = 0,\n inHunk = false,\n oldRemaining = 0,\n newRemaining = 0,\n additions = 0,\n deletions = 0;\n const lines: DiffLine[] = diff\n .replace(/\\r\\n/g, \"\\n\")\n .split(\"\\n\")\n .map((text) => {\n const hunk = /^@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/.exec(text);\n if (hunk) {\n oldLine = Number(hunk[1]);\n newLine = Number(hunk[3]);\n oldRemaining = Number(hunk[2] ?? 1);\n newRemaining = Number(hunk[4] ?? 1);\n inHunk = true;\n return { kind: \"header\", text };\n }\n if (oldRemaining === 0 && newRemaining === 0) inHunk = false;\n if (!inHunk && /^(diff --git|--- |\\+\\+\\+ |\\*\\*\\* )/.test(text)) {\n inHunk = false;\n return { kind: \"header\", text };\n }\n // apply_patch has unnumbered hunks; counts remain useful without invented line numbers.\n if (text.startsWith(\"@@\")) {\n inHunk = false;\n return { kind: \"header\", text };\n }\n if (text.startsWith(\"+\")) {\n additions++;\n if (inHunk) newRemaining--;\n return { kind: \"add\", text, newLine: inHunk ? newLine++ : undefined };\n }\n if (text.startsWith(\"-\")) {\n deletions++;\n if (inHunk) oldRemaining--;\n return {\n kind: \"remove\",\n text,\n oldLine: inHunk ? oldLine++ : undefined,\n };\n }\n if (inHunk && text.startsWith(\" \")) {\n oldRemaining--;\n newRemaining--;\n return {\n kind: \"context\",\n text,\n oldLine: oldLine++,\n newLine: newLine++,\n };\n }\n return { kind: \"header\", text };\n });\n return { lines, additions, deletions };\n}\nexport function safeResultUrl(url?: string): string | undefined {\n try {\n const parsed = new URL(url ?? \"\");\n return [\"https:\", \"http:\"].includes(parsed.protocol)\n ? parsed.href\n : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Compute a unified replacement hunk with three context lines. Common edges stay out of the diff. */\nexport function computeTextDiff(\n before: string,\n after: string,\n path = \"file\",\n): string {\n if (before === after) return \"\";\n const split = (text: string) =>\n text === \"\"\n ? []\n : text.replace(/\\r\\n/g, \"\\n\").replace(/\\n$/, \"\").split(\"\\n\");\n const oldLines = split(before),\n newLines = split(after);\n let prefix = 0,\n suffix = 0;\n while (\n prefix < oldLines.length &&\n prefix < newLines.length &&\n oldLines[prefix] === newLines[prefix]\n )\n prefix++;\n while (\n suffix < oldLines.length - prefix &&\n suffix < newLines.length - prefix &&\n oldLines[oldLines.length - 1 - suffix] ===\n newLines[newLines.length - 1 - suffix]\n )\n suffix++;\n if (before.endsWith(\"\\n\") !== after.endsWith(\"\\n\")) suffix = 0;\n // If only the final newline changed, include the last line as a replacement.\n if (prefix === oldLines.length && prefix === newLines.length) {\n prefix = Math.max(0, prefix - 1);\n suffix = 0;\n }\n const start = Math.max(0, prefix - 3),\n tail = Math.min(3, suffix);\n const oldEnd = oldLines.length - suffix,\n newEnd = newLines.length - suffix;\n const oldCount = oldEnd + tail - start,\n newCount = newEnd + tail - start;\n const label = path.replace(/[\\r\\n]/g, \"\");\n const body = [\n ...oldLines.slice(start, prefix).map((line) => \" \" + line),\n ...oldLines\n .slice(prefix, oldEnd)\n .flatMap((line, index) => [\n \"-\" + line,\n ...(prefix + index === oldLines.length - 1 && !before.endsWith(\"\\n\")\n ? [\"\\\\"]\n : []),\n ]),\n ...newLines\n .slice(prefix, newEnd)\n .flatMap((line, index) => [\n \"+\" + line,\n ...(prefix + index === newLines.length - 1 && !after.endsWith(\"\\n\")\n ? [\"\\\\"]\n : []),\n ]),\n ...oldLines.slice(oldEnd, oldEnd + tail).map((line) => \" \" + line),\n ];\n return [\n `--- a/${label}`,\n `+++ b/${label}`,\n `@@ -${oldCount ? start + 1 : start},${oldCount} +${newCount ? start + 1 : start},${newCount} @@`,\n ...body,\n ].join(\"\\n\");\n}\n","\"use client\";\nimport type {\n ChatWidgetRegistry,\n WidgetComponentProps,\n} from \"../components/Widget/widget.context\";\nimport { parseArtifact, parseSubagent } from \"@sarchauhan/protocol\";\nimport { ArtifactWidget, ArtifactsWidget } from \"./artifact\";\nimport { SubagentWidget } from \"./subagent\";\nimport { normalizeSearchResults } from \"./compute\";\nimport { PatchWidget } from \"./patch\";\nimport { QuestionWidget } from \"./question\";\nimport { ReadFileWidget } from \"./read-file\";\nimport { SearchWidget } from \"./search\";\nimport type { QuestionOption, ToolWidgetProps } from \"./types\";\nconst str = (value: unknown, fallback = \"\") =>\n typeof value === \"string\" ? value : fallback;\nconst num = (value: unknown) =>\n typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\nconst common = (props: Record<string, unknown>): ToolWidgetProps => ({\n state:\n props.state === \"running\" ||\n props.state === \"error\" ||\n props.state === \"denied\" ||\n props.state === \"approval\"\n ? props.state\n : \"complete\",\n error: typeof props.error === \"string\" ? props.error : undefined,\n});\nfunction Read(props: WidgetComponentProps) {\n return (\n <ReadFileWidget\n {...common(props)}\n path={str(props.path, \"File\")}\n content={typeof props.content === \"string\" ? props.content : undefined}\n startLine={num(props.startLine)}\n language={str(props.language)}\n />\n );\n}\nfunction Patch(props: WidgetComponentProps) {\n return (\n <PatchWidget\n {...common(props)}\n path={str(props.path, \"File changes\")}\n diff={typeof props.diff === \"string\" ? props.diff : undefined}\n before={typeof props.before === \"string\" ? props.before : undefined}\n after={typeof props.after === \"string\" ? props.after : undefined}\n />\n );\n}\nfunction Search(props: WidgetComponentProps) {\n return (\n <SearchWidget\n {...common(props)}\n query={str(props.query)}\n results={normalizeSearchResults(props.results)}\n total={num(props.total)}\n />\n );\n}\nfunction Question(props: WidgetComponentProps) {\n const options: QuestionOption[] = Array.isArray(props.options)\n ? props.options.flatMap((item) => {\n if (typeof item === \"string\") return [{ label: item, value: item }];\n if (\n !item ||\n typeof item !== \"object\" ||\n typeof item.label !== \"string\" ||\n typeof item.value !== \"string\"\n )\n return [];\n return [\n {\n label: item.label,\n value: item.value,\n description: str(item.description),\n recommended: item.recommended === true,\n },\n ];\n })\n : [];\n return (\n <QuestionWidget\n prompt={str(props.prompt, \"Your answer\")}\n description={str(props.description)}\n options={options}\n multiple={props.multiple === true}\n allowCustom={props.allowCustom === true}\n disabled={!props.widget.interactive || props.widget.disabled}\n onSubmit={async (answer) => {\n const labels = answer.values.map(\n (value) =>\n options.find((option) => option.value === value)?.label ?? value,\n );\n await props.widget.respond(\n answer,\n [...labels, answer.text].filter(Boolean).join(\", \"),\n \"answer\",\n );\n }}\n />\n );\n}\nfunction Artifact(props: WidgetComponentProps) {\n const artifact = parseArtifact(props.artifact ?? props);\n return artifact ? <ArtifactWidget artifact={artifact} /> : <p className=\"chat-widget-empty\">File details are unavailable.</p>;\n}\nfunction Artifacts(props: WidgetComponentProps) {\n const artifacts = Array.isArray(props.artifacts) ? props.artifacts.flatMap((value) => {\n const artifact = parseArtifact(value); return artifact ? [artifact] : [];\n }) : [];\n return <ArtifactsWidget artifacts={artifacts} />;\n}\nfunction Subagent(props: WidgetComponentProps) {\n const subagent = parseSubagent(props.subagent ?? props);\n return subagent ? <SubagentWidget subagent={subagent} /> : <p className=\"chat-widget-empty\">Agent details are unavailable.</p>;\n}\n/** Defaults are always available; a host registry can override any name. */\nexport const prebuiltWidgets: ChatWidgetRegistry = {\n artifact: { name: \"artifact\", component: Artifact, shell: false },\n artifacts: { name: \"artifacts\", component: Artifacts, shell: false },\n subagent: { name: \"subagent\", component: Subagent, shell: false },\n \"read-file\": { name: \"read-file\", component: Read, shell: false },\n patch: { name: \"patch\", component: Patch, shell: false },\n search: { name: \"search\", component: Search, shell: false },\n question: { name: \"question\", component: Question, shell: false },\n};\n","\"use client\";\nimport { createContext, useContext } from \"react\";\nimport { ArrowUpRight, CircleCheck, CircleX, LoaderCircle, Bot } from \"lucide-react\";\nimport type { AgentSubagent } from \"@sarchauhan/protocol\";\nimport { MessageContent } from \"../components/Message/message.content\";\nimport { ArtifactsWidget } from \"./artifact\";\nimport { ResponsiveDetail } from \"./responsive-detail\";\n\nexport type SubagentWidgetProps = { subagent: AgentSubagent; className?: string };\nconst Depth = createContext(0);\nconst labels = { queued: \"Queued\", running: \"Working\", completed: \"Completed\", failed: \"Failed\", cancelled: \"Cancelled\" };\n\nexport function SubagentWidget({ subagent, className = \"\" }: SubagentWidgetProps) {\n const depth = useContext(Depth);\n const { title, task, state, summary, progress, messages = [], artifacts = [], error } = subagent;\n const Icon = state === \"completed\" ? CircleCheck : state === \"failed\" ? CircleX : state === \"running\" ? LoaderCircle : Bot;\n const canInspect = depth < 3;\n const transcript = messages.filter((message) => message.role !== \"system\");\n return <section className={\"chat-prebuilt chat-subagent \" + className} data-state={state} aria-label={\"Subagent: \" + title}>\n <div className=\"chat-subagent-heading\"><span className=\"chat-subagent-icon\"><Icon size={18} aria-hidden=\"true\" /></span>\n <div><strong>{title}</strong><span className=\"chat-subagent-state\" role=\"status\">{labels[state]}</span></div>\n {canInspect ? <ResponsiveDetail title={title} description={task || \"Subagent activity in this conversation\"}\n trigger={<button className=\"chat-subagent-inspect\" type=\"button\" aria-label={\"View activity for \" + title}>View activity<ArrowUpRight size={14} aria-hidden=\"true\" /></button>}>\n <Depth.Provider value={depth + 1}>\n <div className=\"chat-subagent-overview\"><span className=\"chat-subagent-state\">{labels[state]}</span>\n {progress !== undefined ? <span>{Math.round(progress * 100)}%</span> : null}</div>\n {summary ? <p className=\"chat-subagent-summary\">{summary}</p> : null}\n {error ? <p className=\"chat-widget-error\" role=\"alert\">{error}</p> : null}\n {transcript.length ? <div className=\"chat-subagent-transcript\">{transcript.map((message) => <article className=\"chat-subagent-message\" key={message.id}>\n <div className=\"chat-subagent-role\">{message.role === \"user\" ? \"Task\" : title}</div>\n <MessageContent parts={message.parts} isUser={message.role === \"user\"} />\n </article>)}</div> : <p className=\"chat-widget-empty\">{state === \"queued\" ? \"Waiting to start.\" : state === \"running\" ? \"Activity will appear as the agent works.\" : \"No activity was recorded.\"}</p>}\n {artifacts.length ? <div className=\"chat-subagent-artifacts\"><h4>Created files</h4><ArtifactsWidget artifacts={artifacts} /></div> : null}\n </Depth.Provider>\n </ResponsiveDetail> : null}\n </div>\n {task ? <p className=\"chat-subagent-task\">{task}</p> : null}\n {summary ? <p className=\"chat-subagent-summary\">{summary}</p> : null}\n {state === \"running\" && progress !== undefined ? <progress className=\"chat-subagent-progress\" value={progress} max={1} aria-label={\"Progress for \" + title} /> : null}\n {state === \"failed\" && error ? <p className=\"chat-widget-error\" role=\"alert\">{error}</p> : null}\n </section>;\n}\n","\"use client\";\nimport { useMemo, useState } from \"react\";\nimport { computeDiff, computeTextDiff } from \"./compute\";\nimport { ToolFrame } from \"./tool-frame\";\nimport type { PatchWidgetProps } from \"./types\";\nexport function PatchWidget({\n path = \"File changes\",\n diff: rawDiff,\n before,\n after,\n maxLines = 100,\n ...props\n}: PatchWidgetProps) {\n const diff = useMemo(\n () =>\n rawDiff ??\n (before !== undefined && after !== undefined\n ? computeTextDiff(before, after, path)\n : \"\"),\n [rawDiff, before, after, path],\n );\n const [expanded, setExpanded] = useState(false);\n const { lines, additions, deletions } = useMemo(\n () => computeDiff(diff),\n [diff],\n );\n const limit = Math.max(1, maxLines);\n return (\n <ToolFrame\n {...props}\n label=\"Patch\"\n title={path}\n meta={\n <>\n <span className=\"chat-diff-add-count\">+{additions}</span>{\" \"}\n <span className=\"chat-diff-remove-count\">−{deletions}</span>\n </>\n }\n >\n {diff ? (\n <div\n className=\"chat-code-preview chat-diff\"\n role=\"region\"\n aria-label={`Diff for ${path}`}\n tabIndex={0}\n >\n {(expanded ? lines : lines.slice(0, limit)).map((line, index) => (\n <div className=\"chat-code-line\" data-kind={line.kind} key={index}>\n <span className=\"chat-line-number\" aria-hidden=\"true\">\n {line.oldLine}\n </span>\n <span className=\"chat-line-number\" aria-hidden=\"true\">\n {line.newLine}\n </span>\n <code>{line.text || \" \"}</code>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"chat-widget-empty\">No changes supplied.</p>\n )}\n {!expanded && lines.length > limit ? (\n <button\n className=\"chat-widget-more\"\n type=\"button\"\n onClick={() => setExpanded(true)}\n >\n Show full diff ({lines.length} lines)\n </button>\n ) : null}\n </ToolFrame>\n );\n}\n","\"use client\";\nimport type { ReactNode } from \"react\";\nimport { ChevronDown } from \"lucide-react\";\nimport type { ToolWidgetProps } from \"./types\";\nexport function ToolFrame({\n label,\n title,\n meta,\n state = \"complete\",\n error,\n className = \"\",\n children,\n}: ToolWidgetProps & {\n label: string;\n title: string;\n meta?: ReactNode;\n children: ReactNode;\n}) {\n const status = {\n running: \"Working\",\n complete: \"Done\",\n error: \"Failed\",\n denied: \"Denied\",\n approval: \"Needs approval\",\n }[state];\n return (\n <details\n className={`chat-prebuilt chat-tool-widget ${className}`}\n data-state={state}\n open={state !== \"complete\"}\n >\n <summary>\n <ChevronDown size={14} aria-hidden=\"true\" />\n <span className=\"chat-tool-widget-label\">{label}</span>\n <span className=\"chat-tool-widget-title\" title={title}>\n {title}\n </span>\n <span className=\"chat-tool-widget-meta\">{meta}</span>\n <span className=\"chat-tool-widget-status\" role=\"status\">\n {status}\n </span>\n </summary>\n <div className=\"chat-tool-widget-body\">\n {error ? (\n <p className=\"chat-widget-error\" role=\"alert\">\n {error}\n </p>\n ) : (\n children\n )}\n </div>\n </details>\n );\n}\n","\"use client\";\nimport { useId, useRef, useState } from \"react\";\nimport { ArrowUp, Check } from \"lucide-react\";\nimport type { QuestionWidgetProps } from \"./types\";\nexport function QuestionWidget({\n prompt,\n description,\n options = [],\n multiple = false,\n allowCustom = false,\n disabled = false,\n onSubmit,\n className = \"\",\n}: QuestionWidgetProps) {\n const id = useId();\n const [selected, setSelected] = useState<string[]>([]),\n [text, setText] = useState(\"\");\n const [status, setStatus] = useState<\"idle\" | \"sending\" | \"sent\">(\"idle\");\n const [error, setError] = useState<string>();\n const submitting = useRef(false);\n const choices = options.map((option) =>\n typeof option === \"string\" ? { label: option, value: option } : option,\n );\n const locked = disabled || status !== \"idle\" || !onSubmit;\n return (\n <form\n className={`chat-prebuilt chat-question ${className}`}\n aria-labelledby={`${id}-prompt`}\n onSubmit={async (event) => {\n event.preventDefault();\n if (locked || submitting.current || (!selected.length && !text.trim()))\n return;\n submitting.current = true;\n setStatus(\"sending\");\n setError(undefined);\n try {\n await onSubmit?.({\n values: selected,\n ...(text.trim() ? { text: text.trim() } : {}),\n });\n setStatus(\"sent\");\n } catch (cause) {\n setError(\n cause instanceof Error\n ? cause.message\n : \"Could not send your answer. Try again.\",\n );\n setStatus(\"idle\");\n } finally {\n submitting.current = false;\n }\n }}\n >\n <div className=\"chat-question-eyebrow\">Your input</div>\n <h3 id={`${id}-prompt`}>{prompt}</h3>\n {description ? (\n <p className=\"chat-question-description\">{description}</p>\n ) : null}\n <fieldset disabled={locked}>\n <legend className=\"chat-sr-only\">\n {multiple ? \"Select one or more options\" : \"Select an option\"}\n </legend>\n {choices.map((option, index) => (\n <label\n className=\"chat-question-option\"\n data-selected={selected.includes(option.value)}\n key={`${option.value}-${index}`}\n >\n <input\n type={multiple ? \"checkbox\" : \"radio\"}\n name={id}\n value={option.value}\n checked={selected.includes(option.value)}\n onChange={() =>\n setSelected((current) =>\n multiple\n ? current.includes(option.value)\n ? current.filter((value) => value !== option.value)\n : [...current, option.value]\n : [option.value],\n )\n }\n />\n <span>\n <span className=\"chat-question-option-title\">\n {option.label}\n {option.recommended ? <small>Recommended</small> : null}\n </span>\n {option.description ? (\n <span className=\"chat-question-option-description\">\n {option.description}\n </span>\n ) : null}\n </span>\n </label>\n ))}\n {allowCustom || !choices.length ? (\n <label className=\"chat-question-custom\">\n {choices.length ? \"Additional context\" : \"Your answer\"}\n <textarea\n rows={2}\n value={text}\n onChange={(event) => setText(event.target.value)}\n placeholder=\"Type your answer…\"\n />\n </label>\n ) : null}\n </fieldset>\n <footer>\n <span role=\"status\">\n {status === \"sent\"\n ? \"Answer sent\"\n : status === \"sending\"\n ? \"Sending…\"\n : multiple\n ? \"Choose one or more\"\n : choices.length ? \"Choose and confirm\" : \"Write and confirm\"}\n </span>\n <button\n type=\"submit\"\n disabled={locked || (!selected.length && !text.trim())}\n >\n {status === \"sent\" ? (\n <Check size={14} aria-hidden=\"true\" />\n ) : (\n <ArrowUp size={14} aria-hidden=\"true\" />\n )}\n {status === \"sent\" ? \"Submitted\" : \"Confirm\"}\n </button>\n </footer>\n {error ? (\n <p className=\"chat-widget-error\" role=\"alert\">\n {error}\n </p>\n ) : null}\n </form>\n );\n}\n","\"use client\";\nimport { useState } from \"react\";\nimport { ToolFrame } from \"./tool-frame\";\nimport type { ReadFileWidgetProps } from \"./types\";\nexport function ReadFileWidget({\n path,\n content,\n startLine = 1,\n language,\n maxLines = 80,\n ...props\n}: ReadFileWidgetProps) {\n const [expanded, setExpanded] = useState(false);\n const lines = content?.split(/\\r?\\n/) ?? [];\n const limit = Math.max(1, maxLines);\n const firstLine = Math.max(1, Math.floor(startLine));\n return (\n <ToolFrame\n {...props}\n label=\"Read file\"\n title={path}\n meta={lines.length ? `${lines.length} lines` : language}\n >\n {content === undefined ? (\n <p className=\"chat-widget-empty\">\n {props.state === \"running\"\n ? \"Reading file…\"\n : \"No file content supplied.\"}\n </p>\n ) : (\n <div\n className=\"chat-code-preview\"\n role=\"region\"\n aria-label={`Contents of ${path}`}\n tabIndex={0}\n >\n {(expanded ? lines : lines.slice(0, limit)).map((line, index) => (\n <div className=\"chat-code-line\" key={index}>\n <span className=\"chat-line-number\" aria-hidden=\"true\">\n {firstLine + index}\n </span>\n <code>{line || \" \"}</code>\n </div>\n ))}\n </div>\n )}\n {!expanded && lines.length > limit ? (\n <button\n className=\"chat-widget-more\"\n type=\"button\"\n onClick={() => setExpanded(true)}\n >\n Show {lines.length - limit} more lines\n </button>\n ) : null}\n </ToolFrame>\n );\n}\n","\"use client\";\nimport { useState } from \"react\";\nimport { safeResultUrl } from \"./compute\";\nimport { ToolFrame } from \"./tool-frame\";\nimport type { SearchWidgetProps } from \"./types\";\nexport function SearchWidget({\n query,\n results = [],\n total,\n maxResults = 5,\n ...props\n}: SearchWidgetProps) {\n const [expanded, setExpanded] = useState(false);\n const limit = Math.max(1, maxResults);\n const count = Math.max(results.length, total ?? 0);\n return (\n <ToolFrame\n {...props}\n label=\"Search\"\n title={query}\n meta={`${count} ${count === 1 ? \"result\" : \"results\"}`}\n >\n {!results.length ? (\n <p className=\"chat-widget-empty\">\n {props.state === \"running\" ? \"Searching…\" : \"No results found.\"}\n </p>\n ) : (\n <ol className=\"chat-search-results\">\n {(expanded ? results : results.slice(0, limit)).map(\n (result, index) => {\n const href = safeResultUrl(result.url);\n const label = (\n <>\n {result.title || result.path}\n {result.line ? (\n <span className=\"chat-search-line\">:{result.line}</span>\n ) : null}\n </>\n );\n return (\n <li key={`${result.path}-${result.line}-${index}`}>\n {href ? (\n <a href={href} target=\"_blank\" rel=\"noreferrer\">\n {label}\n </a>\n ) : (\n <div className=\"chat-search-path\">{label}</div>\n )}\n {result.text ? <p>{result.text}</p> : null}\n </li>\n );\n },\n )}\n </ol>\n )}\n {!expanded && results.length > limit ? (\n <button\n className=\"chat-widget-more\"\n type=\"button\"\n onClick={() => setExpanded(true)}\n >\n Show {results.length - limit} more results\n </button>\n ) : null}\n </ToolFrame>\n );\n}\n","\"use client\";\n\nimport type { AgentWidgetPart, AgentWidgetProps } from \"@sarchauhan/protocol\";\nimport type { ComponentType, ReactNode } from \"react\";\nimport { createContext, useContext, useMemo } from \"react\";\nimport { prebuiltWidgets } from \"../../widgets/registry\";\nimport type { BaseWidgetProps } from \"./base.widget\";\n\nexport type WidgetResponse = {\n widgetId?: string;\n name: string;\n actionId?: string;\n value: unknown;\n label?: string;\n};\n\nexport type WidgetControls = {\n widgetId?: string;\n widgetName: string;\n interactive: boolean;\n disabled: boolean;\n respond: (value: unknown, label?: string, actionId?: string) => Promise<void>;\n respondWith: (response: Omit<WidgetResponse, \"widgetId\" | \"name\">) => Promise<void>;\n};\n\nexport type ChatWidgetProps<TProps extends AgentWidgetProps = AgentWidgetProps> = {\n id?: string;\n name: string;\n props: TProps;\n interactive?: boolean;\n disabled?: boolean;\n onRespond?: (response: WidgetResponse) => void | Promise<void>;\n};\n\nexport type ChatWidgetComponent<TProps extends AgentWidgetProps = AgentWidgetProps> = ComponentType<\n ChatWidgetProps<TProps>\n>;\n\nexport type WidgetComponentProps<TProps extends AgentWidgetProps = AgentWidgetProps> = TProps & {\n widget: WidgetControls;\n};\n\ntype WidgetValue<TProps extends AgentWidgetProps, TValue> =\n | TValue\n | ((props: TProps, controls: WidgetControls) => TValue);\n\nexport type ChatWidgetDefinition<TProps extends AgentWidgetProps = AgentWidgetProps> = {\n name: string;\n component: ComponentType<WidgetComponentProps<TProps>>;\n label?: WidgetValue<TProps, string>;\n title?: WidgetValue<TProps, ReactNode>;\n status?: WidgetValue<TProps, ReactNode>;\n meta?: WidgetValue<TProps, ReactNode>;\n className?: WidgetValue<TProps, string | undefined>;\n shell?: boolean;\n};\n\nexport type ChatWidgetEntry<TProps extends AgentWidgetProps = AgentWidgetProps> =\n | ChatWidgetComponent<TProps>\n | ChatWidgetDefinition<TProps>;\n\nexport type ChatWidgetRegistry = Record<string, ChatWidgetEntry>;\nexport type ChatWidgetInput = Array<ChatWidgetDefinition> | ChatWidgetRegistry;\n\nexport type DefineWidgetOptions<TProps extends AgentWidgetProps> = Pick<\n ChatWidgetDefinition<TProps>,\n \"label\" | \"title\" | \"status\" | \"meta\" | \"className\" | \"shell\"\n>;\n\nexport function defineWidget<TProps extends AgentWidgetProps>(\n name: string,\n component: ComponentType<WidgetComponentProps<TProps>>,\n options: DefineWidgetOptions<TProps> = {},\n): ChatWidgetDefinition<TProps> {\n return {\n name,\n component,\n shell: true,\n ...options,\n };\n}\n\nexport function createWidgetRegistry(widgets: ChatWidgetInput = {}): ChatWidgetRegistry {\n if (Array.isArray(widgets)) {\n return Object.fromEntries(widgets.map((widget) => [widget.name, widget]));\n }\n\n return widgets;\n}\n\nexport function readWidgetValue<TProps extends AgentWidgetProps, TValue>(\n value: WidgetValue<TProps, TValue> | undefined,\n props: TProps,\n controls: WidgetControls,\n): TValue | undefined {\n return typeof value === \"function\"\n ? (value as (props: TProps, controls: WidgetControls) => TValue)(props, controls)\n : value;\n}\n\nexport function getWidgetShellProps<TProps extends AgentWidgetProps>(\n definition: ChatWidgetDefinition<TProps>,\n props: TProps,\n controls: WidgetControls,\n): Omit<BaseWidgetProps, \"children\"> {\n const title = readWidgetValue(definition.title, props, controls);\n\n return {\n label:\n readWidgetValue(definition.label, props, controls) ??\n definition.name.replace(/[-_]/g, \" \"),\n title: title ?? definition.name,\n status: readWidgetValue(definition.status, props, controls),\n meta: readWidgetValue(definition.meta, props, controls),\n className: readWidgetValue(definition.className, props, controls),\n };\n}\n\nexport function isWidgetDefinition(\n entry: ChatWidgetEntry | null | undefined,\n): entry is ChatWidgetDefinition {\n return Boolean(entry && typeof entry === \"object\" && \"component\" in entry);\n}\n\ntype WidgetContextValue = {\n widgets: ChatWidgetRegistry;\n respondToWidget: (response: WidgetResponse) => Promise<void>;\n disabled: boolean;\n};\n\nconst WidgetContext = createContext<WidgetContextValue | null>(null);\n\ntype WidgetProviderProps = {\n widgets?: ChatWidgetInput;\n respondToWidget: (response: WidgetResponse) => Promise<void>;\n disabled?: boolean;\n children: ReactNode;\n};\n\nexport function WidgetProvider({\n widgets = {},\n respondToWidget,\n disabled = false,\n children,\n}: WidgetProviderProps) {\n const registry = useMemo(() => ({ ...prebuiltWidgets, ...createWidgetRegistry(widgets) }), [widgets]);\n const value = useMemo(\n () => ({\n widgets: registry,\n respondToWidget,\n disabled,\n }),\n [disabled, registry, respondToWidget],\n );\n\n return <WidgetContext.Provider value={value}>{children}</WidgetContext.Provider>;\n}\n\nexport function useWidgets() {\n const context = useContext(WidgetContext);\n\n if (!context) {\n return {\n widgets: prebuiltWidgets,\n respondToWidget: async () => undefined,\n disabled: true,\n };\n }\n\n return context;\n}\n\nexport function resolveWidgetPart(\n part: AgentWidgetPart,\n registry: ChatWidgetRegistry,\n): ChatWidgetEntry | null {\n return registry[part.name] ?? null;\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n xs: \"h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n \"icon-xs\": \"size-6 rounded-md [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\": \"size-8\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n skeleton = false,\n disabled,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n /** Muted, non-interactive button while its action is still loading. */\n skeleton?: boolean\n }) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n data-skeleton={skeleton ? \"true\" : undefined}\n aria-busy={skeleton ? true : undefined}\n disabled={skeleton || disabled}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","\"use client\";\n\nimport { Button } from \"../../ui/button\";\n\nexport const TextSkeleton = () => (\n <div className=\"chat-text-skeleton\" role=\"status\" aria-label=\"Assistant is writing\">\n <span className=\"chat-skeleton-bar\" />\n <span className=\"chat-skeleton-bar\" />\n <span className=\"chat-skeleton-bar chat-skeleton-bar-short\" />\n </div>\n);\n\nexport const WidgetActionSkeleton = () => (\n <div className=\"chat-widget-action-skeleton\" aria-label=\"Widget actions are loading\">\n <Button skeleton size=\"sm\" variant=\"secondary\" type=\"button\" tabIndex={-1} aria-hidden=\"true\">\n Confirm\n </Button>\n <Button skeleton size=\"sm\" variant=\"outline\" type=\"button\" tabIndex={-1} aria-hidden=\"true\">\n Cancel\n </Button>\n </div>\n);\n","\"use client\";\n\nimport type { AgentWidgetPart } from \"@sarchauhan/protocol\";\nimport type { ReactNode } from \"react\";\nimport { useRef, useState } from \"react\";\nimport { WidgetActionSkeleton } from \"../Message/message.skeleton\";\nimport { BaseWidget } from \"./base.widget\";\nimport {\n getWidgetShellProps,\n isWidgetDefinition,\n resolveWidgetPart,\n useWidgets,\n type WidgetControls,\n} from \"./widget.context\";\n\nexport function WidgetRenderer({\n part,\n pending = false,\n}: {\n part: AgentWidgetPart;\n pending?: boolean;\n}) {\n const { widgets, respondToWidget, disabled } = useWidgets();\n const entry = resolveWidgetPart(part, widgets);\n const [submitted, setSubmitted] = useState(false);\n const responsePending = useRef(false);\n const widgetDisabled = disabled || submitted;\n\n const respond = async (value: unknown, label?: string, actionId?: string) => {\n if (!part.interactive || disabled || submitted || responsePending.current) {\n return;\n }\n\n responsePending.current = true;\n setSubmitted(true);\n try {\n await respondToWidget({\n widgetId: part.id,\n name: part.name,\n actionId,\n value,\n label,\n });\n } catch (error) {\n setSubmitted(false);\n throw error;\n } finally {\n responsePending.current = false;\n }\n };\n\n const controls: WidgetControls = {\n widgetId: part.id,\n widgetName: part.name,\n interactive: Boolean(part.interactive),\n disabled: widgetDisabled,\n respond,\n respondWith: async (response) => {\n await respond(response.value, response.label, response.actionId);\n },\n };\n\n const frame = (node: ReactNode) => (\n <div className=\"chat-widget\" data-pending={pending ? \"true\" : undefined}>\n {node}\n {pending ? <WidgetActionSkeleton /> : null}\n </div>\n );\n\n if (!entry) {\n return frame(\n <BaseWidget\n label=\"Unhandled widget\"\n title={part.name}\n status=\"Raw props\"\n className=\"chat-widget-missing\"\n >\n <pre className=\"agent-tool-code\">{JSON.stringify(part.props, null, 2)}</pre>\n </BaseWidget>,\n );\n }\n\n if (isWidgetDefinition(entry)) {\n const Component = entry.component;\n const content = <Component {...part.props} widget={controls} />;\n\n if (entry.shell === false) {\n return frame(content);\n }\n\n return frame(\n <BaseWidget {...getWidgetShellProps(entry, part.props, controls)}>{content}</BaseWidget>,\n );\n }\n\n const Component = entry;\n\n return frame(\n <Component\n id={part.id}\n name={part.name}\n props={part.props}\n interactive={part.interactive}\n disabled={widgetDisabled}\n onRespond={async (response) => {\n if (!part.interactive || disabled || submitted || responsePending.current) {\n return;\n }\n\n responsePending.current = true;\n setSubmitted(true);\n try {\n await respondToWidget(response);\n } catch (error) {\n setSubmitted(false);\n throw error;\n } finally {\n responsePending.current = false;\n }\n }}\n />,\n );\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nexport type BaseWidgetProps = {\n label: string;\n title: ReactNode;\n status?: ReactNode;\n meta?: ReactNode;\n className?: string;\n children?: ReactNode;\n};\n\nexport function BaseWidget({\n label,\n title,\n status,\n meta,\n className,\n children,\n}: BaseWidgetProps) {\n return (\n <section className={cn(\"chat-widget-card\", className)} aria-label={label}>\n <header className=\"chat-widget-header\">\n <div className=\"chat-widget-heading\">\n {label ? (\n <div className=\"chat-widget-label-row\">\n <span className=\"chat-widget-status-dot\" aria-hidden=\"true\" />\n <span className=\"chat-widget-label\">{label}</span>\n </div>\n ) : null}\n <div className=\"chat-widget-title\">{title}</div>\n </div>\n {status ? <div className=\"chat-widget-status\">{status}</div> : null}\n </header>\n\n {children ? <div className=\"chat-widget-body\">{children}</div> : null}\n {meta ? <div className=\"chat-widget-meta\">{meta}</div> : null}\n </section>\n );\n}\n","\"use client\";\n\nimport { Children, isValidElement, type ComponentPropsWithoutRef } from \"react\";\nimport { CodeMarkdown, type SupportedLanguage } from \"@sarchauhan/code-markdown\";\nimport ReactMarkdown from \"react-markdown\";\nimport type { PluggableList } from \"unified\";\nimport remarkGfm from \"remark-gfm\";\n\nimport { cn } from \"../../lib/utils\";\nimport { useTheme } from \"../../theme/theme.context\";\nimport { chatCodeThemes } from \"./message.markdown.theme\";\n\nconst markdownPlugins: { remark: PluggableList; rehype: PluggableList } = {\n remark: [remarkGfm],\n rehype: [],\n};\n\nconst SUPPORTED_LANGUAGES: ReadonlySet<string> = new Set([\n \"c\",\n \"h\",\n \"cpp\",\n \"cxx\",\n \"cc\",\n \"hpp\",\n \"hxx\",\n \"go\",\n \"javascript\",\n \"js\",\n \"jsx\",\n \"mjs\",\n \"python\",\n \"py\",\n \"rust\",\n \"rs\",\n \"typescript\",\n \"ts\",\n \"tsx\",\n]);\n\nconst isSupportedLanguage = (value: string): value is SupportedLanguage =>\n SUPPORTED_LANGUAGES.has(value);\n\nconst getCodeLanguage = (className?: string): SupportedLanguage => {\n const match = className?.match(/language-([\\w-]+)/);\n const language = match?.[1]?.toLowerCase();\n return language && isSupportedLanguage(language) ? language : \"typescript\";\n};\n\nconst getTextContent = (value: unknown): string => {\n if (typeof value === \"string\" || typeof value === \"number\") {\n return String(value);\n }\n\n if (Array.isArray(value)) {\n return value.map(getTextContent).join(\"\");\n }\n\n return \"\";\n};\n\nconst MarkdownCodeBlock = ({\n code,\n language,\n}: {\n code: string;\n language: SupportedLanguage;\n}) => {\n const { resolvedTheme } = useTheme();\n\n return (\n <CodeMarkdown\n className=\"chat-code-markdown\"\n language={language}\n theme={chatCodeThemes[resolvedTheme]}\n showCopyButton\n showLineNumbers\n showLanguage\n >\n {code}\n </CodeMarkdown>\n );\n};\n\nconst MarkdownPre = ({ className, children }: ComponentPropsWithoutRef<\"pre\">) => {\n const child = Children.toArray(children)[0];\n const code = isValidElement<{ className?: string; children?: unknown }>(child)\n ? getTextContent(child.props.children)\n : getTextContent(children);\n const codeClassName = isValidElement<{ className?: string }>(child)\n ? child.props.className\n : undefined;\n\n return (\n <div className={cn(\"my-5\", className)}>\n <MarkdownCodeBlock\n language={getCodeLanguage(codeClassName)}\n code={code.replace(/\\n$/, \"\")}\n />\n </div>\n );\n};\n\nconst markdownComponents = {\n a: ({ className, ...props }: ComponentPropsWithoutRef<\"a\">) => (\n <a\n className={cn(\n \"font-medium text-primary underline underline-offset-2 decoration-primary/30 decoration-1 hover:decoration-primary/70\",\n className,\n )}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n {...props}\n />\n ),\n p: ({ className, ...props }: ComponentPropsWithoutRef<\"p\">) => (\n <p\n className={cn(\"my-[0.85em] text-inherit chat-text-body first:mt-0 last:mb-0\", className)}\n style={{ fontSize: \"var(--chat-body-size)\", lineHeight: \"var(--chat-body-leading)\" }}\n {...props}\n />\n ),\n h1: ({ className, ...props }: ComponentPropsWithoutRef<\"h1\">) => (\n <h1\n className={cn(\"mt-8 mb-3 chat-text-heading-1\", className)}\n style={{\n fontSize: \"var(--chat-heading-1-size)\",\n lineHeight: \"var(--chat-heading-1-leading)\",\n fontWeight: \"var(--chat-heading-1-weight)\",\n letterSpacing: \"var(--chat-heading-1-tracking)\",\n }}\n {...props}\n />\n ),\n h2: ({ className, ...props }: ComponentPropsWithoutRef<\"h2\">) => (\n <h2\n className={cn(\"mt-8 mb-3\", className)}\n style={{\n fontSize: \"var(--chat-fs-18)\",\n lineHeight: \"var(--chat-leading-tight)\",\n fontWeight: \"var(--chat-weight-semibold)\",\n letterSpacing: \"var(--chat-tracking-tight)\",\n }}\n {...props}\n />\n ),\n h3: ({ className, ...props }: ComponentPropsWithoutRef<\"h3\">) => (\n <h3\n className={cn(\"mt-6 mb-2\", className)}\n style={{\n fontSize: \"var(--chat-fs-16)\",\n lineHeight: \"var(--chat-leading-tight)\",\n fontWeight: \"var(--chat-weight-semibold)\",\n letterSpacing: \"var(--chat-tracking-tight)\",\n }}\n {...props}\n />\n ),\n h4: ({ className, ...props }: ComponentPropsWithoutRef<\"h4\">) => (\n <h4\n className={cn(\"mt-6 mb-2\", className)}\n style={{\n fontSize: \"var(--chat-fs-15)\",\n lineHeight: \"var(--chat-leading-tight)\",\n fontWeight: \"var(--chat-weight-semibold)\",\n letterSpacing: \"var(--chat-tracking-normal)\",\n }}\n {...props}\n />\n ),\n ul: ({ className, ...props }: ComponentPropsWithoutRef<\"ul\">) => (\n <ul\n className={cn(\"my-4 list-disc space-y-2 pl-6 chat-text-body\", className)}\n style={{ fontSize: \"var(--chat-body-size)\", lineHeight: \"var(--chat-body-leading)\" }}\n {...props}\n />\n ),\n ol: ({ className, ...props }: ComponentPropsWithoutRef<\"ol\">) => (\n <ol\n className={cn(\"my-4 list-decimal space-y-2 pl-6 chat-text-body\", className)}\n style={{ fontSize: \"var(--chat-body-size)\", lineHeight: \"var(--chat-body-leading)\" }}\n {...props}\n />\n ),\n li: ({ className, ...props }: ComponentPropsWithoutRef<\"li\">) => (\n <li\n className={cn(\"pl-1\", className)}\n style={{ lineHeight: \"var(--chat-leading-normal)\" }}\n {...props}\n />\n ),\n blockquote: ({ className, ...props }: ComponentPropsWithoutRef<\"blockquote\">) => (\n <blockquote className={cn(\"md-blockquote\", className)} {...props} />\n ),\n hr: ({ className, ...props }: ComponentPropsWithoutRef<\"hr\">) => (\n <hr className={cn(\"my-6 h-px border-0 bg-current opacity-10\", className)} {...props} />\n ),\n table: ({ className, ...props }: ComponentPropsWithoutRef<\"table\">) => (\n <div className=\"md-table-wrapper\">\n <table className={cn(\"md-table\", className)} {...props} />\n </div>\n ),\n thead: ({ className, ...props }: ComponentPropsWithoutRef<\"thead\">) => <thead {...props} />,\n tbody: ({ className, ...props }: ComponentPropsWithoutRef<\"tbody\">) => <tbody {...props} />,\n tr: ({ className, ...props }: ComponentPropsWithoutRef<\"tr\">) => <tr {...props} />,\n th: ({ className, ...props }: ComponentPropsWithoutRef<\"th\">) => <th {...props} />,\n td: ({ className, ...props }: ComponentPropsWithoutRef<\"td\">) => <td {...props} />,\n pre: MarkdownPre,\n // React Markdown v10 no longer consistently provides the legacy `inline`\n // prop. Fenced code is handled by the custom `pre` renderer above, so a\n // standalone `code` element should always be rendered as inline code.\n code: ({ className, children, ...props }: ComponentPropsWithoutRef<\"code\">) => (\n <code className={cn(\"md-inline-code\", className)} {...props}>\n {children}\n </code>\n ),\n};\n\ntype MarkdownContentProps = {\n children: string;\n className?: string;\n};\n\nexport const MarkdownContent = ({ children, className }: MarkdownContentProps) => (\n <div className={cn(\"md-content break-words text-inherit\", className)}>\n <ReactMarkdown\n remarkPlugins={markdownPlugins.remark}\n rehypePlugins={markdownPlugins.rehype}\n components={markdownComponents}\n >\n {children}\n </ReactMarkdown>\n </div>\n);\n","import type { CodeTheme } from \"@sarchauhan/code-markdown\";\n\nexport const chatCodeThemes: Record<\"light\" | \"dark\", CodeTheme> = {\n light: {\n name: \"chat-light\",\n shikiTheme: \"github-light\",\n colors: {\n background: \"#ffffff\",\n foreground: \"#0d0d0d\",\n comment: \"#6e6e80\",\n keyword: \"#9b174c\",\n string: \"#166534\",\n function: \"#1d4ed8\",\n variable: \"#0d0d0d\",\n number: \"#7c3aed\",\n operator: \"#9b174c\",\n punctuation: \"#6e6e80\",\n type: \"#0369a1\",\n tag: \"#166534\",\n attribute: \"#1d4ed8\",\n constant: \"#b45309\",\n surface: \"#f7f7f8\",\n overlay: \"#d8d8df\",\n subtext: \"#6e6e80\",\n },\n },\n dark: {\n name: \"chat-dark\",\n shikiTheme: \"github-dark\",\n colors: {\n background: \"#212121\",\n foreground: \"#ececec\",\n comment: \"#8f8f8f\",\n keyword: \"#ff7b72\",\n string: \"#a5d6a7\",\n function: \"#79c0ff\",\n variable: \"#ececec\",\n number: \"#d2a8ff\",\n operator: \"#ff7b72\",\n punctuation: \"#b4b4b4\",\n type: \"#79c0ff\",\n tag: \"#7ee787\",\n attribute: \"#79c0ff\",\n constant: \"#ffa657\",\n surface: \"#2f2f2f\",\n overlay: \"#454545\",\n subtext: \"#b4b4b4\",\n },\n },\n};\n","\"use client\";\n\nimport { ChevronDown, Sparkles } from \"lucide-react\";\nimport { useEffect, useState, type ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { TextSwap } from \"../../motion\";\nimport { formatElapsedWords, useElapsedTime } from \"./message.loading\";\n\ntype ThinkingBlockProps = {\n isComplete: boolean;\n elapsedMs?: number;\n children?: ReactNode;\n};\n\nexport const ThinkingBlock = ({ isComplete, elapsedMs, children }: ThinkingBlockProps) => {\n const [isOpen, setIsOpen] = useState(true);\n const measuredElapsed = useElapsedTime(!isComplete);\n const elapsed = elapsedMs ?? measuredElapsed;\n\n useEffect(() => {\n if (!isComplete) {\n setIsOpen(true);\n }\n }, [isComplete]);\n\n return (\n <details\n className={cn(\n \"md-thinking\",\n isComplete ? \"md-thinking-complete\" : \"md-thinking-pending\",\n )}\n open={isOpen}\n onToggle={(event) => setIsOpen(event.currentTarget.open)}\n >\n <summary>\n <Sparkles className=\"md-thinking-sparkle\" aria-hidden=\"true\" />\n <TextSwap\n className=\"md-thinking-label\"\n text={isComplete ? `Thought for ${formatElapsedWords(elapsed)}` : \"Thinking\"}\n />\n {isComplete && <ChevronDown className=\"md-thinking-chevron\" aria-hidden=\"true\" />}\n </summary>\n {children}\n </details>\n );\n};\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { TextSwap } from \"../../motion\";\n\nexport const useElapsedTime = (active: boolean) => {\n const startedAtRef = useRef(0);\n const [elapsed, setElapsed] = useState(0);\n\n useEffect(() => {\n if (!active) {\n return;\n }\n\n startedAtRef.current = Date.now();\n setElapsed(0);\n\n const timer = window.setInterval(() => {\n setElapsed(Date.now() - startedAtRef.current);\n }, 100);\n\n return () => window.clearInterval(timer);\n }, [active]);\n\n return elapsed;\n};\n\nexport const formatElapsed = (milliseconds: number, showTenths = false) => {\n const totalSeconds = Math.max(0, milliseconds / 1000);\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds - minutes * 60;\n const formattedSeconds = showTenths ? seconds.toFixed(1) : String(Math.floor(seconds));\n\n return minutes > 0 ? `${minutes}m ${formattedSeconds}s` : `${formattedSeconds}s`;\n};\n\nexport const formatElapsedWords = (milliseconds: number) => {\n const seconds = Math.max(0, Math.floor(milliseconds / 1000));\n\n if (seconds < 60) {\n return `${seconds} ${seconds === 1 ? \"second\" : \"seconds\"}`;\n }\n\n const minutes = Math.floor(seconds / 60);\n const remainder = seconds % 60;\n const minuteLabel = `${minutes} ${minutes === 1 ? \"minute\" : \"minutes\"}`;\n\n return remainder > 0\n ? `${minuteLabel} ${remainder} ${remainder === 1 ? \"second\" : \"seconds\"}`\n : minuteLabel;\n};\n\nconst PixelGrid = () => (\n <span className=\"chat-pixel-grid\" aria-hidden=\"true\">\n {Array.from({ length: 9 }, (_, index) => (\n <span key={index} />\n ))}\n </span>\n);\n\ntype LoadingStateProps = {\n label?: string;\n compact?: boolean;\n};\n\nexport const LoadingState = ({ label = \"Churning\", compact = false }: LoadingStateProps) => {\n const elapsed = useElapsedTime(true);\n\n return (\n <div className={`chat-loading${compact ? \" chat-loading-inline\" : \"\"}`} role=\"status\" aria-live=\"polite\">\n <PixelGrid />\n <TextSwap className=\"chat-loading-label\" text={label} />\n <span className=\"chat-loading-timer\" role=\"timer\">\n {formatElapsed(elapsed, true)}\n </span>\n <span className=\"chat-visually-hidden\">Loading conversation</span>\n </div>\n );\n};\n","\"use client\";\n\nimport { ThumbsDown, ThumbsUp } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { MessageCopy } from \"./message.copy\";\nimport { MessageRegenerate } from \"./message.regenerate\";\n\ntype MessageFeedbackProps = {\n responseText: string;\n onRegenerate: () => void;\n canRegenerate: boolean;\n disabled?: boolean;\n};\n\nexport const MessageFeedback = ({\n responseText,\n onRegenerate,\n canRegenerate,\n disabled = false,\n}: MessageFeedbackProps) => {\n const [feedback, setFeedback] = useState<\"up\" | \"down\" | null>(null);\n\n // An assistant placeholder is created before streaming starts. Actions on it\n // are misleading (and copy an empty string), so wait for visible text.\n if (!responseText.trim()) {\n return null;\n }\n\n return (\n <div className=\"chat-message-feedback\" aria-label=\"Message actions\">\n <MessageCopy text={responseText} disabled={disabled} />\n <MessageRegenerate\n onRegenerate={onRegenerate}\n disabled={!canRegenerate || disabled}\n />\n <button\n type=\"button\"\n className={`chat-feedback-button${feedback === \"up\" ? \" is-selected\" : \"\"}`}\n title=\"Good response\"\n aria-label=\"Good response\"\n aria-pressed={feedback === \"up\"}\n onClick={() => setFeedback(feedback === \"up\" ? null : \"up\")}\n disabled={disabled}\n >\n <ThumbsUp size={18} />\n </button>\n <button\n type=\"button\"\n className={`chat-feedback-button${feedback === \"down\" ? \" is-selected\" : \"\"}`}\n title=\"Poor response\"\n aria-label=\"Poor response\"\n aria-pressed={feedback === \"down\"}\n onClick={() => setFeedback(feedback === \"down\" ? null : \"down\")}\n disabled={disabled}\n >\n <ThumbsDown size={18} />\n </button>\n </div>\n );\n};\n","\"use client\";\n\nimport { Check, Copy } from \"lucide-react\";\nimport { useState } from \"react\";\n\nexport const MessageCopy = ({ text, disabled = false }: { text: string; disabled?: boolean }) => {\n const [isCopied, setIsCopied] = useState(false);\n\n const copyMessage = async () => {\n await navigator.clipboard.writeText(text);\n setIsCopied(true);\n window.setTimeout(() => setIsCopied(false), 1500);\n };\n\n return (\n <button\n type=\"button\"\n className=\"chat-feedback-button\"\n title={isCopied ? \"Copied\" : \"Copy response\"}\n aria-label={isCopied ? \"Copied\" : \"Copy response\"}\n onClick={() => void copyMessage()}\n disabled={disabled}\n >\n {isCopied ? <Check size={16} /> : <Copy size={16} />}\n </button>\n );\n};\n","\"use client\";\n\nimport { RotateCcw } from \"lucide-react\";\n\ntype MessageRegenerateProps = {\n onRegenerate: () => void;\n disabled?: boolean;\n};\n\nexport const MessageRegenerate = ({ onRegenerate, disabled = false }: MessageRegenerateProps) => (\n <button\n type=\"button\"\n className=\"chat-feedback-button\"\n title=\"Regenerate response\"\n aria-label=\"Regenerate response\"\n disabled={disabled}\n onClick={onRegenerate}\n >\n <RotateCcw size={17} />\n </button>\n);\n","import {\n parseContext,\n parseUsage,\n type AgentContext,\n type AgentDataPart,\n} from \"@sarchauhan/protocol\";\n\nconst formatTokens = (value: number) => new Intl.NumberFormat(\"en-US\").format(value);\nconst isTokenCount = (value: unknown): value is number =>\n typeof value === \"number\" && Number.isFinite(value);\nconst getContextMetrics = (context: AgentContext | undefined) => {\n const currentTokens = context?.current_tokens;\n const contextWindow = context?.context_window;\n\n return isTokenCount(currentTokens) && isTokenCount(contextWindow)\n ? { currentTokens, contextWindow }\n : null;\n};\n\nexport const MessageUsage = ({ parts }: { parts: AgentDataPart[] }) => {\n const usage = parseUsage(parts.find((part) => part.name === \"usage\")?.data);\n const context = parseContext(parts.find((part) => part.name === \"context\")?.data);\n const contextMetrics = getContextMetrics(context);\n const tokenMetrics = usage\n ? [\n [\"in\", usage.input_tokens],\n [\"out\", usage.output_tokens],\n [\"reasoning\", usage.reasoning_tokens],\n [\"total\", usage.total_tokens],\n ].filter((metric): metric is [string, number] => isTokenCount(metric[1]))\n : [];\n\n if (!contextMetrics && tokenMetrics.length === 0) return null;\n\n return (\n <p className=\"chat-message-usage\" aria-label=\"Context and token usage\">\n {contextMetrics ? (\n <>\n Context {formatTokens(contextMetrics.currentTokens)} / {formatTokens(contextMetrics.contextWindow)} ({Math.round((contextMetrics.currentTokens / contextMetrics.contextWindow) * 100)}%)\n </>\n ) : null}\n {tokenMetrics.length > 0 ? (\n <>\n {contextMetrics ? \" · \" : null}\n Tokens {tokenMetrics.map(([label, value]) => `${label} ${formatTokens(value)}`).join(\" · \")}\n </>\n ) : null}\n </p>\n );\n};\n","\"use client\";\n\nimport { useMessages, useThread } from \"../Chat/context\";\nimport { MessageItem } from \"../Message/message.item\";\nimport { TextSkeleton } from \"./message.skeleton\";\n\nconst WaitingForResponse = () => (\n <div className=\"chat-response-status\" role=\"status\" aria-live=\"polite\">\n <TextSkeleton />\n </div>\n);\n\nexport const Message = () => {\n const { messages, isWaitingForResponse } = useMessages();\n const { isLoadingThread } = useThread();\n\n if (isLoadingThread) {\n return (\n <div className=\"chat-messages-inner\">\n <div className=\"chat-loading chat-loading-initial\" role=\"status\" aria-live=\"polite\">\n Loading conversation…\n </div>\n </div>\n );\n }\n\n if (messages.length === 0) {\n return (\n <div className=\"chat-messages-inner\">\n <div className=\"chat-empty\">\n <div>\n <p className=\"chat-empty-title\">How can I help?</p>\n <p className=\"chat-empty-copy\">\n Ask a question, explore ideas, or use tools and widgets when the agent needs them.\n </p>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"chat-messages-inner\">\n {messages.map((message) => (\n <MessageItem key={message.id} message={message} />\n ))}\n {isWaitingForResponse ? <WaitingForResponse /> : null}\n </div>\n );\n};\n","export { ReadFileWidget } from \"./read-file\";\nexport { PatchWidget } from \"./patch\";\nexport { SearchWidget } from \"./search\";\nexport { QuestionWidget } from \"./question\";\nexport { prebuiltWidgets } from \"./registry\";\nexport {\n computeToolWidget,\n computeToolState,\n computeDiff,\n computeTextDiff,\n normalizeSearchResults,\n safeResultUrl,\n type DiffLine,\n} from \"./compute\";\nexport type {\n ReadFileWidgetProps,\n PatchWidgetProps,\n SearchWidgetProps,\n SearchResult,\n QuestionWidgetProps,\n QuestionOption,\n QuestionAnswer,\n ToolWidgetProps,\n WidgetState,\n} from \"./types\";\n\nexport { ArtifactWidget, ArtifactsWidget, safeArtifactUrl, formatArtifactSize } from \"./artifact\";\nexport type { ArtifactWidgetProps, ArtifactsWidgetProps } from \"./artifact\";\nexport { SubagentWidget } from \"./subagent\";\nexport type { SubagentWidgetProps } from \"./subagent\";\nexport { ResponsiveDetail } from \"./responsive-detail\";\nexport type { ResponsiveDetailProps } from \"./responsive-detail\";\nexport { createArtifactData, createSubagentData, parseArtifact, parseSubagent } from \"@sarchauhan/protocol\";\nexport type { AgentArtifact, AgentSubagent, AgentSubagentState } from \"@sarchauhan/protocol\";\n"],"mappings":"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","names":["import_lucide_react","import_react","import_jsx_runtime","import_lucide_react","import_react","_a","import_react","import_jsx_runtime","import_react","import_lucide_react","import_react","import_react","import_react","import_react","import_jsx_runtime","ChatTooltip","import_react","import_react_dom","import_react","ProviderId","import_jsx_runtime","import_react","import_jsx_runtime","thread","_a","_b","import_jsx_runtime","isSending","message","import_jsx_runtime","value","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","SelectPrimitive","SelectPrimitive","SelectPrimitive","import_lucide_react","import_jsx_runtime","_a","providerName","import_jsx_runtime","import_lucide_react","import_react","import_protocol","import_protocol","import_lucide_react","import_react","import_react","import_lucide_react","import_react","import_radix_ui","import_lucide_react","import_jsx_runtime","import_jsx_runtime","ImageIcon","output","artifact","common","import_protocol","import_react","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","labels","import_react","import_jsx_runtime","import_radix_ui","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","Component","import_react","import_jsx_runtime","remarkGfm","ReactMarkdown","import_lucide_react","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","_a","import_lucide_react","import_react","import_lucide_react","import_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_protocol","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_protocol","import_protocol"]}