"use client"; import { makeAssistantToolUI } from "@assistant-ui/react"; import { z } from "zod"; import { cn } from "@/lib/utils"; import { TrendingUp, TrendingDown, ExternalLink, Zap, RefreshCw, Activity, Droplets, BarChart3 } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { ChainIcon } from "@/components/crypto/ChainIcon"; // Schema for live token data tool arguments export const LiveTokenDataArgsSchema = z.object({ chain: z.string(), token_address: z.string(), token_symbol: z.string().optional(), include_all_pairs: z.boolean().optional(), }); export type LiveTokenDataArgs = z.infer; // Schema for live token data result (matches backend response) export const LiveTokenDataResultSchema = z.object({ id: z.string(), kind: z.literal("live_token_data"), chain: z.string(), token_address: z.string(), token_symbol: z.string().optional(), token_name: z.string().optional(), price_usd: z.string().optional(), price_native: z.string().optional(), price_change_5m: z.number().optional(), price_change_1h: z.number().optional(), price_change_6h: z.number().optional(), price_change_24h: z.number().optional(), volume_24h: z.number().optional(), volume_6h: z.number().optional(), volume_1h: z.number().optional(), liquidity_usd: z.number().optional(), market_cap: z.number().optional(), fdv: z.number().optional(), txns_24h_buys: z.number().optional(), txns_24h_sells: z.number().optional(), txns_6h_buys: z.number().optional(), txns_6h_sells: z.number().optional(), txns_1h_buys: z.number().optional(), txns_1h_sells: z.number().optional(), total_volume_24h_all_pairs: z.number().optional(), total_liquidity_all_pairs: z.number().optional(), total_buys_24h_all_pairs: z.number().optional(), total_sells_24h_all_pairs: z.number().optional(), dex: z.string().optional(), pair_url: z.string().optional(), total_pairs: z.number().optional(), data_source: z.string().optional(), error: z.string().optional(), }); export type LiveTokenDataResult = z.infer; const formatPrice = (price: string | undefined): string => { if (!price || price === "N/A") return "N/A"; const num = parseFloat(price); if (isNaN(num)) return price; if (num < 0.00001) return `$${num.toExponential(2)}`; if (num < 1) return `$${num.toFixed(6)}`; return `$${num.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`; }; const formatLargeNumber = (num: number | undefined): string => { if (num === undefined || num === null || num === 0) return "N/A"; if (num >= 1e9) return `$${(num / 1e9).toFixed(2)}B`; if (num >= 1e6) return `$${(num / 1e6).toFixed(2)}M`; if (num >= 1e3) return `$${(num / 1e3).toFixed(2)}K`; return `$${num.toFixed(2)}`; }; const formatNumber = (num: number | undefined): string => { if (num === undefined || num === null) return "0"; return num.toLocaleString(); }; const PriceChange = ({ value, label }: { value: number | undefined; label: string }) => { if (value === undefined || value === null) return null; const isPositive = value >= 0; return (

{label}

{isPositive ? "+" : ""}{value.toFixed(2)}%

); }; /** * LiveTokenDataToolUI - Displays comprehensive real-time market data * Used when AI fetches detailed live market information */ export const LiveTokenDataToolUI = makeAssistantToolUI({ toolName: "get_live_token_data", render: ({ args, result, status }) => { const isLoading = status.type === "running"; const hasError = result?.error; const handleOpenDexScreener = () => { if (result?.pair_url) { window.open(result.pair_url, "_blank"); } else if (args.token_address) { window.open(`https://dexscreener.com/${args.chain}/${args.token_address}`, "_blank"); } }; const totalTxns24h = (result?.txns_24h_buys || 0) + (result?.txns_24h_sells || 0); const buyRatio = totalTxns24h > 0 ? ((result?.txns_24h_buys || 0) / totalTxns24h) * 100 : 50; return ( Live Market Data {isLoading && Fetching...} {!isLoading && !hasError && ( Real-time )} {hasError ? (
⚠️ {result.error}
) : ( <> {/* Token Header */}
{result?.token_symbol || args.token_symbol || "Token"} {result?.token_name && ( {result.token_name} )}
{formatPrice(result?.price_usd)} {result?.price_change_24h !== undefined && ( = 0 ? "text-green-500" : "text-red-500" )}> {result.price_change_24h >= 0 ? : } {result.price_change_24h >= 0 ? "+" : ""}{result.price_change_24h.toFixed(2)}% )}
{/* Price Changes */}
{/* Metrics Grid */}

24h Volume

{formatLargeNumber(result?.volume_24h)}

Liquidity

{formatLargeNumber(result?.liquidity_usd)}

Market Cap

{formatLargeNumber(result?.market_cap)}

FDV

{formatLargeNumber(result?.fdv)}

{/* Transaction Activity */}

24h Transactions

{formatNumber(result?.txns_24h_buys)} buys {formatNumber(totalTxns24h)} total {formatNumber(result?.txns_24h_sells)} sells
{/* DEX Info & Actions */}
DEX: {result?.dex || "Unknown"} {result?.total_pairs && result.total_pairs > 1 && ( • {result.total_pairs} pairs )}
)} ); }, });