// ======================================== // CodexLens Semantic Install Dialog // ======================================== // Dialog for installing semantic search dependencies with GPU mode selection import { useState } from 'react'; import { useIntl } from 'react-intl'; import { Cpu, Zap, Monitor, CheckCircle2, AlertCircle, } from 'lucide-react'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/Dialog'; import { Button } from '@/components/ui/Button'; import { RadioGroup, RadioGroupItem } from '@/components/ui/RadioGroup'; import { Label } from '@/components/ui/Label'; import { Card, CardContent } from '@/components/ui/Card'; import { useNotifications } from '@/hooks/useNotifications'; import { useCodexLensMutations } from '@/hooks'; import { cn } from '@/lib/utils'; type GpuMode = 'cpu' | 'cuda' | 'directml'; interface GpuModeOption { value: GpuMode; label: string; description: string; icon: React.ReactNode; recommended?: boolean; } interface SemanticInstallDialogProps { open: boolean; onOpenChange: (open: boolean) => void; onSuccess?: () => void; } export function SemanticInstallDialog({ open, onOpenChange, onSuccess }: SemanticInstallDialogProps) { const { formatMessage } = useIntl(); const { success, error: showError } = useNotifications(); const { installSemantic, isInstallingSemantic } = useCodexLensMutations(); const [selectedMode, setSelectedMode] = useState('cpu'); const gpuModes: GpuModeOption[] = [ { value: 'cpu', label: formatMessage({ id: 'codexlens.semantic.gpu.cpu' }), description: formatMessage({ id: 'codexlens.semantic.gpu.cpuDesc' }), icon: , }, { value: 'directml', label: formatMessage({ id: 'codexlens.semantic.gpu.directml' }), description: formatMessage({ id: 'codexlens.semantic.gpu.directmlDesc' }), icon: , recommended: true, }, { value: 'cuda', label: formatMessage({ id: 'codexlens.semantic.gpu.cuda' }), description: formatMessage({ id: 'codexlens.semantic.gpu.cudaDesc' }), icon: , }, ]; const handleInstall = async () => { try { const result = await installSemantic(selectedMode); if (result.success) { success( formatMessage({ id: 'codexlens.semantic.installSuccess' }), result.message || formatMessage({ id: 'codexlens.semantic.installSuccessDesc' }, { mode: selectedMode }) ); onSuccess?.(); onOpenChange(false); } else { throw new Error(result.message || 'Installation failed'); } } catch (err) { showError( formatMessage({ id: 'codexlens.semantic.installFailed' }), err instanceof Error ? err.message : formatMessage({ id: 'codexlens.semantic.unknownError' }) ); } }; return ( {formatMessage({ id: 'codexlens.semantic.installTitle' })} {formatMessage({ id: 'codexlens.semantic.installDescription' })}
{/* Info Card */}
{formatMessage({ id: 'codexlens.semantic.installInfo' })}
{/* GPU Mode Selection */} setSelectedMode(v as GpuMode)}>
{gpuModes.map((mode) => (
{mode.icon}
{mode.recommended && ( {formatMessage({ id: 'codexlens.semantic.recommended' })} )}

{mode.description}

))}
); } export default SemanticInstallDialog;