From b90b9bf06af23f77d56a4e596519f56eaaae00f0 Mon Sep 17 00:00:00 2001 From: Zvonimir Fras Date: Thu, 13 Aug 2026 07:04:17 -0400 Subject: [PATCH 1/2] feat(suites): fetch conversations in useTestSuiteDetailData Add allConversations state and fetch it in the Promise.all alongside agents, tests, and suite entries. Expose allConversations from the hook so the suite detail page can resolve conversation names for entries. Fixes #6 Signed-off-by: Zvonimir Fras --- .../src/app/test-suites/[id]/useTestSuiteDetailData.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/test-suites/[id]/useTestSuiteDetailData.ts b/frontend/src/app/test-suites/[id]/useTestSuiteDetailData.ts index 3d503bb..40296d4 100644 --- a/frontend/src/app/test-suites/[id]/useTestSuiteDetailData.ts +++ b/frontend/src/app/test-suites/[id]/useTestSuiteDetailData.ts @@ -1,5 +1,5 @@ import { useCallback, useEffect, useState } from 'react'; -import { api, type Agent, type SuiteEntry, type SuiteRun, type Test, type TestSuite } from '../../../lib/api'; +import { api, type Agent, type Conversation, type SuiteEntry, type SuiteRun, type Test, type TestSuite } from '../../../lib/api'; export function useTestSuiteDetailData(suiteId: number) { const [suite, setSuite] = useState(null); @@ -9,6 +9,7 @@ export function useTestSuiteDetailData(suiteId: number) { const [error, setError] = useState(null); const [allTests, setAllTests] = useState([]); const [allSuites, setAllSuites] = useState([]); + const [allConversations, setAllConversations] = useState([]); const [entries, setEntries] = useState([]); const [suiteRuns, setSuiteRuns] = useState([]); @@ -27,15 +28,17 @@ export function useTestSuiteDetailData(suiteId: number) { try { await loadSuiteMeta(); - const [agentsData, allTestsData, entriesData, runsData] = await Promise.all([ + const [agentsData, allTestsData, allConversationsData, entriesData, runsData] = await Promise.all([ api.getAgents(), api.getTests(), + api.getConversations().then((r) => (Array.isArray(r) ? r : r.data)), api.getSuiteEntries(suiteId), api.getSuiteRuns({ suite_id: suiteId, limit: 250 }) ]); setAgents(agentsData); setAllTests(allTestsData); + setAllConversations(allConversationsData); setEntries(entriesData); setSuiteRuns(runsData); setSelectedAgentId((prev) => prev ?? agentsData[0]?.id ?? null); @@ -62,6 +65,7 @@ export function useTestSuiteDetailData(suiteId: number) { loading, error, allTests, + allConversations, allSuites, entries, suiteRuns, From 1ab902c3573180b58425f1b4e64814c6158a1612 Mon Sep 17 00:00:00 2001 From: Zvonimir Fras Date: Thu, 13 Aug 2026 07:04:18 -0400 Subject: [PATCH 2/2] fix(suites): show correct type and name for conversation entries Suite entries linked via conversation_id were displayed as type 'Suite' and name 'Unknown Entry' because getEntryName and the Type cell only handled test_id and child_suite_id. - Add conversation_id branch to getEntryName that looks up the conversation in allConversations - Fix Type cell: conversation entries now render as 'Conversation' instead of falling through to 'Suite' Fixes #6 Signed-off-by: Zvonimir Fras --- frontend/src/app/test-suites/[id]/page.tsx | 12 +++++++++++- .../app/test-suites/[id]/useTestSuiteDetailData.ts | 10 +++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/test-suites/[id]/page.tsx b/frontend/src/app/test-suites/[id]/page.tsx index 77d1cb6..4d0ee52 100644 --- a/frontend/src/app/test-suites/[id]/page.tsx +++ b/frontend/src/app/test-suites/[id]/page.tsx @@ -62,6 +62,7 @@ export default function TestSuiteDetailPage() { loading, error, allTests, + allConversations, allSuites, entries, suiteRuns, @@ -260,6 +261,9 @@ export default function TestSuiteDetailPage() { if (entry.test_id) { const test = allTests.find((t) => t.id === entry.test_id); return test ? test.name : `Test #${entry.test_id}`; + } else if (entry.conversation_id) { + const conversation = allConversations.find((c) => c.id === entry.conversation_id); + return conversation ? conversation.name : `Conversation #${entry.conversation_id}`; } else if (entry.child_suite_id) { const childSuite = allSuites.find((s) => s.id === entry.child_suite_id); return childSuite ? childSuite.name : `Suite #${entry.child_suite_id}`; @@ -573,7 +577,13 @@ export default function TestSuiteDetailPage() { - {entry.test_id ? 'Test' : 'Suite'} + + {entry.test_id + ? 'Test' + : entry.conversation_id + ? 'Conversation' + : 'Suite'} +
{getEntryName(entry)} diff --git a/frontend/src/app/test-suites/[id]/useTestSuiteDetailData.ts b/frontend/src/app/test-suites/[id]/useTestSuiteDetailData.ts index 40296d4..8382522 100644 --- a/frontend/src/app/test-suites/[id]/useTestSuiteDetailData.ts +++ b/frontend/src/app/test-suites/[id]/useTestSuiteDetailData.ts @@ -1,5 +1,13 @@ import { useCallback, useEffect, useState } from 'react'; -import { api, type Agent, type Conversation, type SuiteEntry, type SuiteRun, type Test, type TestSuite } from '../../../lib/api'; +import { + api, + type Agent, + type Conversation, + type SuiteEntry, + type SuiteRun, + type Test, + type TestSuite +} from '../../../lib/api'; export function useTestSuiteDetailData(suiteId: number) { const [suite, setSuite] = useState(null);