import { Server, ArrowUpCircle, ChevronDown, Check } from "lucide-react"; import { useQuery } from "@tanstack/react-query"; import type { AgentRuntime, MemberWithUser } from "@multica/core/types"; import { useWorkspaceId } from "@multica/core/hooks"; import { memberListOptions } from "@multica/core/workspace/queries"; import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, } from "@multica/ui/components/ui/dropdown-menu"; import { ActorAvatar } from "../../common/actor-avatar"; import { PageHeader } from "../../layout/page-header"; import { ProviderLogo } from "./provider-logo"; type RuntimeFilter = "mine" | "all"; function RuntimeListItem({ runtime, isSelected, ownerMember, hasUpdate, onClick, }: { runtime: AgentRuntime; isSelected: boolean; ownerMember: MemberWithUser | null; hasUpdate: boolean; onClick: () => void; }) { return ( ); } export function RuntimeList({ runtimes, selectedId, onSelect, filter, onFilterChange, ownerFilter, onOwnerFilterChange, updatableIds, }: { runtimes: AgentRuntime[]; selectedId: string; onSelect: (id: string) => void; filter: RuntimeFilter; onFilterChange: (filter: RuntimeFilter) => void; ownerFilter: string | null; onOwnerFilterChange: (ownerId: string | null) => void; updatableIds?: Set; }) { const wsId = useWorkspaceId(); const { data: members = [] } = useQuery(memberListOptions(wsId)); const getOwnerMember = (ownerId: string | null) => { if (!ownerId) return null; return members.find((m) => m.user_id === ownerId) ?? null; }; // Get unique owners from runtimes for filter dropdown const uniqueOwners = filter === "all" ? Array.from(new Set(runtimes.map((r) => r.owner_id).filter(Boolean) as string[])) .map((id) => members.find((m) => m.user_id === id)) .filter(Boolean) as MemberWithUser[] : []; // Count runtimes per owner const ownerCounts = new Map(); for (const r of runtimes) { if (r.owner_id) ownerCounts.set(r.owner_id, (ownerCounts.get(r.owner_id) ?? 0) + 1); } // Apply client-side owner filter when in "all" mode const filteredRuntimes = filter === "all" && ownerFilter ? runtimes.filter((r) => r.owner_id === ownerFilter) : runtimes; const selectedOwner = ownerFilter ? getOwnerMember(ownerFilter) : null; return (

Runtimes

{filteredRuntimes.filter((r) => r.status === "online").length}/ {filteredRuntimes.length} online
{/* Filter bar */}
{/* Scope toggle */}
{/* Owner dropdown (only in All mode with multiple owners) */} {filter === "all" && uniqueOwners.length > 1 && ( } > {selectedOwner ? ( <> {selectedOwner.name} ) : ( Owner )} onOwnerFilterChange(null)} className="flex items-center justify-between" > All owners {!ownerFilter && } {uniqueOwners.map((m) => ( onOwnerFilterChange(ownerFilter === m.user_id ? null : m.user_id)} className="flex items-center justify-between" >
{m.name} {ownerCounts.get(m.user_id) ?? 0}
{ownerFilter === m.user_id && }
))}
)}
{filteredRuntimes.length === 0 ? (

{filter === "mine" ? "No runtimes owned by you" : ownerFilter ? "No runtimes for this owner" : "No runtimes registered"}

Run{" "} multica daemon start {" "} to register a local runtime.

) : (
{filteredRuntimes.map((runtime) => ( onSelect(runtime.id)} /> ))}
)}
); }