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

ProSince 0.1.0
Filter
Queue
Theme
Accent

Tick 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.

Install#

Agent inbox is part of PixilUI Pro

  • Every Pro item, 2 today and each one added later
  • Installs with shadcn, npx pixilui or MCP
  • The source, Copy prompt and agent notes on every page

$99once

100 founder spots at $99 when Pro opens

The launch email, then product news. Unsubscribe anytime.

  • 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.

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#

PropTypeDefaultDescription
requestsrequiredAgentInboxRequest[]The queue, newest first. Settled requests leave the list; remove them from this array whenever you like.
filterAgentInboxFilterControlled kind filter.
defaultFilterAgentInboxFilter"all"Starting filter when uncontrolled.
onFilterChange(filter: AgentInboxFilter) => voidRuns 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.
labelsPartial<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#

Also in the markdown page and llms.txt
  1. Map your agent requests to AgentInboxRequest: kind approval, question or failed; title in the agent's words; agent and time already formatted.
  2. 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.
  3. onApprove and onReject take an array of ids: one from a card, many from the bulk bar. Bulk reject sends an empty note.
  4. Mark irreversible approvals risk: "high"; bulk approve then asks for a second press too.
  5. Settled requests leave the list on their own; you can also drop them from requests once your store confirms.
  6. Pass each agent's or tool's mark as icon; the block never imports an icon library.