@mastra/playground-ui 64.0.1-alpha.0 → 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.
Files changed (149) hide show
  1. package/README.md +10 -2
  2. package/components.css +340 -0
  3. package/dist/code-DJReJPSX.cjs.map +1 -1
  4. package/dist/code-DLuATvYu.js.map +1 -1
  5. package/dist/components/Breadcrumb.cjs.js +4 -2
  6. package/dist/components/Breadcrumb.cjs.js.map +1 -1
  7. package/dist/components/Breadcrumb.es.js +5 -3
  8. package/dist/components/Breadcrumb.es.js.map +1 -1
  9. package/dist/components/ChatShell.cjs.js +2 -2
  10. package/dist/components/ChatShell.cjs.js.map +1 -1
  11. package/dist/components/ChatShell.es.js +2 -2
  12. package/dist/components/ChatShell.es.js.map +1 -1
  13. package/dist/components/Composer.cjs.js +1 -1
  14. package/dist/components/Composer.cjs.js.map +1 -1
  15. package/dist/components/Composer.es.js +1 -1
  16. package/dist/components/Composer.es.js.map +1 -1
  17. package/dist/components/DataList.cjs.js +5 -5
  18. package/dist/components/DataList.es.js +5 -5
  19. package/dist/components/EnvironmentVariablesEditor.cjs.js +1 -1
  20. package/dist/components/EnvironmentVariablesEditor.es.js +1 -1
  21. package/dist/components/LogsDataList.cjs.js +2 -2
  22. package/dist/components/LogsDataList.es.js +2 -2
  23. package/dist/components/MessageScroller.cjs.js +1 -1
  24. package/dist/components/MessageScroller.es.js +1 -1
  25. package/dist/components/SavedViews.cjs.js +0 -1
  26. package/dist/components/SavedViews.cjs.js.map +1 -1
  27. package/dist/components/SavedViews.es.js +0 -1
  28. package/dist/components/SavedViews.es.js.map +1 -1
  29. package/dist/components/fluid-hover-highlight.cjs.js +7 -1
  30. package/dist/components/fluid-hover-highlight.cjs.js.map +1 -1
  31. package/dist/components/fluid-hover-highlight.es.js +7 -1
  32. package/dist/components/fluid-hover-highlight.es.js.map +1 -1
  33. package/dist/{data-list-DUfXIhyC.cjs → data-list-CmjTe8xE.cjs} +3 -3
  34. package/dist/{data-list-DUfXIhyC.cjs.map → data-list-CmjTe8xE.cjs.map} +1 -1
  35. package/dist/{data-list-DXQY_iQW.js → data-list-DT1LVR29.js} +3 -3
  36. package/dist/{data-list-DXQY_iQW.js.map → data-list-DT1LVR29.js.map} +1 -1
  37. package/dist/{data-list-skeleton-B_SXAeE0.js → data-list-skeleton-bNfITSHs.js} +2 -2
  38. package/dist/{data-list-skeleton-B_SXAeE0.js.map → data-list-skeleton-bNfITSHs.js.map} +1 -1
  39. package/dist/{data-list-skeleton-BqC9Gggi.cjs → data-list-skeleton-sdcaabdX.cjs} +2 -2
  40. package/dist/{data-list-skeleton-BqC9Gggi.cjs.map → data-list-skeleton-sdcaabdX.cjs.map} +1 -1
  41. package/dist/{data-list-spacer-tQaBaum4.cjs → data-list-spacer-CdlT6bDd.cjs} +2 -2
  42. package/dist/{data-list-spacer-tQaBaum4.cjs.map → data-list-spacer-CdlT6bDd.cjs.map} +1 -1
  43. package/dist/{data-list-spacer-ByA4ce2a.js → data-list-spacer-D--gDmOm.js} +2 -2
  44. package/dist/{data-list-spacer-ByA4ce2a.js.map → data-list-spacer-D--gDmOm.js.map} +1 -1
  45. package/dist/{data-list-top-ByT2Mo77.cjs → data-list-top-DJh08vFA.cjs} +2 -9
  46. package/dist/data-list-top-DJh08vFA.cjs.map +1 -0
  47. package/dist/{data-list-top-DSr_ocKA.js → data-list-top-T-mtdIUp.js} +2 -9
  48. package/dist/data-list-top-T-mtdIUp.js.map +1 -0
  49. package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js +104 -92
  50. package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js.map +1 -1
  51. package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js +105 -93
  52. package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js.map +1 -1
  53. package/dist/domains/logs/components/logs-list-view.cjs.js +2 -2
  54. package/dist/domains/logs/components/logs-list-view.es.js +2 -2
  55. package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.cjs.js +3 -3
  56. package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.es.js +3 -3
  57. package/dist/domains/observability/components/trace-as-item-dialog.cjs.js +6 -10
  58. package/dist/domains/observability/components/trace-as-item-dialog.cjs.js.map +1 -1
  59. package/dist/domains/observability/components/trace-as-item-dialog.es.js +7 -11
  60. package/dist/domains/observability/components/trace-as-item-dialog.es.js.map +1 -1
  61. package/dist/domains/scores/components/score-as-item-dialog.cjs.js +3 -9
  62. package/dist/domains/scores/components/score-as-item-dialog.cjs.js.map +1 -1
  63. package/dist/domains/scores/components/score-as-item-dialog.es.js +4 -10
  64. package/dist/domains/scores/components/score-as-item-dialog.es.js.map +1 -1
  65. package/dist/domains/scores/components/score-data-panel.cjs.js +9 -1
  66. package/dist/domains/scores/components/score-data-panel.cjs.js.map +1 -1
  67. package/dist/domains/scores/components/score-data-panel.es.js +9 -1
  68. package/dist/domains/scores/components/score-data-panel.es.js.map +1 -1
  69. package/dist/domains/scores/components/trace-scores-tab.cjs.js +1 -1
  70. package/dist/domains/scores/components/trace-scores-tab.es.js +1 -1
  71. package/dist/domains/traces/components/format-hierarchical-spans.cjs.js +12 -13
  72. package/dist/domains/traces/components/format-hierarchical-spans.cjs.js.map +1 -1
  73. package/dist/domains/traces/components/format-hierarchical-spans.es.js +12 -13
  74. package/dist/domains/traces/components/format-hierarchical-spans.es.js.map +1 -1
  75. package/dist/domains/traces/components/span-rows.cjs.js +2 -1
  76. package/dist/domains/traces/components/span-rows.cjs.js.map +1 -1
  77. package/dist/domains/traces/components/span-rows.es.js +2 -1
  78. package/dist/domains/traces/components/span-rows.es.js.map +1 -1
  79. package/dist/domains/traces/components/thread-trace/thread-trace-list.cjs.js +1 -1
  80. package/dist/domains/traces/components/thread-trace/thread-trace-list.es.js +1 -1
  81. package/dist/domains/traces/components/thread-trace/thread-trace-root.cjs.js +1 -1
  82. package/dist/domains/traces/components/thread-trace/thread-trace-root.es.js +1 -1
  83. package/dist/domains/traces/components/thread-trace/thread-trace-row.cjs.js +1 -1
  84. package/dist/domains/traces/components/thread-trace/thread-trace-row.es.js +1 -1
  85. package/dist/domains/traces/components/trace-span-timeline.cjs.js +2 -1
  86. package/dist/domains/traces/components/trace-span-timeline.cjs.js.map +1 -1
  87. package/dist/domains/traces/components/trace-span-timeline.es.js +2 -1
  88. package/dist/domains/traces/components/trace-span-timeline.es.js.map +1 -1
  89. package/dist/domains/traces/components/traces-list-view.cjs.js +4 -4
  90. package/dist/domains/traces/components/traces-list-view.es.js +4 -4
  91. package/dist/domains/traces/components/traces-page-skeleton.cjs.js +1 -1
  92. package/dist/domains/traces/components/traces-page-skeleton.es.js +1 -1
  93. package/dist/domains/traces/utils/span-timing.cjs.js +10 -0
  94. package/dist/domains/traces/utils/span-timing.cjs.js.map +1 -1
  95. package/dist/domains/traces/utils/span-timing.es.js +10 -1
  96. package/dist/domains/traces/utils/span-timing.es.js.map +1 -1
  97. package/dist/domains/workflows/components/workflows-list/workflows-list.cjs.js +2 -2
  98. package/dist/domains/workflows/components/workflows-list/workflows-list.es.js +2 -2
  99. package/dist/ee/signals/components/entity-index-list.cjs.js +1 -1
  100. package/dist/ee/signals/components/entity-index-list.es.js +1 -1
  101. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +1 -1
  102. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +1 -1
  103. package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +1 -1
  104. package/dist/ee/topics/components/topic-trace-summary-list.es.js +1 -1
  105. package/dist/hooks/use-fluid-hover.cjs.js +3 -2
  106. package/dist/hooks/use-fluid-hover.cjs.js.map +1 -1
  107. package/dist/hooks/use-fluid-hover.es.js +3 -2
  108. package/dist/hooks/use-fluid-hover.es.js.map +1 -1
  109. package/dist/layout/tabbed-container.cjs.js +1 -1
  110. package/dist/layout/tabbed-container.es.js +1 -1
  111. package/dist/{logs-data-list-CoER2Hst.js → logs-data-list-Cb85LPcT.js} +3 -3
  112. package/dist/{logs-data-list-CoER2Hst.js.map → logs-data-list-Cb85LPcT.js.map} +1 -1
  113. package/dist/{logs-data-list-DRR6cMgl.cjs → logs-data-list-DlQxxrNw.cjs} +3 -3
  114. package/dist/{logs-data-list-DRR6cMgl.cjs.map → logs-data-list-DlQxxrNw.cjs.map} +1 -1
  115. package/dist/{message-scroller-CS1KxKn6.js → message-scroller-C6gXU5d5.js} +2 -2
  116. package/dist/{message-scroller-CS1KxKn6.js.map → message-scroller-C6gXU5d5.js.map} +1 -1
  117. package/dist/{message-scroller-C4fH6uJg.cjs → message-scroller-fjucuCuw.cjs} +2 -2
  118. package/dist/{message-scroller-C4fH6uJg.cjs.map → message-scroller-fjucuCuw.cjs.map} +1 -1
  119. package/dist/primitives/raised-surface.cjs.js.map +1 -1
  120. package/dist/primitives/raised-surface.es.js.map +1 -1
  121. package/dist/scroll-area-CAY0DNQj.cjs.map +1 -1
  122. package/dist/scroll-area-MaMqo4l8.js.map +1 -1
  123. package/dist/src/domains/datasets/components/index.d.ts +1 -1
  124. package/dist/src/domains/datasets/components/save-as-dataset-item-dialog.d.ts +14 -3
  125. package/dist/src/domains/observability/components/trace-as-item-dialog.d.ts +5 -3
  126. package/dist/src/domains/scores/components/score-as-item-dialog.d.ts +3 -3
  127. package/dist/src/domains/traces/utils/span-timing.d.ts +2 -0
  128. package/dist/src/ds/components/Breadcrumb/Breadcrumb.d.ts +2 -2
  129. package/dist/src/ds/components/ChatShell/chat-shell.d.ts +3 -2
  130. package/dist/src/ds/components/Code/code.d.ts +1 -1
  131. package/dist/src/ds/components/ScrollArea/scroll-area.d.ts +4 -0
  132. package/dist/src/ds/primitives/raised-surface.d.ts +1 -1
  133. package/dist/src/hooks/use-fluid-hover.d.ts +1 -0
  134. package/dist/style.css +32 -31
  135. package/dist/toast.css +1 -1
  136. package/dist/tokens.cjs.js.map +1 -1
  137. package/dist/tokens.es.js.map +1 -1
  138. package/dist/{traces-data-list-BgjeB-BF.cjs → traces-data-list-Bhhg9drs.cjs} +4 -4
  139. package/dist/{traces-data-list-BgjeB-BF.cjs.map → traces-data-list-Bhhg9drs.cjs.map} +1 -1
  140. package/dist/{traces-data-list-Zoai0OW_.js → traces-data-list-DMWPJFBc.js} +4 -4
  141. package/dist/{traces-data-list-Zoai0OW_.js.map → traces-data-list-DMWPJFBc.js.map} +1 -1
  142. package/dist/use-text-highlight.css +4 -4
  143. package/package.json +15 -11
  144. package/sources.css +1 -0
  145. package/theme/code.css +17 -0
  146. package/theme/surfaces.css +2 -2
  147. package/theme.css +2 -0
  148. package/dist/data-list-top-ByT2Mo77.cjs.map +0 -1
  149. package/dist/data-list-top-DSr_ocKA.js.map +0 -1
@@ -1,13 +1,11 @@
1
- import { jsx, jsxs } from 'react/jsx-runtime';
1
+ import { jsx } from 'react/jsx-runtime';
2
2
  import { collectToolMocks } from '@mastra/core/utils/collect-tool-mocks';
3
3
  import { safeStringify } from '@mastra/core/utils/safe-stringify';
4
4
  import { useMastraClient } from '@mastra/react';
5
5
  import { useSpanDetail } from '@mastra/react/hooks/traces';
6
6
  import { useQuery } from '@tanstack/react-query';
7
- import { EyeIcon } from 'lucide-react';
8
7
  import { SaveAsDatasetItemDialog } from '../../datasets/components/save-as-dataset-item-dialog.es.js';
9
8
  import '@mastra/react/hooks/datasets';
10
- import { T as TextAndIcon } from '../../../text-and-icon-CRYBkgtj.js';
11
9
  import { getShortId } from '../../../utils/id.es.js';
12
10
 
13
11
  function getInitialInput(traceDetails) {
@@ -23,7 +21,8 @@ function TraceAsItemDialog({
23
21
  traceId,
24
22
  isOpen,
25
23
  onClose,
26
- level = 2
24
+ depth,
25
+ renderCreateDatasetDialog
27
26
  }) {
28
27
  const client = useMastraClient();
29
28
  const { data: lazySpanDetail } = useSpanDetail({
@@ -65,15 +64,12 @@ function TraceAsItemDialog({
65
64
  initialTrajectory,
66
65
  trajectoryLoading: isTrajectoryLoading,
67
66
  initialToolMocks,
68
- breadcrumb: /* @__PURE__ */ jsxs(TextAndIcon, { children: [
69
- /* @__PURE__ */ jsx(EyeIcon, {}),
70
- " ",
71
- getShortId(traceId)
72
- ] }),
67
+ breadcrumb: getShortId(traceId),
73
68
  isOpen,
74
69
  onClose,
75
- level,
76
- source: traceId ? { type: "trace", referenceId: traceId } : void 0
70
+ depth,
71
+ source: traceId ? { type: "trace", referenceId: traceId } : void 0,
72
+ renderCreateDatasetDialog
77
73
  }
78
74
  );
79
75
  }
@@ -1 +1 @@
1
- {"version":3,"file":"trace-as-item-dialog.es.js","sources":["../../../../src/domains/observability/components/trace-as-item-dialog.tsx"],"sourcesContent":["'use client';\n\nimport { collectToolMocks } from '@mastra/core/utils/collect-tool-mocks';\nimport { safeStringify } from '@mastra/core/utils/safe-stringify';\nimport { useMastraClient } from '@mastra/react';\nimport { useSpanDetail } from '@mastra/react/hooks/traces';\nimport { useQuery } from '@tanstack/react-query';\nimport { EyeIcon } from 'lucide-react';\nimport { SaveAsDatasetItemDialog } from '@/domains/datasets';\nimport type { SpanRecord } from '@/domains/traces/types';\nimport type { SideDialogRootProps } from '@/ds/components/SideDialog';\nimport { TextAndIcon, getShortId } from '@/ds/components/Text';\n\ntype TraceAsItemDialogProps = {\n /** Full span record — if provided, used directly (no fetch). */\n traceDetails?: SpanRecord;\n /** Root span ID for lazy-loading when traceDetails is not available. */\n rootSpanId?: string | null;\n traceId?: string;\n isOpen: boolean;\n onClose: () => void;\n level?: SideDialogRootProps['level'];\n};\n\nfunction getInitialInput(traceDetails?: SpanRecord): string {\n if (traceDetails?.input == null) return '{}';\n\n // Unwrap legacy { messages } wrapper from agent_run spans so the dataset item stores a valid MessageListInput\n const spanInput = traceDetails.input as Record<string, unknown> | undefined;\n const isWrappedAgentInput =\n traceDetails.spanType === 'agent_run' &&\n spanInput &&\n typeof spanInput === 'object' &&\n !Array.isArray(spanInput) &&\n 'messages' in spanInput;\n const rawInput = isWrappedAgentInput ? (spanInput.messages ?? traceDetails.input) : traceDetails.input;\n\n return safeStringify(rawInput, 2);\n}\n\nexport function TraceAsItemDialog({\n traceDetails: externalTraceDetails,\n rootSpanId,\n traceId,\n isOpen,\n onClose,\n level = 2,\n}: TraceAsItemDialogProps) {\n const client = useMastraClient();\n\n // Lazy-load the root span details when dialog opens and no traceDetails provided\n const { data: lazySpanDetail } = useSpanDetail({\n traceId: !externalTraceDetails && isOpen ? traceId : null,\n spanId: !externalTraceDetails && isOpen ? rootSpanId : null,\n queryOptions: {\n enabled:\n !!(!externalTraceDetails && isOpen ? traceId : null) && !!(!externalTraceDetails && isOpen ? rootSpanId : null),\n },\n });\n\n const traceDetails = externalTraceDetails ?? lazySpanDetail?.span;\n\n const { data: trajectory, isLoading: isTrajectoryLoading } = useQuery({\n queryKey: ['trace-trajectory', traceId],\n queryFn: () => client.getTraceTrajectory(traceId ?? ''),\n enabled: isOpen && !!traceId,\n });\n\n // Convert trajectory to a TrajectoryExpectation JSON string\n const initialTrajectory =\n trajectory?.steps && trajectory.steps.length > 0\n ? safeStringify(\n {\n steps: trajectory.steps.map(step => {\n const { name, stepType, children, ...rest } = step as Record<string, unknown>;\n const expected: Record<string, unknown> = { name, stepType };\n for (const [k, v] of Object.entries(rest)) {\n if (v != null && k !== 'durationMs' && k !== 'metadata') {\n expected[k] = v;\n }\n }\n return expected;\n }),\n ordering: 'relaxed',\n },\n 2,\n )\n : undefined;\n\n // Derive item-level tool mocks from the recorded tool calls in the trajectory\n const toolMocks = trajectory?.steps ? collectToolMocks(trajectory.steps) : [];\n const initialToolMocks = toolMocks.length > 0 ? safeStringify(toolMocks, 2) : undefined;\n\n return (\n <SaveAsDatasetItemDialog\n initialInput={getInitialInput(traceDetails)}\n initialGroundTruth={traceDetails?.output != null ? safeStringify(traceDetails.output, 2) : ''}\n initialTrajectory={initialTrajectory}\n trajectoryLoading={isTrajectoryLoading}\n initialToolMocks={initialToolMocks}\n breadcrumb={\n <TextAndIcon>\n <EyeIcon /> {getShortId(traceId)}\n </TextAndIcon>\n }\n isOpen={isOpen}\n onClose={onClose}\n level={level}\n source={traceId ? { type: 'trace', referenceId: traceId } : undefined}\n />\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trace-as-item-dialog.es.js","sources":["../../../../src/domains/observability/components/trace-as-item-dialog.tsx"],"sourcesContent":["'use client';\n\nimport { collectToolMocks } from '@mastra/core/utils/collect-tool-mocks';\nimport { safeStringify } from '@mastra/core/utils/safe-stringify';\nimport { useMastraClient } from '@mastra/react';\nimport { useSpanDetail } from '@mastra/react/hooks/traces';\nimport { useQuery } from '@tanstack/react-query';\nimport { SaveAsDatasetItemDialog } from '@/domains/datasets';\nimport type { SaveAsDatasetItemDialogProps } from '@/domains/datasets';\nimport type { SpanRecord } from '@/domains/traces/types';\nimport type { DataPanelProps } from '@/ds/components/DataPanel';\nimport { getShortId } from '@/ds/components/Text';\n\ntype TraceAsItemDialogProps = {\n /** Full span record — if provided, used directly (no fetch). */\n traceDetails?: SpanRecord;\n /** Root span ID for lazy-loading when traceDetails is not available. */\n rootSpanId?: string | null;\n traceId?: string;\n isOpen: boolean;\n onClose: () => void;\n depth?: DataPanelProps['depth'];\n renderCreateDatasetDialog?: SaveAsDatasetItemDialogProps['renderCreateDatasetDialog'];\n};\n\nfunction getInitialInput(traceDetails?: SpanRecord): string {\n if (traceDetails?.input == null) return '{}';\n\n // Unwrap legacy { messages } wrapper from agent_run spans so the dataset item stores a valid MessageListInput\n const spanInput = traceDetails.input as Record<string, unknown> | undefined;\n const isWrappedAgentInput =\n traceDetails.spanType === 'agent_run' &&\n spanInput &&\n typeof spanInput === 'object' &&\n !Array.isArray(spanInput) &&\n 'messages' in spanInput;\n const rawInput = isWrappedAgentInput ? (spanInput.messages ?? traceDetails.input) : traceDetails.input;\n\n return safeStringify(rawInput, 2);\n}\n\nexport function TraceAsItemDialog({\n traceDetails: externalTraceDetails,\n rootSpanId,\n traceId,\n isOpen,\n onClose,\n depth,\n renderCreateDatasetDialog,\n}: TraceAsItemDialogProps) {\n const client = useMastraClient();\n\n // Lazy-load the root span details when dialog opens and no traceDetails provided\n const { data: lazySpanDetail } = useSpanDetail({\n traceId: !externalTraceDetails && isOpen ? traceId : null,\n spanId: !externalTraceDetails && isOpen ? rootSpanId : null,\n queryOptions: {\n enabled:\n !!(!externalTraceDetails && isOpen ? traceId : null) && !!(!externalTraceDetails && isOpen ? rootSpanId : null),\n },\n });\n\n const traceDetails = externalTraceDetails ?? lazySpanDetail?.span;\n\n const { data: trajectory, isLoading: isTrajectoryLoading } = useQuery({\n queryKey: ['trace-trajectory', traceId],\n queryFn: () => client.getTraceTrajectory(traceId ?? ''),\n enabled: isOpen && !!traceId,\n });\n\n // Convert trajectory to a TrajectoryExpectation JSON string\n const initialTrajectory =\n trajectory?.steps && trajectory.steps.length > 0\n ? safeStringify(\n {\n steps: trajectory.steps.map(step => {\n const { name, stepType, children, ...rest } = step as Record<string, unknown>;\n const expected: Record<string, unknown> = { name, stepType };\n for (const [k, v] of Object.entries(rest)) {\n if (v != null && k !== 'durationMs' && k !== 'metadata') {\n expected[k] = v;\n }\n }\n return expected;\n }),\n ordering: 'relaxed',\n },\n 2,\n )\n : undefined;\n\n // Derive item-level tool mocks from the recorded tool calls in the trajectory\n const toolMocks = trajectory?.steps ? collectToolMocks(trajectory.steps) : [];\n const initialToolMocks = toolMocks.length > 0 ? safeStringify(toolMocks, 2) : undefined;\n\n return (\n <SaveAsDatasetItemDialog\n initialInput={getInitialInput(traceDetails)}\n initialGroundTruth={traceDetails?.output != null ? safeStringify(traceDetails.output, 2) : ''}\n initialTrajectory={initialTrajectory}\n trajectoryLoading={isTrajectoryLoading}\n initialToolMocks={initialToolMocks}\n breadcrumb={getShortId(traceId)}\n isOpen={isOpen}\n onClose={onClose}\n depth={depth}\n source={traceId ? { type: 'trace', referenceId: traceId } : undefined}\n renderCreateDatasetDialog={renderCreateDatasetDialog}\n />\n );\n}\n"],"names":[],"mappings":"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"}
@@ -4,10 +4,8 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
5
  const jsxRuntime = require('react/jsx-runtime');
6
6
  const safeStringify = require('@mastra/core/utils/safe-stringify');
7
- const lucideReact = require('lucide-react');
8
7
  const domains_datasets_components_saveAsDatasetItemDialog = require('../../datasets/components/save-as-dataset-item-dialog.cjs.js');
9
8
  require('@mastra/react/hooks/datasets');
10
- const textAndIcon = require('../../../text-and-icon-BcyWJ1Fj.cjs');
11
9
  const utils_id = require('../../../utils/id.cjs.js');
12
10
 
13
11
  function getInitialInput(score) {
@@ -18,20 +16,16 @@ function getInitialGroundTruth(score) {
18
16
  if (!score) return "";
19
17
  return safeStringify.safeStringify({ score: score.score, reason: score.reason ?? null }, 2);
20
18
  }
21
- function ScoreAsItemDialog({ score, isOpen, onClose, level = 2 }) {
19
+ function ScoreAsItemDialog({ score, isOpen, onClose, depth }) {
22
20
  return /* @__PURE__ */ jsxRuntime.jsx(
23
21
  domains_datasets_components_saveAsDatasetItemDialog.SaveAsDatasetItemDialog,
24
22
  {
25
23
  initialInput: getInitialInput(score),
26
24
  initialGroundTruth: getInitialGroundTruth(score),
27
- breadcrumb: /* @__PURE__ */ jsxRuntime.jsxs(textAndIcon.TextAndIcon, { children: [
28
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalculatorIcon, {}),
29
- " ",
30
- utils_id.getShortId(score?.id)
31
- ] }),
25
+ breadcrumb: utils_id.getShortId(score?.id),
32
26
  isOpen,
33
27
  onClose,
34
- level,
28
+ depth,
35
29
  source: score?.traceId ? { type: "trace", referenceId: score.traceId } : void 0
36
30
  }
37
31
  );
@@ -1 +1 @@
1
- {"version":3,"file":"score-as-item-dialog.cjs.js","sources":["../../../../src/domains/scores/components/score-as-item-dialog.tsx"],"sourcesContent":["'use client';\n\nimport type { ClientScoreRowData } from '@mastra/client-js';\nimport type { ScoreRowData } from '@mastra/core/evals';\nimport { safeStringify } from '@mastra/core/utils/safe-stringify';\nimport { CalculatorIcon } from 'lucide-react';\nimport { SaveAsDatasetItemDialog } from '@/domains/datasets';\nimport type { SideDialogRootProps } from '@/ds/components/SideDialog';\nimport { TextAndIcon, getShortId } from '@/ds/components/Text';\n\ntype ScoreForDatasetItem = ScoreRowData | ClientScoreRowData;\n\nexport type ScoreAsItemDialogProps = {\n score?: ScoreForDatasetItem;\n isOpen: boolean;\n onClose: () => void;\n level?: SideDialogRootProps['level'];\n};\n\nfunction getInitialInput(score?: ScoreForDatasetItem): string {\n if (!score) return '{}';\n // input = the full scorer.run() payload: { input, output, groundTruth }\n // groundTruth from the original experiment is not available on ScoreRowData,\n // so we omit it — user can add it manually in the editor\n return safeStringify({ input: score.input, output: score.output, groundTruth: null }, 2);\n}\n\nfunction getInitialGroundTruth(score?: ScoreForDatasetItem): string {\n if (!score) return '';\n // ground truth = expected scorer result — pre-fill with actual score/reason so user can adjust\n return safeStringify({ score: score.score, reason: score.reason ?? null }, 2);\n}\n\nexport function ScoreAsItemDialog({ score, isOpen, onClose, level = 2 }: ScoreAsItemDialogProps) {\n return (\n <SaveAsDatasetItemDialog\n initialInput={getInitialInput(score)}\n initialGroundTruth={getInitialGroundTruth(score)}\n breadcrumb={\n <TextAndIcon>\n <CalculatorIcon /> {getShortId(score?.id)}\n </TextAndIcon>\n }\n isOpen={isOpen}\n onClose={onClose}\n level={level}\n source={score?.traceId ? { type: 'trace', referenceId: score.traceId } : undefined}\n />\n );\n}\n"],"names":["safeStringify","jsx","SaveAsDatasetItemDialog","TextAndIcon","CalculatorIcon","getShortId"],"mappings":";;;;;;;;;;;;AAmBA,SAAS,gBAAgB,KAAA,EAAqC;AAC5D,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAInB,EAAA,OAAOA,2BAAA,CAAc,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAK,EAAG,CAAC,CAAA;AACzF;AAEA,SAAS,sBAAsB,KAAA,EAAqC;AAClE,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AAEnB,EAAA,OAAOA,2BAAA,CAAc,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,QAAQ,KAAA,CAAM,MAAA,IAAU,IAAA,EAAK,EAAG,CAAC,CAAA;AAC9E;AAEO,SAAS,kBAAkB,EAAE,KAAA,EAAO,QAAQ,OAAA,EAAS,KAAA,GAAQ,GAAE,EAA2B;AAC/F,EAAA,uBACEC,cAAA;AAAA,IAACC,2EAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAc,gBAAgB,KAAK,CAAA;AAAA,MACnC,kBAAA,EAAoB,sBAAsB,KAAK,CAAA;AAAA,MAC/C,UAAA,kCACGC,uBAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAF,cAAA,CAACG,0BAAA,EAAA,EAAe,CAAA;AAAA,QAAE,GAAA;AAAA,QAAEC,mBAAA,CAAW,OAAO,EAAE;AAAA,OAAA,EAC1C,CAAA;AAAA,MAEF,MAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA,EAAQ,OAAO,OAAA,GAAU,EAAE,MAAM,OAAA,EAAS,WAAA,EAAa,KAAA,CAAM,OAAA,EAAQ,GAAI;AAAA;AAAA,GAC3E;AAEJ;;;;"}
1
+ {"version":3,"file":"score-as-item-dialog.cjs.js","sources":["../../../../src/domains/scores/components/score-as-item-dialog.tsx"],"sourcesContent":["'use client';\n\nimport type { ClientScoreRowData } from '@mastra/client-js';\nimport type { ScoreRowData } from '@mastra/core/evals';\nimport { safeStringify } from '@mastra/core/utils/safe-stringify';\nimport { SaveAsDatasetItemDialog } from '@/domains/datasets';\nimport type { DataPanelProps } from '@/ds/components/DataPanel';\nimport { getShortId } from '@/ds/components/Text';\n\ntype ScoreForDatasetItem = ScoreRowData | ClientScoreRowData;\n\nexport type ScoreAsItemDialogProps = {\n score?: ScoreForDatasetItem;\n isOpen: boolean;\n onClose: () => void;\n depth?: DataPanelProps['depth'];\n};\n\nfunction getInitialInput(score?: ScoreForDatasetItem): string {\n if (!score) return '{}';\n // input = the full scorer.run() payload: { input, output, groundTruth }\n // groundTruth from the original experiment is not available on ScoreRowData,\n // so we omit it — user can add it manually in the editor\n return safeStringify({ input: score.input, output: score.output, groundTruth: null }, 2);\n}\n\nfunction getInitialGroundTruth(score?: ScoreForDatasetItem): string {\n if (!score) return '';\n // ground truth = expected scorer result — pre-fill with actual score/reason so user can adjust\n return safeStringify({ score: score.score, reason: score.reason ?? null }, 2);\n}\n\nexport function ScoreAsItemDialog({ score, isOpen, onClose, depth }: ScoreAsItemDialogProps) {\n return (\n <SaveAsDatasetItemDialog\n initialInput={getInitialInput(score)}\n initialGroundTruth={getInitialGroundTruth(score)}\n breadcrumb={getShortId(score?.id)}\n isOpen={isOpen}\n onClose={onClose}\n depth={depth}\n source={score?.traceId ? { type: 'trace', referenceId: score.traceId } : undefined}\n />\n );\n}\n"],"names":["safeStringify","jsx","SaveAsDatasetItemDialog","getShortId"],"mappings":";;;;;;;;;;AAkBA,SAAS,gBAAgB,KAAA,EAAqC;AAC5D,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAInB,EAAA,OAAOA,2BAAA,CAAc,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAK,EAAG,CAAC,CAAA;AACzF;AAEA,SAAS,sBAAsB,KAAA,EAAqC;AAClE,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AAEnB,EAAA,OAAOA,2BAAA,CAAc,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,QAAQ,KAAA,CAAM,MAAA,IAAU,IAAA,EAAK,EAAG,CAAC,CAAA;AAC9E;AAEO,SAAS,kBAAkB,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,OAAM,EAA2B;AAC3F,EAAA,uBACEC,cAAA;AAAA,IAACC,2EAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAc,gBAAgB,KAAK,CAAA;AAAA,MACnC,kBAAA,EAAoB,sBAAsB,KAAK,CAAA;AAAA,MAC/C,UAAA,EAAYC,mBAAA,CAAW,KAAA,EAAO,EAAE,CAAA;AAAA,MAChC,MAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA,EAAQ,OAAO,OAAA,GAAU,EAAE,MAAM,OAAA,EAAS,WAAA,EAAa,KAAA,CAAM,OAAA,EAAQ,GAAI;AAAA;AAAA,GAC3E;AAEJ;;;;"}
@@ -1,9 +1,7 @@
1
- import { jsx, jsxs } from 'react/jsx-runtime';
1
+ import { jsx } from 'react/jsx-runtime';
2
2
  import { safeStringify } from '@mastra/core/utils/safe-stringify';
3
- import { CalculatorIcon } from 'lucide-react';
4
3
  import { SaveAsDatasetItemDialog } from '../../datasets/components/save-as-dataset-item-dialog.es.js';
5
4
  import '@mastra/react/hooks/datasets';
6
- import { T as TextAndIcon } from '../../../text-and-icon-CRYBkgtj.js';
7
5
  import { getShortId } from '../../../utils/id.es.js';
8
6
 
9
7
  function getInitialInput(score) {
@@ -14,20 +12,16 @@ function getInitialGroundTruth(score) {
14
12
  if (!score) return "";
15
13
  return safeStringify({ score: score.score, reason: score.reason ?? null }, 2);
16
14
  }
17
- function ScoreAsItemDialog({ score, isOpen, onClose, level = 2 }) {
15
+ function ScoreAsItemDialog({ score, isOpen, onClose, depth }) {
18
16
  return /* @__PURE__ */ jsx(
19
17
  SaveAsDatasetItemDialog,
20
18
  {
21
19
  initialInput: getInitialInput(score),
22
20
  initialGroundTruth: getInitialGroundTruth(score),
23
- breadcrumb: /* @__PURE__ */ jsxs(TextAndIcon, { children: [
24
- /* @__PURE__ */ jsx(CalculatorIcon, {}),
25
- " ",
26
- getShortId(score?.id)
27
- ] }),
21
+ breadcrumb: getShortId(score?.id),
28
22
  isOpen,
29
23
  onClose,
30
- level,
24
+ depth,
31
25
  source: score?.traceId ? { type: "trace", referenceId: score.traceId } : void 0
32
26
  }
33
27
  );
@@ -1 +1 @@
1
- {"version":3,"file":"score-as-item-dialog.es.js","sources":["../../../../src/domains/scores/components/score-as-item-dialog.tsx"],"sourcesContent":["'use client';\n\nimport type { ClientScoreRowData } from '@mastra/client-js';\nimport type { ScoreRowData } from '@mastra/core/evals';\nimport { safeStringify } from '@mastra/core/utils/safe-stringify';\nimport { CalculatorIcon } from 'lucide-react';\nimport { SaveAsDatasetItemDialog } from '@/domains/datasets';\nimport type { SideDialogRootProps } from '@/ds/components/SideDialog';\nimport { TextAndIcon, getShortId } from '@/ds/components/Text';\n\ntype ScoreForDatasetItem = ScoreRowData | ClientScoreRowData;\n\nexport type ScoreAsItemDialogProps = {\n score?: ScoreForDatasetItem;\n isOpen: boolean;\n onClose: () => void;\n level?: SideDialogRootProps['level'];\n};\n\nfunction getInitialInput(score?: ScoreForDatasetItem): string {\n if (!score) return '{}';\n // input = the full scorer.run() payload: { input, output, groundTruth }\n // groundTruth from the original experiment is not available on ScoreRowData,\n // so we omit it — user can add it manually in the editor\n return safeStringify({ input: score.input, output: score.output, groundTruth: null }, 2);\n}\n\nfunction getInitialGroundTruth(score?: ScoreForDatasetItem): string {\n if (!score) return '';\n // ground truth = expected scorer result — pre-fill with actual score/reason so user can adjust\n return safeStringify({ score: score.score, reason: score.reason ?? null }, 2);\n}\n\nexport function ScoreAsItemDialog({ score, isOpen, onClose, level = 2 }: ScoreAsItemDialogProps) {\n return (\n <SaveAsDatasetItemDialog\n initialInput={getInitialInput(score)}\n initialGroundTruth={getInitialGroundTruth(score)}\n breadcrumb={\n <TextAndIcon>\n <CalculatorIcon /> {getShortId(score?.id)}\n </TextAndIcon>\n }\n isOpen={isOpen}\n onClose={onClose}\n level={level}\n source={score?.traceId ? { type: 'trace', referenceId: score.traceId } : undefined}\n />\n );\n}\n"],"names":[],"mappings":";;;;;;;;AAmBA,SAAS,gBAAgB,KAAA,EAAqC;AAC5D,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAInB,EAAA,OAAO,aAAA,CAAc,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAK,EAAG,CAAC,CAAA;AACzF;AAEA,SAAS,sBAAsB,KAAA,EAAqC;AAClE,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AAEnB,EAAA,OAAO,aAAA,CAAc,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,QAAQ,KAAA,CAAM,MAAA,IAAU,IAAA,EAAK,EAAG,CAAC,CAAA;AAC9E;AAEO,SAAS,kBAAkB,EAAE,KAAA,EAAO,QAAQ,OAAA,EAAS,KAAA,GAAQ,GAAE,EAA2B;AAC/F,EAAA,uBACE,GAAA;AAAA,IAAC,uBAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAc,gBAAgB,KAAK,CAAA;AAAA,MACnC,kBAAA,EAAoB,sBAAsB,KAAK,CAAA;AAAA,MAC/C,UAAA,uBACG,WAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,CAAA;AAAA,QAAE,GAAA;AAAA,QAAE,UAAA,CAAW,OAAO,EAAE;AAAA,OAAA,EAC1C,CAAA;AAAA,MAEF,MAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA,EAAQ,OAAO,OAAA,GAAU,EAAE,MAAM,OAAA,EAAS,WAAA,EAAa,KAAA,CAAM,OAAA,EAAQ,GAAI;AAAA;AAAA,GAC3E;AAEJ;;;;"}
1
+ {"version":3,"file":"score-as-item-dialog.es.js","sources":["../../../../src/domains/scores/components/score-as-item-dialog.tsx"],"sourcesContent":["'use client';\n\nimport type { ClientScoreRowData } from '@mastra/client-js';\nimport type { ScoreRowData } from '@mastra/core/evals';\nimport { safeStringify } from '@mastra/core/utils/safe-stringify';\nimport { SaveAsDatasetItemDialog } from '@/domains/datasets';\nimport type { DataPanelProps } from '@/ds/components/DataPanel';\nimport { getShortId } from '@/ds/components/Text';\n\ntype ScoreForDatasetItem = ScoreRowData | ClientScoreRowData;\n\nexport type ScoreAsItemDialogProps = {\n score?: ScoreForDatasetItem;\n isOpen: boolean;\n onClose: () => void;\n depth?: DataPanelProps['depth'];\n};\n\nfunction getInitialInput(score?: ScoreForDatasetItem): string {\n if (!score) return '{}';\n // input = the full scorer.run() payload: { input, output, groundTruth }\n // groundTruth from the original experiment is not available on ScoreRowData,\n // so we omit it — user can add it manually in the editor\n return safeStringify({ input: score.input, output: score.output, groundTruth: null }, 2);\n}\n\nfunction getInitialGroundTruth(score?: ScoreForDatasetItem): string {\n if (!score) return '';\n // ground truth = expected scorer result — pre-fill with actual score/reason so user can adjust\n return safeStringify({ score: score.score, reason: score.reason ?? null }, 2);\n}\n\nexport function ScoreAsItemDialog({ score, isOpen, onClose, depth }: ScoreAsItemDialogProps) {\n return (\n <SaveAsDatasetItemDialog\n initialInput={getInitialInput(score)}\n initialGroundTruth={getInitialGroundTruth(score)}\n breadcrumb={getShortId(score?.id)}\n isOpen={isOpen}\n onClose={onClose}\n depth={depth}\n source={score?.traceId ? { type: 'trace', referenceId: score.traceId } : undefined}\n />\n );\n}\n"],"names":[],"mappings":";;;;;;AAkBA,SAAS,gBAAgB,KAAA,EAAqC;AAC5D,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAInB,EAAA,OAAO,aAAA,CAAc,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAK,EAAG,CAAC,CAAA;AACzF;AAEA,SAAS,sBAAsB,KAAA,EAAqC;AAClE,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AAEnB,EAAA,OAAO,aAAA,CAAc,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,QAAQ,KAAA,CAAM,MAAA,IAAU,IAAA,EAAK,EAAG,CAAC,CAAA;AAC9E;AAEO,SAAS,kBAAkB,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,OAAM,EAA2B;AAC3F,EAAA,uBACE,GAAA;AAAA,IAAC,uBAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAc,gBAAgB,KAAK,CAAA;AAAA,MACnC,kBAAA,EAAoB,sBAAsB,KAAK,CAAA;AAAA,MAC/C,UAAA,EAAY,UAAA,CAAW,KAAA,EAAO,EAAE,CAAA;AAAA,MAChC,MAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA,EAAQ,OAAO,OAAA,GAAU,EAAE,MAAM,OAAA,EAAS,WAAA,EAAa,KAAA,CAAM,OAAA,EAAQ,GAAI;AAAA;AAAA,GAC3E;AAEJ;;;;"}
@@ -170,7 +170,15 @@ function ScoreDataPanel({ score, onClose, onPrevious, onNext, depth }) {
170
170
  ] })
171
171
  ] })
172
172
  ] }) }),
173
- score && /* @__PURE__ */ jsxRuntime.jsx(domains_scores_components_scoreAsItemDialog.ScoreAsItemDialog, { score, isOpen: datasetDialogOpen, onClose: () => setDatasetDialogOpen(false) })
173
+ score && /* @__PURE__ */ jsxRuntime.jsx(
174
+ domains_scores_components_scoreAsItemDialog.ScoreAsItemDialog,
175
+ {
176
+ score,
177
+ isOpen: datasetDialogOpen,
178
+ onClose: () => setDatasetDialogOpen(false),
179
+ depth: (depth ?? 1) > 1 ? 3 : 2
180
+ }
181
+ )
174
182
  ] });
175
183
  }
176
184
 
@@ -1 +1 @@
1
- {"version":3,"file":"score-data-panel.cjs.js","sources":["../../../../src/domains/scores/components/score-data-panel.tsx"],"sourcesContent":["import type { ClientScoreRowData } from '@mastra/client-js';\nimport { FileInputIcon, FileOutputIcon, GaugeIcon, ReceiptText, SaveIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport { ScoreAsItemDialog } from './score-as-item-dialog';\nimport { Button } from '@/ds/components/Button';\nimport { DataKeysAndValues } from '@/ds/components/DataKeysAndValues';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport { Txt } from '@/ds/components/Txt';\nimport { useLinkComponent } from '@/lib/framework';\nimport { cn } from '@/utils/cn';\nimport { formatTimestampPrecise } from '@/utils/date-format';\n\nfunction isCodeBasedScorer(score?: ClientScoreRowData): boolean {\n if (!score) return false;\n const scorer = score.scorer as Record<string, unknown> | undefined;\n if (scorer?.hasJudge === false) return true;\n if (scorer?.hasJudge === true) return false;\n return !score.preprocessPrompt && !score.analyzePrompt && !score.generateScorePrompt && !score.generateReasonPrompt;\n}\n\nfunction buildDialogTitle(sectionTitle: string, icon: React.ReactNode, score: ClientScoreRowData) {\n return (\n <>\n <Txt as=\"span\" variant=\"eyebrow\" tone=\"faint\" className=\"flex items-center gap-1.5 [&>svg]:size-3.5\">\n {icon}\n {sectionTitle}\n </Txt>\n <span>\n › Score <b className=\"text-muted-foreground\">#{score.id}</b>\n </span>\n </>\n );\n}\n\nexport interface ScoreDataPanelProps {\n /** Always mount the panel and pass `undefined` to close it, so the drawer can animate out. */\n score?: ClientScoreRowData;\n onClose: () => void;\n onPrevious?: () => void;\n onNext?: () => void;\n depth?: 1 | 2 | 3;\n}\n\nexport function ScoreDataPanel({ score, onClose, onPrevious, onNext, depth }: ScoreDataPanelProps) {\n const { Link, paths } = useLinkComponent();\n const [datasetDialogOpen, setDatasetDialogOpen] = useState(false);\n const isCodeBased = isCodeBasedScorer(score);\n const naText = isCodeBased ? 'N/A — code-based scorer does not use prompts' : 'N/A — step not configured';\n\n return (\n <>\n <DataPanel open={!!score} onClose={onClose} title={score ? `Score ${score.id}` : 'Score'} depth={depth}>\n {score && (\n <>\n <DataPanel.Header>\n <DataPanel.Heading>\n Score\n <DataPanel.CopyId id={score.id} />\n </DataPanel.Heading>\n <DataPanel.HeaderActions>\n {(onPrevious || onNext) && (\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Go to previous score\"\n nextLabel=\"Go to next score\"\n />\n )}\n <DataPanel.CloseButton icon=\"x\" onClick={onClose} label=\"Close score\" tooltip=\"Close score\" />\n </DataPanel.HeaderActions>\n </DataPanel.Header>\n\n <DataPanel.Content>\n <DataKeysAndValues>\n {score.scorer?.name != null && (\n <>\n <DataKeysAndValues.Key>Scorer</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{String(score.scorer.name)}</DataKeysAndValues.Value>\n </>\n )}\n {score.createdAt && (\n <>\n <DataKeysAndValues.Key>Created</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{formatTimestampPrecise(score.createdAt)}</DataKeysAndValues.Value>\n </>\n )}\n {score.traceId && (\n <>\n <DataKeysAndValues.Key>Trace Id</DataKeysAndValues.Key>\n {paths.traceLink(score.traceId) ? (\n <DataKeysAndValues.ValueLink href={paths.traceLink(score.traceId)} as={Link}>\n {score.traceId}\n </DataKeysAndValues.ValueLink>\n ) : (\n <DataKeysAndValues.Value>{score.traceId}</DataKeysAndValues.Value>\n )}\n </>\n )}\n {score.spanId && score.traceId && (\n <>\n <DataKeysAndValues.Key>Span Id</DataKeysAndValues.Key>\n {paths.traceLink(score.traceId, score.spanId) ? (\n <DataKeysAndValues.ValueLink href={paths.traceLink(score.traceId, score.spanId)} as={Link}>\n {score.spanId}\n </DataKeysAndValues.ValueLink>\n ) : (\n <DataKeysAndValues.Value>{score.spanId}</DataKeysAndValues.Value>\n )}\n </>\n )}\n </DataKeysAndValues>\n\n <div className=\"my-6 flex justify-end\">\n <Button size=\"sm\" onClick={() => setDatasetDialogOpen(true)} icon={<SaveIcon />}>\n Save as Dataset Item\n </Button>\n </div>\n\n <div className=\"mb-6 text-muted-foreground\">\n <div\n className={cn(\n 'text-placeholder',\n 'flex items-baseline gap-2',\n '[&>svg]:size-5 [&>svg]:translate-y-1',\n )}\n >\n <GaugeIcon />\n <Txt as=\"span\" variant=\"body\">\n Score:\n </Txt>\n <Txt\n as=\"b\"\n variant=\"body\"\n tone=\"muted\"\n className=\"tabular-nums\"\n >{`${score.score == null || Number.isNaN(score.score) ? 'n/a' : score.score}`}</Txt>\n </div>\n <Txt as=\"p\" variant=\"body-sm\" className=\"mt-2\">\n {score.reason ||\n (isCodeBased ? 'N/A — code-based scorer does not generate a reason' : 'N/A — step not configured')}\n </Txt>\n </div>\n\n <div className=\"grid gap-4\">\n <DataPanel.CodeSection\n title=\"Input\"\n dialogTitle={buildDialogTitle('Input', <FileInputIcon />, score)}\n icon={<FileInputIcon />}\n codeStr={JSON.stringify(score.input ?? null, null, 2)}\n />\n <DataPanel.CodeSection\n title=\"Output\"\n dialogTitle={buildDialogTitle('Output', <FileOutputIcon />, score)}\n icon={<FileOutputIcon />}\n codeStr={JSON.stringify(score.output ?? null, null, 2)}\n />\n <DataPanel.CodeSection\n title=\"Preprocess Prompt\"\n dialogTitle={buildDialogTitle('Preprocess Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.preprocessPrompt || naText}\n simplified={true}\n />\n <DataPanel.CodeSection\n title=\"Analyze Prompt\"\n dialogTitle={buildDialogTitle('Analyze Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.analyzePrompt || naText}\n simplified={true}\n />\n <DataPanel.CodeSection\n title=\"Generate Score Prompt\"\n dialogTitle={buildDialogTitle('Generate Score Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.generateScorePrompt || naText}\n simplified={true}\n />\n <DataPanel.CodeSection\n title=\"Generate Reason Prompt\"\n dialogTitle={buildDialogTitle('Generate Reason Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.generateReasonPrompt || naText}\n simplified={true}\n />\n </div>\n </DataPanel.Content>\n </>\n )}\n </DataPanel>\n\n {score && (\n <ScoreAsItemDialog score={score} isOpen={datasetDialogOpen} onClose={() => setDatasetDialogOpen(false)} />\n )}\n </>\n );\n}\n"],"names":["jsxs","Fragment","Txt","useLinkComponent","useState","jsx","DataPanel","DataKeysAndValues","formatTimestampPrecise","Button","SaveIcon","cn","GaugeIcon","FileInputIcon","FileOutputIcon","ReceiptText","ScoreAsItemDialog"],"mappings":";;;;;;;;;;;;;;;;AAYA,SAAS,kBAAkB,KAAA,EAAqC;AAC9D,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,EAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,EAAA,IAAI,MAAA,EAAQ,QAAA,KAAa,KAAA,EAAO,OAAO,IAAA;AACvC,EAAA,IAAI,MAAA,EAAQ,QAAA,KAAa,IAAA,EAAM,OAAO,KAAA;AACtC,EAAA,OAAO,CAAC,KAAA,CAAM,gBAAA,IAAoB,CAAC,KAAA,CAAM,iBAAiB,CAAC,KAAA,CAAM,mBAAA,IAAuB,CAAC,KAAA,CAAM,oBAAA;AACjG;AAEA,SAAS,gBAAA,CAAiB,YAAA,EAAsB,IAAA,EAAuB,KAAA,EAA2B;AAChG,EAAA,uBACEA,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAD,eAAA,CAACE,OAAA,EAAA,EAAI,IAAG,MAAA,EAAO,OAAA,EAAQ,WAAU,IAAA,EAAK,OAAA,EAAQ,WAAU,4CAAA,EACrD,QAAA,EAAA;AAAA,MAAA,IAAA;AAAA,MACA;AAAA,KAAA,EACH,CAAA;AAAA,oCACC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,MAAA,UAAA;AAAA,sBACIF,eAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA;AAAA,QAAA,GAAA;AAAA,QAAE,KAAA,CAAM;AAAA,OAAA,EAAG;AAAA,KAAA,EAC1D;AAAA,GAAA,EACF,CAAA;AAEJ;AAWO,SAAS,eAAe,EAAE,KAAA,EAAO,SAAS,UAAA,EAAY,MAAA,EAAQ,OAAM,EAAwB;AACjG,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAIG,8BAAA,EAAiB;AACzC,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIC,eAAS,KAAK,CAAA;AAChE,EAAA,MAAM,WAAA,GAAc,kBAAkB,KAAK,CAAA;AAC3C,EAAA,MAAM,MAAA,GAAS,cAAc,8CAAA,GAAiD,2BAAA;AAE9E,EAAA,uBACEJ,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAI,cAAA,CAACC,mBAAA,EAAA,EAAU,IAAA,EAAM,CAAC,CAAC,OAAO,OAAA,EAAkB,KAAA,EAAO,KAAA,GAAQ,CAAA,MAAA,EAAS,MAAM,EAAE,CAAA,CAAA,GAAK,OAAA,EAAS,KAAA,EACvF,mCACCN,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAD,eAAA,CAACM,mBAAA,CAAU,QAAV,EACC,QAAA,EAAA;AAAA,wBAAAN,eAAA,CAACM,mBAAA,CAAU,SAAV,EAAkB,QAAA,EAAA;AAAA,UAAA,OAAA;AAAA,yCAEhBA,mBAAA,CAAU,MAAA,EAAV,EAAiB,EAAA,EAAI,MAAM,EAAA,EAAI;AAAA,SAAA,EAClC,CAAA;AAAA,wBACAN,eAAA,CAACM,mBAAA,CAAU,aAAA,EAAV,EACG,QAAA,EAAA;AAAA,UAAA,CAAA,UAAA,IAAc,MAAA,qBACdD,cAAA;AAAA,YAACC,mBAAA,CAAU,WAAA;AAAA,YAAV;AAAA,cACC,UAAA;AAAA,cACA,MAAA;AAAA,cACA,aAAA,EAAc,sBAAA;AAAA,cACd,SAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BAEFD,cAAA,CAACC,mBAAA,CAAU,WAAA,EAAV,EAAsB,IAAA,EAAK,GAAA,EAAI,OAAA,EAAS,OAAA,EAAS,KAAA,EAAM,aAAA,EAAc,OAAA,EAAQ,aAAA,EAAc;AAAA,SAAA,EAC9F;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAN,eAAA,CAACM,mBAAA,CAAU,OAAA,EAAV,EACC,QAAA,EAAA;AAAA,wBAAAN,eAAA,CAACO,mCAAA,EAAA,EACE,QAAA,EAAA;AAAA,UAAA,KAAA,CAAM,MAAA,EAAQ,IAAA,IAAQ,IAAA,oBACrBP,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAI,cAAA,CAACE,mCAAA,CAAkB,GAAA,EAAlB,EAAsB,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,4BAC7BF,cAAA,CAACE,oCAAkB,KAAA,EAAlB,EAAyB,iBAAO,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA,EAAE;AAAA,WAAA,EACtD,CAAA;AAAA,UAED,KAAA,CAAM,6BACLP,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAI,cAAA,CAACE,mCAAA,CAAkB,GAAA,EAAlB,EAAsB,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,2CAC7BA,mCAAA,CAAkB,KAAA,EAAlB,EAAyB,QAAA,EAAAC,uCAAA,CAAuB,KAAA,CAAM,SAAS,CAAA,EAAE;AAAA,WAAA,EACpE,CAAA;AAAA,UAED,KAAA,CAAM,2BACLR,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAI,cAAA,CAACE,mCAAA,CAAkB,GAAA,EAAlB,EAAsB,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,YAC9B,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,OAAO,CAAA,kCAC3BA,mCAAA,CAAkB,SAAA,EAAlB,EAA4B,IAAA,EAAM,KAAA,CAAM,SAAA,CAAU,MAAM,OAAO,CAAA,EAAG,EAAA,EAAI,IAAA,EACpE,QAAA,EAAA,KAAA,CAAM,OAAA,EACT,CAAA,mBAEAF,cAAA,CAACE,mCAAA,CAAkB,KAAA,EAAlB,EAAyB,QAAA,EAAA,KAAA,CAAM,OAAA,EAAQ;AAAA,WAAA,EAE5C,CAAA;AAAA,UAED,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,OAAA,oBACrBP,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAI,cAAA,CAACE,mCAAA,CAAkB,GAAA,EAAlB,EAAsB,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,YAC7B,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,MAAM,CAAA,mBAC1CF,cAAA,CAACE,mCAAA,CAAkB,SAAA,EAAlB,EAA4B,IAAA,EAAM,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,MAAM,CAAA,EAAG,EAAA,EAAI,IAAA,EAClF,QAAA,EAAA,KAAA,CAAM,MAAA,EACT,CAAA,mBAEAF,cAAA,CAACE,mCAAA,CAAkB,KAAA,EAAlB,EAAyB,gBAAM,MAAA,EAAO;AAAA,WAAA,EAE3C;AAAA,SAAA,EAEJ,CAAA;AAAA,uCAEC,KAAA,EAAA,EAAI,SAAA,EAAU,yBACb,QAAA,kBAAAF,cAAA,CAACI,aAAA,EAAA,EAAO,MAAK,IAAA,EAAK,OAAA,EAAS,MAAM,oBAAA,CAAqB,IAAI,CAAA,EAAG,IAAA,iCAAOC,oBAAA,EAAA,EAAS,CAAA,EAAI,kCAEjF,CAAA,EACF,CAAA;AAAA,wBAEAV,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,eAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAWW,WAAA;AAAA,gBACT,kBAAA;AAAA,gBACA,2BAAA;AAAA,gBACA;AAAA,eACF;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAAN,cAAA,CAACO,qBAAA,EAAA,EAAU,CAAA;AAAA,+CACVV,OAAA,EAAA,EAAI,EAAA,EAAG,MAAA,EAAO,OAAA,EAAQ,QAAO,QAAA,EAAA,QAAA,EAE9B,CAAA;AAAA,gCACAG,cAAA;AAAA,kBAACH,OAAA;AAAA,kBAAA;AAAA,oBACC,EAAA,EAAG,GAAA;AAAA,oBACH,OAAA,EAAQ,MAAA;AAAA,oBACR,IAAA,EAAK,OAAA;AAAA,oBACL,SAAA,EAAU,cAAA;AAAA,oBACV,QAAA,EAAA,CAAA,EAAG,KAAA,CAAM,KAAA,IAAS,IAAA,IAAQ,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA,GAAI,KAAA,GAAQ,KAAA,CAAM,KAAK,CAAA;AAAA;AAAA;AAAG;AAAA;AAAA,WAChF;AAAA,0BACAG,cAAA,CAACH,OAAA,EAAA,EAAI,EAAA,EAAG,GAAA,EAAI,OAAA,EAAQ,SAAA,EAAU,SAAA,EAAU,MAAA,EACrC,QAAA,EAAA,KAAA,CAAM,MAAA,KACJ,WAAA,GAAc,oDAAA,GAAuD,2BAAA,CAAA,EAC1E;AAAA,SAAA,EACF,CAAA;AAAA,wBAEAF,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,0BAAAK,cAAA;AAAA,YAACC,mBAAA,CAAU,WAAA;AAAA,YAAV;AAAA,cACC,KAAA,EAAM,OAAA;AAAA,cACN,aAAa,gBAAA,CAAiB,OAAA,kBAASD,cAAA,CAACQ,yBAAA,EAAA,EAAc,GAAI,KAAK,CAAA;AAAA,cAC/D,IAAA,iCAAOA,yBAAA,EAAA,EAAc,CAAA;AAAA,cACrB,SAAS,IAAA,CAAK,SAAA,CAAU,MAAM,KAAA,IAAS,IAAA,EAAM,MAAM,CAAC;AAAA;AAAA,WACtD;AAAA,0BACAR,cAAA;AAAA,YAACC,mBAAA,CAAU,WAAA;AAAA,YAAV;AAAA,cACC,KAAA,EAAM,QAAA;AAAA,cACN,aAAa,gBAAA,CAAiB,QAAA,kBAAUD,cAAA,CAACS,0BAAA,EAAA,EAAe,GAAI,KAAK,CAAA;AAAA,cACjE,IAAA,iCAAOA,0BAAA,EAAA,EAAe,CAAA;AAAA,cACtB,SAAS,IAAA,CAAK,SAAA,CAAU,MAAM,MAAA,IAAU,IAAA,EAAM,MAAM,CAAC;AAAA;AAAA,WACvD;AAAA,0BACAT,cAAA;AAAA,YAACC,mBAAA,CAAU,WAAA;AAAA,YAAV;AAAA,cACC,KAAA,EAAM,mBAAA;AAAA,cACN,aAAa,gBAAA,CAAiB,mBAAA,kBAAqBD,cAAA,CAACU,uBAAA,EAAA,EAAY,GAAI,KAAK,CAAA;AAAA,cACzE,IAAA,iCAAOA,uBAAA,EAAA,EAAY,CAAA;AAAA,cACnB,OAAA,EAAS,MAAM,gBAAA,IAAoB,MAAA;AAAA,cACnC,UAAA,EAAY;AAAA;AAAA,WACd;AAAA,0BACAV,cAAA;AAAA,YAACC,mBAAA,CAAU,WAAA;AAAA,YAAV;AAAA,cACC,KAAA,EAAM,gBAAA;AAAA,cACN,aAAa,gBAAA,CAAiB,gBAAA,kBAAkBD,cAAA,CAACU,uBAAA,EAAA,EAAY,GAAI,KAAK,CAAA;AAAA,cACtE,IAAA,iCAAOA,uBAAA,EAAA,EAAY,CAAA;AAAA,cACnB,OAAA,EAAS,MAAM,aAAA,IAAiB,MAAA;AAAA,cAChC,UAAA,EAAY;AAAA;AAAA,WACd;AAAA,0BACAV,cAAA;AAAA,YAACC,mBAAA,CAAU,WAAA;AAAA,YAAV;AAAA,cACC,KAAA,EAAM,uBAAA;AAAA,cACN,aAAa,gBAAA,CAAiB,uBAAA,kBAAyBD,cAAA,CAACU,uBAAA,EAAA,EAAY,GAAI,KAAK,CAAA;AAAA,cAC7E,IAAA,iCAAOA,uBAAA,EAAA,EAAY,CAAA;AAAA,cACnB,OAAA,EAAS,MAAM,mBAAA,IAAuB,MAAA;AAAA,cACtC,UAAA,EAAY;AAAA;AAAA,WACd;AAAA,0BACAV,cAAA;AAAA,YAACC,mBAAA,CAAU,WAAA;AAAA,YAAV;AAAA,cACC,KAAA,EAAM,wBAAA;AAAA,cACN,aAAa,gBAAA,CAAiB,wBAAA,kBAA0BD,cAAA,CAACU,uBAAA,EAAA,EAAY,GAAI,KAAK,CAAA;AAAA,cAC9E,IAAA,iCAAOA,uBAAA,EAAA,EAAY,CAAA;AAAA,cACnB,OAAA,EAAS,MAAM,oBAAA,IAAwB,MAAA;AAAA,cACvC,UAAA,EAAY;AAAA;AAAA;AACd,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA,EAEJ,CAAA;AAAA,IAEC,KAAA,oBACCV,cAAA,CAACW,6DAAA,EAAA,EAAkB,KAAA,EAAc,MAAA,EAAQ,mBAAmB,OAAA,EAAS,MAAM,oBAAA,CAAqB,KAAK,CAAA,EAAG;AAAA,GAAA,EAE5G,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"score-data-panel.cjs.js","sources":["../../../../src/domains/scores/components/score-data-panel.tsx"],"sourcesContent":["import type { ClientScoreRowData } from '@mastra/client-js';\nimport { FileInputIcon, FileOutputIcon, GaugeIcon, ReceiptText, SaveIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport { ScoreAsItemDialog } from './score-as-item-dialog';\nimport { Button } from '@/ds/components/Button';\nimport { DataKeysAndValues } from '@/ds/components/DataKeysAndValues';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport { Txt } from '@/ds/components/Txt';\nimport { useLinkComponent } from '@/lib/framework';\nimport { cn } from '@/utils/cn';\nimport { formatTimestampPrecise } from '@/utils/date-format';\n\nfunction isCodeBasedScorer(score?: ClientScoreRowData): boolean {\n if (!score) return false;\n const scorer = score.scorer as Record<string, unknown> | undefined;\n if (scorer?.hasJudge === false) return true;\n if (scorer?.hasJudge === true) return false;\n return !score.preprocessPrompt && !score.analyzePrompt && !score.generateScorePrompt && !score.generateReasonPrompt;\n}\n\nfunction buildDialogTitle(sectionTitle: string, icon: React.ReactNode, score: ClientScoreRowData) {\n return (\n <>\n <Txt as=\"span\" variant=\"eyebrow\" tone=\"faint\" className=\"flex items-center gap-1.5 [&>svg]:size-3.5\">\n {icon}\n {sectionTitle}\n </Txt>\n <span>\n › Score <b className=\"text-muted-foreground\">#{score.id}</b>\n </span>\n </>\n );\n}\n\nexport interface ScoreDataPanelProps {\n /** Always mount the panel and pass `undefined` to close it, so the drawer can animate out. */\n score?: ClientScoreRowData;\n onClose: () => void;\n onPrevious?: () => void;\n onNext?: () => void;\n depth?: 1 | 2 | 3;\n}\n\nexport function ScoreDataPanel({ score, onClose, onPrevious, onNext, depth }: ScoreDataPanelProps) {\n const { Link, paths } = useLinkComponent();\n const [datasetDialogOpen, setDatasetDialogOpen] = useState(false);\n const isCodeBased = isCodeBasedScorer(score);\n const naText = isCodeBased ? 'N/A — code-based scorer does not use prompts' : 'N/A — step not configured';\n\n return (\n <>\n <DataPanel open={!!score} onClose={onClose} title={score ? `Score ${score.id}` : 'Score'} depth={depth}>\n {score && (\n <>\n <DataPanel.Header>\n <DataPanel.Heading>\n Score\n <DataPanel.CopyId id={score.id} />\n </DataPanel.Heading>\n <DataPanel.HeaderActions>\n {(onPrevious || onNext) && (\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Go to previous score\"\n nextLabel=\"Go to next score\"\n />\n )}\n <DataPanel.CloseButton icon=\"x\" onClick={onClose} label=\"Close score\" tooltip=\"Close score\" />\n </DataPanel.HeaderActions>\n </DataPanel.Header>\n\n <DataPanel.Content>\n <DataKeysAndValues>\n {score.scorer?.name != null && (\n <>\n <DataKeysAndValues.Key>Scorer</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{String(score.scorer.name)}</DataKeysAndValues.Value>\n </>\n )}\n {score.createdAt && (\n <>\n <DataKeysAndValues.Key>Created</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{formatTimestampPrecise(score.createdAt)}</DataKeysAndValues.Value>\n </>\n )}\n {score.traceId && (\n <>\n <DataKeysAndValues.Key>Trace Id</DataKeysAndValues.Key>\n {paths.traceLink(score.traceId) ? (\n <DataKeysAndValues.ValueLink href={paths.traceLink(score.traceId)} as={Link}>\n {score.traceId}\n </DataKeysAndValues.ValueLink>\n ) : (\n <DataKeysAndValues.Value>{score.traceId}</DataKeysAndValues.Value>\n )}\n </>\n )}\n {score.spanId && score.traceId && (\n <>\n <DataKeysAndValues.Key>Span Id</DataKeysAndValues.Key>\n {paths.traceLink(score.traceId, score.spanId) ? (\n <DataKeysAndValues.ValueLink href={paths.traceLink(score.traceId, score.spanId)} as={Link}>\n {score.spanId}\n </DataKeysAndValues.ValueLink>\n ) : (\n <DataKeysAndValues.Value>{score.spanId}</DataKeysAndValues.Value>\n )}\n </>\n )}\n </DataKeysAndValues>\n\n <div className=\"my-6 flex justify-end\">\n <Button size=\"sm\" onClick={() => setDatasetDialogOpen(true)} icon={<SaveIcon />}>\n Save as Dataset Item\n </Button>\n </div>\n\n <div className=\"mb-6 text-muted-foreground\">\n <div\n className={cn(\n 'text-placeholder',\n 'flex items-baseline gap-2',\n '[&>svg]:size-5 [&>svg]:translate-y-1',\n )}\n >\n <GaugeIcon />\n <Txt as=\"span\" variant=\"body\">\n Score:\n </Txt>\n <Txt\n as=\"b\"\n variant=\"body\"\n tone=\"muted\"\n className=\"tabular-nums\"\n >{`${score.score == null || Number.isNaN(score.score) ? 'n/a' : score.score}`}</Txt>\n </div>\n <Txt as=\"p\" variant=\"body-sm\" className=\"mt-2\">\n {score.reason ||\n (isCodeBased ? 'N/A — code-based scorer does not generate a reason' : 'N/A — step not configured')}\n </Txt>\n </div>\n\n <div className=\"grid gap-4\">\n <DataPanel.CodeSection\n title=\"Input\"\n dialogTitle={buildDialogTitle('Input', <FileInputIcon />, score)}\n icon={<FileInputIcon />}\n codeStr={JSON.stringify(score.input ?? null, null, 2)}\n />\n <DataPanel.CodeSection\n title=\"Output\"\n dialogTitle={buildDialogTitle('Output', <FileOutputIcon />, score)}\n icon={<FileOutputIcon />}\n codeStr={JSON.stringify(score.output ?? null, null, 2)}\n />\n <DataPanel.CodeSection\n title=\"Preprocess Prompt\"\n dialogTitle={buildDialogTitle('Preprocess Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.preprocessPrompt || naText}\n simplified={true}\n />\n <DataPanel.CodeSection\n title=\"Analyze Prompt\"\n dialogTitle={buildDialogTitle('Analyze Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.analyzePrompt || naText}\n simplified={true}\n />\n <DataPanel.CodeSection\n title=\"Generate Score Prompt\"\n dialogTitle={buildDialogTitle('Generate Score Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.generateScorePrompt || naText}\n simplified={true}\n />\n <DataPanel.CodeSection\n title=\"Generate Reason Prompt\"\n dialogTitle={buildDialogTitle('Generate Reason Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.generateReasonPrompt || naText}\n simplified={true}\n />\n </div>\n </DataPanel.Content>\n </>\n )}\n </DataPanel>\n\n {score && (\n <ScoreAsItemDialog\n score={score}\n isOpen={datasetDialogOpen}\n onClose={() => setDatasetDialogOpen(false)}\n depth={(depth ?? 1) > 1 ? 3 : 2}\n />\n )}\n </>\n );\n}\n"],"names":["jsxs","Fragment","Txt","useLinkComponent","useState","jsx","DataPanel","DataKeysAndValues","formatTimestampPrecise","Button","SaveIcon","cn","GaugeIcon","FileInputIcon","FileOutputIcon","ReceiptText","ScoreAsItemDialog"],"mappings":"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"}
@@ -166,7 +166,15 @@ function ScoreDataPanel({ score, onClose, onPrevious, onNext, depth }) {
166
166
  ] })
167
167
  ] })
168
168
  ] }) }),
169
- score && /* @__PURE__ */ jsx(ScoreAsItemDialog, { score, isOpen: datasetDialogOpen, onClose: () => setDatasetDialogOpen(false) })
169
+ score && /* @__PURE__ */ jsx(
170
+ ScoreAsItemDialog,
171
+ {
172
+ score,
173
+ isOpen: datasetDialogOpen,
174
+ onClose: () => setDatasetDialogOpen(false),
175
+ depth: (depth ?? 1) > 1 ? 3 : 2
176
+ }
177
+ )
170
178
  ] });
171
179
  }
172
180
 
@@ -1 +1 @@
1
- {"version":3,"file":"score-data-panel.es.js","sources":["../../../../src/domains/scores/components/score-data-panel.tsx"],"sourcesContent":["import type { ClientScoreRowData } from '@mastra/client-js';\nimport { FileInputIcon, FileOutputIcon, GaugeIcon, ReceiptText, SaveIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport { ScoreAsItemDialog } from './score-as-item-dialog';\nimport { Button } from '@/ds/components/Button';\nimport { DataKeysAndValues } from '@/ds/components/DataKeysAndValues';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport { Txt } from '@/ds/components/Txt';\nimport { useLinkComponent } from '@/lib/framework';\nimport { cn } from '@/utils/cn';\nimport { formatTimestampPrecise } from '@/utils/date-format';\n\nfunction isCodeBasedScorer(score?: ClientScoreRowData): boolean {\n if (!score) return false;\n const scorer = score.scorer as Record<string, unknown> | undefined;\n if (scorer?.hasJudge === false) return true;\n if (scorer?.hasJudge === true) return false;\n return !score.preprocessPrompt && !score.analyzePrompt && !score.generateScorePrompt && !score.generateReasonPrompt;\n}\n\nfunction buildDialogTitle(sectionTitle: string, icon: React.ReactNode, score: ClientScoreRowData) {\n return (\n <>\n <Txt as=\"span\" variant=\"eyebrow\" tone=\"faint\" className=\"flex items-center gap-1.5 [&>svg]:size-3.5\">\n {icon}\n {sectionTitle}\n </Txt>\n <span>\n › Score <b className=\"text-muted-foreground\">#{score.id}</b>\n </span>\n </>\n );\n}\n\nexport interface ScoreDataPanelProps {\n /** Always mount the panel and pass `undefined` to close it, so the drawer can animate out. */\n score?: ClientScoreRowData;\n onClose: () => void;\n onPrevious?: () => void;\n onNext?: () => void;\n depth?: 1 | 2 | 3;\n}\n\nexport function ScoreDataPanel({ score, onClose, onPrevious, onNext, depth }: ScoreDataPanelProps) {\n const { Link, paths } = useLinkComponent();\n const [datasetDialogOpen, setDatasetDialogOpen] = useState(false);\n const isCodeBased = isCodeBasedScorer(score);\n const naText = isCodeBased ? 'N/A — code-based scorer does not use prompts' : 'N/A — step not configured';\n\n return (\n <>\n <DataPanel open={!!score} onClose={onClose} title={score ? `Score ${score.id}` : 'Score'} depth={depth}>\n {score && (\n <>\n <DataPanel.Header>\n <DataPanel.Heading>\n Score\n <DataPanel.CopyId id={score.id} />\n </DataPanel.Heading>\n <DataPanel.HeaderActions>\n {(onPrevious || onNext) && (\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Go to previous score\"\n nextLabel=\"Go to next score\"\n />\n )}\n <DataPanel.CloseButton icon=\"x\" onClick={onClose} label=\"Close score\" tooltip=\"Close score\" />\n </DataPanel.HeaderActions>\n </DataPanel.Header>\n\n <DataPanel.Content>\n <DataKeysAndValues>\n {score.scorer?.name != null && (\n <>\n <DataKeysAndValues.Key>Scorer</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{String(score.scorer.name)}</DataKeysAndValues.Value>\n </>\n )}\n {score.createdAt && (\n <>\n <DataKeysAndValues.Key>Created</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{formatTimestampPrecise(score.createdAt)}</DataKeysAndValues.Value>\n </>\n )}\n {score.traceId && (\n <>\n <DataKeysAndValues.Key>Trace Id</DataKeysAndValues.Key>\n {paths.traceLink(score.traceId) ? (\n <DataKeysAndValues.ValueLink href={paths.traceLink(score.traceId)} as={Link}>\n {score.traceId}\n </DataKeysAndValues.ValueLink>\n ) : (\n <DataKeysAndValues.Value>{score.traceId}</DataKeysAndValues.Value>\n )}\n </>\n )}\n {score.spanId && score.traceId && (\n <>\n <DataKeysAndValues.Key>Span Id</DataKeysAndValues.Key>\n {paths.traceLink(score.traceId, score.spanId) ? (\n <DataKeysAndValues.ValueLink href={paths.traceLink(score.traceId, score.spanId)} as={Link}>\n {score.spanId}\n </DataKeysAndValues.ValueLink>\n ) : (\n <DataKeysAndValues.Value>{score.spanId}</DataKeysAndValues.Value>\n )}\n </>\n )}\n </DataKeysAndValues>\n\n <div className=\"my-6 flex justify-end\">\n <Button size=\"sm\" onClick={() => setDatasetDialogOpen(true)} icon={<SaveIcon />}>\n Save as Dataset Item\n </Button>\n </div>\n\n <div className=\"mb-6 text-muted-foreground\">\n <div\n className={cn(\n 'text-placeholder',\n 'flex items-baseline gap-2',\n '[&>svg]:size-5 [&>svg]:translate-y-1',\n )}\n >\n <GaugeIcon />\n <Txt as=\"span\" variant=\"body\">\n Score:\n </Txt>\n <Txt\n as=\"b\"\n variant=\"body\"\n tone=\"muted\"\n className=\"tabular-nums\"\n >{`${score.score == null || Number.isNaN(score.score) ? 'n/a' : score.score}`}</Txt>\n </div>\n <Txt as=\"p\" variant=\"body-sm\" className=\"mt-2\">\n {score.reason ||\n (isCodeBased ? 'N/A — code-based scorer does not generate a reason' : 'N/A — step not configured')}\n </Txt>\n </div>\n\n <div className=\"grid gap-4\">\n <DataPanel.CodeSection\n title=\"Input\"\n dialogTitle={buildDialogTitle('Input', <FileInputIcon />, score)}\n icon={<FileInputIcon />}\n codeStr={JSON.stringify(score.input ?? null, null, 2)}\n />\n <DataPanel.CodeSection\n title=\"Output\"\n dialogTitle={buildDialogTitle('Output', <FileOutputIcon />, score)}\n icon={<FileOutputIcon />}\n codeStr={JSON.stringify(score.output ?? null, null, 2)}\n />\n <DataPanel.CodeSection\n title=\"Preprocess Prompt\"\n dialogTitle={buildDialogTitle('Preprocess Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.preprocessPrompt || naText}\n simplified={true}\n />\n <DataPanel.CodeSection\n title=\"Analyze Prompt\"\n dialogTitle={buildDialogTitle('Analyze Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.analyzePrompt || naText}\n simplified={true}\n />\n <DataPanel.CodeSection\n title=\"Generate Score Prompt\"\n dialogTitle={buildDialogTitle('Generate Score Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.generateScorePrompt || naText}\n simplified={true}\n />\n <DataPanel.CodeSection\n title=\"Generate Reason Prompt\"\n dialogTitle={buildDialogTitle('Generate Reason Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.generateReasonPrompt || naText}\n simplified={true}\n />\n </div>\n </DataPanel.Content>\n </>\n )}\n </DataPanel>\n\n {score && (\n <ScoreAsItemDialog score={score} isOpen={datasetDialogOpen} onClose={() => setDatasetDialogOpen(false)} />\n )}\n </>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"score-data-panel.es.js","sources":["../../../../src/domains/scores/components/score-data-panel.tsx"],"sourcesContent":["import type { ClientScoreRowData } from '@mastra/client-js';\nimport { FileInputIcon, FileOutputIcon, GaugeIcon, ReceiptText, SaveIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport { ScoreAsItemDialog } from './score-as-item-dialog';\nimport { Button } from '@/ds/components/Button';\nimport { DataKeysAndValues } from '@/ds/components/DataKeysAndValues';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport { Txt } from '@/ds/components/Txt';\nimport { useLinkComponent } from '@/lib/framework';\nimport { cn } from '@/utils/cn';\nimport { formatTimestampPrecise } from '@/utils/date-format';\n\nfunction isCodeBasedScorer(score?: ClientScoreRowData): boolean {\n if (!score) return false;\n const scorer = score.scorer as Record<string, unknown> | undefined;\n if (scorer?.hasJudge === false) return true;\n if (scorer?.hasJudge === true) return false;\n return !score.preprocessPrompt && !score.analyzePrompt && !score.generateScorePrompt && !score.generateReasonPrompt;\n}\n\nfunction buildDialogTitle(sectionTitle: string, icon: React.ReactNode, score: ClientScoreRowData) {\n return (\n <>\n <Txt as=\"span\" variant=\"eyebrow\" tone=\"faint\" className=\"flex items-center gap-1.5 [&>svg]:size-3.5\">\n {icon}\n {sectionTitle}\n </Txt>\n <span>\n › Score <b className=\"text-muted-foreground\">#{score.id}</b>\n </span>\n </>\n );\n}\n\nexport interface ScoreDataPanelProps {\n /** Always mount the panel and pass `undefined` to close it, so the drawer can animate out. */\n score?: ClientScoreRowData;\n onClose: () => void;\n onPrevious?: () => void;\n onNext?: () => void;\n depth?: 1 | 2 | 3;\n}\n\nexport function ScoreDataPanel({ score, onClose, onPrevious, onNext, depth }: ScoreDataPanelProps) {\n const { Link, paths } = useLinkComponent();\n const [datasetDialogOpen, setDatasetDialogOpen] = useState(false);\n const isCodeBased = isCodeBasedScorer(score);\n const naText = isCodeBased ? 'N/A — code-based scorer does not use prompts' : 'N/A — step not configured';\n\n return (\n <>\n <DataPanel open={!!score} onClose={onClose} title={score ? `Score ${score.id}` : 'Score'} depth={depth}>\n {score && (\n <>\n <DataPanel.Header>\n <DataPanel.Heading>\n Score\n <DataPanel.CopyId id={score.id} />\n </DataPanel.Heading>\n <DataPanel.HeaderActions>\n {(onPrevious || onNext) && (\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Go to previous score\"\n nextLabel=\"Go to next score\"\n />\n )}\n <DataPanel.CloseButton icon=\"x\" onClick={onClose} label=\"Close score\" tooltip=\"Close score\" />\n </DataPanel.HeaderActions>\n </DataPanel.Header>\n\n <DataPanel.Content>\n <DataKeysAndValues>\n {score.scorer?.name != null && (\n <>\n <DataKeysAndValues.Key>Scorer</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{String(score.scorer.name)}</DataKeysAndValues.Value>\n </>\n )}\n {score.createdAt && (\n <>\n <DataKeysAndValues.Key>Created</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{formatTimestampPrecise(score.createdAt)}</DataKeysAndValues.Value>\n </>\n )}\n {score.traceId && (\n <>\n <DataKeysAndValues.Key>Trace Id</DataKeysAndValues.Key>\n {paths.traceLink(score.traceId) ? (\n <DataKeysAndValues.ValueLink href={paths.traceLink(score.traceId)} as={Link}>\n {score.traceId}\n </DataKeysAndValues.ValueLink>\n ) : (\n <DataKeysAndValues.Value>{score.traceId}</DataKeysAndValues.Value>\n )}\n </>\n )}\n {score.spanId && score.traceId && (\n <>\n <DataKeysAndValues.Key>Span Id</DataKeysAndValues.Key>\n {paths.traceLink(score.traceId, score.spanId) ? (\n <DataKeysAndValues.ValueLink href={paths.traceLink(score.traceId, score.spanId)} as={Link}>\n {score.spanId}\n </DataKeysAndValues.ValueLink>\n ) : (\n <DataKeysAndValues.Value>{score.spanId}</DataKeysAndValues.Value>\n )}\n </>\n )}\n </DataKeysAndValues>\n\n <div className=\"my-6 flex justify-end\">\n <Button size=\"sm\" onClick={() => setDatasetDialogOpen(true)} icon={<SaveIcon />}>\n Save as Dataset Item\n </Button>\n </div>\n\n <div className=\"mb-6 text-muted-foreground\">\n <div\n className={cn(\n 'text-placeholder',\n 'flex items-baseline gap-2',\n '[&>svg]:size-5 [&>svg]:translate-y-1',\n )}\n >\n <GaugeIcon />\n <Txt as=\"span\" variant=\"body\">\n Score:\n </Txt>\n <Txt\n as=\"b\"\n variant=\"body\"\n tone=\"muted\"\n className=\"tabular-nums\"\n >{`${score.score == null || Number.isNaN(score.score) ? 'n/a' : score.score}`}</Txt>\n </div>\n <Txt as=\"p\" variant=\"body-sm\" className=\"mt-2\">\n {score.reason ||\n (isCodeBased ? 'N/A — code-based scorer does not generate a reason' : 'N/A — step not configured')}\n </Txt>\n </div>\n\n <div className=\"grid gap-4\">\n <DataPanel.CodeSection\n title=\"Input\"\n dialogTitle={buildDialogTitle('Input', <FileInputIcon />, score)}\n icon={<FileInputIcon />}\n codeStr={JSON.stringify(score.input ?? null, null, 2)}\n />\n <DataPanel.CodeSection\n title=\"Output\"\n dialogTitle={buildDialogTitle('Output', <FileOutputIcon />, score)}\n icon={<FileOutputIcon />}\n codeStr={JSON.stringify(score.output ?? null, null, 2)}\n />\n <DataPanel.CodeSection\n title=\"Preprocess Prompt\"\n dialogTitle={buildDialogTitle('Preprocess Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.preprocessPrompt || naText}\n simplified={true}\n />\n <DataPanel.CodeSection\n title=\"Analyze Prompt\"\n dialogTitle={buildDialogTitle('Analyze Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.analyzePrompt || naText}\n simplified={true}\n />\n <DataPanel.CodeSection\n title=\"Generate Score Prompt\"\n dialogTitle={buildDialogTitle('Generate Score Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.generateScorePrompt || naText}\n simplified={true}\n />\n <DataPanel.CodeSection\n title=\"Generate Reason Prompt\"\n dialogTitle={buildDialogTitle('Generate Reason Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.generateReasonPrompt || naText}\n simplified={true}\n />\n </div>\n </DataPanel.Content>\n </>\n )}\n </DataPanel>\n\n {score && (\n <ScoreAsItemDialog\n score={score}\n isOpen={datasetDialogOpen}\n onClose={() => setDatasetDialogOpen(false)}\n depth={(depth ?? 1) > 1 ? 3 : 2}\n />\n )}\n </>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
5
5
  const jsxRuntime = require('react/jsx-runtime');
6
6
  const scores = require('@mastra/react/hooks/scores');
7
7
  const React = require('react');
8
- const dataList = require('../../../data-list-DUfXIhyC.cjs');
8
+ const dataList = require('../../../data-list-CmjTe8xE.cjs');
9
9
  const EmptyState = require('../../../EmptyState-FNJu74e8.cjs');
10
10
  const metricsKpiCard = require('../../../metrics-kpi-card-LOGZrRxg.cjs');
11
11
  const spinner = require('../../../spinner-Q8y5rnSa.cjs');
@@ -1,7 +1,7 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { useTraceSpanScores } from '@mastra/react/hooks/scores';
3
3
  import { useState } from 'react';
4
- import { D as DataList } from '../../../data-list-DXQY_iQW.js';
4
+ import { D as DataList } from '../../../data-list-DT1LVR29.js';
5
5
  import { E as EmptyState } from '../../../EmptyState-qVoRkUMf.js';
6
6
  import { M as MetricsKpiCard } from '../../../metrics-kpi-card-Br-DJ-As.js';
7
7
  import { S as Spinner } from '../../../spinner-CsLM6TfA.js';
@@ -6,13 +6,6 @@ const formatHierarchicalSpans = (spans, anchorSpanId) => {
6
6
  if (!spans || spans.length === 0) {
7
7
  return [];
8
8
  }
9
- const overallEndDate = spans.reduce(
10
- (latest, span) => {
11
- const endDate = span?.endedAt ? new Date(span.endedAt) : void 0;
12
- return endDate && (!latest || endDate > latest) ? endDate : latest;
13
- },
14
- null
15
- );
16
9
  const spanMap = /* @__PURE__ */ new Map();
17
10
  const rootSpans = [];
18
11
  spans.forEach((spanRecord) => {
@@ -36,12 +29,6 @@ const formatHierarchicalSpans = (spans, anchorSpanId) => {
36
29
  const uiSpan = spanMap.get(spanRecord.spanId);
37
30
  if (!uiSpan) return;
38
31
  if (isAnchor(spanRecord)) {
39
- if (overallEndDate && uiSpan.endTime && overallEndDate > new Date(uiSpan.endTime)) {
40
- uiSpan.endTime = overallEndDate.toISOString();
41
- const overallEndTime = new Date(overallEndDate).getTime();
42
- const spanStartTime = new Date(uiSpan.startTime).getTime();
43
- uiSpan.latency = overallEndTime - spanStartTime;
44
- }
45
32
  rootSpans.push(uiSpan);
46
33
  } else {
47
34
  const parent = spanRecord.parentSpanId ? spanMap.get(spanRecord.parentSpanId) : void 0;
@@ -66,6 +53,18 @@ const formatHierarchicalSpans = (spans, anchorSpanId) => {
66
53
  });
67
54
  };
68
55
  sortNestedSpans(sortedRootSpans);
56
+ const getLatestEndTime = (span) => (span.spans ?? []).reduce(
57
+ (latest, child) => Math.max(latest, getLatestEndTime(child)),
58
+ span.endTime ? new Date(span.endTime).getTime() : 0
59
+ );
60
+ sortedRootSpans.forEach((rootSpan) => {
61
+ if (!rootSpan.endTime) return;
62
+ const latestEndTime = getLatestEndTime(rootSpan);
63
+ if (latestEndTime > new Date(rootSpan.endTime).getTime()) {
64
+ rootSpan.endTime = new Date(latestEndTime).toISOString();
65
+ rootSpan.latency = latestEndTime - new Date(rootSpan.startTime).getTime();
66
+ }
67
+ });
69
68
  return sortedRootSpans;
70
69
  };
71
70
 
@@ -1 +1 @@
1
- {"version":3,"file":"format-hierarchical-spans.cjs.js","sources":["../../../../src/domains/traces/components/format-hierarchical-spans.ts"],"sourcesContent":["import type { UISpan } from '../types';\n\n/** Minimal span fields required for building the hierarchical timeline tree. */\ntype TimelineSpan = {\n spanId: string;\n name: string;\n spanType: string;\n startedAt: Date | string;\n endedAt?: Date | string | null;\n parentSpanId?: string | null;\n matchedInPayloadOnly?: boolean;\n};\n\n/**\n * When `anchorSpanId` is provided, that span is treated as the displayed root\n * regardless of its `parentSpanId` -- the branch-subtree case from `getBranch`,\n * where the anchor has a real parent that's outside the returned set. Without\n * it, the displayed roots are the spans with no parent (the trace case).\n */\nexport const formatHierarchicalSpans = (spans: TimelineSpan[], anchorSpanId?: string): UISpan[] => {\n if (!spans || spans.length === 0) {\n return [];\n }\n\n const overallEndDate = spans.reduce(\n (latest, span) => {\n const endDate = span?.endedAt ? new Date(span.endedAt) : undefined;\n return endDate && (!latest || endDate > latest) ? endDate : latest;\n },\n null as Date | null,\n );\n\n const spanMap = new Map<string, UISpan>();\n const rootSpans: UISpan[] = [];\n\n spans.forEach(spanRecord => {\n const startDate = new Date(spanRecord.startedAt);\n const endDate = spanRecord.endedAt ? new Date(spanRecord.endedAt) : undefined;\n\n const uiSpan: UISpan = {\n id: spanRecord.spanId,\n name: spanRecord.name,\n type: spanRecord.spanType,\n latency: endDate ? endDate.getTime() - startDate.getTime() : 0,\n startTime: startDate.toISOString(),\n endTime: endDate ? endDate.toISOString() : undefined,\n spans: [],\n parentSpanId: spanRecord.parentSpanId,\n matchedInPayloadOnly: spanRecord.matchedInPayloadOnly,\n };\n\n spanMap.set(spanRecord.spanId, uiSpan);\n });\n\n const isAnchor = (spanRecord: TimelineSpan) =>\n anchorSpanId ? spanRecord.spanId === anchorSpanId : spanRecord?.parentSpanId == null;\n\n spans.forEach(spanRecord => {\n const uiSpan = spanMap.get(spanRecord.spanId);\n if (!uiSpan) return;\n\n if (isAnchor(spanRecord)) {\n if (overallEndDate && uiSpan.endTime && overallEndDate > new Date(uiSpan.endTime)) {\n uiSpan.endTime = overallEndDate.toISOString();\n const overallEndTime = new Date(overallEndDate).getTime();\n const spanStartTime = new Date(uiSpan.startTime).getTime();\n uiSpan.latency = overallEndTime - spanStartTime;\n }\n rootSpans.push(uiSpan);\n } else {\n const parent = spanRecord.parentSpanId ? spanMap.get(spanRecord.parentSpanId) : undefined;\n if (parent) {\n parent.spans ??= [];\n parent.spans.push(uiSpan);\n } else {\n // Orphan: either the parent isn't in the supplied set (branch subtree boundary), or\n // the span has no parent yet wasn't picked as the anchor (rare when `anchorSpanId`\n // is specified). Surface it at the displayed root rather than dropping it.\n rootSpans.push(uiSpan);\n }\n }\n });\n\n const sortSpansByStartTime = (spans: UISpan[]): UISpan[] => {\n return spans.sort((a, b) => new Date(a.startTime).getTime() - new Date(b.startTime).getTime());\n };\n\n const sortedRootSpans = sortSpansByStartTime(rootSpans);\n\n const sortNestedSpans = (spans: UISpan[]): void => {\n spans.forEach(span => {\n if (span.spans && span.spans.length > 0) {\n span.spans = sortSpansByStartTime(span.spans);\n sortNestedSpans(span.spans);\n }\n });\n };\n\n sortNestedSpans(sortedRootSpans);\n\n return sortedRootSpans;\n};\n"],"names":["spans"],"mappings":"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"}
1
+ {"version":3,"file":"format-hierarchical-spans.cjs.js","sources":["../../../../src/domains/traces/components/format-hierarchical-spans.ts"],"sourcesContent":["import type { UISpan } from '../types';\n\n/** Minimal span fields required for building the hierarchical timeline tree. */\ntype TimelineSpan = {\n spanId: string;\n name: string;\n spanType: string;\n startedAt: Date | string;\n endedAt?: Date | string | null;\n parentSpanId?: string | null;\n matchedInPayloadOnly?: boolean;\n};\n\n/**\n * When `anchorSpanId` is provided, that span is treated as the displayed root\n * regardless of its `parentSpanId` -- the branch-subtree case from `getBranch`,\n * where the anchor has a real parent that's outside the returned set. Without\n * it, the displayed roots are the spans with no parent (the trace case).\n */\nexport const formatHierarchicalSpans = (spans: TimelineSpan[], anchorSpanId?: string): UISpan[] => {\n if (!spans || spans.length === 0) {\n return [];\n }\n\n const spanMap = new Map<string, UISpan>();\n const rootSpans: UISpan[] = [];\n\n spans.forEach(spanRecord => {\n const startDate = new Date(spanRecord.startedAt);\n const endDate = spanRecord.endedAt ? new Date(spanRecord.endedAt) : undefined;\n\n const uiSpan: UISpan = {\n id: spanRecord.spanId,\n name: spanRecord.name,\n type: spanRecord.spanType,\n latency: endDate ? endDate.getTime() - startDate.getTime() : 0,\n startTime: startDate.toISOString(),\n endTime: endDate ? endDate.toISOString() : undefined,\n spans: [],\n parentSpanId: spanRecord.parentSpanId,\n matchedInPayloadOnly: spanRecord.matchedInPayloadOnly,\n };\n\n spanMap.set(spanRecord.spanId, uiSpan);\n });\n\n const isAnchor = (spanRecord: TimelineSpan) =>\n anchorSpanId ? spanRecord.spanId === anchorSpanId : spanRecord?.parentSpanId == null;\n\n spans.forEach(spanRecord => {\n const uiSpan = spanMap.get(spanRecord.spanId);\n if (!uiSpan) return;\n\n if (isAnchor(spanRecord)) {\n rootSpans.push(uiSpan);\n } else {\n const parent = spanRecord.parentSpanId ? spanMap.get(spanRecord.parentSpanId) : undefined;\n if (parent) {\n parent.spans ??= [];\n parent.spans.push(uiSpan);\n } else {\n // Orphan: either the parent isn't in the supplied set (branch subtree boundary), or\n // the span has no parent yet wasn't picked as the anchor (rare when `anchorSpanId`\n // is specified). Surface it at the displayed root rather than dropping it.\n rootSpans.push(uiSpan);\n }\n }\n });\n\n const sortSpansByStartTime = (spans: UISpan[]): UISpan[] => {\n return spans.sort((a, b) => new Date(a.startTime).getTime() - new Date(b.startTime).getTime());\n };\n\n const sortedRootSpans = sortSpansByStartTime(rootSpans);\n\n const sortNestedSpans = (spans: UISpan[]): void => {\n spans.forEach(span => {\n if (span.spans && span.spans.length > 0) {\n span.spans = sortSpansByStartTime(span.spans);\n sortNestedSpans(span.spans);\n }\n });\n };\n\n sortNestedSpans(sortedRootSpans);\n\n const getLatestEndTime = (span: UISpan): number =>\n (span.spans ?? []).reduce(\n (latest, child) => Math.max(latest, getLatestEndTime(child)),\n span.endTime ? new Date(span.endTime).getTime() : 0,\n );\n\n // A root recorded as ending before one of its descendants is widened to cover its own subtree only.\n sortedRootSpans.forEach(rootSpan => {\n if (!rootSpan.endTime) return;\n const latestEndTime = getLatestEndTime(rootSpan);\n if (latestEndTime > new Date(rootSpan.endTime).getTime()) {\n rootSpan.endTime = new Date(latestEndTime).toISOString();\n rootSpan.latency = latestEndTime - new Date(rootSpan.startTime).getTime();\n }\n });\n\n return sortedRootSpans;\n};\n"],"names":["spans"],"mappings":"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"}
@@ -2,13 +2,6 @@ const formatHierarchicalSpans = (spans, anchorSpanId) => {
2
2
  if (!spans || spans.length === 0) {
3
3
  return [];
4
4
  }
5
- const overallEndDate = spans.reduce(
6
- (latest, span) => {
7
- const endDate = span?.endedAt ? new Date(span.endedAt) : void 0;
8
- return endDate && (!latest || endDate > latest) ? endDate : latest;
9
- },
10
- null
11
- );
12
5
  const spanMap = /* @__PURE__ */ new Map();
13
6
  const rootSpans = [];
14
7
  spans.forEach((spanRecord) => {
@@ -32,12 +25,6 @@ const formatHierarchicalSpans = (spans, anchorSpanId) => {
32
25
  const uiSpan = spanMap.get(spanRecord.spanId);
33
26
  if (!uiSpan) return;
34
27
  if (isAnchor(spanRecord)) {
35
- if (overallEndDate && uiSpan.endTime && overallEndDate > new Date(uiSpan.endTime)) {
36
- uiSpan.endTime = overallEndDate.toISOString();
37
- const overallEndTime = new Date(overallEndDate).getTime();
38
- const spanStartTime = new Date(uiSpan.startTime).getTime();
39
- uiSpan.latency = overallEndTime - spanStartTime;
40
- }
41
28
  rootSpans.push(uiSpan);
42
29
  } else {
43
30
  const parent = spanRecord.parentSpanId ? spanMap.get(spanRecord.parentSpanId) : void 0;
@@ -62,6 +49,18 @@ const formatHierarchicalSpans = (spans, anchorSpanId) => {
62
49
  });
63
50
  };
64
51
  sortNestedSpans(sortedRootSpans);
52
+ const getLatestEndTime = (span) => (span.spans ?? []).reduce(
53
+ (latest, child) => Math.max(latest, getLatestEndTime(child)),
54
+ span.endTime ? new Date(span.endTime).getTime() : 0
55
+ );
56
+ sortedRootSpans.forEach((rootSpan) => {
57
+ if (!rootSpan.endTime) return;
58
+ const latestEndTime = getLatestEndTime(rootSpan);
59
+ if (latestEndTime > new Date(rootSpan.endTime).getTime()) {
60
+ rootSpan.endTime = new Date(latestEndTime).toISOString();
61
+ rootSpan.latency = latestEndTime - new Date(rootSpan.startTime).getTime();
62
+ }
63
+ });
65
64
  return sortedRootSpans;
66
65
  };
67
66
 
@@ -1 +1 @@
1
- {"version":3,"file":"format-hierarchical-spans.es.js","sources":["../../../../src/domains/traces/components/format-hierarchical-spans.ts"],"sourcesContent":["import type { UISpan } from '../types';\n\n/** Minimal span fields required for building the hierarchical timeline tree. */\ntype TimelineSpan = {\n spanId: string;\n name: string;\n spanType: string;\n startedAt: Date | string;\n endedAt?: Date | string | null;\n parentSpanId?: string | null;\n matchedInPayloadOnly?: boolean;\n};\n\n/**\n * When `anchorSpanId` is provided, that span is treated as the displayed root\n * regardless of its `parentSpanId` -- the branch-subtree case from `getBranch`,\n * where the anchor has a real parent that's outside the returned set. Without\n * it, the displayed roots are the spans with no parent (the trace case).\n */\nexport const formatHierarchicalSpans = (spans: TimelineSpan[], anchorSpanId?: string): UISpan[] => {\n if (!spans || spans.length === 0) {\n return [];\n }\n\n const overallEndDate = spans.reduce(\n (latest, span) => {\n const endDate = span?.endedAt ? new Date(span.endedAt) : undefined;\n return endDate && (!latest || endDate > latest) ? endDate : latest;\n },\n null as Date | null,\n );\n\n const spanMap = new Map<string, UISpan>();\n const rootSpans: UISpan[] = [];\n\n spans.forEach(spanRecord => {\n const startDate = new Date(spanRecord.startedAt);\n const endDate = spanRecord.endedAt ? new Date(spanRecord.endedAt) : undefined;\n\n const uiSpan: UISpan = {\n id: spanRecord.spanId,\n name: spanRecord.name,\n type: spanRecord.spanType,\n latency: endDate ? endDate.getTime() - startDate.getTime() : 0,\n startTime: startDate.toISOString(),\n endTime: endDate ? endDate.toISOString() : undefined,\n spans: [],\n parentSpanId: spanRecord.parentSpanId,\n matchedInPayloadOnly: spanRecord.matchedInPayloadOnly,\n };\n\n spanMap.set(spanRecord.spanId, uiSpan);\n });\n\n const isAnchor = (spanRecord: TimelineSpan) =>\n anchorSpanId ? spanRecord.spanId === anchorSpanId : spanRecord?.parentSpanId == null;\n\n spans.forEach(spanRecord => {\n const uiSpan = spanMap.get(spanRecord.spanId);\n if (!uiSpan) return;\n\n if (isAnchor(spanRecord)) {\n if (overallEndDate && uiSpan.endTime && overallEndDate > new Date(uiSpan.endTime)) {\n uiSpan.endTime = overallEndDate.toISOString();\n const overallEndTime = new Date(overallEndDate).getTime();\n const spanStartTime = new Date(uiSpan.startTime).getTime();\n uiSpan.latency = overallEndTime - spanStartTime;\n }\n rootSpans.push(uiSpan);\n } else {\n const parent = spanRecord.parentSpanId ? spanMap.get(spanRecord.parentSpanId) : undefined;\n if (parent) {\n parent.spans ??= [];\n parent.spans.push(uiSpan);\n } else {\n // Orphan: either the parent isn't in the supplied set (branch subtree boundary), or\n // the span has no parent yet wasn't picked as the anchor (rare when `anchorSpanId`\n // is specified). Surface it at the displayed root rather than dropping it.\n rootSpans.push(uiSpan);\n }\n }\n });\n\n const sortSpansByStartTime = (spans: UISpan[]): UISpan[] => {\n return spans.sort((a, b) => new Date(a.startTime).getTime() - new Date(b.startTime).getTime());\n };\n\n const sortedRootSpans = sortSpansByStartTime(rootSpans);\n\n const sortNestedSpans = (spans: UISpan[]): void => {\n spans.forEach(span => {\n if (span.spans && span.spans.length > 0) {\n span.spans = sortSpansByStartTime(span.spans);\n sortNestedSpans(span.spans);\n }\n });\n };\n\n sortNestedSpans(sortedRootSpans);\n\n return sortedRootSpans;\n};\n"],"names":["spans"],"mappings":"AAmBO,MAAM,uBAAA,GAA0B,CAAC,KAAA,EAAuB,YAAA,KAAoC;AACjG,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAChC,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,iBAAiB,KAAA,CAAM,MAAA;AAAA,IAC3B,CAAC,QAAQ,IAAA,KAAS;AAChB,MAAA,MAAM,UAAU,IAAA,EAAM,OAAA,GAAU,IAAI,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,GAAI,MAAA;AACzD,MAAA,OAAO,OAAA,KAAY,CAAC,MAAA,IAAU,OAAA,GAAU,UAAU,OAAA,GAAU,MAAA;AAAA,IAC9D,CAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAoB;AACxC,EAAA,MAAM,YAAsB,EAAC;AAE7B,EAAA,KAAA,CAAM,QAAQ,CAAA,UAAA,KAAc;AAC1B,IAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA;AAC/C,IAAA,MAAM,UAAU,UAAA,CAAW,OAAA,GAAU,IAAI,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,GAAI,MAAA;AAEpE,IAAA,MAAM,MAAA,GAAiB;AAAA,MACrB,IAAI,UAAA,CAAW,MAAA;AAAA,MACf,MAAM,UAAA,CAAW,IAAA;AAAA,MACjB,MAAM,UAAA,CAAW,QAAA;AAAA,MACjB,SAAS,OAAA,GAAU,OAAA,CAAQ,SAAQ,GAAI,SAAA,CAAU,SAAQ,GAAI,CAAA;AAAA,MAC7D,SAAA,EAAW,UAAU,WAAA,EAAY;AAAA,MACjC,OAAA,EAAS,OAAA,GAAU,OAAA,CAAQ,WAAA,EAAY,GAAI,MAAA;AAAA,MAC3C,OAAO,EAAC;AAAA,MACR,cAAc,UAAA,CAAW,YAAA;AAAA,MACzB,sBAAsB,UAAA,CAAW;AAAA,KACnC;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,UAAA,CAAW,MAAA,EAAQ,MAAM,CAAA;AAAA,EACvC,CAAC,CAAA;AAED,EAAA,MAAM,QAAA,GAAW,CAAC,UAAA,KAChB,YAAA,GAAe,WAAW,MAAA,KAAW,YAAA,GAAe,YAAY,YAAA,IAAgB,IAAA;AAElF,EAAA,KAAA,CAAM,QAAQ,CAAA,UAAA,KAAc;AAC1B,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA;AAC5C,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,IAAI,QAAA,CAAS,UAAU,CAAA,EAAG;AACxB,MAAA,IAAI,cAAA,IAAkB,OAAO,OAAA,IAAW,cAAA,GAAiB,IAAI,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,EAAG;AACjF,QAAA,MAAA,CAAO,OAAA,GAAU,eAAe,WAAA,EAAY;AAC5C,QAAA,MAAM,cAAA,GAAiB,IAAI,IAAA,CAAK,cAAc,EAAE,OAAA,EAAQ;AACxD,QAAA,MAAM,gBAAgB,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,EAAE,OAAA,EAAQ;AACzD,QAAA,MAAA,CAAO,UAAU,cAAA,GAAiB,aAAA;AAAA,MACpC;AACA,MAAA,SAAA,CAAU,KAAK,MAAM,CAAA;AAAA,IACvB,CAAA,MAAO;AACL,MAAA,MAAM,SAAS,UAAA,CAAW,YAAA,GAAe,QAAQ,GAAA,CAAI,UAAA,CAAW,YAAY,CAAA,GAAI,MAAA;AAChF,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,UAAU,EAAC;AAClB,QAAA,MAAA,CAAO,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,MAC1B,CAAA,MAAO;AAIL,QAAA,SAAA,CAAU,KAAK,MAAM,CAAA;AAAA,MACvB;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,oBAAA,GAAuB,CAACA,MAAAA,KAA8B;AAC1D,IAAA,OAAOA,OAAM,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,IAAI,KAAK,CAAA,CAAE,SAAS,CAAA,CAAE,OAAA,KAAY,IAAI,IAAA,CAAK,EAAE,SAAS,CAAA,CAAE,SAAS,CAAA;AAAA,EAC/F,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,qBAAqB,SAAS,CAAA;AAEtD,EAAA,MAAM,eAAA,GAAkB,CAACA,MAAAA,KAA0B;AACjD,IAAAA,MAAAA,CAAM,QAAQ,CAAA,IAAA,KAAQ;AACpB,MAAA,IAAI,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,EAAG;AACvC,QAAA,IAAA,CAAK,KAAA,GAAQ,oBAAA,CAAqB,IAAA,CAAK,KAAK,CAAA;AAC5C,QAAA,eAAA,CAAgB,KAAK,KAAK,CAAA;AAAA,MAC5B;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,eAAA,CAAgB,eAAe,CAAA;AAE/B,EAAA,OAAO,eAAA;AACT;;;;"}
1
+ {"version":3,"file":"format-hierarchical-spans.es.js","sources":["../../../../src/domains/traces/components/format-hierarchical-spans.ts"],"sourcesContent":["import type { UISpan } from '../types';\n\n/** Minimal span fields required for building the hierarchical timeline tree. */\ntype TimelineSpan = {\n spanId: string;\n name: string;\n spanType: string;\n startedAt: Date | string;\n endedAt?: Date | string | null;\n parentSpanId?: string | null;\n matchedInPayloadOnly?: boolean;\n};\n\n/**\n * When `anchorSpanId` is provided, that span is treated as the displayed root\n * regardless of its `parentSpanId` -- the branch-subtree case from `getBranch`,\n * where the anchor has a real parent that's outside the returned set. Without\n * it, the displayed roots are the spans with no parent (the trace case).\n */\nexport const formatHierarchicalSpans = (spans: TimelineSpan[], anchorSpanId?: string): UISpan[] => {\n if (!spans || spans.length === 0) {\n return [];\n }\n\n const spanMap = new Map<string, UISpan>();\n const rootSpans: UISpan[] = [];\n\n spans.forEach(spanRecord => {\n const startDate = new Date(spanRecord.startedAt);\n const endDate = spanRecord.endedAt ? new Date(spanRecord.endedAt) : undefined;\n\n const uiSpan: UISpan = {\n id: spanRecord.spanId,\n name: spanRecord.name,\n type: spanRecord.spanType,\n latency: endDate ? endDate.getTime() - startDate.getTime() : 0,\n startTime: startDate.toISOString(),\n endTime: endDate ? endDate.toISOString() : undefined,\n spans: [],\n parentSpanId: spanRecord.parentSpanId,\n matchedInPayloadOnly: spanRecord.matchedInPayloadOnly,\n };\n\n spanMap.set(spanRecord.spanId, uiSpan);\n });\n\n const isAnchor = (spanRecord: TimelineSpan) =>\n anchorSpanId ? spanRecord.spanId === anchorSpanId : spanRecord?.parentSpanId == null;\n\n spans.forEach(spanRecord => {\n const uiSpan = spanMap.get(spanRecord.spanId);\n if (!uiSpan) return;\n\n if (isAnchor(spanRecord)) {\n rootSpans.push(uiSpan);\n } else {\n const parent = spanRecord.parentSpanId ? spanMap.get(spanRecord.parentSpanId) : undefined;\n if (parent) {\n parent.spans ??= [];\n parent.spans.push(uiSpan);\n } else {\n // Orphan: either the parent isn't in the supplied set (branch subtree boundary), or\n // the span has no parent yet wasn't picked as the anchor (rare when `anchorSpanId`\n // is specified). Surface it at the displayed root rather than dropping it.\n rootSpans.push(uiSpan);\n }\n }\n });\n\n const sortSpansByStartTime = (spans: UISpan[]): UISpan[] => {\n return spans.sort((a, b) => new Date(a.startTime).getTime() - new Date(b.startTime).getTime());\n };\n\n const sortedRootSpans = sortSpansByStartTime(rootSpans);\n\n const sortNestedSpans = (spans: UISpan[]): void => {\n spans.forEach(span => {\n if (span.spans && span.spans.length > 0) {\n span.spans = sortSpansByStartTime(span.spans);\n sortNestedSpans(span.spans);\n }\n });\n };\n\n sortNestedSpans(sortedRootSpans);\n\n const getLatestEndTime = (span: UISpan): number =>\n (span.spans ?? []).reduce(\n (latest, child) => Math.max(latest, getLatestEndTime(child)),\n span.endTime ? new Date(span.endTime).getTime() : 0,\n );\n\n // A root recorded as ending before one of its descendants is widened to cover its own subtree only.\n sortedRootSpans.forEach(rootSpan => {\n if (!rootSpan.endTime) return;\n const latestEndTime = getLatestEndTime(rootSpan);\n if (latestEndTime > new Date(rootSpan.endTime).getTime()) {\n rootSpan.endTime = new Date(latestEndTime).toISOString();\n rootSpan.latency = latestEndTime - new Date(rootSpan.startTime).getTime();\n }\n });\n\n return sortedRootSpans;\n};\n"],"names":["spans"],"mappings":"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"}
@@ -5,10 +5,11 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
5
5
  const jsxRuntime = require('react/jsx-runtime');
6
6
  const React = require('react');
7
7
  const domains_traces_hooks_getAllSpanIds = require('../hooks/get-all-span-ids.cjs.js');
8
+ const domains_traces_utils_spanTiming = require('../utils/span-timing.cjs.js');
8
9
  const domains_traces_components_shared = require('./shared.cjs.js');
9
10
 
10
11
  function SpanRows({ spans, ...rowProps }) {
11
- const overallLatency = spans[0]?.latency || 0;
12
+ const overallLatency = domains_traces_utils_spanTiming.getOverallLatency(spans);
12
13
  const overallStartTime = spans[0]?.startTime || "";
13
14
  return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: spans.map((span, idx) => /* @__PURE__ */ jsxRuntime.jsx(
14
15
  SpanRow,