import React from "react"; import { ToolViewProps } from "./types"; import { formatTimestamp, getToolTitle } from "./utils"; import { getToolIcon } from "../utils"; import { CircleDashed, CheckCircle, AlertTriangle, Network, Database } from "lucide-react"; import { cn } from "@/lib/utils"; export function DataProviderToolView({ name = 'unknown', assistantContent, toolContent, isSuccess = true, isStreaming = false, assistantTimestamp, toolTimestamp }: ToolViewProps) { const toolTitle = getToolTitle(name); const Icon = getToolIcon(name) || Network; // Extract data from the assistant content (request) const extractRequest = React.useMemo(() => { if (!assistantContent) return null; try { // Parse assistant content as JSON const parsed = JSON.parse(assistantContent); if (parsed.content) { // Try to extract content from service name and route const serviceMatch = parsed.content.match(/service_name=\\?"([^"\\]+)\\?"/); const routeMatch = parsed.content.match(/route=\\?"([^"\\]+)\\?"/); // For execute-data-provider-call, also extract the payload let payload = null; if (name === 'execute-data-provider-call') { const payloadMatch = parsed.content.match(/{([^}]+)}/); if (payloadMatch) { try { // Try to parse the payload JSON payload = JSON.parse(`{${payloadMatch[1]}}`); } catch (e) { payload = payloadMatch[1]; } } } return { service: serviceMatch ? serviceMatch[1] : undefined, route: routeMatch ? routeMatch[1] : undefined, payload }; } } catch (e) { console.error("Error parsing assistant content:", e); } return null; }, [assistantContent, name]); // Parse the tool response const parsedResponse = React.useMemo(() => { if (!toolContent || isStreaming) return null; try { // Extract content from tool_result tags if present const toolResultMatch = toolContent.match(/\s*<[^>]+>([\s\S]*?)<\/[^>]+>\s*<\/tool_result>/); let contentToFormat = toolResultMatch ? toolResultMatch[1] : toolContent; // Look for a ToolResult pattern const toolResultOutputMatch = contentToFormat.match(/ToolResult\(success=.+?, output='([\s\S]*?)'\)/); if (toolResultOutputMatch) { contentToFormat = toolResultOutputMatch[1]; } // Try to parse as JSON for pretty formatting try { // Replace escaped quotes and newlines contentToFormat = contentToFormat.replace(/\\"/g, '"').replace(/\\n/g, '\n'); const parsedJson = JSON.parse(contentToFormat); return JSON.stringify(parsedJson, null, 2); } catch (e) { // If not valid JSON, return as is return contentToFormat; } } catch (e) { return toolContent; } }, [toolContent, isStreaming]); return (
{/* Header - exactly like other tool views */}
{toolTitle}
{!isStreaming && ( {isSuccess ? 'Success' : 'Failed'} )}
{/* Request Info Bar - match style with file paths in other tools */} {extractRequest && (
{extractRequest.service}{extractRequest.route && `/${extractRequest.route}`}
)} {/* Content Container */} {!isStreaming ? (
{/* Request section - show payload if available */} {extractRequest?.payload && (
Request Payload
                        {typeof extractRequest.payload === 'object' 
                          ? JSON.stringify(extractRequest.payload, null, 2) 
                          : extractRequest.payload}
                      
)} {/* Response section */} {parsedResponse && (
Response Data
                        {parsedResponse}
                      
)} {/* Show raw data if parsed content isn't available */} {!extractRequest?.payload && !parsedResponse && assistantContent && (
Raw Request
                        {assistantContent}
                      
)} {!parsedResponse && toolContent && (
Raw Response
                        {toolContent}
                      
)}
) : (

Processing {name.toLowerCase()} operation...

{extractRequest?.service && extractRequest?.route && (

{extractRequest.service}/{extractRequest.route}

)}
)}
{/* Footer - exactly like other tool views */}
{!isStreaming && (
{isSuccess ? ( ) : ( )} {isSuccess ? `${toolTitle} completed successfully` : `${toolTitle} operation failed`}
)} {isStreaming && (
Executing {toolTitle.toLowerCase()}...
)}
{toolTimestamp && !isStreaming ? formatTimestamp(toolTimestamp) : assistantTimestamp ? formatTimestamp(assistantTimestamp) : ''}
); }