"use client"; import { useState, useEffect, useMemo } from "react"; import { Cloud, ChevronDown, Globe, Lock, Loader2 } from "lucide-react"; import { ProviderLogo } from "../../runtimes/components/provider-logo"; import { ActorAvatar } from "../../common/actor-avatar"; import type { AgentVisibility, RuntimeDevice, MemberWithUser, CreateAgentRequest, } from "@multica/core/types"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, } from "@multica/ui/components/ui/dialog"; import { Popover, PopoverTrigger, PopoverContent, } from "@multica/ui/components/ui/popover"; import { Button } from "@multica/ui/components/ui/button"; import { Input } from "@multica/ui/components/ui/input"; import { Label } from "@multica/ui/components/ui/label"; import { toast } from "sonner"; type RuntimeFilter = "mine" | "all"; export function CreateAgentDialog({ runtimes, runtimesLoading, members, currentUserId, onClose, onCreate, }: { runtimes: RuntimeDevice[]; runtimesLoading?: boolean; members: MemberWithUser[]; currentUserId: string | null; onClose: () => void; onCreate: (data: CreateAgentRequest) => Promise; }) { const [name, setName] = useState(""); const [description, setDescription] = useState(""); const [visibility, setVisibility] = useState("private"); const [creating, setCreating] = useState(false); const [runtimeOpen, setRuntimeOpen] = useState(false); const [runtimeFilter, setRuntimeFilter] = useState("mine"); const getOwnerMember = (ownerId: string | null) => { if (!ownerId) return null; return members.find((m) => m.user_id === ownerId) ?? null; }; const hasOtherRuntimes = runtimes.some((r) => r.owner_id !== currentUserId); const filteredRuntimes = useMemo(() => { const filtered = runtimeFilter === "mine" && currentUserId ? runtimes.filter((r) => r.owner_id === currentUserId) : runtimes; return [...filtered].sort((a, b) => { if (a.owner_id === currentUserId && b.owner_id !== currentUserId) return -1; if (a.owner_id !== currentUserId && b.owner_id === currentUserId) return 1; return 0; }); }, [runtimes, runtimeFilter, currentUserId]); const [selectedRuntimeId, setSelectedRuntimeId] = useState(filteredRuntimes[0]?.id ?? ""); useEffect(() => { if (!selectedRuntimeId && filteredRuntimes[0]) { setSelectedRuntimeId(filteredRuntimes[0].id); } }, [filteredRuntimes, selectedRuntimeId]); const selectedRuntime = runtimes.find((d) => d.id === selectedRuntimeId) ?? null; const handleSubmit = async () => { if (!name.trim() || !selectedRuntime) return; setCreating(true); try { await onCreate({ name: name.trim(), description: description.trim(), runtime_id: selectedRuntime.id, visibility, }); onClose(); } catch (err) { toast.error(err instanceof Error ? err.message : "Failed to create agent"); setCreating(false); } }; return ( { if (!v) onClose(); }}> Create Agent Create a new AI agent for your workspace.
setName(e.target.value)} placeholder="e.g. Deep Research Agent" className="mt-1" onKeyDown={(e) => e.key === "Enter" && handleSubmit()} />
setDescription(e.target.value)} placeholder="What does this agent do?" className="mt-1" />
{hasOtherRuntimes && (
)}
{runtimesLoading ? ( ) : selectedRuntime ? ( ) : ( )}
{runtimesLoading ? "Loading runtimes..." : (selectedRuntime?.name ?? "No runtime available")} {selectedRuntime?.runtime_mode === "cloud" && ( Cloud )}
{selectedRuntime ? (getOwnerMember(selectedRuntime.owner_id)?.name ?? selectedRuntime.device_info) : "Register a runtime before creating an agent"}
{filteredRuntimes.map((device) => { const ownerMember = getOwnerMember(device.owner_id); return ( ); })}
); }