Agent inbox
Everything your agents are waiting on in one queue: approvals, questions and failed runs, with bulk approve and reject, a kind filter and full keyboard control.
Part of Pro, $99 once. What you get
npx shadcn@latest add @pixilui-pro/agent-inboxpnpm dlx shadcn@latest add @pixilui-pro/agent-inboxyarn dlx shadcn@latest add @pixilui-pro/agent-inboxbunx --bun shadcn@latest add @pixilui-pro/agent-inboxnpx pixilui@latest add agent-inboxpnpm dlx pixilui@latest add agent-inboxyarn dlx pixilui@latest add agent-inboxbunx --bun pixilui@latest add agent-inboxTick three approvals, press Approve 3, and they fold out of the queue one after another while a quiet receipt takes the bulk bar's place.
Agent inbox is part of PixilUI Pro
- Every Pro item, 2 today and each one added later
- Installs with shadcn,
npx pixiluior MCP - The source, Copy prompt and agent notes on every page
$99once
100 founder spots at $99 when Pro opens
- Access as soon as you pay
- Updates for life
- A full refund within 14 days if you have not installed or copied any Pro source. After that, a refund only when an item is broken and we cannot fix it within 14 days of your report.
Already have Pro? Log in
Install#
Agent inbox is part of PixilUI Pro
- Every Pro item, 2 today and each one added later
- Installs with shadcn,
npx pixiluior MCP - The source, Copy prompt and agent notes on every page
$99once
100 founder spots at $99 when Pro opens
- Access as soon as you pay
- Updates for life
- A full refund within 14 days if you have not installed or copied any Pro source. After that, a refund only when an item is broken and we cannot fix it within 14 days of your report.
Already have Pro? Log in
npx shadcn@latest add @pixilui-pro/agent-inboxpnpm dlx shadcn@latest add @pixilui-pro/agent-inboxyarn dlx shadcn@latest add @pixilui-pro/agent-inboxbunx --bun shadcn@latest add @pixilui-pro/agent-inboxThe @pixilui-pro registry and your token are set up from your account.
Adds components/pixilui/agent-inbox/agent-inbox.tsx, components/pixilui/agent-inbox/data.ts, components/pixilui/agent-inbox/parts/agent-inbox-detail.tsx, components/pixilui/agent-inbox/parts/agent-inbox-row.tsx. Needs motion, clsx, tailwind-merge.
Usage#
Use it when
- Several agents or runs can stop and wait for a person, and that person needs one place to clear them.
- An operations view where approvals arrive in batches and are approved ten at a time.
- A home for agent questions that would otherwise sit in chat threads.
Use something else when
- A single approval inside a run: use approval-card where the run is shown.
- A notification feed with nothing to decide: use a plain list.
- Human review of model outputs at scale (labelling): that needs a review queue with its own grading UI.
API#
| Prop | Type | Default | Description |
|---|---|---|---|
requestsrequired | AgentInboxRequest[] | The queue, newest first. Settled requests leave the list; remove them from this array whenever you like. | |
filter | AgentInboxFilter | Controlled kind filter. | |
defaultFilter | AgentInboxFilter | "all" | Starting filter when uncontrolled. |
onFilterChange | (filter: AgentInboxFilter) => void | Runs when the filter changes. | |
onApprove | (ids: string[]) => void | Promise<void> | Approves one request (from its card) or many (bulk). Return a promise to show pending; throw to keep them waiting. | |
onReject | (ids: string[], note: string) => void | Promise<void> | Rejects one request with the note from its card, or many with an empty note. | |
onAnswer | (id: string, answer: string) => void | Promise<void> | Sends the person's answer to a question. | |
onRetry | (id: string) => void | Promise<void> | Starts a failed run again. | |
onDismiss | (id: string) => void | Promise<void> | Clears a failed run without retrying. | |
labels | Partial<AgentInboxLabels> | Copy overrides, for translation and house verbs. |
Also takes every native <section> attribute except title, and a ref to it.
Keyboard#
- Tab
- Moves through the bulk actions, the filter, the list (one stop) and the open request.
- ArrowDownArrowUp
- Moves the cursor in the list; the open request follows it.
- ShiftArrowDown
- Extends the selection while moving, for bulk actions.
- Space
- Ticks or unticks the request under the cursor.
- CtrlA
- Ticks every request in the current filter, or clears them all (Cmd on a Mac).
- Esc
- Clears the selection.
- Enter
- Moves focus into the open request; on an approval, Enter again approves it.
- HomeEnd
- Jumps to the first or last request.
Accessibility#
- The list is a multi-select listbox with aria-activedescendant, so focus stays on it while the cursor moves; ticked requests are aria-selected.
- The filter is a group of toggle buttons with aria-pressed and live counts.
- Bulk actions, approvals and answers use aria-busy while pending, never disabled, so focus stays put.
- Every settled request leaves a receipt with a status role; bulk results are announced the same way.
- The open request is a labelled region you can reach with Enter from the list.
Motion#
- Settled requests leave the list by folding their height on the smooth spring; the rows below close the gap.
- The filter's pill slides to the chosen kind on the snappy spring.
- Ticks draw their check on the snappy spring; the bulk bar and its receipt swap in through a 2px blur.
- Approvals fold into their one-line receipt, as approval-card does.
- Reduced motion: rows and receipts fade, the pill jumps.
Responsive#
- Fills its container. The list and the open request sit side by side when there is room (about 600px) and stack below it, list first.
- The bulk bar wraps under the title on narrow screens; long titles truncate in the list and wrap in the open request.
Performance#
- Only the open request renders its full card; the list renders one light row per request.
Notes for AI#
- Map your agent requests to AgentInboxRequest: kind approval, question or failed; title in the agent's words; agent and time already formatted.
- Return promises from onApprove, onReject, onAnswer, onRetry and onDismiss: the inbox shows pending, keeps the request on a thrown error, and removes it when the promise resolves.
- onApprove and onReject take an array of ids: one from a card, many from the bulk bar. Bulk reject sends an empty note.
- Mark irreversible approvals risk: "high"; bulk approve then asks for a second press too.
- Settled requests leave the list on their own; you can also drop them from requests once your store confirms.
- Pass each agent's or tool's mark as icon; the block never imports an icon library.