- BuildingCompiling TypeScript and bundling assets
- Running Tests147 tests across 23 suites
- Deploy to ProductionUpload to edge nodes
<ProgressTracker id="progress-tracker-in-progress" steps={[ { "id": "build", "label": "Building", "description": "Compiling TypeScript and bundling assets", "status": "completed" }, { "id": "test", "label": "Running Tests", "description": "147 tests across 23 suites", "status": "in-progress" }, { "id": "deploy", "label": "Deploy to Production", "description": "Upload to edge nodes", "status": "pending" } ]} elapsedTime={43200}/>Run this once from your project root.
npx shadcn@latest add @tool-ui/progress-trackerRender ProgressTracker in your UI with tool-compatible props.
import { ProgressTracker } from "@/components/tool-ui/progress-tracker";export function Example() { return ( <ProgressTracker id="progress-tracker-example" steps={[ { id: "build", label: "Building", description: "Compiling TypeScript and bundling assets", status: "completed", }, { id: "test", label: "Running Tests", description: "147 tests across 23 suites", status: "in-progress", }, { id: "deploy", label: "Deploy to Production", description: "Upload to edge nodes", status: "pending", }, ]} elapsedTime={43200} /> );}Register this renderer so tool results display as ProgressTracker.
"use client";import { type Toolkit } from "@assistant-ui/react";import { ProgressTracker } from "@/components/tool-ui/progress-tracker";import { safeParseSerializableProgressTracker } from "@/components/tool-ui/progress-tracker/schema";import { createResultToolRenderer } from "@/components/tool-ui/shared";export const toolkit: Toolkit = { trackProgress: { type: "backend", render: createResultToolRenderer({ safeParse: safeParseSerializableProgressTracker, render: (parsedResult) => <ProgressTracker {...parsedResult} />, }), },};These snippets use assistant-ui for end-to-end wiring, but the ProgressTracker component itself is framework-agnostic at the UI layer: you can use it in any React codebase with any LLM SDK or tool-calling interface that can provide compatible props.
ProgressTracker v2 is display-only and result-driven: render it from backend tool result updates. For interactive decisions or confirmations, use dedicated decision surfaces like Option List or Preferences Panel.
Visual states for pending, in-progress, completed, and failed steps
Optional time tracking with automatic formatting
Failed step indicators with descriptive error messages
Terminal state view showing complete operation history
Each step has one of four statuses:
The component automatically highlights the current step (first in-progress, otherwise first failed, otherwise first pending) with a subtle background and aria-current="step" for accessibility.
Use the choice prop to render a terminal state after an operation completes, fails, or is cancelled. The receipt displays the full step history with an outcome indicator, which works well in conversation history.
Receipt features:
success, partial, failed, and cancelled outcomesrole="status" for screen reader announcementsPass elapsedTime in milliseconds to display a timer badge. Automatically formatted as:
3.4s2m 15sProp
Type
Prop
Type
Prop
Type
<article> with role="status" and aria-live="polite" for live updatesaria-busy indicates when an operation is in progressaria-current="step" marks the currently active step<ol> / <li>)<time> and machine-readable dateTimeprefers-reduced-motion