import { useState } from 'react';
import { Bot, Check, ChevronDown, Loader2, ShieldAlert, ShieldCheck, X } from 'lucide-react';
import { MarkdownContent } from '@renderer/components/MarkdownContent';
import { permissionDetailSummary, PermissionDetailView } from '@renderer/components/chat/PermissionDetailView';
import type { ApprovalDecision, PendingApprovalRecord } from '@shared/domain/approval';
/* ── ApprovalBanner ────────────────────────────────────────── */
export function ApprovalBanner({
approval,
onResolve,
isResolving,
position,
total,
}: {
approval: PendingApprovalRecord;
onResolve: (decision: ApprovalDecision) => void;
isResolving: boolean;
position?: number;
total?: number;
}) {
const kindLabel = approval.kind === 'final-response' ? 'Final response review' : 'Tool call approval';
const hasMessages = approval.messages && approval.messages.length > 0;
const showPosition = position !== undefined && total !== undefined && total > 1;
return (
{/* Header */}
{approval.title}
{kindLabel}
{showPosition && (
{position} of {total}
)}
{approval.agentName && Agent: {approval.agentName}}
{approval.toolName && Tool: {approval.toolName}}
{approval.permissionKind && Permission: {approval.permissionKind}}
{approval.permissionDetail
?
: approval.detail && (
{approval.detail}
)}
{/* Final-response message preview */}
{hasMessages && (
Pending messages — not yet published
{approval.messages!.map((message) => (
))}
)}
{/* Actions */}
{showPosition && (
Next approval will appear after this one is resolved
)}
);
}
/* ── QueuedApprovalsList ───────────────────────────────────── */
export function QueuedApprovalsList({ approvals }: { approvals: PendingApprovalRecord[] }) {
const [expanded, setExpanded] = useState(false);
return (
{expanded && (
{approvals.map((approval) => {
const kindLabel = approval.kind === 'final-response' ? 'response' : 'tool';
return (
{(approval.permissionDetail && permissionDetailSummary(approval.permissionDetail)) || approval.title}
{kindLabel}
{approval.toolName && (
{approval.toolName}
)}
{approval.agentName && (
{approval.agentName}
)}
);
})}
)}
);
}