@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.
- package/README.md +10 -2
- package/components.css +340 -0
- package/dist/code-DJReJPSX.cjs.map +1 -1
- package/dist/code-DLuATvYu.js.map +1 -1
- package/dist/components/Breadcrumb.cjs.js +4 -2
- package/dist/components/Breadcrumb.cjs.js.map +1 -1
- package/dist/components/Breadcrumb.es.js +5 -3
- package/dist/components/Breadcrumb.es.js.map +1 -1
- package/dist/components/ChatShell.cjs.js +2 -2
- package/dist/components/ChatShell.cjs.js.map +1 -1
- package/dist/components/ChatShell.es.js +2 -2
- package/dist/components/ChatShell.es.js.map +1 -1
- package/dist/components/Composer.cjs.js +1 -1
- package/dist/components/Composer.cjs.js.map +1 -1
- package/dist/components/Composer.es.js +1 -1
- package/dist/components/Composer.es.js.map +1 -1
- package/dist/components/DataList.cjs.js +5 -5
- package/dist/components/DataList.es.js +5 -5
- package/dist/components/EnvironmentVariablesEditor.cjs.js +1 -1
- package/dist/components/EnvironmentVariablesEditor.es.js +1 -1
- package/dist/components/LogsDataList.cjs.js +2 -2
- package/dist/components/LogsDataList.es.js +2 -2
- package/dist/components/MessageScroller.cjs.js +1 -1
- package/dist/components/MessageScroller.es.js +1 -1
- package/dist/components/SavedViews.cjs.js +0 -1
- package/dist/components/SavedViews.cjs.js.map +1 -1
- package/dist/components/SavedViews.es.js +0 -1
- package/dist/components/SavedViews.es.js.map +1 -1
- package/dist/components/fluid-hover-highlight.cjs.js +7 -1
- package/dist/components/fluid-hover-highlight.cjs.js.map +1 -1
- package/dist/components/fluid-hover-highlight.es.js +7 -1
- package/dist/components/fluid-hover-highlight.es.js.map +1 -1
- package/dist/{data-list-DUfXIhyC.cjs → data-list-CmjTe8xE.cjs} +3 -3
- package/dist/{data-list-DUfXIhyC.cjs.map → data-list-CmjTe8xE.cjs.map} +1 -1
- package/dist/{data-list-DXQY_iQW.js → data-list-DT1LVR29.js} +3 -3
- package/dist/{data-list-DXQY_iQW.js.map → data-list-DT1LVR29.js.map} +1 -1
- package/dist/{data-list-skeleton-B_SXAeE0.js → data-list-skeleton-bNfITSHs.js} +2 -2
- package/dist/{data-list-skeleton-B_SXAeE0.js.map → data-list-skeleton-bNfITSHs.js.map} +1 -1
- package/dist/{data-list-skeleton-BqC9Gggi.cjs → data-list-skeleton-sdcaabdX.cjs} +2 -2
- package/dist/{data-list-skeleton-BqC9Gggi.cjs.map → data-list-skeleton-sdcaabdX.cjs.map} +1 -1
- package/dist/{data-list-spacer-tQaBaum4.cjs → data-list-spacer-CdlT6bDd.cjs} +2 -2
- package/dist/{data-list-spacer-tQaBaum4.cjs.map → data-list-spacer-CdlT6bDd.cjs.map} +1 -1
- package/dist/{data-list-spacer-ByA4ce2a.js → data-list-spacer-D--gDmOm.js} +2 -2
- package/dist/{data-list-spacer-ByA4ce2a.js.map → data-list-spacer-D--gDmOm.js.map} +1 -1
- package/dist/{data-list-top-ByT2Mo77.cjs → data-list-top-DJh08vFA.cjs} +2 -9
- package/dist/data-list-top-DJh08vFA.cjs.map +1 -0
- package/dist/{data-list-top-DSr_ocKA.js → data-list-top-T-mtdIUp.js} +2 -9
- package/dist/data-list-top-T-mtdIUp.js.map +1 -0
- package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js +104 -92
- package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js.map +1 -1
- package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js +105 -93
- package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js.map +1 -1
- package/dist/domains/logs/components/logs-list-view.cjs.js +2 -2
- package/dist/domains/logs/components/logs-list-view.es.js +2 -2
- package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.cjs.js +3 -3
- package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.es.js +3 -3
- package/dist/domains/observability/components/trace-as-item-dialog.cjs.js +6 -10
- package/dist/domains/observability/components/trace-as-item-dialog.cjs.js.map +1 -1
- package/dist/domains/observability/components/trace-as-item-dialog.es.js +7 -11
- package/dist/domains/observability/components/trace-as-item-dialog.es.js.map +1 -1
- package/dist/domains/scores/components/score-as-item-dialog.cjs.js +3 -9
- package/dist/domains/scores/components/score-as-item-dialog.cjs.js.map +1 -1
- package/dist/domains/scores/components/score-as-item-dialog.es.js +4 -10
- package/dist/domains/scores/components/score-as-item-dialog.es.js.map +1 -1
- package/dist/domains/scores/components/score-data-panel.cjs.js +9 -1
- package/dist/domains/scores/components/score-data-panel.cjs.js.map +1 -1
- package/dist/domains/scores/components/score-data-panel.es.js +9 -1
- package/dist/domains/scores/components/score-data-panel.es.js.map +1 -1
- package/dist/domains/scores/components/trace-scores-tab.cjs.js +1 -1
- package/dist/domains/scores/components/trace-scores-tab.es.js +1 -1
- package/dist/domains/traces/components/format-hierarchical-spans.cjs.js +12 -13
- package/dist/domains/traces/components/format-hierarchical-spans.cjs.js.map +1 -1
- package/dist/domains/traces/components/format-hierarchical-spans.es.js +12 -13
- package/dist/domains/traces/components/format-hierarchical-spans.es.js.map +1 -1
- package/dist/domains/traces/components/span-rows.cjs.js +2 -1
- package/dist/domains/traces/components/span-rows.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-rows.es.js +2 -1
- package/dist/domains/traces/components/span-rows.es.js.map +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-list.cjs.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-list.es.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-root.cjs.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-root.es.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-row.cjs.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-row.es.js +1 -1
- package/dist/domains/traces/components/trace-span-timeline.cjs.js +2 -1
- package/dist/domains/traces/components/trace-span-timeline.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-span-timeline.es.js +2 -1
- package/dist/domains/traces/components/trace-span-timeline.es.js.map +1 -1
- package/dist/domains/traces/components/traces-list-view.cjs.js +4 -4
- package/dist/domains/traces/components/traces-list-view.es.js +4 -4
- package/dist/domains/traces/components/traces-page-skeleton.cjs.js +1 -1
- package/dist/domains/traces/components/traces-page-skeleton.es.js +1 -1
- package/dist/domains/traces/utils/span-timing.cjs.js +10 -0
- package/dist/domains/traces/utils/span-timing.cjs.js.map +1 -1
- package/dist/domains/traces/utils/span-timing.es.js +10 -1
- package/dist/domains/traces/utils/span-timing.es.js.map +1 -1
- package/dist/domains/workflows/components/workflows-list/workflows-list.cjs.js +2 -2
- package/dist/domains/workflows/components/workflows-list/workflows-list.es.js +2 -2
- package/dist/ee/signals/components/entity-index-list.cjs.js +1 -1
- package/dist/ee/signals/components/entity-index-list.es.js +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +1 -1
- package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +1 -1
- package/dist/ee/topics/components/topic-trace-summary-list.es.js +1 -1
- package/dist/hooks/use-fluid-hover.cjs.js +3 -2
- package/dist/hooks/use-fluid-hover.cjs.js.map +1 -1
- package/dist/hooks/use-fluid-hover.es.js +3 -2
- package/dist/hooks/use-fluid-hover.es.js.map +1 -1
- package/dist/layout/tabbed-container.cjs.js +1 -1
- package/dist/layout/tabbed-container.es.js +1 -1
- package/dist/{logs-data-list-CoER2Hst.js → logs-data-list-Cb85LPcT.js} +3 -3
- package/dist/{logs-data-list-CoER2Hst.js.map → logs-data-list-Cb85LPcT.js.map} +1 -1
- package/dist/{logs-data-list-DRR6cMgl.cjs → logs-data-list-DlQxxrNw.cjs} +3 -3
- package/dist/{logs-data-list-DRR6cMgl.cjs.map → logs-data-list-DlQxxrNw.cjs.map} +1 -1
- package/dist/{message-scroller-CS1KxKn6.js → message-scroller-C6gXU5d5.js} +2 -2
- package/dist/{message-scroller-CS1KxKn6.js.map → message-scroller-C6gXU5d5.js.map} +1 -1
- package/dist/{message-scroller-C4fH6uJg.cjs → message-scroller-fjucuCuw.cjs} +2 -2
- package/dist/{message-scroller-C4fH6uJg.cjs.map → message-scroller-fjucuCuw.cjs.map} +1 -1
- package/dist/primitives/raised-surface.cjs.js.map +1 -1
- package/dist/primitives/raised-surface.es.js.map +1 -1
- package/dist/scroll-area-CAY0DNQj.cjs.map +1 -1
- package/dist/scroll-area-MaMqo4l8.js.map +1 -1
- package/dist/src/domains/datasets/components/index.d.ts +1 -1
- package/dist/src/domains/datasets/components/save-as-dataset-item-dialog.d.ts +14 -3
- package/dist/src/domains/observability/components/trace-as-item-dialog.d.ts +5 -3
- package/dist/src/domains/scores/components/score-as-item-dialog.d.ts +3 -3
- package/dist/src/domains/traces/utils/span-timing.d.ts +2 -0
- package/dist/src/ds/components/Breadcrumb/Breadcrumb.d.ts +2 -2
- package/dist/src/ds/components/ChatShell/chat-shell.d.ts +3 -2
- package/dist/src/ds/components/Code/code.d.ts +1 -1
- package/dist/src/ds/components/ScrollArea/scroll-area.d.ts +4 -0
- package/dist/src/ds/primitives/raised-surface.d.ts +1 -1
- package/dist/src/hooks/use-fluid-hover.d.ts +1 -0
- package/dist/style.css +32 -31
- package/dist/toast.css +1 -1
- package/dist/tokens.cjs.js.map +1 -1
- package/dist/tokens.es.js.map +1 -1
- package/dist/{traces-data-list-BgjeB-BF.cjs → traces-data-list-Bhhg9drs.cjs} +4 -4
- package/dist/{traces-data-list-BgjeB-BF.cjs.map → traces-data-list-Bhhg9drs.cjs.map} +1 -1
- package/dist/{traces-data-list-Zoai0OW_.js → traces-data-list-DMWPJFBc.js} +4 -4
- package/dist/{traces-data-list-Zoai0OW_.js.map → traces-data-list-DMWPJFBc.js.map} +1 -1
- package/dist/use-text-highlight.css +4 -4
- package/package.json +15 -11
- package/sources.css +1 -0
- package/theme/code.css +17 -0
- package/theme/surfaces.css +2 -2
- package/theme.css +2 -0
- package/dist/data-list-top-ByT2Mo77.cjs.map +0 -1
- package/dist/data-list-top-DSr_ocKA.js.map +0 -1
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
import { jsx
|
|
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
|
-
|
|
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:
|
|
69
|
-
/* @__PURE__ */ jsx(EyeIcon, {}),
|
|
70
|
-
" ",
|
|
71
|
-
getShortId(traceId)
|
|
72
|
-
] }),
|
|
67
|
+
breadcrumb: getShortId(traceId),
|
|
73
68
|
isOpen,
|
|
74
69
|
onClose,
|
|
75
|
-
|
|
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 {
|
|
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,
|
|
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:
|
|
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
|
-
|
|
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 {
|
|
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
|
|
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,
|
|
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:
|
|
24
|
-
/* @__PURE__ */ jsx(CalculatorIcon, {}),
|
|
25
|
-
" ",
|
|
26
|
-
getShortId(score?.id)
|
|
27
|
-
] }),
|
|
21
|
+
breadcrumb: getShortId(score?.id),
|
|
28
22
|
isOpen,
|
|
29
23
|
onClose,
|
|
30
|
-
|
|
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 {
|
|
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(
|
|
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":"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"}
|
|
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(
|
|
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":";;;;;;;;;;;;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,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,GAAA,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,yBACC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,MAAA,UAAA;AAAA,sBACI,IAAA,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,GAAI,gBAAA,EAAiB;AACzC,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,SAAS,KAAK,CAAA;AAChE,EAAA,MAAM,WAAA,GAAc,kBAAkB,KAAK,CAAA;AAC3C,EAAA,MAAM,MAAA,GAAS,cAAc,8CAAA,GAAiD,2BAAA;AAE9E,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,SAAA,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,mCACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,SAAA,CAAU,QAAV,EACC,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,SAAA,CAAU,SAAV,EAAkB,QAAA,EAAA;AAAA,UAAA,OAAA;AAAA,8BAEhB,SAAA,CAAU,MAAA,EAAV,EAAiB,EAAA,EAAI,MAAM,EAAA,EAAI;AAAA,SAAA,EAClC,CAAA;AAAA,wBACA,IAAA,CAAC,SAAA,CAAU,aAAA,EAAV,EACG,QAAA,EAAA;AAAA,UAAA,CAAA,UAAA,IAAc,MAAA,qBACd,GAAA;AAAA,YAAC,SAAA,CAAU,WAAA;AAAA,YAAV;AAAA,cACC,UAAA;AAAA,cACA,MAAA;AAAA,cACA,aAAA,EAAc,sBAAA;AAAA,cACd,SAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BAEF,GAAA,CAAC,SAAA,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,sBAEA,IAAA,CAAC,SAAA,CAAU,OAAA,EAAV,EACC,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,iBAAA,EAAA,EACE,QAAA,EAAA;AAAA,UAAA,KAAA,CAAM,MAAA,EAAQ,IAAA,IAAQ,IAAA,oBACrB,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,iBAAA,CAAkB,GAAA,EAAlB,EAAsB,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,4BAC7B,GAAA,CAAC,kBAAkB,KAAA,EAAlB,EAAyB,iBAAO,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA,EAAE;AAAA,WAAA,EACtD,CAAA;AAAA,UAED,KAAA,CAAM,6BACL,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,iBAAA,CAAkB,GAAA,EAAlB,EAAsB,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,gCAC7B,iBAAA,CAAkB,KAAA,EAAlB,EAAyB,QAAA,EAAA,sBAAA,CAAuB,KAAA,CAAM,SAAS,CAAA,EAAE;AAAA,WAAA,EACpE,CAAA;AAAA,UAED,KAAA,CAAM,2BACL,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,iBAAA,CAAkB,GAAA,EAAlB,EAAsB,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,YAC9B,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,OAAO,CAAA,uBAC3B,iBAAA,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,mBAEA,GAAA,CAAC,iBAAA,CAAkB,KAAA,EAAlB,EAAyB,QAAA,EAAA,KAAA,CAAM,OAAA,EAAQ;AAAA,WAAA,EAE5C,CAAA;AAAA,UAED,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,OAAA,oBACrB,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,iBAAA,CAAkB,GAAA,EAAlB,EAAsB,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,YAC7B,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,MAAM,CAAA,mBAC1C,GAAA,CAAC,iBAAA,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,mBAEA,GAAA,CAAC,iBAAA,CAAkB,KAAA,EAAlB,EAAyB,gBAAM,MAAA,EAAO;AAAA,WAAA,EAE3C;AAAA,SAAA,EAEJ,CAAA;AAAA,4BAEC,KAAA,EAAA,EAAI,SAAA,EAAU,yBACb,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,MAAK,IAAA,EAAK,OAAA,EAAS,MAAM,oBAAA,CAAqB,IAAI,CAAA,EAAG,IAAA,sBAAO,QAAA,EAAA,EAAS,CAAA,EAAI,kCAEjF,CAAA,EACF,CAAA;AAAA,wBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,0BAAA,IAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,kBAAA;AAAA,gBACA,2BAAA;AAAA,gBACA;AAAA,eACF;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,SAAA,EAAA,EAAU,CAAA;AAAA,oCACV,GAAA,EAAA,EAAI,EAAA,EAAG,MAAA,EAAO,OAAA,EAAQ,QAAO,QAAA,EAAA,QAAA,EAE9B,CAAA;AAAA,gCACA,GAAA;AAAA,kBAAC,GAAA;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,0BACA,GAAA,CAAC,GAAA,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,wBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,SAAA,CAAU,WAAA;AAAA,YAAV;AAAA,cACC,KAAA,EAAM,OAAA;AAAA,cACN,aAAa,gBAAA,CAAiB,OAAA,kBAAS,GAAA,CAAC,aAAA,EAAA,EAAc,GAAI,KAAK,CAAA;AAAA,cAC/D,IAAA,sBAAO,aAAA,EAAA,EAAc,CAAA;AAAA,cACrB,SAAS,IAAA,CAAK,SAAA,CAAU,MAAM,KAAA,IAAS,IAAA,EAAM,MAAM,CAAC;AAAA;AAAA,WACtD;AAAA,0BACA,GAAA;AAAA,YAAC,SAAA,CAAU,WAAA;AAAA,YAAV;AAAA,cACC,KAAA,EAAM,QAAA;AAAA,cACN,aAAa,gBAAA,CAAiB,QAAA,kBAAU,GAAA,CAAC,cAAA,EAAA,EAAe,GAAI,KAAK,CAAA;AAAA,cACjE,IAAA,sBAAO,cAAA,EAAA,EAAe,CAAA;AAAA,cACtB,SAAS,IAAA,CAAK,SAAA,CAAU,MAAM,MAAA,IAAU,IAAA,EAAM,MAAM,CAAC;AAAA;AAAA,WACvD;AAAA,0BACA,GAAA;AAAA,YAAC,SAAA,CAAU,WAAA;AAAA,YAAV;AAAA,cACC,KAAA,EAAM,mBAAA;AAAA,cACN,aAAa,gBAAA,CAAiB,mBAAA,kBAAqB,GAAA,CAAC,WAAA,EAAA,EAAY,GAAI,KAAK,CAAA;AAAA,cACzE,IAAA,sBAAO,WAAA,EAAA,EAAY,CAAA;AAAA,cACnB,OAAA,EAAS,MAAM,gBAAA,IAAoB,MAAA;AAAA,cACnC,UAAA,EAAY;AAAA;AAAA,WACd;AAAA,0BACA,GAAA;AAAA,YAAC,SAAA,CAAU,WAAA;AAAA,YAAV;AAAA,cACC,KAAA,EAAM,gBAAA;AAAA,cACN,aAAa,gBAAA,CAAiB,gBAAA,kBAAkB,GAAA,CAAC,WAAA,EAAA,EAAY,GAAI,KAAK,CAAA;AAAA,cACtE,IAAA,sBAAO,WAAA,EAAA,EAAY,CAAA;AAAA,cACnB,OAAA,EAAS,MAAM,aAAA,IAAiB,MAAA;AAAA,cAChC,UAAA,EAAY;AAAA;AAAA,WACd;AAAA,0BACA,GAAA;AAAA,YAAC,SAAA,CAAU,WAAA;AAAA,YAAV;AAAA,cACC,KAAA,EAAM,uBAAA;AAAA,cACN,aAAa,gBAAA,CAAiB,uBAAA,kBAAyB,GAAA,CAAC,WAAA,EAAA,EAAY,GAAI,KAAK,CAAA;AAAA,cAC7E,IAAA,sBAAO,WAAA,EAAA,EAAY,CAAA;AAAA,cACnB,OAAA,EAAS,MAAM,mBAAA,IAAuB,MAAA;AAAA,cACtC,UAAA,EAAY;AAAA;AAAA,WACd;AAAA,0BACA,GAAA;AAAA,YAAC,SAAA,CAAU,WAAA;AAAA,YAAV;AAAA,cACC,KAAA,EAAM,wBAAA;AAAA,cACN,aAAa,gBAAA,CAAiB,wBAAA,kBAA0B,GAAA,CAAC,WAAA,EAAA,EAAY,GAAI,KAAK,CAAA;AAAA,cAC9E,IAAA,sBAAO,WAAA,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,oBACC,GAAA,CAAC,iBAAA,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.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-
|
|
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-
|
|
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
|
|
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
|
|
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
|
|
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,
|