import React from "react"; import { ToolViewProps } from "./types"; import { formatTimestamp } from "./utils"; import { ExternalLink, CheckCircle, AlertTriangle } from "lucide-react"; import { Markdown } from "@/components/ui/markdown"; import { cn } from "@/lib/utils"; export function ExposePortToolView({ name = 'expose-port', assistantContent, toolContent, isSuccess = true, isStreaming = false, assistantTimestamp, toolTimestamp }: ToolViewProps) { console.log('ExposePortToolView:', { name, assistantContent, toolContent, isSuccess, isStreaming, assistantTimestamp, toolTimestamp }); // Parse the assistant content const parsedAssistantContent = React.useMemo(() => { if (!assistantContent) return null; try { const parsed = JSON.parse(assistantContent); return parsed.content; } catch (e) { console.error('Failed to parse assistant content:', e); return null; } }, [assistantContent]); // Parse the tool result const toolResult = React.useMemo(() => { if (!toolContent) return null; try { // First parse the outer JSON const parsed = JSON.parse(toolContent); // Then extract the tool result content const match = parsed.content.match(/output='(.*?)'/); if (match) { const jsonStr = match[1] .replace(/\\n/g, '') .replace(/\\"/g, '"'); return JSON.parse(jsonStr); } return null; } catch (e) { console.error('Failed to parse tool content:', e); return null; } }, [toolContent]); // Extract port number from assistant content const portNumber = React.useMemo(() => { if (!parsedAssistantContent) return null; try { const match = parsedAssistantContent.match(/\s*(\d+)\s*<\/expose-port>/); return match ? match[1] : null; } catch (e) { console.error('Failed to extract port number:', e); return null; } }, [parsedAssistantContent]); // If we have no content to show, render a placeholder if (!portNumber && !toolResult && !isStreaming) { return (
No port exposure information available
); } return (
{/* Assistant Content */} {portNumber && !isStreaming && (
Port to Expose
{assistantTimestamp && (
{formatTimestamp(assistantTimestamp)}
)}
Port
{portNumber}
)} {/* Tool Result */} {toolResult && (
{isStreaming ? "Processing" : "Exposed URL"}
{toolTimestamp && !isStreaming && (
{formatTimestamp(toolTimestamp)}
)}
{isStreaming ? (
Exposing port {portNumber}...
) : (
Port
{toolResult.port}
{toolResult.message}
Note: This URL might only be temporarily available and could expire after some time.
)}
)}
{/* Footer */}
{!isStreaming && (
{isSuccess ? ( ) : ( )} {isSuccess ? 'Port exposed successfully' : 'Failed to expose port'}
)} {isStreaming && (
Exposing port...
)}
{toolTimestamp && !isStreaming ? formatTimestamp(toolTimestamp) : assistantTimestamp ? formatTimestamp(assistantTimestamp) : ''}
); }