@carto/ps-react-ui 6.1.0 → 6.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{actions-BWlS5tpP.js → actions-CueYrfVr.js} +2 -2
- package/dist/actions-CueYrfVr.js.map +1 -0
- package/dist/category-DULnoxvk.js +933 -0
- package/dist/category-DULnoxvk.js.map +1 -0
- package/dist/chat.js +1 -1
- package/dist/chat.js.map +1 -1
- package/dist/components-CTUpdQuj.js.map +1 -1
- package/dist/download-B4sykOFm.js.map +1 -1
- package/dist/{echart-CV8F50gn.js → echart-ysYFLa_T.js} +2 -2
- package/dist/echart-ysYFLa_T.js.map +1 -0
- package/dist/formula-DJS-JLpk.js.map +1 -1
- package/dist/legend.js.map +1 -1
- package/dist/{markdown-Bn2nKCbn.js → markdown-DmvLi3vx.js} +2 -2
- package/dist/markdown-DmvLi3vx.js.map +1 -0
- package/dist/{markdown-content-kYNLOX0T.js → markdown-content-BpAH_V6S.js} +5 -4
- package/dist/markdown-content-BpAH_V6S.js.map +1 -0
- package/dist/option-builders-DQivvvbb.js.map +1 -1
- package/dist/range-BpU2zBmq.js.map +1 -1
- package/dist/smart-tooltip-Dc_rHhyI.js.map +1 -1
- package/dist/spread-CQwFIwuz.js.map +1 -1
- package/dist/stores-DcBOZlU3.js.map +1 -1
- package/dist/stores-mad-9yFn.js.map +1 -1
- package/dist/styles-BCEBm7xh.js.map +1 -1
- package/dist/table-DEdW_fDj.js.map +1 -1
- package/dist/types/widgets/category/category-ui.d.ts +10 -2
- package/dist/types/widgets/category/category.d.ts +7 -1
- package/dist/types/widgets/category/components/category-bar-stacked.d.ts +8 -1
- package/dist/types/widgets/category/components/category-bar.d.ts +24 -2
- package/dist/types/widgets/category/components/category-row-multi.d.ts +3 -1
- package/dist/types/widgets/category/components/category-row-single.d.ts +3 -1
- package/dist/types/widgets/category/components/category-row-stacked.d.ts +10 -1
- package/dist/types/widgets/category/style.d.ts +33 -6
- package/dist/types/widgets/wrapper/style.d.ts +31 -2
- package/dist/types/widgets/wrapper/widget-actions.d.ts +2 -2
- package/dist/types/widgets/wrapper/widget-wrapper.d.ts +2 -2
- package/dist/utils-C-eWwOhE.js.map +1 -1
- package/dist/widgets/actions.js +1 -1
- package/dist/widgets/bar.js.map +1 -1
- package/dist/widgets/category.js +1 -1
- package/dist/widgets/echart.js +1 -1
- package/dist/widgets/histogram.js.map +1 -1
- package/dist/widgets/markdown.js +2 -2
- package/dist/widgets/pie.js +2 -2
- package/dist/widgets/pie.js.map +1 -1
- package/dist/widgets/scatterplot.js.map +1 -1
- package/dist/widgets/timeseries.js.map +1 -1
- package/dist/widgets.js +344 -297
- package/dist/widgets.js.map +1 -1
- package/dist/zoom-toggle-MmLjMTEw.js.map +1 -1
- package/package.json +2 -2
- package/src/widgets/category/category-ui.test.tsx +139 -0
- package/src/widgets/category/category-ui.tsx +64 -11
- package/src/widgets/category/category.test.tsx +67 -0
- package/src/widgets/category/category.tsx +32 -15
- package/src/widgets/category/components/category-bar-stacked.test.tsx +18 -0
- package/src/widgets/category/components/category-bar-stacked.tsx +42 -29
- package/src/widgets/category/components/category-bar.test.tsx +66 -0
- package/src/widgets/category/components/category-bar.tsx +65 -9
- package/src/widgets/category/components/category-row-multi.tsx +21 -0
- package/src/widgets/category/components/category-row-single.tsx +4 -0
- package/src/widgets/category/components/category-row-stacked.tsx +24 -1
- package/src/widgets/category/style.ts +58 -14
- package/src/widgets/wrapper/style.ts +38 -2
- package/src/widgets/wrapper/widget-actions.tsx +2 -2
- package/src/widgets/wrapper/widget-wrapper.test.tsx +32 -2
- package/src/widgets/wrapper/widget-wrapper.tsx +62 -36
- package/dist/actions-BWlS5tpP.js.map +0 -1
- package/dist/category-alzjKzvQ.js +0 -839
- package/dist/category-alzjKzvQ.js.map +0 -1
- package/dist/echart-CV8F50gn.js.map +0 -1
- package/dist/markdown-Bn2nKCbn.js.map +0 -1
- package/dist/markdown-content-kYNLOX0T.js.map +0 -1
package/dist/chat.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.js","names":["options: UseTypewriterOptions = {}","speed = 500","skipAnimation = false","() =>\n skipAnimation ? fullText.length : 0","fullText.length","() => {\n // When `skipAnimation` is set there's nothing to animate — the full text is\n // shown directly via the derived `displayedText` below (no setState here, so\n // a streamed message snaps to its full text the moment generation finishes,\n // without an extra render or a `set-state-in-effect` cascade).\n if (skipAnimation) return\n\n // Already fully revealed (e.g. text hasn't grown since the last frame).\n if (charRef.current >= fullText.length) return\n\n const msPerChar = 1000 / speed\n let rafId: number\n let lastTime: number | null = null\n\n function tick(timestamp: number) {\n // Plain `?? =` not `??=`: the React Compiler can't lower logical-assignment\n // operators and would bail this hook out of optimization.\n lastTime = lastTime ?? timestamp\n const charsToAdd = Math.floor((timestamp - lastTime) / msPerChar)\n if (charsToAdd > 0) {\n lastTime = timestamp\n const next = Math.min(charRef.current + charsToAdd, fullText.length)\n charRef.current = next\n setCharIndex(next)\n if (next >= fullText.length) return // fully revealed — stop the loop\n }\n rafId = requestAnimationFrame(tick)\n }\n\n rafId = requestAnimationFrame(tick)\n return () => cancelAnimationFrame(rafId)\n }","[fullText, speed, skipAnimation]","skipAnimation ? fullText : fullText.slice(0, charIndex)","{\n displayedText: skipAnimation ? fullText : fullText.slice(0, charIndex),\n isTyping: !skipAnimation && charIndex < fullText.length,\n }","!skipAnimation && charIndex < fullText.length","{\n children,\n muted = false,\n topContext,\n sx,\n}: ChatUserMessageProps","muted = false","topContext && <Box sx={styles.userMessageTop}>{topContext}</Box>","{\n ...styles.userMessage,\n ...(muted ? styles.muted : undefined),\n ...sx,\n }","muted ? styles.muted : undefined","<ChatMessageOverflow\n className='PsChat--user-message-inner'\n variant='body2'\n sx={{\n ...styles.userMessage,\n ...(muted ? styles.muted : undefined),\n ...sx,\n }}\n >\n {children}\n </ChatMessageOverflow>","<Box className='PsChat--user-message' sx={styles.userMessageContainer}>\n {topContext && <Box sx={styles.userMessageTop}>{topContext}</Box>}\n <ChatMessageOverflow\n className='PsChat--user-message-inner'\n variant='body2'\n sx={{\n ...styles.userMessage,\n ...(muted ? styles.muted : undefined),\n ...sx,\n }}\n >\n {children}\n </ChatMessageOverflow>\n </Box>","{ className, ...props }: BoxProps","<Box className={`PsChat--agent-message ${className ?? ''}`} {...props} />","`PsChat--agent-message ${className ?? ''}`","{ children, ...props }","<StyledAgentMessage ref={ref} {...props}>\n {children}\n </StyledAgentMessage>","{\n children,\n ...props\n}: ChatAgentMessageMarkdownProps","<MarkdownContent content={children} gfm />","<Suspense fallback={children}>\n <MarkdownContent content={children} gfm />\n </Suspense>","<ChatAgentMessage {...props}>\n <Suspense fallback={children}>\n <MarkdownContent content={children} gfm />\n </Suspense>\n </ChatAgentMessage>","{\n errors,\n icon,\n actions,\n sx,\n}: ChatErrorMessageProps","{ ...styles.errorMessage, ...sx }","icon ?? <ErrorOutlineOutlined fontSize='medium' color='error' />","errors.map((error, index) => (\n <Typography\n key={index}\n variant='subtitle2'\n sx={{\n color: 'error.relatedDark',\n }}\n >\n {error}\n </Typography>\n ))","(error, index) => (\n <Typography\n key={index}\n variant='subtitle2'\n sx={{\n color: 'error.relatedDark',\n }}\n >\n {error}\n </Typography>\n )","actions?.length ? (\n <Box sx={styles.errorActions}>\n {(actions ?? []).map((action, index) => (\n <span key={index}>\n {index > 0 && (\n <Typography\n component='span'\n variant='body2'\n sx={styles.errorActionSeparator}\n >\n ·\n </Typography>\n )}\n <Link\n component='button'\n variant='body2'\n onClick={action.onClick}\n sx={styles.errorAction}\n >\n {action.label}\n </Link>\n </span>\n ))}\n </Box>\n ) : null","(action, index) => (\n <span key={index}>\n {index > 0 && (\n <Typography\n component='span'\n variant='body2'\n sx={styles.errorActionSeparator}\n >\n ·\n </Typography>\n )}\n <Link\n component='button'\n variant='body2'\n onClick={action.onClick}\n sx={styles.errorAction}\n >\n {action.label}\n </Link>\n </span>\n )","actions?.length","<Box sx={{ ...styles.errorMessage, ...sx }}>\n {icon ?? <ErrorOutlineOutlined fontSize='medium' color='error' />}\n {errors.map((error, index) => (\n <Typography\n key={index}\n variant='subtitle2'\n sx={{\n color: 'error.relatedDark',\n }}\n >\n {error}\n </Typography>\n ))}\n {actions?.length ? (\n <Box sx={styles.errorActions}>\n {(actions ?? []).map((action, index) => (\n <span key={index}>\n {index > 0 && (\n <Typography\n component='span'\n variant='body2'\n sx={styles.errorActionSeparator}\n >\n ·\n </Typography>\n )}\n <Link\n component='button'\n variant='body2'\n onClick={action.onClick}\n sx={styles.errorAction}\n >\n {action.label}\n </Link>\n </span>\n ))}\n </Box>\n ) : null}\n </Box>","index","{\n label,\n backgroundColor,\n sx,\n ...props\n}: ChatSuggestionButtonProps","backgroundColor ? { backgroundColor } : undefined","{\n ...styles.suggestionButton,\n ...(backgroundColor ? { backgroundColor } : undefined),\n ...sx,\n }","{\n color: 'inherit',\n }","<Typography\n variant='body2'\n sx={{\n color: 'inherit',\n }}\n >\n {label}\n </Typography>","<ArrowUpward />","<ButtonBase\n sx={{\n ...styles.suggestionButton,\n ...(backgroundColor ? { backgroundColor } : undefined),\n ...sx,\n }}\n {...props}\n >\n <Typography\n variant='body2'\n sx={{\n color: 'inherit',\n }}\n >\n {label}\n </Typography>\n <ArrowUpward />\n </ButtonBase>","{\n children = 'Thinking...',\n duration = 2000,\n sx,\n}: ChatThinkingProps","children = 'Thinking...'","duration = 2000","{\n ...styles.thinking,\n animationDuration: durSeconds,\n ...sx,\n }","<Typography\n variant='body2'\n sx={{\n ...styles.thinking,\n animationDuration: durSeconds,\n ...sx,\n }}\n >\n {children}\n </Typography>","{ size = 24, labels = {}, sx }: ChatLoaderProps","size = 24","labels = {}","{ ...styles.loader, width: size, height: size, ...sx }","<Box\n component='span'\n sx={{\n ...styles.loaderOuterCircle,\n width: size * 0.75,\n height: size * 0.75,\n }}\n />","size * 0.75","<Box\n component='span'\n sx={{\n ...styles.loaderInnerCircle,\n width: size * 0.32,\n height: size * 0.32,\n }}\n />","size * 0.32","<Box\n role='status'\n aria-busy={true}\n aria-label={labels.loading ?? 'Loading'}\n sx={{ ...styles.loader, width: size, height: size, ...sx }}\n >\n <Box\n component='span'\n sx={{\n ...styles.loaderOuterCircle,\n width: size * 0.75,\n height: size * 0.75,\n }}\n />\n <Box\n component='span'\n sx={{\n ...styles.loaderInnerCircle,\n width: size * 0.32,\n height: size * 0.32,\n }}\n />\n </Box>","labels.loading ?? 'Loading'","{ children, autoScroll = true, labels = {}, sx }","autoScroll = true","labels = {}","() => {\n scrollRef.current?.scrollTo({\n top: scrollRef.current.scrollHeight,\n behavior: 'smooth',\n })\n }","() => {\n scrollRef.current?.scrollTo({ top: 0, behavior: 'smooth' })\n }","() => ({ scrollToBottom, scrollToTop, isAtBottom, isAtTop })","[isAtBottom, isAtTop]","() => {\n const root = scrollRef.current\n const topEl = topSentinelRef.current\n const bottomEl = bottomSentinelRef.current\n if (!root || !topEl || !bottomEl) return\n\n const topObserver = new IntersectionObserver(\n ([entry]) => setIsAtTop(entry?.isIntersecting ?? true),\n { root },\n )\n const bottomObserver = new IntersectionObserver(\n ([entry]) => setIsAtBottom(entry?.isIntersecting ?? true),\n { root },\n )\n topObserver.observe(topEl)\n bottomObserver.observe(bottomEl)\n return () => {\n topObserver.disconnect()\n bottomObserver.disconnect()\n }\n }","[]","[entry]","entry","() => {\n if (!autoScroll) return\n const root = scrollRef.current\n if (!root) return\n\n // We can't watch `children` to detect new content: tool traces and\n // `useTypewriter` live inside child components and update via local\n // state, so they mutate the DOM without re-rendering `ChatContent`.\n // MutationObserver picks up every DOM change regardless of source.\n let prevScrollHeight = root.scrollHeight\n let rafId: number | null = null\n\n const check = () => {\n rafId = null\n const newScrollHeight = root.scrollHeight\n if (newScrollHeight > prevScrollHeight) {\n const growth = newScrollHeight - prevScrollHeight\n // If the distance from the bottom doesn't exceed the amount the\n // content just grew (plus a small slack), the user was at the\n // bottom *before* the growth — scroll them to the new bottom.\n // Otherwise they've scrolled up to read history and we leave them\n // alone.\n const distanceFromBottom =\n newScrollHeight - root.scrollTop - root.clientHeight\n if (distanceFromBottom <= growth + AUTO_SCROLL_THRESHOLD) {\n root.scrollTo({ top: newScrollHeight, behavior: 'smooth' })\n }\n }\n prevScrollHeight = newScrollHeight\n }\n\n const mo = new MutationObserver(() => {\n // Plain `?? =` rather than `??=`: the React Compiler can't yet lower\n // logical-assignment operators, and bailing out would drop memoization\n // for this scroll container (which re-renders on every message).\n rafId = rafId ?? requestAnimationFrame(check)\n })\n mo.observe(root, {\n childList: true,\n subtree: true,\n characterData: true,\n })\n return () => {\n mo.disconnect()\n if (rafId !== null) cancelAnimationFrame(rafId)\n }\n }","[autoScroll]","root","({ palette }) =>\n isAtTop ? 'transparent' : palette.divider","{ palette }","({ palette }) =>\n isAtBottom ? 'transparent' : palette.divider","palette","{\n ...styles.content,\n borderTopColor: ({ palette }) =>\n isAtTop ? 'transparent' : palette.divider,\n borderBottomColor: ({ palette }) =>\n isAtBottom ? 'transparent' : palette.divider,\n ...sx,\n }","<Box ref={topSentinelRef} sx={styles.sentinel} aria-hidden />","<Box ref={bottomSentinelRef} sx={styles.sentinel} aria-hidden />","{\n ...styles.jumpToLatest,\n opacity: isAtBottom ? 0 : 1,\n pointerEvents: isAtBottom ? 'none' : 'auto',\n }","isAtBottom ? 0 : 1","isAtBottom ? 'none' : 'auto'","<KeyboardArrowDown />","<Box sx={styles.jumpToLatestWrapper}>\n <Fab\n size='small'\n onClick={scrollToBottom}\n aria-label={labels.jumpToLatest ?? 'Jump to latest'}\n sx={{\n ...styles.jumpToLatest,\n opacity: isAtBottom ? 0 : 1,\n pointerEvents: isAtBottom ? 'none' : 'auto',\n }}\n >\n <KeyboardArrowDown />\n </Fab>\n </Box>","labels.jumpToLatest ?? 'Jump to latest'","<Box\n ref={scrollRef}\n sx={{\n ...styles.content,\n borderTopColor: ({ palette }) =>\n isAtTop ? 'transparent' : palette.divider,\n borderBottomColor: ({ palette }) =>\n isAtBottom ? 'transparent' : palette.divider,\n ...sx,\n }}\n >\n <Box ref={topSentinelRef} sx={styles.sentinel} aria-hidden />\n {children}\n <Box ref={bottomSentinelRef} sx={styles.sentinel} aria-hidden />\n <Box sx={styles.jumpToLatestWrapper}>\n <Fab\n size='small'\n onClick={scrollToBottom}\n aria-label={labels.jumpToLatest ?? 'Jump to latest'}\n sx={{\n ...styles.jumpToLatest,\n opacity: isAtBottom ? 0 : 1,\n pointerEvents: isAtBottom ? 'none' : 'auto',\n }}\n >\n <KeyboardArrowDown />\n </Fab>\n </Box>\n </Box>","{\n leftSlot,\n title,\n rightSlot,\n onClose,\n sx,\n}: ChatHeaderProps","{ ...styles.header, ...sx }","<Typography variant='subtitle2' sx={styles.headerTitle}>\n {title}\n </Typography>","onClose && (\n <IconButton size='medium' onClick={onClose} aria-label='Close'>\n <Close />\n </IconButton>\n )","<Box sx={styles.headerActions}>\n {rightSlot}\n {onClose && (\n <IconButton size='medium' onClick={onClose} aria-label='Close'>\n <Close />\n </IconButton>\n )}\n </Box>","<Box sx={{ ...styles.header, ...sx }}>\n {leftSlot}\n <Typography variant='subtitle2' sx={styles.headerTitle}>\n {title}\n </Typography>\n <Box sx={styles.headerActions}>\n {rightSlot}\n {onClose && (\n <IconButton size='medium' onClick={onClose} aria-label='Close'>\n <Close />\n </IconButton>\n )}\n </Box>\n </Box>","{\n value,\n onChange,\n onSend,\n onStop,\n isGenerating = false,\n disabled = false,\n placeholder = 'Type a message...',\n labels = {},\n caption = DEFAULT_CAPTION,\n models,\n selectedModel,\n onModelChange,\n startToolbarSlot,\n endToolbarSlot,\n sx,\n}: ChatFooterProps","isGenerating = false","disabled = false","placeholder = 'Type a message...'","labels = {}","caption = DEFAULT_CAPTION","value.trim() && !disabled && !isGenerating","models?.find((m) => m.value === selectedModel)?.label ??\n (selectedModel && selectedModel.length > 0 ? selectedModel : modelLabel)","models?.find","(e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n if (canSend) {\n onSend()\n }\n }\n }","isGenerating && onStop ? (\n <IconButton\n size='small'\n onClick={onStop}\n disabled={disabled}\n aria-label={labels.stop ?? 'Stop'}\n >\n <StopCircleOutlined />\n </IconButton>\n ) : (\n <IconButton\n size='small'\n variant='contained'\n color='primary'\n onClick={onSend}\n disabled={!canSend}\n aria-label={labels.send ?? 'Send'}\n >\n <ArrowUpwardOutlined />\n </IconButton>\n )","send","stop","{ ...styles.footerWrapper, ...sx }","(e) => onChange(e.target.value)","e","<InputBase\n multiline\n minRows={1}\n maxRows={8}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled || isGenerating}\n sx={styles.footerInput}\n />","disabled || isGenerating","hasSlots && (\n <Box sx={styles.footerSlots}>\n {startToolbarSlot}\n {showModelSelector && (\n <>\n <Button\n size='small'\n variant='text'\n color='inherit'\n disabled={disabled || isGenerating}\n onClick={(e) => setModelAnchor(e.currentTarget)}\n aria-label={modelLabel}\n aria-haspopup='menu'\n aria-expanded={modelAnchor ? 'true' : undefined}\n endIcon={<KeyboardArrowDown />}\n sx={styles.modelSelector}\n >\n <Typography\n variant='caption'\n component='span'\n sx={[\n {\n color: 'inherit',\n },\n styles.modelSelectorLabel,\n ]}\n >\n {selectedLabel}\n </Typography>\n </Button>\n <Menu\n anchorEl={modelAnchor}\n open={Boolean(modelAnchor)}\n onClose={() => setModelAnchor(null)}\n variant='menu'\n elevation={8}\n anchorOrigin={{ vertical: 'top', horizontal: 'left' }}\n transformOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n {models?.map((m) => (\n <MenuItem\n key={m.value}\n selected={m.value === selectedModel}\n onClick={() => {\n onModelChange?.(m.value)\n setModelAnchor(null)\n }}\n >\n {m.label}\n </MenuItem>\n ))}\n </Menu>\n </>\n )}\n {endToolbarSlot}\n </Box>\n )","models?.map","m","<Box sx={styles.footerMain}>\n <InputBase\n multiline\n minRows={1}\n maxRows={8}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled || isGenerating}\n sx={styles.footerInput}\n />\n {hasSlots && (\n <Box sx={styles.footerSlots}>\n {startToolbarSlot}\n {showModelSelector && (\n <>\n <Button\n size='small'\n variant='text'\n color='inherit'\n disabled={disabled || isGenerating}\n onClick={(e) => setModelAnchor(e.currentTarget)}\n aria-label={modelLabel}\n aria-haspopup='menu'\n aria-expanded={modelAnchor ? 'true' : undefined}\n endIcon={<KeyboardArrowDown />}\n sx={styles.modelSelector}\n >\n <Typography\n variant='caption'\n component='span'\n sx={[\n {\n color: 'inherit',\n },\n styles.modelSelectorLabel,\n ]}\n >\n {selectedLabel}\n </Typography>\n </Button>\n <Menu\n anchorEl={modelAnchor}\n open={Boolean(modelAnchor)}\n onClose={() => setModelAnchor(null)}\n variant='menu'\n elevation={8}\n anchorOrigin={{ vertical: 'top', horizontal: 'left' }}\n transformOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n {models?.map((m) => (\n <MenuItem\n key={m.value}\n selected={m.value === selectedModel}\n onClick={() => {\n onModelChange?.(m.value)\n setModelAnchor(null)\n }}\n >\n {m.label}\n </MenuItem>\n ))}\n </Menu>\n </>\n )}\n {endToolbarSlot}\n </Box>\n )}\n </Box>","<Box sx={styles.footerSend}>{sendButton}</Box>","<Box sx={styles.footerBox}>\n <Box sx={styles.footerMain}>\n <InputBase\n multiline\n minRows={1}\n maxRows={8}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled || isGenerating}\n sx={styles.footerInput}\n />\n {hasSlots && (\n <Box sx={styles.footerSlots}>\n {startToolbarSlot}\n {showModelSelector && (\n <>\n <Button\n size='small'\n variant='text'\n color='inherit'\n disabled={disabled || isGenerating}\n onClick={(e) => setModelAnchor(e.currentTarget)}\n aria-label={modelLabel}\n aria-haspopup='menu'\n aria-expanded={modelAnchor ? 'true' : undefined}\n endIcon={<KeyboardArrowDown />}\n sx={styles.modelSelector}\n >\n <Typography\n variant='caption'\n component='span'\n sx={[\n {\n color: 'inherit',\n },\n styles.modelSelectorLabel,\n ]}\n >\n {selectedLabel}\n </Typography>\n </Button>\n <Menu\n anchorEl={modelAnchor}\n open={Boolean(modelAnchor)}\n onClose={() => setModelAnchor(null)}\n variant='menu'\n elevation={8}\n anchorOrigin={{ vertical: 'top', horizontal: 'left' }}\n transformOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n {models?.map((m) => (\n <MenuItem\n key={m.value}\n selected={m.value === selectedModel}\n onClick={() => {\n onModelChange?.(m.value)\n setModelAnchor(null)\n }}\n >\n {m.label}\n </MenuItem>\n ))}\n </Menu>\n </>\n )}\n {endToolbarSlot}\n </Box>\n )}\n </Box>\n <Box sx={styles.footerSend}>{sendButton}</Box>\n </Box>","caption ? (\n <FormHelperText sx={styles.footerCaption}>{caption}</FormHelperText>\n ) : null","<FormControl fullWidth sx={{ ...styles.footerWrapper, ...sx }}>\n {/* Two grid areas: [input + slots] | [send button, aligned to the end]. */}\n <Box sx={styles.footerBox}>\n <Box sx={styles.footerMain}>\n <InputBase\n multiline\n minRows={1}\n maxRows={8}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled || isGenerating}\n sx={styles.footerInput}\n />\n {hasSlots && (\n <Box sx={styles.footerSlots}>\n {startToolbarSlot}\n {showModelSelector && (\n <>\n <Button\n size='small'\n variant='text'\n color='inherit'\n disabled={disabled || isGenerating}\n onClick={(e) => setModelAnchor(e.currentTarget)}\n aria-label={modelLabel}\n aria-haspopup='menu'\n aria-expanded={modelAnchor ? 'true' : undefined}\n endIcon={<KeyboardArrowDown />}\n sx={styles.modelSelector}\n >\n <Typography\n variant='caption'\n component='span'\n sx={[\n {\n color: 'inherit',\n },\n styles.modelSelectorLabel,\n ]}\n >\n {selectedLabel}\n </Typography>\n </Button>\n <Menu\n anchorEl={modelAnchor}\n open={Boolean(modelAnchor)}\n onClose={() => setModelAnchor(null)}\n variant='menu'\n elevation={8}\n anchorOrigin={{ vertical: 'top', horizontal: 'left' }}\n transformOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n {models?.map((m) => (\n <MenuItem\n key={m.value}\n selected={m.value === selectedModel}\n onClick={() => {\n onModelChange?.(m.value)\n setModelAnchor(null)\n }}\n >\n {m.label}\n </MenuItem>\n ))}\n </Menu>\n </>\n )}\n {endToolbarSlot}\n </Box>\n )}\n </Box>\n <Box sx={styles.footerSend}>{sendButton}</Box>\n </Box>\n {caption ? (\n <FormHelperText sx={styles.footerCaption}>{caption}</FormHelperText>\n ) : null}\n </FormControl>","{\n icon,\n title,\n description,\n items,\n size = 'small',\n onSelect,\n sx,\n}: ChatStarterProps","size = 'small'","Box","{\n ...styles.starterItems,\n gap: size === 'small' ? 1 : 2,\n ...(items.length > 2 ? styles.starterItemsTwoCol : undefined),\n }","fullItems.map((item, i) => (\n <ChatSuggestionButton\n key={i}\n label={item.label}\n onClick={() => onSelect?.(item.label)}\n backgroundColor={item.backgroundColor}\n />\n ))","{\n ...styles.starter,\n gap: size === 'small' ? 1 : 2,\n ...sx,\n }","icon","title && (\n <Typography variant={size === 'small' ? 'h6' : 'h5'}>\n {title}\n </Typography>\n )","description && (\n <Typography\n variant={size === 'small' ? 'body2' : 'body1'}\n sx={{\n color: 'text.secondary',\n }}\n >\n {description}\n </Typography>\n )","(item, index) => {\n if (typeof item === 'string') {\n return {\n label: item,\n backgroundColor: DEFAULT_PALETTE[index],\n }\n } else {\n return {\n label: item.label,\n backgroundColor: item.backgroundColor ?? DEFAULT_PALETTE[index],\n }\n }\n }","size === 'small' ? 1 : 2","items.length > 2 ? styles.starterItemsTwoCol : undefined","(item, i) => (\n <ChatSuggestionButton\n key={i}\n label={item.label}\n onClick={() => onSelect?.(item.label)}\n backgroundColor={item.backgroundColor}\n />\n )","item","<Box\n sx={{\n ...styles.starterItems,\n gap: size === 'small' ? 1 : 2,\n ...(items.length > 2 ? styles.starterItemsTwoCol : undefined),\n }}\n >\n {fullItems.map((item, i) => (\n <ChatSuggestionButton\n key={i}\n label={item.label}\n onClick={() => onSelect?.(item.label)}\n backgroundColor={item.backgroundColor}\n />\n ))}\n </Box>","<Box\n sx={{\n ...styles.starter,\n gap: size === 'small' ? 1 : 2,\n ...sx,\n }}\n >\n {icon}\n {title && (\n <Typography variant={size === 'small' ? 'h6' : 'h5'}>\n {title}\n </Typography>\n )}\n {description && (\n <Typography\n variant={size === 'small' ? 'body2' : 'body1'}\n sx={{\n color: 'text.secondary',\n }}\n >\n {description}\n </Typography>\n )}\n <Box\n sx={{\n ...styles.starterItems,\n gap: size === 'small' ? 1 : 2,\n ...(items.length > 2 ? styles.starterItemsTwoCol : undefined),\n }}\n >\n {fullItems.map((item, i) => (\n <ChatSuggestionButton\n key={i}\n label={item.label}\n onClick={() => onSelect?.(item.label)}\n backgroundColor={item.backgroundColor}\n />\n ))}\n </Box>\n </Box>","{\n rating,\n onRatingChange,\n labels = {},\n}: ChatRatingActionProps","labels = {}","() => onRatingChange?.(rating === 'up' ? null : 'up')","rating === 'up' ? (\n <ThumbUp fontSize='small' />\n ) : (\n <ThumbUpOutlined fontSize='small' />\n )","<IconButton\n size='small'\n onClick={() => onRatingChange?.(rating === 'up' ? null : 'up')}\n aria-label={labels.thumbUp ?? 'Thumbs up'}\n color={rating === 'up' ? 'primary' : undefined}\n >\n {rating === 'up' ? (\n <ThumbUp fontSize='small' />\n ) : (\n <ThumbUpOutlined fontSize='small' />\n )}\n </IconButton>","labels.thumbUp ?? 'Thumbs up'","rating === 'up' ? 'primary' : undefined","() => onRatingChange?.(rating === 'down' ? null : 'down')","rating === 'down' ? (\n <ThumbDown fontSize='small' />\n ) : (\n <ThumbDownOutlined fontSize='small' />\n )","<IconButton\n size='small'\n onClick={() => onRatingChange?.(rating === 'down' ? null : 'down')}\n aria-label={labels.thumbDown ?? 'Thumbs down'}\n color={rating === 'down' ? 'primary' : undefined}\n >\n {rating === 'down' ? (\n <ThumbDown fontSize='small' />\n ) : (\n <ThumbDownOutlined fontSize='small' />\n )}\n </IconButton>","rating === 'down' ? 'primary' : undefined","labels.thumbDown ?? 'Thumbs down'","<>\n <IconButton\n size='small'\n onClick={() => onRatingChange?.(rating === 'up' ? null : 'up')}\n aria-label={labels.thumbUp ?? 'Thumbs up'}\n color={rating === 'up' ? 'primary' : undefined}\n >\n {rating === 'up' ? (\n <ThumbUp fontSize='small' />\n ) : (\n <ThumbUpOutlined fontSize='small' />\n )}\n </IconButton>\n <IconButton\n size='small'\n onClick={() => onRatingChange?.(rating === 'down' ? null : 'down')}\n aria-label={labels.thumbDown ?? 'Thumbs down'}\n color={rating === 'down' ? 'primary' : undefined}\n >\n {rating === 'down' ? (\n <ThumbDown fontSize='small' />\n ) : (\n <ThumbDownOutlined fontSize='small' />\n )}\n </IconButton>\n </>","{\n open,\n onClose,\n title,\n content,\n}: ChatToolFullViewDialogProps","content.split('\\n').map((line) => tokenizeLine(line))","(line) => tokenizeLine(line)","useMemo(\n () => content.split('\\n').map((line) => tokenizeLine(line)),\n [content],\n )","{\n paper: { sx: styles.fullViewPaper },\n }","{ display: 'flex', alignItems: 'center', gap: 0.5 }","<CopyButton copyText={content} aria-label='Copy content' />","<Close />","<IconButton onClick={onClose} aria-label='close'>\n <Close />\n </IconButton>","<Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <CopyButton copyText={content} aria-label='Copy content' />\n <IconButton onClick={onClose} aria-label='close'>\n <Close />\n </IconButton>\n </Box>","<DialogTitle sx={styles.fullViewTitle}>\n {title}\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <CopyButton copyText={content} aria-label='Copy content' />\n <IconButton onClick={onClose} aria-label='close'>\n <Close />\n </IconButton>\n </Box>\n </DialogTitle>","tokenizedLines.map((tokens, i) => (\n <Box component='span' key={i} sx={styles.fullViewLine}>\n {tokens.map((token, j) =>\n typeof token === 'string' ? (\n token\n ) : (\n <Box\n component='span'\n key={j}\n sx={\n styles[`syntaxToken_${token.type}` as keyof typeof styles]\n }\n >\n {token.value}\n </Box>\n ),\n )}\n {'\\n'}\n </Box>\n ))","(tokens, i) => (\n <Box component='span' key={i} sx={styles.fullViewLine}>\n {tokens.map((token, j) =>\n typeof token === 'string' ? (\n token\n ) : (\n <Box\n component='span'\n key={j}\n sx={\n styles[`syntaxToken_${token.type}` as keyof typeof styles]\n }\n >\n {token.value}\n </Box>\n ),\n )}\n {'\\n'}\n </Box>\n )","<DialogContent sx={styles.fullViewDialogContent}>\n <Box component='pre' sx={styles.fullViewPre}>\n {tokenizedLines.map((tokens, i) => (\n <Box component='span' key={i} sx={styles.fullViewLine}>\n {tokens.map((token, j) =>\n typeof token === 'string' ? (\n token\n ) : (\n <Box\n component='span'\n key={j}\n sx={\n styles[`syntaxToken_${token.type}` as keyof typeof styles]\n }\n >\n {token.value}\n </Box>\n ),\n )}\n {'\\n'}\n </Box>\n ))}\n </Box>\n </DialogContent>","<Dialog\n open={open}\n onClose={onClose}\n sx={styles.fullViewDialog}\n fullScreen\n slotProps={{\n paper: { sx: styles.fullViewPaper },\n }}\n >\n <DialogTitle sx={styles.fullViewTitle}>\n {title}\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <CopyButton copyText={content} aria-label='Copy content' />\n <IconButton onClick={onClose} aria-label='close'>\n <Close />\n </IconButton>\n </Box>\n </DialogTitle>\n <DialogContent sx={styles.fullViewDialogContent}>\n <Box component='pre' sx={styles.fullViewPre}>\n {tokenizedLines.map((tokens, i) => (\n <Box component='span' key={i} sx={styles.fullViewLine}>\n {tokens.map((token, j) =>\n typeof token === 'string' ? (\n token\n ) : (\n <Box\n component='span'\n key={j}\n sx={\n styles[`syntaxToken_${token.type}` as keyof typeof styles]\n }\n >\n {token.value}\n </Box>\n ),\n )}\n {'\\n'}\n </Box>\n ))}\n </Box>\n </DialogContent>\n </Dialog>","(token, j) =>\n typeof token === 'string' ? (\n token\n ) : (\n <Box\n component='span'\n key={j}\n sx={\n styles[`syntaxToken_${token.type}` as keyof typeof styles]\n }\n >\n {token.value}\n </Box>\n )","{\n content,\n title = '',\n isError = false,\n labels = {},\n sx,\n}: ChatToolCodeAreaProps","title = ''","isError = false","labels = {}","() => {\n const el = preRef.current\n if (el) {\n setIsOverflowing(el.scrollHeight > el.clientHeight)\n }\n }","useCallback(() => {\n const el = preRef.current\n if (el) {\n setIsOverflowing(el.scrollHeight > el.clientHeight)\n }\n }, [])","() => {\n checkOverflow()\n const el = preRef.current\n if (!el) return\n\n const observer = new ResizeObserver(checkOverflow)\n observer.observe(el)\n return () => observer.disconnect()\n }","el","[checkOverflow, content]","{ ...styles.codeArea, ...sx }","isError ? styles.codeAreaPreError : {}","{\n ...styles.codeAreaPre,\n maxHeight: CHAT_TOOL_CODE_AREA_MAX_HEIGHT,\n ...(isError ? styles.codeAreaPreError : {}),\n }","<Box\n component='pre'\n ref={preRef}\n sx={{\n ...styles.codeAreaPre,\n maxHeight: CHAT_TOOL_CODE_AREA_MAX_HEIGHT,\n ...(isError ? styles.codeAreaPreError : {}),\n }}\n >\n {content}\n </Box>","isOverflowing && (\n <Tooltip title={fullViewLabel}>\n <IconButton\n size='small'\n onClick={() => setDialogOpen(true)}\n sx={styles.codeAreaFullViewButton}\n >\n <OpenDiagonallyRight />\n </IconButton>\n </Tooltip>\n )","() => setDialogOpen(false)","<ChatToolFullViewDialog\n open={dialogOpen}\n onClose={() => setDialogOpen(false)}\n title={title}\n content={content}\n />","<Box sx={{ ...styles.codeArea, ...sx }}>\n <Box\n component='pre'\n ref={preRef}\n sx={{\n ...styles.codeAreaPre,\n maxHeight: CHAT_TOOL_CODE_AREA_MAX_HEIGHT,\n ...(isError ? styles.codeAreaPreError : {}),\n }}\n >\n {content}\n </Box>\n {isOverflowing && (\n <Tooltip title={fullViewLabel}>\n <IconButton\n size='small'\n onClick={() => setDialogOpen(true)}\n sx={styles.codeAreaFullViewButton}\n >\n <OpenDiagonallyRight />\n </IconButton>\n </Tooltip>\n )}\n <ChatToolFullViewDialog\n open={dialogOpen}\n onClose={() => setDialogOpen(false)}\n title={title}\n content={content}\n />\n </Box>","{\n status,\n labels,\n}: {\n status: string\n labels: ChatToolTraceProps['labels']\n}","{ display: 'flex', alignItems: 'center', gap: 0.5 }","<CheckCircle sx={{ fontSize: 12 }} color='success' />","<Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <CheckCircle sx={{ fontSize: 12 }} color='success' />\n <Typography variant='caption'>\n {labels?.success ?? 'Success'}\n </Typography>\n </Box>","labels?.success ?? 'Success'","<Error sx={{ fontSize: 12 }} color='error' />","<Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <Error sx={{ fontSize: 12 }} color='error' />\n <Typography variant='code3'>{labels?.error ?? 'Error'}</Typography>\n </Box>","labels?.error ?? 'Error'","<CircularProgress size={14} />","{\n tool,\n labels = {},\n}: Pick<ChatToolTraceProps, 'tool' | 'labels'>","labels = {}","tool.reference && (\n <Box sx={styles.traceField}>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceFieldLabel,\n ]}\n >\n {referenceLabel}\n </Typography>\n <Box sx={styles.traceReference}>\n <McpTool color='success' />\n <Typography\n variant='code3'\n sx={{\n fontWeight: 600,\n }}\n >\n {tool.reference}\n </Typography>\n </Box>\n </Box>\n )","reference","tool.duration != null && (\n <Box sx={styles.traceField}>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceFieldLabel,\n ]}\n >\n {durationLabel}\n </Typography>\n <Typography variant='code3'>{tool.duration}s</Typography>\n </Box>\n )","duration","[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceFieldLabel,\n ]","<Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceFieldLabel,\n ]}\n >\n {statusLabel}\n </Typography>","<TraceStatusIndicator status={tool.status} labels={labels} />","status","<Box sx={styles.traceField}>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceFieldLabel,\n ]}\n >\n {statusLabel}\n </Typography>\n <TraceStatusIndicator status={tool.status} labels={labels} />\n </Box>","tool.inputArguments && (\n <Box>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceField,\n ]}\n >\n {inputArgumentsLabel}\n </Typography>\n <ChatToolCodeArea\n sx={{ mt: 0.5, mb: tool.output ? 1.5 : 0 }}\n content={tool.inputArguments}\n title={`${toolExecutedLabel}: ${inputArgumentsLabel}`}\n isError={isError}\n />\n </Box>\n )","inputArguments","output","tool.output && (\n <Box>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceField,\n ]}\n >\n {outputLabel}\n </Typography>\n <ChatToolCodeArea\n sx={{ mt: 0.5 }}\n content={tool.output}\n title={`${toolExecutedLabel}: ${outputLabel}`}\n isError={isError}\n />\n </Box>\n )","<Box>\n {tool.reference && (\n <Box sx={styles.traceField}>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceFieldLabel,\n ]}\n >\n {referenceLabel}\n </Typography>\n <Box sx={styles.traceReference}>\n <McpTool color='success' />\n <Typography\n variant='code3'\n sx={{\n fontWeight: 600,\n }}\n >\n {tool.reference}\n </Typography>\n </Box>\n </Box>\n )}\n\n {tool.duration != null && (\n <Box sx={styles.traceField}>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceFieldLabel,\n ]}\n >\n {durationLabel}\n </Typography>\n <Typography variant='code3'>{tool.duration}s</Typography>\n </Box>\n )}\n\n <Box sx={styles.traceField}>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceFieldLabel,\n ]}\n >\n {statusLabel}\n </Typography>\n <TraceStatusIndicator status={tool.status} labels={labels} />\n </Box>\n\n {tool.inputArguments && (\n <Box>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceField,\n ]}\n >\n {inputArgumentsLabel}\n </Typography>\n <ChatToolCodeArea\n sx={{ mt: 0.5, mb: tool.output ? 1.5 : 0 }}\n content={tool.inputArguments}\n title={`${toolExecutedLabel}: ${inputArgumentsLabel}`}\n isError={isError}\n />\n </Box>\n )}\n\n {tool.output && (\n <Box>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceField,\n ]}\n >\n {outputLabel}\n </Typography>\n <ChatToolCodeArea\n sx={{ mt: 0.5 }}\n content={tool.output}\n title={`${toolExecutedLabel}: ${outputLabel}`}\n isError={isError}\n />\n </Box>\n )}\n </Box>","{\n tool,\n expanded,\n onExpandedChange,\n labels = {},\n sx,\n}: ChatToolTraceProps","getToolLabel(tool)","<ChatThinking>{getToolLabel(tool)}</ChatThinking>","mergeSx(\n {\n width: '100%',\n },\n sx,\n )","() => onExpandedChange?.(!expanded)","{\n fontWeight: 600,\n color: 'text.secondary',\n }","<Typography\n variant='caption'\n sx={{\n fontWeight: 600,\n color: 'text.secondary',\n }}\n >\n {toolExecutedLabel}\n </Typography>","<ArrowRight\n sx={{\n ...styles.traceChevron,\n transform: expanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />","expanded ? 'rotate(90deg)' : 'rotate(0deg)'","<Button\n size='small'\n variant='text'\n onClick={() => onExpandedChange?.(!expanded)}\n aria-expanded={expanded}\n sx={styles.traceHeader}\n >\n <Typography\n variant='caption'\n sx={{\n fontWeight: 600,\n color: 'text.secondary',\n }}\n >\n {toolExecutedLabel}\n </Typography>\n <ArrowRight\n sx={{\n ...styles.traceChevron,\n transform: expanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />\n </Button>","<Box sx={styles.traceDetailsWrapper}>\n <ChatToolTraceDetails tool={tool} labels={labels} />\n </Box>","<Collapse in={expanded} unmountOnExit>\n <Box sx={styles.traceDetailsWrapper}>\n <ChatToolTraceDetails tool={tool} labels={labels} />\n </Box>\n </Collapse>","<Box\n data-tool={tool.name}\n className={`PsChat--tool-trace`}\n sx={mergeSx(\n {\n width: '100%',\n },\n sx,\n )}\n >\n <Button\n size='small'\n variant='text'\n onClick={() => onExpandedChange?.(!expanded)}\n aria-expanded={expanded}\n sx={styles.traceHeader}\n >\n <Typography\n variant='caption'\n sx={{\n fontWeight: 600,\n color: 'text.secondary',\n }}\n >\n {toolExecutedLabel}\n </Typography>\n <ArrowRight\n sx={{\n ...styles.traceChevron,\n transform: expanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />\n </Button>\n <Collapse in={expanded} unmountOnExit>\n <Box sx={styles.traceDetailsWrapper}>\n <ChatToolTraceDetails tool={tool} labels={labels} />\n </Box>\n </Collapse>\n </Box>","name","tool.name","[value, setter]","[_value, _setter]","_expanded = false","_expandedTools = {}","{\n tools,\n expanded: _expanded = false,\n onExpandedChange: _setExpanded,\n expandedTools: _expandedTools = {},\n onToolExpandedChange: _setExpandedTools,\n labels = {},\n sx,\n}: ChatToolGroupProps","labels = {}","tools.filter((t) => t.status === 'error')","(t) => t.status === 'error'","<Box\n className='PsChat--tool-group'\n sx={mergeSx(\n {\n width: '100%',\n },\n sx,\n )}\n >\n <Button\n size='small'\n variant='text'\n onClick={() => setExpanded(!expanded)}\n aria-expanded={expanded}\n sx={{\n ...styles.traceHeader,\n pr: numErrors > 0 ? 0.5 : 0,\n }}\n >\n <Typography\n variant='caption'\n sx={{\n fontWeight: 600,\n color: 'text.secondary',\n }}\n >\n {tools.length} {toolsUsedLabel}\n </Typography>\n <ArrowRight\n sx={{\n ...styles.traceChevron,\n transform: expanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />\n {numErrors > 0 && (\n <Typography variant='code3' sx={styles.errorBadge}>\n {numErrors}\n <ErrorOutlineOutlined sx={{ fontSize: 12 }} color='error' />\n </Typography>\n )}\n </Button>\n <Collapse in={expanded} unmountOnExit>\n <Box\n component='ul'\n sx={{\n ...styles.traceDetailsWrapper,\n p: 0,\n listStyle: 'none',\n }}\n >\n {nonRunningTools.map((tool) => {\n const isExpanded = expandedTools[tool.id] ?? false\n return (\n <Box\n key={tool.id}\n component='li'\n sx={styles.groupListItem}\n aria-expanded={isExpanded}\n >\n <Button\n variant='text'\n color='inherit'\n fullWidth\n onClick={() =>\n setExpandedTools({\n ...expandedTools,\n [tool.id]: !isExpanded,\n })\n }\n aria-expanded={isExpanded}\n sx={styles.groupHeader}\n >\n <Typography\n variant='caption'\n sx={{\n flexGrow: 1,\n flexShrink: 0,\n color: 'text.secondary',\n }}\n >\n {getToolLabel(tool)}\n </Typography>\n {tool.status === 'error' && (\n <Typography\n variant='code3'\n sx={{\n color: 'error.main',\n }}\n >\n {errorLabel}\n </Typography>\n )}\n <ChevronRight\n sx={{\n ...styles.traceChevron,\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />\n </Button>\n <Collapse in={isExpanded} unmountOnExit>\n <Box\n sx={{\n px: 1.5,\n py: 1,\n }}\n >\n <ChatToolTraceDetails tool={tool} labels={labels} />\n </Box>\n </Collapse>\n </Box>\n )\n })}\n </Box>\n </Collapse>\n {runningTools.map((tool) => (\n <ChatToolTrace\n key={tool.id}\n tool={tool}\n labels={labels}\n expanded={expandedTools[tool.id]}\n onExpandedChange={() =>\n setExpandedTools({\n ...expandedTools,\n [tool.id]: !expandedTools[tool.id],\n })\n }\n />\n ))}\n </Box>","labels.toolsUsed","(t) => t.status === 'running'","(t) => t.status !== 'running'","<ChatToolTrace\n tool={tools[0]!}\n expanded={expanded}\n onExpandedChange={setExpanded}\n labels={labels}\n sx={sx}\n />","0","mergeSx(\n {\n width: '100%',\n },\n sx,\n )","() => setExpanded(!expanded)","{\n ...styles.traceHeader,\n pr: numErrors > 0 ? 0.5 : 0,\n }","numErrors > 0 ? 0.5 : 0","{\n fontWeight: 600,\n color: 'text.secondary',\n }","<Typography\n variant='caption'\n sx={{\n fontWeight: 600,\n color: 'text.secondary',\n }}\n >\n {tools.length} {toolsUsedLabel}\n </Typography>","length","<ArrowRight\n sx={{\n ...styles.traceChevron,\n transform: expanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />","expanded ? 'rotate(90deg)' : 'rotate(0deg)'","numErrors > 0 && (\n <Typography variant='code3' sx={styles.errorBadge}>\n {numErrors}\n <ErrorOutlineOutlined sx={{ fontSize: 12 }} color='error' />\n </Typography>\n )","<Button\n size='small'\n variant='text'\n onClick={() => setExpanded(!expanded)}\n aria-expanded={expanded}\n sx={{\n ...styles.traceHeader,\n pr: numErrors > 0 ? 0.5 : 0,\n }}\n >\n <Typography\n variant='caption'\n sx={{\n fontWeight: 600,\n color: 'text.secondary',\n }}\n >\n {tools.length} {toolsUsedLabel}\n </Typography>\n <ArrowRight\n sx={{\n ...styles.traceChevron,\n transform: expanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />\n {numErrors > 0 && (\n <Typography variant='code3' sx={styles.errorBadge}>\n {numErrors}\n <ErrorOutlineOutlined sx={{ fontSize: 12 }} color='error' />\n </Typography>\n )}\n </Button>","{\n ...styles.traceDetailsWrapper,\n p: 0,\n listStyle: 'none',\n }","(tool) => {\n const isExpanded = expandedTools[tool.id] ?? false\n return (\n <Box\n key={tool.id}\n component='li'\n sx={styles.groupListItem}\n aria-expanded={isExpanded}\n >\n <Button\n variant='text'\n color='inherit'\n fullWidth\n onClick={() =>\n setExpandedTools({\n ...expandedTools,\n [tool.id]: !isExpanded,\n })\n }\n aria-expanded={isExpanded}\n sx={styles.groupHeader}\n >\n <Typography\n variant='caption'\n sx={{\n flexGrow: 1,\n flexShrink: 0,\n color: 'text.secondary',\n }}\n >\n {getToolLabel(tool)}\n </Typography>\n {tool.status === 'error' && (\n <Typography\n variant='code3'\n sx={{\n color: 'error.main',\n }}\n >\n {errorLabel}\n </Typography>\n )}\n <ChevronRight\n sx={{\n ...styles.traceChevron,\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />\n </Button>\n <Collapse in={isExpanded} unmountOnExit>\n <Box\n sx={{\n px: 1.5,\n py: 1,\n }}\n >\n <ChatToolTraceDetails tool={tool} labels={labels} />\n </Box>\n </Collapse>\n </Box>\n )\n }","<Box\n component='ul'\n sx={{\n ...styles.traceDetailsWrapper,\n p: 0,\n listStyle: 'none',\n }}\n >\n {nonRunningTools.map((tool) => {\n const isExpanded = expandedTools[tool.id] ?? false\n return (\n <Box\n key={tool.id}\n component='li'\n sx={styles.groupListItem}\n aria-expanded={isExpanded}\n >\n <Button\n variant='text'\n color='inherit'\n fullWidth\n onClick={() =>\n setExpandedTools({\n ...expandedTools,\n [tool.id]: !isExpanded,\n })\n }\n aria-expanded={isExpanded}\n sx={styles.groupHeader}\n >\n <Typography\n variant='caption'\n sx={{\n flexGrow: 1,\n flexShrink: 0,\n color: 'text.secondary',\n }}\n >\n {getToolLabel(tool)}\n </Typography>\n {tool.status === 'error' && (\n <Typography\n variant='code3'\n sx={{\n color: 'error.main',\n }}\n >\n {errorLabel}\n </Typography>\n )}\n <ChevronRight\n sx={{\n ...styles.traceChevron,\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />\n </Button>\n <Collapse in={isExpanded} unmountOnExit>\n <Box\n sx={{\n px: 1.5,\n py: 1,\n }}\n >\n <ChatToolTraceDetails tool={tool} labels={labels} />\n </Box>\n </Collapse>\n </Box>\n )\n })}\n </Box>","Box","'ul'","nonRunningTools.map((tool) => {\n const isExpanded = expandedTools[tool.id] ?? false\n return (\n <Box\n key={tool.id}\n component='li'\n sx={styles.groupListItem}\n aria-expanded={isExpanded}\n >\n <Button\n variant='text'\n color='inherit'\n fullWidth\n onClick={() =>\n setExpandedTools({\n ...expandedTools,\n [tool.id]: !isExpanded,\n })\n }\n aria-expanded={isExpanded}\n sx={styles.groupHeader}\n >\n <Typography\n variant='caption'\n sx={{\n flexGrow: 1,\n flexShrink: 0,\n color: 'text.secondary',\n }}\n >\n {getToolLabel(tool)}\n </Typography>\n {tool.status === 'error' && (\n <Typography\n variant='code3'\n sx={{\n color: 'error.main',\n }}\n >\n {errorLabel}\n </Typography>\n )}\n <ChevronRight\n sx={{\n ...styles.traceChevron,\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />\n </Button>\n <Collapse in={isExpanded} unmountOnExit>\n <Box\n sx={{\n px: 1.5,\n py: 1,\n }}\n >\n <ChatToolTraceDetails tool={tool} labels={labels} />\n </Box>\n </Collapse>\n </Box>\n )\n })","<Collapse in={expanded} unmountOnExit>\n <Box\n component='ul'\n sx={{\n ...styles.traceDetailsWrapper,\n p: 0,\n listStyle: 'none',\n }}\n >\n {nonRunningTools.map((tool) => {\n const isExpanded = expandedTools[tool.id] ?? false\n return (\n <Box\n key={tool.id}\n component='li'\n sx={styles.groupListItem}\n aria-expanded={isExpanded}\n >\n <Button\n variant='text'\n color='inherit'\n fullWidth\n onClick={() =>\n setExpandedTools({\n ...expandedTools,\n [tool.id]: !isExpanded,\n })\n }\n aria-expanded={isExpanded}\n sx={styles.groupHeader}\n >\n <Typography\n variant='caption'\n sx={{\n flexGrow: 1,\n flexShrink: 0,\n color: 'text.secondary',\n }}\n >\n {getToolLabel(tool)}\n </Typography>\n {tool.status === 'error' && (\n <Typography\n variant='code3'\n sx={{\n color: 'error.main',\n }}\n >\n {errorLabel}\n </Typography>\n )}\n <ChevronRight\n sx={{\n ...styles.traceChevron,\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />\n </Button>\n <Collapse in={isExpanded} unmountOnExit>\n <Box\n sx={{\n px: 1.5,\n py: 1,\n }}\n >\n <ChatToolTraceDetails tool={tool} labels={labels} />\n </Box>\n </Collapse>\n </Box>\n )\n })}\n </Box>\n </Collapse>","Collapse","expanded","unmountOnExit","(tool) => (\n <ChatToolTrace\n key={tool.id}\n tool={tool}\n labels={labels}\n expanded={expandedTools[tool.id]}\n onExpandedChange={() =>\n setExpandedTools({\n ...expandedTools,\n [tool.id]: !expandedTools[tool.id],\n })\n }\n />\n )","tool","t"],"sources":["../src/chat/const.ts","../src/chat/use-typewriter.ts","../src/chat/bubbles/styles.ts","../src/chat/bubbles/chat-user-message.tsx","../src/chat/bubbles/chat-agent-message.tsx","../src/chat/bubbles/chat-agent-message-markdown.tsx","../src/chat/bubbles/chat-error-message.tsx","../src/chat/bubbles/chat-suggestion-button.tsx","../src/chat/feedback/styles.ts","../src/chat/feedback/chat-thinking.tsx","../src/chat/feedback/chat-loader.tsx","../src/chat/containers/styles.ts","../src/chat/containers/chat-content.tsx","../src/chat/containers/chat-header.tsx","../src/chat/containers/chat-footer.tsx","../src/chat/containers/chat-starter.tsx","../src/chat/feedback/chat-actions-container.tsx","../src/chat/feedback/chat-rating-action.tsx","../src/chat/feedback/chat-tool-full-view-dialog.tsx","../src/chat/feedback/chat-tool-code-area.tsx","../src/chat/feedback/get-tool-label.ts","../src/chat/feedback/chat-tool-trace.tsx","../src/chat/feedback/chat-tool-group.tsx"],"sourcesContent":["export const CHAT_MAX_WIDTH = 768\nexport const CHAT_SCROLL_DELAY = 300\nexport const CHAT_DIVIDER_DELAY = 100\nexport const CHAT_TOOL_CODE_AREA_MAX_HEIGHT = 126\n","import { useEffect, useRef, useState } from 'react'\n\ninterface UseTypewriterOptions {\n /** Characters revealed per second (default: `500`). */\n speed?: number\n /** When true, reveal the full text immediately (and snap to it if it grows). */\n skipAnimation?: boolean\n}\n\ninterface UseTypewriterResult {\n /** The portion of `fullText` revealed so far. */\n displayedText: string\n /** `true` while characters are still being revealed. */\n isTyping: boolean\n}\n\n/**\n * Reveals a string character-by-character at a steady rate via\n * `requestAnimationFrame`. Designed for bursty, streamed agent text: as\n * `fullText` grows the reveal keeps chasing the new end, and flipping\n * `skipAnimation` to `true` (e.g. once generation finishes) snaps to the full\n * text. Pair it with `ChatAgentMessage`.\n *\n * @example\n * ```tsx\n * const { displayedText, isTyping } = useTypewriter(message)\n * return (\n * <ChatAgentMessage>\n * <Markdown>{displayedText}</Markdown>\n * {isTyping ? <Cursor /> : null}\n * </ChatAgentMessage>\n * )\n * ```\n */\nexport function useTypewriter(\n fullText: string,\n options: UseTypewriterOptions = {},\n): UseTypewriterResult {\n const { speed = 500, skipAnimation = false } = options\n\n const [charIndex, setCharIndex] = useState(() =>\n skipAnimation ? fullText.length : 0,\n )\n\n // Mirror of the revealed count, read/written ONLY inside the rAF loop (never\n // during render). This lets the animation effect omit `charIndex` from its\n // deps: were it a dep, the loop would tear down and restart on every revealed\n // frame — resetting its frame timer — and never accumulate the elapsed time\n // needed to advance, which stalls completely while `fullText` is also growing\n // (the streaming case).\n const charRef = useRef(charIndex)\n\n useEffect(() => {\n // When `skipAnimation` is set there's nothing to animate — the full text is\n // shown directly via the derived `displayedText` below (no setState here, so\n // a streamed message snaps to its full text the moment generation finishes,\n // without an extra render or a `set-state-in-effect` cascade).\n if (skipAnimation) return\n\n // Already fully revealed (e.g. text hasn't grown since the last frame).\n if (charRef.current >= fullText.length) return\n\n const msPerChar = 1000 / speed\n let rafId: number\n let lastTime: number | null = null\n\n function tick(timestamp: number) {\n // Plain `?? =` not `??=`: the React Compiler can't lower logical-assignment\n // operators and would bail this hook out of optimization.\n lastTime = lastTime ?? timestamp\n const charsToAdd = Math.floor((timestamp - lastTime) / msPerChar)\n if (charsToAdd > 0) {\n lastTime = timestamp\n const next = Math.min(charRef.current + charsToAdd, fullText.length)\n charRef.current = next\n setCharIndex(next)\n if (next >= fullText.length) return // fully revealed — stop the loop\n }\n rafId = requestAnimationFrame(tick)\n }\n\n rafId = requestAnimationFrame(tick)\n return () => cancelAnimationFrame(rafId)\n }, [fullText, speed, skipAnimation])\n\n return {\n displayedText: skipAnimation ? fullText : fullText.slice(0, charIndex),\n isTyping: !skipAnimation && charIndex < fullText.length,\n }\n}\n","import {\n styled,\n Typography,\n type SxProps,\n type Theme,\n type TypographyProps,\n} from '@mui/material'\nimport type { CSSObject } from '@mui/material/styles'\nimport type { FC } from 'react'\n\n// The explicit annotation is what keeps this file's .d.ts emittable: the type\n// `styled()` infers can only be named through a pnpm-internal @mui/system path\n// (TS2742), and vite-plugin-dts drops the whole declaration when that happens.\n//\n// ponytail: `component` and `ref` still typecheck, but the prop re-typing that\n// comes with them does not — `component=\"a\" href=\"#\"` is rejected here and\n// accepted on `Typography` itself. Restoring it needs `OverridableComponent`,\n// which a MUI v5 `styled()` result isn't assignable to under React 19 types.\n// Consumers who need the polymorphism use `Typography` directly.\nexport const ChatMessageOverflow: FC<TypographyProps> = styled(Typography)(\n () => ({\n whiteSpace: 'pre-wrap',\n overflowX: 'clip',\n overflowWrap: 'break-word',\n maxWidth: '100%',\n }),\n)\nChatMessageOverflow.displayName = 'ChatMessageOverflow'\n\nexport const styles = {\n agentMessageContainer: (theme: Theme): CSSObject => ({\n ...theme.typography.body2,\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n // Separate the stacked turn blocks (tools → answer text → actions) per the\n // Figma \"Chat Turn\" spec (gap-8).\n gap: theme.spacing(1),\n paddingRight: theme.spacing(4),\n '& + .PsChat--agent-message': {\n marginTop: theme.spacing(1),\n },\n '& + .PsChat--user-message': {\n marginTop: theme.spacing(3),\n },\n '& > p:first-of-type': {\n marginTop: 0,\n },\n '& table': {\n alignSelf: 'stretch',\n display: 'block',\n overflowX: 'auto',\n maxWidth: '100%',\n borderCollapse: 'collapse',\n margin: theme.spacing(1, 0),\n fontSize: '0.875em',\n },\n '& th, & td': {\n border: `1px solid ${theme.palette.divider}`,\n padding: theme.spacing(0.5, 1),\n textAlign: 'left',\n },\n '& th': {\n backgroundColor: theme.palette.action.hover,\n fontWeight: 600,\n },\n '& tr:nth-of-type(even) td': {\n backgroundColor: theme.palette.action.hover,\n },\n '& ul.contains-task-list': {\n listStyle: 'none',\n paddingLeft: 0,\n },\n '& .task-list-item input[type=\"checkbox\"]': {\n marginRight: theme.spacing(0.5),\n },\n '& del': {\n textDecoration: 'line-through',\n opacity: 0.7,\n },\n '& > ul, & > ol': {\n margin: theme.spacing(1, 0),\n paddingLeft: theme.spacing(3),\n '& > li + li': {\n marginTop: theme.spacing(1),\n },\n },\n }),\n userMessageContainer: {\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-end',\n paddingLeft: ({ spacing }) => spacing(4),\n '&:has(+ .PsChat--user-message) > .PsChat--user-message-inner': {\n borderRadius: ({ spacing }) => spacing(2),\n },\n '& + .PsChat--user-message': {\n marginTop: ({ spacing }) => spacing(0.5),\n },\n '& + .PsChat--agent-message': {\n marginTop: ({ spacing }) => spacing(3),\n },\n },\n userMessage: {\n padding: ({ spacing }) => spacing(0.75, 1.5),\n borderRadius: ({ spacing }) => spacing(2, 2, 0.25, 2),\n border: ({ palette }) => `1px solid ${palette.divider}`,\n backgroundColor: ({ palette }) => palette.background.paper,\n color: ({ palette }) => palette.text.primary,\n width: 'fit-content',\n },\n muted: {\n color: ({ palette }) => palette.text.disabled,\n },\n userMessageTop: {\n textAlign: 'right',\n marginBottom: ({ spacing }) => spacing(0.5),\n },\n errorMessage: {\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: ({ spacing }) => spacing(1),\n },\n errorActions: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(0.5),\n },\n errorAction: {\n color: ({ palette }) => palette.text.primary,\n },\n errorActionSeparator: {\n mr: 0.5,\n color: ({ palette }) => palette.black[25],\n fontWeight: 600,\n },\n suggestionButton: {\n transition: 'border-color 0.2s',\n width: '100%',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n textAlign: 'left',\n gap: ({ spacing }) => spacing(1),\n padding: ({ spacing }) => spacing(0.75, 1.5),\n borderRadius: ({ spacing }) => spacing(2),\n border: ({ palette }) => `1px solid ${palette.divider}`,\n '& .MuiSvgIcon-root': {\n transition: 'color 0.2s',\n color: 'inherit',\n fontSize: ({ spacing }) => spacing(1.5),\n width: ({ spacing }) => spacing(1.5),\n minWidth: ({ spacing }) => spacing(1.5),\n height: ({ spacing }) => spacing(2.5),\n },\n '&:not(.Mui-disabled) .MuiSvgIcon-root': {\n color: ({ palette }) => palette.text.secondary,\n },\n '&:hover': {\n borderColor: ({ palette }) => palette.text.hint,\n '& .MuiSvgIcon-root': {\n color: ({ palette }) => palette.text.primary,\n },\n },\n '&.Mui-disabled': {\n color: ({ palette }) => palette.text.disabled,\n },\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { Box } from '@mui/material'\nimport type { ChatUserMessageProps } from '../types'\nimport { ChatMessageOverflow, styles } from './styles'\n\nexport function ChatUserMessage({\n children,\n muted = false,\n topContext,\n sx,\n}: ChatUserMessageProps) {\n return (\n <Box className='PsChat--user-message' sx={styles.userMessageContainer}>\n {topContext && <Box sx={styles.userMessageTop}>{topContext}</Box>}\n <ChatMessageOverflow\n className='PsChat--user-message-inner'\n variant='body2'\n sx={{\n ...styles.userMessage,\n ...(muted ? styles.muted : undefined),\n ...sx,\n }}\n >\n {children}\n </ChatMessageOverflow>\n </Box>\n )\n}\n","import { forwardRef } from 'react'\nimport { Box, styled, type BoxProps } from '@mui/material'\nimport type { ChatAgentMessageProps } from '../types'\nimport { styles } from './styles'\n\nconst InnerBox = ({ className, ...props }: BoxProps) => (\n <Box className={`PsChat--agent-message ${className ?? ''}`} {...props} />\n)\n\nconst StyledAgentMessage = styled(InnerBox)(({ theme }) =>\n styles.agentMessageContainer(theme),\n)\n\n/**\n * Agent reply bubble. A styles container that positions the reply and its\n * composed pieces (text, loaders, tool traces, …); it renders `children`\n * verbatim and forwards its `ref` to the underlying element. For Markdown\n * replies, compose `ChatAgentMessageMarkdown` instead of teaching this\n * container about the markdown engine.\n */\nexport const ChatAgentMessage = forwardRef<\n HTMLDivElement,\n ChatAgentMessageProps\n>(function ChatAgentMessage({ children, ...props }, ref) {\n return (\n <StyledAgentMessage ref={ref} {...props}>\n {children}\n </StyledAgentMessage>\n )\n})\nChatAgentMessage.displayName = 'ChatAgentMessage'\n","import { lazy, Suspense } from 'react'\nimport { ChatAgentMessage } from './chat-agent-message'\nimport type { ChatAgentMessageMarkdownProps } from '../types'\n\n// Lazy-loaded so the markdown engine (`react-markdown` + remark/rehype plugins)\n// stays in a separate async chunk: consumers only pay its bundle cost when they\n// actually import this component. The Suspense fallback renders the raw text\n// until the chunk resolves.\nconst MarkdownContent = lazy(() =>\n import('../../widgets/markdown/markdown-content').then((m) => ({\n default: m.MarkdownContent,\n })),\n)\n\n/**\n * Agent reply bubble that renders its (string) children as GitHub-Flavored\n * Markdown through the library's sanitized renderer — raw HTML is skipped and\n * images are stripped, since the content is model output; tables / task lists /\n * strikethrough pick up the bubble's element styling. Composition over\n * `ChatAgentMessage`, which stays a plain styles container.\n */\nexport function ChatAgentMessageMarkdown({\n children,\n ...props\n}: ChatAgentMessageMarkdownProps) {\n return (\n <ChatAgentMessage {...props}>\n <Suspense fallback={children}>\n <MarkdownContent content={children} gfm />\n </Suspense>\n </ChatAgentMessage>\n )\n}\nChatAgentMessageMarkdown.displayName = 'ChatAgentMessageMarkdown'\n","import { Box, Link, Typography } from '@mui/material'\nimport { ErrorOutlineOutlined } from '@mui/icons-material'\nimport type { ChatErrorMessageProps } from '../types'\nimport { styles } from './styles'\n\nexport function ChatErrorMessage({\n errors,\n icon,\n actions,\n sx,\n}: ChatErrorMessageProps) {\n return (\n <Box sx={{ ...styles.errorMessage, ...sx }}>\n {icon ?? <ErrorOutlineOutlined fontSize='medium' color='error' />}\n {errors.map((error, index) => (\n <Typography\n key={index}\n variant='subtitle2'\n sx={{\n color: 'error.relatedDark',\n }}\n >\n {error}\n </Typography>\n ))}\n {actions?.length ? (\n <Box sx={styles.errorActions}>\n {(actions ?? []).map((action, index) => (\n <span key={index}>\n {index > 0 && (\n <Typography\n component='span'\n variant='body2'\n sx={styles.errorActionSeparator}\n >\n ·\n </Typography>\n )}\n <Link\n component='button'\n variant='body2'\n onClick={action.onClick}\n sx={styles.errorAction}\n >\n {action.label}\n </Link>\n </span>\n ))}\n </Box>\n ) : null}\n </Box>\n )\n}\n","import { ButtonBase, Typography } from '@mui/material'\nimport { ArrowUpward } from '@mui/icons-material'\nimport type { ChatSuggestionButtonProps } from '../types'\nimport { styles } from './styles'\n\nexport function ChatSuggestionButton({\n label,\n backgroundColor,\n sx,\n ...props\n}: ChatSuggestionButtonProps) {\n return (\n <ButtonBase\n sx={{\n ...styles.suggestionButton,\n ...(backgroundColor ? { backgroundColor } : undefined),\n ...sx,\n }}\n {...props}\n >\n <Typography\n variant='body2'\n sx={{\n color: 'inherit',\n }}\n >\n {label}\n </Typography>\n <ArrowUpward />\n </ButtonBase>\n )\n}\n","import { type SxProps, type Theme } from '@mui/material'\nimport { keyframes } from '@mui/material/styles'\n\nconst shimmer = keyframes`\n 0% {\n background-position: 150% 0;\n }\n 100% {\n background-position: -50% 0;\n }\n`\n\nconst breatheOuter = keyframes`\n 0% { transform: scale(0.68); opacity: 0.7; }\n 40% { transform: scale(1); opacity: 1; }\n 80% { transform: scale(0.6); opacity: 0.65; }\n 100% { transform: scale(0.68); opacity: 0.7; }\n`\n\nconst breatheInner = keyframes`\n 0% { transform: scale(1); }\n 40% { transform: scale(0.75); }\n 80% { transform: scale(1.125); }\n 100% { transform: scale(1); }\n`\n\nexport const styles = {\n thinking: {\n display: 'flex',\n alignItems: 'center',\n minHeight: ({ spacing }) => spacing(3),\n background: ({ palette }) => `linear-gradient(\n 90deg,\n ${palette.text.disabled} 25%,\n ${palette.text.secondary} 50%,\n ${palette.text.disabled} 75%\n )`,\n backgroundSize: '200% 100%',\n backgroundClip: 'text',\n WebkitBackgroundClip: 'text',\n WebkitTextFillColor: 'transparent',\n animation: `${shimmer} 2s ease-in-out infinite`,\n animationDuration: '2s',\n },\n loader: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n position: 'relative',\n p: 1,\n },\n loaderOuterCircle: {\n position: 'absolute',\n inset: 0,\n margin: 'auto',\n borderRadius: '50%',\n backgroundColor: ({ palette }) => palette.action.disabled,\n animation: `${breatheOuter} 1s ease-in-out infinite`,\n },\n loaderInnerCircle: {\n position: 'absolute',\n inset: 0,\n margin: 'auto',\n borderRadius: '50%',\n backgroundColor: ({ palette }) => palette.text.primary,\n animation: `${breatheInner} 1s ease-in-out infinite`,\n },\n // --- Tool Trace styles ---\n traceHeader: {\n display: 'flex',\n alignItems: 'center',\n padding: 0,\n paddingLeft: ({ spacing }) => spacing(0.5),\n borderRadius: ({ spacing }) => spacing(0.5),\n width: 'fit-content',\n color: ({ palette }) => palette.text.secondary,\n '&:hover': {\n backgroundColor: ({ palette }) => palette.action.hover,\n },\n },\n traceChevron: {\n color: ({ palette }) => palette.text.secondary,\n transition: 'transform 0.2s',\n },\n traceDetailsWrapper: {\n marginTop: ({ spacing }) => spacing(0.5),\n padding: ({ spacing }) => spacing(1.5),\n border: '1px solid',\n borderColor: 'divider',\n borderRadius: ({ spacing }) => spacing(1),\n },\n traceField: {\n display: 'flex',\n alignItems: 'flex-start',\n gap: ({ spacing }) => spacing(1),\n },\n traceFieldLabel: {\n flexShrink: 0,\n },\n traceReference: {\n display: 'flex',\n borderRadius: ({ spacing }) => spacing(0.25),\n padding: ({ spacing }) => spacing(0, 0.5),\n gap: ({ spacing }) => spacing(0.5),\n backgroundColor: ({ palette }) => palette.success.relatedLight,\n color: ({ palette }) => palette.success.dark,\n },\n traceStatusSuccess: {\n color: ({ palette }) => palette.success.main,\n },\n traceStatusError: {\n color: ({ palette }) => palette.error.main,\n },\n // --- Code Area styles ---\n codeArea: {\n position: 'relative',\n width: '100%',\n },\n codeAreaPre: {\n margin: 0,\n padding: ({ spacing }) => spacing(1),\n borderRadius: ({ spacing }) => spacing(0.5),\n backgroundColor: ({ palette }) => palette.background.default,\n fontFamily: ({ typography }): string =>\n typography.code3?.fontFamily ??\n typography.code1?.fontFamily ??\n 'monospace',\n fontSize: ({ typography }): string | number =>\n typography.code3?.fontSize ?? '0.75rem',\n lineHeight: ({ typography }): string | number =>\n typography.code3?.lineHeight ?? 1.333,\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n overflowY: 'auto',\n },\n codeAreaPreError: {\n borderLeft: ({ palette }) => `3px solid ${palette.error.main}`,\n backgroundColor: ({ palette }) => `${palette.error.main}08`,\n },\n codeAreaFullViewButton: {\n position: 'absolute',\n top: ({ spacing }) => spacing(0.5),\n right: ({ spacing }) => spacing(0.5),\n },\n // --- Full View Dialog styles ---\n fullViewDialog: {\n margin: ({ spacing }) => spacing(5),\n },\n fullViewPaper: {\n borderRadius: 1,\n },\n fullViewTitle: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: ({ spacing }) => spacing(2),\n borderBottom: '1px solid',\n borderBottomColor: 'divider',\n },\n fullViewDialogContent: {\n padding: 0,\n '&:first-of-type': { paddingTop: 0 },\n },\n fullViewPre: {\n margin: 0,\n padding: ({ spacing }) => spacing(1),\n background: ({ palette, spacing }) =>\n `linear-gradient(to right, ${palette.action.hover} calc(${spacing(1)} + 3em), ${palette.background.default} calc(${spacing(1)} + 3em))`,\n fontFamily: ({ typography }): string =>\n typography.code3?.fontFamily ??\n typography.code1?.fontFamily ??\n 'monospace',\n fontSize: ({ typography }): string | number =>\n typography.code3?.fontSize ?? '0.75rem',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n lineHeight: 1.6,\n counterReset: 'line',\n },\n fullViewLine: {\n display: 'block',\n '&::before': {\n counterIncrement: 'line',\n content: 'counter(line)',\n display: 'inline-block',\n width: '2em',\n marginRight: '2em',\n textAlign: 'right',\n color: ({ palette }) => palette.text.secondary,\n userSelect: 'none',\n },\n },\n groupHeader: {\n textAlign: 'left',\n display: 'flex',\n alignItems: 'center',\n borderRadius: 0,\n gap: ({ spacing }) => spacing(0.5),\n },\n errorBadge: {\n color: ({ palette }) => palette.error.main,\n fontWeight: 600,\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(0.25),\n },\n // --- Syntax highlighting token styles ---\n syntaxToken_key: {\n color: '#881280',\n },\n syntaxToken_string: {\n color: '#c41a16',\n },\n syntaxToken_number: {\n color: '#1c00cf',\n },\n syntaxToken_boolean: {\n color: '#1c00cf',\n },\n syntaxToken_null: {\n color: '#808080',\n },\n syntaxToken_punctuation: {\n color: ({ palette }) => palette.text.primary,\n },\n groupListItem: {\n borderBottom: '1px solid',\n borderColor: 'divider',\n '&:first-of-type .MuiButton-root': {\n borderRadius: ({ spacing }) => spacing(1, 1, 0, 0),\n },\n '&:last-of-type:not([aria-expanded=true]) .MuiButton-root': {\n borderRadius: ({ spacing }) => spacing(0, 0, 1, 1),\n },\n '&:last-of-type': {\n borderBottomWidth: 0,\n },\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { Typography } from '@mui/material'\nimport type { ChatThinkingProps } from '../types'\nimport { styles } from './styles'\n\nexport function ChatThinking({\n children = 'Thinking...',\n duration = 2000,\n sx,\n}: ChatThinkingProps) {\n const durSeconds = `${duration / 1000}s`\n return (\n <Typography\n variant='body2'\n sx={{\n ...styles.thinking,\n animationDuration: durSeconds,\n ...sx,\n }}\n >\n {children}\n </Typography>\n )\n}\n","import { Box } from '@mui/material'\nimport type { ChatLoaderProps } from '../types'\nimport { styles } from './styles'\n\nexport function ChatLoader({ size = 24, labels = {}, sx }: ChatLoaderProps) {\n return (\n <Box\n role='status'\n aria-busy={true}\n aria-label={labels.loading ?? 'Loading'}\n sx={{ ...styles.loader, width: size, height: size, ...sx }}\n >\n <Box\n component='span'\n sx={{\n ...styles.loaderOuterCircle,\n width: size * 0.75,\n height: size * 0.75,\n }}\n />\n <Box\n component='span'\n sx={{\n ...styles.loaderInnerCircle,\n width: size * 0.32,\n height: size * 0.32,\n }}\n />\n </Box>\n )\n}\n","import type { SxProps, Theme } from '@mui/material'\nimport { CHAT_MAX_WIDTH } from '../const'\n\nexport const styles = {\n header: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: ({ spacing }) => spacing(1),\n },\n headerTitle: {\n flexGrow: 1,\n px: ({ spacing }) => spacing(0.5),\n },\n headerActions: {\n display: 'flex',\n alignItems: 'center',\n marginLeft: ({ spacing }) => spacing(2),\n gap: ({ spacing }) => spacing(0.5),\n },\n footerWrapper: {\n padding: ({ spacing }) => spacing(1),\n },\n /**\n * Rounded input box, matching the reference ChatFooter. A two-column grid:\n * main column (input + optional slots) | send button, bottom-aligned so it\n * stays at the end as the input grows. NO vertical padding — the textarea's own\n * padding sets the ~32px single-line height, so the box hugs the input.\n */\n footerBox: {\n maxWidth: CHAT_MAX_WIDTH,\n width: '100%',\n margin: '0 auto',\n display: 'grid',\n gridTemplateColumns: '1fr auto',\n alignItems: 'end',\n columnGap: ({ spacing }) => spacing(0.5),\n backgroundColor: ({ palette }) =>\n palette.default?.background ?? 'rgba(44, 48, 50, 0.04)',\n borderRadius: ({ spacing }) => spacing(0.5),\n paddingInline: ({ spacing }) => spacing(0.5),\n },\n /** Main grid area: input stacked above the (optional) slots row. */\n footerMain: {\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: ({ spacing }) => spacing(0.5),\n },\n /**\n * Send-button grid area, bottom-aligned (matches the reference flex-end row) so\n * the button stays at the bottom as the input grows. The small bottom padding\n * keeps it off the box edge — in the single-line state it reads as vertically\n * centered (4px top / 4px bottom around the 24px button in the 32px row).\n */\n footerSend: {\n alignSelf: 'end',\n paddingBottom: ({ spacing }) => spacing(0.5),\n '& .MuiIconButton-root': {\n padding: ({ spacing }) => spacing(0.5),\n },\n },\n /** The chrome-less multiline input (no underline / no filled affordance). */\n footerInput: {\n width: '100%',\n typography: 'body2',\n // The Meridian theme styles multiline InputBase as a tall \"comment field\"\n // (min-height: 96px on the root, 12px/14px textarea padding). Override both to\n // get the compact chat field: kill the root min-height and use the reference's\n // 6px/10px padding — both need !important to beat the theme override. Height\n // then comes from MUI's TextareaAutosize (minRows=1/maxRows=8): one line\n // (~32px) → grows → scrolls.\n //\n // TextareaAutosize renders a hidden shadow <textarea> (it carries\n // `aria-hidden=\"true\"`, the same class, and an inline `padding: 0`) to measure\n // the content height; MUI then applies that height to the visible input. Getting\n // the compact ~32px single line right needs the two rules below split apart:\n //\n // • Font metrics (size/line-height/letter-spacing) go on BOTH textareas. The\n // shadow measures with its own CSS, so if it isn't pinned to body2 it\n // measures at the default ~24px line-height and the box ends up too tall.\n // • Padding goes on the VISIBLE input ONLY (`:not([aria-hidden])`). A\n // `!important` padding that also hit the shadow would clobber its measurement\n // `padding: 0`, double-counting the padding (~44px instead of 32px).\n //\n // `!important` is required on both to beat the Meridian theme's tall\n // \"comment field\" multiline overrides (12px/14px padding, larger metrics); the\n // root `min-height: 0` kills that theme's 96px min-height.\n minHeight: '0 !important',\n '& textarea': {\n fontSize: ({ typography }) => `${typography.body2.fontSize} !important`,\n lineHeight: ({ typography }) =>\n `${typography.body2.lineHeight} !important`,\n letterSpacing: ({ typography }) =>\n `${typography.body2.letterSpacing} !important`,\n },\n '& textarea:not([aria-hidden])': {\n resize: 'none',\n padding: ({ spacing }) => `${spacing(0.75, 1.25)} !important`,\n },\n },\n /**\n * Slots row under the input: start slot + model selector + end slot. The left\n * padding lines the row's content up with the input text above it: the input\n * text is inset ~12px from the box edge (InputBase root padding + the textarea's\n * 10px left padding) while the model-selector text button only insets ~8px, so a\n * 4px indent here makes the slot label share the placeholder's left edge instead\n * of sitting further out.\n */\n footerSlots: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(0.5),\n minWidth: 0,\n flexWrap: 'wrap',\n paddingLeft: ({ spacing }) => spacing(0.5),\n paddingBottom: ({ spacing }) => spacing(0.5),\n },\n modelSelector: {\n textTransform: 'none',\n color: ({ palette }) => palette.text.secondary,\n maxWidth: '100%',\n minWidth: 0,\n '& .MuiButton-endIcon': {\n marginLeft: ({ spacing }) => spacing(0.25),\n },\n },\n modelSelectorLabel: {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n footerCaption: {\n textAlign: 'center',\n },\n content: {\n overflowY: 'auto',\n flex: 1,\n position: 'relative',\n mx: 'auto',\n maxWidth: CHAT_MAX_WIDTH,\n width: '100%',\n maxHeight: '100%',\n pt: 1,\n pb: 3,\n px: 2,\n display: 'flex',\n flexDirection: 'column',\n borderTopWidth: '1px',\n borderTopStyle: 'solid',\n borderBottomWidth: '1px',\n borderBottomStyle: 'solid',\n },\n sentinel: {\n height: '1px',\n flexShrink: 0,\n },\n jumpToLatestWrapper: {\n position: 'sticky',\n bottom: ({ spacing }) => spacing(3),\n height: 0,\n display: 'flex',\n justifyContent: 'center',\n zIndex: 1,\n },\n jumpToLatest: {\n transition: 'opacity 0.2s',\n },\n starter: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: ({ spacing }) => spacing(3),\n textAlign: 'center',\n maxWidth: CHAT_MAX_WIDTH,\n margin: '0 auto',\n },\n starterItems: {\n display: 'grid',\n width: '100%',\n marginTop: ({ spacing }) => spacing(2),\n },\n starterItemsTwoCol: {\n gridTemplateColumns: 'repeat(2, 1fr)',\n },\n} satisfies Record<string, SxProps<Theme>>\n","import {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react'\nimport { Box, Fab } from '@mui/material'\nimport { KeyboardArrowDown } from '@mui/icons-material'\nimport type { ChatContentProps, ChatContentRef } from '../types'\nimport { styles } from './styles'\n\n/** Slack in px for treating the user as \"at the bottom\" when content grows. */\nconst AUTO_SCROLL_THRESHOLD = 32\n\nexport const ChatContent = forwardRef<ChatContentRef, ChatContentProps>(\n function ChatContent({ children, autoScroll = true, labels = {}, sx }, ref) {\n const scrollRef = useRef<HTMLDivElement>(null)\n const topSentinelRef = useRef<HTMLDivElement>(null)\n const bottomSentinelRef = useRef<HTMLDivElement>(null)\n\n const [isAtTop, setIsAtTop] = useState(true)\n const [isAtBottom, setIsAtBottom] = useState(true)\n\n const scrollToBottom = () => {\n scrollRef.current?.scrollTo({\n top: scrollRef.current.scrollHeight,\n behavior: 'smooth',\n })\n }\n\n const scrollToTop = () => {\n scrollRef.current?.scrollTo({ top: 0, behavior: 'smooth' })\n }\n\n useImperativeHandle(\n ref,\n () => ({ scrollToBottom, scrollToTop, isAtBottom, isAtTop }),\n [isAtBottom, isAtTop],\n )\n\n useEffect(() => {\n const root = scrollRef.current\n const topEl = topSentinelRef.current\n const bottomEl = bottomSentinelRef.current\n if (!root || !topEl || !bottomEl) return\n\n const topObserver = new IntersectionObserver(\n ([entry]) => setIsAtTop(entry?.isIntersecting ?? true),\n { root },\n )\n const bottomObserver = new IntersectionObserver(\n ([entry]) => setIsAtBottom(entry?.isIntersecting ?? true),\n { root },\n )\n topObserver.observe(topEl)\n bottomObserver.observe(bottomEl)\n return () => {\n topObserver.disconnect()\n bottomObserver.disconnect()\n }\n }, [])\n\n useEffect(() => {\n if (!autoScroll) return\n const root = scrollRef.current\n if (!root) return\n\n // We can't watch `children` to detect new content: tool traces and\n // `useTypewriter` live inside child components and update via local\n // state, so they mutate the DOM without re-rendering `ChatContent`.\n // MutationObserver picks up every DOM change regardless of source.\n let prevScrollHeight = root.scrollHeight\n let rafId: number | null = null\n\n const check = () => {\n rafId = null\n const newScrollHeight = root.scrollHeight\n if (newScrollHeight > prevScrollHeight) {\n const growth = newScrollHeight - prevScrollHeight\n // If the distance from the bottom doesn't exceed the amount the\n // content just grew (plus a small slack), the user was at the\n // bottom *before* the growth — scroll them to the new bottom.\n // Otherwise they've scrolled up to read history and we leave them\n // alone.\n const distanceFromBottom =\n newScrollHeight - root.scrollTop - root.clientHeight\n if (distanceFromBottom <= growth + AUTO_SCROLL_THRESHOLD) {\n root.scrollTo({ top: newScrollHeight, behavior: 'smooth' })\n }\n }\n prevScrollHeight = newScrollHeight\n }\n\n const mo = new MutationObserver(() => {\n // Plain `?? =` rather than `??=`: the React Compiler can't yet lower\n // logical-assignment operators, and bailing out would drop memoization\n // for this scroll container (which re-renders on every message).\n rafId = rafId ?? requestAnimationFrame(check)\n })\n mo.observe(root, {\n childList: true,\n subtree: true,\n characterData: true,\n })\n return () => {\n mo.disconnect()\n if (rafId !== null) cancelAnimationFrame(rafId)\n }\n }, [autoScroll])\n\n return (\n <Box\n ref={scrollRef}\n sx={{\n ...styles.content,\n borderTopColor: ({ palette }) =>\n isAtTop ? 'transparent' : palette.divider,\n borderBottomColor: ({ palette }) =>\n isAtBottom ? 'transparent' : palette.divider,\n ...sx,\n }}\n >\n <Box ref={topSentinelRef} sx={styles.sentinel} aria-hidden />\n {children}\n <Box ref={bottomSentinelRef} sx={styles.sentinel} aria-hidden />\n <Box sx={styles.jumpToLatestWrapper}>\n <Fab\n size='small'\n onClick={scrollToBottom}\n aria-label={labels.jumpToLatest ?? 'Jump to latest'}\n sx={{\n ...styles.jumpToLatest,\n opacity: isAtBottom ? 0 : 1,\n pointerEvents: isAtBottom ? 'none' : 'auto',\n }}\n >\n <KeyboardArrowDown />\n </Fab>\n </Box>\n </Box>\n )\n },\n)\nChatContent.displayName = 'ChatContent'\n","import { Box, IconButton, Typography } from '@mui/material'\nimport { Close } from '@mui/icons-material'\nimport type { ChatHeaderProps } from '../types'\nimport { styles } from './styles'\n\nexport function ChatHeader({\n leftSlot,\n title,\n rightSlot,\n onClose,\n sx,\n}: ChatHeaderProps) {\n return (\n <Box sx={{ ...styles.header, ...sx }}>\n {leftSlot}\n <Typography variant='subtitle2' sx={styles.headerTitle}>\n {title}\n </Typography>\n <Box sx={styles.headerActions}>\n {rightSlot}\n {onClose && (\n <IconButton size='medium' onClick={onClose} aria-label='Close'>\n <Close />\n </IconButton>\n )}\n </Box>\n </Box>\n )\n}\n","import { useState } from 'react'\nimport {\n Box,\n Button,\n FormControl,\n FormHelperText,\n IconButton,\n InputBase,\n Menu,\n MenuItem,\n Typography,\n} from '@mui/material'\nimport {\n ArrowUpwardOutlined,\n StopCircleOutlined,\n KeyboardArrowDown,\n} from '@mui/icons-material'\nimport type { ChatFooterProps } from '../types'\nimport { styles } from './styles'\n\nconst DEFAULT_CAPTION =\n 'Responses are AI-generated. Please verify key information.'\n\nexport function ChatFooter({\n value,\n onChange,\n onSend,\n onStop,\n isGenerating = false,\n disabled = false,\n placeholder = 'Type a message...',\n labels = {},\n caption = DEFAULT_CAPTION,\n models,\n selectedModel,\n onModelChange,\n startToolbarSlot,\n endToolbarSlot,\n sx,\n}: ChatFooterProps) {\n const [modelAnchor, setModelAnchor] = useState<HTMLElement | null>(null)\n const canSend = value.trim() && !disabled && !isGenerating\n // Only worth showing when there's an actual choice — a single option is dead UI.\n const showModelSelector = (models?.length ?? 0) > 1\n const modelLabel = labels.model ?? 'Select model'\n // Visible trigger text: the matched option's label, the raw value as a\n // fallback, or the placeholder when nothing is selected yet.\n const selectedLabel =\n models?.find((m) => m.value === selectedModel)?.label ??\n (selectedModel && selectedModel.length > 0 ? selectedModel : modelLabel)\n\n // The slots row (start slot + model selector + end slot) renders under the input\n // only when there's something to show; otherwise the grid is just input | send.\n const hasSlots =\n showModelSelector || Boolean(startToolbarSlot) || Boolean(endToolbarSlot)\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n if (canSend) {\n onSend()\n }\n }\n }\n\n const sendButton =\n isGenerating && onStop ? (\n <IconButton\n size='small'\n onClick={onStop}\n disabled={disabled}\n aria-label={labels.stop ?? 'Stop'}\n >\n <StopCircleOutlined />\n </IconButton>\n ) : (\n <IconButton\n size='small'\n variant='contained'\n color='primary'\n onClick={onSend}\n disabled={!canSend}\n aria-label={labels.send ?? 'Send'}\n >\n <ArrowUpwardOutlined />\n </IconButton>\n )\n\n return (\n <FormControl fullWidth sx={{ ...styles.footerWrapper, ...sx }}>\n {/* Two grid areas: [input + slots] | [send button, aligned to the end]. */}\n <Box sx={styles.footerBox}>\n <Box sx={styles.footerMain}>\n <InputBase\n multiline\n minRows={1}\n maxRows={8}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled || isGenerating}\n sx={styles.footerInput}\n />\n {hasSlots && (\n <Box sx={styles.footerSlots}>\n {startToolbarSlot}\n {showModelSelector && (\n <>\n <Button\n size='small'\n variant='text'\n color='inherit'\n disabled={disabled || isGenerating}\n onClick={(e) => setModelAnchor(e.currentTarget)}\n aria-label={modelLabel}\n aria-haspopup='menu'\n aria-expanded={modelAnchor ? 'true' : undefined}\n endIcon={<KeyboardArrowDown />}\n sx={styles.modelSelector}\n >\n <Typography\n variant='caption'\n component='span'\n sx={[\n {\n color: 'inherit',\n },\n styles.modelSelectorLabel,\n ]}\n >\n {selectedLabel}\n </Typography>\n </Button>\n <Menu\n anchorEl={modelAnchor}\n open={Boolean(modelAnchor)}\n onClose={() => setModelAnchor(null)}\n variant='menu'\n elevation={8}\n anchorOrigin={{ vertical: 'top', horizontal: 'left' }}\n transformOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n {models?.map((m) => (\n <MenuItem\n key={m.value}\n selected={m.value === selectedModel}\n onClick={() => {\n onModelChange?.(m.value)\n setModelAnchor(null)\n }}\n >\n {m.label}\n </MenuItem>\n ))}\n </Menu>\n </>\n )}\n {endToolbarSlot}\n </Box>\n )}\n </Box>\n <Box sx={styles.footerSend}>{sendButton}</Box>\n </Box>\n {caption ? (\n <FormHelperText sx={styles.footerCaption}>{caption}</FormHelperText>\n ) : null}\n </FormControl>\n )\n}\n","import { Box, Typography } from '@mui/material'\nimport type { ChatStarterProps } from '../types'\nimport { ChatSuggestionButton } from '../bubbles/chat-suggestion-button'\nimport { styles } from './styles'\n\nconst DEFAULT_PALETTE = [\n '#C9DB7440', // pastel green\n '#FE88B140', // pastel red\n '#9EB9F340', // pastel blue\n '#F6CF7140', // pastel yellow\n]\n\nexport function ChatStarter({\n icon,\n title,\n description,\n items,\n size = 'small',\n onSelect,\n sx,\n}: ChatStarterProps) {\n const fullItems = items.map((item, index) => {\n if (typeof item === 'string') {\n return {\n label: item,\n backgroundColor: DEFAULT_PALETTE[index],\n }\n } else {\n return {\n label: item.label,\n backgroundColor: item.backgroundColor ?? DEFAULT_PALETTE[index],\n }\n }\n })\n return (\n <Box\n sx={{\n ...styles.starter,\n gap: size === 'small' ? 1 : 2,\n ...sx,\n }}\n >\n {icon}\n {title && (\n <Typography variant={size === 'small' ? 'h6' : 'h5'}>\n {title}\n </Typography>\n )}\n {description && (\n <Typography\n variant={size === 'small' ? 'body2' : 'body1'}\n sx={{\n color: 'text.secondary',\n }}\n >\n {description}\n </Typography>\n )}\n <Box\n sx={{\n ...styles.starterItems,\n gap: size === 'small' ? 1 : 2,\n ...(items.length > 2 ? styles.starterItemsTwoCol : undefined),\n }}\n >\n {fullItems.map((item, i) => (\n <ChatSuggestionButton\n key={i}\n label={item.label}\n onClick={() => onSelect?.(item.label)}\n backgroundColor={item.backgroundColor}\n />\n ))}\n </Box>\n </Box>\n )\n}\n","import { Box, styled, type BoxProps } from '@mui/material'\nimport type { FC } from 'react'\n\n// See chat/bubbles/styles.ts: the annotation keeps the declaration emittable,\n// and what it gives up on `component=`.\nexport const ChatActionsContainer: FC<BoxProps> = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n}))\n","import { IconButton } from '@mui/material'\nimport {\n ThumbUpOutlined,\n ThumbDownOutlined,\n ThumbUp,\n ThumbDown,\n} from '@mui/icons-material'\nimport type { ChatRatingActionProps } from '../types'\n\nexport function ChatRatingAction({\n rating,\n onRatingChange,\n labels = {},\n}: ChatRatingActionProps) {\n return (\n <>\n <IconButton\n size='small'\n onClick={() => onRatingChange?.(rating === 'up' ? null : 'up')}\n aria-label={labels.thumbUp ?? 'Thumbs up'}\n color={rating === 'up' ? 'primary' : undefined}\n >\n {rating === 'up' ? (\n <ThumbUp fontSize='small' />\n ) : (\n <ThumbUpOutlined fontSize='small' />\n )}\n </IconButton>\n <IconButton\n size='small'\n onClick={() => onRatingChange?.(rating === 'down' ? null : 'down')}\n aria-label={labels.thumbDown ?? 'Thumbs down'}\n color={rating === 'down' ? 'primary' : undefined}\n >\n {rating === 'down' ? (\n <ThumbDown fontSize='small' />\n ) : (\n <ThumbDownOutlined fontSize='small' />\n )}\n </IconButton>\n </>\n )\n}\n","import { useMemo } from 'react'\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n IconButton,\n Box,\n} from '@mui/material'\nimport { Close } from '@mui/icons-material'\nimport { CopyButton } from '../../components/copy-button/copy-button'\nimport type { ChatToolFullViewDialogProps } from '../types'\nimport { styles } from './styles'\n\ninterface Token {\n type: 'key' | 'string' | 'number' | 'boolean' | 'null' | 'punctuation'\n value: string\n}\n\nconst NUMBER_START_REGEX = /^-?\\d/\n\nfunction tokenizeLine(line: string): (Token | string)[] {\n const tokens: (Token | string)[] = []\n let lastIndex = 0\n let match: RegExpExecArray | null\n\n // First, find all key positions by looking for \"...\": patterns\n const keyPositions = new Set<number>()\n const keyRegex = /(\"(?:[^\"\\\\]|\\\\.)*\")\\s*:/g\n let keyMatch: RegExpExecArray | null\n while ((keyMatch = keyRegex.exec(line)) !== null) {\n keyPositions.add(keyMatch.index)\n }\n\n const tokenRegex = // eslint-disable-next-line no-useless-escape\n /\"(?:[^\"\\\\]|\\\\.)*\"|\\b(?:true|false)\\b|\\bnull\\b|-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?|[{}\\[\\]:,]/g\n\n while ((match = tokenRegex.exec(line)) !== null) {\n if (match.index > lastIndex) {\n tokens.push(line.slice(lastIndex, match.index))\n }\n const value = match[0]\n if (value.startsWith('\"')) {\n if (keyPositions.has(match.index)) {\n tokens.push({ type: 'key', value })\n } else {\n tokens.push({ type: 'string', value })\n }\n } else if (NUMBER_START_REGEX.test(value)) {\n tokens.push({ type: 'number', value })\n } else if (value === 'true' || value === 'false') {\n tokens.push({ type: 'boolean', value })\n } else if (value === 'null') {\n tokens.push({ type: 'null', value })\n } else {\n tokens.push({ type: 'punctuation', value })\n }\n lastIndex = match.index + value.length\n }\n\n if (lastIndex < line.length) {\n tokens.push(line.slice(lastIndex))\n }\n\n return tokens\n}\n\nexport function ChatToolFullViewDialog({\n open,\n onClose,\n title,\n content,\n}: ChatToolFullViewDialogProps) {\n const tokenizedLines = useMemo(\n () => content.split('\\n').map((line) => tokenizeLine(line)),\n [content],\n )\n\n return (\n <Dialog\n open={open}\n onClose={onClose}\n sx={styles.fullViewDialog}\n fullScreen\n slotProps={{\n paper: { sx: styles.fullViewPaper },\n }}\n >\n <DialogTitle sx={styles.fullViewTitle}>\n {title}\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <CopyButton copyText={content} aria-label='Copy content' />\n <IconButton onClick={onClose} aria-label='close'>\n <Close />\n </IconButton>\n </Box>\n </DialogTitle>\n <DialogContent sx={styles.fullViewDialogContent}>\n <Box component='pre' sx={styles.fullViewPre}>\n {tokenizedLines.map((tokens, i) => (\n <Box component='span' key={i} sx={styles.fullViewLine}>\n {tokens.map((token, j) =>\n typeof token === 'string' ? (\n token\n ) : (\n <Box\n component='span'\n key={j}\n sx={\n styles[`syntaxToken_${token.type}` as keyof typeof styles]\n }\n >\n {token.value}\n </Box>\n ),\n )}\n {'\\n'}\n </Box>\n ))}\n </Box>\n </DialogContent>\n </Dialog>\n )\n}\n","import { useRef, useState, useEffect, useCallback } from 'react'\nimport { Box, IconButton, Tooltip } from '@mui/material'\nimport type { ChatToolCodeAreaProps } from '../types'\nimport { CHAT_TOOL_CODE_AREA_MAX_HEIGHT } from '../const'\nimport { ChatToolFullViewDialog } from './chat-tool-full-view-dialog'\nimport { styles } from './styles'\nimport { OpenDiagonallyRight } from '@carto/meridian-ds/custom-icons'\n\nexport function ChatToolCodeArea({\n content,\n title = '',\n isError = false,\n labels = {},\n sx,\n}: ChatToolCodeAreaProps) {\n const preRef = useRef<HTMLPreElement>(null)\n const [isOverflowing, setIsOverflowing] = useState(false)\n const [dialogOpen, setDialogOpen] = useState(false)\n\n const checkOverflow = useCallback(() => {\n const el = preRef.current\n if (el) {\n setIsOverflowing(el.scrollHeight > el.clientHeight)\n }\n }, [])\n\n useEffect(() => {\n checkOverflow()\n const el = preRef.current\n if (!el) return\n\n const observer = new ResizeObserver(checkOverflow)\n observer.observe(el)\n return () => observer.disconnect()\n }, [checkOverflow, content])\n\n const fullViewLabel = labels.fullView ?? 'Full view'\n\n return (\n <Box sx={{ ...styles.codeArea, ...sx }}>\n <Box\n component='pre'\n ref={preRef}\n sx={{\n ...styles.codeAreaPre,\n maxHeight: CHAT_TOOL_CODE_AREA_MAX_HEIGHT,\n ...(isError ? styles.codeAreaPreError : {}),\n }}\n >\n {content}\n </Box>\n {isOverflowing && (\n <Tooltip title={fullViewLabel}>\n <IconButton\n size='small'\n onClick={() => setDialogOpen(true)}\n sx={styles.codeAreaFullViewButton}\n >\n <OpenDiagonallyRight />\n </IconButton>\n </Tooltip>\n )}\n <ChatToolFullViewDialog\n open={dialogOpen}\n onClose={() => setDialogOpen(false)}\n title={title}\n content={content}\n />\n </Box>\n )\n}\n","import type { ChatToolItem } from '../types'\n\nfunction capitalize(str: string): string {\n const spaced = str.replace(/_/g, ' ')\n return spaced.charAt(0).toUpperCase() + spaced.slice(1)\n}\n\nexport function getToolLabel(tool: ChatToolItem): string {\n if (tool.status === 'running') {\n return tool.runningLabel ?? capitalize(tool.name)\n }\n return tool.label ?? capitalize(tool.name)\n}\n","import {\n Box,\n CircularProgress,\n Typography,\n Collapse,\n Button,\n} from '@mui/material'\nimport { ArrowRight, CheckCircle, Error } from '@mui/icons-material'\nimport type { ChatToolTraceProps } from '../types'\nimport { ChatToolCodeArea } from './chat-tool-code-area'\nimport { styles } from './styles'\nimport { ChatThinking } from './chat-thinking'\nimport { getToolLabel } from './get-tool-label'\nimport { McpTool } from '@carto/meridian-ds/custom-icons'\nimport { mergeSx } from '../../components/lasso-tool/styles'\n\nfunction TraceStatusIndicator({\n status,\n labels,\n}: {\n status: string\n labels: ChatToolTraceProps['labels']\n}) {\n switch (status) {\n case 'complete':\n return (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <CheckCircle sx={{ fontSize: 12 }} color='success' />\n <Typography variant='caption'>\n {labels?.success ?? 'Success'}\n </Typography>\n </Box>\n )\n case 'error':\n return (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <Error sx={{ fontSize: 12 }} color='error' />\n <Typography variant='code3'>{labels?.error ?? 'Error'}</Typography>\n </Box>\n )\n case 'running':\n return <CircularProgress size={14} />\n default:\n return null\n }\n}\n\nexport function ChatToolTraceDetails({\n tool,\n labels = {},\n}: Pick<ChatToolTraceProps, 'tool' | 'labels'>) {\n const isError = tool.status === 'error'\n const toolExecutedLabel = labels.toolExecuted ?? 'Tool executed'\n const referenceLabel = labels.reference ?? 'Reference:'\n const durationLabel = labels.duration ?? 'Duration:'\n const statusLabel = labels.status ?? 'Status:'\n const inputArgumentsLabel = labels.inputArguments ?? 'Input arguments:'\n const outputLabel = labels.output ?? 'Output:'\n\n return (\n <Box>\n {tool.reference && (\n <Box sx={styles.traceField}>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceFieldLabel,\n ]}\n >\n {referenceLabel}\n </Typography>\n <Box sx={styles.traceReference}>\n <McpTool color='success' />\n <Typography\n variant='code3'\n sx={{\n fontWeight: 600,\n }}\n >\n {tool.reference}\n </Typography>\n </Box>\n </Box>\n )}\n\n {tool.duration != null && (\n <Box sx={styles.traceField}>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceFieldLabel,\n ]}\n >\n {durationLabel}\n </Typography>\n <Typography variant='code3'>{tool.duration}s</Typography>\n </Box>\n )}\n\n <Box sx={styles.traceField}>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceFieldLabel,\n ]}\n >\n {statusLabel}\n </Typography>\n <TraceStatusIndicator status={tool.status} labels={labels} />\n </Box>\n\n {tool.inputArguments && (\n <Box>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceField,\n ]}\n >\n {inputArgumentsLabel}\n </Typography>\n <ChatToolCodeArea\n sx={{ mt: 0.5, mb: tool.output ? 1.5 : 0 }}\n content={tool.inputArguments}\n title={`${toolExecutedLabel}: ${inputArgumentsLabel}`}\n isError={isError}\n />\n </Box>\n )}\n\n {tool.output && (\n <Box>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceField,\n ]}\n >\n {outputLabel}\n </Typography>\n <ChatToolCodeArea\n sx={{ mt: 0.5 }}\n content={tool.output}\n title={`${toolExecutedLabel}: ${outputLabel}`}\n isError={isError}\n />\n </Box>\n )}\n </Box>\n )\n}\n\nexport function ChatToolTrace({\n tool,\n expanded,\n onExpandedChange,\n labels = {},\n sx,\n}: ChatToolTraceProps) {\n const isRunning = tool.status === 'running'\n const toolExecutedLabel = labels.toolExecuted ?? 'Tool executed'\n\n if (isRunning) {\n return <ChatThinking>{getToolLabel(tool)}</ChatThinking>\n }\n\n return (\n <Box\n data-tool={tool.name}\n className={`PsChat--tool-trace`}\n sx={mergeSx(\n {\n width: '100%',\n },\n sx,\n )}\n >\n <Button\n size='small'\n variant='text'\n onClick={() => onExpandedChange?.(!expanded)}\n aria-expanded={expanded}\n sx={styles.traceHeader}\n >\n <Typography\n variant='caption'\n sx={{\n fontWeight: 600,\n color: 'text.secondary',\n }}\n >\n {toolExecutedLabel}\n </Typography>\n <ArrowRight\n sx={{\n ...styles.traceChevron,\n transform: expanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />\n </Button>\n <Collapse in={expanded} unmountOnExit>\n <Box sx={styles.traceDetailsWrapper}>\n <ChatToolTraceDetails tool={tool} labels={labels} />\n </Box>\n </Collapse>\n </Box>\n )\n}\n","import { Box, Button, Collapse, Typography } from '@mui/material'\nimport {\n ArrowRight,\n ChevronRight,\n ErrorOutlineOutlined,\n} from '@mui/icons-material'\nimport type { ChatToolGroupProps } from '../types'\nimport { ChatToolTrace, ChatToolTraceDetails } from './chat-tool-trace'\nimport { styles } from './styles'\nimport { getToolLabel } from './get-tool-label'\nimport { useState } from 'react'\nimport { mergeSx } from '../../components/lasso-tool/styles'\n\nfunction useController<T>(value: T, setter?: (value: T) => void) {\n const [_value, _setter] = useState<T>(value)\n if (setter) {\n return [value, setter] as const\n } else {\n return [_value, _setter] as const\n }\n}\n\nexport function ChatToolGroup({\n tools,\n expanded: _expanded = false,\n onExpandedChange: _setExpanded,\n expandedTools: _expandedTools = {},\n onToolExpandedChange: _setExpandedTools,\n labels = {},\n sx,\n}: ChatToolGroupProps) {\n const [expanded, setExpanded] = useController(_expanded, _setExpanded)\n const [expandedTools, setExpandedTools] = useController(\n _expandedTools,\n _setExpandedTools,\n )\n\n const numErrors = tools.filter((t) => t.status === 'error').length\n const runningTools = tools.filter((t) => t.status === 'running')\n const nonRunningTools = tools.filter((t) => t.status !== 'running')\n const toolsUsedLabel = labels.toolsUsed ?? 'tools used'\n const errorLabel = labels.error ?? 'Error'\n\n if (tools.length === 1) {\n return (\n <ChatToolTrace\n tool={tools[0]!}\n expanded={expanded}\n onExpandedChange={setExpanded}\n labels={labels}\n sx={sx}\n />\n )\n }\n\n return (\n <Box\n className='PsChat--tool-group'\n sx={mergeSx(\n {\n width: '100%',\n },\n sx,\n )}\n >\n <Button\n size='small'\n variant='text'\n onClick={() => setExpanded(!expanded)}\n aria-expanded={expanded}\n sx={{\n ...styles.traceHeader,\n pr: numErrors > 0 ? 0.5 : 0,\n }}\n >\n <Typography\n variant='caption'\n sx={{\n fontWeight: 600,\n color: 'text.secondary',\n }}\n >\n {tools.length} {toolsUsedLabel}\n </Typography>\n <ArrowRight\n sx={{\n ...styles.traceChevron,\n transform: expanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />\n {numErrors > 0 && (\n <Typography variant='code3' sx={styles.errorBadge}>\n {numErrors}\n <ErrorOutlineOutlined sx={{ fontSize: 12 }} color='error' />\n </Typography>\n )}\n </Button>\n <Collapse in={expanded} unmountOnExit>\n <Box\n component='ul'\n sx={{\n ...styles.traceDetailsWrapper,\n p: 0,\n listStyle: 'none',\n }}\n >\n {nonRunningTools.map((tool) => {\n const isExpanded = expandedTools[tool.id] ?? false\n return (\n <Box\n key={tool.id}\n component='li'\n sx={styles.groupListItem}\n aria-expanded={isExpanded}\n >\n <Button\n variant='text'\n color='inherit'\n fullWidth\n onClick={() =>\n setExpandedTools({\n ...expandedTools,\n [tool.id]: !isExpanded,\n })\n }\n aria-expanded={isExpanded}\n sx={styles.groupHeader}\n >\n <Typography\n variant='caption'\n sx={{\n flexGrow: 1,\n flexShrink: 0,\n color: 'text.secondary',\n }}\n >\n {getToolLabel(tool)}\n </Typography>\n {tool.status === 'error' && (\n <Typography\n variant='code3'\n sx={{\n color: 'error.main',\n }}\n >\n {errorLabel}\n </Typography>\n )}\n <ChevronRight\n sx={{\n ...styles.traceChevron,\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />\n </Button>\n <Collapse in={isExpanded} unmountOnExit>\n <Box\n sx={{\n px: 1.5,\n py: 1,\n }}\n >\n <ChatToolTraceDetails tool={tool} labels={labels} />\n </Box>\n </Collapse>\n </Box>\n )\n })}\n </Box>\n </Collapse>\n {runningTools.map((tool) => (\n <ChatToolTrace\n key={tool.id}\n tool={tool}\n labels={labels}\n expanded={expandedTools[tool.id]}\n onExpandedChange={() =>\n setExpandedTools({\n ...expandedTools,\n [tool.id]: !expandedTools[tool.id],\n })\n }\n />\n ))}\n </Box>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chat.js","names":["options: UseTypewriterOptions = {}","speed = 500","skipAnimation = false","() =>\n skipAnimation ? fullText.length : 0","fullText.length","() => {\n // When `skipAnimation` is set there's nothing to animate — the full text is\n // shown directly via the derived `displayedText` below (no setState here, so\n // a streamed message snaps to its full text the moment generation finishes,\n // without an extra render or a `set-state-in-effect` cascade).\n if (skipAnimation) return\n\n // Already fully revealed (e.g. text hasn't grown since the last frame).\n if (charRef.current >= fullText.length) return\n\n const msPerChar = 1000 / speed\n let rafId: number\n let lastTime: number | null = null\n\n function tick(timestamp: number) {\n // Plain `?? =` not `??=`: the React Compiler can't lower logical-assignment\n // operators and would bail this hook out of optimization.\n lastTime = lastTime ?? timestamp\n const charsToAdd = Math.floor((timestamp - lastTime) / msPerChar)\n if (charsToAdd > 0) {\n lastTime = timestamp\n const next = Math.min(charRef.current + charsToAdd, fullText.length)\n charRef.current = next\n setCharIndex(next)\n if (next >= fullText.length) return // fully revealed — stop the loop\n }\n rafId = requestAnimationFrame(tick)\n }\n\n rafId = requestAnimationFrame(tick)\n return () => cancelAnimationFrame(rafId)\n }","[fullText, speed, skipAnimation]","skipAnimation ? fullText : fullText.slice(0, charIndex)","{\n displayedText: skipAnimation ? fullText : fullText.slice(0, charIndex),\n isTyping: !skipAnimation && charIndex < fullText.length,\n }","!skipAnimation && charIndex < fullText.length","_c","options","styles","{\n children,\n muted = false,\n topContext,\n sx,\n}: ChatUserMessageProps","muted = false","topContext && <Box sx={styles.userMessageTop}>{topContext}</Box>","{\n ...styles.userMessage,\n ...(muted ? styles.muted : undefined),\n ...sx,\n }","muted ? styles.muted : undefined","<ChatMessageOverflow\n className='PsChat--user-message-inner'\n variant='body2'\n sx={{\n ...styles.userMessage,\n ...(muted ? styles.muted : undefined),\n ...sx,\n }}\n >\n {children}\n </ChatMessageOverflow>","<Box className='PsChat--user-message' sx={styles.userMessageContainer}>\n {topContext && <Box sx={styles.userMessageTop}>{topContext}</Box>}\n <ChatMessageOverflow\n className='PsChat--user-message-inner'\n variant='body2'\n sx={{\n ...styles.userMessage,\n ...(muted ? styles.muted : undefined),\n ...sx,\n }}\n >\n {children}\n </ChatMessageOverflow>\n </Box>","_c","styles","{ className, ...props }: BoxProps","<Box className={`PsChat--agent-message ${className ?? ''}`} {...props} />","`PsChat--agent-message ${className ?? ''}`","{ children, ...props }","<StyledAgentMessage ref={ref} {...props}>\n {children}\n </StyledAgentMessage>","_c","styles","{\n children,\n ...props\n}: ChatAgentMessageMarkdownProps","<MarkdownContent content={children} gfm />","<Suspense fallback={children}>\n <MarkdownContent content={children} gfm />\n </Suspense>","<ChatAgentMessage {...props}>\n <Suspense fallback={children}>\n <MarkdownContent content={children} gfm />\n </Suspense>\n </ChatAgentMessage>","_c","{\n errors,\n icon,\n actions,\n sx,\n}: ChatErrorMessageProps","{ ...styles.errorMessage, ...sx }","icon ?? <ErrorOutlineOutlined fontSize='medium' color='error' />","errors.map((error, index) => (\n <Typography\n key={index}\n variant='subtitle2'\n sx={{\n color: 'error.relatedDark',\n }}\n >\n {error}\n </Typography>\n ))","(error, index) => (\n <Typography\n key={index}\n variant='subtitle2'\n sx={{\n color: 'error.relatedDark',\n }}\n >\n {error}\n </Typography>\n )","actions?.length ? (\n <Box sx={styles.errorActions}>\n {(actions ?? []).map((action, index) => (\n <span key={index}>\n {index > 0 && (\n <Typography\n component='span'\n variant='body2'\n sx={styles.errorActionSeparator}\n >\n ·\n </Typography>\n )}\n <Link\n component='button'\n variant='body2'\n onClick={action.onClick}\n sx={styles.errorAction}\n >\n {action.label}\n </Link>\n </span>\n ))}\n </Box>\n ) : null","(action, index) => (\n <span key={index}>\n {index > 0 && (\n <Typography\n component='span'\n variant='body2'\n sx={styles.errorActionSeparator}\n >\n ·\n </Typography>\n )}\n <Link\n component='button'\n variant='body2'\n onClick={action.onClick}\n sx={styles.errorAction}\n >\n {action.label}\n </Link>\n </span>\n )","actions?.length","<Box sx={{ ...styles.errorMessage, ...sx }}>\n {icon ?? <ErrorOutlineOutlined fontSize='medium' color='error' />}\n {errors.map((error, index) => (\n <Typography\n key={index}\n variant='subtitle2'\n sx={{\n color: 'error.relatedDark',\n }}\n >\n {error}\n </Typography>\n ))}\n {actions?.length ? (\n <Box sx={styles.errorActions}>\n {(actions ?? []).map((action, index) => (\n <span key={index}>\n {index > 0 && (\n <Typography\n component='span'\n variant='body2'\n sx={styles.errorActionSeparator}\n >\n ·\n </Typography>\n )}\n <Link\n component='button'\n variant='body2'\n onClick={action.onClick}\n sx={styles.errorAction}\n >\n {action.label}\n </Link>\n </span>\n ))}\n </Box>\n ) : null}\n </Box>","index","_c","styles","_temp","_temp2","{\n label,\n backgroundColor,\n sx,\n ...props\n}: ChatSuggestionButtonProps","backgroundColor ? { backgroundColor } : undefined","{\n ...styles.suggestionButton,\n ...(backgroundColor ? { backgroundColor } : undefined),\n ...sx,\n }","{\n color: 'inherit',\n }","<Typography\n variant='body2'\n sx={{\n color: 'inherit',\n }}\n >\n {label}\n </Typography>","<ArrowUpward />","<ButtonBase\n sx={{\n ...styles.suggestionButton,\n ...(backgroundColor ? { backgroundColor } : undefined),\n ...sx,\n }}\n {...props}\n >\n <Typography\n variant='body2'\n sx={{\n color: 'inherit',\n }}\n >\n {label}\n </Typography>\n <ArrowUpward />\n </ButtonBase>","_c","styles","styles","{\n children = 'Thinking...',\n duration = 2000,\n sx,\n}: ChatThinkingProps","children = 'Thinking...'","duration = 2000","{\n ...styles.thinking,\n animationDuration: durSeconds,\n ...sx,\n }","<Typography\n variant='body2'\n sx={{\n ...styles.thinking,\n animationDuration: durSeconds,\n ...sx,\n }}\n >\n {children}\n </Typography>","_c","styles","{ size = 24, labels = {}, sx }: ChatLoaderProps","size = 24","labels = {}","{ ...styles.loader, width: size, height: size, ...sx }","<Box\n component='span'\n sx={{\n ...styles.loaderOuterCircle,\n width: size * 0.75,\n height: size * 0.75,\n }}\n />","size * 0.75","<Box\n component='span'\n sx={{\n ...styles.loaderInnerCircle,\n width: size * 0.32,\n height: size * 0.32,\n }}\n />","size * 0.32","<Box\n role='status'\n aria-busy={true}\n aria-label={labels.loading ?? 'Loading'}\n sx={{ ...styles.loader, width: size, height: size, ...sx }}\n >\n <Box\n component='span'\n sx={{\n ...styles.loaderOuterCircle,\n width: size * 0.75,\n height: size * 0.75,\n }}\n />\n <Box\n component='span'\n sx={{\n ...styles.loaderInnerCircle,\n width: size * 0.32,\n height: size * 0.32,\n }}\n />\n </Box>","labels.loading ?? 'Loading'","_c","labels","styles","{ children, autoScroll = true, labels = {}, sx }","autoScroll = true","labels = {}","() => {\n scrollRef.current?.scrollTo({\n top: scrollRef.current.scrollHeight,\n behavior: 'smooth',\n })\n }","() => {\n scrollRef.current?.scrollTo({ top: 0, behavior: 'smooth' })\n }","() => ({ scrollToBottom, scrollToTop, isAtBottom, isAtTop })","[isAtBottom, isAtTop]","() => {\n const root = scrollRef.current\n const topEl = topSentinelRef.current\n const bottomEl = bottomSentinelRef.current\n if (!root || !topEl || !bottomEl) return\n\n const topObserver = new IntersectionObserver(\n ([entry]) => setIsAtTop(entry?.isIntersecting ?? true),\n { root },\n )\n const bottomObserver = new IntersectionObserver(\n ([entry]) => setIsAtBottom(entry?.isIntersecting ?? true),\n { root },\n )\n topObserver.observe(topEl)\n bottomObserver.observe(bottomEl)\n return () => {\n topObserver.disconnect()\n bottomObserver.disconnect()\n }\n }","[]","[entry]","entry","() => {\n if (!autoScroll) return\n const root = scrollRef.current\n if (!root) return\n\n // We can't watch `children` to detect new content: tool traces and\n // `useTypewriter` live inside child components and update via local\n // state, so they mutate the DOM without re-rendering `ChatContent`.\n // MutationObserver picks up every DOM change regardless of source.\n let prevScrollHeight = root.scrollHeight\n let rafId: number | null = null\n\n const check = () => {\n rafId = null\n const newScrollHeight = root.scrollHeight\n if (newScrollHeight > prevScrollHeight) {\n const growth = newScrollHeight - prevScrollHeight\n // If the distance from the bottom doesn't exceed the amount the\n // content just grew (plus a small slack), the user was at the\n // bottom *before* the growth — scroll them to the new bottom.\n // Otherwise they've scrolled up to read history and we leave them\n // alone.\n const distanceFromBottom =\n newScrollHeight - root.scrollTop - root.clientHeight\n if (distanceFromBottom <= growth + AUTO_SCROLL_THRESHOLD) {\n root.scrollTo({ top: newScrollHeight, behavior: 'smooth' })\n }\n }\n prevScrollHeight = newScrollHeight\n }\n\n const mo = new MutationObserver(() => {\n // Plain `?? =` rather than `??=`: the React Compiler can't yet lower\n // logical-assignment operators, and bailing out would drop memoization\n // for this scroll container (which re-renders on every message).\n rafId = rafId ?? requestAnimationFrame(check)\n })\n mo.observe(root, {\n childList: true,\n subtree: true,\n characterData: true,\n })\n return () => {\n mo.disconnect()\n if (rafId !== null) cancelAnimationFrame(rafId)\n }\n }","[autoScroll]","root","({ palette }) =>\n isAtTop ? 'transparent' : palette.divider","{ palette }","({ palette }) =>\n isAtBottom ? 'transparent' : palette.divider","palette","{\n ...styles.content,\n borderTopColor: ({ palette }) =>\n isAtTop ? 'transparent' : palette.divider,\n borderBottomColor: ({ palette }) =>\n isAtBottom ? 'transparent' : palette.divider,\n ...sx,\n }","<Box ref={topSentinelRef} sx={styles.sentinel} aria-hidden />","<Box ref={bottomSentinelRef} sx={styles.sentinel} aria-hidden />","{\n ...styles.jumpToLatest,\n opacity: isAtBottom ? 0 : 1,\n pointerEvents: isAtBottom ? 'none' : 'auto',\n }","isAtBottom ? 0 : 1","isAtBottom ? 'none' : 'auto'","<KeyboardArrowDown />","<Box sx={styles.jumpToLatestWrapper}>\n <Fab\n size='small'\n onClick={scrollToBottom}\n aria-label={labels.jumpToLatest ?? 'Jump to latest'}\n sx={{\n ...styles.jumpToLatest,\n opacity: isAtBottom ? 0 : 1,\n pointerEvents: isAtBottom ? 'none' : 'auto',\n }}\n >\n <KeyboardArrowDown />\n </Fab>\n </Box>","labels.jumpToLatest ?? 'Jump to latest'","<Box\n ref={scrollRef}\n sx={{\n ...styles.content,\n borderTopColor: ({ palette }) =>\n isAtTop ? 'transparent' : palette.divider,\n borderBottomColor: ({ palette }) =>\n isAtBottom ? 'transparent' : palette.divider,\n ...sx,\n }}\n >\n <Box ref={topSentinelRef} sx={styles.sentinel} aria-hidden />\n {children}\n <Box ref={bottomSentinelRef} sx={styles.sentinel} aria-hidden />\n <Box sx={styles.jumpToLatestWrapper}>\n <Fab\n size='small'\n onClick={scrollToBottom}\n aria-label={labels.jumpToLatest ?? 'Jump to latest'}\n sx={{\n ...styles.jumpToLatest,\n opacity: isAtBottom ? 0 : 1,\n pointerEvents: isAtBottom ? 'none' : 'auto',\n }}\n >\n <KeyboardArrowDown />\n </Fab>\n </Box>\n </Box>","_c","{\n leftSlot,\n title,\n rightSlot,\n onClose,\n sx,\n}: ChatHeaderProps","{ ...styles.header, ...sx }","<Typography variant='subtitle2' sx={styles.headerTitle}>\n {title}\n </Typography>","onClose && (\n <IconButton size='medium' onClick={onClose} aria-label='Close'>\n <Close />\n </IconButton>\n )","<Box sx={styles.headerActions}>\n {rightSlot}\n {onClose && (\n <IconButton size='medium' onClick={onClose} aria-label='Close'>\n <Close />\n </IconButton>\n )}\n </Box>","<Box sx={{ ...styles.header, ...sx }}>\n {leftSlot}\n <Typography variant='subtitle2' sx={styles.headerTitle}>\n {title}\n </Typography>\n <Box sx={styles.headerActions}>\n {rightSlot}\n {onClose && (\n <IconButton size='medium' onClick={onClose} aria-label='Close'>\n <Close />\n </IconButton>\n )}\n </Box>\n </Box>","_c","{\n value,\n onChange,\n onSend,\n onStop,\n isGenerating = false,\n disabled = false,\n placeholder = 'Type a message...',\n labels = {},\n caption = DEFAULT_CAPTION,\n models,\n selectedModel,\n onModelChange,\n startToolbarSlot,\n endToolbarSlot,\n sx,\n}: ChatFooterProps","isGenerating = false","disabled = false","placeholder = 'Type a message...'","labels = {}","caption = DEFAULT_CAPTION","value.trim() && !disabled && !isGenerating","models?.find((m) => m.value === selectedModel)?.label ??\n (selectedModel && selectedModel.length > 0 ? selectedModel : modelLabel)","models?.find","(e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n if (canSend) {\n onSend()\n }\n }\n }","isGenerating && onStop ? (\n <IconButton\n size='small'\n onClick={onStop}\n disabled={disabled}\n aria-label={labels.stop ?? 'Stop'}\n >\n <StopCircleOutlined />\n </IconButton>\n ) : (\n <IconButton\n size='small'\n variant='contained'\n color='primary'\n onClick={onSend}\n disabled={!canSend}\n aria-label={labels.send ?? 'Send'}\n >\n <ArrowUpwardOutlined />\n </IconButton>\n )","send","stop","{ ...styles.footerWrapper, ...sx }","(e) => onChange(e.target.value)","e","<InputBase\n multiline\n minRows={1}\n maxRows={8}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled || isGenerating}\n sx={styles.footerInput}\n />","disabled || isGenerating","hasSlots && (\n <Box sx={styles.footerSlots}>\n {startToolbarSlot}\n {showModelSelector && (\n <>\n <Button\n size='small'\n variant='text'\n color='inherit'\n disabled={disabled || isGenerating}\n onClick={(e) => setModelAnchor(e.currentTarget)}\n aria-label={modelLabel}\n aria-haspopup='menu'\n aria-expanded={modelAnchor ? 'true' : undefined}\n endIcon={<KeyboardArrowDown />}\n sx={styles.modelSelector}\n >\n <Typography\n variant='caption'\n component='span'\n sx={[\n {\n color: 'inherit',\n },\n styles.modelSelectorLabel,\n ]}\n >\n {selectedLabel}\n </Typography>\n </Button>\n <Menu\n anchorEl={modelAnchor}\n open={Boolean(modelAnchor)}\n onClose={() => setModelAnchor(null)}\n variant='menu'\n elevation={8}\n anchorOrigin={{ vertical: 'top', horizontal: 'left' }}\n transformOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n {models?.map((m) => (\n <MenuItem\n key={m.value}\n selected={m.value === selectedModel}\n onClick={() => {\n onModelChange?.(m.value)\n setModelAnchor(null)\n }}\n >\n {m.label}\n </MenuItem>\n ))}\n </Menu>\n </>\n )}\n {endToolbarSlot}\n </Box>\n )","models?.map","m","<Box sx={styles.footerMain}>\n <InputBase\n multiline\n minRows={1}\n maxRows={8}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled || isGenerating}\n sx={styles.footerInput}\n />\n {hasSlots && (\n <Box sx={styles.footerSlots}>\n {startToolbarSlot}\n {showModelSelector && (\n <>\n <Button\n size='small'\n variant='text'\n color='inherit'\n disabled={disabled || isGenerating}\n onClick={(e) => setModelAnchor(e.currentTarget)}\n aria-label={modelLabel}\n aria-haspopup='menu'\n aria-expanded={modelAnchor ? 'true' : undefined}\n endIcon={<KeyboardArrowDown />}\n sx={styles.modelSelector}\n >\n <Typography\n variant='caption'\n component='span'\n sx={[\n {\n color: 'inherit',\n },\n styles.modelSelectorLabel,\n ]}\n >\n {selectedLabel}\n </Typography>\n </Button>\n <Menu\n anchorEl={modelAnchor}\n open={Boolean(modelAnchor)}\n onClose={() => setModelAnchor(null)}\n variant='menu'\n elevation={8}\n anchorOrigin={{ vertical: 'top', horizontal: 'left' }}\n transformOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n {models?.map((m) => (\n <MenuItem\n key={m.value}\n selected={m.value === selectedModel}\n onClick={() => {\n onModelChange?.(m.value)\n setModelAnchor(null)\n }}\n >\n {m.label}\n </MenuItem>\n ))}\n </Menu>\n </>\n )}\n {endToolbarSlot}\n </Box>\n )}\n </Box>","<Box sx={styles.footerSend}>{sendButton}</Box>","<Box sx={styles.footerBox}>\n <Box sx={styles.footerMain}>\n <InputBase\n multiline\n minRows={1}\n maxRows={8}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled || isGenerating}\n sx={styles.footerInput}\n />\n {hasSlots && (\n <Box sx={styles.footerSlots}>\n {startToolbarSlot}\n {showModelSelector && (\n <>\n <Button\n size='small'\n variant='text'\n color='inherit'\n disabled={disabled || isGenerating}\n onClick={(e) => setModelAnchor(e.currentTarget)}\n aria-label={modelLabel}\n aria-haspopup='menu'\n aria-expanded={modelAnchor ? 'true' : undefined}\n endIcon={<KeyboardArrowDown />}\n sx={styles.modelSelector}\n >\n <Typography\n variant='caption'\n component='span'\n sx={[\n {\n color: 'inherit',\n },\n styles.modelSelectorLabel,\n ]}\n >\n {selectedLabel}\n </Typography>\n </Button>\n <Menu\n anchorEl={modelAnchor}\n open={Boolean(modelAnchor)}\n onClose={() => setModelAnchor(null)}\n variant='menu'\n elevation={8}\n anchorOrigin={{ vertical: 'top', horizontal: 'left' }}\n transformOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n {models?.map((m) => (\n <MenuItem\n key={m.value}\n selected={m.value === selectedModel}\n onClick={() => {\n onModelChange?.(m.value)\n setModelAnchor(null)\n }}\n >\n {m.label}\n </MenuItem>\n ))}\n </Menu>\n </>\n )}\n {endToolbarSlot}\n </Box>\n )}\n </Box>\n <Box sx={styles.footerSend}>{sendButton}</Box>\n </Box>","caption ? (\n <FormHelperText sx={styles.footerCaption}>{caption}</FormHelperText>\n ) : null","<FormControl fullWidth sx={{ ...styles.footerWrapper, ...sx }}>\n {/* Two grid areas: [input + slots] | [send button, aligned to the end]. */}\n <Box sx={styles.footerBox}>\n <Box sx={styles.footerMain}>\n <InputBase\n multiline\n minRows={1}\n maxRows={8}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled || isGenerating}\n sx={styles.footerInput}\n />\n {hasSlots && (\n <Box sx={styles.footerSlots}>\n {startToolbarSlot}\n {showModelSelector && (\n <>\n <Button\n size='small'\n variant='text'\n color='inherit'\n disabled={disabled || isGenerating}\n onClick={(e) => setModelAnchor(e.currentTarget)}\n aria-label={modelLabel}\n aria-haspopup='menu'\n aria-expanded={modelAnchor ? 'true' : undefined}\n endIcon={<KeyboardArrowDown />}\n sx={styles.modelSelector}\n >\n <Typography\n variant='caption'\n component='span'\n sx={[\n {\n color: 'inherit',\n },\n styles.modelSelectorLabel,\n ]}\n >\n {selectedLabel}\n </Typography>\n </Button>\n <Menu\n anchorEl={modelAnchor}\n open={Boolean(modelAnchor)}\n onClose={() => setModelAnchor(null)}\n variant='menu'\n elevation={8}\n anchorOrigin={{ vertical: 'top', horizontal: 'left' }}\n transformOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n {models?.map((m) => (\n <MenuItem\n key={m.value}\n selected={m.value === selectedModel}\n onClick={() => {\n onModelChange?.(m.value)\n setModelAnchor(null)\n }}\n >\n {m.label}\n </MenuItem>\n ))}\n </Menu>\n </>\n )}\n {endToolbarSlot}\n </Box>\n )}\n </Box>\n <Box sx={styles.footerSend}>{sendButton}</Box>\n </Box>\n {caption ? (\n <FormHelperText sx={styles.footerCaption}>{caption}</FormHelperText>\n ) : null}\n </FormControl>","_c","_Fragment","{\n icon,\n title,\n description,\n items,\n size = 'small',\n onSelect,\n sx,\n}: ChatStarterProps","size = 'small'","Box","{\n ...styles.starterItems,\n gap: size === 'small' ? 1 : 2,\n ...(items.length > 2 ? styles.starterItemsTwoCol : undefined),\n }","fullItems.map((item, i) => (\n <ChatSuggestionButton\n key={i}\n label={item.label}\n onClick={() => onSelect?.(item.label)}\n backgroundColor={item.backgroundColor}\n />\n ))","{\n ...styles.starter,\n gap: size === 'small' ? 1 : 2,\n ...sx,\n }","icon","title && (\n <Typography variant={size === 'small' ? 'h6' : 'h5'}>\n {title}\n </Typography>\n )","description && (\n <Typography\n variant={size === 'small' ? 'body2' : 'body1'}\n sx={{\n color: 'text.secondary',\n }}\n >\n {description}\n </Typography>\n )","(item, index) => {\n if (typeof item === 'string') {\n return {\n label: item,\n backgroundColor: DEFAULT_PALETTE[index],\n }\n } else {\n return {\n label: item.label,\n backgroundColor: item.backgroundColor ?? DEFAULT_PALETTE[index],\n }\n }\n }","size === 'small' ? 1 : 2","items.length > 2 ? styles.starterItemsTwoCol : undefined","(item, i) => (\n <ChatSuggestionButton\n key={i}\n label={item.label}\n onClick={() => onSelect?.(item.label)}\n backgroundColor={item.backgroundColor}\n />\n )","item","<Box\n sx={{\n ...styles.starterItems,\n gap: size === 'small' ? 1 : 2,\n ...(items.length > 2 ? styles.starterItemsTwoCol : undefined),\n }}\n >\n {fullItems.map((item, i) => (\n <ChatSuggestionButton\n key={i}\n label={item.label}\n onClick={() => onSelect?.(item.label)}\n backgroundColor={item.backgroundColor}\n />\n ))}\n </Box>","<Box\n sx={{\n ...styles.starter,\n gap: size === 'small' ? 1 : 2,\n ...sx,\n }}\n >\n {icon}\n {title && (\n <Typography variant={size === 'small' ? 'h6' : 'h5'}>\n {title}\n </Typography>\n )}\n {description && (\n <Typography\n variant={size === 'small' ? 'body2' : 'body1'}\n sx={{\n color: 'text.secondary',\n }}\n >\n {description}\n </Typography>\n )}\n <Box\n sx={{\n ...styles.starterItems,\n gap: size === 'small' ? 1 : 2,\n ...(items.length > 2 ? styles.starterItemsTwoCol : undefined),\n }}\n >\n {fullItems.map((item, i) => (\n <ChatSuggestionButton\n key={i}\n label={item.label}\n onClick={() => onSelect?.(item.label)}\n backgroundColor={item.backgroundColor}\n />\n ))}\n </Box>\n </Box>","_c","_temp","{\n rating,\n onRatingChange,\n labels = {},\n}: ChatRatingActionProps","labels = {}","() => onRatingChange?.(rating === 'up' ? null : 'up')","rating === 'up' ? (\n <ThumbUp fontSize='small' />\n ) : (\n <ThumbUpOutlined fontSize='small' />\n )","<IconButton\n size='small'\n onClick={() => onRatingChange?.(rating === 'up' ? null : 'up')}\n aria-label={labels.thumbUp ?? 'Thumbs up'}\n color={rating === 'up' ? 'primary' : undefined}\n >\n {rating === 'up' ? (\n <ThumbUp fontSize='small' />\n ) : (\n <ThumbUpOutlined fontSize='small' />\n )}\n </IconButton>","labels.thumbUp ?? 'Thumbs up'","rating === 'up' ? 'primary' : undefined","() => onRatingChange?.(rating === 'down' ? null : 'down')","rating === 'down' ? (\n <ThumbDown fontSize='small' />\n ) : (\n <ThumbDownOutlined fontSize='small' />\n )","<IconButton\n size='small'\n onClick={() => onRatingChange?.(rating === 'down' ? null : 'down')}\n aria-label={labels.thumbDown ?? 'Thumbs down'}\n color={rating === 'down' ? 'primary' : undefined}\n >\n {rating === 'down' ? (\n <ThumbDown fontSize='small' />\n ) : (\n <ThumbDownOutlined fontSize='small' />\n )}\n </IconButton>","rating === 'down' ? 'primary' : undefined","labels.thumbDown ?? 'Thumbs down'","<>\n <IconButton\n size='small'\n onClick={() => onRatingChange?.(rating === 'up' ? null : 'up')}\n aria-label={labels.thumbUp ?? 'Thumbs up'}\n color={rating === 'up' ? 'primary' : undefined}\n >\n {rating === 'up' ? (\n <ThumbUp fontSize='small' />\n ) : (\n <ThumbUpOutlined fontSize='small' />\n )}\n </IconButton>\n <IconButton\n size='small'\n onClick={() => onRatingChange?.(rating === 'down' ? null : 'down')}\n aria-label={labels.thumbDown ?? 'Thumbs down'}\n color={rating === 'down' ? 'primary' : undefined}\n >\n {rating === 'down' ? (\n <ThumbDown fontSize='small' />\n ) : (\n <ThumbDownOutlined fontSize='small' />\n )}\n </IconButton>\n </>","_c","_Fragment","{\n open,\n onClose,\n title,\n content,\n}: ChatToolFullViewDialogProps","content.split('\\n').map((line) => tokenizeLine(line))","(line) => tokenizeLine(line)","useMemo(\n () => content.split('\\n').map((line) => tokenizeLine(line)),\n [content],\n )","{\n paper: { sx: styles.fullViewPaper },\n }","{ display: 'flex', alignItems: 'center', gap: 0.5 }","<CopyButton copyText={content} aria-label='Copy content' />","<Close />","<IconButton onClick={onClose} aria-label='close'>\n <Close />\n </IconButton>","<Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <CopyButton copyText={content} aria-label='Copy content' />\n <IconButton onClick={onClose} aria-label='close'>\n <Close />\n </IconButton>\n </Box>","<DialogTitle sx={styles.fullViewTitle}>\n {title}\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <CopyButton copyText={content} aria-label='Copy content' />\n <IconButton onClick={onClose} aria-label='close'>\n <Close />\n </IconButton>\n </Box>\n </DialogTitle>","tokenizedLines.map((tokens, i) => (\n <Box component='span' key={i} sx={styles.fullViewLine}>\n {tokens.map((token, j) =>\n typeof token === 'string' ? (\n token\n ) : (\n <Box\n component='span'\n key={j}\n sx={\n styles[`syntaxToken_${token.type}` as keyof typeof styles]\n }\n >\n {token.value}\n </Box>\n ),\n )}\n {'\\n'}\n </Box>\n ))","(tokens, i) => (\n <Box component='span' key={i} sx={styles.fullViewLine}>\n {tokens.map((token, j) =>\n typeof token === 'string' ? (\n token\n ) : (\n <Box\n component='span'\n key={j}\n sx={\n styles[`syntaxToken_${token.type}` as keyof typeof styles]\n }\n >\n {token.value}\n </Box>\n ),\n )}\n {'\\n'}\n </Box>\n )","<DialogContent sx={styles.fullViewDialogContent}>\n <Box component='pre' sx={styles.fullViewPre}>\n {tokenizedLines.map((tokens, i) => (\n <Box component='span' key={i} sx={styles.fullViewLine}>\n {tokens.map((token, j) =>\n typeof token === 'string' ? (\n token\n ) : (\n <Box\n component='span'\n key={j}\n sx={\n styles[`syntaxToken_${token.type}` as keyof typeof styles]\n }\n >\n {token.value}\n </Box>\n ),\n )}\n {'\\n'}\n </Box>\n ))}\n </Box>\n </DialogContent>","<Dialog\n open={open}\n onClose={onClose}\n sx={styles.fullViewDialog}\n fullScreen\n slotProps={{\n paper: { sx: styles.fullViewPaper },\n }}\n >\n <DialogTitle sx={styles.fullViewTitle}>\n {title}\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <CopyButton copyText={content} aria-label='Copy content' />\n <IconButton onClick={onClose} aria-label='close'>\n <Close />\n </IconButton>\n </Box>\n </DialogTitle>\n <DialogContent sx={styles.fullViewDialogContent}>\n <Box component='pre' sx={styles.fullViewPre}>\n {tokenizedLines.map((tokens, i) => (\n <Box component='span' key={i} sx={styles.fullViewLine}>\n {tokens.map((token, j) =>\n typeof token === 'string' ? (\n token\n ) : (\n <Box\n component='span'\n key={j}\n sx={\n styles[`syntaxToken_${token.type}` as keyof typeof styles]\n }\n >\n {token.value}\n </Box>\n ),\n )}\n {'\\n'}\n </Box>\n ))}\n </Box>\n </DialogContent>\n </Dialog>","(token, j) =>\n typeof token === 'string' ? (\n token\n ) : (\n <Box\n component='span'\n key={j}\n sx={\n styles[`syntaxToken_${token.type}` as keyof typeof styles]\n }\n >\n {token.value}\n </Box>\n )","_c","_temp","styles","_temp3","_temp2","{\n content,\n title = '',\n isError = false,\n labels = {},\n sx,\n}: ChatToolCodeAreaProps","title = ''","isError = false","labels = {}","() => {\n const el = preRef.current\n if (el) {\n setIsOverflowing(el.scrollHeight > el.clientHeight)\n }\n }","useCallback(() => {\n const el = preRef.current\n if (el) {\n setIsOverflowing(el.scrollHeight > el.clientHeight)\n }\n }, [])","() => {\n checkOverflow()\n const el = preRef.current\n if (!el) return\n\n const observer = new ResizeObserver(checkOverflow)\n observer.observe(el)\n return () => observer.disconnect()\n }","el","[checkOverflow, content]","{ ...styles.codeArea, ...sx }","isError ? styles.codeAreaPreError : {}","{\n ...styles.codeAreaPre,\n maxHeight: CHAT_TOOL_CODE_AREA_MAX_HEIGHT,\n ...(isError ? styles.codeAreaPreError : {}),\n }","<Box\n component='pre'\n ref={preRef}\n sx={{\n ...styles.codeAreaPre,\n maxHeight: CHAT_TOOL_CODE_AREA_MAX_HEIGHT,\n ...(isError ? styles.codeAreaPreError : {}),\n }}\n >\n {content}\n </Box>","isOverflowing && (\n <Tooltip title={fullViewLabel}>\n <IconButton\n size='small'\n onClick={() => setDialogOpen(true)}\n sx={styles.codeAreaFullViewButton}\n >\n <OpenDiagonallyRight />\n </IconButton>\n </Tooltip>\n )","() => setDialogOpen(false)","<ChatToolFullViewDialog\n open={dialogOpen}\n onClose={() => setDialogOpen(false)}\n title={title}\n content={content}\n />","<Box sx={{ ...styles.codeArea, ...sx }}>\n <Box\n component='pre'\n ref={preRef}\n sx={{\n ...styles.codeAreaPre,\n maxHeight: CHAT_TOOL_CODE_AREA_MAX_HEIGHT,\n ...(isError ? styles.codeAreaPreError : {}),\n }}\n >\n {content}\n </Box>\n {isOverflowing && (\n <Tooltip title={fullViewLabel}>\n <IconButton\n size='small'\n onClick={() => setDialogOpen(true)}\n sx={styles.codeAreaFullViewButton}\n >\n <OpenDiagonallyRight />\n </IconButton>\n </Tooltip>\n )}\n <ChatToolFullViewDialog\n open={dialogOpen}\n onClose={() => setDialogOpen(false)}\n title={title}\n content={content}\n />\n </Box>","_c","styles","{\n status,\n labels,\n}: {\n status: string\n labels: ChatToolTraceProps['labels']\n}","{ display: 'flex', alignItems: 'center', gap: 0.5 }","<CheckCircle sx={{ fontSize: 12 }} color='success' />","<Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <CheckCircle sx={{ fontSize: 12 }} color='success' />\n <Typography variant='caption'>\n {labels?.success ?? 'Success'}\n </Typography>\n </Box>","labels?.success ?? 'Success'","<Error sx={{ fontSize: 12 }} color='error' />","<Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <Error sx={{ fontSize: 12 }} color='error' />\n <Typography variant='code3'>{labels?.error ?? 'Error'}</Typography>\n </Box>","labels?.error ?? 'Error'","<CircularProgress size={14} />","{\n tool,\n labels = {},\n}: Pick<ChatToolTraceProps, 'tool' | 'labels'>","labels = {}","tool.reference && (\n <Box sx={styles.traceField}>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceFieldLabel,\n ]}\n >\n {referenceLabel}\n </Typography>\n <Box sx={styles.traceReference}>\n <McpTool color='success' />\n <Typography\n variant='code3'\n sx={{\n fontWeight: 600,\n }}\n >\n {tool.reference}\n </Typography>\n </Box>\n </Box>\n )","reference","tool.duration != null && (\n <Box sx={styles.traceField}>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceFieldLabel,\n ]}\n >\n {durationLabel}\n </Typography>\n <Typography variant='code3'>{tool.duration}s</Typography>\n </Box>\n )","duration","[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceFieldLabel,\n ]","<Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceFieldLabel,\n ]}\n >\n {statusLabel}\n </Typography>","<TraceStatusIndicator status={tool.status} labels={labels} />","status","<Box sx={styles.traceField}>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceFieldLabel,\n ]}\n >\n {statusLabel}\n </Typography>\n <TraceStatusIndicator status={tool.status} labels={labels} />\n </Box>","tool.inputArguments && (\n <Box>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceField,\n ]}\n >\n {inputArgumentsLabel}\n </Typography>\n <ChatToolCodeArea\n sx={{ mt: 0.5, mb: tool.output ? 1.5 : 0 }}\n content={tool.inputArguments}\n title={`${toolExecutedLabel}: ${inputArgumentsLabel}`}\n isError={isError}\n />\n </Box>\n )","inputArguments","output","tool.output && (\n <Box>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceField,\n ]}\n >\n {outputLabel}\n </Typography>\n <ChatToolCodeArea\n sx={{ mt: 0.5 }}\n content={tool.output}\n title={`${toolExecutedLabel}: ${outputLabel}`}\n isError={isError}\n />\n </Box>\n )","<Box>\n {tool.reference && (\n <Box sx={styles.traceField}>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceFieldLabel,\n ]}\n >\n {referenceLabel}\n </Typography>\n <Box sx={styles.traceReference}>\n <McpTool color='success' />\n <Typography\n variant='code3'\n sx={{\n fontWeight: 600,\n }}\n >\n {tool.reference}\n </Typography>\n </Box>\n </Box>\n )}\n\n {tool.duration != null && (\n <Box sx={styles.traceField}>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceFieldLabel,\n ]}\n >\n {durationLabel}\n </Typography>\n <Typography variant='code3'>{tool.duration}s</Typography>\n </Box>\n )}\n\n <Box sx={styles.traceField}>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceFieldLabel,\n ]}\n >\n {statusLabel}\n </Typography>\n <TraceStatusIndicator status={tool.status} labels={labels} />\n </Box>\n\n {tool.inputArguments && (\n <Box>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceField,\n ]}\n >\n {inputArgumentsLabel}\n </Typography>\n <ChatToolCodeArea\n sx={{ mt: 0.5, mb: tool.output ? 1.5 : 0 }}\n content={tool.inputArguments}\n title={`${toolExecutedLabel}: ${inputArgumentsLabel}`}\n isError={isError}\n />\n </Box>\n )}\n\n {tool.output && (\n <Box>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceField,\n ]}\n >\n {outputLabel}\n </Typography>\n <ChatToolCodeArea\n sx={{ mt: 0.5 }}\n content={tool.output}\n title={`${toolExecutedLabel}: ${outputLabel}`}\n isError={isError}\n />\n </Box>\n )}\n </Box>","{\n tool,\n expanded,\n onExpandedChange,\n labels = {},\n sx,\n}: ChatToolTraceProps","getToolLabel(tool)","<ChatThinking>{getToolLabel(tool)}</ChatThinking>","mergeSx(\n {\n width: '100%',\n },\n sx,\n )","() => onExpandedChange?.(!expanded)","{\n fontWeight: 600,\n color: 'text.secondary',\n }","<Typography\n variant='caption'\n sx={{\n fontWeight: 600,\n color: 'text.secondary',\n }}\n >\n {toolExecutedLabel}\n </Typography>","<ArrowRight\n sx={{\n ...styles.traceChevron,\n transform: expanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />","expanded ? 'rotate(90deg)' : 'rotate(0deg)'","<Button\n size='small'\n variant='text'\n onClick={() => onExpandedChange?.(!expanded)}\n aria-expanded={expanded}\n sx={styles.traceHeader}\n >\n <Typography\n variant='caption'\n sx={{\n fontWeight: 600,\n color: 'text.secondary',\n }}\n >\n {toolExecutedLabel}\n </Typography>\n <ArrowRight\n sx={{\n ...styles.traceChevron,\n transform: expanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />\n </Button>","<Box sx={styles.traceDetailsWrapper}>\n <ChatToolTraceDetails tool={tool} labels={labels} />\n </Box>","<Collapse in={expanded} unmountOnExit>\n <Box sx={styles.traceDetailsWrapper}>\n <ChatToolTraceDetails tool={tool} labels={labels} />\n </Box>\n </Collapse>","<Box\n data-tool={tool.name}\n className={`PsChat--tool-trace`}\n sx={mergeSx(\n {\n width: '100%',\n },\n sx,\n )}\n >\n <Button\n size='small'\n variant='text'\n onClick={() => onExpandedChange?.(!expanded)}\n aria-expanded={expanded}\n sx={styles.traceHeader}\n >\n <Typography\n variant='caption'\n sx={{\n fontWeight: 600,\n color: 'text.secondary',\n }}\n >\n {toolExecutedLabel}\n </Typography>\n <ArrowRight\n sx={{\n ...styles.traceChevron,\n transform: expanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />\n </Button>\n <Collapse in={expanded} unmountOnExit>\n <Box sx={styles.traceDetailsWrapper}>\n <ChatToolTraceDetails tool={tool} labels={labels} />\n </Box>\n </Collapse>\n </Box>","name","tool.name","_c","styles","[value, setter]","[_value, _setter]","_expanded = false","_expandedTools = {}","{\n tools,\n expanded: _expanded = false,\n onExpandedChange: _setExpanded,\n expandedTools: _expandedTools = {},\n onToolExpandedChange: _setExpandedTools,\n labels = {},\n sx,\n}: ChatToolGroupProps","labels = {}","tools.filter((t) => t.status === 'error')","(t) => t.status === 'error'","<Box\n className='PsChat--tool-group'\n sx={mergeSx(\n {\n width: '100%',\n },\n sx,\n )}\n >\n <Button\n size='small'\n variant='text'\n onClick={() => setExpanded(!expanded)}\n aria-expanded={expanded}\n sx={{\n ...styles.traceHeader,\n pr: numErrors > 0 ? 0.5 : 0,\n }}\n >\n <Typography\n variant='caption'\n sx={{\n fontWeight: 600,\n color: 'text.secondary',\n }}\n >\n {tools.length} {toolsUsedLabel}\n </Typography>\n <ArrowRight\n sx={{\n ...styles.traceChevron,\n transform: expanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />\n {numErrors > 0 && (\n <Typography variant='code3' sx={styles.errorBadge}>\n {numErrors}\n <ErrorOutlineOutlined sx={{ fontSize: 12 }} color='error' />\n </Typography>\n )}\n </Button>\n <Collapse in={expanded} unmountOnExit>\n <Box\n component='ul'\n sx={{\n ...styles.traceDetailsWrapper,\n p: 0,\n listStyle: 'none',\n }}\n >\n {nonRunningTools.map((tool) => {\n const isExpanded = expandedTools[tool.id] ?? false\n return (\n <Box\n key={tool.id}\n component='li'\n sx={styles.groupListItem}\n aria-expanded={isExpanded}\n >\n <Button\n variant='text'\n color='inherit'\n fullWidth\n onClick={() =>\n setExpandedTools({\n ...expandedTools,\n [tool.id]: !isExpanded,\n })\n }\n aria-expanded={isExpanded}\n sx={styles.groupHeader}\n >\n <Typography\n variant='caption'\n sx={{\n flexGrow: 1,\n flexShrink: 0,\n color: 'text.secondary',\n }}\n >\n {getToolLabel(tool)}\n </Typography>\n {tool.status === 'error' && (\n <Typography\n variant='code3'\n sx={{\n color: 'error.main',\n }}\n >\n {errorLabel}\n </Typography>\n )}\n <ChevronRight\n sx={{\n ...styles.traceChevron,\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />\n </Button>\n <Collapse in={isExpanded} unmountOnExit>\n <Box\n sx={{\n px: 1.5,\n py: 1,\n }}\n >\n <ChatToolTraceDetails tool={tool} labels={labels} />\n </Box>\n </Collapse>\n </Box>\n )\n })}\n </Box>\n </Collapse>\n {runningTools.map((tool) => (\n <ChatToolTrace\n key={tool.id}\n tool={tool}\n labels={labels}\n expanded={expandedTools[tool.id]}\n onExpandedChange={() =>\n setExpandedTools({\n ...expandedTools,\n [tool.id]: !expandedTools[tool.id],\n })\n }\n />\n ))}\n </Box>","labels.toolsUsed","(t) => t.status === 'running'","(t) => t.status !== 'running'","<ChatToolTrace\n tool={tools[0]!}\n expanded={expanded}\n onExpandedChange={setExpanded}\n labels={labels}\n sx={sx}\n />","0","mergeSx(\n {\n width: '100%',\n },\n sx,\n )","() => setExpanded(!expanded)","{\n ...styles.traceHeader,\n pr: numErrors > 0 ? 0.5 : 0,\n }","numErrors > 0 ? 0.5 : 0","{\n fontWeight: 600,\n color: 'text.secondary',\n }","<Typography\n variant='caption'\n sx={{\n fontWeight: 600,\n color: 'text.secondary',\n }}\n >\n {tools.length} {toolsUsedLabel}\n </Typography>","length","<ArrowRight\n sx={{\n ...styles.traceChevron,\n transform: expanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />","expanded ? 'rotate(90deg)' : 'rotate(0deg)'","numErrors > 0 && (\n <Typography variant='code3' sx={styles.errorBadge}>\n {numErrors}\n <ErrorOutlineOutlined sx={{ fontSize: 12 }} color='error' />\n </Typography>\n )","<Button\n size='small'\n variant='text'\n onClick={() => setExpanded(!expanded)}\n aria-expanded={expanded}\n sx={{\n ...styles.traceHeader,\n pr: numErrors > 0 ? 0.5 : 0,\n }}\n >\n <Typography\n variant='caption'\n sx={{\n fontWeight: 600,\n color: 'text.secondary',\n }}\n >\n {tools.length} {toolsUsedLabel}\n </Typography>\n <ArrowRight\n sx={{\n ...styles.traceChevron,\n transform: expanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />\n {numErrors > 0 && (\n <Typography variant='code3' sx={styles.errorBadge}>\n {numErrors}\n <ErrorOutlineOutlined sx={{ fontSize: 12 }} color='error' />\n </Typography>\n )}\n </Button>","{\n ...styles.traceDetailsWrapper,\n p: 0,\n listStyle: 'none',\n }","(tool) => {\n const isExpanded = expandedTools[tool.id] ?? false\n return (\n <Box\n key={tool.id}\n component='li'\n sx={styles.groupListItem}\n aria-expanded={isExpanded}\n >\n <Button\n variant='text'\n color='inherit'\n fullWidth\n onClick={() =>\n setExpandedTools({\n ...expandedTools,\n [tool.id]: !isExpanded,\n })\n }\n aria-expanded={isExpanded}\n sx={styles.groupHeader}\n >\n <Typography\n variant='caption'\n sx={{\n flexGrow: 1,\n flexShrink: 0,\n color: 'text.secondary',\n }}\n >\n {getToolLabel(tool)}\n </Typography>\n {tool.status === 'error' && (\n <Typography\n variant='code3'\n sx={{\n color: 'error.main',\n }}\n >\n {errorLabel}\n </Typography>\n )}\n <ChevronRight\n sx={{\n ...styles.traceChevron,\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />\n </Button>\n <Collapse in={isExpanded} unmountOnExit>\n <Box\n sx={{\n px: 1.5,\n py: 1,\n }}\n >\n <ChatToolTraceDetails tool={tool} labels={labels} />\n </Box>\n </Collapse>\n </Box>\n )\n }","<Box\n component='ul'\n sx={{\n ...styles.traceDetailsWrapper,\n p: 0,\n listStyle: 'none',\n }}\n >\n {nonRunningTools.map((tool) => {\n const isExpanded = expandedTools[tool.id] ?? false\n return (\n <Box\n key={tool.id}\n component='li'\n sx={styles.groupListItem}\n aria-expanded={isExpanded}\n >\n <Button\n variant='text'\n color='inherit'\n fullWidth\n onClick={() =>\n setExpandedTools({\n ...expandedTools,\n [tool.id]: !isExpanded,\n })\n }\n aria-expanded={isExpanded}\n sx={styles.groupHeader}\n >\n <Typography\n variant='caption'\n sx={{\n flexGrow: 1,\n flexShrink: 0,\n color: 'text.secondary',\n }}\n >\n {getToolLabel(tool)}\n </Typography>\n {tool.status === 'error' && (\n <Typography\n variant='code3'\n sx={{\n color: 'error.main',\n }}\n >\n {errorLabel}\n </Typography>\n )}\n <ChevronRight\n sx={{\n ...styles.traceChevron,\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />\n </Button>\n <Collapse in={isExpanded} unmountOnExit>\n <Box\n sx={{\n px: 1.5,\n py: 1,\n }}\n >\n <ChatToolTraceDetails tool={tool} labels={labels} />\n </Box>\n </Collapse>\n </Box>\n )\n })}\n </Box>","Box","'ul'","nonRunningTools.map((tool) => {\n const isExpanded = expandedTools[tool.id] ?? false\n return (\n <Box\n key={tool.id}\n component='li'\n sx={styles.groupListItem}\n aria-expanded={isExpanded}\n >\n <Button\n variant='text'\n color='inherit'\n fullWidth\n onClick={() =>\n setExpandedTools({\n ...expandedTools,\n [tool.id]: !isExpanded,\n })\n }\n aria-expanded={isExpanded}\n sx={styles.groupHeader}\n >\n <Typography\n variant='caption'\n sx={{\n flexGrow: 1,\n flexShrink: 0,\n color: 'text.secondary',\n }}\n >\n {getToolLabel(tool)}\n </Typography>\n {tool.status === 'error' && (\n <Typography\n variant='code3'\n sx={{\n color: 'error.main',\n }}\n >\n {errorLabel}\n </Typography>\n )}\n <ChevronRight\n sx={{\n ...styles.traceChevron,\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />\n </Button>\n <Collapse in={isExpanded} unmountOnExit>\n <Box\n sx={{\n px: 1.5,\n py: 1,\n }}\n >\n <ChatToolTraceDetails tool={tool} labels={labels} />\n </Box>\n </Collapse>\n </Box>\n )\n })","<Collapse in={expanded} unmountOnExit>\n <Box\n component='ul'\n sx={{\n ...styles.traceDetailsWrapper,\n p: 0,\n listStyle: 'none',\n }}\n >\n {nonRunningTools.map((tool) => {\n const isExpanded = expandedTools[tool.id] ?? false\n return (\n <Box\n key={tool.id}\n component='li'\n sx={styles.groupListItem}\n aria-expanded={isExpanded}\n >\n <Button\n variant='text'\n color='inherit'\n fullWidth\n onClick={() =>\n setExpandedTools({\n ...expandedTools,\n [tool.id]: !isExpanded,\n })\n }\n aria-expanded={isExpanded}\n sx={styles.groupHeader}\n >\n <Typography\n variant='caption'\n sx={{\n flexGrow: 1,\n flexShrink: 0,\n color: 'text.secondary',\n }}\n >\n {getToolLabel(tool)}\n </Typography>\n {tool.status === 'error' && (\n <Typography\n variant='code3'\n sx={{\n color: 'error.main',\n }}\n >\n {errorLabel}\n </Typography>\n )}\n <ChevronRight\n sx={{\n ...styles.traceChevron,\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />\n </Button>\n <Collapse in={isExpanded} unmountOnExit>\n <Box\n sx={{\n px: 1.5,\n py: 1,\n }}\n >\n <ChatToolTraceDetails tool={tool} labels={labels} />\n </Box>\n </Collapse>\n </Box>\n )\n })}\n </Box>\n </Collapse>","Collapse","expanded","unmountOnExit","(tool) => (\n <ChatToolTrace\n key={tool.id}\n tool={tool}\n labels={labels}\n expanded={expandedTools[tool.id]}\n onExpandedChange={() =>\n setExpandedTools({\n ...expandedTools,\n [tool.id]: !expandedTools[tool.id],\n })\n }\n />\n )","tool","t","_c","styles","CopyButton","CHAT_MAX_WIDTH","CHAT_SCROLL_DELAY","CHAT_DIVIDER_DELAY","CHAT_TOOL_CODE_AREA_MAX_HEIGHT","useTypewriter","$","c","t1","t0","t2","t3","speed","skipAnimation","t4","fullText","charIndex","setCharIndex","useState","charRef","useRef","t5","t6","msPerChar","rafId","lastTime","tick","timestamp","charsToAdd","next","useEffect","t7","t8","t9","ChatMessageOverflow","styled","Typography","styles$2","theme","spacing","palette","ChatUserMessage","muted","topContext","Box","sx","children","StyledAgentMessage","className","props","ChatAgentMessage","forwardRef","ref","MarkdownContent","lazy","n","m","ChatAgentMessageMarkdown","Suspense","ChatErrorMessage","icon","ErrorOutlineOutlined","errors","_temp$3","actions","_temp2$2","index_0","Link","action","error","index","ChatSuggestionButton","backgroundColor","label","ArrowUpward","ButtonBase","shimmer","breatheOuter","breatheInner","styles$1","typography","ChatThinking","durSeconds","ChatLoader","size","t10","t11","t12","styles","AUTO_SCROLL_THRESHOLD","ChatContent","autoScroll","labels","scrollRef","topSentinelRef","bottomSentinelRef","isAtTop","setIsAtTop","isAtBottom","setIsAtBottom","scrollToBottom","scrollToTop","useImperativeHandle","root","topEl","bottomEl","topObserver","entry","bottomObserver","entry_0","root_0","prevScrollHeight","check","newScrollHeight","growth","mo","t13","palette_0","t14","t15","t16","t17","t18","t19","t20","t21","KeyboardArrowDown","t22","Fab","t23","ChatHeader","title","onClose","IconButton","Close","rightSlot","leftSlot","DEFAULT_CAPTION","ChatFooter","isGenerating","disabled","placeholder","caption","modelAnchor","setModelAnchor","value","canSend","showModelSelector","models","modelLabel","selectedModel","selectedLabel","hasSlots","startToolbarSlot","endToolbarSlot","onSend","handleKeyDown","onStop","StopCircleOutlined","ArrowUpwardOutlined","sendButton","onChange","e_0","InputBase","onModelChange","Fragment","Button","e_1","Menu","MenuItem","m_0","FormHelperText","FormControl","DEFAULT_PALETTE","ChatStarter","T0","T1","description","items","onSelect","fullItems","_temp$2","item_0","i","item","ChatActionsContainer","ChatRatingAction","onRatingChange","rating","jsx","ThumbUp","ThumbUpOutlined","ThumbDown","ThumbDownOutlined","NUMBER_START_REGEX","tokenizeLine","tokens","lastIndex","match","keyPositions","keyRegex","keyMatch","line","tokenRegex","ChatToolFullViewDialog","content","_temp$1","tokenizedLines","DialogTitle","_temp3$1","DialogContent","open","Dialog","_temp2$1","token","j","ChatToolCodeArea","isError","preRef","isOverflowing","setIsOverflowing","dialogOpen","setDialogOpen","el","checkOverflow","el_0","observer","fullViewLabel","Tooltip","OpenDiagonallyRight","capitalize","spaced","str","getToolLabel","tool","TraceStatusIndicator","status","CheckCircle","Error","CircularProgress","ChatToolTraceDetails","toolExecutedLabel","referenceLabel","durationLabel","statusLabel","inputArgumentsLabel","outputLabel","McpTool","ChatToolTrace","isRunning","mergeSx","expanded","onExpandedChange","ArrowRight","Collapse","useController","_value","_setter","setter","ChatToolGroup","_setExpanded","_setExpandedTools","_expanded","_expandedTools","setExpanded","expandedTools","setExpandedTools","tools","_temp","numErrors","runningTools","_temp2","nonRunningTools","_temp3","toolsUsedLabel","errorLabel","isExpanded","ChevronRight","t24","t25","t26","t27","tool_0","t_1","t_0","t"],"sources":["../src/chat/const.ts","../src/chat/use-typewriter.ts","../src/chat/bubbles/styles.ts","../src/chat/bubbles/chat-user-message.tsx","../src/chat/bubbles/chat-agent-message.tsx","../src/chat/bubbles/chat-agent-message-markdown.tsx","../src/chat/bubbles/chat-error-message.tsx","../src/chat/bubbles/chat-suggestion-button.tsx","../src/chat/feedback/styles.ts","../src/chat/feedback/chat-thinking.tsx","../src/chat/feedback/chat-loader.tsx","../src/chat/containers/styles.ts","../src/chat/containers/chat-content.tsx","../src/chat/containers/chat-header.tsx","../src/chat/containers/chat-footer.tsx","../src/chat/containers/chat-starter.tsx","../src/chat/feedback/chat-actions-container.tsx","../src/chat/feedback/chat-rating-action.tsx","../src/chat/feedback/chat-tool-full-view-dialog.tsx","../src/chat/feedback/chat-tool-code-area.tsx","../src/chat/feedback/get-tool-label.ts","../src/chat/feedback/chat-tool-trace.tsx","../src/chat/feedback/chat-tool-group.tsx"],"sourcesContent":["export const CHAT_MAX_WIDTH = 768\nexport const CHAT_SCROLL_DELAY = 300\nexport const CHAT_DIVIDER_DELAY = 100\nexport const CHAT_TOOL_CODE_AREA_MAX_HEIGHT = 126\n","import { useEffect, useRef, useState } from 'react'\n\ninterface UseTypewriterOptions {\n /** Characters revealed per second (default: `500`). */\n speed?: number\n /** When true, reveal the full text immediately (and snap to it if it grows). */\n skipAnimation?: boolean\n}\n\ninterface UseTypewriterResult {\n /** The portion of `fullText` revealed so far. */\n displayedText: string\n /** `true` while characters are still being revealed. */\n isTyping: boolean\n}\n\n/**\n * Reveals a string character-by-character at a steady rate via\n * `requestAnimationFrame`. Designed for bursty, streamed agent text: as\n * `fullText` grows the reveal keeps chasing the new end, and flipping\n * `skipAnimation` to `true` (e.g. once generation finishes) snaps to the full\n * text. Pair it with `ChatAgentMessage`.\n *\n * @example\n * ```tsx\n * const { displayedText, isTyping } = useTypewriter(message)\n * return (\n * <ChatAgentMessage>\n * <Markdown>{displayedText}</Markdown>\n * {isTyping ? <Cursor /> : null}\n * </ChatAgentMessage>\n * )\n * ```\n */\nexport function useTypewriter(\n fullText: string,\n options: UseTypewriterOptions = {},\n): UseTypewriterResult {\n const { speed = 500, skipAnimation = false } = options\n\n const [charIndex, setCharIndex] = useState(() =>\n skipAnimation ? fullText.length : 0,\n )\n\n // Mirror of the revealed count, read/written ONLY inside the rAF loop (never\n // during render). This lets the animation effect omit `charIndex` from its\n // deps: were it a dep, the loop would tear down and restart on every revealed\n // frame — resetting its frame timer — and never accumulate the elapsed time\n // needed to advance, which stalls completely while `fullText` is also growing\n // (the streaming case).\n const charRef = useRef(charIndex)\n\n useEffect(() => {\n // When `skipAnimation` is set there's nothing to animate — the full text is\n // shown directly via the derived `displayedText` below (no setState here, so\n // a streamed message snaps to its full text the moment generation finishes,\n // without an extra render or a `set-state-in-effect` cascade).\n if (skipAnimation) return\n\n // Already fully revealed (e.g. text hasn't grown since the last frame).\n if (charRef.current >= fullText.length) return\n\n const msPerChar = 1000 / speed\n let rafId: number\n let lastTime: number | null = null\n\n function tick(timestamp: number) {\n // Plain `?? =` not `??=`: the React Compiler can't lower logical-assignment\n // operators and would bail this hook out of optimization.\n lastTime = lastTime ?? timestamp\n const charsToAdd = Math.floor((timestamp - lastTime) / msPerChar)\n if (charsToAdd > 0) {\n lastTime = timestamp\n const next = Math.min(charRef.current + charsToAdd, fullText.length)\n charRef.current = next\n setCharIndex(next)\n if (next >= fullText.length) return // fully revealed — stop the loop\n }\n rafId = requestAnimationFrame(tick)\n }\n\n rafId = requestAnimationFrame(tick)\n return () => cancelAnimationFrame(rafId)\n }, [fullText, speed, skipAnimation])\n\n return {\n displayedText: skipAnimation ? fullText : fullText.slice(0, charIndex),\n isTyping: !skipAnimation && charIndex < fullText.length,\n }\n}\n","import {\n styled,\n Typography,\n type SxProps,\n type Theme,\n type TypographyProps,\n} from '@mui/material'\nimport type { CSSObject } from '@mui/material/styles'\nimport type { FC } from 'react'\n\n// The explicit annotation is what keeps this file's .d.ts emittable: the type\n// `styled()` infers can only be named through a pnpm-internal @mui/system path\n// (TS2742), and vite-plugin-dts drops the whole declaration when that happens.\n//\n// ponytail: `component` and `ref` still typecheck, but the prop re-typing that\n// comes with them does not — `component=\"a\" href=\"#\"` is rejected here and\n// accepted on `Typography` itself. Restoring it needs `OverridableComponent`,\n// which a MUI v5 `styled()` result isn't assignable to under React 19 types.\n// Consumers who need the polymorphism use `Typography` directly.\nexport const ChatMessageOverflow: FC<TypographyProps> = styled(Typography)(\n () => ({\n whiteSpace: 'pre-wrap',\n overflowX: 'clip',\n overflowWrap: 'break-word',\n maxWidth: '100%',\n }),\n)\nChatMessageOverflow.displayName = 'ChatMessageOverflow'\n\nexport const styles = {\n agentMessageContainer: (theme: Theme): CSSObject => ({\n ...theme.typography.body2,\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n // Separate the stacked turn blocks (tools → answer text → actions) per the\n // Figma \"Chat Turn\" spec (gap-8).\n gap: theme.spacing(1),\n paddingRight: theme.spacing(4),\n '& + .PsChat--agent-message': {\n marginTop: theme.spacing(1),\n },\n '& + .PsChat--user-message': {\n marginTop: theme.spacing(3),\n },\n '& > p:first-of-type': {\n marginTop: 0,\n },\n '& table': {\n alignSelf: 'stretch',\n display: 'block',\n overflowX: 'auto',\n maxWidth: '100%',\n borderCollapse: 'collapse',\n margin: theme.spacing(1, 0),\n fontSize: '0.875em',\n },\n '& th, & td': {\n border: `1px solid ${theme.palette.divider}`,\n padding: theme.spacing(0.5, 1),\n textAlign: 'left',\n },\n '& th': {\n backgroundColor: theme.palette.action.hover,\n fontWeight: 600,\n },\n '& tr:nth-of-type(even) td': {\n backgroundColor: theme.palette.action.hover,\n },\n '& ul.contains-task-list': {\n listStyle: 'none',\n paddingLeft: 0,\n },\n '& .task-list-item input[type=\"checkbox\"]': {\n marginRight: theme.spacing(0.5),\n },\n '& del': {\n textDecoration: 'line-through',\n opacity: 0.7,\n },\n '& > ul, & > ol': {\n margin: theme.spacing(1, 0),\n paddingLeft: theme.spacing(3),\n '& > li + li': {\n marginTop: theme.spacing(1),\n },\n },\n }),\n userMessageContainer: {\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-end',\n paddingLeft: ({ spacing }) => spacing(4),\n '&:has(+ .PsChat--user-message) > .PsChat--user-message-inner': {\n borderRadius: ({ spacing }) => spacing(2),\n },\n '& + .PsChat--user-message': {\n marginTop: ({ spacing }) => spacing(0.5),\n },\n '& + .PsChat--agent-message': {\n marginTop: ({ spacing }) => spacing(3),\n },\n },\n userMessage: {\n padding: ({ spacing }) => spacing(0.75, 1.5),\n borderRadius: ({ spacing }) => spacing(2, 2, 0.25, 2),\n border: ({ palette }) => `1px solid ${palette.divider}`,\n backgroundColor: ({ palette }) => palette.background.paper,\n color: ({ palette }) => palette.text.primary,\n width: 'fit-content',\n },\n muted: {\n color: ({ palette }) => palette.text.disabled,\n },\n userMessageTop: {\n textAlign: 'right',\n marginBottom: ({ spacing }) => spacing(0.5),\n },\n errorMessage: {\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: ({ spacing }) => spacing(1),\n },\n errorActions: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(0.5),\n },\n errorAction: {\n color: ({ palette }) => palette.text.primary,\n },\n errorActionSeparator: {\n mr: 0.5,\n color: ({ palette }) => palette.black[25],\n fontWeight: 600,\n },\n suggestionButton: {\n transition: 'border-color 0.2s',\n width: '100%',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n textAlign: 'left',\n gap: ({ spacing }) => spacing(1),\n padding: ({ spacing }) => spacing(0.75, 1.5),\n borderRadius: ({ spacing }) => spacing(2),\n border: ({ palette }) => `1px solid ${palette.divider}`,\n '& .MuiSvgIcon-root': {\n transition: 'color 0.2s',\n color: 'inherit',\n fontSize: ({ spacing }) => spacing(1.5),\n width: ({ spacing }) => spacing(1.5),\n minWidth: ({ spacing }) => spacing(1.5),\n height: ({ spacing }) => spacing(2.5),\n },\n '&:not(.Mui-disabled) .MuiSvgIcon-root': {\n color: ({ palette }) => palette.text.secondary,\n },\n '&:hover': {\n borderColor: ({ palette }) => palette.text.hint,\n '& .MuiSvgIcon-root': {\n color: ({ palette }) => palette.text.primary,\n },\n },\n '&.Mui-disabled': {\n color: ({ palette }) => palette.text.disabled,\n },\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { Box } from '@mui/material'\nimport type { ChatUserMessageProps } from '../types'\nimport { ChatMessageOverflow, styles } from './styles'\n\nexport function ChatUserMessage({\n children,\n muted = false,\n topContext,\n sx,\n}: ChatUserMessageProps) {\n return (\n <Box className='PsChat--user-message' sx={styles.userMessageContainer}>\n {topContext && <Box sx={styles.userMessageTop}>{topContext}</Box>}\n <ChatMessageOverflow\n className='PsChat--user-message-inner'\n variant='body2'\n sx={{\n ...styles.userMessage,\n ...(muted ? styles.muted : undefined),\n ...sx,\n }}\n >\n {children}\n </ChatMessageOverflow>\n </Box>\n )\n}\n","import { forwardRef } from 'react'\nimport { Box, styled, type BoxProps } from '@mui/material'\nimport type { ChatAgentMessageProps } from '../types'\nimport { styles } from './styles'\n\nconst InnerBox = ({ className, ...props }: BoxProps) => (\n <Box className={`PsChat--agent-message ${className ?? ''}`} {...props} />\n)\n\nconst StyledAgentMessage = styled(InnerBox)(({ theme }) =>\n styles.agentMessageContainer(theme),\n)\n\n/**\n * Agent reply bubble. A styles container that positions the reply and its\n * composed pieces (text, loaders, tool traces, …); it renders `children`\n * verbatim and forwards its `ref` to the underlying element. For Markdown\n * replies, compose `ChatAgentMessageMarkdown` instead of teaching this\n * container about the markdown engine.\n */\nexport const ChatAgentMessage = forwardRef<\n HTMLDivElement,\n ChatAgentMessageProps\n>(function ChatAgentMessage({ children, ...props }, ref) {\n return (\n <StyledAgentMessage ref={ref} {...props}>\n {children}\n </StyledAgentMessage>\n )\n})\nChatAgentMessage.displayName = 'ChatAgentMessage'\n","import { lazy, Suspense } from 'react'\nimport { ChatAgentMessage } from './chat-agent-message'\nimport type { ChatAgentMessageMarkdownProps } from '../types'\n\n// Lazy-loaded so the markdown engine (`react-markdown` + remark/rehype plugins)\n// stays in a separate async chunk: consumers only pay its bundle cost when they\n// actually import this component. The Suspense fallback renders the raw text\n// until the chunk resolves.\nconst MarkdownContent = lazy(() =>\n import('../../widgets/markdown/markdown-content').then((m) => ({\n default: m.MarkdownContent,\n })),\n)\n\n/**\n * Agent reply bubble that renders its (string) children as GitHub-Flavored\n * Markdown through the library's sanitized renderer — raw HTML is skipped and\n * images are stripped, since the content is model output; tables / task lists /\n * strikethrough pick up the bubble's element styling. Composition over\n * `ChatAgentMessage`, which stays a plain styles container.\n */\nexport function ChatAgentMessageMarkdown({\n children,\n ...props\n}: ChatAgentMessageMarkdownProps) {\n return (\n <ChatAgentMessage {...props}>\n <Suspense fallback={children}>\n <MarkdownContent content={children} gfm />\n </Suspense>\n </ChatAgentMessage>\n )\n}\nChatAgentMessageMarkdown.displayName = 'ChatAgentMessageMarkdown'\n","import { Box, Link, Typography } from '@mui/material'\nimport { ErrorOutlineOutlined } from '@mui/icons-material'\nimport type { ChatErrorMessageProps } from '../types'\nimport { styles } from './styles'\n\nexport function ChatErrorMessage({\n errors,\n icon,\n actions,\n sx,\n}: ChatErrorMessageProps) {\n return (\n <Box sx={{ ...styles.errorMessage, ...sx }}>\n {icon ?? <ErrorOutlineOutlined fontSize='medium' color='error' />}\n {errors.map((error, index) => (\n <Typography\n key={index}\n variant='subtitle2'\n sx={{\n color: 'error.relatedDark',\n }}\n >\n {error}\n </Typography>\n ))}\n {actions?.length ? (\n <Box sx={styles.errorActions}>\n {(actions ?? []).map((action, index) => (\n <span key={index}>\n {index > 0 && (\n <Typography\n component='span'\n variant='body2'\n sx={styles.errorActionSeparator}\n >\n ·\n </Typography>\n )}\n <Link\n component='button'\n variant='body2'\n onClick={action.onClick}\n sx={styles.errorAction}\n >\n {action.label}\n </Link>\n </span>\n ))}\n </Box>\n ) : null}\n </Box>\n )\n}\n","import { ButtonBase, Typography } from '@mui/material'\nimport { ArrowUpward } from '@mui/icons-material'\nimport type { ChatSuggestionButtonProps } from '../types'\nimport { styles } from './styles'\n\nexport function ChatSuggestionButton({\n label,\n backgroundColor,\n sx,\n ...props\n}: ChatSuggestionButtonProps) {\n return (\n <ButtonBase\n sx={{\n ...styles.suggestionButton,\n ...(backgroundColor ? { backgroundColor } : undefined),\n ...sx,\n }}\n {...props}\n >\n <Typography\n variant='body2'\n sx={{\n color: 'inherit',\n }}\n >\n {label}\n </Typography>\n <ArrowUpward />\n </ButtonBase>\n )\n}\n","import { type SxProps, type Theme } from '@mui/material'\nimport { keyframes } from '@mui/material/styles'\n\nconst shimmer = keyframes`\n 0% {\n background-position: 150% 0;\n }\n 100% {\n background-position: -50% 0;\n }\n`\n\nconst breatheOuter = keyframes`\n 0% { transform: scale(0.68); opacity: 0.7; }\n 40% { transform: scale(1); opacity: 1; }\n 80% { transform: scale(0.6); opacity: 0.65; }\n 100% { transform: scale(0.68); opacity: 0.7; }\n`\n\nconst breatheInner = keyframes`\n 0% { transform: scale(1); }\n 40% { transform: scale(0.75); }\n 80% { transform: scale(1.125); }\n 100% { transform: scale(1); }\n`\n\nexport const styles = {\n thinking: {\n display: 'flex',\n alignItems: 'center',\n minHeight: ({ spacing }) => spacing(3),\n background: ({ palette }) => `linear-gradient(\n 90deg,\n ${palette.text.disabled} 25%,\n ${palette.text.secondary} 50%,\n ${palette.text.disabled} 75%\n )`,\n backgroundSize: '200% 100%',\n backgroundClip: 'text',\n WebkitBackgroundClip: 'text',\n WebkitTextFillColor: 'transparent',\n animation: `${shimmer} 2s ease-in-out infinite`,\n animationDuration: '2s',\n },\n loader: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n position: 'relative',\n p: 1,\n },\n loaderOuterCircle: {\n position: 'absolute',\n inset: 0,\n margin: 'auto',\n borderRadius: '50%',\n backgroundColor: ({ palette }) => palette.action.disabled,\n animation: `${breatheOuter} 1s ease-in-out infinite`,\n },\n loaderInnerCircle: {\n position: 'absolute',\n inset: 0,\n margin: 'auto',\n borderRadius: '50%',\n backgroundColor: ({ palette }) => palette.text.primary,\n animation: `${breatheInner} 1s ease-in-out infinite`,\n },\n // --- Tool Trace styles ---\n traceHeader: {\n display: 'flex',\n alignItems: 'center',\n padding: 0,\n paddingLeft: ({ spacing }) => spacing(0.5),\n borderRadius: ({ spacing }) => spacing(0.5),\n width: 'fit-content',\n color: ({ palette }) => palette.text.secondary,\n '&:hover': {\n backgroundColor: ({ palette }) => palette.action.hover,\n },\n },\n traceChevron: {\n color: ({ palette }) => palette.text.secondary,\n transition: 'transform 0.2s',\n },\n traceDetailsWrapper: {\n marginTop: ({ spacing }) => spacing(0.5),\n padding: ({ spacing }) => spacing(1.5),\n border: '1px solid',\n borderColor: 'divider',\n borderRadius: ({ spacing }) => spacing(1),\n },\n traceField: {\n display: 'flex',\n alignItems: 'flex-start',\n gap: ({ spacing }) => spacing(1),\n },\n traceFieldLabel: {\n flexShrink: 0,\n },\n traceReference: {\n display: 'flex',\n borderRadius: ({ spacing }) => spacing(0.25),\n padding: ({ spacing }) => spacing(0, 0.5),\n gap: ({ spacing }) => spacing(0.5),\n backgroundColor: ({ palette }) => palette.success.relatedLight,\n color: ({ palette }) => palette.success.dark,\n },\n traceStatusSuccess: {\n color: ({ palette }) => palette.success.main,\n },\n traceStatusError: {\n color: ({ palette }) => palette.error.main,\n },\n // --- Code Area styles ---\n codeArea: {\n position: 'relative',\n width: '100%',\n },\n codeAreaPre: {\n margin: 0,\n padding: ({ spacing }) => spacing(1),\n borderRadius: ({ spacing }) => spacing(0.5),\n backgroundColor: ({ palette }) => palette.background.default,\n fontFamily: ({ typography }): string =>\n typography.code3?.fontFamily ??\n typography.code1?.fontFamily ??\n 'monospace',\n fontSize: ({ typography }): string | number =>\n typography.code3?.fontSize ?? '0.75rem',\n lineHeight: ({ typography }): string | number =>\n typography.code3?.lineHeight ?? 1.333,\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n overflowY: 'auto',\n },\n codeAreaPreError: {\n borderLeft: ({ palette }) => `3px solid ${palette.error.main}`,\n backgroundColor: ({ palette }) => `${palette.error.main}08`,\n },\n codeAreaFullViewButton: {\n position: 'absolute',\n top: ({ spacing }) => spacing(0.5),\n right: ({ spacing }) => spacing(0.5),\n },\n // --- Full View Dialog styles ---\n fullViewDialog: {\n margin: ({ spacing }) => spacing(5),\n },\n fullViewPaper: {\n borderRadius: 1,\n },\n fullViewTitle: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: ({ spacing }) => spacing(2),\n borderBottom: '1px solid',\n borderBottomColor: 'divider',\n },\n fullViewDialogContent: {\n padding: 0,\n '&:first-of-type': { paddingTop: 0 },\n },\n fullViewPre: {\n margin: 0,\n padding: ({ spacing }) => spacing(1),\n background: ({ palette, spacing }) =>\n `linear-gradient(to right, ${palette.action.hover} calc(${spacing(1)} + 3em), ${palette.background.default} calc(${spacing(1)} + 3em))`,\n fontFamily: ({ typography }): string =>\n typography.code3?.fontFamily ??\n typography.code1?.fontFamily ??\n 'monospace',\n fontSize: ({ typography }): string | number =>\n typography.code3?.fontSize ?? '0.75rem',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n lineHeight: 1.6,\n counterReset: 'line',\n },\n fullViewLine: {\n display: 'block',\n '&::before': {\n counterIncrement: 'line',\n content: 'counter(line)',\n display: 'inline-block',\n width: '2em',\n marginRight: '2em',\n textAlign: 'right',\n color: ({ palette }) => palette.text.secondary,\n userSelect: 'none',\n },\n },\n groupHeader: {\n textAlign: 'left',\n display: 'flex',\n alignItems: 'center',\n borderRadius: 0,\n gap: ({ spacing }) => spacing(0.5),\n },\n errorBadge: {\n color: ({ palette }) => palette.error.main,\n fontWeight: 600,\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(0.25),\n },\n // --- Syntax highlighting token styles ---\n syntaxToken_key: {\n color: '#881280',\n },\n syntaxToken_string: {\n color: '#c41a16',\n },\n syntaxToken_number: {\n color: '#1c00cf',\n },\n syntaxToken_boolean: {\n color: '#1c00cf',\n },\n syntaxToken_null: {\n color: '#808080',\n },\n syntaxToken_punctuation: {\n color: ({ palette }) => palette.text.primary,\n },\n groupListItem: {\n borderBottom: '1px solid',\n borderColor: 'divider',\n '&:first-of-type .MuiButton-root': {\n borderRadius: ({ spacing }) => spacing(1, 1, 0, 0),\n },\n '&:last-of-type:not([aria-expanded=true]) .MuiButton-root': {\n borderRadius: ({ spacing }) => spacing(0, 0, 1, 1),\n },\n '&:last-of-type': {\n borderBottomWidth: 0,\n },\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { Typography } from '@mui/material'\nimport type { ChatThinkingProps } from '../types'\nimport { styles } from './styles'\n\nexport function ChatThinking({\n children = 'Thinking...',\n duration = 2000,\n sx,\n}: ChatThinkingProps) {\n const durSeconds = `${duration / 1000}s`\n return (\n <Typography\n variant='body2'\n sx={{\n ...styles.thinking,\n animationDuration: durSeconds,\n ...sx,\n }}\n >\n {children}\n </Typography>\n )\n}\n","import { Box } from '@mui/material'\nimport type { ChatLoaderProps } from '../types'\nimport { styles } from './styles'\n\nexport function ChatLoader({ size = 24, labels = {}, sx }: ChatLoaderProps) {\n return (\n <Box\n role='status'\n aria-busy={true}\n aria-label={labels.loading ?? 'Loading'}\n sx={{ ...styles.loader, width: size, height: size, ...sx }}\n >\n <Box\n component='span'\n sx={{\n ...styles.loaderOuterCircle,\n width: size * 0.75,\n height: size * 0.75,\n }}\n />\n <Box\n component='span'\n sx={{\n ...styles.loaderInnerCircle,\n width: size * 0.32,\n height: size * 0.32,\n }}\n />\n </Box>\n )\n}\n","import type { SxProps, Theme } from '@mui/material'\nimport { CHAT_MAX_WIDTH } from '../const'\n\nexport const styles = {\n header: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: ({ spacing }) => spacing(1),\n },\n headerTitle: {\n flexGrow: 1,\n px: ({ spacing }) => spacing(0.5),\n },\n headerActions: {\n display: 'flex',\n alignItems: 'center',\n marginLeft: ({ spacing }) => spacing(2),\n gap: ({ spacing }) => spacing(0.5),\n },\n footerWrapper: {\n padding: ({ spacing }) => spacing(1),\n },\n /**\n * Rounded input box, matching the reference ChatFooter. A two-column grid:\n * main column (input + optional slots) | send button, bottom-aligned so it\n * stays at the end as the input grows. NO vertical padding — the textarea's own\n * padding sets the ~32px single-line height, so the box hugs the input.\n */\n footerBox: {\n maxWidth: CHAT_MAX_WIDTH,\n width: '100%',\n margin: '0 auto',\n display: 'grid',\n gridTemplateColumns: '1fr auto',\n alignItems: 'end',\n columnGap: ({ spacing }) => spacing(0.5),\n backgroundColor: ({ palette }) =>\n palette.default?.background ?? 'rgba(44, 48, 50, 0.04)',\n borderRadius: ({ spacing }) => spacing(0.5),\n paddingInline: ({ spacing }) => spacing(0.5),\n },\n /** Main grid area: input stacked above the (optional) slots row. */\n footerMain: {\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: ({ spacing }) => spacing(0.5),\n },\n /**\n * Send-button grid area, bottom-aligned (matches the reference flex-end row) so\n * the button stays at the bottom as the input grows. The small bottom padding\n * keeps it off the box edge — in the single-line state it reads as vertically\n * centered (4px top / 4px bottom around the 24px button in the 32px row).\n */\n footerSend: {\n alignSelf: 'end',\n paddingBottom: ({ spacing }) => spacing(0.5),\n '& .MuiIconButton-root': {\n padding: ({ spacing }) => spacing(0.5),\n },\n },\n /** The chrome-less multiline input (no underline / no filled affordance). */\n footerInput: {\n width: '100%',\n typography: 'body2',\n // The Meridian theme styles multiline InputBase as a tall \"comment field\"\n // (min-height: 96px on the root, 12px/14px textarea padding). Override both to\n // get the compact chat field: kill the root min-height and use the reference's\n // 6px/10px padding — both need !important to beat the theme override. Height\n // then comes from MUI's TextareaAutosize (minRows=1/maxRows=8): one line\n // (~32px) → grows → scrolls.\n //\n // TextareaAutosize renders a hidden shadow <textarea> (it carries\n // `aria-hidden=\"true\"`, the same class, and an inline `padding: 0`) to measure\n // the content height; MUI then applies that height to the visible input. Getting\n // the compact ~32px single line right needs the two rules below split apart:\n //\n // • Font metrics (size/line-height/letter-spacing) go on BOTH textareas. The\n // shadow measures with its own CSS, so if it isn't pinned to body2 it\n // measures at the default ~24px line-height and the box ends up too tall.\n // • Padding goes on the VISIBLE input ONLY (`:not([aria-hidden])`). A\n // `!important` padding that also hit the shadow would clobber its measurement\n // `padding: 0`, double-counting the padding (~44px instead of 32px).\n //\n // `!important` is required on both to beat the Meridian theme's tall\n // \"comment field\" multiline overrides (12px/14px padding, larger metrics); the\n // root `min-height: 0` kills that theme's 96px min-height.\n minHeight: '0 !important',\n '& textarea': {\n fontSize: ({ typography }) => `${typography.body2.fontSize} !important`,\n lineHeight: ({ typography }) =>\n `${typography.body2.lineHeight} !important`,\n letterSpacing: ({ typography }) =>\n `${typography.body2.letterSpacing} !important`,\n },\n '& textarea:not([aria-hidden])': {\n resize: 'none',\n padding: ({ spacing }) => `${spacing(0.75, 1.25)} !important`,\n },\n },\n /**\n * Slots row under the input: start slot + model selector + end slot. The left\n * padding lines the row's content up with the input text above it: the input\n * text is inset ~12px from the box edge (InputBase root padding + the textarea's\n * 10px left padding) while the model-selector text button only insets ~8px, so a\n * 4px indent here makes the slot label share the placeholder's left edge instead\n * of sitting further out.\n */\n footerSlots: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(0.5),\n minWidth: 0,\n flexWrap: 'wrap',\n paddingLeft: ({ spacing }) => spacing(0.5),\n paddingBottom: ({ spacing }) => spacing(0.5),\n },\n modelSelector: {\n textTransform: 'none',\n color: ({ palette }) => palette.text.secondary,\n maxWidth: '100%',\n minWidth: 0,\n '& .MuiButton-endIcon': {\n marginLeft: ({ spacing }) => spacing(0.25),\n },\n },\n modelSelectorLabel: {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n footerCaption: {\n textAlign: 'center',\n },\n content: {\n overflowY: 'auto',\n flex: 1,\n position: 'relative',\n mx: 'auto',\n maxWidth: CHAT_MAX_WIDTH,\n width: '100%',\n maxHeight: '100%',\n pt: 1,\n pb: 3,\n px: 2,\n display: 'flex',\n flexDirection: 'column',\n borderTopWidth: '1px',\n borderTopStyle: 'solid',\n borderBottomWidth: '1px',\n borderBottomStyle: 'solid',\n },\n sentinel: {\n height: '1px',\n flexShrink: 0,\n },\n jumpToLatestWrapper: {\n position: 'sticky',\n bottom: ({ spacing }) => spacing(3),\n height: 0,\n display: 'flex',\n justifyContent: 'center',\n zIndex: 1,\n },\n jumpToLatest: {\n transition: 'opacity 0.2s',\n },\n starter: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: ({ spacing }) => spacing(3),\n textAlign: 'center',\n maxWidth: CHAT_MAX_WIDTH,\n margin: '0 auto',\n },\n starterItems: {\n display: 'grid',\n width: '100%',\n marginTop: ({ spacing }) => spacing(2),\n },\n starterItemsTwoCol: {\n gridTemplateColumns: 'repeat(2, 1fr)',\n },\n} satisfies Record<string, SxProps<Theme>>\n","import {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react'\nimport { Box, Fab } from '@mui/material'\nimport { KeyboardArrowDown } from '@mui/icons-material'\nimport type { ChatContentProps, ChatContentRef } from '../types'\nimport { styles } from './styles'\n\n/** Slack in px for treating the user as \"at the bottom\" when content grows. */\nconst AUTO_SCROLL_THRESHOLD = 32\n\nexport const ChatContent = forwardRef<ChatContentRef, ChatContentProps>(\n function ChatContent({ children, autoScroll = true, labels = {}, sx }, ref) {\n const scrollRef = useRef<HTMLDivElement>(null)\n const topSentinelRef = useRef<HTMLDivElement>(null)\n const bottomSentinelRef = useRef<HTMLDivElement>(null)\n\n const [isAtTop, setIsAtTop] = useState(true)\n const [isAtBottom, setIsAtBottom] = useState(true)\n\n const scrollToBottom = () => {\n scrollRef.current?.scrollTo({\n top: scrollRef.current.scrollHeight,\n behavior: 'smooth',\n })\n }\n\n const scrollToTop = () => {\n scrollRef.current?.scrollTo({ top: 0, behavior: 'smooth' })\n }\n\n useImperativeHandle(\n ref,\n () => ({ scrollToBottom, scrollToTop, isAtBottom, isAtTop }),\n [isAtBottom, isAtTop],\n )\n\n useEffect(() => {\n const root = scrollRef.current\n const topEl = topSentinelRef.current\n const bottomEl = bottomSentinelRef.current\n if (!root || !topEl || !bottomEl) return\n\n const topObserver = new IntersectionObserver(\n ([entry]) => setIsAtTop(entry?.isIntersecting ?? true),\n { root },\n )\n const bottomObserver = new IntersectionObserver(\n ([entry]) => setIsAtBottom(entry?.isIntersecting ?? true),\n { root },\n )\n topObserver.observe(topEl)\n bottomObserver.observe(bottomEl)\n return () => {\n topObserver.disconnect()\n bottomObserver.disconnect()\n }\n }, [])\n\n useEffect(() => {\n if (!autoScroll) return\n const root = scrollRef.current\n if (!root) return\n\n // We can't watch `children` to detect new content: tool traces and\n // `useTypewriter` live inside child components and update via local\n // state, so they mutate the DOM without re-rendering `ChatContent`.\n // MutationObserver picks up every DOM change regardless of source.\n let prevScrollHeight = root.scrollHeight\n let rafId: number | null = null\n\n const check = () => {\n rafId = null\n const newScrollHeight = root.scrollHeight\n if (newScrollHeight > prevScrollHeight) {\n const growth = newScrollHeight - prevScrollHeight\n // If the distance from the bottom doesn't exceed the amount the\n // content just grew (plus a small slack), the user was at the\n // bottom *before* the growth — scroll them to the new bottom.\n // Otherwise they've scrolled up to read history and we leave them\n // alone.\n const distanceFromBottom =\n newScrollHeight - root.scrollTop - root.clientHeight\n if (distanceFromBottom <= growth + AUTO_SCROLL_THRESHOLD) {\n root.scrollTo({ top: newScrollHeight, behavior: 'smooth' })\n }\n }\n prevScrollHeight = newScrollHeight\n }\n\n const mo = new MutationObserver(() => {\n // Plain `?? =` rather than `??=`: the React Compiler can't yet lower\n // logical-assignment operators, and bailing out would drop memoization\n // for this scroll container (which re-renders on every message).\n rafId = rafId ?? requestAnimationFrame(check)\n })\n mo.observe(root, {\n childList: true,\n subtree: true,\n characterData: true,\n })\n return () => {\n mo.disconnect()\n if (rafId !== null) cancelAnimationFrame(rafId)\n }\n }, [autoScroll])\n\n return (\n <Box\n ref={scrollRef}\n sx={{\n ...styles.content,\n borderTopColor: ({ palette }) =>\n isAtTop ? 'transparent' : palette.divider,\n borderBottomColor: ({ palette }) =>\n isAtBottom ? 'transparent' : palette.divider,\n ...sx,\n }}\n >\n <Box ref={topSentinelRef} sx={styles.sentinel} aria-hidden />\n {children}\n <Box ref={bottomSentinelRef} sx={styles.sentinel} aria-hidden />\n <Box sx={styles.jumpToLatestWrapper}>\n <Fab\n size='small'\n onClick={scrollToBottom}\n aria-label={labels.jumpToLatest ?? 'Jump to latest'}\n sx={{\n ...styles.jumpToLatest,\n opacity: isAtBottom ? 0 : 1,\n pointerEvents: isAtBottom ? 'none' : 'auto',\n }}\n >\n <KeyboardArrowDown />\n </Fab>\n </Box>\n </Box>\n )\n },\n)\nChatContent.displayName = 'ChatContent'\n","import { Box, IconButton, Typography } from '@mui/material'\nimport { Close } from '@mui/icons-material'\nimport type { ChatHeaderProps } from '../types'\nimport { styles } from './styles'\n\nexport function ChatHeader({\n leftSlot,\n title,\n rightSlot,\n onClose,\n sx,\n}: ChatHeaderProps) {\n return (\n <Box sx={{ ...styles.header, ...sx }}>\n {leftSlot}\n <Typography variant='subtitle2' sx={styles.headerTitle}>\n {title}\n </Typography>\n <Box sx={styles.headerActions}>\n {rightSlot}\n {onClose && (\n <IconButton size='medium' onClick={onClose} aria-label='Close'>\n <Close />\n </IconButton>\n )}\n </Box>\n </Box>\n )\n}\n","import { useState } from 'react'\nimport {\n Box,\n Button,\n FormControl,\n FormHelperText,\n IconButton,\n InputBase,\n Menu,\n MenuItem,\n Typography,\n} from '@mui/material'\nimport {\n ArrowUpwardOutlined,\n StopCircleOutlined,\n KeyboardArrowDown,\n} from '@mui/icons-material'\nimport type { ChatFooterProps } from '../types'\nimport { styles } from './styles'\n\nconst DEFAULT_CAPTION =\n 'Responses are AI-generated. Please verify key information.'\n\nexport function ChatFooter({\n value,\n onChange,\n onSend,\n onStop,\n isGenerating = false,\n disabled = false,\n placeholder = 'Type a message...',\n labels = {},\n caption = DEFAULT_CAPTION,\n models,\n selectedModel,\n onModelChange,\n startToolbarSlot,\n endToolbarSlot,\n sx,\n}: ChatFooterProps) {\n const [modelAnchor, setModelAnchor] = useState<HTMLElement | null>(null)\n const canSend = value.trim() && !disabled && !isGenerating\n // Only worth showing when there's an actual choice — a single option is dead UI.\n const showModelSelector = (models?.length ?? 0) > 1\n const modelLabel = labels.model ?? 'Select model'\n // Visible trigger text: the matched option's label, the raw value as a\n // fallback, or the placeholder when nothing is selected yet.\n const selectedLabel =\n models?.find((m) => m.value === selectedModel)?.label ??\n (selectedModel && selectedModel.length > 0 ? selectedModel : modelLabel)\n\n // The slots row (start slot + model selector + end slot) renders under the input\n // only when there's something to show; otherwise the grid is just input | send.\n const hasSlots =\n showModelSelector || Boolean(startToolbarSlot) || Boolean(endToolbarSlot)\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n if (canSend) {\n onSend()\n }\n }\n }\n\n const sendButton =\n isGenerating && onStop ? (\n <IconButton\n size='small'\n onClick={onStop}\n disabled={disabled}\n aria-label={labels.stop ?? 'Stop'}\n >\n <StopCircleOutlined />\n </IconButton>\n ) : (\n <IconButton\n size='small'\n variant='contained'\n color='primary'\n onClick={onSend}\n disabled={!canSend}\n aria-label={labels.send ?? 'Send'}\n >\n <ArrowUpwardOutlined />\n </IconButton>\n )\n\n return (\n <FormControl fullWidth sx={{ ...styles.footerWrapper, ...sx }}>\n {/* Two grid areas: [input + slots] | [send button, aligned to the end]. */}\n <Box sx={styles.footerBox}>\n <Box sx={styles.footerMain}>\n <InputBase\n multiline\n minRows={1}\n maxRows={8}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled || isGenerating}\n sx={styles.footerInput}\n />\n {hasSlots && (\n <Box sx={styles.footerSlots}>\n {startToolbarSlot}\n {showModelSelector && (\n <>\n <Button\n size='small'\n variant='text'\n color='inherit'\n disabled={disabled || isGenerating}\n onClick={(e) => setModelAnchor(e.currentTarget)}\n aria-label={modelLabel}\n aria-haspopup='menu'\n aria-expanded={modelAnchor ? 'true' : undefined}\n endIcon={<KeyboardArrowDown />}\n sx={styles.modelSelector}\n >\n <Typography\n variant='caption'\n component='span'\n sx={[\n {\n color: 'inherit',\n },\n styles.modelSelectorLabel,\n ]}\n >\n {selectedLabel}\n </Typography>\n </Button>\n <Menu\n anchorEl={modelAnchor}\n open={Boolean(modelAnchor)}\n onClose={() => setModelAnchor(null)}\n variant='menu'\n elevation={8}\n anchorOrigin={{ vertical: 'top', horizontal: 'left' }}\n transformOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n {models?.map((m) => (\n <MenuItem\n key={m.value}\n selected={m.value === selectedModel}\n onClick={() => {\n onModelChange?.(m.value)\n setModelAnchor(null)\n }}\n >\n {m.label}\n </MenuItem>\n ))}\n </Menu>\n </>\n )}\n {endToolbarSlot}\n </Box>\n )}\n </Box>\n <Box sx={styles.footerSend}>{sendButton}</Box>\n </Box>\n {caption ? (\n <FormHelperText sx={styles.footerCaption}>{caption}</FormHelperText>\n ) : null}\n </FormControl>\n )\n}\n","import { Box, Typography } from '@mui/material'\nimport type { ChatStarterProps } from '../types'\nimport { ChatSuggestionButton } from '../bubbles/chat-suggestion-button'\nimport { styles } from './styles'\n\nconst DEFAULT_PALETTE = [\n '#C9DB7440', // pastel green\n '#FE88B140', // pastel red\n '#9EB9F340', // pastel blue\n '#F6CF7140', // pastel yellow\n]\n\nexport function ChatStarter({\n icon,\n title,\n description,\n items,\n size = 'small',\n onSelect,\n sx,\n}: ChatStarterProps) {\n const fullItems = items.map((item, index) => {\n if (typeof item === 'string') {\n return {\n label: item,\n backgroundColor: DEFAULT_PALETTE[index],\n }\n } else {\n return {\n label: item.label,\n backgroundColor: item.backgroundColor ?? DEFAULT_PALETTE[index],\n }\n }\n })\n return (\n <Box\n sx={{\n ...styles.starter,\n gap: size === 'small' ? 1 : 2,\n ...sx,\n }}\n >\n {icon}\n {title && (\n <Typography variant={size === 'small' ? 'h6' : 'h5'}>\n {title}\n </Typography>\n )}\n {description && (\n <Typography\n variant={size === 'small' ? 'body2' : 'body1'}\n sx={{\n color: 'text.secondary',\n }}\n >\n {description}\n </Typography>\n )}\n <Box\n sx={{\n ...styles.starterItems,\n gap: size === 'small' ? 1 : 2,\n ...(items.length > 2 ? styles.starterItemsTwoCol : undefined),\n }}\n >\n {fullItems.map((item, i) => (\n <ChatSuggestionButton\n key={i}\n label={item.label}\n onClick={() => onSelect?.(item.label)}\n backgroundColor={item.backgroundColor}\n />\n ))}\n </Box>\n </Box>\n )\n}\n","import { Box, styled, type BoxProps } from '@mui/material'\nimport type { FC } from 'react'\n\n// See chat/bubbles/styles.ts: the annotation keeps the declaration emittable,\n// and what it gives up on `component=`.\nexport const ChatActionsContainer: FC<BoxProps> = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n}))\n","import { IconButton } from '@mui/material'\nimport {\n ThumbUpOutlined,\n ThumbDownOutlined,\n ThumbUp,\n ThumbDown,\n} from '@mui/icons-material'\nimport type { ChatRatingActionProps } from '../types'\n\nexport function ChatRatingAction({\n rating,\n onRatingChange,\n labels = {},\n}: ChatRatingActionProps) {\n return (\n <>\n <IconButton\n size='small'\n onClick={() => onRatingChange?.(rating === 'up' ? null : 'up')}\n aria-label={labels.thumbUp ?? 'Thumbs up'}\n color={rating === 'up' ? 'primary' : undefined}\n >\n {rating === 'up' ? (\n <ThumbUp fontSize='small' />\n ) : (\n <ThumbUpOutlined fontSize='small' />\n )}\n </IconButton>\n <IconButton\n size='small'\n onClick={() => onRatingChange?.(rating === 'down' ? null : 'down')}\n aria-label={labels.thumbDown ?? 'Thumbs down'}\n color={rating === 'down' ? 'primary' : undefined}\n >\n {rating === 'down' ? (\n <ThumbDown fontSize='small' />\n ) : (\n <ThumbDownOutlined fontSize='small' />\n )}\n </IconButton>\n </>\n )\n}\n","import { useMemo } from 'react'\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n IconButton,\n Box,\n} from '@mui/material'\nimport { Close } from '@mui/icons-material'\nimport { CopyButton } from '../../components/copy-button/copy-button'\nimport type { ChatToolFullViewDialogProps } from '../types'\nimport { styles } from './styles'\n\ninterface Token {\n type: 'key' | 'string' | 'number' | 'boolean' | 'null' | 'punctuation'\n value: string\n}\n\nconst NUMBER_START_REGEX = /^-?\\d/\n\nfunction tokenizeLine(line: string): (Token | string)[] {\n const tokens: (Token | string)[] = []\n let lastIndex = 0\n let match: RegExpExecArray | null\n\n // First, find all key positions by looking for \"...\": patterns\n const keyPositions = new Set<number>()\n const keyRegex = /(\"(?:[^\"\\\\]|\\\\.)*\")\\s*:/g\n let keyMatch: RegExpExecArray | null\n while ((keyMatch = keyRegex.exec(line)) !== null) {\n keyPositions.add(keyMatch.index)\n }\n\n const tokenRegex = // eslint-disable-next-line no-useless-escape\n /\"(?:[^\"\\\\]|\\\\.)*\"|\\b(?:true|false)\\b|\\bnull\\b|-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?|[{}\\[\\]:,]/g\n\n while ((match = tokenRegex.exec(line)) !== null) {\n if (match.index > lastIndex) {\n tokens.push(line.slice(lastIndex, match.index))\n }\n const value = match[0]\n if (value.startsWith('\"')) {\n if (keyPositions.has(match.index)) {\n tokens.push({ type: 'key', value })\n } else {\n tokens.push({ type: 'string', value })\n }\n } else if (NUMBER_START_REGEX.test(value)) {\n tokens.push({ type: 'number', value })\n } else if (value === 'true' || value === 'false') {\n tokens.push({ type: 'boolean', value })\n } else if (value === 'null') {\n tokens.push({ type: 'null', value })\n } else {\n tokens.push({ type: 'punctuation', value })\n }\n lastIndex = match.index + value.length\n }\n\n if (lastIndex < line.length) {\n tokens.push(line.slice(lastIndex))\n }\n\n return tokens\n}\n\nexport function ChatToolFullViewDialog({\n open,\n onClose,\n title,\n content,\n}: ChatToolFullViewDialogProps) {\n const tokenizedLines = useMemo(\n () => content.split('\\n').map((line) => tokenizeLine(line)),\n [content],\n )\n\n return (\n <Dialog\n open={open}\n onClose={onClose}\n sx={styles.fullViewDialog}\n fullScreen\n slotProps={{\n paper: { sx: styles.fullViewPaper },\n }}\n >\n <DialogTitle sx={styles.fullViewTitle}>\n {title}\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <CopyButton copyText={content} aria-label='Copy content' />\n <IconButton onClick={onClose} aria-label='close'>\n <Close />\n </IconButton>\n </Box>\n </DialogTitle>\n <DialogContent sx={styles.fullViewDialogContent}>\n <Box component='pre' sx={styles.fullViewPre}>\n {tokenizedLines.map((tokens, i) => (\n <Box component='span' key={i} sx={styles.fullViewLine}>\n {tokens.map((token, j) =>\n typeof token === 'string' ? (\n token\n ) : (\n <Box\n component='span'\n key={j}\n sx={\n styles[`syntaxToken_${token.type}` as keyof typeof styles]\n }\n >\n {token.value}\n </Box>\n ),\n )}\n {'\\n'}\n </Box>\n ))}\n </Box>\n </DialogContent>\n </Dialog>\n )\n}\n","import { useRef, useState, useEffect, useCallback } from 'react'\nimport { Box, IconButton, Tooltip } from '@mui/material'\nimport type { ChatToolCodeAreaProps } from '../types'\nimport { CHAT_TOOL_CODE_AREA_MAX_HEIGHT } from '../const'\nimport { ChatToolFullViewDialog } from './chat-tool-full-view-dialog'\nimport { styles } from './styles'\nimport { OpenDiagonallyRight } from '@carto/meridian-ds/custom-icons'\n\nexport function ChatToolCodeArea({\n content,\n title = '',\n isError = false,\n labels = {},\n sx,\n}: ChatToolCodeAreaProps) {\n const preRef = useRef<HTMLPreElement>(null)\n const [isOverflowing, setIsOverflowing] = useState(false)\n const [dialogOpen, setDialogOpen] = useState(false)\n\n const checkOverflow = useCallback(() => {\n const el = preRef.current\n if (el) {\n setIsOverflowing(el.scrollHeight > el.clientHeight)\n }\n }, [])\n\n useEffect(() => {\n checkOverflow()\n const el = preRef.current\n if (!el) return\n\n const observer = new ResizeObserver(checkOverflow)\n observer.observe(el)\n return () => observer.disconnect()\n }, [checkOverflow, content])\n\n const fullViewLabel = labels.fullView ?? 'Full view'\n\n return (\n <Box sx={{ ...styles.codeArea, ...sx }}>\n <Box\n component='pre'\n ref={preRef}\n sx={{\n ...styles.codeAreaPre,\n maxHeight: CHAT_TOOL_CODE_AREA_MAX_HEIGHT,\n ...(isError ? styles.codeAreaPreError : {}),\n }}\n >\n {content}\n </Box>\n {isOverflowing && (\n <Tooltip title={fullViewLabel}>\n <IconButton\n size='small'\n onClick={() => setDialogOpen(true)}\n sx={styles.codeAreaFullViewButton}\n >\n <OpenDiagonallyRight />\n </IconButton>\n </Tooltip>\n )}\n <ChatToolFullViewDialog\n open={dialogOpen}\n onClose={() => setDialogOpen(false)}\n title={title}\n content={content}\n />\n </Box>\n )\n}\n","import type { ChatToolItem } from '../types'\n\nfunction capitalize(str: string): string {\n const spaced = str.replace(/_/g, ' ')\n return spaced.charAt(0).toUpperCase() + spaced.slice(1)\n}\n\nexport function getToolLabel(tool: ChatToolItem): string {\n if (tool.status === 'running') {\n return tool.runningLabel ?? capitalize(tool.name)\n }\n return tool.label ?? capitalize(tool.name)\n}\n","import {\n Box,\n CircularProgress,\n Typography,\n Collapse,\n Button,\n} from '@mui/material'\nimport { ArrowRight, CheckCircle, Error } from '@mui/icons-material'\nimport type { ChatToolTraceProps } from '../types'\nimport { ChatToolCodeArea } from './chat-tool-code-area'\nimport { styles } from './styles'\nimport { ChatThinking } from './chat-thinking'\nimport { getToolLabel } from './get-tool-label'\nimport { McpTool } from '@carto/meridian-ds/custom-icons'\nimport { mergeSx } from '../../components/lasso-tool/styles'\n\nfunction TraceStatusIndicator({\n status,\n labels,\n}: {\n status: string\n labels: ChatToolTraceProps['labels']\n}) {\n switch (status) {\n case 'complete':\n return (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <CheckCircle sx={{ fontSize: 12 }} color='success' />\n <Typography variant='caption'>\n {labels?.success ?? 'Success'}\n </Typography>\n </Box>\n )\n case 'error':\n return (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <Error sx={{ fontSize: 12 }} color='error' />\n <Typography variant='code3'>{labels?.error ?? 'Error'}</Typography>\n </Box>\n )\n case 'running':\n return <CircularProgress size={14} />\n default:\n return null\n }\n}\n\nexport function ChatToolTraceDetails({\n tool,\n labels = {},\n}: Pick<ChatToolTraceProps, 'tool' | 'labels'>) {\n const isError = tool.status === 'error'\n const toolExecutedLabel = labels.toolExecuted ?? 'Tool executed'\n const referenceLabel = labels.reference ?? 'Reference:'\n const durationLabel = labels.duration ?? 'Duration:'\n const statusLabel = labels.status ?? 'Status:'\n const inputArgumentsLabel = labels.inputArguments ?? 'Input arguments:'\n const outputLabel = labels.output ?? 'Output:'\n\n return (\n <Box>\n {tool.reference && (\n <Box sx={styles.traceField}>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceFieldLabel,\n ]}\n >\n {referenceLabel}\n </Typography>\n <Box sx={styles.traceReference}>\n <McpTool color='success' />\n <Typography\n variant='code3'\n sx={{\n fontWeight: 600,\n }}\n >\n {tool.reference}\n </Typography>\n </Box>\n </Box>\n )}\n\n {tool.duration != null && (\n <Box sx={styles.traceField}>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceFieldLabel,\n ]}\n >\n {durationLabel}\n </Typography>\n <Typography variant='code3'>{tool.duration}s</Typography>\n </Box>\n )}\n\n <Box sx={styles.traceField}>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceFieldLabel,\n ]}\n >\n {statusLabel}\n </Typography>\n <TraceStatusIndicator status={tool.status} labels={labels} />\n </Box>\n\n {tool.inputArguments && (\n <Box>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceField,\n ]}\n >\n {inputArgumentsLabel}\n </Typography>\n <ChatToolCodeArea\n sx={{ mt: 0.5, mb: tool.output ? 1.5 : 0 }}\n content={tool.inputArguments}\n title={`${toolExecutedLabel}: ${inputArgumentsLabel}`}\n isError={isError}\n />\n </Box>\n )}\n\n {tool.output && (\n <Box>\n <Typography\n variant='code3'\n sx={[\n {\n fontWeight: 600,\n color: 'text.secondary',\n },\n styles.traceField,\n ]}\n >\n {outputLabel}\n </Typography>\n <ChatToolCodeArea\n sx={{ mt: 0.5 }}\n content={tool.output}\n title={`${toolExecutedLabel}: ${outputLabel}`}\n isError={isError}\n />\n </Box>\n )}\n </Box>\n )\n}\n\nexport function ChatToolTrace({\n tool,\n expanded,\n onExpandedChange,\n labels = {},\n sx,\n}: ChatToolTraceProps) {\n const isRunning = tool.status === 'running'\n const toolExecutedLabel = labels.toolExecuted ?? 'Tool executed'\n\n if (isRunning) {\n return <ChatThinking>{getToolLabel(tool)}</ChatThinking>\n }\n\n return (\n <Box\n data-tool={tool.name}\n className={`PsChat--tool-trace`}\n sx={mergeSx(\n {\n width: '100%',\n },\n sx,\n )}\n >\n <Button\n size='small'\n variant='text'\n onClick={() => onExpandedChange?.(!expanded)}\n aria-expanded={expanded}\n sx={styles.traceHeader}\n >\n <Typography\n variant='caption'\n sx={{\n fontWeight: 600,\n color: 'text.secondary',\n }}\n >\n {toolExecutedLabel}\n </Typography>\n <ArrowRight\n sx={{\n ...styles.traceChevron,\n transform: expanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />\n </Button>\n <Collapse in={expanded} unmountOnExit>\n <Box sx={styles.traceDetailsWrapper}>\n <ChatToolTraceDetails tool={tool} labels={labels} />\n </Box>\n </Collapse>\n </Box>\n )\n}\n","import { Box, Button, Collapse, Typography } from '@mui/material'\nimport {\n ArrowRight,\n ChevronRight,\n ErrorOutlineOutlined,\n} from '@mui/icons-material'\nimport type { ChatToolGroupProps } from '../types'\nimport { ChatToolTrace, ChatToolTraceDetails } from './chat-tool-trace'\nimport { styles } from './styles'\nimport { getToolLabel } from './get-tool-label'\nimport { useState } from 'react'\nimport { mergeSx } from '../../components/lasso-tool/styles'\n\nfunction useController<T>(value: T, setter?: (value: T) => void) {\n const [_value, _setter] = useState<T>(value)\n if (setter) {\n return [value, setter] as const\n } else {\n return [_value, _setter] as const\n }\n}\n\nexport function ChatToolGroup({\n tools,\n expanded: _expanded = false,\n onExpandedChange: _setExpanded,\n expandedTools: _expandedTools = {},\n onToolExpandedChange: _setExpandedTools,\n labels = {},\n sx,\n}: ChatToolGroupProps) {\n const [expanded, setExpanded] = useController(_expanded, _setExpanded)\n const [expandedTools, setExpandedTools] = useController(\n _expandedTools,\n _setExpandedTools,\n )\n\n const numErrors = tools.filter((t) => t.status === 'error').length\n const runningTools = tools.filter((t) => t.status === 'running')\n const nonRunningTools = tools.filter((t) => t.status !== 'running')\n const toolsUsedLabel = labels.toolsUsed ?? 'tools used'\n const errorLabel = labels.error ?? 'Error'\n\n if (tools.length === 1) {\n return (\n <ChatToolTrace\n tool={tools[0]!}\n expanded={expanded}\n onExpandedChange={setExpanded}\n labels={labels}\n sx={sx}\n />\n )\n }\n\n return (\n <Box\n className='PsChat--tool-group'\n sx={mergeSx(\n {\n width: '100%',\n },\n sx,\n )}\n >\n <Button\n size='small'\n variant='text'\n onClick={() => setExpanded(!expanded)}\n aria-expanded={expanded}\n sx={{\n ...styles.traceHeader,\n pr: numErrors > 0 ? 0.5 : 0,\n }}\n >\n <Typography\n variant='caption'\n sx={{\n fontWeight: 600,\n color: 'text.secondary',\n }}\n >\n {tools.length} {toolsUsedLabel}\n </Typography>\n <ArrowRight\n sx={{\n ...styles.traceChevron,\n transform: expanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />\n {numErrors > 0 && (\n <Typography variant='code3' sx={styles.errorBadge}>\n {numErrors}\n <ErrorOutlineOutlined sx={{ fontSize: 12 }} color='error' />\n </Typography>\n )}\n </Button>\n <Collapse in={expanded} unmountOnExit>\n <Box\n component='ul'\n sx={{\n ...styles.traceDetailsWrapper,\n p: 0,\n listStyle: 'none',\n }}\n >\n {nonRunningTools.map((tool) => {\n const isExpanded = expandedTools[tool.id] ?? false\n return (\n <Box\n key={tool.id}\n component='li'\n sx={styles.groupListItem}\n aria-expanded={isExpanded}\n >\n <Button\n variant='text'\n color='inherit'\n fullWidth\n onClick={() =>\n setExpandedTools({\n ...expandedTools,\n [tool.id]: !isExpanded,\n })\n }\n aria-expanded={isExpanded}\n sx={styles.groupHeader}\n >\n <Typography\n variant='caption'\n sx={{\n flexGrow: 1,\n flexShrink: 0,\n color: 'text.secondary',\n }}\n >\n {getToolLabel(tool)}\n </Typography>\n {tool.status === 'error' && (\n <Typography\n variant='code3'\n sx={{\n color: 'error.main',\n }}\n >\n {errorLabel}\n </Typography>\n )}\n <ChevronRight\n sx={{\n ...styles.traceChevron,\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />\n </Button>\n <Collapse in={isExpanded} unmountOnExit>\n <Box\n sx={{\n px: 1.5,\n py: 1,\n }}\n >\n <ChatToolTraceDetails tool={tool} labels={labels} />\n </Box>\n </Collapse>\n </Box>\n )\n })}\n </Box>\n </Collapse>\n {runningTools.map((tool) => (\n <ChatToolTrace\n key={tool.id}\n tool={tool}\n labels={labels}\n expanded={expandedTools[tool.id]}\n onExpandedChange={() =>\n setExpandedTools({\n ...expandedTools,\n [tool.id]: !expandedTools[tool.id],\n })\n }\n />\n ))}\n </Box>\n )\n}\n"],"mappings":"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"}
|