{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "eve-ask-question",
  "type": "registry:component",
  "title": "Eve Ask Question",
  "description": "Renders Eve's built-in ask_question tool as a standalone question with answer controls, outside the collapsed tool group.",
  "dependencies": [
    "@assistant-ui/react@^0.15.36"
  ],
  "registryDependencies": [
    "https://r.assistant-ui.com/tool-fallback.json"
  ],
  "files": [
    {
      "type": "registry:component",
      "path": "components/eve-ask-question.tsx",
      "sourcePath": "apps/registry/templates/eve/components/eve-ask-question.tsx",
      "content": "\"use client\";\n\nimport {\n  defineToolkit,\n  type ToolCallMessagePartComponent,\n} from \"@assistant-ui/react\";\nimport {\n  ToolFallbackApproval,\n  ToolFallbackResult,\n} from \"@/components/assistant-ui/elements/tool-fallback.aui\";\n\ntype AskQuestionArgs = {\n  question?: string;\n  options?: { label: string; description?: string }[];\n};\n\ntype AskQuestionOutcome =\n  | { answer: string }\n  | { note: string }\n  | { raw: unknown };\n\nconst readOutcome = (\n  result: unknown,\n  isError: boolean | undefined,\n): AskQuestionOutcome | undefined => {\n  if (result === undefined) return undefined;\n  if (!isError && typeof result === \"object\" && result !== null) {\n    if (\"interrupted\" in result && result.interrupted === true)\n      return { note: \"Skipped\" };\n    if (\"status\" in result && result.status === \"unavailable\")\n      return { note: \"Unavailable in this session\" };\n    if (\n      \"status\" in result &&\n      result.status === \"answered\" &&\n      \"answer\" in result &&\n      typeof result.answer === \"string\"\n    )\n      return { answer: result.answer };\n  }\n  if (\n    isError &&\n    typeof result === \"object\" &&\n    result !== null &&\n    \"error\" in result &&\n    typeof result.error === \"string\"\n  )\n    return { note: `Error: ${result.error}` };\n  return { raw: result };\n};\n\nconst EveAskQuestion: ToolCallMessagePartComponent<AskQuestionArgs> = ({\n  args,\n  approval,\n  result,\n  isError,\n  status,\n  respondToApproval,\n}) => {\n  const outcome = readOutcome(result, isError);\n  const settled =\n    approval != null &&\n    (approval.approved !== undefined || approval.resolution !== undefined);\n\n  if (\n    approval != null &&\n    (outcome === undefined ||\n      (settled &&\n        (\"answer\" in outcome || (isError && approval.approved === false))))\n  ) {\n    return (\n      <ToolFallbackApproval\n        className=\"aui-eve-ask-question my-2\"\n        approval={\n          outcome && \"answer\" in outcome && approval.text === undefined\n            ? { ...approval, text: outcome.answer }\n            : approval\n        }\n        respondToApproval={respondToApproval}\n        status={status}\n      />\n    );\n  }\n\n  if (outcome === undefined) return null;\n\n  const prompt = approval?.prompt ?? args.question;\n  return (\n    <div className=\"aui-eve-ask-question my-2 flex flex-col gap-1.5\">\n      {prompt && (\n        <p className=\"text-muted-foreground whitespace-pre-line\">{prompt}</p>\n      )}\n      {\"raw\" in outcome ? (\n        <ToolFallbackResult result={outcome.raw} />\n      ) : (\n        <p className=\"whitespace-pre-line\">\n          {\"answer\" in outcome ? outcome.answer : outcome.note}\n        </p>\n      )}\n    </div>\n  );\n};\n\nexport const eveAskQuestionToolkit = defineToolkit({\n  ask_question: {\n    type: \"backend\",\n    display: \"standalone\",\n    render: EveAskQuestion,\n  },\n});\n"
    }
  ]
}