Retry payouts with jitter
just nowAdds full jitter to the payout retry backoff, so a bank outage does not end in a burst of retries the moment it recovers.
KQ-1300 · AGENT/INBOX
A review queue for work agents have finished: each card carries the change (summary, area, a diff summary with its proportion bar, checks and risk) and two decisions. A card follows the finger 1:1 sideways while the decision it is heading for shows underneath and arms on snap past the threshold; the release is projected, so a flick commits and a short throw springs home on snap with its velocity, an approved card leaves on the exit ease while the cards under it close the gap on glide, and sending back opens a note on glide first. Checkboxes select several and a toolbar slides down over the header on snap, the header's counts roll on snap as the queue empties into an inbox-zero state whose check draws on flick and whose badge lands on recoil; the cards are a roving list where Up and Down move, A approves, R sends back, X selects, Enter opens the files and Escape closes a note.
6 waiting · 0 reviewed
One command — the source lands in your repo. Or copy it from the Code tab.
$ pnpm dlx shadcn@latest add @kinetiq/agent-inbox
| Prop | Type | Default | Description |
|---|---|---|---|
| swipe | "both" | "approve" | "off" | "both" | What a sideways swipe does: right approves and left sends back, only right approves (left rubber-bands), or nothing (buttons and keys only). |
| batch | boolean | true | Cards carry checkboxes, and a toolbar slides in to approve or send back several at once. |
| density | "compact" | "cozy" | "roomy" | "cozy" | How much each card says: one line with icon actions, a summary and the diff bar with labelled actions, or a two-line summary with every file and the risk spelled out. |
| tasks / defaultTasks | InboxTask[] | defaultInboxTasks | Every task, waiting and decided: { id, title, agent, area, summary, files: { path, added, removed }[], checks?, risk?, at, status?, note?, decidedAt? }. Controlled or uncontrolled. |
| onTasksChange | (tasks: InboxTask[]) => void | — | Fires from the swipe, button, key or undo that changed a task, with the whole new list. |
| onApprove | (tasks: InboxTask[]) => void | — | Tasks were approved: one, or a batch. |
| onReturn | (tasks: InboxTask[], note: string) => void | — | Tasks were sent back with this note. |
| onUndo | (task: InboxTask) => void | — | A decision was undone; the task is waiting again. |
| threshold | number | 0.4 | How far a card must travel to commit, as a share of its width, 0.2 to 0.8. A flick that would carry it that far commits too. |
| notes | string[] | ["Add tests", "Smaller change", "Wrong place"] | Quick notes offered when sending back; pressing one fills the note. |
| now | number | Date | the newest task's time | The moment relative times count from, and the time decisions are stamped with. |
| status | "ready" | "loading" | "error" | "ready" | The queue is loading (skeleton cards) or failed to load (a message with Retry). |
| onRetry | () => void | — | Retry was pressed after the queue failed to load. |
| title | string | "Review queue" | The queue's name, shown in the header. |
| label | string | — | The surface's accessible name. Defaults to the title. |
| sound | boolean | false | A swish for every decision the visitor makes (up for approve, down for send back), and a chime when their decision empties the queue. |
| disabled | boolean | false | Read only: nothing can be decided, selected or undone. |
| className | string | — | Classes for the root. It is 540px tall by default; pass a height class to change it. |