"use client"; import type { EveDynamicToolPart, EveMessage, EveMessagePart } from "eve/react"; import { Message, MessageContent, MessageResponse } from "@/components/ai-elements/message"; import { Reasoning, ReasoningContent, ReasoningTrigger } from "@/components/ai-elements/reasoning"; import { Tool, ToolContent, ToolHeader, ToolInput, ToolOutput, } from "@/components/ai-elements/tool"; import { Button } from "@/components/ui/button"; export type AgentInputResponse = { readonly optionId?: string; readonly requestId: string; readonly text?: string; }; export function AgentMessage({ canRespond, isStreaming, message, onInputResponses, }: { readonly canRespond: boolean; readonly isStreaming: boolean; readonly message: EveMessage; readonly onInputResponses: (responses: readonly AgentInputResponse[]) => void | Promise; }) { const lastTextIndex = message.parts.reduce( (last, part, index) => (part.type === "text" ? index : last), -1, ); return ( {message.parts.map((part, index) => ( ))} ); } function AgentMessagePart({ canRespond, onInputResponses, part, showCaret, }: { readonly canRespond: boolean; readonly onInputResponses: (responses: readonly AgentInputResponse[]) => void | Promise; readonly part: EveMessagePart; readonly showCaret: boolean; }) { switch (part.type) { case "step-start": return null; case "text": return ( {part.text} ); case "reasoning": return ( {part.text} ); case "dynamic-tool": return ( ); } } function InputRequestActions({ canRespond, onInputResponses, part, }: { readonly canRespond: boolean; readonly onInputResponses: (responses: readonly AgentInputResponse[]) => void | Promise; readonly part: EveDynamicToolPart; }) { const inputRequest = part.toolMetadata?.eve?.inputRequest; if (!inputRequest) { return null; } const inputResponse = part.toolMetadata?.eve?.inputResponse; const selectedOption = inputRequest.options?.find( (option) => option.id === inputResponse?.optionId, ); return (

{inputRequest.prompt}

{inputResponse ? (

Responded: {selectedOption?.label ?? inputResponse.text ?? inputResponse.optionId}

) : (
{inputRequest.options?.map((option) => ( ))}
)}
); } function partKey(part: EveMessagePart, index: number): string { switch (part.type) { case "dynamic-tool": return part.toolCallId; default: return `${part.type}:${index}`; } }