Chat Plan
A plan an agent proposed in chat. Each step shows if it is not started, in progress, complete, or failed. The header counts completed steps.
Fill in missing suppliers
2 of 4 completeFind deliveries with no supplier · Complete
Search the Supplier deliveries table for empty Supplier fields.
Match each delivery to a supplier by invoice number · Complete
Show the matches for review · In progress
Nothing changes until you approve.
Update 42 delivery records · Not started
Usage
import { ChatPlan, type ChatPlanStep } from "@tulipfarm/sprout/chat-plan";
const steps: ChatPlanStep[] = [
{ id: "find", title: "Find deliveries with no supplier", state: "complete" },
{ id: "match", title: "Match each delivery to a supplier", state: "running" },
{ id: "update", title: "Update 42 delivery records", state: "pending" },
];
<ChatPlan title="Fill in missing suppliers" steps={steps} />title: the plan name. It also names the section.steps:{ id, title, detail?, state }[], in order.stateispending,running,complete, orerror.detailis one optional line under the title.
Chat Plan has one look and one size. It fills the width it gets.
Step states
Complete shows a green check, in progress a spinner, failed a red warning, and not started a clock.
Fictional garden plan
1 of 4 completeChoose a patch · Complete
A sunny place near water.
Prepare the soil · In progress
Order bulbs · Failed
The sample supplier is unavailable.
Plant the bulbs · Not started
Empty plan
With no steps, the plan says none were proposed yet.
New plan
0 of 0 completeNo steps have been proposed yet.
In the canvas
A to-do result opens in the Canvas. Wrap the plan in CanvasSection with no title, so the plan's own title leads.
<CanvasSection>
<ChatPlan title={item.title} steps={item.steps} />
</CanvasSection>Launch checklist
2 of 5 completeDraft the launch brief · Complete
Saved to Launch week › Brief.
Pull the press contact list from Contacts · Complete
86 contacts tagged Press.
Write the announcement emails · In progress
Schedule sends for Tuesday 9:00 · Not started
Report opens and replies on Friday · Not started
Long content
Long titles, links, and details wrap. The count moves below the title when space runs out.
Move supplier deliveries from the legacy accounting export
1 of 3 completeExport https://files.example.com/workspaces/tulipfarm/exports/supplier-deliveries-2026-q3-final-v2.csv · Complete
The export finished with 1,204 rows and 18 columns.
Import the rows into Supplier deliveries · Failed
The column InvoiceReferenceNumberFromLegacyAccountingSystem has no matching field. Pick a field or skip the column.
Tell the operations channel when the import is done · Not started
Accessibility
The plan is a section named by its title, which is anh4. Steps are an ordered list. Icons are hidden; each step ends with hidden text such as “In progress” or “Failed”, so screen readers hear the state.
When a step changes state its icon fades in over 180ms; with reduced motion it changes at once.
Theme tokens
The border uses --sprout-line, muted text and pending icons--sprout-muted, complete icons--sprout-success, and failed icons--sprout-danger.