From fc65fdb451500254242018677397b44ec94cb345 Mon Sep 17 00:00:00 2001 From: yohlo Date: Wed, 26 Aug 2026 22:56:11 -0700 Subject: [PATCH] feat(telemetry): resolve profile and team names in session timelines --- .../components/sessions/session-timeline.tsx | 6 +++ src/features/telemetry/server.ts | 38 ++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) 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: {