{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "tool",
  "dependencies": [
    "ai"
  ],
  "registryDependencies": [
    "https://taki-ui.com/r/disclosure.json",
    "https://taki-ui.com/r/badge.json",
    "https://taki-ui.com/r/code-block.json"
  ],
  "files": [
    {
      "path": "registry/new-york/ai-elements/tool.tsx",
      "content": "\"use client\"\n\nimport type { ComponentProps, ReactNode } from \"react\"\nimport { isValidElement } from \"react\"\nimport type { ToolUIPart } from \"ai\"\nimport {\n  CheckCircleIcon,\n  ChevronDownIcon,\n  CircleIcon,\n  ClockIcon,\n  WrenchIcon,\n  XCircleIcon,\n} from \"lucide-react\"\nimport { Button } from \"react-aria-components\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Badge } from \"@/registry/new-york/ui/badge\"\nimport { Disclosure, DisclosurePanel } from \"@/registry/new-york/ui/disclosure\"\n\nimport {\n  CodeBlock,\n  CodeBlockBody,\n  CodeBlockContent,\n  CodeBlockCopyButton,\n  CodeBlockFilename,\n  CodeBlockHeader,\n  CodeBlockItem,\n} from \"./code-block\"\n\nexport type ToolProps = ComponentProps<typeof Disclosure>\n\nexport const Tool = ({ className, ...props }: ToolProps) => (\n  <Disclosure\n    className={cn(\"not-prose mb-4 w-full rounded-md border\", className)}\n    {...props}\n  />\n)\n\nexport type ToolHeaderProps = {\n  title?: string\n  type: ToolUIPart[\"type\"]\n  state: ToolUIPart[\"state\"]\n  className?: string\n}\n\nconst getStatusBadge = (status: ToolUIPart[\"state\"]) => {\n  const labels = {\n    \"input-streaming\": \"Pending\",\n    \"input-available\": \"Running\",\n    \"output-available\": \"Completed\",\n    \"output-error\": \"Error\",\n  } as const\n\n  const icons = {\n    \"input-streaming\": <CircleIcon className=\"size-4\" />,\n    \"input-available\": <ClockIcon className=\"size-4 animate-pulse\" />,\n    \"output-available\": <CheckCircleIcon className=\"size-4 text-green-600\" />,\n    \"output-error\": <XCircleIcon className=\"size-4 text-red-600\" />,\n  } as const\n\n  return (\n    <Badge className=\"gap-1.5 rounded-full text-xs\" variant=\"secondary\">\n      {icons[status]}\n      {labels[status]}\n    </Badge>\n  )\n}\n\nexport const ToolHeader = ({\n  className,\n  title,\n  type,\n  state,\n  ...props\n}: ToolHeaderProps) => (\n  <Button\n    slot=\"trigger\"\n    className={cn(\n      \"flex w-full items-center justify-between gap-4 p-3\",\n      className\n    )}\n    {...props}\n  >\n    <div className=\"flex items-center gap-2\">\n      <WrenchIcon className=\"text-muted-foreground size-4\" />\n      <span className=\"text-sm font-medium\">\n        {title ?? type.split(\"-\").slice(1).join(\"-\")}\n      </span>\n      {getStatusBadge(state)}\n    </div>\n    <ChevronDownIcon className=\"text-muted-foreground size-4 transition-transform group-data-[state=open]:rotate-180\" />\n  </Button>\n)\n\nexport type ToolContentProps = ComponentProps<typeof DisclosurePanel>\n\nexport const ToolContent = ({ className, ...props }: ToolContentProps) => (\n  <DisclosurePanel\n    className={cn(\n      \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 text-popover-foreground data-[state=closed]:animate-out data-[state=open]:animate-in outline-none\",\n      className\n    )}\n    {...props}\n  />\n)\n\nexport type ToolInputProps = ComponentProps<\"div\"> & {\n  input: ToolUIPart[\"input\"]\n}\n\nexport const ToolInput = ({ className, input, ...props }: ToolInputProps) => (\n  <div className={cn(\"space-y-2 overflow-hidden p-4\", className)} {...props}>\n    <h4 className=\"text-muted-foreground text-xs font-medium tracking-wide uppercase\">\n      Parameters\n    </h4>\n    <div className=\"bg-muted/50 rounded-md\">\n      <CodeBlock\n        data={[\n          {\n            code: JSON.stringify(input, null, 2),\n            language: \"json\",\n            filename: \"input.json\",\n          },\n        ]}\n      >\n        <CodeBlockBody>\n          {(item) => (\n            <CodeBlockItem key={item.filename} value={item.filename}>\n              <CodeBlockContent language={item.language as any}>\n                {item.code}\n              </CodeBlockContent>\n            </CodeBlockItem>\n          )}\n        </CodeBlockBody>\n      </CodeBlock>\n    </div>\n  </div>\n)\n\nexport type ToolOutputProps = ComponentProps<\"div\"> & {\n  output: ToolUIPart[\"output\"]\n  errorText: ToolUIPart[\"errorText\"]\n}\n\nexport const ToolOutput = ({\n  className,\n  output,\n  errorText,\n  ...props\n}: ToolOutputProps) => {\n  if (!(output || errorText)) {\n    return null\n  }\n\n  let Output = <div>{output as ReactNode}</div>\n\n  if (typeof output === \"object\" && !isValidElement(output)) {\n    Output = (\n      <CodeBlock\n        data={[\n          {\n            code: JSON.stringify(output, null, 2),\n            language: \"json\",\n            filename: \"output.json\",\n          },\n        ]}\n      >\n        <CodeBlockBody>\n          {(item) => (\n            <CodeBlockItem key={item.filename} value={item.filename}>\n              <CodeBlockContent language={item.language as any}>\n                {item.code}\n              </CodeBlockContent>\n            </CodeBlockItem>\n          )}\n        </CodeBlockBody>\n      </CodeBlock>\n    )\n  } else if (typeof output === \"string\") {\n    Output = (\n      <CodeBlock\n        data={[\n          {\n            code: output,\n            language: \"json\",\n            filename: \"output.json\",\n          },\n        ]}\n      >\n        <CodeBlockBody>\n          {(item) => (\n            <CodeBlockItem key={item.filename} value={item.filename}>\n              <CodeBlockContent language={item.language as any}>\n                {item.code}\n              </CodeBlockContent>\n            </CodeBlockItem>\n          )}\n        </CodeBlockBody>\n      </CodeBlock>\n    )\n  }\n\n  return (\n    <div className={cn(\"space-y-2 p-4\", className)} {...props}>\n      <h4 className=\"text-muted-foreground text-xs font-medium tracking-wide uppercase\">\n        {errorText ? \"Error\" : \"Result\"}\n      </h4>\n      <div\n        className={cn(\n          \"overflow-x-auto rounded-md text-xs [&_table]:w-full\",\n          errorText\n            ? \"bg-destructive/10 text-destructive\"\n            : \"bg-muted/50 text-foreground\"\n        )}\n      >\n        {errorText && <div>{errorText}</div>}\n        {Output}\n      </div>\n    </div>\n  )\n}\n",
      "type": "registry:ui"
    }
  ],
  "type": "registry:ui"
}