diff --git a/ui/web/src/pages/agents/agent-card.tsx b/ui/web/src/pages/agents/agent-card.tsx index 42aaff6f..90372fe8 100644 --- a/ui/web/src/pages/agents/agent-card.tsx +++ b/ui/web/src/pages/agents/agent-card.tsx @@ -1,4 +1,4 @@ -import { Bot, Star, RotateCcw } from "lucide-react"; +import { Bot, Star, RotateCcw, Trash2 } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import type { AgentData } from "@/types/agent"; @@ -7,11 +7,12 @@ interface AgentCardProps { agent: AgentData; onClick: () => void; onResummon?: () => void; + onDelete?: () => void; } const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; -export function AgentCard({ agent, onClick, onResummon }: AgentCardProps) { +export function AgentCard({ agent, onClick, onResummon, onDelete }: AgentCardProps) { const displayName = agent.display_name || (UUID_RE.test(agent.agent_key) ? "Unnamed Agent" : agent.agent_key); @@ -91,6 +92,20 @@ export function AgentCard({ agent, onClick, onResummon }: AgentCardProps) { Resummon )} + {onDelete && ( + + )} ); diff --git a/ui/web/src/pages/agents/agent-detail/agent-detail-page.tsx b/ui/web/src/pages/agents/agent-detail/agent-detail-page.tsx index 9bb589fe..90f4ab17 100644 --- a/ui/web/src/pages/agents/agent-detail/agent-detail-page.tsx +++ b/ui/web/src/pages/agents/agent-detail/agent-detail-page.tsx @@ -2,8 +2,9 @@ import { useState } from "react"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; -import { ArrowLeft, Bot, Star } from "lucide-react"; +import { ArrowLeft, Bot, Star, Trash2 } from "lucide-react"; import { useAgentDetail } from "../hooks/use-agent-detail"; +import { useAgents } from "../hooks/use-agents"; import { AgentGeneralTab } from "./agent-general-tab"; import { AgentConfigTab } from "./agent-config-tab"; import { AgentFilesTab } from "./agent-files-tab"; @@ -11,6 +12,7 @@ import { AgentSharesTab } from "./agent-shares-tab"; import { AgentLinksTab } from "./agent-links-tab"; import { AgentSkillsTab } from "./agent-skills-tab"; import { SummoningModal } from "../summoning-modal"; +import { ConfirmDialog } from "@/components/shared/confirm-dialog"; import { DeferredSpinner } from "@/components/shared/loading-skeleton"; interface AgentDetailPageProps { @@ -37,8 +39,10 @@ function agentSubtitle(agent: { display_name?: string; agent_key: string; id: st export function AgentDetailPage({ agentId, onBack }: AgentDetailPageProps) { const { agent, files, loading, updateAgent, getFile, setFile, regenerateAgent, resummonAgent, refresh } = useAgentDetail(agentId); + const { deleteAgent } = useAgents(); const [summoningOpen, setSummoningOpen] = useState(false); const [activeTab, setActiveTab] = useState("general"); + const [deleteOpen, setDeleteOpen] = useState(false); const handleRegenerate = async (prompt: string) => { await regenerateAgent(prompt); @@ -106,6 +110,14 @@ export function AgentDetailPage({ agentId, onBack }: AgentDetailPageProps) { )} + {/* Tabs */} @@ -161,6 +173,20 @@ export function AgentDetailPage({ agentId, onBack }: AgentDetailPageProps) { onCompleted={() => {}} onResummon={async () => { await resummonAgent(); }} /> + + { + await deleteAgent(agentId); + setDeleteOpen(false); + onBack(); + }} + /> ); } diff --git a/ui/web/src/pages/agents/agents-page.tsx b/ui/web/src/pages/agents/agents-page.tsx index 1b2ca514..530fd48d 100644 --- a/ui/web/src/pages/agents/agents-page.tsx +++ b/ui/web/src/pages/agents/agents-page.tsx @@ -114,6 +114,7 @@ export function AgentsPage() { } }} onResummon={() => handleResummon(agent)} + onDelete={() => setDeleteTarget(agent.id)} /> ))} diff --git a/ui/web/src/pages/teams/team-card.tsx b/ui/web/src/pages/teams/team-card.tsx index 5cf305e3..0074135a 100644 --- a/ui/web/src/pages/teams/team-card.tsx +++ b/ui/web/src/pages/teams/team-card.tsx @@ -1,13 +1,15 @@ -import { Users } from "lucide-react"; +import { Users, Trash2 } from "lucide-react"; import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; import type { TeamData } from "@/types/team"; interface TeamCardProps { team: TeamData; onClick: () => void; + onDelete?: () => void; } -export function TeamCard({ team, onClick }: TeamCardProps) { +export function TeamCard({ team, onClick, onDelete }: TeamCardProps) { return ( + )} ); diff --git a/ui/web/src/pages/teams/team-detail-page.tsx b/ui/web/src/pages/teams/team-detail-page.tsx index 30f9cb2f..48f026d5 100644 --- a/ui/web/src/pages/teams/team-detail-page.tsx +++ b/ui/web/src/pages/teams/team-detail-page.tsx @@ -2,8 +2,9 @@ import { useState, useEffect, useCallback } from "react"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; -import { ArrowLeft, Users } from "lucide-react"; +import { ArrowLeft, Users, Trash2 } from "lucide-react"; import { DeferredSpinner } from "@/components/shared/loading-skeleton"; +import { ConfirmDialog } from "@/components/shared/confirm-dialog"; import { useTeams } from "./hooks/use-teams"; import { TeamMembersTab } from "./team-members-tab"; import { TeamTasksTab } from "./team-tasks-tab"; @@ -17,11 +18,12 @@ interface TeamDetailPageProps { } export function TeamDetailPage({ teamId, onBack }: TeamDetailPageProps) { - const { getTeam, getTeamTasks, addMember, removeMember } = useTeams(); + const { getTeam, getTeamTasks, addMember, removeMember, deleteTeam } = useTeams(); const [team, setTeam] = useState(null); const [members, setMembers] = useState([]); const [loading, setLoading] = useState(true); const [activeTab, setActiveTab] = useState("members"); + const [deleteOpen, setDeleteOpen] = useState(false); const reload = useCallback(async () => { try { @@ -103,6 +105,14 @@ export function TeamDetailPage({ teamId, onBack }: TeamDetailPageProps) {

{team.description}

)} + {/* Tabs */} @@ -137,6 +147,20 @@ export function TeamDetailPage({ teamId, onBack }: TeamDetailPageProps) { + + { + await deleteTeam(teamId); + setDeleteOpen(false); + onBack(); + }} + /> ); } diff --git a/ui/web/src/pages/teams/teams-page.tsx b/ui/web/src/pages/teams/teams-page.tsx index 73815bb7..76a1e7c5 100644 --- a/ui/web/src/pages/teams/teams-page.tsx +++ b/ui/web/src/pages/teams/teams-page.tsx @@ -97,6 +97,7 @@ export function TeamsPage() { key={team.id} team={team} onClick={() => navigate(`/teams/${team.id}`)} + onDelete={() => setDeleteTarget({ id: team.id, name: team.name })} /> ))}