'use client'; import { Card, CardContent } from '@/components/ui/card'; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"; import { Separator } from '@/components/ui/separator'; import { Skeleton } from '@/components/ui/skeleton'; import { cn } from '@/lib/utils'; import { Brain, ChevronDown, ChevronRight, Clock, Cpu, InfoIcon, Loader2, Zap } from 'lucide-react'; import { MarkdownRenderer } from './markdownRenderer'; import { FindSymbolDefinitionsToolComponent } from './tools/findSymbolDefinitionsToolComponent'; import { FindSymbolReferencesToolComponent } from './tools/findSymbolReferencesToolComponent'; import { ReadFilesToolComponent } from './tools/readFilesToolComponent'; import { SearchCodeToolComponent } from './tools/searchCodeToolComponent'; import { SBChatMessageMetadata, SBChatMessagePart } from '../../types'; interface DetailsCardProps { isExpanded: boolean; onExpandedChanged: (isExpanded: boolean) => void; isThinking: boolean; isStreaming: boolean; thinkingSteps: SBChatMessagePart[][]; metadata?: SBChatMessageMetadata; } export const DetailsCard = ({ isExpanded, onExpandedChanged, isThinking, isStreaming, metadata, thinkingSteps, }: DetailsCardProps) => { return (

{isThinking ? ( <> Thinking... ) : ( <> Details )}

{!isStreaming && ( <> {metadata?.modelName && (
{metadata?.modelName}
)} {metadata?.totalTokens && (
{metadata?.totalTokens} tokens
)} {metadata?.totalResponseTimeMs && (
{metadata?.totalResponseTimeMs / 1000} seconds
)}
{`${thinkingSteps.length} step${thinkingSteps.length === 1 ? '' : 's'}`}
)}
{isExpanded ? ( ) : ( )}
{thinkingSteps.length === 0 ? ( isStreaming ? ( ) : (

No thinking steps

) ) : thinkingSteps.map((step, index) => { return (
{index + 1}
{step.map((part, index) => { switch (part.type) { case 'reasoning': case 'text': return ( ) case 'tool-readFiles': return ( ) case 'tool-searchCode': return ( ) case 'tool-findSymbolDefinitions': return ( ) case 'tool-findSymbolReferences': return ( ) default: return null; } })}
) })}
) }