diff --git a/packages/views/issues/components/agent-transcript-dialog.tsx b/packages/views/issues/components/agent-transcript-dialog.tsx index 59a3324dd..fa1e5c9e1 100644 --- a/packages/views/issues/components/agent-transcript-dialog.tsx +++ b/packages/views/issues/components/agent-transcript-dialog.tsx @@ -18,6 +18,8 @@ import { Cpu, FileCode, Search, + List, + BarChart3, } from "lucide-react"; import { cn } from "@multica/ui/lib/utils"; import { Dialog, DialogContent, DialogTitle } from "@multica/ui/components/ui/dialog"; @@ -27,6 +29,7 @@ import { Markdown } from "../../common/markdown"; import { api } from "@multica/core/api"; import type { AgentTask, Agent, AgentRuntime } from "@multica/core/types/agent"; import { redactSecrets } from "../utils/redact"; +import { TranscriptGanttChart, TranscriptTokenChart } from "./transcript-charts"; // ─── Types ────────────────────────────────────────────────────────────────── @@ -167,6 +170,7 @@ export function AgentTranscriptDialog({ isLive = false, }: AgentTranscriptDialogProps) { const [selectedIdx, setSelectedIdx] = useState(null); + const [viewMode, setViewMode] = useState<"timeline" | "analytics">("timeline"); const [elapsed, setElapsed] = useState(""); const [copied, setCopied] = useState(false); const [agentInfo, setAgentInfo] = useState(null); @@ -209,12 +213,26 @@ export function AgentTranscriptDialog({ // Click a timeline segment → scroll to event and select it const handleSegmentClick = useCallback((idx: number) => { setSelectedIdx(idx); + setViewMode("timeline"); const el = eventRefs.current.get(idx); if (el) { el.scrollIntoView({ behavior: "smooth", block: "center" }); } }, []); + // Click chart element → switch to timeline and select by seq number + const handleChartEventClick = useCallback((seq: number) => { + const idx = items.findIndex((item) => item.seq === seq); + if (idx >= 0) { + setSelectedIdx(idx); + setViewMode("timeline"); + setTimeout(() => { + const el = eventRefs.current.get(idx); + if (el) el.scrollIntoView({ behavior: "smooth", block: "center" }); + }, 100); + } + }, [items]); + // Copy all events as text const handleCopyAll = useCallback(() => { const text = items @@ -291,6 +309,33 @@ export function AgentTranscriptDialog({ {statusBadge}
+ {/* View mode toggle */} +
+ + +