diff --git a/ui/litellm-dashboard/src/app/(dashboard)/agents/components/three-pane/git-tab.tsx b/ui/litellm-dashboard/src/app/(dashboard)/agents/components/three-pane/git-tab.tsx new file mode 100644 index 00000000000..fcfc25a8348 --- /dev/null +++ b/ui/litellm-dashboard/src/app/(dashboard)/agents/components/three-pane/git-tab.tsx @@ -0,0 +1,102 @@ +"use client"; + +/** + * GitTab — right pane Git view. + * + * Combines: + * - active Run's git.branches[] + * - live `git_commit` and `pr_opened` events (latest first) + */ +import { Empty, Tag, Typography, List } from "antd"; +import type { CloudAgentRun, CloudAgentRunEvent, GitCommitPayload } from "@/types/cloud-agents"; + +const { Text, Title, Link: AntLink } = Typography; + +interface GitTabProps { + run: CloudAgentRun | null; + events: CloudAgentRunEvent[]; +} + +interface DisplayCommit extends GitCommitPayload { + seq: number; + created_at: string; +} + +function commitsFromEvents(events: CloudAgentRunEvent[]): DisplayCommit[] { + return events + .filter((e) => e.type === "git_commit") + .map((e) => ({ + ...(e.payload as unknown as GitCommitPayload), + seq: e.seq, + created_at: e.created_at, + })) + .sort((a, b) => b.seq - a.seq); +} + +function prUrlFromEvents(events: CloudAgentRunEvent[]): string | null { + const latest = [...events].reverse().find((e) => e.type === "pr_opened"); + if (!latest) return null; + const url = (latest.payload as { url?: unknown }).url; + return typeof url === "string" ? url : null; +} + +export default function GitTab({ run, events }: GitTabProps) { + const commits = commitsFromEvents(events); + const livePrUrl = prUrlFromEvents(events); + const prUrl = livePrUrl ?? run?.git.pr_url ?? null; + + return ( +