Tool Approval

A permission prompt for approving an AI agent's tool call — status badge, expandable parameters, and allow / deny actions.

Running

Allow once to watch the live status roll — approving spinner, approved, running, then complete. Replay resets the demo.

Loading…

Installation

CLI
npx @sonojs/ui@latest add tool-approval
Also needsnpx @sonojs/ui@latest add agent-code agent-disclosure && npm i lucide-react motion shiki

Usage

tool-approval.tsx
import {
  ToolApproval,
  ToolApprovalCode,
} from "@/components/sonojs/tool-approval"

export function Example() {
  return (
    <ToolApproval
      tool="bash"
      title="Allow this tool to run?"
      description="Inspect git status before proposing a commit."
      defaultOpen
      parameters={[
        {
          id: "command",
          label: "Command",
          value: (
            <ToolApprovalCode language="bash" code="git status --short" />
          ),
        },
      ]}
      onApprove={() => {}}
      onAlwaysAllow={() => {}}
      onDeny={() => {}}
    />
  )
}

Props

PropTypeDefaultDescription
toolReactNode—Tool name shown in mono under the title.
titleReactNode"Allow this tool to run?"Primary question for the permission prompt.
descriptionReactNode—Optional supporting copy under the tool name.
parametersToolApprovalParameter[][]Expandable detail rows (`id`, `label`, `value`). Use `ToolApprovalCode` for highlighted snippets.
statusToolApprovalStatus"pending"`pending` | `approving` | `approved` | `denied` | `running` | `complete` | `error`.
open / defaultOpen / onOpenChangeboolean / fnuncontrolledControls the parameters disclosure.
onApprove / onAlwaysAllow / onDeny() => void—Pending-state action handlers.
classNamestring—Merge classes on the card root.