Prodular UI

Agent run

AIPro

A live timeline of an agent doing work: the goal, run status and elapsed time, ordered steps with tool calls, approvals and a final result.

npx prodular-ui add agent-run

Part of Prodular UI Pro. Preview and read the docs freely, install with a license. See pricing

Live run

Steps run one after another, tool calls appear as they happen and the run stops for approval before it sends anything. Approve or reject, pause, stop or restart.

Chase overdue invoices for October

Running0sStep 1 of 6
  1. Pull overdue invoices. Running0s
    ledger.invoices.searchstatus open, overdue over 30 days
  2. Match against bank deposits. Queued
  3. Draft reminder emails. Queued
  4. Get approval to send. Queued
  5. Send 12 payment reminders. Queued
  6. Log activity in the CRM. Queued

Step states

Every step carries a status: done with its duration, failed with a retry, skipped, running with a live timer, waiting for approval and queued. Click a tool call with details to expand it.

Resolve ticket #48213: refund for a double charge

Running0sSupport agent
  1. Read the conversation. Done1.2s

    Customer was charged twice for the Team plan on October 14.

  2. Find both charges. Done3.9s
    billing.invoices.getINV-7720910ms
  3. Check refund policy. Failed2.1s

    The policy page timed out. Retried twice.

  4. Escalate to billing team. SkippedSkipped

    Not needed, the duplicate is clear.

  5. Prepare refund of $480.00. Running0s
    billing.refunds.previewch_3Qa4
  6. Approve refund to Pinecrest Labs. Waiting for approvalNeeds approval
  7. Reply to the customer. Queued

Compact, in a table row

The status alone fits a table cell. Open it to see the compact run in a popover.

Work orderSiteTechnicianAgent
WO-3318Harbor Point, unit 4Ana Lucero
WO-3319Elm Street ClinicMarcus Hale
WO-3320Riverside DepotJin Park

Anatomy

<AgentRun status="running">  <AgentRunHeader>    <AgentRunTitle>Chase overdue invoices for October</AgentRunTitle>    <AgentRunMeta>      <AgentRunStatus />      <AgentRunElapsed startedAt={startedAt} />    </AgentRunMeta>    <AgentRunActions>{/* Pause, Stop */}</AgentRunActions>  </AgentRunHeader>  <AgentRunSteps>    <AgentRunStep status="done" title="Pull overdue invoices" duration={1400}>      <AgentRunStepDescription>Found 14 invoices.</AgentRunStepDescription>      <AgentRunToolCalls>        <AgentRunToolCall name="ledger.invoices.search" duration={820} />      </AgentRunToolCalls>    </AgentRunStep>    <AgentRunStep status="running" title="Draft reminder emails" startedAt={stepStart} />    <AgentRunStep status="queued" title="Send reminders" />  </AgentRunSteps>  <AgentRunResult>{/* summary and next actions */}</AgentRunResult></AgentRun>

Guidance

Use it when

  • Use it whenever an agent works for more than a couple of seconds or takes more than one action, so people can see what it is doing and stop it.
  • Use the default size in a side panel or a page, and size="compact" with variant="plain" in popovers, table rows and narrow columns.
  • Name steps by what the agent does, verb first: Pull overdue invoices, Draft reminder emails. Put what it found in AgentRunStepDescription once the step is done.
  • Nest the tools a step called with AgentRunToolCalls, and pass details for raw input and output that people can expand when they need to audit it.
  • Put an Approval inside the waiting step with AgentRunStepContent, so the decision sits where the run stopped.

Avoid

  • Showing only a spinner and a final result. People trust agents they can watch and interrupt.
  • Long technical step names or raw function names as titles. Tool names belong in AgentRunToolCall.
  • More than one running step at the top level. Run parallel work as tool calls or nested steps under one running step.
  • Putting the AgentRun card inside another card. Use variant="plain" when the surrounding surface already is a container.

Rules for AI agents

Published in llms-full.txt, the registry and the MCP server, so coding agents follow them when they build with this component.

  • Give every AgentRunStep an explicit status on every render. Never infer it from position or leave a finished step as running.
  • Keep exactly one top level step running at a time while the run is running. Set the run status to waiting while any step is waiting, and to done, failed or stopped when it ends.
  • Pass startedAt to running steps and to AgentRunElapsed in the header so elapsed time is always visible. Pass duration when a step finishes and endedAt when the run ends.
  • Any step that sends something outside the product, moves money, deletes data or cannot be undone must be preceded by a waiting step that renders an Approval. Do not perform the action until the person approves.
  • Always render a Stop control in AgentRunActions while the run is running or waiting, and stop the underlying work when it is pressed. Mark remaining steps skipped.
  • A failed step shows the reason in AgentRunStepDescription in plain language and offers Retry step in AgentRunStepActions. Never fail silently.
  • Use AgentRunToolCall for every tool the agent calls inside a step, with the real tool name. Do not invent tool calls for decoration.
  • End a finished run with AgentRunResult: what changed, with numbers, and the next action. Mark it with AiMark.

API

AgentRun

PropTypeDefaultDescription
status"queued" | "running" | "paused" | "waiting" | "done" | "failed" | "stopped""running"Status of the whole run. Drives AgentRunStatus and aria-busy.
size"default" | "compact""default"compact tightens spacing and type for popovers and table rows.
variant"card" | "plain""card"plain drops the card chrome so it can sit in a popover, sheet or panel.

AgentRunStatus

PropTypeDefaultDescription
statusAgentRunStatusOptional. Overrides the run status so the badge can be used on its own.

AgentRunElapsed

PropTypeDefaultDescription
startedAtnumberEpoch milliseconds. Ticks every second until endedAt is set.
endedAtnumberFreezes the timer at the final duration.

AgentRunStep

PropTypeDefaultDescription
status"queued" | "running" | "done" | "failed" | "skipped" | "waiting"Required. Exposed as data-status on the step.
titleReactNodeRequired. What the step does, verb first.
startedAtnumberRunning steps show a live elapsed time from here.
durationnumberMilliseconds, shown on done and failed steps.
metaReactNodeReplaces the text on the right of the title.

AgentRunToolCall

PropTypeDefaultDescription
namestringTool name in mono, for example ledger.invoices.search.
status"queued" | "running" | "done" | "failed""done"Running tool calls shimmer and show a spinner.
detailsReactNodeRaw input and output. Makes the row expandable.

Installation

The Prodular UI CLI adds the source to components/ui with everything it depends on. In a project that already uses shadcn/ui, the shadcn CLI installs it from the Prodular registry too. See Installation for the first setup.

npx prodular-ui add agent-run# or, with the registry in components.jsonnpx shadcn@latest add @prodular/agent-run

Used in these screens