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 (
);
}
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 (
);
}
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;
}