Approval Card
A request from an agent that waits for a human before anything leaves the company.
Proposal for Acme Bistro: 4 shoot days a month.
| Plan | Monthly |
|---|---|
| Recurring (6 mo) | $2,560 |
| Annual | $2,240 |
Installation
Once per app, set up Aedis UI. The CLI verifies the signed release before writing anything and pins every dependency:
npx @aedis/cli@0.1.0 initImport the theme once in your global CSS, after Tailwind:
app/globals.css
@import "tailwindcss";@import "./styles/aedis-theme.css";Then add the component:
npx @aedis/cli@0.1.0 add approval-card# pnpm dlx @aedis/cli@0.1.0 add approval-card · yarn dlx @aedis/cli@0.1.0 add approval-card · bunx @aedis/cli@0.1.0 add approval-cardProps
| Prop | Type | Default | Description |
|---|---|---|---|
| requester | string | — | Who asks, usually the agent's name. |
| content | string | — | What is being approved, as untrusted markdown. |
| requestedAt | string | — | Already formatted time. |
| onApprove | () => Promise<string | null> | — | Resolve with an error message to show it, or null. |
| onRequestChanges | (reason) => Promise<string | null> | — | Called with the required reason. |
| labels | Partial<ApprovalCardLabels> | — | Override single strings; the rest comes from the Locale provider (English by default). |
Security
- Approving always goes through an Alert Dialog that starts on Cancel; the app can relabel it, not skip it.
- Requesting changes requires a non-empty reason.
- Content renders through Markdown (no raw HTML, safe links).