ComponentsAI & chat

Plan Outline

A saved agent plan as a read-only outline. The header shows the plan's status, a progress bar, and notices. Groups list their tasks. Each task opens to show its brief, what “done” means, what it waits for, and actions.

Plan state
Spring catalog plan

Launch the spring bulb catalog

Running

Research what sold last spring, confirm supplier stock, then price, describe, and publish 48 varieties.

1 of 5 done · 1 working

  1. Find what sold and what suppliers can ship.

  2. Price, describe, and publish the new varieties.

Usage

A running plan with one groupTSX
import { PlanOutline, type PlanOutlineTask } from "@tulipfarm/sprout/plan-outline";

const tasks: PlanOutlineTask[] = [
  {
    id: "research", title: "Research", mark: "running", label: "1 of 2 done",
    children: [
      { id: "audit", title: "Audit last spring's catalog", mark: "done", label: "Done", assignee: "Main agent" },
      {
        id: "suppliers", title: "Confirm supplier stock", mark: "running", label: "Working",
        criteria: ["Each variety has a confirmed count."],
        dependencies: [{ id: "audit", title: "Audit last spring's catalog", label: "Done" }],
      },
    ],
  },
];

<PlanOutline
  title="Launch the spring bulb catalog"
  status="Running"
  tone="active"
  progress="1 of 2 done · 1 working"
  tasks={tasks}
/>

  • title, brief: the plan name (an h3 that also names the section) and one paragraph under it.
  • status and tone: the badge text and its color. tone is active, attention, done, failed, or neutral.
  • progress: the line under the bar, in words. The bar has one segment per task; cancelled tasks are left out.
  • notice and stale: any content under the progress, such as an Alert.
  • tasks: { id, title, mark, label, assignee?, brief?, criteria?, dependencies?, reason?, action?, children? }[]. A task with children is a group.

Plan Outline has one look and one size. Map your own plan data to tasks in an adapter, as the examples here do. It never ticks, edits, reorders, or assigns tasks.

Marks and tones

Seven marks: pending (clock), running (spinner),attention (question), blocked (lock),done (check), failed (warning), andcancelled (crossed out). Every mark has a textlabel, so color is never the only signal.

Marks and tones7 task marks, 5 plan tones
Plan tone
Meadow garden plan

Meadow garden plan

Running

A fictional example of a saved plan.

1 of 6 done · 1 working · 1 waiting for input · 1 failed

Actions affect this example only.

  1. Measure the bedVerified
  2. Rent a tillerCancelled

Nested groups

Groups start open and can nest. A group's brief shows above its tasks. A group with no tasks says so.

Nested groupsGroups start open; an empty group says so
Damaged order

Resolve damaged order #4821

Running

4 of 7 done · 1 working

  1. Collect what the customer asked for.

    1. Read the support threadMain agentDone
    2. Look up the accountMain agentDone
    1. Refund the damaged tulipsBilling agentDone
    2. Ship from the nearest warehouse.

      1. Pick stock in LeidenWarehouse agentDone
  2. This group has no tasks yet.

Task details

A task with a reason, brief,criteria, dependencies, or actionopens to show them. A failed task's reason is red. Each dependency links to its row and moves focus there, opening its group if it was closed. Tasks with none of these are plain rows.

TSX
{
  id: "pricing",
  title: "Set prices for the spring catalog",
  mark: "attention",
  label: "Needs your review",
  assignee: "Pricing analyst · created for this plan",
  brief: "Use last year's margins and current supplier quotes.",
  criteria: ["No variety sells below a 35% margin."],
  dependencies: [{ id: "audit", title: "Audit last spring's catalog", label: "Done" }],
  action: (
    <Button variant="outline" size="sm" nativeButton={false} render={<Link to={taskUrl} />}>
      Review in task
    </Button>
  ),
}

Pick “Waiting on you” or “Verified” in the playground above to open a task with an action or a verification report.

Notice and stale data

Put alerts and requirement checks in notice. When a refresh fails, keep the last plan and say so in stale.

Notice and stale dataA paused plan with its requirement checks, shown from the last load
Spring catalog plan

Launch the spring bulb catalog

Paused

2 of 5 done · 1 working · 1 need verification

What this plan must achieve

  • 48 varieties are live in the Spring 2026 collectionVerified
  • Every variety keeps a margin of at least 35%

Before work starts

  • Storefront connection can create productsChecked
  • Supplier sheet is shared with the workspaceNot checked

    The sheet owner has not answered yet.

  • Tax rates exist for the NetherlandsBlocked

    No tax rate is set for NL.

  1. Find what sold and what suppliers can ship.

  2. Price, describe, and publish the new varieties.

Someone else's plan

People who did not start the plan see who a task waits for, such as “Waiting for a review”. The link to the task stays, so they can open it.

Someone else's planWaiting tasks name who they wait for; only the starter can answer
Spring catalog plan

Launch the spring bulb catalog

Waiting

Research what sold last spring, confirm supplier stock, then price, describe, and publish 48 varieties.

2 of 5 done · 2 waiting for input

  1. Find what sold and what suppliers can ship.

  2. Price, describe, and publish the new varieties.

Loading, error, and empty

Before a plan loads, show Skeletonlines. When it can't load, use a State Panel. A plan with no tasks says none were added yet.

Loading, error, and emptyThe canvas around the outline, before and without a plan
State
New plan

Long content

Long titles, names, and links wrap. Labels stay at the end of the row.

Long contentLong titles, names, and links wrap inside a narrow canvas
Legacy import

Move supplier deliveries from the legacy accounting export into Supplier deliveries

Waiting

Every row from the 2026 Q3 export lands in the new table with its supplier, invoice, and delivery date.

1 of 2 done · 1 waiting for input

  1. Export https://files.example.com/workspaces/tulipfarm/exports/supplier-deliveries-2026-q3-final-v2.csvData import specialist for the legacy accounting migration · created for this planVerified

Accessibility

The outline is a section named by its title. Tasks are ordered lists named “Tasks” and “Group tasks”. Rows with details are buttons with aria-expanded; Enter and Space open them. Mark icons and the bar are hidden from screen readers; the label and progress text say the same.

Rows open in 180ms and chevrons turn in 120ms. With reduced motion they change at once and the spinner stops.

Theme tokens

Running uses --sprout-info, attention--sprout-warning, done --sprout-success, failed--sprout-danger, and pending, blocked, and cancelled--sprout-muted. Rows hover with --sprout-hover, lines use --sprout-line, and links--sprout-primary.