KQ-1300 · AGENT/INBOX

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.

KQ-1300 · AGENT/INBOX

Review queue

Waiting6Approved0Sent back0
  1. A approves, R sends back, X selects, Enter shows the files.

    Retry payouts with jitter

    just now

    Adds full jitter to the payout retry backoff, so a bank outage does not end in a burst of retries the moment it recovers.

    retry-tunerbasin/payouts60 lines added, 4 removedChecks passed
  2. A approves, R sends back, X selects, Enter shows the files.

    Raise the webhook timeout to 20 s

    22 min

    Coldbrook acknowledges webhooks in up to 14 s at peak, so the 10 s limit was dropping them.

    ops-runnerbasin/webhooks4 lines added, 2 removedChecks passed
  3. A approves, R sends back, X selects, Enter shows the files.

    Remove the unused ledger export

    49 min

    Deletes the CSV ledger export, which has had no calls in 90 days, and the job that built it.

    cleanupbasin/ledger0 lines added, 223 removedChecks passed
  4. A approves, R sends back, X selects, Enter shows the files.

    Idempotency keys on refunds

    2 h

    Every refund now carries an idempotency key, so a retried refund can never pay out twice.

    retry-tunerbasin/refunds116 lines added, 9 removedChecks runningHigh risk
  5. A approves, R sends back, X selects, Enter shows the files.

    Rename settle_batch to settle_window

    3 h

    Renames the job and its metrics so the name says what it does.

    cleanupbasin/settlement10 lines added, 10 removedChecks passed
  6. A approves, R sends back, X selects, Enter shows the files.

    Round invoice tax per line

    5 h

    Rounds the tax on each line before summing, which is what Coldbrook Bank reconciles against.

    invoice-fixerbasin/invoices33 lines added, 7 removedChecks failed

6 waiting · 0 reviewed

Install

One command — the source lands in your repo. Or copy it from the Code tab.

$ pnpm dlx shadcn@latest add @kinetiq/agent-inbox

Props

swipe
"both" | "approve" | "off"
default "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
default true
Cards carry checkboxes, and a toolbar slides in to approve or send back several at once.
density
"compact" | "cozy" | "roomy"
default "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[]
default 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
default —
Fires from the swipe, button, key or undo that changed a task, with the whole new list.
onApprove
(tasks: InboxTask[]) => void
default —
Tasks were approved: one, or a batch.
onReturn
(tasks: InboxTask[], note: string) => void
default —
Tasks were sent back with this note.
onUndo
(task: InboxTask) => void
default —
A decision was undone; the task is waiting again.
threshold
number
default 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[]
default ["Add tests", "Smaller change", "Wrong place"]
Quick notes offered when sending back; pressing one fills the note.
now
number | Date
default the newest task's time
The moment relative times count from, and the time decisions are stamped with.
status
"ready" | "loading" | "error"
default "ready"
The queue is loading (skeleton cards) or failed to load (a message with Retry).
onRetry
() => void
default —
Retry was pressed after the queue failed to load.
title
string
default "Review queue"
The queue's name, shown in the header.
label
string
default —
The surface's accessible name. Defaults to the title.
sound
boolean
default 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
default false
Read only: nothing can be decided, selected or undone.
className
string
default —
Classes for the root. It is 540px tall by default; pass a height class to change it.