import { memo, useMemo } from "react"; import { MessageSquareQuote } from "lucide-react"; import type { ToolPart } from "../types/parts"; import { PreviewCard, PreviewEmpty, PreviewError, PreviewLoading } from "./preview-primitives"; function toQuestionList(input: unknown): string[] { if (!input) { return []; } if (typeof input === "string") { return [input]; } if (Array.isArray(input)) { return input.map((item) => String(item)).filter(Boolean); } if (typeof input === "object") { const record = input as Record; const value = record.questions ?? record.question ?? record.prompt; if (Array.isArray(value)) { return value.map((item) => String(item)).filter(Boolean); } if (typeof value === "string") { return [value]; } } return []; } function toAnswerList(output: unknown): string[] { if (!output) { return []; } if (typeof output === "string") { return [output]; } if (Array.isArray(output)) { return output.map((item) => String(item)).filter(Boolean); } if (typeof output === "object") { const record = output as Record; const value = record.answers ?? record.answer ?? record.response; if (Array.isArray(value)) { return value.map((item) => String(item)).filter(Boolean); } if (typeof value === "string") { return [value]; } } return []; } export interface QuestionPreviewProps { part: ToolPart; } export const QuestionPreview = memo(({ part }: QuestionPreviewProps) => { const questions = useMemo(() => toQuestionList(part.state.input), [part.state.input]); const answers = useMemo(() => toAnswerList(part.state.output), [part.state.output]); return ( } title="Agent question" description={questions.length > 1 ? `${questions.length} questions require attention` : undefined} > {part.state.status === "running" ? : null} {part.state.error ? : null} {questions.length === 0 ? : null} {questions.map((question, index) => (
Question {index + 1}
{question}
{answers[index] ?? (part.state.status === "completed" ? "No answer recorded." : "Awaiting answer")}
))}
); }); QuestionPreview.displayName = "QuestionPreview";