import { useEffect, useState } from 'react'; import { listen, UnlistenFn } from '@tauri-apps/api/event'; import { Button } from '@/components/ui'; import { Badge } from '@/components/ui'; import { AlertTriangle, Shield, Terminal, X } from 'lucide-react'; import { respondToShellApprovalCmd } from '@/lib/tauriCommands'; interface ShellApprovalRequest { approval_id: string; command: string; tier: number; reasoning: string; risk_factors: string[]; } export function ShellApprovalModal() { const [request, setRequest] = useState(null); const [isResponding, setIsResponding] = useState(false); useEffect(() => { let unlisten: UnlistenFn; const setupListener = async () => { unlisten = await listen( 'shell:approval-needed', (event) => { setRequest(event.payload); } ); }; setupListener(); return () => { if (unlisten) { unlisten(); } }; }, []); const handleResponse = async (decision: string) => { if (!request) return; setIsResponding(true); try { await respondToShellApprovalCmd(request.approval_id, decision); setRequest(null); } catch (error) { console.error('Failed to respond to approval:', error); } finally { setIsResponding(false); } }; const handleDeny = () => handleResponse('deny'); const handleAllowOnce = () => handleResponse('allow_once'); const handleAllowSession = () => handleResponse('allow_session'); if (!request) return null; return (
{/* Header */}

Command Approval Required

{/* Content */}

This command requires your approval before execution

{/* Command Display */}
Command:
{request.command}
{/* Tier Badge */}
Safety Tier: Tier {request.tier}
{/* Reasoning */}
Why approval is needed:
{request.reasoning}
{/* Risk Factors */} {request.risk_factors.length > 0 && (
Risk Factors:
    {request.risk_factors.map((factor, idx) => (
  • {factor}
  • ))}
)} {/* Safety Notice */}
Safety Controls:
  • Command execution is logged and auditable
  • 30-second timeout protection
  • PII detection before execution
  • Output is captured for review
{/* Footer */}
); }