@mastra/playground-ui 65.0.0-alpha.1 → 65.0.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ChatShell.cjs.js +2 -2
- package/dist/components/ChatShell.cjs.js.map +1 -1
- package/dist/components/ChatShell.es.js +2 -2
- package/dist/components/ChatShell.es.js.map +1 -1
- package/dist/components/Composer.cjs.js +1 -1
- package/dist/components/Composer.cjs.js.map +1 -1
- package/dist/components/Composer.es.js +1 -1
- package/dist/components/Composer.es.js.map +1 -1
- package/dist/components/DataList.cjs.js +17 -15
- package/dist/components/DataList.cjs.js.map +1 -1
- package/dist/components/DataList.es.js +5 -4
- package/dist/components/DataList.es.js.map +1 -1
- package/dist/components/EnvironmentVariablesEditor.cjs.js +1 -1
- package/dist/components/EnvironmentVariablesEditor.es.js +1 -1
- package/dist/components/LogsDataList.cjs.js +2 -5
- package/dist/components/LogsDataList.cjs.js.map +1 -1
- package/dist/components/LogsDataList.es.js +2 -5
- package/dist/components/LogsDataList.es.js.map +1 -1
- package/dist/components/MessageScroller.cjs.js +1 -1
- package/dist/components/MessageScroller.es.js +1 -1
- package/dist/components/SavedViews.cjs.js +0 -1
- package/dist/components/SavedViews.cjs.js.map +1 -1
- package/dist/components/SavedViews.es.js +0 -1
- package/dist/components/SavedViews.es.js.map +1 -1
- package/dist/components/fluid-hover-highlight.cjs.js +7 -1
- package/dist/components/fluid-hover-highlight.cjs.js.map +1 -1
- package/dist/components/fluid-hover-highlight.es.js +7 -1
- package/dist/components/fluid-hover-highlight.es.js.map +1 -1
- package/dist/data-list-CmjTe8xE.cjs +142 -0
- package/dist/data-list-CmjTe8xE.cjs.map +1 -0
- package/dist/data-list-DT1LVR29.js +138 -0
- package/dist/data-list-DT1LVR29.js.map +1 -0
- package/dist/{data-list-skeleton-CGKlcoiI.js → data-list-skeleton-bNfITSHs.js} +2 -2
- package/dist/{data-list-skeleton-CGKlcoiI.js.map → data-list-skeleton-bNfITSHs.js.map} +1 -1
- package/dist/{data-list-skeleton-DGMTqeNP.cjs → data-list-skeleton-sdcaabdX.cjs} +6 -6
- package/dist/{data-list-skeleton-DGMTqeNP.cjs.map → data-list-skeleton-sdcaabdX.cjs.map} +1 -1
- package/dist/data-list-spacer-CdlT6bDd.cjs +218 -0
- package/dist/data-list-spacer-CdlT6bDd.cjs.map +1 -0
- package/dist/data-list-spacer-D--gDmOm.js +209 -0
- package/dist/data-list-spacer-D--gDmOm.js.map +1 -0
- package/dist/{data-list-ecHsw-zr.cjs → data-list-top-DJh08vFA.cjs} +14 -347
- package/dist/data-list-top-DJh08vFA.cjs.map +1 -0
- package/dist/{data-list-DdCZZctL.js → data-list-top-T-mtdIUp.js} +6 -340
- package/dist/data-list-top-T-mtdIUp.js.map +1 -0
- package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +0 -4
- package/dist/domains/chat/tools/badges/workflow-badge.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/workflow-badge.es.js +0 -4
- package/dist/domains/chat/tools/badges/workflow-badge.es.js.map +1 -1
- package/dist/domains/logs/components/logs-list-view.cjs.js +2 -3
- package/dist/domains/logs/components/logs-list-view.cjs.js.map +1 -1
- package/dist/domains/logs/components/logs-list-view.es.js +2 -3
- package/dist/domains/logs/components/logs-list-view.es.js.map +1 -1
- package/dist/domains/scores/components/trace-scores-tab.cjs.js +1 -2
- package/dist/domains/scores/components/trace-scores-tab.cjs.js.map +1 -1
- package/dist/domains/scores/components/trace-scores-tab.es.js +1 -2
- package/dist/domains/scores/components/trace-scores-tab.es.js.map +1 -1
- package/dist/domains/traces/components/format-hierarchical-spans.cjs.js +12 -13
- package/dist/domains/traces/components/format-hierarchical-spans.cjs.js.map +1 -1
- package/dist/domains/traces/components/format-hierarchical-spans.es.js +12 -13
- package/dist/domains/traces/components/format-hierarchical-spans.es.js.map +1 -1
- package/dist/domains/traces/components/span-rows.cjs.js +2 -1
- package/dist/domains/traces/components/span-rows.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-rows.es.js +2 -1
- package/dist/domains/traces/components/span-rows.es.js.map +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-list.cjs.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-list.es.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-root.cjs.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-root.es.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-row.cjs.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-row.es.js +1 -1
- package/dist/domains/traces/components/thread-view-by-trace.cjs.js +0 -1
- package/dist/domains/traces/components/thread-view-by-trace.cjs.js.map +1 -1
- package/dist/domains/traces/components/thread-view-by-trace.es.js +0 -1
- package/dist/domains/traces/components/thread-view-by-trace.es.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel.cjs.js +0 -3
- package/dist/domains/traces/components/trace-data-panel.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel.es.js +0 -3
- package/dist/domains/traces/components/trace-data-panel.es.js.map +1 -1
- package/dist/domains/traces/components/trace-span-timeline.cjs.js +2 -1
- package/dist/domains/traces/components/trace-span-timeline.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-span-timeline.es.js +2 -1
- package/dist/domains/traces/components/trace-span-timeline.es.js.map +1 -1
- package/dist/domains/traces/components/traces-list-view.cjs.js +5 -4
- package/dist/domains/traces/components/traces-list-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-list-view.es.js +4 -3
- package/dist/domains/traces/components/traces-list-view.es.js.map +1 -1
- package/dist/domains/traces/components/traces-page-skeleton.cjs.js +1 -4
- package/dist/domains/traces/components/traces-page-skeleton.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-page-skeleton.es.js +1 -4
- package/dist/domains/traces/components/traces-page-skeleton.es.js.map +1 -1
- package/dist/domains/traces/utils/span-timing.cjs.js +10 -0
- package/dist/domains/traces/utils/span-timing.cjs.js.map +1 -1
- package/dist/domains/traces/utils/span-timing.es.js +10 -1
- package/dist/domains/traces/utils/span-timing.es.js.map +1 -1
- package/dist/domains/workflows/components/workflows-list/workflows-list.cjs.js +2 -2
- package/dist/domains/workflows/components/workflows-list/workflows-list.es.js +2 -2
- package/dist/domains/workflows/workflow/workflow-input-data.cjs.js +0 -1
- package/dist/domains/workflows/workflow/workflow-input-data.cjs.js.map +1 -1
- package/dist/domains/workflows/workflow/workflow-input-data.es.js +0 -1
- package/dist/domains/workflows/workflow/workflow-input-data.es.js.map +1 -1
- package/dist/ee/signals/components/entity-index-list.cjs.js +1 -3
- package/dist/ee/signals/components/entity-index-list.cjs.js.map +1 -1
- package/dist/ee/signals/components/entity-index-list.es.js +1 -3
- package/dist/ee/signals/components/entity-index-list.es.js.map +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +1 -3
- package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js.map +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +1 -3
- package/dist/ee/signals/components/trace-intelligence-entity-index.es.js.map +1 -1
- package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +1 -1
- package/dist/ee/topics/components/topic-trace-summary-list.es.js +1 -1
- package/dist/hooks/use-fluid-hover.cjs.js +3 -2
- package/dist/hooks/use-fluid-hover.cjs.js.map +1 -1
- package/dist/hooks/use-fluid-hover.es.js +3 -2
- package/dist/hooks/use-fluid-hover.es.js.map +1 -1
- package/dist/layout/tabbed-container.cjs.js +1 -1
- package/dist/layout/tabbed-container.es.js +1 -1
- package/dist/{logs-data-list-DBJINzIL.js → logs-data-list-Cb85LPcT.js} +3 -2
- package/dist/{logs-data-list-DBJINzIL.js.map → logs-data-list-Cb85LPcT.js.map} +1 -1
- package/dist/{logs-data-list-IWZgMCKG.cjs → logs-data-list-DlQxxrNw.cjs} +22 -21
- package/dist/{logs-data-list-IWZgMCKG.cjs.map → logs-data-list-DlQxxrNw.cjs.map} +1 -1
- package/dist/{message-scroller-CS1KxKn6.js → message-scroller-C6gXU5d5.js} +2 -2
- package/dist/{message-scroller-CS1KxKn6.js.map → message-scroller-C6gXU5d5.js.map} +1 -1
- package/dist/{message-scroller-C4fH6uJg.cjs → message-scroller-fjucuCuw.cjs} +2 -2
- package/dist/{message-scroller-C4fH6uJg.cjs.map → message-scroller-fjucuCuw.cjs.map} +1 -1
- package/dist/scroll-area-CAY0DNQj.cjs.map +1 -1
- package/dist/scroll-area-MaMqo4l8.js.map +1 -1
- package/dist/src/domains/traces/utils/span-timing.d.ts +2 -0
- package/dist/src/ds/components/ChatShell/chat-shell.d.ts +3 -2
- package/dist/src/ds/components/ScrollArea/scroll-area.d.ts +4 -0
- package/dist/src/hooks/use-fluid-hover.d.ts +1 -0
- package/dist/style.css +10 -12
- package/dist/{traces-data-list-BH24OVKh.cjs → traces-data-list-Bhhg9drs.cjs} +20 -18
- package/dist/{traces-data-list-BH24OVKh.cjs.map → traces-data-list-Bhhg9drs.cjs.map} +1 -1
- package/dist/{traces-data-list-BOJB37dV.js → traces-data-list-DMWPJFBc.js} +4 -2
- package/dist/{traces-data-list-BOJB37dV.js.map → traces-data-list-DMWPJFBc.js.map} +1 -1
- package/package.json +9 -9
- package/dist/data-list-DdCZZctL.js.map +0 -1
- package/dist/data-list-ecHsw-zr.cjs.map +0 -1
|
@@ -5,7 +5,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
5
5
|
const jsxRuntime = require('react/jsx-runtime');
|
|
6
6
|
const reactResizablePanels = require('react-resizable-panels');
|
|
7
7
|
const domains_traces_components_threadTrace_threadTraceContext = require('./thread-trace-context.cjs.js');
|
|
8
|
-
const messageScroller = require('../../../../message-scroller-
|
|
8
|
+
const messageScroller = require('../../../../message-scroller-fjucuCuw.cjs');
|
|
9
9
|
const utils_cn = require('../../../../cn-DlOJCxrS.cjs');
|
|
10
10
|
|
|
11
11
|
function ThreadTraceList({ className, innerClassName, children, ...props }) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { Panel } from 'react-resizable-panels';
|
|
3
3
|
import { useThreadTrace } from './thread-trace-context.es.js';
|
|
4
|
-
import { M as MessageScroller, e as MessageScrollerViewport, b as MessageScrollerContent } from '../../../../message-scroller-
|
|
4
|
+
import { M as MessageScroller, e as MessageScrollerViewport, b as MessageScrollerContent } from '../../../../message-scroller-C6gXU5d5.js';
|
|
5
5
|
import { c as cn } from '../../../../cn-CQUhN5Jx.js';
|
|
6
6
|
|
|
7
7
|
function ThreadTraceList({ className, innerClassName, children, ...props }) {
|
|
@@ -6,7 +6,7 @@ const jsxRuntime = require('react/jsx-runtime');
|
|
|
6
6
|
const React = require('react');
|
|
7
7
|
const domains_traces_hooks_useVisibleTraceRows = require('../../hooks/use-visible-trace-rows.cjs.js');
|
|
8
8
|
const domains_traces_components_threadTrace_threadTraceContext = require('./thread-trace-context.cjs.js');
|
|
9
|
-
const messageScroller = require('../../../../message-scroller-
|
|
9
|
+
const messageScroller = require('../../../../message-scroller-fjucuCuw.cjs');
|
|
10
10
|
const resize_panelGroup = require('../../../../resize/panel-group.cjs.js');
|
|
11
11
|
const utils_cn = require('../../../../cn-DlOJCxrS.cjs');
|
|
12
12
|
|
|
@@ -2,7 +2,7 @@ import { jsx } from 'react/jsx-runtime';
|
|
|
2
2
|
import { useRef, useState, useCallback, useMemo } from 'react';
|
|
3
3
|
import { useVisibleTraceRows } from '../../hooks/use-visible-trace-rows.es.js';
|
|
4
4
|
import { ThreadTraceContext } from './thread-trace-context.es.js';
|
|
5
|
-
import { d as MessageScrollerProvider } from '../../../../message-scroller-
|
|
5
|
+
import { d as MessageScrollerProvider } from '../../../../message-scroller-C6gXU5d5.js';
|
|
6
6
|
import { PanelGroup } from '../../../../resize/panel-group.es.js';
|
|
7
7
|
import { c as cn } from '../../../../cn-CQUhN5Jx.js';
|
|
8
8
|
|
|
@@ -7,7 +7,7 @@ const React = require('react');
|
|
|
7
7
|
const domains_traces_components_threadTrace_threadTraceContext = require('./thread-trace-context.cjs.js');
|
|
8
8
|
const domains_traces_components_threadTrace_threadTraceRowContext = require('./thread-trace-row-context.cjs.js');
|
|
9
9
|
const transcriptDivider = require('../../../../transcript-divider-Bu73RoLY.cjs');
|
|
10
|
-
const messageScroller = require('../../../../message-scroller-
|
|
10
|
+
const messageScroller = require('../../../../message-scroller-fjucuCuw.cjs');
|
|
11
11
|
const tabsRoot = require('../../../../tabs-root-sOhEgFZ-.cjs');
|
|
12
12
|
const hooks_useMeasuredAutoHeight = require('../../../../hooks/use-measured-auto-height.cjs.js');
|
|
13
13
|
const utils_cn = require('../../../../cn-DlOJCxrS.cjs');
|
|
@@ -3,7 +3,7 @@ import { useState, useCallback, useMemo } from 'react';
|
|
|
3
3
|
import { useThreadTrace } from './thread-trace-context.es.js';
|
|
4
4
|
import { ThreadTraceRowContext } from './thread-trace-row-context.es.js';
|
|
5
5
|
import { T as TranscriptDivider } from '../../../../transcript-divider-DpcLz0a6.js';
|
|
6
|
-
import { c as MessageScrollerItem } from '../../../../message-scroller-
|
|
6
|
+
import { c as MessageScrollerItem } from '../../../../message-scroller-C6gXU5d5.js';
|
|
7
7
|
import { T as Tabs } from '../../../../tabs-root-CI7WQrJF.js';
|
|
8
8
|
import { useMeasuredAutoHeight } from '../../../../hooks/use-measured-auto-height.es.js';
|
|
9
9
|
import { c as cn } from '../../../../cn-CQUhN5Jx.js';
|
|
@@ -10,7 +10,6 @@ const lucideReact = require('lucide-react');
|
|
|
10
10
|
const React = require('react');
|
|
11
11
|
require('@mastra/react/hooks/scores');
|
|
12
12
|
require('@base-ui/react/combobox');
|
|
13
|
-
require('../../../toast-DxKdVSyw.cjs');
|
|
14
13
|
const domains_scores_components_traceScoresTab = require('../../scores/components/trace-scores-tab.cjs.js');
|
|
15
14
|
require('@mastra/core/utils/safe-stringify');
|
|
16
15
|
require('@mastra/react/hooks/datasets');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread-view-by-trace.cjs.js","sources":["../../../../src/domains/traces/components/thread-view-by-trace.tsx"],"sourcesContent":["import { useMastraClient } from '@mastra/react';\nimport { traceSpansQueryOptions, useTraceSpans } from '@mastra/react/hooks/traces';\nimport { useQueries } from '@tanstack/react-query';\nimport { ExternalLinkIcon, MessageSquareReplyIcon, MessageSquareTextIcon } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport { TraceScoresTab } from '@/domains/scores';\nimport { ThreadTrace, useThreadTraceRow } from '@/domains/traces/components/thread-trace';\nimport type { ThreadTraceSelectedSpan } from '@/domains/traces/components/thread-trace';\n\nimport { ThreadViewSkeleton } from '@/domains/traces/components/thread-view-skeleton';\nimport { TraceFeedbackTab } from '@/domains/traces/components/trace-feedback-tab';\nimport { TraceThreadItemView } from '@/domains/traces/components/trace-thread-item-view';\nimport { TracesErrorContent } from '@/domains/traces/components/traces-error-content';\nimport { useTracesListSource } from '@/domains/traces/hooks/use-traces-list-source';\nimport type { UseTracesListSourceArgs } from '@/domains/traces/hooks/use-traces-list-source';\nimport { Button } from '@/ds/components/Button';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { ScorersIcon } from '@/ds/icons/ScorersIcon';\nimport { useLinkComponent } from '@/lib/framework';\n\n// `queryTraces` requires a time range; start at the epoch so it covers the whole thread, like the legacy endpoint.\nconst THREAD_WINDOW_FROM = new Date(0).toISOString();\n\nexport interface ThreadViewByTraceProps {\n threadId: string;\n /** Lists the thread through the trace-query API; `false` falls back to `listTracesLight`. */\n withQueryTrace: boolean;\n /** Shows the per-trace Feedback tab and fetches its feedback. */\n withFeedback: boolean;\n /** Fires when a span detail opens or closes (`null`). */\n onSelectedSpanChange?: (selected: ThreadTraceSelectedSpan | null) => void;\n /** Opens a score from a trace's Scores tab; the app owns routing. */\n onOpenScore: (traceId: string, scoreId: string) => void;\n /** Turns loaded per page: the latest ones on open, then older ones as the reader scrolls up. */\n pageSize?: number;\n}\n\n/**\n * A memory thread rendered as its traces, like a chat: one row per agent turn (oldest at the top),\n * opened on the latest turns, with older turns loaded as the reader scrolls up. Each row shows the\n * reconstructed messages on the left and the span tree on the right. Clicking a span opens its\n * detail panel on the side so the conversation stays readable.\n */\nexport function ThreadViewByTrace({\n threadId,\n withQueryTrace,\n withFeedback,\n onSelectedSpanChange,\n onOpenScore,\n pageSize = 10,\n}: ThreadViewByTraceProps) {\n const legacyFilters = useMemo<UseTracesListSourceArgs['legacyFilters']>(() => ({ threadId }), [threadId]);\n const { rows, isLoading, isPlaceholderData, error, hasNextPage, isFetchingNextPage, fetchNextPage } =\n useTracesListSource({\n initialAutoRefetch: false,\n withQueryTrace,\n legacyFilters,\n limit: pageSize,\n query: now => ({\n timeRange: {\n from: THREAD_WINDOW_FROM,\n to: now.toISOString(),\n },\n where: { op: 'eq', left: { path: 'threadId' }, right: { literal: threadId } },\n orderBy: [{ field: 'startedAt', direction: 'desc' }],\n }),\n });\n // Pages come newest first; the conversation reads oldest first.\n const traceIds = rows.map(trace => trace.traceId).reverse();\n const listSettled = !isLoading && !isPlaceholderData;\n\n // The first page is shown only once its turns' spans have settled too, so the rows mount complete\n // instead of each one loading on its own. Older pages keep their per-row loading.\n const client = useMastraClient();\n const [readyThreadId, setReadyThreadId] = useState<string | null>(null);\n const isReady = readyThreadId === threadId;\n const firstPageSpansSettled = useQueries({\n queries: (isReady || !listSettled ? [] : traceIds).map(traceId => ({\n ...traceSpansQueryOptions(client, traceId),\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n })),\n combine: results => results.every(result => !result.isPending),\n });\n if (!isReady && listSettled && firstPageSpansSettled) setReadyThreadId(threadId);\n\n if (error) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <TracesErrorContent error={error} resource=\"traces\" errorTitle=\"Failed to load traces\" />\n </div>\n );\n }\n\n if (!isReady) return <ThreadViewSkeleton withFeedback={withFeedback} />;\n\n if (traceIds.length === 0) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <Txt variant=\"body\" tone=\"muted\">\n No traces found for this thread.\n </Txt>\n </div>\n );\n }\n\n return (\n <ThreadTrace\n key={threadId}\n traceIds={traceIds}\n onSelectedSpanChange={onSelectedSpanChange}\n onLoadOlder={() => {\n if (hasNextPage && !isFetchingNextPage) fetchNextPage();\n }}\n >\n <ThreadTrace.List data-testid=\"thread-view-by-trace\">\n {traceIds.map((traceId, index) => (\n <ThreadTrace.Row key={traceId} traceId={traceId}>\n <ThreadTraceRowContent turn={index + 1} withFeedback={withFeedback} onOpenScore={onOpenScore} />\n </ThreadTrace.Row>\n ))}\n </ThreadTrace.List>\n <ThreadTrace.SpanPanel />\n </ThreadTrace>\n );\n}\n\nfunction ThreadTraceRowContent({\n turn,\n withFeedback,\n onOpenScore,\n}: {\n /** 1-based position among the loaded turns. */\n turn: number;\n withFeedback: boolean;\n onOpenScore: (traceId: string, scoreId: string) => void;\n}) {\n const { traceId, highlightSpans } = useThreadTraceRow();\n const { Link, paths } = useLinkComponent();\n const traceHref = paths.traceLink(traceId);\n // Same query the span tree observes (passive: the tree drives refetches).\n const { data: traceData } = useTraceSpans({ traceId: traceId, passive: true, queryOptions: { enabled: !!traceId } });\n const rootSpanId = traceData?.spans.find(span => span.parentSpanId == null)?.spanId;\n\n return (\n <>\n <ThreadTrace.Divider label={`Turn ${turn}`}>\n {traceHref && (\n <>\n <Button render={<Link href={traceHref} />} variant=\"ghost\" size=\"sm\" icon={<ExternalLinkIcon />}>\n Go to trace\n </Button>\n <span aria-hidden className=\"h-4 w-px bg-border\" />\n </>\n )}\n <ThreadTrace.TabList>\n <ThreadTrace.Tab value=\"messages\">\n <Icon size=\"xs\">\n <MessageSquareTextIcon />\n </Icon>\n Messages\n </ThreadTrace.Tab>\n {withFeedback && (\n <ThreadTrace.Tab value=\"feedback\">\n <Icon size=\"xs\">\n <MessageSquareReplyIcon />\n </Icon>\n Feedback\n </ThreadTrace.Tab>\n )}\n <ThreadTrace.Tab value=\"scores\">\n <Icon size=\"xs\">\n <ScorersIcon />\n </Icon>\n Scores\n </ThreadTrace.Tab>\n </ThreadTrace.TabList>\n </ThreadTrace.Divider>\n <ThreadTrace.RowBody>\n <ThreadTrace.Messages>\n <ThreadTrace.TabContent value=\"messages\" flush>\n <TraceThreadItemView traceId={traceId} onHighlightSpans={highlightSpans} />\n </ThreadTrace.TabContent>\n {withFeedback && (\n <ThreadTrace.TabContent value=\"feedback\" className=\"min-h-0 py-3\">\n <TraceFeedbackTab key={traceId} traceId={traceId} variant=\"thread\" />\n </ThreadTrace.TabContent>\n )}\n <ThreadTrace.TabContent value=\"scores\" className=\"min-h-0 py-3\">\n {rootSpanId ? (\n <TraceScoresTab\n key={traceId}\n traceId={traceId}\n spanId={rootSpanId}\n onScoreSelect={scoreId => onOpenScore(traceId, scoreId)}\n />\n ) : null}\n </ThreadTrace.TabContent>\n </ThreadTrace.Messages>\n <ThreadTrace.Details>\n <ThreadTrace.Spans />\n </ThreadTrace.Details>\n </ThreadTrace.RowBody>\n </>\n );\n}\n"],"names":["useMemo","useTracesListSource","useMastraClient","useState","useQueries","traceSpansQueryOptions","jsx","TracesErrorContent","ThreadViewSkeleton","Txt","jsxs","ThreadTrace","useThreadTraceRow","useLinkComponent","useTraceSpans","Fragment","Button","ExternalLinkIcon","Icon","MessageSquareTextIcon","MessageSquareReplyIcon","ScorersIcon","TraceThreadItemView","TraceFeedbackTab","TraceScoresTab"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"thread-view-by-trace.cjs.js","sources":["../../../../src/domains/traces/components/thread-view-by-trace.tsx"],"sourcesContent":["import { useMastraClient } from '@mastra/react';\nimport { traceSpansQueryOptions, useTraceSpans } from '@mastra/react/hooks/traces';\nimport { useQueries } from '@tanstack/react-query';\nimport { ExternalLinkIcon, MessageSquareReplyIcon, MessageSquareTextIcon } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport { TraceScoresTab } from '@/domains/scores';\nimport { ThreadTrace, useThreadTraceRow } from '@/domains/traces/components/thread-trace';\nimport type { ThreadTraceSelectedSpan } from '@/domains/traces/components/thread-trace';\n\nimport { ThreadViewSkeleton } from '@/domains/traces/components/thread-view-skeleton';\nimport { TraceFeedbackTab } from '@/domains/traces/components/trace-feedback-tab';\nimport { TraceThreadItemView } from '@/domains/traces/components/trace-thread-item-view';\nimport { TracesErrorContent } from '@/domains/traces/components/traces-error-content';\nimport { useTracesListSource } from '@/domains/traces/hooks/use-traces-list-source';\nimport type { UseTracesListSourceArgs } from '@/domains/traces/hooks/use-traces-list-source';\nimport { Button } from '@/ds/components/Button';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { ScorersIcon } from '@/ds/icons/ScorersIcon';\nimport { useLinkComponent } from '@/lib/framework';\n\n// `queryTraces` requires a time range; start at the epoch so it covers the whole thread, like the legacy endpoint.\nconst THREAD_WINDOW_FROM = new Date(0).toISOString();\n\nexport interface ThreadViewByTraceProps {\n threadId: string;\n /** Lists the thread through the trace-query API; `false` falls back to `listTracesLight`. */\n withQueryTrace: boolean;\n /** Shows the per-trace Feedback tab and fetches its feedback. */\n withFeedback: boolean;\n /** Fires when a span detail opens or closes (`null`). */\n onSelectedSpanChange?: (selected: ThreadTraceSelectedSpan | null) => void;\n /** Opens a score from a trace's Scores tab; the app owns routing. */\n onOpenScore: (traceId: string, scoreId: string) => void;\n /** Turns loaded per page: the latest ones on open, then older ones as the reader scrolls up. */\n pageSize?: number;\n}\n\n/**\n * A memory thread rendered as its traces, like a chat: one row per agent turn (oldest at the top),\n * opened on the latest turns, with older turns loaded as the reader scrolls up. Each row shows the\n * reconstructed messages on the left and the span tree on the right. Clicking a span opens its\n * detail panel on the side so the conversation stays readable.\n */\nexport function ThreadViewByTrace({\n threadId,\n withQueryTrace,\n withFeedback,\n onSelectedSpanChange,\n onOpenScore,\n pageSize = 10,\n}: ThreadViewByTraceProps) {\n const legacyFilters = useMemo<UseTracesListSourceArgs['legacyFilters']>(() => ({ threadId }), [threadId]);\n const { rows, isLoading, isPlaceholderData, error, hasNextPage, isFetchingNextPage, fetchNextPage } =\n useTracesListSource({\n initialAutoRefetch: false,\n withQueryTrace,\n legacyFilters,\n limit: pageSize,\n query: now => ({\n timeRange: {\n from: THREAD_WINDOW_FROM,\n to: now.toISOString(),\n },\n where: { op: 'eq', left: { path: 'threadId' }, right: { literal: threadId } },\n orderBy: [{ field: 'startedAt', direction: 'desc' }],\n }),\n });\n // Pages come newest first; the conversation reads oldest first.\n const traceIds = rows.map(trace => trace.traceId).reverse();\n const listSettled = !isLoading && !isPlaceholderData;\n\n // The first page is shown only once its turns' spans have settled too, so the rows mount complete\n // instead of each one loading on its own. Older pages keep their per-row loading.\n const client = useMastraClient();\n const [readyThreadId, setReadyThreadId] = useState<string | null>(null);\n const isReady = readyThreadId === threadId;\n const firstPageSpansSettled = useQueries({\n queries: (isReady || !listSettled ? [] : traceIds).map(traceId => ({\n ...traceSpansQueryOptions(client, traceId),\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n })),\n combine: results => results.every(result => !result.isPending),\n });\n if (!isReady && listSettled && firstPageSpansSettled) setReadyThreadId(threadId);\n\n if (error) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <TracesErrorContent error={error} resource=\"traces\" errorTitle=\"Failed to load traces\" />\n </div>\n );\n }\n\n if (!isReady) return <ThreadViewSkeleton withFeedback={withFeedback} />;\n\n if (traceIds.length === 0) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <Txt variant=\"body\" tone=\"muted\">\n No traces found for this thread.\n </Txt>\n </div>\n );\n }\n\n return (\n <ThreadTrace\n key={threadId}\n traceIds={traceIds}\n onSelectedSpanChange={onSelectedSpanChange}\n onLoadOlder={() => {\n if (hasNextPage && !isFetchingNextPage) fetchNextPage();\n }}\n >\n <ThreadTrace.List data-testid=\"thread-view-by-trace\">\n {traceIds.map((traceId, index) => (\n <ThreadTrace.Row key={traceId} traceId={traceId}>\n <ThreadTraceRowContent turn={index + 1} withFeedback={withFeedback} onOpenScore={onOpenScore} />\n </ThreadTrace.Row>\n ))}\n </ThreadTrace.List>\n <ThreadTrace.SpanPanel />\n </ThreadTrace>\n );\n}\n\nfunction ThreadTraceRowContent({\n turn,\n withFeedback,\n onOpenScore,\n}: {\n /** 1-based position among the loaded turns. */\n turn: number;\n withFeedback: boolean;\n onOpenScore: (traceId: string, scoreId: string) => void;\n}) {\n const { traceId, highlightSpans } = useThreadTraceRow();\n const { Link, paths } = useLinkComponent();\n const traceHref = paths.traceLink(traceId);\n // Same query the span tree observes (passive: the tree drives refetches).\n const { data: traceData } = useTraceSpans({ traceId: traceId, passive: true, queryOptions: { enabled: !!traceId } });\n const rootSpanId = traceData?.spans.find(span => span.parentSpanId == null)?.spanId;\n\n return (\n <>\n <ThreadTrace.Divider label={`Turn ${turn}`}>\n {traceHref && (\n <>\n <Button render={<Link href={traceHref} />} variant=\"ghost\" size=\"sm\" icon={<ExternalLinkIcon />}>\n Go to trace\n </Button>\n <span aria-hidden className=\"h-4 w-px bg-border\" />\n </>\n )}\n <ThreadTrace.TabList>\n <ThreadTrace.Tab value=\"messages\">\n <Icon size=\"xs\">\n <MessageSquareTextIcon />\n </Icon>\n Messages\n </ThreadTrace.Tab>\n {withFeedback && (\n <ThreadTrace.Tab value=\"feedback\">\n <Icon size=\"xs\">\n <MessageSquareReplyIcon />\n </Icon>\n Feedback\n </ThreadTrace.Tab>\n )}\n <ThreadTrace.Tab value=\"scores\">\n <Icon size=\"xs\">\n <ScorersIcon />\n </Icon>\n Scores\n </ThreadTrace.Tab>\n </ThreadTrace.TabList>\n </ThreadTrace.Divider>\n <ThreadTrace.RowBody>\n <ThreadTrace.Messages>\n <ThreadTrace.TabContent value=\"messages\" flush>\n <TraceThreadItemView traceId={traceId} onHighlightSpans={highlightSpans} />\n </ThreadTrace.TabContent>\n {withFeedback && (\n <ThreadTrace.TabContent value=\"feedback\" className=\"min-h-0 py-3\">\n <TraceFeedbackTab key={traceId} traceId={traceId} variant=\"thread\" />\n </ThreadTrace.TabContent>\n )}\n <ThreadTrace.TabContent value=\"scores\" className=\"min-h-0 py-3\">\n {rootSpanId ? (\n <TraceScoresTab\n key={traceId}\n traceId={traceId}\n spanId={rootSpanId}\n onScoreSelect={scoreId => onOpenScore(traceId, scoreId)}\n />\n ) : null}\n </ThreadTrace.TabContent>\n </ThreadTrace.Messages>\n <ThreadTrace.Details>\n <ThreadTrace.Spans />\n </ThreadTrace.Details>\n </ThreadTrace.RowBody>\n </>\n );\n}\n"],"names":["useMemo","useTracesListSource","useMastraClient","useState","useQueries","traceSpansQueryOptions","jsx","TracesErrorContent","ThreadViewSkeleton","Txt","jsxs","ThreadTrace","useThreadTraceRow","useLinkComponent","useTraceSpans","Fragment","Button","ExternalLinkIcon","Icon","MessageSquareTextIcon","MessageSquareReplyIcon","ScorersIcon","TraceThreadItemView","TraceFeedbackTab","TraceScoresTab"],"mappings":"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"}
|
|
@@ -6,7 +6,6 @@ import { ExternalLinkIcon, MessageSquareTextIcon, MessageSquareReplyIcon } from
|
|
|
6
6
|
import { useMemo, useState } from 'react';
|
|
7
7
|
import '@mastra/react/hooks/scores';
|
|
8
8
|
import '@base-ui/react/combobox';
|
|
9
|
-
import '../../../toast-5aQbZBbY.js';
|
|
10
9
|
import { TraceScoresTab } from '../../scores/components/trace-scores-tab.es.js';
|
|
11
10
|
import '@mastra/core/utils/safe-stringify';
|
|
12
11
|
import '@mastra/react/hooks/datasets';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread-view-by-trace.es.js","sources":["../../../../src/domains/traces/components/thread-view-by-trace.tsx"],"sourcesContent":["import { useMastraClient } from '@mastra/react';\nimport { traceSpansQueryOptions, useTraceSpans } from '@mastra/react/hooks/traces';\nimport { useQueries } from '@tanstack/react-query';\nimport { ExternalLinkIcon, MessageSquareReplyIcon, MessageSquareTextIcon } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport { TraceScoresTab } from '@/domains/scores';\nimport { ThreadTrace, useThreadTraceRow } from '@/domains/traces/components/thread-trace';\nimport type { ThreadTraceSelectedSpan } from '@/domains/traces/components/thread-trace';\n\nimport { ThreadViewSkeleton } from '@/domains/traces/components/thread-view-skeleton';\nimport { TraceFeedbackTab } from '@/domains/traces/components/trace-feedback-tab';\nimport { TraceThreadItemView } from '@/domains/traces/components/trace-thread-item-view';\nimport { TracesErrorContent } from '@/domains/traces/components/traces-error-content';\nimport { useTracesListSource } from '@/domains/traces/hooks/use-traces-list-source';\nimport type { UseTracesListSourceArgs } from '@/domains/traces/hooks/use-traces-list-source';\nimport { Button } from '@/ds/components/Button';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { ScorersIcon } from '@/ds/icons/ScorersIcon';\nimport { useLinkComponent } from '@/lib/framework';\n\n// `queryTraces` requires a time range; start at the epoch so it covers the whole thread, like the legacy endpoint.\nconst THREAD_WINDOW_FROM = new Date(0).toISOString();\n\nexport interface ThreadViewByTraceProps {\n threadId: string;\n /** Lists the thread through the trace-query API; `false` falls back to `listTracesLight`. */\n withQueryTrace: boolean;\n /** Shows the per-trace Feedback tab and fetches its feedback. */\n withFeedback: boolean;\n /** Fires when a span detail opens or closes (`null`). */\n onSelectedSpanChange?: (selected: ThreadTraceSelectedSpan | null) => void;\n /** Opens a score from a trace's Scores tab; the app owns routing. */\n onOpenScore: (traceId: string, scoreId: string) => void;\n /** Turns loaded per page: the latest ones on open, then older ones as the reader scrolls up. */\n pageSize?: number;\n}\n\n/**\n * A memory thread rendered as its traces, like a chat: one row per agent turn (oldest at the top),\n * opened on the latest turns, with older turns loaded as the reader scrolls up. Each row shows the\n * reconstructed messages on the left and the span tree on the right. Clicking a span opens its\n * detail panel on the side so the conversation stays readable.\n */\nexport function ThreadViewByTrace({\n threadId,\n withQueryTrace,\n withFeedback,\n onSelectedSpanChange,\n onOpenScore,\n pageSize = 10,\n}: ThreadViewByTraceProps) {\n const legacyFilters = useMemo<UseTracesListSourceArgs['legacyFilters']>(() => ({ threadId }), [threadId]);\n const { rows, isLoading, isPlaceholderData, error, hasNextPage, isFetchingNextPage, fetchNextPage } =\n useTracesListSource({\n initialAutoRefetch: false,\n withQueryTrace,\n legacyFilters,\n limit: pageSize,\n query: now => ({\n timeRange: {\n from: THREAD_WINDOW_FROM,\n to: now.toISOString(),\n },\n where: { op: 'eq', left: { path: 'threadId' }, right: { literal: threadId } },\n orderBy: [{ field: 'startedAt', direction: 'desc' }],\n }),\n });\n // Pages come newest first; the conversation reads oldest first.\n const traceIds = rows.map(trace => trace.traceId).reverse();\n const listSettled = !isLoading && !isPlaceholderData;\n\n // The first page is shown only once its turns' spans have settled too, so the rows mount complete\n // instead of each one loading on its own. Older pages keep their per-row loading.\n const client = useMastraClient();\n const [readyThreadId, setReadyThreadId] = useState<string | null>(null);\n const isReady = readyThreadId === threadId;\n const firstPageSpansSettled = useQueries({\n queries: (isReady || !listSettled ? [] : traceIds).map(traceId => ({\n ...traceSpansQueryOptions(client, traceId),\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n })),\n combine: results => results.every(result => !result.isPending),\n });\n if (!isReady && listSettled && firstPageSpansSettled) setReadyThreadId(threadId);\n\n if (error) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <TracesErrorContent error={error} resource=\"traces\" errorTitle=\"Failed to load traces\" />\n </div>\n );\n }\n\n if (!isReady) return <ThreadViewSkeleton withFeedback={withFeedback} />;\n\n if (traceIds.length === 0) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <Txt variant=\"body\" tone=\"muted\">\n No traces found for this thread.\n </Txt>\n </div>\n );\n }\n\n return (\n <ThreadTrace\n key={threadId}\n traceIds={traceIds}\n onSelectedSpanChange={onSelectedSpanChange}\n onLoadOlder={() => {\n if (hasNextPage && !isFetchingNextPage) fetchNextPage();\n }}\n >\n <ThreadTrace.List data-testid=\"thread-view-by-trace\">\n {traceIds.map((traceId, index) => (\n <ThreadTrace.Row key={traceId} traceId={traceId}>\n <ThreadTraceRowContent turn={index + 1} withFeedback={withFeedback} onOpenScore={onOpenScore} />\n </ThreadTrace.Row>\n ))}\n </ThreadTrace.List>\n <ThreadTrace.SpanPanel />\n </ThreadTrace>\n );\n}\n\nfunction ThreadTraceRowContent({\n turn,\n withFeedback,\n onOpenScore,\n}: {\n /** 1-based position among the loaded turns. */\n turn: number;\n withFeedback: boolean;\n onOpenScore: (traceId: string, scoreId: string) => void;\n}) {\n const { traceId, highlightSpans } = useThreadTraceRow();\n const { Link, paths } = useLinkComponent();\n const traceHref = paths.traceLink(traceId);\n // Same query the span tree observes (passive: the tree drives refetches).\n const { data: traceData } = useTraceSpans({ traceId: traceId, passive: true, queryOptions: { enabled: !!traceId } });\n const rootSpanId = traceData?.spans.find(span => span.parentSpanId == null)?.spanId;\n\n return (\n <>\n <ThreadTrace.Divider label={`Turn ${turn}`}>\n {traceHref && (\n <>\n <Button render={<Link href={traceHref} />} variant=\"ghost\" size=\"sm\" icon={<ExternalLinkIcon />}>\n Go to trace\n </Button>\n <span aria-hidden className=\"h-4 w-px bg-border\" />\n </>\n )}\n <ThreadTrace.TabList>\n <ThreadTrace.Tab value=\"messages\">\n <Icon size=\"xs\">\n <MessageSquareTextIcon />\n </Icon>\n Messages\n </ThreadTrace.Tab>\n {withFeedback && (\n <ThreadTrace.Tab value=\"feedback\">\n <Icon size=\"xs\">\n <MessageSquareReplyIcon />\n </Icon>\n Feedback\n </ThreadTrace.Tab>\n )}\n <ThreadTrace.Tab value=\"scores\">\n <Icon size=\"xs\">\n <ScorersIcon />\n </Icon>\n Scores\n </ThreadTrace.Tab>\n </ThreadTrace.TabList>\n </ThreadTrace.Divider>\n <ThreadTrace.RowBody>\n <ThreadTrace.Messages>\n <ThreadTrace.TabContent value=\"messages\" flush>\n <TraceThreadItemView traceId={traceId} onHighlightSpans={highlightSpans} />\n </ThreadTrace.TabContent>\n {withFeedback && (\n <ThreadTrace.TabContent value=\"feedback\" className=\"min-h-0 py-3\">\n <TraceFeedbackTab key={traceId} traceId={traceId} variant=\"thread\" />\n </ThreadTrace.TabContent>\n )}\n <ThreadTrace.TabContent value=\"scores\" className=\"min-h-0 py-3\">\n {rootSpanId ? (\n <TraceScoresTab\n key={traceId}\n traceId={traceId}\n spanId={rootSpanId}\n onScoreSelect={scoreId => onOpenScore(traceId, scoreId)}\n />\n ) : null}\n </ThreadTrace.TabContent>\n </ThreadTrace.Messages>\n <ThreadTrace.Details>\n <ThreadTrace.Spans />\n </ThreadTrace.Details>\n </ThreadTrace.RowBody>\n </>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"thread-view-by-trace.es.js","sources":["../../../../src/domains/traces/components/thread-view-by-trace.tsx"],"sourcesContent":["import { useMastraClient } from '@mastra/react';\nimport { traceSpansQueryOptions, useTraceSpans } from '@mastra/react/hooks/traces';\nimport { useQueries } from '@tanstack/react-query';\nimport { ExternalLinkIcon, MessageSquareReplyIcon, MessageSquareTextIcon } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport { TraceScoresTab } from '@/domains/scores';\nimport { ThreadTrace, useThreadTraceRow } from '@/domains/traces/components/thread-trace';\nimport type { ThreadTraceSelectedSpan } from '@/domains/traces/components/thread-trace';\n\nimport { ThreadViewSkeleton } from '@/domains/traces/components/thread-view-skeleton';\nimport { TraceFeedbackTab } from '@/domains/traces/components/trace-feedback-tab';\nimport { TraceThreadItemView } from '@/domains/traces/components/trace-thread-item-view';\nimport { TracesErrorContent } from '@/domains/traces/components/traces-error-content';\nimport { useTracesListSource } from '@/domains/traces/hooks/use-traces-list-source';\nimport type { UseTracesListSourceArgs } from '@/domains/traces/hooks/use-traces-list-source';\nimport { Button } from '@/ds/components/Button';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { ScorersIcon } from '@/ds/icons/ScorersIcon';\nimport { useLinkComponent } from '@/lib/framework';\n\n// `queryTraces` requires a time range; start at the epoch so it covers the whole thread, like the legacy endpoint.\nconst THREAD_WINDOW_FROM = new Date(0).toISOString();\n\nexport interface ThreadViewByTraceProps {\n threadId: string;\n /** Lists the thread through the trace-query API; `false` falls back to `listTracesLight`. */\n withQueryTrace: boolean;\n /** Shows the per-trace Feedback tab and fetches its feedback. */\n withFeedback: boolean;\n /** Fires when a span detail opens or closes (`null`). */\n onSelectedSpanChange?: (selected: ThreadTraceSelectedSpan | null) => void;\n /** Opens a score from a trace's Scores tab; the app owns routing. */\n onOpenScore: (traceId: string, scoreId: string) => void;\n /** Turns loaded per page: the latest ones on open, then older ones as the reader scrolls up. */\n pageSize?: number;\n}\n\n/**\n * A memory thread rendered as its traces, like a chat: one row per agent turn (oldest at the top),\n * opened on the latest turns, with older turns loaded as the reader scrolls up. Each row shows the\n * reconstructed messages on the left and the span tree on the right. Clicking a span opens its\n * detail panel on the side so the conversation stays readable.\n */\nexport function ThreadViewByTrace({\n threadId,\n withQueryTrace,\n withFeedback,\n onSelectedSpanChange,\n onOpenScore,\n pageSize = 10,\n}: ThreadViewByTraceProps) {\n const legacyFilters = useMemo<UseTracesListSourceArgs['legacyFilters']>(() => ({ threadId }), [threadId]);\n const { rows, isLoading, isPlaceholderData, error, hasNextPage, isFetchingNextPage, fetchNextPage } =\n useTracesListSource({\n initialAutoRefetch: false,\n withQueryTrace,\n legacyFilters,\n limit: pageSize,\n query: now => ({\n timeRange: {\n from: THREAD_WINDOW_FROM,\n to: now.toISOString(),\n },\n where: { op: 'eq', left: { path: 'threadId' }, right: { literal: threadId } },\n orderBy: [{ field: 'startedAt', direction: 'desc' }],\n }),\n });\n // Pages come newest first; the conversation reads oldest first.\n const traceIds = rows.map(trace => trace.traceId).reverse();\n const listSettled = !isLoading && !isPlaceholderData;\n\n // The first page is shown only once its turns' spans have settled too, so the rows mount complete\n // instead of each one loading on its own. Older pages keep their per-row loading.\n const client = useMastraClient();\n const [readyThreadId, setReadyThreadId] = useState<string | null>(null);\n const isReady = readyThreadId === threadId;\n const firstPageSpansSettled = useQueries({\n queries: (isReady || !listSettled ? [] : traceIds).map(traceId => ({\n ...traceSpansQueryOptions(client, traceId),\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n })),\n combine: results => results.every(result => !result.isPending),\n });\n if (!isReady && listSettled && firstPageSpansSettled) setReadyThreadId(threadId);\n\n if (error) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <TracesErrorContent error={error} resource=\"traces\" errorTitle=\"Failed to load traces\" />\n </div>\n );\n }\n\n if (!isReady) return <ThreadViewSkeleton withFeedback={withFeedback} />;\n\n if (traceIds.length === 0) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <Txt variant=\"body\" tone=\"muted\">\n No traces found for this thread.\n </Txt>\n </div>\n );\n }\n\n return (\n <ThreadTrace\n key={threadId}\n traceIds={traceIds}\n onSelectedSpanChange={onSelectedSpanChange}\n onLoadOlder={() => {\n if (hasNextPage && !isFetchingNextPage) fetchNextPage();\n }}\n >\n <ThreadTrace.List data-testid=\"thread-view-by-trace\">\n {traceIds.map((traceId, index) => (\n <ThreadTrace.Row key={traceId} traceId={traceId}>\n <ThreadTraceRowContent turn={index + 1} withFeedback={withFeedback} onOpenScore={onOpenScore} />\n </ThreadTrace.Row>\n ))}\n </ThreadTrace.List>\n <ThreadTrace.SpanPanel />\n </ThreadTrace>\n );\n}\n\nfunction ThreadTraceRowContent({\n turn,\n withFeedback,\n onOpenScore,\n}: {\n /** 1-based position among the loaded turns. */\n turn: number;\n withFeedback: boolean;\n onOpenScore: (traceId: string, scoreId: string) => void;\n}) {\n const { traceId, highlightSpans } = useThreadTraceRow();\n const { Link, paths } = useLinkComponent();\n const traceHref = paths.traceLink(traceId);\n // Same query the span tree observes (passive: the tree drives refetches).\n const { data: traceData } = useTraceSpans({ traceId: traceId, passive: true, queryOptions: { enabled: !!traceId } });\n const rootSpanId = traceData?.spans.find(span => span.parentSpanId == null)?.spanId;\n\n return (\n <>\n <ThreadTrace.Divider label={`Turn ${turn}`}>\n {traceHref && (\n <>\n <Button render={<Link href={traceHref} />} variant=\"ghost\" size=\"sm\" icon={<ExternalLinkIcon />}>\n Go to trace\n </Button>\n <span aria-hidden className=\"h-4 w-px bg-border\" />\n </>\n )}\n <ThreadTrace.TabList>\n <ThreadTrace.Tab value=\"messages\">\n <Icon size=\"xs\">\n <MessageSquareTextIcon />\n </Icon>\n Messages\n </ThreadTrace.Tab>\n {withFeedback && (\n <ThreadTrace.Tab value=\"feedback\">\n <Icon size=\"xs\">\n <MessageSquareReplyIcon />\n </Icon>\n Feedback\n </ThreadTrace.Tab>\n )}\n <ThreadTrace.Tab value=\"scores\">\n <Icon size=\"xs\">\n <ScorersIcon />\n </Icon>\n Scores\n </ThreadTrace.Tab>\n </ThreadTrace.TabList>\n </ThreadTrace.Divider>\n <ThreadTrace.RowBody>\n <ThreadTrace.Messages>\n <ThreadTrace.TabContent value=\"messages\" flush>\n <TraceThreadItemView traceId={traceId} onHighlightSpans={highlightSpans} />\n </ThreadTrace.TabContent>\n {withFeedback && (\n <ThreadTrace.TabContent value=\"feedback\" className=\"min-h-0 py-3\">\n <TraceFeedbackTab key={traceId} traceId={traceId} variant=\"thread\" />\n </ThreadTrace.TabContent>\n )}\n <ThreadTrace.TabContent value=\"scores\" className=\"min-h-0 py-3\">\n {rootSpanId ? (\n <TraceScoresTab\n key={traceId}\n traceId={traceId}\n spanId={rootSpanId}\n onScoreSelect={scoreId => onOpenScore(traceId, scoreId)}\n />\n ) : null}\n </ThreadTrace.TabContent>\n </ThreadTrace.Messages>\n <ThreadTrace.Details>\n <ThreadTrace.Spans />\n </ThreadTrace.Details>\n </ThreadTrace.RowBody>\n </>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -6,8 +6,6 @@ const jsxRuntime = require('react/jsx-runtime');
|
|
|
6
6
|
const scores = require('@mastra/react/hooks/scores');
|
|
7
7
|
const React = require('react');
|
|
8
8
|
const domains_scores_components_spanScoring = require('../../scores/components/span-scoring.cjs.js');
|
|
9
|
-
require('../../../data-list-ecHsw-zr.cjs');
|
|
10
|
-
require('../../../keyboard/keyboard-shortcuts-context.cjs.js');
|
|
11
9
|
require('@base-ui/react/use-render');
|
|
12
10
|
require('lucide-react');
|
|
13
11
|
require('@mastra/core/utils/safe-stringify');
|
|
@@ -15,7 +13,6 @@ require('@mastra/react/hooks/datasets');
|
|
|
15
13
|
require('../../../Button-DH1aTzbs.cjs');
|
|
16
14
|
require('../../../field-control-aria-WzMGs0A4.cjs');
|
|
17
15
|
require('../../../lib/framework.cjs.js');
|
|
18
|
-
require('../../../toast-DxKdVSyw.cjs');
|
|
19
16
|
const domains_traces_components_traceDataPanelView = require('./trace-data-panel-view.cjs.js');
|
|
20
17
|
const dialog = require('../../../dialog-BMUfQ9XU.cjs');
|
|
21
18
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-data-panel.cjs.js","sources":["../../../../src/domains/traces/components/trace-data-panel.tsx"],"sourcesContent":["import { useScorers } from '@mastra/react/hooks/scores';\nimport { useState, type ComponentProps } from 'react';\nimport { SpanScoring } from '@/domains/scores';\nimport { TraceDataPanelView, type TraceSideView } from '@/domains/traces/components/trace-data-panel-view';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/ds/components/Dialog';\n\ntype TraceDataPanelProps = Omit<\n ComponentProps<typeof TraceDataPanelView>,\n 'sideView' | 'onSideViewChange' | 'onEvaluateTrace'\n>;\n\n/**\n * Owns the trace panel's side column view so scoring can land on \"Scores\". Mount it with a\n * `key` on the trace (and anchor span) so a view picked on a previous trace never leaks into the next one.\n */\nexport function TraceDataPanel(props: TraceDataPanelProps) {\n const [sideView, setSideView] = useState<TraceSideView>();\n const [isScoringOpen, setIsScoringOpen] = useState(false);\n const { data: scorers, isLoading: isLoadingScorers } = useScorers();\n const rootSpan = props.anchorSpanId\n ? props.spans?.find(span => span.spanId === props.anchorSpanId)\n : props.spans?.find(span => span.parentSpanId == null);\n\n return (\n <>\n <TraceDataPanelView\n {...props}\n onEvaluateTrace={() => setIsScoringOpen(true)}\n sideView={sideView}\n onSideViewChange={setSideView}\n />\n <Dialog open={isScoringOpen} onOpenChange={setIsScoringOpen}>\n <DialogContent size=\"lg\">\n <DialogHeader>\n <DialogTitle>Score trace</DialogTitle>\n </DialogHeader>\n\n {isScoringOpen && rootSpan && (\n <SpanScoring\n traceId={props.traceId}\n spanId={rootSpan.spanId}\n entityType={rootSpan.entityType === 'agent' ? 'Agent' : 'Workflow'}\n isTopLevelSpan={!rootSpan.parentSpanId}\n scorers={scorers}\n isLoadingScorers={isLoadingScorers}\n onSuccess={() => {\n setIsScoringOpen(false);\n setSideView('scores');\n }}\n />\n )}\n </DialogContent>\n </Dialog>\n </>\n );\n}\n"],"names":["useState","useScorers","jsxs","Fragment","jsx","TraceDataPanelView","Dialog","DialogContent","DialogHeader","DialogTitle","SpanScoring"],"mappings":"
|
|
1
|
+
{"version":3,"file":"trace-data-panel.cjs.js","sources":["../../../../src/domains/traces/components/trace-data-panel.tsx"],"sourcesContent":["import { useScorers } from '@mastra/react/hooks/scores';\nimport { useState, type ComponentProps } from 'react';\nimport { SpanScoring } from '@/domains/scores';\nimport { TraceDataPanelView, type TraceSideView } from '@/domains/traces/components/trace-data-panel-view';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/ds/components/Dialog';\n\ntype TraceDataPanelProps = Omit<\n ComponentProps<typeof TraceDataPanelView>,\n 'sideView' | 'onSideViewChange' | 'onEvaluateTrace'\n>;\n\n/**\n * Owns the trace panel's side column view so scoring can land on \"Scores\". Mount it with a\n * `key` on the trace (and anchor span) so a view picked on a previous trace never leaks into the next one.\n */\nexport function TraceDataPanel(props: TraceDataPanelProps) {\n const [sideView, setSideView] = useState<TraceSideView>();\n const [isScoringOpen, setIsScoringOpen] = useState(false);\n const { data: scorers, isLoading: isLoadingScorers } = useScorers();\n const rootSpan = props.anchorSpanId\n ? props.spans?.find(span => span.spanId === props.anchorSpanId)\n : props.spans?.find(span => span.parentSpanId == null);\n\n return (\n <>\n <TraceDataPanelView\n {...props}\n onEvaluateTrace={() => setIsScoringOpen(true)}\n sideView={sideView}\n onSideViewChange={setSideView}\n />\n <Dialog open={isScoringOpen} onOpenChange={setIsScoringOpen}>\n <DialogContent size=\"lg\">\n <DialogHeader>\n <DialogTitle>Score trace</DialogTitle>\n </DialogHeader>\n\n {isScoringOpen && rootSpan && (\n <SpanScoring\n traceId={props.traceId}\n spanId={rootSpan.spanId}\n entityType={rootSpan.entityType === 'agent' ? 'Agent' : 'Workflow'}\n isTopLevelSpan={!rootSpan.parentSpanId}\n scorers={scorers}\n isLoadingScorers={isLoadingScorers}\n onSuccess={() => {\n setIsScoringOpen(false);\n setSideView('scores');\n }}\n />\n )}\n </DialogContent>\n </Dialog>\n </>\n );\n}\n"],"names":["useState","useScorers","jsxs","Fragment","jsx","TraceDataPanelView","Dialog","DialogContent","DialogHeader","DialogTitle","SpanScoring"],"mappings":";;;;;;;;;;;;;;;;;;AAeO,SAAS,eAAe,KAAA,EAA4B;AACzD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,cAAA,EAAwB;AACxD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAAS,KAAK,CAAA;AACxD,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,gBAAA,KAAqBC,iBAAA,EAAW;AAClE,EAAA,MAAM,WAAW,KAAA,CAAM,YAAA,GACnB,MAAM,KAAA,EAAO,IAAA,CAAK,UAAQ,IAAA,CAAK,MAAA,KAAW,KAAA,CAAM,YAAY,IAC5D,KAAA,CAAM,KAAA,EAAO,KAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,gBAAgB,IAAI,CAAA;AAEvD,EAAA,uBACEC,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAC,cAAA;AAAA,MAACC,+DAAA;AAAA,MAAA;AAAA,QACE,GAAG,KAAA;AAAA,QACJ,eAAA,EAAiB,MAAM,gBAAA,CAAiB,IAAI,CAAA;AAAA,QAC5C,QAAA;AAAA,QACA,gBAAA,EAAkB;AAAA;AAAA,KACpB;AAAA,oBACAD,cAAA,CAACE,iBAAO,IAAA,EAAM,aAAA,EAAe,cAAc,gBAAA,EACzC,QAAA,kBAAAJ,eAAA,CAACK,oBAAA,EAAA,EAAc,IAAA,EAAK,IAAA,EAClB,QAAA,EAAA;AAAA,sBAAAH,cAAA,CAACI,mBAAA,EAAA,EACC,QAAA,kBAAAJ,cAAA,CAACK,kBAAA,EAAA,EAAY,QAAA,EAAA,aAAA,EAAW,CAAA,EAC1B,CAAA;AAAA,MAEC,iBAAiB,QAAA,oBAChBL,cAAA;AAAA,QAACM,iDAAA;AAAA,QAAA;AAAA,UACC,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,QAAQ,QAAA,CAAS,MAAA;AAAA,UACjB,UAAA,EAAY,QAAA,CAAS,UAAA,KAAe,OAAA,GAAU,OAAA,GAAU,UAAA;AAAA,UACxD,cAAA,EAAgB,CAAC,QAAA,CAAS,YAAA;AAAA,UAC1B,OAAA;AAAA,UACA,gBAAA;AAAA,UACA,WAAW,MAAM;AACf,YAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,YAAA,WAAA,CAAY,QAAQ,CAAA;AAAA,UACtB;AAAA;AAAA;AACF,KAAA,EAEJ,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -2,8 +2,6 @@ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
|
2
2
|
import { useScorers } from '@mastra/react/hooks/scores';
|
|
3
3
|
import { useState } from 'react';
|
|
4
4
|
import { SpanScoring } from '../../scores/components/span-scoring.es.js';
|
|
5
|
-
import '../../../data-list-DdCZZctL.js';
|
|
6
|
-
import '../../../keyboard/keyboard-shortcuts-context.es.js';
|
|
7
5
|
import '@base-ui/react/use-render';
|
|
8
6
|
import 'lucide-react';
|
|
9
7
|
import '@mastra/core/utils/safe-stringify';
|
|
@@ -11,7 +9,6 @@ import '@mastra/react/hooks/datasets';
|
|
|
11
9
|
import '../../../Button-EGoajBQY.js';
|
|
12
10
|
import '../../../field-control-aria-DB6y41tQ.js';
|
|
13
11
|
import '../../../lib/framework.es.js';
|
|
14
|
-
import '../../../toast-5aQbZBbY.js';
|
|
15
12
|
import { TraceDataPanelView } from './trace-data-panel-view.es.js';
|
|
16
13
|
import { D as Dialog, d as DialogContent, g as DialogHeader, j as DialogTitle } from '../../../dialog-j2e95YNV.js';
|
|
17
14
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-data-panel.es.js","sources":["../../../../src/domains/traces/components/trace-data-panel.tsx"],"sourcesContent":["import { useScorers } from '@mastra/react/hooks/scores';\nimport { useState, type ComponentProps } from 'react';\nimport { SpanScoring } from '@/domains/scores';\nimport { TraceDataPanelView, type TraceSideView } from '@/domains/traces/components/trace-data-panel-view';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/ds/components/Dialog';\n\ntype TraceDataPanelProps = Omit<\n ComponentProps<typeof TraceDataPanelView>,\n 'sideView' | 'onSideViewChange' | 'onEvaluateTrace'\n>;\n\n/**\n * Owns the trace panel's side column view so scoring can land on \"Scores\". Mount it with a\n * `key` on the trace (and anchor span) so a view picked on a previous trace never leaks into the next one.\n */\nexport function TraceDataPanel(props: TraceDataPanelProps) {\n const [sideView, setSideView] = useState<TraceSideView>();\n const [isScoringOpen, setIsScoringOpen] = useState(false);\n const { data: scorers, isLoading: isLoadingScorers } = useScorers();\n const rootSpan = props.anchorSpanId\n ? props.spans?.find(span => span.spanId === props.anchorSpanId)\n : props.spans?.find(span => span.parentSpanId == null);\n\n return (\n <>\n <TraceDataPanelView\n {...props}\n onEvaluateTrace={() => setIsScoringOpen(true)}\n sideView={sideView}\n onSideViewChange={setSideView}\n />\n <Dialog open={isScoringOpen} onOpenChange={setIsScoringOpen}>\n <DialogContent size=\"lg\">\n <DialogHeader>\n <DialogTitle>Score trace</DialogTitle>\n </DialogHeader>\n\n {isScoringOpen && rootSpan && (\n <SpanScoring\n traceId={props.traceId}\n spanId={rootSpan.spanId}\n entityType={rootSpan.entityType === 'agent' ? 'Agent' : 'Workflow'}\n isTopLevelSpan={!rootSpan.parentSpanId}\n scorers={scorers}\n isLoadingScorers={isLoadingScorers}\n onSuccess={() => {\n setIsScoringOpen(false);\n setSideView('scores');\n }}\n />\n )}\n </DialogContent>\n </Dialog>\n </>\n );\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"trace-data-panel.es.js","sources":["../../../../src/domains/traces/components/trace-data-panel.tsx"],"sourcesContent":["import { useScorers } from '@mastra/react/hooks/scores';\nimport { useState, type ComponentProps } from 'react';\nimport { SpanScoring } from '@/domains/scores';\nimport { TraceDataPanelView, type TraceSideView } from '@/domains/traces/components/trace-data-panel-view';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/ds/components/Dialog';\n\ntype TraceDataPanelProps = Omit<\n ComponentProps<typeof TraceDataPanelView>,\n 'sideView' | 'onSideViewChange' | 'onEvaluateTrace'\n>;\n\n/**\n * Owns the trace panel's side column view so scoring can land on \"Scores\". Mount it with a\n * `key` on the trace (and anchor span) so a view picked on a previous trace never leaks into the next one.\n */\nexport function TraceDataPanel(props: TraceDataPanelProps) {\n const [sideView, setSideView] = useState<TraceSideView>();\n const [isScoringOpen, setIsScoringOpen] = useState(false);\n const { data: scorers, isLoading: isLoadingScorers } = useScorers();\n const rootSpan = props.anchorSpanId\n ? props.spans?.find(span => span.spanId === props.anchorSpanId)\n : props.spans?.find(span => span.parentSpanId == null);\n\n return (\n <>\n <TraceDataPanelView\n {...props}\n onEvaluateTrace={() => setIsScoringOpen(true)}\n sideView={sideView}\n onSideViewChange={setSideView}\n />\n <Dialog open={isScoringOpen} onOpenChange={setIsScoringOpen}>\n <DialogContent size=\"lg\">\n <DialogHeader>\n <DialogTitle>Score trace</DialogTitle>\n </DialogHeader>\n\n {isScoringOpen && rootSpan && (\n <SpanScoring\n traceId={props.traceId}\n spanId={rootSpan.spanId}\n entityType={rootSpan.entityType === 'agent' ? 'Agent' : 'Workflow'}\n isTopLevelSpan={!rootSpan.parentSpanId}\n scorers={scorers}\n isLoadingScorers={isLoadingScorers}\n onSuccess={() => {\n setIsScoringOpen(false);\n setSideView('scores');\n }}\n />\n )}\n </DialogContent>\n </Dialog>\n </>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAeO,SAAS,eAAe,KAAA,EAA4B;AACzD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAAA,EAAwB;AACxD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,KAAK,CAAA;AACxD,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,gBAAA,KAAqB,UAAA,EAAW;AAClE,EAAA,MAAM,WAAW,KAAA,CAAM,YAAA,GACnB,MAAM,KAAA,EAAO,IAAA,CAAK,UAAQ,IAAA,CAAK,MAAA,KAAW,KAAA,CAAM,YAAY,IAC5D,KAAA,CAAM,KAAA,EAAO,KAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,gBAAgB,IAAI,CAAA;AAEvD,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACE,GAAG,KAAA;AAAA,QACJ,eAAA,EAAiB,MAAM,gBAAA,CAAiB,IAAI,CAAA;AAAA,QAC5C,QAAA;AAAA,QACA,gBAAA,EAAkB;AAAA;AAAA,KACpB;AAAA,oBACA,GAAA,CAAC,UAAO,IAAA,EAAM,aAAA,EAAe,cAAc,gBAAA,EACzC,QAAA,kBAAA,IAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAK,IAAA,EAClB,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,YAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,QAAA,EAAA,aAAA,EAAW,CAAA,EAC1B,CAAA;AAAA,MAEC,iBAAiB,QAAA,oBAChB,GAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,QAAQ,QAAA,CAAS,MAAA;AAAA,UACjB,UAAA,EAAY,QAAA,CAAS,UAAA,KAAe,OAAA,GAAU,OAAA,GAAU,UAAA;AAAA,UACxD,cAAA,EAAgB,CAAC,QAAA,CAAS,YAAA;AAAA,UAC1B,OAAA;AAAA,UACA,gBAAA;AAAA,UACA,WAAW,MAAM;AACf,YAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,YAAA,WAAA,CAAY,QAAQ,CAAA;AAAA,UACtB;AAAA;AAAA;AACF,KAAA,EAEJ,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
4
|
|
|
5
5
|
const jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
const domains_traces_utils_spanTiming = require('../utils/span-timing.cjs.js');
|
|
6
7
|
const domains_traces_components_spanRows = require('./span-rows.cjs.js');
|
|
7
8
|
const domains_traces_components_spanTimelineRow = require('./span-timeline-row.cjs.js');
|
|
8
9
|
const domains_traces_components_spanTypeLegend = require('./span-type-legend.cjs.js');
|
|
@@ -25,7 +26,7 @@ function TraceSpanTimeline({
|
|
|
25
26
|
leadingSlot
|
|
26
27
|
}) {
|
|
27
28
|
if (isLoading) return /* @__PURE__ */ jsxRuntime.jsx(domains_traces_components_traceSpanTree.TraceSpanTreeLoading, {});
|
|
28
|
-
const overallLatency = hierarchicalSpans
|
|
29
|
+
const overallLatency = domains_traces_utils_spanTiming.getOverallLatency(hierarchicalSpans);
|
|
29
30
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
30
31
|
leadingSlot,
|
|
31
32
|
/* @__PURE__ */ jsxRuntime.jsx(domains_traces_components_spanTypeLegend.SpanTypeLegend, { spans: hierarchicalSpans }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-span-timeline.cjs.js","sources":["../../../../src/domains/traces/components/trace-span-timeline.tsx"],"sourcesContent":["import type { Dispatch, ReactNode, SetStateAction } from 'react';\nimport type { UISpan } from '../types';\nimport { SpanRows } from './span-rows';\nimport { SpanTimelineRow } from './span-timeline-row';\nimport { SpanTypeLegend } from './span-type-legend';\nimport { TraceSpanTreeLoading } from './trace-span-tree';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\nimport { formatDurationPrecise } from '@/utils/duration';\n\nexport type TraceSpanTimelineProps = {\n hierarchicalSpans: UISpan[];\n onSpanClick: (id: string) => void;\n selectedSpanId?: string;\n isLoading?: boolean;\n fadedTypes?: string[];\n expandedSpanIds?: string[];\n setExpandedSpanIds?: Dispatch<SetStateAction<string[]>>;\n featuredSpanIds?: string[];\n /** Row scrolled into view once it is mounted (ancestors auto-expand when the span is featured). */\n revealSpanId?: string;\n /** Rendered full-width above the span type legend row. */\n leadingSlot?: ReactNode;\n};\n\nconst TICKS = [0, 0.25, 0.5, 0.75, 1];\n\n/**\n * Gantt-style view of a trace: the same hierarchy and expansion state as `TraceSpanTree`,\n * but each row is a compact name cell plus a bar on a shared time axis. Rendered with its\n * own row component (`SpanTimelineRow`), independent from the tree's rows.\n */\nexport function TraceSpanTimeline({\n hierarchicalSpans = [],\n onSpanClick,\n selectedSpanId,\n isLoading,\n fadedTypes,\n expandedSpanIds,\n setExpandedSpanIds,\n featuredSpanIds,\n revealSpanId,\n leadingSlot,\n}: TraceSpanTimelineProps) {\n if (isLoading) return <TraceSpanTreeLoading />;\n\n const overallLatency = hierarchicalSpans
|
|
1
|
+
{"version":3,"file":"trace-span-timeline.cjs.js","sources":["../../../../src/domains/traces/components/trace-span-timeline.tsx"],"sourcesContent":["import type { Dispatch, ReactNode, SetStateAction } from 'react';\nimport type { UISpan } from '../types';\nimport { getOverallLatency } from '../utils/span-timing';\nimport { SpanRows } from './span-rows';\nimport { SpanTimelineRow } from './span-timeline-row';\nimport { SpanTypeLegend } from './span-type-legend';\nimport { TraceSpanTreeLoading } from './trace-span-tree';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\nimport { formatDurationPrecise } from '@/utils/duration';\n\nexport type TraceSpanTimelineProps = {\n hierarchicalSpans: UISpan[];\n onSpanClick: (id: string) => void;\n selectedSpanId?: string;\n isLoading?: boolean;\n fadedTypes?: string[];\n expandedSpanIds?: string[];\n setExpandedSpanIds?: Dispatch<SetStateAction<string[]>>;\n featuredSpanIds?: string[];\n /** Row scrolled into view once it is mounted (ancestors auto-expand when the span is featured). */\n revealSpanId?: string;\n /** Rendered full-width above the span type legend row. */\n leadingSlot?: ReactNode;\n};\n\nconst TICKS = [0, 0.25, 0.5, 0.75, 1];\n\n/**\n * Gantt-style view of a trace: the same hierarchy and expansion state as `TraceSpanTree`,\n * but each row is a compact name cell plus a bar on a shared time axis. Rendered with its\n * own row component (`SpanTimelineRow`), independent from the tree's rows.\n */\nexport function TraceSpanTimeline({\n hierarchicalSpans = [],\n onSpanClick,\n selectedSpanId,\n isLoading,\n fadedTypes,\n expandedSpanIds,\n setExpandedSpanIds,\n featuredSpanIds,\n revealSpanId,\n leadingSlot,\n}: TraceSpanTimelineProps) {\n if (isLoading) return <TraceSpanTreeLoading />;\n\n const overallLatency = getOverallLatency(hierarchicalSpans);\n\n return (\n <>\n {leadingSlot}\n <SpanTypeLegend spans={hierarchicalSpans} />\n <div className=\"grid grid-cols-[minmax(10rem,2fr)_minmax(12rem,3fr)] content-start gap-y-px overflow-hidden py-1\">\n {/* Header row: empty name cell, then the axis aligned with the bars (same horizontal padding, minus the duration label). */}\n <div />\n <div aria-label=\"Trace time axis\" className=\"grid grid-cols-[minmax(0,1fr)_auto] gap-2 px-2 pb-1\">\n <div className=\"flex justify-between tabular-nums\">\n {TICKS.map((tick, index) => (\n <Txt\n tone=\"muted\"\n as=\"span\"\n variant=\"meta\"\n key={tick}\n className={cn('whitespace-nowrap', index > 0 && index < TICKS.length - 1 && 'hidden sm:inline')}\n >\n {formatDurationPrecise(overallLatency * tick)}\n </Txt>\n ))}\n </div>\n <div className=\"w-12\" />\n </div>\n <SpanRows\n spans={hierarchicalSpans}\n onSpanClick={onSpanClick}\n selectedSpanId={selectedSpanId}\n revealSpanId={revealSpanId}\n fadedTypes={fadedTypes}\n featuredSpanIds={featuredSpanIds}\n expandedSpanIds={expandedSpanIds}\n setExpandedSpanIds={setExpandedSpanIds}\n renderRow={ctx => <SpanTimelineRow ctx={ctx} />}\n />\n </div>\n </>\n );\n}\n"],"names":["jsx","TraceSpanTreeLoading","getOverallLatency","jsxs","Fragment","SpanTypeLegend","Txt","cn","formatDurationPrecise","SpanRows","SpanTimelineRow"],"mappings":";;;;;;;;;;;;;;AA0BA,MAAM,QAAQ,CAAC,CAAA,EAAG,IAAA,EAAM,GAAA,EAAK,MAAM,CAAC,CAAA;AAO7B,SAAS,iBAAA,CAAkB;AAAA,EAChC,oBAAoB,EAAC;AAAA,EACrB,WAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,IAAI,SAAA,EAAW,uBAAOA,cAAA,CAACC,4DAAA,EAAA,EAAqB,CAAA;AAE5C,EAAA,MAAM,cAAA,GAAiBC,kDAAkB,iBAAiB,CAAA;AAE1D,EAAA,uBACEC,eAAA,CAAAC,mBAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,WAAA;AAAA,oBACDJ,cAAA,CAACK,uDAAA,EAAA,EAAe,KAAA,EAAO,iBAAA,EAAmB,CAAA;AAAA,oBAC1CF,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kGAAA,EAEb,QAAA,EAAA;AAAA,sBAAAH,cAAA,CAAC,KAAA,EAAA,EAAI,CAAA;AAAA,sBACLG,eAAA,CAAC,KAAA,EAAA,EAAI,YAAA,EAAW,iBAAA,EAAkB,WAAU,qDAAA,EAC1C,QAAA,EAAA;AAAA,wBAAAH,cAAA,CAAC,SAAI,SAAA,EAAU,mCAAA,EACZ,gBAAM,GAAA,CAAI,CAAC,MAAM,KAAA,qBAChBA,cAAA;AAAA,UAACM,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,OAAA;AAAA,YACL,EAAA,EAAG,MAAA;AAAA,YACH,OAAA,EAAQ,MAAA;AAAA,YAER,SAAA,EAAWC,YAAG,mBAAA,EAAqB,KAAA,GAAQ,KAAK,KAAA,GAAQ,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,kBAAkB,CAAA;AAAA,YAE7F,QAAA,EAAAC,oCAAA,CAAsB,iBAAiB,IAAI;AAAA,WAAA;AAAA,UAHvC;AAAA,SAKR,CAAA,EACH,CAAA;AAAA,wBACAR,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EAAO;AAAA,OAAA,EACxB,CAAA;AAAA,sBACAA,cAAA;AAAA,QAACS,2CAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,iBAAA;AAAA,UACP,WAAA;AAAA,UACA,cAAA;AAAA,UACA,YAAA;AAAA,UACA,UAAA;AAAA,UACA,eAAA;AAAA,UACA,eAAA;AAAA,UACA,kBAAA;AAAA,UACA,SAAA,EAAW,CAAA,GAAA,qBAAOT,cAAA,CAACU,yDAAA,EAAA,EAAgB,GAAA,EAAU;AAAA;AAAA;AAC/C,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { getOverallLatency } from '../utils/span-timing.es.js';
|
|
2
3
|
import { SpanRows } from './span-rows.es.js';
|
|
3
4
|
import { SpanTimelineRow } from './span-timeline-row.es.js';
|
|
4
5
|
import { SpanTypeLegend } from './span-type-legend.es.js';
|
|
@@ -21,7 +22,7 @@ function TraceSpanTimeline({
|
|
|
21
22
|
leadingSlot
|
|
22
23
|
}) {
|
|
23
24
|
if (isLoading) return /* @__PURE__ */ jsx(TraceSpanTreeLoading, {});
|
|
24
|
-
const overallLatency = hierarchicalSpans
|
|
25
|
+
const overallLatency = getOverallLatency(hierarchicalSpans);
|
|
25
26
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
26
27
|
leadingSlot,
|
|
27
28
|
/* @__PURE__ */ jsx(SpanTypeLegend, { spans: hierarchicalSpans }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-span-timeline.es.js","sources":["../../../../src/domains/traces/components/trace-span-timeline.tsx"],"sourcesContent":["import type { Dispatch, ReactNode, SetStateAction } from 'react';\nimport type { UISpan } from '../types';\nimport { SpanRows } from './span-rows';\nimport { SpanTimelineRow } from './span-timeline-row';\nimport { SpanTypeLegend } from './span-type-legend';\nimport { TraceSpanTreeLoading } from './trace-span-tree';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\nimport { formatDurationPrecise } from '@/utils/duration';\n\nexport type TraceSpanTimelineProps = {\n hierarchicalSpans: UISpan[];\n onSpanClick: (id: string) => void;\n selectedSpanId?: string;\n isLoading?: boolean;\n fadedTypes?: string[];\n expandedSpanIds?: string[];\n setExpandedSpanIds?: Dispatch<SetStateAction<string[]>>;\n featuredSpanIds?: string[];\n /** Row scrolled into view once it is mounted (ancestors auto-expand when the span is featured). */\n revealSpanId?: string;\n /** Rendered full-width above the span type legend row. */\n leadingSlot?: ReactNode;\n};\n\nconst TICKS = [0, 0.25, 0.5, 0.75, 1];\n\n/**\n * Gantt-style view of a trace: the same hierarchy and expansion state as `TraceSpanTree`,\n * but each row is a compact name cell plus a bar on a shared time axis. Rendered with its\n * own row component (`SpanTimelineRow`), independent from the tree's rows.\n */\nexport function TraceSpanTimeline({\n hierarchicalSpans = [],\n onSpanClick,\n selectedSpanId,\n isLoading,\n fadedTypes,\n expandedSpanIds,\n setExpandedSpanIds,\n featuredSpanIds,\n revealSpanId,\n leadingSlot,\n}: TraceSpanTimelineProps) {\n if (isLoading) return <TraceSpanTreeLoading />;\n\n const overallLatency = hierarchicalSpans
|
|
1
|
+
{"version":3,"file":"trace-span-timeline.es.js","sources":["../../../../src/domains/traces/components/trace-span-timeline.tsx"],"sourcesContent":["import type { Dispatch, ReactNode, SetStateAction } from 'react';\nimport type { UISpan } from '../types';\nimport { getOverallLatency } from '../utils/span-timing';\nimport { SpanRows } from './span-rows';\nimport { SpanTimelineRow } from './span-timeline-row';\nimport { SpanTypeLegend } from './span-type-legend';\nimport { TraceSpanTreeLoading } from './trace-span-tree';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\nimport { formatDurationPrecise } from '@/utils/duration';\n\nexport type TraceSpanTimelineProps = {\n hierarchicalSpans: UISpan[];\n onSpanClick: (id: string) => void;\n selectedSpanId?: string;\n isLoading?: boolean;\n fadedTypes?: string[];\n expandedSpanIds?: string[];\n setExpandedSpanIds?: Dispatch<SetStateAction<string[]>>;\n featuredSpanIds?: string[];\n /** Row scrolled into view once it is mounted (ancestors auto-expand when the span is featured). */\n revealSpanId?: string;\n /** Rendered full-width above the span type legend row. */\n leadingSlot?: ReactNode;\n};\n\nconst TICKS = [0, 0.25, 0.5, 0.75, 1];\n\n/**\n * Gantt-style view of a trace: the same hierarchy and expansion state as `TraceSpanTree`,\n * but each row is a compact name cell plus a bar on a shared time axis. Rendered with its\n * own row component (`SpanTimelineRow`), independent from the tree's rows.\n */\nexport function TraceSpanTimeline({\n hierarchicalSpans = [],\n onSpanClick,\n selectedSpanId,\n isLoading,\n fadedTypes,\n expandedSpanIds,\n setExpandedSpanIds,\n featuredSpanIds,\n revealSpanId,\n leadingSlot,\n}: TraceSpanTimelineProps) {\n if (isLoading) return <TraceSpanTreeLoading />;\n\n const overallLatency = getOverallLatency(hierarchicalSpans);\n\n return (\n <>\n {leadingSlot}\n <SpanTypeLegend spans={hierarchicalSpans} />\n <div className=\"grid grid-cols-[minmax(10rem,2fr)_minmax(12rem,3fr)] content-start gap-y-px overflow-hidden py-1\">\n {/* Header row: empty name cell, then the axis aligned with the bars (same horizontal padding, minus the duration label). */}\n <div />\n <div aria-label=\"Trace time axis\" className=\"grid grid-cols-[minmax(0,1fr)_auto] gap-2 px-2 pb-1\">\n <div className=\"flex justify-between tabular-nums\">\n {TICKS.map((tick, index) => (\n <Txt\n tone=\"muted\"\n as=\"span\"\n variant=\"meta\"\n key={tick}\n className={cn('whitespace-nowrap', index > 0 && index < TICKS.length - 1 && 'hidden sm:inline')}\n >\n {formatDurationPrecise(overallLatency * tick)}\n </Txt>\n ))}\n </div>\n <div className=\"w-12\" />\n </div>\n <SpanRows\n spans={hierarchicalSpans}\n onSpanClick={onSpanClick}\n selectedSpanId={selectedSpanId}\n revealSpanId={revealSpanId}\n fadedTypes={fadedTypes}\n featuredSpanIds={featuredSpanIds}\n expandedSpanIds={expandedSpanIds}\n setExpandedSpanIds={setExpandedSpanIds}\n renderRow={ctx => <SpanTimelineRow ctx={ctx} />}\n />\n </div>\n </>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;AA0BA,MAAM,QAAQ,CAAC,CAAA,EAAG,IAAA,EAAM,GAAA,EAAK,MAAM,CAAC,CAAA;AAO7B,SAAS,iBAAA,CAAkB;AAAA,EAChC,oBAAoB,EAAC;AAAA,EACrB,WAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,IAAI,SAAA,EAAW,uBAAO,GAAA,CAAC,oBAAA,EAAA,EAAqB,CAAA;AAE5C,EAAA,MAAM,cAAA,GAAiB,kBAAkB,iBAAiB,CAAA;AAE1D,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,WAAA;AAAA,oBACD,GAAA,CAAC,cAAA,EAAA,EAAe,KAAA,EAAO,iBAAA,EAAmB,CAAA;AAAA,oBAC1C,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kGAAA,EAEb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,CAAA;AAAA,sBACL,IAAA,CAAC,KAAA,EAAA,EAAI,YAAA,EAAW,iBAAA,EAAkB,WAAU,qDAAA,EAC1C,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,SAAI,SAAA,EAAU,mCAAA,EACZ,gBAAM,GAAA,CAAI,CAAC,MAAM,KAAA,qBAChB,GAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,OAAA;AAAA,YACL,EAAA,EAAG,MAAA;AAAA,YACH,OAAA,EAAQ,MAAA;AAAA,YAER,SAAA,EAAW,GAAG,mBAAA,EAAqB,KAAA,GAAQ,KAAK,KAAA,GAAQ,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,kBAAkB,CAAA;AAAA,YAE7F,QAAA,EAAA,qBAAA,CAAsB,iBAAiB,IAAI;AAAA,WAAA;AAAA,UAHvC;AAAA,SAKR,CAAA,EACH,CAAA;AAAA,wBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EAAO;AAAA,OAAA,EACxB,CAAA;AAAA,sBACA,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,iBAAA;AAAA,UACP,WAAA;AAAA,UACA,cAAA;AAAA,UACA,YAAA;AAAA,UACA,UAAA;AAAA,UACA,eAAA;AAAA,UACA,eAAA;AAAA,UACA,kBAAA;AAAA,UACA,SAAA,EAAW,CAAA,GAAA,qBAAO,GAAA,CAAC,eAAA,EAAA,EAAgB,GAAA,EAAU;AAAA;AAAA;AAC/C,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -8,10 +8,11 @@ const lucideReact = require('lucide-react');
|
|
|
8
8
|
const React = require('react');
|
|
9
9
|
const domains_traces_traceListColumns = require('../trace-list-columns.cjs.js');
|
|
10
10
|
const domains_traces_utils_spanUtils = require('../utils/span-utils.cjs.js');
|
|
11
|
-
const dataList = require('../../../data-list-
|
|
12
|
-
const dataListSkeleton = require('../../../data-list-skeleton-
|
|
13
|
-
const tracesDataList = require('../../../traces-data-list-
|
|
11
|
+
const dataList = require('../../../data-list-CmjTe8xE.cjs');
|
|
12
|
+
const dataListSkeleton = require('../../../data-list-skeleton-sdcaabdX.cjs');
|
|
13
|
+
const tracesDataList = require('../../../traces-data-list-Bhhg9drs.cjs');
|
|
14
14
|
const useDataListKeyboard = require('../../../use-data-list-keyboard-DF3tLe10.cjs');
|
|
15
|
+
const dataListTop = require('../../../data-list-top-DJh08vFA.cjs');
|
|
15
16
|
const dropdownMenu = require('../../../dropdown-menu-CsynT1aD.cjs');
|
|
16
17
|
const Txt = require('../../../Txt-CIS2G5Jx.cjs');
|
|
17
18
|
const primitives_transitions = require('../../../primitives/transitions.cjs.js');
|
|
@@ -132,7 +133,7 @@ function TracesListView({
|
|
|
132
133
|
}),
|
|
133
134
|
columnPreferences.metadataKeys.map((key) => /* @__PURE__ */ jsxRuntime.jsx(tracesDataList.TracesDataList.TopCellWithTooltip, { tooltip: key, children: key }, key))
|
|
134
135
|
] }),
|
|
135
|
-
isLoading ? /* @__PURE__ */ jsxRuntime.jsx(dataListSkeleton.DataListSkeletonRows, { columnCount:
|
|
136
|
+
isLoading ? /* @__PURE__ */ jsxRuntime.jsx(dataListSkeleton.DataListSkeletonRows, { columnCount: dataListTop.splitColumns(columns).length }) : traces.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
136
137
|
tracesDataList.TracesDataList.NoMatch,
|
|
137
138
|
{
|
|
138
139
|
message: filtersApplied ? "No traces found for applied filters" : "No traces found yet"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traces-list-view.cjs.js","sources":["../../../../src/domains/traces/components/traces-list-view.tsx"],"sourcesContent":["import { useVirtualizer } from '@tanstack/react-virtual';\nimport { ListFilterIcon } from 'lucide-react';\nimport { useRef } from 'react';\nimport {\n DEFAULT_TRACE_COLUMN_PREFERENCES,\n TRACE_CUSTOM_COLUMN_LABELS,\n buildTraceListColumnKeys,\n buildTraceListColumns,\n formatTraceMetadataValue,\n hasTraceColumn,\n} from '../trace-list-columns';\nimport type { TraceColumnPreferences, TraceCustomColumn, TraceUsageSummary } from '../trace-list-columns';\nimport { getInputPreview, getSpanDurationMs } from '../utils/span-utils';\nimport { DataList, DataListSkeletonRows, TracesDataList, useDataListKeyboard } from '@/ds/components/DataList';\nimport type { DataListSort } from '@/ds/components/DataList';\nimport { splitColumns } from '@/ds/components/DataList/shared';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu';\nimport { Txt } from '@/ds/components/Txt/Txt';\nimport { focusRing } from '@/ds/primitives/transitions';\nimport { formatCompactNumber, formatCost } from '@/lib/cost';\nimport { cn } from '@/lib/utils';\nimport { formatDuration } from '@/utils/duration';\n\nexport type TracesListViewTrace = {\n traceId: string;\n /** Required for branch rows; absent on plain trace rows (which are root-rooted). */\n spanId?: string | null;\n /** `null`/missing → root span. Drives the Kind column's icon (top-level trace vs nested branch). */\n parentSpanId?: string | null;\n name: string;\n entityType?: string | null;\n entityId?: string | null;\n entityName?: string | null;\n threadId?: string | null;\n resourceId?: string | null;\n environment?: string | null;\n status?: string | null;\n /** Server-rendered preview of `input`. Present on lightweight rows, which omit `input` itself. */\n inputPreview?: string | null;\n input?: unknown;\n /** Server-rendered preview of the root span's output. */\n outputPreview?: string;\n /** Server-rendered preview of the root span's error. Shown in place of the output when `status` is `'error'`. */\n errorPreview?: string;\n metadata?: Record<string, unknown> | null;\n startedAt?: Date | string | null;\n endedAt?: Date | string | null;\n createdAt: Date | string;\n};\n\nconst ROW_HEIGHT = 36;\nconst OVERSCAN = 8;\n/** Distinct values offered in a custom column's \"filter by value\" header menu. */\nconst MAX_FILTER_VALUES = 20;\n\nfunction customColumnValue(trace: TracesListViewTrace, field: TraceCustomColumn): string | null | undefined {\n return trace[field];\n}\n\nfunction distinctCustomColumnValues(traces: TracesListViewTrace[], field: TraceCustomColumn): string[] {\n const values = new Set<string>();\n for (const trace of traces) {\n const value = trace[field];\n if (typeof value === 'string' && value) values.add(value);\n if (values.size >= MAX_FILTER_VALUES) break;\n }\n return [...values];\n}\n\nfunction sumTokens(usage: TraceUsageSummary | undefined): number | undefined {\n if (usage?.inputTokens === undefined && usage?.outputTokens === undefined) return undefined;\n return (usage?.inputTokens ?? 0) + (usage?.outputTokens ?? 0);\n}\n\nexport type TracesListViewProps = {\n traces: TracesListViewTrace[];\n isLoading?: boolean;\n isFetchingNextPage?: boolean;\n hasNextPage?: boolean;\n setEndOfListElement?: (element: HTMLDivElement | null) => void;\n filtersApplied?: boolean;\n /** Currently featured/selected trace — its row gets the highlighted background. */\n featuredTraceId?: string | null;\n /**\n * Required in branches mode to disambiguate rows sharing a `traceId`. When set,\n * a row is featured only when both `traceId` and `spanId` match.\n */\n featuredSpanId?: string | null;\n /** Branches mode mixes root traces with subtraces — enables the Trace/Subtrace tooltip on the\n * level icon in the Name column, which is meaningless when every row is a root. */\n isBranchesMode?: boolean;\n /** Keys (`traceId:spanId`) of rows that just arrived via delta polling. Rows whose key is in\n * this set get a temporary tint to distinguish them from rows present since the last page-mode\n * fetch. Auto-expires upstream (in useTraces) after a short window. */\n recentlyAddedKeys?: Set<string>;\n /** Optional and metadata columns selected for this project. */\n columnPreferences?: TraceColumnPreferences;\n /** Token and estimated-cost totals, aggregated across model spans by trace ID. */\n usageByTraceId?: ReadonlyMap<string, TraceUsageSummary>;\n /** Called when a row is clicked. The current selection logic (toggle on same id) is the consumer's call. */\n onTraceClick: (trace: TracesListViewTrace) => void;\n /** Current sort of the Created column. When `onSortChange` is provided the header becomes sortable. */\n createdSort?: DataListSort;\n onSortChange?: (direction: DataListSort, key: 'startedAt') => void;\n /** When provided, custom column headers offer an `is <value>` filter for every value currently listed. */\n onFilterByField?: (field: TraceCustomColumn, value: string) => void;\n /** Storage id for the persisted column order. Use a distinct id per page so each keeps its own order. */\n listId?: string;\n};\n\n/**\n * Virtualized presentational list. Renders only the visible window via TanStack Virtual, and\n * uses DataList primitives for layout (CSS Grid with subgrid rows).\n */\nexport function TracesListView({\n traces,\n isLoading,\n isFetchingNextPage,\n hasNextPage,\n setEndOfListElement,\n filtersApplied,\n featuredTraceId,\n featuredSpanId,\n isBranchesMode,\n recentlyAddedKeys,\n columnPreferences = DEFAULT_TRACE_COLUMN_PREFERENCES,\n usageByTraceId,\n onTraceClick,\n createdSort,\n onSortChange,\n onFilterByField,\n listId = 'all-traces',\n}: TracesListViewProps) {\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const columns = buildTraceListColumns(columnPreferences);\n const columnKeys = buildTraceListColumnKeys(columnPreferences);\n\n const virtualizer = useVirtualizer({\n count: traces.length,\n getScrollElement: () => scrollRef.current,\n estimateSize: () => ROW_HEIGHT,\n overscan: OVERSCAN,\n });\n\n const { getRowProps } = useDataListKeyboard({\n count: traces.length,\n containerRef: scrollRef,\n onNavigate: index => virtualizer.scrollToIndex(index),\n global: true,\n });\n\n const virtualItems = virtualizer.getVirtualItems();\n const totalSize = virtualizer.getTotalSize();\n const paddingTop = virtualItems[0]?.start ?? 0;\n const paddingBottom =\n virtualItems.length > 0 ? Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0)) : 0;\n\n return (\n <TracesDataList\n reorderable\n id={listId}\n columns={columns}\n columnKeys={columnKeys}\n fit=\"container\"\n scrollRef={scrollRef}\n className=\"min-w-0\"\n >\n <TracesDataList.Top>\n {onSortChange ? (\n <TracesDataList.SortableTopCell sortKey=\"startedAt\" sort={createdSort} onSortChange={onSortChange}>\n Start\n </TracesDataList.SortableTopCell>\n ) : (\n <TracesDataList.TopCell>Start</TracesDataList.TopCell>\n )}\n {hasTraceColumn(columnPreferences, 'type') && <TracesDataList.TopCell>Primitive type</TracesDataList.TopCell>}\n <TracesDataList.TopCell>Primitive name</TracesDataList.TopCell>\n {hasTraceColumn(columnPreferences, 'input') && <TracesDataList.TopCell>Input</TracesDataList.TopCell>}\n {hasTraceColumn(columnPreferences, 'output') && <TracesDataList.TopCell>Output</TracesDataList.TopCell>}\n <TracesDataList.TopCell>Status</TracesDataList.TopCell>\n {hasTraceColumn(columnPreferences, 'duration') && (\n <TracesDataList.TopCell className=\"justify-end text-right\">Duration</TracesDataList.TopCell>\n )}\n {hasTraceColumn(columnPreferences, 'endTime') && <TracesDataList.TopCell>End</TracesDataList.TopCell>}\n {hasTraceColumn(columnPreferences, 'environment') && (\n <TracesDataList.TopCell>Environment</TracesDataList.TopCell>\n )}\n {hasTraceColumn(columnPreferences, 'inputTokens') && (\n <TracesDataList.TopCell className=\"justify-end text-right\">Input tokens</TracesDataList.TopCell>\n )}\n {hasTraceColumn(columnPreferences, 'outputTokens') && (\n <TracesDataList.TopCell className=\"justify-end text-right\">Output tokens</TracesDataList.TopCell>\n )}\n {hasTraceColumn(columnPreferences, 'totalTokens') && (\n <TracesDataList.TopCell className=\"justify-end text-right\">Total tokens</TracesDataList.TopCell>\n )}\n {hasTraceColumn(columnPreferences, 'estimatedCost') && (\n <TracesDataList.TopCell className=\"justify-end text-right\">Est. cost</TracesDataList.TopCell>\n )}\n {columnPreferences.customColumns.map(field => {\n const label = TRACE_CUSTOM_COLUMN_LABELS[field];\n const filterValues = onFilterByField ? distinctCustomColumnValues(traces, field) : [];\n if (!onFilterByField || filterValues.length === 0) {\n return <TracesDataList.TopCell key={field}>{label}</TracesDataList.TopCell>;\n }\n return (\n <TracesDataList.TopCell key={field} className=\"overflow-visible\">\n <DropdownMenu>\n <DropdownMenu.Trigger\n render={\n <button\n type=\"button\"\n className={cn('flex min-w-0 items-center gap-1 rounded-sm hover:text-foreground', focusRing)}\n >\n <span className=\"min-w-0 truncate\">{label}</span>\n <ListFilterIcon aria-hidden className=\"size-[1.2em] shrink-0\" />\n </button>\n }\n />\n <DropdownMenu.Content align=\"start\">\n <DropdownMenu.Label>Filter by value</DropdownMenu.Label>\n {filterValues.map(value => (\n <DropdownMenu.Item key={value} onSelect={() => onFilterByField(field, value)}>\n <Txt as=\"span\" variant=\"body-sm\" font=\"mono\" className=\"min-w-0 truncate\">\n {value}\n </Txt>\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu>\n </TracesDataList.TopCell>\n );\n })}\n {columnPreferences.metadataKeys.map(key => (\n <TracesDataList.TopCellWithTooltip key={key} tooltip={key}>\n {key}\n </TracesDataList.TopCellWithTooltip>\n ))}\n </TracesDataList.Top>\n\n {isLoading ? (\n <DataListSkeletonRows columnCount={splitColumns(columns).length} />\n ) : traces.length === 0 ? (\n <TracesDataList.NoMatch\n message={filtersApplied ? 'No traces found for applied filters' : 'No traces found yet'}\n />\n ) : (\n <>\n <TracesDataList.Spacer height={paddingTop} />\n {virtualItems.map(vi => {\n const trace = traces[vi.index];\n if (!trace) return null;\n\n const isFeatured =\n trace.traceId === featuredTraceId && (featuredSpanId == null || trace.spanId === featuredSpanId);\n const rowKey = `${trace.traceId}:${trace.spanId ?? ''}`;\n const isRecentlyAdded = recentlyAddedKeys?.has(rowKey) ?? false;\n const displayDate = trace.startedAt ?? trace.createdAt;\n const usage = usageByTraceId?.get(trace.traceId);\n\n return (\n <TracesDataList.RowButton\n key={rowKey}\n ref={virtualizer.measureElement}\n data-index={vi.index}\n {...getRowProps(vi.index)}\n onClick={() => onTraceClick(trace)}\n featured={isFeatured}\n className={cn(isRecentlyAdded && 'animate-row-highlight')}\n >\n <TracesDataList.CreatedCell timestamp={displayDate} preset=\"day-time-seconds\" />\n {hasTraceColumn(columnPreferences, 'type') && <TracesDataList.TypeCell entityType={trace.entityType} />}\n <TracesDataList.NameCell\n name={trace.entityName || trace.name}\n parentSpanId={trace.parentSpanId}\n showLevelTooltip={isBranchesMode}\n />\n {hasTraceColumn(columnPreferences, 'input') && (\n <TracesDataList.InputCell input={trace.inputPreview ?? getInputPreview(trace.input)} />\n )}\n {hasTraceColumn(columnPreferences, 'output') && (\n <TracesDataList.OutputCell\n output={trace.outputPreview}\n error={trace.errorPreview}\n status={trace.status}\n />\n )}\n <TracesDataList.StatusCell status={trace.status} />\n {hasTraceColumn(columnPreferences, 'duration') && (\n <DataList.NumberCell font=\"mono\">\n {formatDuration(getSpanDurationMs(trace.startedAt, trace.endedAt))}\n </DataList.NumberCell>\n )}\n {hasTraceColumn(columnPreferences, 'endTime') && (\n <TracesDataList.CreatedCell timestamp={trace.endedAt ?? ''} preset=\"day-time-seconds\" />\n )}\n {hasTraceColumn(columnPreferences, 'environment') && (\n <DataList.TextCell>{trace.environment || '—'}</DataList.TextCell>\n )}\n {hasTraceColumn(columnPreferences, 'inputTokens') && (\n <DataList.NumberCell>\n {usage?.inputTokens === undefined ? undefined : formatCompactNumber(usage.inputTokens)}\n </DataList.NumberCell>\n )}\n {hasTraceColumn(columnPreferences, 'outputTokens') && (\n <DataList.NumberCell>\n {usage?.outputTokens === undefined ? undefined : formatCompactNumber(usage.outputTokens)}\n </DataList.NumberCell>\n )}\n {hasTraceColumn(columnPreferences, 'totalTokens') && (\n <DataList.NumberCell>\n {(() => {\n const total = sumTokens(usage);\n return total === undefined ? undefined : formatCompactNumber(total);\n })()}\n </DataList.NumberCell>\n )}\n {hasTraceColumn(columnPreferences, 'estimatedCost') && (\n <DataList.NumberCell>\n {usage?.estimatedCost === undefined ? undefined : formatCost(usage.estimatedCost, usage.costUnit)}\n </DataList.NumberCell>\n )}\n {columnPreferences.customColumns.map(field => (\n <DataList.TextCell font=\"mono\" key={field}>\n {customColumnValue(trace, field) ?? undefined}\n </DataList.TextCell>\n ))}\n {columnPreferences.metadataKeys.map(key => {\n const value = formatTraceMetadataValue(trace.metadata, key);\n return (\n <DataList.TextCell font=\"mono\" key={key}>\n {value}\n </DataList.TextCell>\n );\n })}\n </TracesDataList.RowButton>\n );\n })}\n <TracesDataList.Spacer height={paddingBottom} />\n <TracesDataList.NextPageLoading\n isLoading={isFetchingNextPage}\n hasMore={hasNextPage}\n setEndOfListElement={setEndOfListElement}\n />\n </>\n )}\n </TracesDataList>\n );\n}\n"],"names":["DEFAULT_TRACE_COLUMN_PREFERENCES","useRef","buildTraceListColumns","buildTraceListColumnKeys","useVirtualizer","useDataListKeyboard","jsxs","TracesDataList","jsx","hasTraceColumn","TRACE_CUSTOM_COLUMN_LABELS","DropdownMenu","cn","focusRing","ListFilterIcon","Txt","DataListSkeletonRows","splitColumns","Fragment","getInputPreview","DataList","getSpanDurationMs","formatCompactNumber","formatCost","formatTraceMetadataValue"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"traces-list-view.cjs.js","sources":["../../../../src/domains/traces/components/traces-list-view.tsx"],"sourcesContent":["import { useVirtualizer } from '@tanstack/react-virtual';\nimport { ListFilterIcon } from 'lucide-react';\nimport { useRef } from 'react';\nimport {\n DEFAULT_TRACE_COLUMN_PREFERENCES,\n TRACE_CUSTOM_COLUMN_LABELS,\n buildTraceListColumnKeys,\n buildTraceListColumns,\n formatTraceMetadataValue,\n hasTraceColumn,\n} from '../trace-list-columns';\nimport type { TraceColumnPreferences, TraceCustomColumn, TraceUsageSummary } from '../trace-list-columns';\nimport { getInputPreview, getSpanDurationMs } from '../utils/span-utils';\nimport { DataList, DataListSkeletonRows, TracesDataList, useDataListKeyboard } from '@/ds/components/DataList';\nimport type { DataListSort } from '@/ds/components/DataList';\nimport { splitColumns } from '@/ds/components/DataList/shared';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu';\nimport { Txt } from '@/ds/components/Txt/Txt';\nimport { focusRing } from '@/ds/primitives/transitions';\nimport { formatCompactNumber, formatCost } from '@/lib/cost';\nimport { cn } from '@/lib/utils';\nimport { formatDuration } from '@/utils/duration';\n\nexport type TracesListViewTrace = {\n traceId: string;\n /** Required for branch rows; absent on plain trace rows (which are root-rooted). */\n spanId?: string | null;\n /** `null`/missing → root span. Drives the Kind column's icon (top-level trace vs nested branch). */\n parentSpanId?: string | null;\n name: string;\n entityType?: string | null;\n entityId?: string | null;\n entityName?: string | null;\n threadId?: string | null;\n resourceId?: string | null;\n environment?: string | null;\n status?: string | null;\n /** Server-rendered preview of `input`. Present on lightweight rows, which omit `input` itself. */\n inputPreview?: string | null;\n input?: unknown;\n /** Server-rendered preview of the root span's output. */\n outputPreview?: string;\n /** Server-rendered preview of the root span's error. Shown in place of the output when `status` is `'error'`. */\n errorPreview?: string;\n metadata?: Record<string, unknown> | null;\n startedAt?: Date | string | null;\n endedAt?: Date | string | null;\n createdAt: Date | string;\n};\n\nconst ROW_HEIGHT = 36;\nconst OVERSCAN = 8;\n/** Distinct values offered in a custom column's \"filter by value\" header menu. */\nconst MAX_FILTER_VALUES = 20;\n\nfunction customColumnValue(trace: TracesListViewTrace, field: TraceCustomColumn): string | null | undefined {\n return trace[field];\n}\n\nfunction distinctCustomColumnValues(traces: TracesListViewTrace[], field: TraceCustomColumn): string[] {\n const values = new Set<string>();\n for (const trace of traces) {\n const value = trace[field];\n if (typeof value === 'string' && value) values.add(value);\n if (values.size >= MAX_FILTER_VALUES) break;\n }\n return [...values];\n}\n\nfunction sumTokens(usage: TraceUsageSummary | undefined): number | undefined {\n if (usage?.inputTokens === undefined && usage?.outputTokens === undefined) return undefined;\n return (usage?.inputTokens ?? 0) + (usage?.outputTokens ?? 0);\n}\n\nexport type TracesListViewProps = {\n traces: TracesListViewTrace[];\n isLoading?: boolean;\n isFetchingNextPage?: boolean;\n hasNextPage?: boolean;\n setEndOfListElement?: (element: HTMLDivElement | null) => void;\n filtersApplied?: boolean;\n /** Currently featured/selected trace — its row gets the highlighted background. */\n featuredTraceId?: string | null;\n /**\n * Required in branches mode to disambiguate rows sharing a `traceId`. When set,\n * a row is featured only when both `traceId` and `spanId` match.\n */\n featuredSpanId?: string | null;\n /** Branches mode mixes root traces with subtraces — enables the Trace/Subtrace tooltip on the\n * level icon in the Name column, which is meaningless when every row is a root. */\n isBranchesMode?: boolean;\n /** Keys (`traceId:spanId`) of rows that just arrived via delta polling. Rows whose key is in\n * this set get a temporary tint to distinguish them from rows present since the last page-mode\n * fetch. Auto-expires upstream (in useTraces) after a short window. */\n recentlyAddedKeys?: Set<string>;\n /** Optional and metadata columns selected for this project. */\n columnPreferences?: TraceColumnPreferences;\n /** Token and estimated-cost totals, aggregated across model spans by trace ID. */\n usageByTraceId?: ReadonlyMap<string, TraceUsageSummary>;\n /** Called when a row is clicked. The current selection logic (toggle on same id) is the consumer's call. */\n onTraceClick: (trace: TracesListViewTrace) => void;\n /** Current sort of the Created column. When `onSortChange` is provided the header becomes sortable. */\n createdSort?: DataListSort;\n onSortChange?: (direction: DataListSort, key: 'startedAt') => void;\n /** When provided, custom column headers offer an `is <value>` filter for every value currently listed. */\n onFilterByField?: (field: TraceCustomColumn, value: string) => void;\n /** Storage id for the persisted column order. Use a distinct id per page so each keeps its own order. */\n listId?: string;\n};\n\n/**\n * Virtualized presentational list. Renders only the visible window via TanStack Virtual, and\n * uses DataList primitives for layout (CSS Grid with subgrid rows).\n */\nexport function TracesListView({\n traces,\n isLoading,\n isFetchingNextPage,\n hasNextPage,\n setEndOfListElement,\n filtersApplied,\n featuredTraceId,\n featuredSpanId,\n isBranchesMode,\n recentlyAddedKeys,\n columnPreferences = DEFAULT_TRACE_COLUMN_PREFERENCES,\n usageByTraceId,\n onTraceClick,\n createdSort,\n onSortChange,\n onFilterByField,\n listId = 'all-traces',\n}: TracesListViewProps) {\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const columns = buildTraceListColumns(columnPreferences);\n const columnKeys = buildTraceListColumnKeys(columnPreferences);\n\n const virtualizer = useVirtualizer({\n count: traces.length,\n getScrollElement: () => scrollRef.current,\n estimateSize: () => ROW_HEIGHT,\n overscan: OVERSCAN,\n });\n\n const { getRowProps } = useDataListKeyboard({\n count: traces.length,\n containerRef: scrollRef,\n onNavigate: index => virtualizer.scrollToIndex(index),\n global: true,\n });\n\n const virtualItems = virtualizer.getVirtualItems();\n const totalSize = virtualizer.getTotalSize();\n const paddingTop = virtualItems[0]?.start ?? 0;\n const paddingBottom =\n virtualItems.length > 0 ? Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0)) : 0;\n\n return (\n <TracesDataList\n reorderable\n id={listId}\n columns={columns}\n columnKeys={columnKeys}\n fit=\"container\"\n scrollRef={scrollRef}\n className=\"min-w-0\"\n >\n <TracesDataList.Top>\n {onSortChange ? (\n <TracesDataList.SortableTopCell sortKey=\"startedAt\" sort={createdSort} onSortChange={onSortChange}>\n Start\n </TracesDataList.SortableTopCell>\n ) : (\n <TracesDataList.TopCell>Start</TracesDataList.TopCell>\n )}\n {hasTraceColumn(columnPreferences, 'type') && <TracesDataList.TopCell>Primitive type</TracesDataList.TopCell>}\n <TracesDataList.TopCell>Primitive name</TracesDataList.TopCell>\n {hasTraceColumn(columnPreferences, 'input') && <TracesDataList.TopCell>Input</TracesDataList.TopCell>}\n {hasTraceColumn(columnPreferences, 'output') && <TracesDataList.TopCell>Output</TracesDataList.TopCell>}\n <TracesDataList.TopCell>Status</TracesDataList.TopCell>\n {hasTraceColumn(columnPreferences, 'duration') && (\n <TracesDataList.TopCell className=\"justify-end text-right\">Duration</TracesDataList.TopCell>\n )}\n {hasTraceColumn(columnPreferences, 'endTime') && <TracesDataList.TopCell>End</TracesDataList.TopCell>}\n {hasTraceColumn(columnPreferences, 'environment') && (\n <TracesDataList.TopCell>Environment</TracesDataList.TopCell>\n )}\n {hasTraceColumn(columnPreferences, 'inputTokens') && (\n <TracesDataList.TopCell className=\"justify-end text-right\">Input tokens</TracesDataList.TopCell>\n )}\n {hasTraceColumn(columnPreferences, 'outputTokens') && (\n <TracesDataList.TopCell className=\"justify-end text-right\">Output tokens</TracesDataList.TopCell>\n )}\n {hasTraceColumn(columnPreferences, 'totalTokens') && (\n <TracesDataList.TopCell className=\"justify-end text-right\">Total tokens</TracesDataList.TopCell>\n )}\n {hasTraceColumn(columnPreferences, 'estimatedCost') && (\n <TracesDataList.TopCell className=\"justify-end text-right\">Est. cost</TracesDataList.TopCell>\n )}\n {columnPreferences.customColumns.map(field => {\n const label = TRACE_CUSTOM_COLUMN_LABELS[field];\n const filterValues = onFilterByField ? distinctCustomColumnValues(traces, field) : [];\n if (!onFilterByField || filterValues.length === 0) {\n return <TracesDataList.TopCell key={field}>{label}</TracesDataList.TopCell>;\n }\n return (\n <TracesDataList.TopCell key={field} className=\"overflow-visible\">\n <DropdownMenu>\n <DropdownMenu.Trigger\n render={\n <button\n type=\"button\"\n className={cn('flex min-w-0 items-center gap-1 rounded-sm hover:text-foreground', focusRing)}\n >\n <span className=\"min-w-0 truncate\">{label}</span>\n <ListFilterIcon aria-hidden className=\"size-[1.2em] shrink-0\" />\n </button>\n }\n />\n <DropdownMenu.Content align=\"start\">\n <DropdownMenu.Label>Filter by value</DropdownMenu.Label>\n {filterValues.map(value => (\n <DropdownMenu.Item key={value} onSelect={() => onFilterByField(field, value)}>\n <Txt as=\"span\" variant=\"body-sm\" font=\"mono\" className=\"min-w-0 truncate\">\n {value}\n </Txt>\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu>\n </TracesDataList.TopCell>\n );\n })}\n {columnPreferences.metadataKeys.map(key => (\n <TracesDataList.TopCellWithTooltip key={key} tooltip={key}>\n {key}\n </TracesDataList.TopCellWithTooltip>\n ))}\n </TracesDataList.Top>\n\n {isLoading ? (\n <DataListSkeletonRows columnCount={splitColumns(columns).length} />\n ) : traces.length === 0 ? (\n <TracesDataList.NoMatch\n message={filtersApplied ? 'No traces found for applied filters' : 'No traces found yet'}\n />\n ) : (\n <>\n <TracesDataList.Spacer height={paddingTop} />\n {virtualItems.map(vi => {\n const trace = traces[vi.index];\n if (!trace) return null;\n\n const isFeatured =\n trace.traceId === featuredTraceId && (featuredSpanId == null || trace.spanId === featuredSpanId);\n const rowKey = `${trace.traceId}:${trace.spanId ?? ''}`;\n const isRecentlyAdded = recentlyAddedKeys?.has(rowKey) ?? false;\n const displayDate = trace.startedAt ?? trace.createdAt;\n const usage = usageByTraceId?.get(trace.traceId);\n\n return (\n <TracesDataList.RowButton\n key={rowKey}\n ref={virtualizer.measureElement}\n data-index={vi.index}\n {...getRowProps(vi.index)}\n onClick={() => onTraceClick(trace)}\n featured={isFeatured}\n className={cn(isRecentlyAdded && 'animate-row-highlight')}\n >\n <TracesDataList.CreatedCell timestamp={displayDate} preset=\"day-time-seconds\" />\n {hasTraceColumn(columnPreferences, 'type') && <TracesDataList.TypeCell entityType={trace.entityType} />}\n <TracesDataList.NameCell\n name={trace.entityName || trace.name}\n parentSpanId={trace.parentSpanId}\n showLevelTooltip={isBranchesMode}\n />\n {hasTraceColumn(columnPreferences, 'input') && (\n <TracesDataList.InputCell input={trace.inputPreview ?? getInputPreview(trace.input)} />\n )}\n {hasTraceColumn(columnPreferences, 'output') && (\n <TracesDataList.OutputCell\n output={trace.outputPreview}\n error={trace.errorPreview}\n status={trace.status}\n />\n )}\n <TracesDataList.StatusCell status={trace.status} />\n {hasTraceColumn(columnPreferences, 'duration') && (\n <DataList.NumberCell font=\"mono\">\n {formatDuration(getSpanDurationMs(trace.startedAt, trace.endedAt))}\n </DataList.NumberCell>\n )}\n {hasTraceColumn(columnPreferences, 'endTime') && (\n <TracesDataList.CreatedCell timestamp={trace.endedAt ?? ''} preset=\"day-time-seconds\" />\n )}\n {hasTraceColumn(columnPreferences, 'environment') && (\n <DataList.TextCell>{trace.environment || '—'}</DataList.TextCell>\n )}\n {hasTraceColumn(columnPreferences, 'inputTokens') && (\n <DataList.NumberCell>\n {usage?.inputTokens === undefined ? undefined : formatCompactNumber(usage.inputTokens)}\n </DataList.NumberCell>\n )}\n {hasTraceColumn(columnPreferences, 'outputTokens') && (\n <DataList.NumberCell>\n {usage?.outputTokens === undefined ? undefined : formatCompactNumber(usage.outputTokens)}\n </DataList.NumberCell>\n )}\n {hasTraceColumn(columnPreferences, 'totalTokens') && (\n <DataList.NumberCell>\n {(() => {\n const total = sumTokens(usage);\n return total === undefined ? undefined : formatCompactNumber(total);\n })()}\n </DataList.NumberCell>\n )}\n {hasTraceColumn(columnPreferences, 'estimatedCost') && (\n <DataList.NumberCell>\n {usage?.estimatedCost === undefined ? undefined : formatCost(usage.estimatedCost, usage.costUnit)}\n </DataList.NumberCell>\n )}\n {columnPreferences.customColumns.map(field => (\n <DataList.TextCell font=\"mono\" key={field}>\n {customColumnValue(trace, field) ?? undefined}\n </DataList.TextCell>\n ))}\n {columnPreferences.metadataKeys.map(key => {\n const value = formatTraceMetadataValue(trace.metadata, key);\n return (\n <DataList.TextCell font=\"mono\" key={key}>\n {value}\n </DataList.TextCell>\n );\n })}\n </TracesDataList.RowButton>\n );\n })}\n <TracesDataList.Spacer height={paddingBottom} />\n <TracesDataList.NextPageLoading\n isLoading={isFetchingNextPage}\n hasMore={hasNextPage}\n setEndOfListElement={setEndOfListElement}\n />\n </>\n )}\n </TracesDataList>\n );\n}\n"],"names":["DEFAULT_TRACE_COLUMN_PREFERENCES","useRef","buildTraceListColumns","buildTraceListColumnKeys","useVirtualizer","useDataListKeyboard","jsxs","TracesDataList","jsx","hasTraceColumn","TRACE_CUSTOM_COLUMN_LABELS","DropdownMenu","cn","focusRing","ListFilterIcon","Txt","DataListSkeletonRows","splitColumns","Fragment","getInputPreview","DataList","getSpanDurationMs","formatCompactNumber","formatCost","formatTraceMetadataValue"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAkDA,MAAM,UAAA,GAAa,EAAA;AACnB,MAAM,QAAA,GAAW,CAAA;AAEjB,MAAM,iBAAA,GAAoB,EAAA;AAE1B,SAAS,iBAAA,CAAkB,OAA4B,KAAA,EAAqD;AAC1G,EAAA,OAAO,MAAM,KAAK,CAAA;AACpB;AAEA,SAAS,0BAAA,CAA2B,QAA+B,KAAA,EAAoC;AACrG,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAC/B,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAK,CAAA;AACzB,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,EAAO,MAAA,CAAO,IAAI,KAAK,CAAA;AACxD,IAAA,IAAI,MAAA,CAAO,QAAQ,iBAAA,EAAmB;AAAA,EACxC;AACA,EAAA,OAAO,CAAC,GAAG,MAAM,CAAA;AACnB;AAEA,SAAS,UAAU,KAAA,EAA0D;AAC3E,EAAA,IAAI,OAAO,WAAA,KAAgB,MAAA,IAAa,KAAA,EAAO,YAAA,KAAiB,QAAW,OAAO,MAAA;AAClF,EAAA,OAAA,CAAQ,KAAA,EAAO,WAAA,IAAe,CAAA,KAAM,KAAA,EAAO,YAAA,IAAgB,CAAA,CAAA;AAC7D;AA0CO,SAAS,cAAA,CAAe;AAAA,EAC7B,MAAA;AAAA,EACA,SAAA;AAAA,EACA,kBAAA;AAAA,EACA,WAAA;AAAA,EACA,mBAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA,GAAoBA,gEAAA;AAAA,EACpB,cAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,MAAA,GAAS;AACX,CAAA,EAAwB;AACtB,EAAA,MAAM,SAAA,GAAYC,aAA8B,IAAI,CAAA;AACpD,EAAA,MAAM,OAAA,GAAUC,sDAAsB,iBAAiB,CAAA;AACvD,EAAA,MAAM,UAAA,GAAaC,yDAAyB,iBAAiB,CAAA;AAE7D,EAAA,MAAM,cAAcC,2BAAA,CAAe;AAAA,IACjC,OAAO,MAAA,CAAO,MAAA;AAAA,IACd,gBAAA,EAAkB,MAAM,SAAA,CAAU,OAAA;AAAA,IAClC,cAAc,MAAM,UAAA;AAAA,IACpB,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,EAAE,WAAA,EAAY,GAAIC,uCAAA,CAAoB;AAAA,IAC1C,OAAO,MAAA,CAAO,MAAA;AAAA,IACd,YAAA,EAAc,SAAA;AAAA,IACd,UAAA,EAAY,CAAA,KAAA,KAAS,WAAA,CAAY,aAAA,CAAc,KAAK,CAAA;AAAA,IACpD,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,YAAY,eAAA,EAAgB;AACjD,EAAA,MAAM,SAAA,GAAY,YAAY,YAAA,EAAa;AAC3C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAC,CAAA,EAAG,KAAA,IAAS,CAAA;AAC7C,EAAA,MAAM,aAAA,GACJ,YAAA,CAAa,MAAA,GAAS,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,EAAG,SAAA,IAAa,YAAA,CAAa,aAAa,MAAA,GAAS,CAAC,CAAA,EAAG,GAAA,IAAO,EAAE,CAAA,GAAI,CAAA;AAEzG,EAAA,uBACEC,eAAA;AAAA,IAACC,6BAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAW,IAAA;AAAA,MACX,EAAA,EAAI,MAAA;AAAA,MACJ,OAAA;AAAA,MACA,UAAA;AAAA,MACA,GAAA,EAAI,WAAA;AAAA,MACJ,SAAA;AAAA,MACA,SAAA,EAAU,SAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAD,eAAA,CAACC,6BAAA,CAAe,KAAf,EACE,QAAA,EAAA;AAAA,UAAA,YAAA,mBACCC,cAAA,CAACD,6BAAA,CAAe,eAAA,EAAf,EAA+B,SAAQ,WAAA,EAAY,IAAA,EAAM,WAAA,EAAa,YAAA,EAA4B,mBAEnG,CAAA,mBAEAC,cAAA,CAACD,6BAAA,CAAe,OAAA,EAAf,EAAuB,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,UAE9BE,8CAAA,CAAe,mBAAmB,MAAM,CAAA,mCAAMF,6BAAA,CAAe,OAAA,EAAf,EAAuB,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,0BACpFC,cAAA,CAACD,6BAAA,CAAe,OAAA,EAAf,EAAuB,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,UACrCE,8CAAA,CAAe,mBAAmB,OAAO,CAAA,mCAAMF,6BAAA,CAAe,OAAA,EAAf,EAAuB,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,UAC3EE,8CAAA,CAAe,mBAAmB,QAAQ,CAAA,mCAAMF,6BAAA,CAAe,OAAA,EAAf,EAAuB,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,0BAC9EC,cAAA,CAACD,6BAAA,CAAe,OAAA,EAAf,EAAuB,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,UAC7BE,8CAAA,CAAe,iBAAA,EAAmB,UAAU,CAAA,oBAC3CD,cAAA,CAACD,8BAAe,OAAA,EAAf,EAAuB,SAAA,EAAU,wBAAA,EAAyB,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,UAEpEE,8CAAA,CAAe,mBAAmB,SAAS,CAAA,mCAAMF,6BAAA,CAAe,OAAA,EAAf,EAAuB,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,UAC3EE,8CAAA,CAAe,mBAAmB,aAAa,CAAA,mCAC7CF,6BAAA,CAAe,OAAA,EAAf,EAAuB,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,UAEpCE,8CAAA,CAAe,iBAAA,EAAmB,aAAa,CAAA,oBAC9CD,cAAA,CAACD,8BAAe,OAAA,EAAf,EAAuB,SAAA,EAAU,wBAAA,EAAyB,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,UAExEE,8CAAA,CAAe,iBAAA,EAAmB,cAAc,CAAA,oBAC/CD,cAAA,CAACD,8BAAe,OAAA,EAAf,EAAuB,SAAA,EAAU,wBAAA,EAAyB,QAAA,EAAA,eAAA,EAAa,CAAA;AAAA,UAEzEE,8CAAA,CAAe,iBAAA,EAAmB,aAAa,CAAA,oBAC9CD,cAAA,CAACD,8BAAe,OAAA,EAAf,EAAuB,SAAA,EAAU,wBAAA,EAAyB,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,UAExEE,8CAAA,CAAe,iBAAA,EAAmB,eAAe,CAAA,oBAChDD,cAAA,CAACD,8BAAe,OAAA,EAAf,EAAuB,SAAA,EAAU,wBAAA,EAAyB,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,UAErE,iBAAA,CAAkB,aAAA,CAAc,GAAA,CAAI,CAAA,KAAA,KAAS;AAC5C,YAAA,MAAM,KAAA,GAAQG,2DAA2B,KAAK,CAAA;AAC9C,YAAA,MAAM,eAAe,eAAA,GAAkB,0BAAA,CAA2B,MAAA,EAAQ,KAAK,IAAI,EAAC;AACpF,YAAA,IAAI,CAAC,eAAA,IAAmB,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG;AACjD,cAAA,uBAAOF,cAAA,CAACD,6BAAA,CAAe,OAAA,EAAf,EAAoC,mBAAR,KAAc,CAAA;AAAA,YACpD;AACA,YAAA,sCACGA,6BAAA,CAAe,OAAA,EAAf,EAAmC,SAAA,EAAU,kBAAA,EAC5C,0CAACI,yBAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAAH,cAAA;AAAA,gBAACG,yBAAA,CAAa,OAAA;AAAA,gBAAb;AAAA,kBACC,MAAA,kBACEL,eAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,SAAA,EAAWM,WAAA,CAAG,kEAAA,EAAoEC,gCAAS,CAAA;AAAA,sBAE3F,QAAA,EAAA;AAAA,wCAAAL,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAoB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wCAC1CA,cAAA,CAACM,0BAAA,EAAA,EAAe,aAAA,EAAW,IAAA,EAAC,WAAU,uBAAA,EAAwB;AAAA;AAAA;AAAA;AAChE;AAAA,eAEJ;AAAA,8BACAR,eAAA,CAACK,yBAAA,CAAa,OAAA,EAAb,EAAqB,OAAM,OAAA,EAC1B,QAAA,EAAA;AAAA,gCAAAH,cAAA,CAACG,yBAAA,CAAa,KAAA,EAAb,EAAmB,QAAA,EAAA,iBAAA,EAAe,CAAA;AAAA,gBAClC,YAAA,CAAa,GAAA,CAAI,CAAA,KAAA,qBAChBH,cAAA,CAACG,yBAAA,CAAa,IAAA,EAAb,EAA8B,QAAA,EAAU,MAAM,eAAA,CAAgB,KAAA,EAAO,KAAK,CAAA,EACzE,yCAACI,OAAA,EAAA,EAAI,EAAA,EAAG,MAAA,EAAO,OAAA,EAAQ,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,SAAA,EAAU,kBAAA,EACpD,QAAA,EAAA,KAAA,EACH,CAAA,EAAA,EAHsB,KAIxB,CACD;AAAA,eAAA,EACH;AAAA,aAAA,EACF,KAvB2B,KAwB7B,CAAA;AAAA,UAEJ,CAAC,CAAA;AAAA,UACA,iBAAA,CAAkB,YAAA,CAAa,GAAA,CAAI,CAAA,GAAA,qBAClCP,cAAA,CAACD,6BAAA,CAAe,kBAAA,EAAf,EAA4C,OAAA,EAAS,GAAA,EACnD,QAAA,EAAA,GAAA,EAAA,EADqC,GAExC,CACD;AAAA,SAAA,EACH,CAAA;AAAA,QAEC,SAAA,mBACCC,cAAA,CAACQ,qCAAA,EAAA,EAAqB,WAAA,EAAaC,wBAAA,CAAa,OAAO,CAAA,CAAE,MAAA,EAAQ,CAAA,GAC/D,MAAA,CAAO,MAAA,KAAW,CAAA,mBACpBT,cAAA;AAAA,UAACD,6BAAA,CAAe,OAAA;AAAA,UAAf;AAAA,YACC,OAAA,EAAS,iBAAiB,qCAAA,GAAwC;AAAA;AAAA,4BAGpED,eAAA,CAAAY,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAV,cAAA,CAACD,6BAAA,CAAe,MAAA,EAAf,EAAsB,MAAA,EAAQ,UAAA,EAAY,CAAA;AAAA,UAC1C,YAAA,CAAa,IAAI,CAAA,EAAA,KAAM;AACtB,YAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,EAAA,CAAG,KAAK,CAAA;AAC7B,YAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,YAAA,MAAM,aACJ,KAAA,CAAM,OAAA,KAAY,oBAAoB,cAAA,IAAkB,IAAA,IAAQ,MAAM,MAAA,KAAW,cAAA,CAAA;AACnF,YAAA,MAAM,SAAS,CAAA,EAAG,KAAA,CAAM,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,UAAU,EAAE,CAAA,CAAA;AACrD,YAAA,MAAM,eAAA,GAAkB,iBAAA,EAAmB,GAAA,CAAI,MAAM,CAAA,IAAK,KAAA;AAC1D,YAAA,MAAM,WAAA,GAAc,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,SAAA;AAC7C,YAAA,MAAM,KAAA,GAAQ,cAAA,EAAgB,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AAE/C,YAAA,uBACED,eAAA;AAAA,cAACC,6BAAA,CAAe,SAAA;AAAA,cAAf;AAAA,gBAEC,KAAK,WAAA,CAAY,cAAA;AAAA,gBACjB,cAAY,EAAA,CAAG,KAAA;AAAA,gBACd,GAAG,WAAA,CAAY,EAAA,CAAG,KAAK,CAAA;AAAA,gBACxB,OAAA,EAAS,MAAM,YAAA,CAAa,KAAK,CAAA;AAAA,gBACjC,QAAA,EAAU,UAAA;AAAA,gBACV,SAAA,EAAWK,WAAA,CAAG,eAAA,IAAmB,uBAAuB,CAAA;AAAA,gBAExD,QAAA,EAAA;AAAA,kCAAAJ,cAAA,CAACD,8BAAe,WAAA,EAAf,EAA2B,SAAA,EAAW,WAAA,EAAa,QAAO,kBAAA,EAAmB,CAAA;AAAA,kBAC7EE,8CAAA,CAAe,iBAAA,EAAmB,MAAM,CAAA,oBAAKD,cAAA,CAACD,8BAAe,QAAA,EAAf,EAAwB,UAAA,EAAY,KAAA,CAAM,UAAA,EAAY,CAAA;AAAA,kCACrGC,cAAA;AAAA,oBAACD,6BAAA,CAAe,QAAA;AAAA,oBAAf;AAAA,sBACC,IAAA,EAAM,KAAA,CAAM,UAAA,IAAc,KAAA,CAAM,IAAA;AAAA,sBAChC,cAAc,KAAA,CAAM,YAAA;AAAA,sBACpB,gBAAA,EAAkB;AAAA;AAAA,mBACpB;AAAA,kBACCE,8CAAA,CAAe,iBAAA,EAAmB,OAAO,CAAA,mCACvCF,6BAAA,CAAe,SAAA,EAAf,EAAyB,KAAA,EAAO,KAAA,CAAM,YAAA,IAAgBY,8CAAA,CAAgB,KAAA,CAAM,KAAK,CAAA,EAAG,CAAA;AAAA,kBAEtFV,8CAAA,CAAe,iBAAA,EAAmB,QAAQ,CAAA,oBACzCD,cAAA;AAAA,oBAACD,6BAAA,CAAe,UAAA;AAAA,oBAAf;AAAA,sBACC,QAAQ,KAAA,CAAM,aAAA;AAAA,sBACd,OAAO,KAAA,CAAM,YAAA;AAAA,sBACb,QAAQ,KAAA,CAAM;AAAA;AAAA,mBAChB;AAAA,iDAEDA,6BAAA,CAAe,UAAA,EAAf,EAA0B,MAAA,EAAQ,MAAM,MAAA,EAAQ,CAAA;AAAA,kBAChDE,+CAAe,iBAAA,EAAmB,UAAU,CAAA,oBAC3CD,cAAA,CAACY,kBAAS,UAAA,EAAT,EAAoB,IAAA,EAAK,MAAA,EACvB,wCAAeC,gDAAA,CAAkB,KAAA,CAAM,WAAW,KAAA,CAAM,OAAO,CAAC,CAAA,EACnE,CAAA;AAAA,kBAEDZ,8CAAA,CAAe,iBAAA,EAAmB,SAAS,CAAA,oBAC1CD,cAAA,CAACD,6BAAA,CAAe,WAAA,EAAf,EAA2B,SAAA,EAAW,KAAA,CAAM,OAAA,IAAW,EAAA,EAAI,QAAO,kBAAA,EAAmB,CAAA;AAAA,kBAEvFE,8CAAA,CAAe,iBAAA,EAAmB,aAAa,CAAA,oBAC9CD,cAAA,CAACY,kBAAS,QAAA,EAAT,EAAmB,QAAA,EAAA,KAAA,CAAM,WAAA,IAAe,GAAA,EAAI,CAAA;AAAA,kBAE9CX,8CAAA,CAAe,iBAAA,EAAmB,aAAa,CAAA,mCAC7CW,iBAAA,CAAS,UAAA,EAAT,EACE,QAAA,EAAA,KAAA,EAAO,gBAAgB,MAAA,GAAY,MAAA,GAAYE,8BAAA,CAAoB,KAAA,CAAM,WAAW,CAAA,EACvF,CAAA;AAAA,kBAEDb,8CAAA,CAAe,iBAAA,EAAmB,cAAc,CAAA,mCAC9CW,iBAAA,CAAS,UAAA,EAAT,EACE,QAAA,EAAA,KAAA,EAAO,iBAAiB,MAAA,GAAY,MAAA,GAAYE,8BAAA,CAAoB,KAAA,CAAM,YAAY,CAAA,EACzF,CAAA;AAAA,kBAEDb,8CAAA,CAAe,mBAAmB,aAAa,CAAA,mCAC7CW,iBAAA,CAAS,UAAA,EAAT,EACG,QAAA,EAAA,CAAA,MAAM;AACN,oBAAA,MAAM,KAAA,GAAQ,UAAU,KAAK,CAAA;AAC7B,oBAAA,OAAO,KAAA,KAAU,MAAA,GAAY,MAAA,GAAYE,8BAAA,CAAoB,KAAK,CAAA;AAAA,kBACpE,IAAG,EACL,CAAA;AAAA,kBAEDb,+CAAe,iBAAA,EAAmB,eAAe,CAAA,oBAChDD,cAAA,CAACY,kBAAS,UAAA,EAAT,EACE,QAAA,EAAA,KAAA,EAAO,aAAA,KAAkB,SAAY,MAAA,GAAYG,qBAAA,CAAW,MAAM,aAAA,EAAe,KAAA,CAAM,QAAQ,CAAA,EAClG,CAAA;AAAA,kBAED,kBAAkB,aAAA,CAAc,GAAA,CAAI,CAAA,KAAA,qBACnCf,cAAA,CAACY,kBAAS,QAAA,EAAT,EAAkB,IAAA,EAAK,MAAA,EACrB,4BAAkB,KAAA,EAAO,KAAK,CAAA,IAAK,MAAA,EAAA,EADF,KAEpC,CACD,CAAA;AAAA,kBACA,iBAAA,CAAkB,YAAA,CAAa,GAAA,CAAI,CAAA,GAAA,KAAO;AACzC,oBAAA,MAAM,KAAA,GAAQI,wDAAA,CAAyB,KAAA,CAAM,QAAA,EAAU,GAAG,CAAA;AAC1D,oBAAA,sCACGJ,iBAAA,CAAS,QAAA,EAAT,EAAkB,IAAA,EAAK,MAAA,EACrB,mBADiC,GAEpC,CAAA;AAAA,kBAEJ,CAAC;AAAA;AAAA,eAAA;AAAA,cAxEI;AAAA,aAyEP;AAAA,UAEJ,CAAC,CAAA;AAAA,0BACDZ,cAAA,CAACD,6BAAA,CAAe,MAAA,EAAf,EAAsB,QAAQ,aAAA,EAAe,CAAA;AAAA,0BAC9CC,cAAA;AAAA,YAACD,6BAAA,CAAe,eAAA;AAAA,YAAf;AAAA,cACC,SAAA,EAAW,kBAAA;AAAA,cACX,OAAA,EAAS,WAAA;AAAA,cACT;AAAA;AAAA;AACF,SAAA,EACF;AAAA;AAAA;AAAA,GAEJ;AAEJ;;;;"}
|
|
@@ -4,10 +4,11 @@ import { ListFilterIcon } from 'lucide-react';
|
|
|
4
4
|
import { useRef } from 'react';
|
|
5
5
|
import { buildTraceListColumns, buildTraceListColumnKeys, hasTraceColumn, DEFAULT_TRACE_COLUMN_PREFERENCES, TRACE_CUSTOM_COLUMN_LABELS, formatTraceMetadataValue } from '../trace-list-columns.es.js';
|
|
6
6
|
import { getInputPreview, getSpanDurationMs } from '../utils/span-utils.es.js';
|
|
7
|
-
import {
|
|
8
|
-
import { a as DataListSkeletonRows } from '../../../data-list-skeleton-
|
|
9
|
-
import { T as TracesDataList } from '../../../traces-data-list-
|
|
7
|
+
import { D as DataList } from '../../../data-list-DT1LVR29.js';
|
|
8
|
+
import { a as DataListSkeletonRows } from '../../../data-list-skeleton-bNfITSHs.js';
|
|
9
|
+
import { T as TracesDataList } from '../../../traces-data-list-DMWPJFBc.js';
|
|
10
10
|
import { u as useDataListKeyboard } from '../../../use-data-list-keyboard-DFQr4t38.js';
|
|
11
|
+
import { s as splitColumns } from '../../../data-list-top-T-mtdIUp.js';
|
|
11
12
|
import { D as DropdownMenu } from '../../../dropdown-menu-CQ_48tVI.js';
|
|
12
13
|
import { T as Txt } from '../../../Txt-BtIGLRk1.js';
|
|
13
14
|
import { focusRing } from '../../../primitives/transitions.es.js';
|