"use client"; import { ExternalLink, Search } from "lucide-react"; import { ToolUseBlock } from "./ToolUseBlock"; interface SearchResult { title: string; url: string; snippet: string; } interface ToolWebSearchProps { input: { query: string; }; result?: string; isError?: boolean; isRunning?: boolean; startedAt?: number; completedAt?: number; } function parseSearchResults(result: string): SearchResult[] { // Try JSON first try { const data = JSON.parse(result); if (Array.isArray(data)) { return data.map((item) => ({ title: item.title ?? item.name ?? "(no title)", url: item.url ?? item.link ?? "", snippet: item.snippet ?? item.description ?? item.content ?? "", })); } if (data.results) return parseSearchResults(JSON.stringify(data.results)); } catch { // not JSON } // Fallback: treat raw text as a single result return [{ title: "Search Result", url: "", snippet: result }]; } export function ToolWebSearch({ input, result, isError = false, isRunning = false, startedAt, completedAt, }: ToolWebSearchProps) { const results = result && !isError ? parseSearchResults(result) : []; return ( {/* Query header */}
{input.query} {!isRunning && results.length > 0 && ( {results.length} result{results.length !== 1 ? "s" : ""} )}
{/* Results */} {isRunning ? (
Searching…
) : isError ? (
{result}
) : results.length === 0 ? (
No results.
) : (
{results.map((r, i) => (
{r.url ? (
{r.title}
{r.url}
) : ( {r.title} )} {r.snippet && (

{r.snippet}

)}
))}
)}
); }