diff --git a/ui/src/components/transcript/RunTranscriptView.test.tsx b/ui/src/components/transcript/RunTranscriptView.test.tsx
index 41f635d2b3f..3e5a42c7bbb 100644
--- a/ui/src/components/transcript/RunTranscriptView.test.tsx
+++ b/ui/src/components/transcript/RunTranscriptView.test.tsx
@@ -1,6 +1,6 @@
// @vitest-environment node
-import { describe, expect, it } from "vitest";
+import { describe, expect, it, vi } from "vitest";
import { renderToStaticMarkup } from "react-dom/server";
import type { TranscriptEntry } from "../../adapters";
import { ThemeProvider } from "../../context/ThemeContext";
@@ -110,4 +110,31 @@ describe("RunTranscriptView", () => {
expect(html).toMatch(/
]*>posted issue update<\/li>/);
expect(html).not.toContain("result");
});
+
+ it("adds timestamp and age tooltip to raw mode labels", () => {
+ vi.useFakeTimers();
+ vi.setSystemTime(new Date("2026-03-12T00:03:00.000Z"));
+ try {
+ const html = renderToStaticMarkup(
+
+
+ ,
+ );
+
+ expect(html).toContain("Timestamp:");
+ expect(html).toContain("Ago: 3m ago");
+ expect(html).toContain(">stdout");
+ } finally {
+ vi.useRealTimers();
+ }
+ });
});
diff --git a/ui/src/components/transcript/RunTranscriptView.tsx b/ui/src/components/transcript/RunTranscriptView.tsx
index fee3a561e89..887f42f41b6 100644
--- a/ui/src/components/transcript/RunTranscriptView.tsx
+++ b/ui/src/components/transcript/RunTranscriptView.tsx
@@ -1,7 +1,8 @@
import { useMemo, useState } from "react";
import type { TranscriptEntry } from "../../adapters";
import { MarkdownBody } from "../MarkdownBody";
-import { cn, formatTokens } from "../../lib/utils";
+import { timeAgo } from "../../lib/timeAgo";
+import { cn, formatDateTime, formatTokens } from "../../lib/utils";
import {
Check,
ChevronDown,
@@ -136,6 +137,11 @@ function truncate(value: string, max: number): string {
return value.length > max ? `${value.slice(0, Math.max(0, max - 1))}…` : value;
}
+function formatRawEntryTimestampTooltip(ts: string): string {
+ if (Number.isNaN(new Date(ts).getTime())) return ts;
+ return `Timestamp: ${formatDateTime(ts)}; Ago: ${timeAgo(ts)}`;
+}
+
function humanizeLabel(value: string): string {
return value
.replace(/[_-]+/g, " ")
@@ -1365,7 +1371,10 @@ function RawTranscriptView({
"grid-cols-[auto_1fr]",
)}
>
-
+
{entry.kind}