diff --git a/src/features/telemetry/components/sessions/session-timeline.tsx b/src/features/telemetry/components/sessions/session-timeline.tsx
index 8237783..e13b042 100644
--- a/src/features/telemetry/components/sessions/session-timeline.tsx
+++ b/src/features/telemetry/components/sessions/session-timeline.tsx
@@ -77,6 +77,12 @@ export const SessionTimelineView = ({ sessionId }: { sessionId: string }) => {
style={{ minWidth: 0, flex: 1 }}
>
{entry.label}
+ {entry.detail && entry.kind !== "error" && (
+
+ {" "}
+ ยท {entry.detail}
+
+ )}
{entry.kind === "server_fn" && entry.success === false && (
diff --git a/src/features/telemetry/server.ts b/src/features/telemetry/server.ts
index 510dd0c..7be6f70 100644
--- a/src/features/telemetry/server.ts
+++ b/src/features/telemetry/server.ts
@@ -346,7 +346,43 @@ export const getSessionTimeline = createServerFn()
entries.sort((a, b) => (a.ts < b.ts ? -1 : 1));
- const players = await playerInfoById(new Set(playerId ? [playerId] : []));
+ const profileIds = new Set();
+ const teamIds = new Set();
+ for (const entry of entries) {
+ if (entry.kind !== "page_view") continue;
+ const profileMatch = entry.label.match(/^\/profile\/([^/]+)$/);
+ if (profileMatch) profileIds.add(profileMatch[1]);
+ const teamMatch = entry.label.match(/^\/teams\/([^/]+)$/);
+ if (teamMatch) teamIds.add(teamMatch[1]);
+ }
+
+ const players = await playerInfoById(
+ new Set([...(playerId ? [playerId] : []), ...profileIds])
+ );
+
+ const teamNames = new Map();
+ if (teamIds.size > 0) {
+ try {
+ const teams = await pbAdmin.listTeamInfos();
+ for (const team of teams) {
+ if (teamIds.has(team.id)) teamNames.set(team.id, team.name);
+ }
+ } catch {}
+ }
+
+ for (const entry of entries) {
+ if (entry.kind !== "page_view" || entry.detail) continue;
+ const profileMatch = entry.label.match(/^\/profile\/([^/]+)$/);
+ if (profileMatch) {
+ const player = players.get(profileMatch[1]);
+ if (player) {
+ entry.detail = [player.first_name, player.last_name].filter(Boolean).join(" ");
+ }
+ continue;
+ }
+ const teamMatch = entry.label.match(/^\/teams\/([^/]+)$/);
+ if (teamMatch) entry.detail = teamNames.get(teamMatch[1]);
+ }
return {
session: {