feat(conversations): Add conversation detail page with new design#112571
Conversation
e86158e to
aab7c4a
Compare
aab7c4a to
95acf9e
Compare
95acf9e to
6fa5c18
Compare
6fa5c18 to
aedfbb5
Compare
Add standalone conversation detail page with breadcrumb navigation, summary header with aggregated stats, and split-panel conversation view. Refactor conversation drawer into reusable ConversationView component shared between the detail page and trace drawer. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
aedfbb5 to
9978f7e
Compare
…wer files - Add conversationId to ParamKeys for useParams type safety - Remove unnecessary non-null assertions in conversationDetail and layout - Fix Flex justify/align values to use design system tokens - Fix IconUser to use variant prop instead of removed color prop - Fix padding token from "none" to "0" - Delete unused conversationDrawer and useUrlConversationDrawer files - Remove unused useConversationDrawerQueryState export
…w-conversations-design
| }, | ||
| {history: 'replace'} | ||
| ); | ||
| } |
There was a problem hiding this comment.
Query param names start/end collide with page filters
High Severity
The useConversationDetailQueryState hook uses start and end as URL query parameter names, which directly collide with Sentry's global page filter URL params (URL_PARAM.START = 'start' and URL_PARAM.END = 'end' defined in pageFilters/constants.tsx). When navigating from the table via getConversationDetailUrl, integer timestamps like ?start=1700000000 get written to the URL, which the page filter system will try to interpret as date strings, corrupting filter state. The deleted code deliberately used prefixed names (conversationStart / conversationEnd) to avoid this exact collision.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit d2ecb9d. Configure here.
| [conversationId, queryState.start, queryState.end] | ||
| ); | ||
|
|
||
| const {nodes, nodeTraceMap, isLoading} = useConversation(conversation); |
There was a problem hiding this comment.
Duplicate useConversation calls cause redundant computation
Low Severity
useConversation(conversation) is called in ConversationDetailContent (to feed ConversationSummary) and again inside ConversationViewContent with the same conversation object. While react-query deduplicates the network request, the useMemo node-creation logic (building AITraceSpanNode objects from API spans) runs independently in both instances, duplicating expensive computation. Lifting the data fetching to the parent and passing results down would avoid this.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit d2ecb9d. Configure here.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
There are 3 total unresolved issues (including 2 from previous reviews).
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit f829710. Configure here.
| errorCount: number; | ||
| llmCalls: number; | ||
| toolCalls: number; | ||
| toolNames: string[]; |
There was a problem hiding this comment.
Computed toolCalls aggregate is never displayed
Low Severity
The toolCalls field is declared in ConversationAggregates, computed in calculateAggregates, and returned — but aggregates.toolCalls is never referenced anywhere in the component's JSX. The "Tool Calls" aggregate item was removed in this refactor, making this field dead code.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit f829710. Configure here.


Add standalone conversation detail page with breadcrumb navigation, summary header with aggregated stats, and split-panel conversation view. Refactor conversation drawer into reusable component shared between the detail page and trace drawer.