import type { ReactNode } from "react"; import { useTranslation } from "react-i18next"; import { Activity, AlertTriangle, CalendarClock, GitBranch, ShieldCheck, Target, UserRound, Users } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import type { JSONObject, TeamConfig, TeamDefinition, TeamRun } from "@/types"; import { formatDateTime } from "@/lib/utils"; export function TeamOverview({ team, activeConfig, runCount, failedRunCount, latestRun, }: { team: TeamDefinition; activeConfig?: TeamConfig; runCount: number; failedRunCount: number; latestRun?: TeamRun; }) { const { t } = useTranslation(); const memberCount = activeConfig?.member_refs_json.length ?? 0; return (
} label={t("common.runs")} value={runCount} /> } label={t("teams.failedRuns")} value={failedRunCount} /> } label={t("teams.members")} value={memberCount} /> } label={t("teams.lastRun")} value={latestRun ? formatDateTime(latestRun.created_time) : t("teams.noRuns")} />

{t("teams.currentObjective")}

{readableLabel(activeConfig?.coordination_mode ?? team.team_type)}

{activeConfig?.objective || team.description || t("teams.noObjectiveProvided")}

{activeConfig ? (
} title={t("teams.members")} /> {activeConfig.member_refs_json.length ? (
{activeConfig.member_refs_json.map((member, index) => ( ))}
) : (

{t("teams.noMembersConfigured")}

)}
} title={t("teams.policy")} /> } label={t("teams.coordination")} value={readableLabel(activeConfig.coordination_mode)} /> } label={t("teams.maxRoundsField")} value={getJsonString(activeConfig.policy_json, "max_rounds") ?? t("teams.none")} /> } label={t("teams.handoff")} value={readableLabel(getJsonString(activeConfig.policy_json, "handoff") ?? t("teams.none"))} />

{t("common.created")}

{formatDateTime(activeConfig.created_time)}

) : (
{t("teams.noTeamConfiguration")}
)}
); } function Signal({ icon, label, value }: { icon: ReactNode; label: string; value: string | number }) { return (
{icon} {label}

{value}

); } function MemberCard({ member, index }: { member: JSONObject; index: number }) { const { t } = useTranslation(); const name = getJsonString(member, "name") ?? getJsonString(member, "agent_name") ?? `${t("teams.member")} ${index + 1}`; const role = getJsonString(member, "role") ?? t("teams.member"); const responsibility = getJsonString(member, "description") ?? getJsonString(member, "responsibility") ?? t("teams.noResponsibilitySummary"); return (

{name}

{getJsonString(member, "agent_id") ?? getJsonString(member, "id") ?? t("teams.unboundAgent")}

{readableLabel(role)}

{responsibility}

); } function PolicyRow({ icon, label, value }: { icon: ReactNode; label: string; value: string }) { return (
{icon}

{label}

{value}

); } function SectionHeader({ icon, title }: { icon: ReactNode; title: string }) { return (
{icon}

{title}

); } function readableLabel(value: string) { return value.split(/[_-]+/).filter(Boolean).map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join(" "); } function getJsonString(value: JSONObject, key: string) { const item = value[key]; if (typeof item === "string" || typeof item === "number" || typeof item === "boolean") return String(item); return undefined; }