import { Box, Button, Collapse, Typography } from '@mui/material' import { ArrowRight, ChevronRight, ErrorOutline } from '@mui/icons-material' import type { ChatToolGroupProps } from '../types' import { ChatToolTrace, ChatToolTraceDetails } from './chat-tool-trace' import { styles } from './styles' import { getToolLabel } from './get-tool-label' import { useState } from 'react' function useController(value: T, setter?: (value: T) => void) { const [_value, _setter] = useState(value) if (setter) { return [value, setter] as const } else { return [_value, _setter] as const } } export function ChatToolGroup({ tools, expanded: _expanded = false, onExpandedChange: _setExpanded, expandedTools: _expandedTools = {}, onToolExpandedChange: _setExpandedTools, labels = {}, sx, }: ChatToolGroupProps) { const [expanded, setExpanded] = useController(_expanded, _setExpanded) const [expandedTools, setExpandedTools] = useController( _expandedTools, _setExpandedTools, ) const numErrors = tools.filter((t) => t.status === 'error').length const runningTools = tools.filter((t) => t.status === 'running') const nonRunningTools = tools.filter((t) => t.status !== 'running') const toolsUsedLabel = labels.toolsUsed ?? 'tools used' const errorLabel = labels.error ?? 'Error' if (tools.length === 1) { return ( ) } return ( {nonRunningTools.map((tool) => { const isExpanded = expandedTools[tool.id] ?? false return ( ) })} {runningTools.map((tool) => ( setExpandedTools({ ...expandedTools, [tool.id]: !expandedTools[tool.id], }) } /> ))} ) }