import React, { useState, useEffect } from "react"; import { motion, AnimatePresence } from "framer-motion"; import { Search, Download, X, Loader2, AlertCircle, Eye, Check, Globe, FileJson, } from "lucide-react"; import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Card, CardContent, CardFooter } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { api, type GitHubAgentFile, type AgentExport } from "@/lib/api"; import { AGENT_ICONS, type AgentIconName } from "./CCAgents"; import { cn } from "@/lib/utils"; interface GitHubAgentBrowserProps { isOpen: boolean; onClose: () => void; onImportSuccess: () => void; } interface AgentPreview { file: GitHubAgentFile; data: AgentExport | null; loading: boolean; error: string | null; } export const GitHubAgentBrowser: React.FC = ({ isOpen, onClose, onImportSuccess, }) => { const [agents, setAgents] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [searchQuery, setSearchQuery] = useState(""); const [selectedAgent, setSelectedAgent] = useState(null); const [importing, setImporting] = useState(false); const [importedAgents, setImportedAgents] = useState>(new Set()); useEffect(() => { if (isOpen) { fetchAgents(); } }, [isOpen]); const fetchAgents = async () => { try { setLoading(true); setError(null); const agentFiles = await api.fetchGitHubAgents(); setAgents(agentFiles); } catch (err) { console.error("Failed to fetch GitHub agents:", err); setError("Failed to fetch agents from GitHub. Please check your internet connection."); } finally { setLoading(false); } }; const handlePreviewAgent = async (file: GitHubAgentFile) => { setSelectedAgent({ file, data: null, loading: true, error: null, }); try { const agentData = await api.fetchGitHubAgentContent(file.download_url); setSelectedAgent({ file, data: agentData, loading: false, error: null, }); } catch (err) { console.error("Failed to fetch agent content:", err); setSelectedAgent({ file, data: null, loading: false, error: "Failed to load agent details", }); } }; const handleImportAgent = async () => { if (!selectedAgent?.file) return; try { setImporting(true); await api.importAgentFromGitHub(selectedAgent.file.download_url); // Mark as imported setImportedAgents(prev => new Set(prev).add(selectedAgent.file.name)); // Close preview setSelectedAgent(null); // Notify parent onImportSuccess(); } catch (err) { console.error("Failed to import agent:", err); alert(`Failed to import agent: ${err instanceof Error ? err.message : "Unknown error"}`); } finally { setImporting(false); } }; const filteredAgents = agents.filter(agent => agent.name.toLowerCase().includes(searchQuery.toLowerCase()) ); const getAgentDisplayName = (fileName: string) => { return fileName.replace(".claudia.json", "").replace(/-/g, " ") .split(" ") .map(word => word.charAt(0).toUpperCase() + word.slice(1)) .join(" "); }; const renderIcon = (iconName: string) => { const Icon = AGENT_ICONS[iconName as AgentIconName] || AGENT_ICONS.bot; return ; }; return ( Import Agent from GitHub
{/* Search Bar */}
setSearchQuery(e.target.value)} className="pl-10" />
{/* Content */}
{loading ? (
) : error ? (

{error}

) : filteredAgents.length === 0 ? (

{searchQuery ? "No agents found matching your search" : "No agents available"}

) : (
{filteredAgents.map((agent, index) => ( handlePreviewAgent(agent)}>

{getAgentDisplayName(agent.name)}

{importedAgents.has(agent.name) && ( Imported )}

{(agent.size / 1024).toFixed(1)} KB

))}
)}
{/* Agent Preview Dialog */} {selectedAgent && ( setSelectedAgent(null)}> Agent Preview
{selectedAgent.loading ? (
) : selectedAgent.error ? (

{selectedAgent.error}

) : selectedAgent.data ? (
{/* Agent Info */}
{renderIcon(selectedAgent.data.agent.icon)}

{selectedAgent.data.agent.name}

{selectedAgent.data.agent.model} {selectedAgent.data.agent.sandbox_enabled && ( Sandbox )}
{/* System Prompt */}

System Prompt

                          {selectedAgent.data.agent.system_prompt}
                        
{/* Default Task */} {selectedAgent.data.agent.default_task && (

Default Task

{selectedAgent.data.agent.default_task}

)} {/* Permissions */}

Permissions

File Read: {selectedAgent.data.agent.enable_file_read ? "Yes" : "No"} File Write: {selectedAgent.data.agent.enable_file_write ? "Yes" : "No"} Network: {selectedAgent.data.agent.enable_network ? "Yes" : "No"}
{/* Metadata */}

Version: {selectedAgent.data.version}

Exported: {new Date(selectedAgent.data.exported_at).toLocaleDateString()}

) : null}
{/* Actions */} {selectedAgent.data && (
)}
)}
); };