From d8636c2b57bdf8e340e27d743586adbdb0f5b17b Mon Sep 17 00:00:00 2001 From: Ishaan Jaffer Date: Wed, 6 May 2026 15:03:43 -0700 Subject: [PATCH] feat(ui/agents): add GitTab for right panel Combines the active Run's git.branches with live git_commit / pr_opened events. Shows branches, PR link (live event wins over snapshot), and commits sorted newest-first. --- .../agents/components/three-pane/git-tab.tsx | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 ui/litellm-dashboard/src/app/(dashboard)/agents/components/three-pane/git-tab.tsx 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 ( +
+
+ Branches + {run && run.git.branches.length > 0 ? ( +
+ {run.git.branches.map((b) => ( + + {b.name} ← {b.base} + + ))} +
+ ) : ( + + )} +
+ +
+ Pull request + {prUrl ? ( + + {prUrl} + + ) : ( + No PR opened yet. + )} +
+ +
+ Commits + {commits.length === 0 ? ( + + ) : ( + ( + +
+ + {c.sha.slice(0, 7)} + + {c.message} + + {c.branch} + +
+
+ )} + /> + )} +
+
+ ); +}