{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "agent-run",
  "title": "Agent Run",
  "description": "Agent thinking and tool calls, task progress, approvals, and a final run summary.",
  "dependencies": [
    "class-variance-authority"
  ],
  "registryDependencies": [
    "https://uaiblocks.dev/r/uai-theme.json",
    "https://uaiblocks.dev/r/uai-utils.json",
    "https://uaiblocks.dev/r/approval-card.json",
    "https://uaiblocks.dev/r/response-status.json",
    "https://uaiblocks.dev/r/run-summary.json",
    "https://uaiblocks.dev/r/task-list.json",
    "https://uaiblocks.dev/r/thinking.json",
    "https://uaiblocks.dev/r/tool-call.json"
  ],
  "files": [
    {
      "path": "src/registry/uai/blocks/agent-run.tsx",
      "content": "\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport { type ComponentProps, createContext, useContext, useId } from \"react\";\nimport {\n  ApprovalCard,\n  type ApprovalCardProps,\n  type ApprovalCardVariant,\n} from \"@/components/ui/uai/approval-card\";\nimport {\n  ResponseStatus,\n  type ResponseStatusProps,\n  type ResponseStatusVariant,\n} from \"@/components/ui/uai/response-status\";\nimport {\n  RunSummary,\n  type RunSummaryProps,\n  type RunSummaryVariant,\n} from \"@/components/ui/uai/run-summary\";\nimport { TaskList, type TaskListProps, type TaskListVariant } from \"@/components/ui/uai/task-list\";\nimport { Thinking, type ThinkingProps } from \"@/components/ui/uai/thinking\";\nimport { ToolCall, type ToolCallProps, type ToolCallVariant } from \"@/components/ui/uai/tool-call\";\nimport { cn } from \"@/lib/uai-utils\";\n\nexport const AGENT_RUN_VARIANTS = [\"split\", \"stacked\", \"compact\"] as const;\nexport type AgentRunVariant = (typeof AGENT_RUN_VARIANTS)[number];\nexport type AgentRunProps = ComponentProps<\"section\"> & { variant?: AgentRunVariant };\n\ntype RunContext = { id: string; variant: AgentRunVariant };\nconst Context = createContext<RunContext | null>(null);\nfunction useRun(part: string) {\n  const context = useContext(Context);\n  if (!context) throw new Error(`${part} must be used within AgentRun`);\n  return context;\n}\nconst PanelContext = createContext<string | null>(null);\n\nconst statusVariants: Record<AgentRunVariant, ResponseStatusVariant> = {\n  split: \"bar\",\n  stacked: \"bar\",\n  compact: \"pill\",\n};\nconst toolVariants: Record<AgentRunVariant, ToolCallVariant> = {\n  split: \"card\",\n  stacked: \"card\",\n  compact: \"compact\",\n};\nconst taskVariants: Record<AgentRunVariant, TaskListVariant> = {\n  split: \"timeline\",\n  stacked: \"card\",\n  compact: \"compact\",\n};\nconst approvalVariants: Record<AgentRunVariant, ApprovalCardVariant> = {\n  split: \"detailed\",\n  stacked: \"detailed\",\n  compact: \"compact\",\n};\nconst summaryVariants: Record<AgentRunVariant, RunSummaryVariant> = {\n  split: \"card\",\n  stacked: \"card\",\n  compact: \"compact\",\n};\n\nconst agentRunLayoutVariants = cva(\"grid min-w-0 items-start\", {\n  variants: {\n    variant: {\n      split:\n        \"gap-4 @min-[760px]:grid-cols-[minmax(0,1.4fr)_minmax(240px,0.9fr)] @min-[760px]:gap-5\",\n      stacked: \"gap-4\",\n      compact: \"gap-3\",\n    },\n  },\n});\n\n/** An agent run: activity, tasks, approvals, and the final summary. Split moves tasks and approvals beside the activity at 760px. */\nexport function AgentRun({ variant = \"split\", className, children, ...props }: AgentRunProps) {\n  const id = useId();\n  return (\n    <Context.Provider value={{ id, variant }}>\n      <section\n        data-slot=\"agent-run\"\n        aria-labelledby={`${id}-title`}\n        className={cn(\n          \"@container box-border min-w-0 text-[13px]/[18px] text-foreground\",\n          className,\n        )}\n        {...props}\n        data-variant={variant}\n      >\n        <div className={agentRunLayoutVariants({ variant })}>{children}</div>\n      </section>\n    </Context.Provider>\n  );\n}\n\nexport function AgentRunHeader({ className, ...props }: ComponentProps<\"header\">) {\n  const { variant } = useRun(\"AgentRunHeader\");\n  return (\n    <header\n      data-slot=\"agent-run-header\"\n      className={cn(\n        \"grid min-w-0 @min-[760px]:col-span-full\",\n        variant === \"compact\" ? \"gap-2\" : \"gap-3\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nexport function AgentRunHeading({ className, ...props }: ComponentProps<\"div\">) {\n  return (\n    <div data-slot=\"agent-run-heading\" className={cn(\"grid min-w-0 gap-1\", className)} {...props} />\n  );\n}\n\nexport function AgentRunTitle({ className, ...props }: ComponentProps<\"h2\">) {\n  const { id, variant } = useRun(\"AgentRunTitle\");\n  return (\n    <h2\n      data-slot=\"agent-run-title\"\n      className={cn(\n        \"m-0 font-semibold tracking-[-0.01em] wrap-anywhere\",\n        variant === \"compact\" ? \"text-[15px]/5\" : \"text-[18px]/6\",\n        className,\n      )}\n      {...props}\n      id={`${id}-title`}\n    />\n  );\n}\n\nexport function AgentRunDescription({ className, ...props }: ComponentProps<\"p\">) {\n  return (\n    <p\n      data-slot=\"agent-run-description\"\n      className={cn(\"m-0 text-pretty text-muted-foreground\", className)}\n      {...props}\n    />\n  );\n}\n\n/** Where the run stands, with Stop and Retry. Compose Response Status parts inside it. */\nexport function AgentRunStatus(props: Omit<ResponseStatusProps, \"variant\">) {\n  const { variant } = useRun(\"AgentRunStatus\");\n  return <ResponseStatus {...props} variant={statusVariants[variant]} />;\n}\n\nfunction Column({\n  part,\n  slot,\n  className,\n  ...props\n}: ComponentProps<\"div\"> & { part: string; slot: string }) {\n  const { variant } = useRun(part);\n  return (\n    <div\n      data-slot={slot}\n      className={cn(\n        \"grid min-w-0 content-start\",\n        variant === \"compact\" ? \"gap-3\" : \"gap-4\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\n/** The primary column: activity and the final summary. */\nexport function AgentRunMain(props: ComponentProps<\"div\">) {\n  return <Column {...props} part=\"AgentRunMain\" slot=\"agent-run-main\" />;\n}\n\n/** The secondary column: tasks and approvals. */\nexport function AgentRunAside(props: ComponentProps<\"div\">) {\n  return <Column {...props} part=\"AgentRunAside\" slot=\"agent-run-aside\" />;\n}\n\nfunction Panel({\n  part,\n  slot,\n  className,\n  ...props\n}: ComponentProps<\"section\"> & { part: string; slot: string }) {\n  const { variant } = useRun(part);\n  const id = useId();\n  return (\n    <PanelContext.Provider value={id}>\n      <section\n        data-slot={slot}\n        aria-labelledby={id}\n        className={cn(\n          \"grid min-w-0 content-start\",\n          variant === \"compact\" ? \"gap-2\" : \"gap-3\",\n          className,\n        )}\n        {...props}\n      />\n    </PanelContext.Provider>\n  );\n}\n\n/** What the agent is doing. Compose AgentRunLog inside it. */\nexport function AgentRunActivity(props: ComponentProps<\"section\">) {\n  return <Panel {...props} part=\"AgentRunActivity\" slot=\"agent-run-activity\" />;\n}\n\n/** The task plan. Compose AgentRunTaskList inside it. */\nexport function AgentRunTasks(props: ComponentProps<\"section\">) {\n  return <Panel {...props} part=\"AgentRunTasks\" slot=\"agent-run-tasks\" />;\n}\n\n/** Decisions the agent is waiting on. Compose AgentRunApproval inside it. */\nexport function AgentRunApprovals(props: ComponentProps<\"section\">) {\n  return <Panel {...props} part=\"AgentRunApprovals\" slot=\"agent-run-approvals\" />;\n}\n\nexport function AgentRunSectionTitle({ className, ...props }: ComponentProps<\"h3\">) {\n  const id = useContext(PanelContext);\n  if (!id) throw new Error(\"AgentRunSectionTitle must be used within an AgentRun section\");\n  return (\n    <h3\n      data-slot=\"agent-run-section-title\"\n      className={cn(\"m-0 text-[12px]/4 font-medium text-subtle-foreground\", className)}\n      {...props}\n      id={id}\n    />\n  );\n}\n\n/** A `role=\"log\"` list of thinking and tool steps. New steps are announced politely. */\nexport function AgentRunLog({ className, ...props }: ComponentProps<\"div\">) {\n  const { variant } = useRun(\"AgentRunLog\");\n  const id = useContext(PanelContext);\n  return (\n    <div\n      role=\"log\"\n      aria-live=\"polite\"\n      aria-relevant=\"additions\"\n      aria-labelledby={id ?? undefined}\n      data-slot=\"agent-run-log\"\n      className={cn(\n        \"grid min-w-0 content-start\",\n        variant === \"compact\" ? \"gap-1.5\" : \"gap-2\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\n/** Model reasoning and progress. Compose Thinking parts inside it. */\nexport function AgentRunThinking({ className, ...props }: ThinkingProps) {\n  useRun(\"AgentRunThinking\");\n  return <Thinking {...props} className={cn(\"min-w-0\", className)} />;\n}\n\n/** One tool call. Compose Tool Call parts inside it. */\nexport function AgentRunToolCall(props: Omit<ToolCallProps, \"variant\">) {\n  const { variant } = useRun(\"AgentRunToolCall\");\n  return <ToolCall {...props} variant={toolVariants[variant]} />;\n}\n\n/** Task progress. Compose Task List items inside it. */\nexport function AgentRunTaskList(props: Omit<TaskListProps, \"variant\">) {\n  const { variant } = useRun(\"AgentRunTaskList\");\n  return <TaskList {...props} variant={taskVariants[variant]} />;\n}\n\ntype DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;\nexport type AgentRunApprovalProps = DistributiveOmit<ApprovalCardProps, \"variant\">;\n\n/** A decision the run is blocked on. Compose Approval Card parts inside it. */\nexport function AgentRunApproval(props: AgentRunApprovalProps) {\n  const { variant } = useRun(\"AgentRunApproval\");\n  return <ApprovalCard {...(props as ApprovalCardProps)} variant={approvalVariants[variant]} />;\n}\n\n/** The final report. Compose Run Summary parts inside it. */\nexport function AgentRunSummary(props: Omit<RunSummaryProps, \"variant\">) {\n  const { variant } = useRun(\"AgentRunSummary\");\n  return <RunSummary {...props} variant={summaryVariants[variant]} />;\n}\n",
      "type": "registry:component",
      "target": "@components/uai/agent-run.tsx"
    }
  ],
  "categories": [
    "ai",
    "agents",
    "automation"
  ],
  "type": "registry:block"
}