import { useMemo, useState } from 'react'; import { ChevronRight } from 'lucide-react'; import type { ChatMessage, ClaudePermissionSuggestion, PermissionGrantResult, Provider } from '../../types/types'; import type { Project } from '../../../../types/app'; import type { ToolGroupItem } from '../../utils/toolGrouping'; import { getToolConfig } from '../../tools'; import MessageComponent from './MessageComponent'; type DiffLine = { type: string; content: string; lineNum: number; }; interface ToolGroupContainerProps { group: ToolGroupItem; prevMessage: ChatMessage | null; createDiff: (oldStr: string, newStr: string) => DiffLine[]; getMessageKey: (message: ChatMessage) => string; onFileOpen?: (filePath: string, diffInfo?: unknown) => void; onShowSettings?: () => void; onGrantToolPermission?: (suggestion: ClaudePermissionSuggestion) => PermissionGrantResult | null | undefined; autoExpandTools?: boolean; showRawParameters?: boolean; showThinking?: boolean; selectedProject?: Project | null; provider: Provider | string; } function parseToolInput(toolInput: unknown): unknown { if (typeof toolInput !== 'string') { return toolInput; } try { return JSON.parse(toolInput); } catch { return toolInput; } } function getToolInputPreview(message: ChatMessage): string { const config = getToolConfig(message.toolName || 'UnknownTool').input; const parsedInput = parseToolInput(message.toolInput); const title = typeof config.title === 'function' ? config.title(parsedInput) : config.title; const value = config.getValue?.(parsedInput); return String(value || title || message.displayText || message.content || '').trim(); } function getToolGroupIcon(icon: string | undefined, toolName: string): string { if (icon === 'terminal') { return '$'; } return icon || toolName.slice(0, 1).toUpperCase(); } export default function ToolGroupContainer({ group, prevMessage, createDiff, getMessageKey, onFileOpen, onShowSettings, onGrantToolPermission, autoExpandTools, showRawParameters, showThinking, selectedProject, provider, }: ToolGroupContainerProps) { const [isExpanded, setIsExpanded] = useState(false); const config = getToolConfig(group.toolName).input; const label = config.label || group.toolName; const borderClass = config.colorScheme?.border || 'border-border'; const iconClass = config.colorScheme?.icon || 'text-muted-foreground'; const icon = getToolGroupIcon(config.icon, group.toolName); const preview = useMemo(() => { const visiblePreviews = group.messages .slice(0, 2) .map(getToolInputPreview) .filter(Boolean); const extraCount = group.messages.length - visiblePreviews.length; const previewText = visiblePreviews.join(', '); if (!previewText) { return extraCount > 0 ? `+${extraCount} more` : ''; } return extraCount > 0 ? `${previewText}, +${extraCount} more` : previewText; }, [group.messages]); return (