"use client"; import { useEveAgent } from "eve/react"; import { AlertCircleIcon } from "lucide-react"; import { Conversation, ConversationContent, ConversationScrollButton, } from "@/components/ai-elements/conversation"; import { PromptInput, type PromptInputMessage, PromptInputSubmit, PromptInputTextarea, } from "@/components/ai-elements/prompt-input"; import { cn } from "@/lib/utils"; import { AgentMessage } from "./agent-message"; const AGENT_NAME = "Agent Browser Sandbox"; const BETA_TERMS_HREF = "https://vercel.com/docs/release-phases/public-beta-agreement"; type AgentStatus = ReturnType["status"]; export function AgentChat() { const agent = useEveAgent(); const isBusy = agent.status === "submitted" || agent.status === "streaming"; const isEmpty = agent.data.messages.length === 0; const handleSubmit = async (message: PromptInputMessage) => { const text = message.text.trim(); if (!text || isBusy) return; await agent.send({ message: text }); }; const composer = ( ); return (
{isEmpty ? null : (
{AGENT_NAME} Public preview
)} {agent.error ? (

Request failed

{agent.error.message}

) : null} {isEmpty ? null : ( {agent.data.messages.map((message, index) => ( agent.send({ inputResponses })} /> ))} )}
{isEmpty ? (

{AGENT_NAME}

Public preview
) : null}
{composer}
); } function StatusDot({ status }: { readonly status: AgentStatus }) { const isLive = status === "submitted" || status === "streaming"; const tone = status === "error" ? "bg-destructive" : isLive ? "bg-emerald-500" : status === "ready" ? "bg-muted-foreground" : "bg-muted-foreground/50"; return ( {isLive ? ( ) : null} ); }