@mastra/playground-ui 64.0.0 → 65.0.0-alpha.1
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/domains/chat/tools/badges/workflow-badge.cjs.js +2 -0
- package/dist/domains/chat/tools/badges/workflow-badge.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/workflow-badge.es.js +2 -0
- package/dist/domains/chat/tools/badges/workflow-badge.es.js.map +1 -1
- 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/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/traces/components/thread-view-by-trace.cjs.js +1 -0
- package/dist/domains/traces/components/thread-view-by-trace.cjs.js.map +1 -1
- package/dist/domains/traces/components/thread-view-by-trace.es.js +1 -0
- package/dist/domains/traces/components/thread-view-by-trace.es.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel.cjs.js +1 -0
- package/dist/domains/traces/components/trace-data-panel.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel.es.js +1 -0
- package/dist/domains/traces/components/trace-data-panel.es.js.map +1 -1
- package/dist/domains/workflows/workflow/workflow-input-data.cjs.js +1 -0
- package/dist/domains/workflows/workflow/workflow-input-data.cjs.js.map +1 -1
- package/dist/domains/workflows/workflow/workflow-input-data.es.js +1 -0
- package/dist/domains/workflows/workflow/workflow-input-data.es.js.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/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/ds/components/Breadcrumb/Breadcrumb.d.ts +2 -2
- package/dist/src/ds/components/Code/code.d.ts +1 -1
- package/dist/src/ds/primitives/raised-surface.d.ts +1 -1
- package/dist/style.css +22 -19
- package/dist/toast.css +1 -1
- package/dist/tokens.cjs.js.map +1 -1
- package/dist/tokens.es.js.map +1 -1
- package/dist/use-text-highlight.css +4 -4
- package/package.json +16 -12
- package/sources.css +1 -0
- package/theme/code.css +17 -0
- package/theme/surfaces.css +2 -2
- package/theme.css +2 -0
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { useDatasets, useDatasetMutations } from '@mastra/react/hooks/datasets';
|
|
3
|
-
import {
|
|
3
|
+
import { X, Check } from 'lucide-react';
|
|
4
4
|
import { useState, useRef, useEffect } from 'react';
|
|
5
5
|
import { B as Button } from '../../../Button-EGoajBQY.js';
|
|
6
6
|
import { C as CodeEditor } from '../../../code-editor-BDxYMkGm.js';
|
|
7
|
+
import { D as DataPanel } from '../../../data-panel-CMkR6Avv.js';
|
|
7
8
|
import { F as Field, e as FieldLabel } from '../../../field-Dl1zeXTv.js';
|
|
8
9
|
import '../../../field-control-aria-DB6y41tQ.js';
|
|
9
10
|
import { F as Form } from '../../../form-CMfC7JKB.js';
|
|
10
11
|
import { S as Select, d as SelectTrigger, e as SelectValue, a as SelectContent, c as SelectItem } from '../../../select-CQtsggxJ.js';
|
|
11
|
-
import { S as SideDialog } from '../../../side-dialog-bm8NPDXy.js';
|
|
12
|
-
import { T as TextAndIcon } from '../../../text-and-icon-CRYBkgtj.js';
|
|
13
12
|
import { T as Txt } from '../../../Txt-BtIGLRk1.js';
|
|
14
13
|
import { useLinkComponent } from '../../../lib/framework.es.js';
|
|
15
14
|
import { t as toast } from '../../../toast-5aQbZBbY.js';
|
|
16
15
|
|
|
16
|
+
const CREATE_DATASET_VALUE = "__create-dataset__";
|
|
17
17
|
function SaveAsDatasetItemDialog({
|
|
18
18
|
initialInput,
|
|
19
19
|
initialGroundTruth,
|
|
@@ -23,10 +23,12 @@ function SaveAsDatasetItemDialog({
|
|
|
23
23
|
breadcrumb,
|
|
24
24
|
isOpen,
|
|
25
25
|
onClose,
|
|
26
|
-
|
|
27
|
-
source
|
|
26
|
+
depth = 2,
|
|
27
|
+
source,
|
|
28
|
+
renderCreateDatasetDialog
|
|
28
29
|
}) {
|
|
29
30
|
const [selectedDatasetId, setSelectedDatasetId] = useState("");
|
|
31
|
+
const [isCreateDatasetOpen, setIsCreateDatasetOpen] = useState(false);
|
|
30
32
|
const [input, setInput] = useState("");
|
|
31
33
|
const [groundTruth, setGroundTruth] = useState("");
|
|
32
34
|
const [expectedTrajectory, setExpectedTrajectory] = useState("");
|
|
@@ -35,6 +37,15 @@ function SaveAsDatasetItemDialog({
|
|
|
35
37
|
const { addItem } = useDatasetMutations();
|
|
36
38
|
const { navigate, paths } = useLinkComponent();
|
|
37
39
|
const datasets = data?.datasets ?? [];
|
|
40
|
+
const isSelectedDatasetListed = datasets.some((dataset) => dataset.id === selectedDatasetId);
|
|
41
|
+
const isSelectionLoading = isDatasetsLoading || !!selectedDatasetId && !isSelectedDatasetListed;
|
|
42
|
+
const handleDatasetChange = (value) => {
|
|
43
|
+
if (value === CREATE_DATASET_VALUE) {
|
|
44
|
+
setIsCreateDatasetOpen(true);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
setSelectedDatasetId(value);
|
|
48
|
+
};
|
|
38
49
|
const prevOpenRef = useRef(false);
|
|
39
50
|
const trajectorySeededRef = useRef(false);
|
|
40
51
|
const inputSeededRef = useRef(false);
|
|
@@ -163,98 +174,99 @@ function SaveAsDatasetItemDialog({
|
|
|
163
174
|
onClose();
|
|
164
175
|
};
|
|
165
176
|
return /* @__PURE__ */ jsxs(
|
|
166
|
-
|
|
177
|
+
DataPanel,
|
|
167
178
|
{
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
179
|
+
open: isOpen,
|
|
180
|
+
onClose: handleCancel,
|
|
181
|
+
title: "Save as Dataset Item",
|
|
182
|
+
description: "Save data as a dataset item",
|
|
183
|
+
depth,
|
|
173
184
|
children: [
|
|
174
|
-
/* @__PURE__ */ jsxs(
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
] })
|
|
185
|
+
/* @__PURE__ */ jsxs(DataPanel.Header, { children: [
|
|
186
|
+
/* @__PURE__ */ jsxs(DataPanel.Heading, { children: [
|
|
187
|
+
"Save as Dataset Item",
|
|
188
|
+
/* @__PURE__ */ jsx("b", { className: "whitespace-nowrap", children: breadcrumb })
|
|
189
|
+
] }),
|
|
190
|
+
/* @__PURE__ */ jsx(DataPanel.HeaderActions, { children: /* @__PURE__ */ jsx(DataPanel.CloseButton, { icon: "x", onClick: handleCancel, label: "Close save as dataset item", tooltip: "Close" }) })
|
|
181
191
|
] }),
|
|
182
|
-
/* @__PURE__ */
|
|
183
|
-
/* @__PURE__ */
|
|
184
|
-
/* @__PURE__ */ jsx(
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
/* @__PURE__ */
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
/* @__PURE__ */
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
/* @__PURE__ */
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
/* @__PURE__ */
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
/* @__PURE__ */
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
}
|
|
254
|
-
)
|
|
255
|
-
] })
|
|
192
|
+
/* @__PURE__ */ jsx(DataPanel.Content, { children: /* @__PURE__ */ jsxs(Form, { onSubmit: handleSubmit, children: [
|
|
193
|
+
/* @__PURE__ */ jsxs(Field, { children: [
|
|
194
|
+
/* @__PURE__ */ jsx(FieldLabel, { required: true, children: "Dataset" }),
|
|
195
|
+
/* @__PURE__ */ jsxs(
|
|
196
|
+
Select,
|
|
197
|
+
{
|
|
198
|
+
value: isSelectedDatasetListed ? selectedDatasetId : null,
|
|
199
|
+
onValueChange: handleDatasetChange,
|
|
200
|
+
disabled: addItem.isPending || isSelectionLoading,
|
|
201
|
+
children: [
|
|
202
|
+
/* @__PURE__ */ jsx(SelectTrigger, { children: /* @__PURE__ */ jsx(SelectValue, { placeholder: isSelectionLoading ? "Loading datasets..." : "Select a dataset" }) }),
|
|
203
|
+
/* @__PURE__ */ jsxs(SelectContent, { children: [
|
|
204
|
+
renderCreateDatasetDialog && /* @__PURE__ */ jsx(SelectItem, { value: CREATE_DATASET_VALUE, children: "Create dataset" }),
|
|
205
|
+
datasets.length === 0 ? !renderCreateDatasetDialog && /* @__PURE__ */ jsx(Txt, { as: "p", variant: "body", tone: "muted", className: "px-2 py-4 text-center", children: "No datasets available" }) : datasets.map((dataset) => /* @__PURE__ */ jsx(SelectItem, { value: dataset.id, children: dataset.name }, dataset.id))
|
|
206
|
+
] })
|
|
207
|
+
]
|
|
208
|
+
}
|
|
209
|
+
)
|
|
210
|
+
] }),
|
|
211
|
+
/* @__PURE__ */ jsxs(Field, { children: [
|
|
212
|
+
/* @__PURE__ */ jsx(FieldLabel, { required: true, children: "Input (JSON)" }),
|
|
213
|
+
/* @__PURE__ */ jsx(CodeEditor, { value: input, onChange: handleInputChange, showCopyButton: false, className: "min-h-30" })
|
|
214
|
+
] }),
|
|
215
|
+
/* @__PURE__ */ jsxs(Field, { children: [
|
|
216
|
+
/* @__PURE__ */ jsx(FieldLabel, { children: "Ground Truth (JSON, optional)" }),
|
|
217
|
+
/* @__PURE__ */ jsx(
|
|
218
|
+
CodeEditor,
|
|
219
|
+
{
|
|
220
|
+
value: groundTruth,
|
|
221
|
+
onChange: handleGroundTruthChange,
|
|
222
|
+
showCopyButton: false,
|
|
223
|
+
className: "min-h-20"
|
|
224
|
+
}
|
|
225
|
+
)
|
|
226
|
+
] }),
|
|
227
|
+
/* @__PURE__ */ jsxs(Field, { children: [
|
|
228
|
+
/* @__PURE__ */ jsx(FieldLabel, { children: "Expected Trajectory (JSON, optional)" }),
|
|
229
|
+
/* @__PURE__ */ jsx(
|
|
230
|
+
CodeEditor,
|
|
231
|
+
{
|
|
232
|
+
value: expectedTrajectory,
|
|
233
|
+
onChange: handleExpectedTrajectoryChange,
|
|
234
|
+
showCopyButton: false,
|
|
235
|
+
className: "min-h-20"
|
|
236
|
+
}
|
|
237
|
+
)
|
|
238
|
+
] }),
|
|
239
|
+
/* @__PURE__ */ jsxs(Field, { children: [
|
|
240
|
+
/* @__PURE__ */ jsx(FieldLabel, { children: "Tool Mocks (JSON, optional)" }),
|
|
241
|
+
/* @__PURE__ */ jsx(
|
|
242
|
+
CodeEditor,
|
|
243
|
+
{
|
|
244
|
+
value: toolMocks,
|
|
245
|
+
onChange: handleToolMocksChange,
|
|
246
|
+
showCopyButton: false,
|
|
247
|
+
className: "min-h-20"
|
|
248
|
+
}
|
|
249
|
+
)
|
|
250
|
+
] }),
|
|
251
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-end gap-2 pt-4", children: [
|
|
252
|
+
/* @__PURE__ */ jsx(Button, { icon: /* @__PURE__ */ jsx(X, {}), type: "button", onClick: handleCancel, children: "Cancel" }),
|
|
253
|
+
/* @__PURE__ */ jsx(
|
|
254
|
+
Button,
|
|
255
|
+
{
|
|
256
|
+
icon: /* @__PURE__ */ jsx(Check, {}),
|
|
257
|
+
type: "submit",
|
|
258
|
+
variant: "default",
|
|
259
|
+
disabled: addItem.isPending || trajectoryLoading || !isSelectedDatasetListed,
|
|
260
|
+
children: addItem.isPending ? "Saving..." : trajectoryLoading ? "Loading..." : "Save Item"
|
|
261
|
+
}
|
|
262
|
+
)
|
|
256
263
|
] })
|
|
257
|
-
] })
|
|
264
|
+
] }) }),
|
|
265
|
+
renderCreateDatasetDialog?.({
|
|
266
|
+
open: isCreateDatasetOpen,
|
|
267
|
+
onOpenChange: setIsCreateDatasetOpen,
|
|
268
|
+
onSuccess: setSelectedDatasetId
|
|
269
|
+
})
|
|
258
270
|
]
|
|
259
271
|
}
|
|
260
272
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save-as-dataset-item-dialog.es.js","sources":["../../../../src/domains/datasets/components/save-as-dataset-item-dialog.tsx"],"sourcesContent":["'use client';\n\nimport type { DatasetItemToolMock, AddDatasetItemParams } from '@mastra/client-js';\nimport { useDatasetMutations, useDatasets } from '@mastra/react/hooks/datasets';\nimport { DatabaseIcon, Check, X } from 'lucide-react';\nimport { useState, useEffect, useRef } from 'react';\nimport type { ReactNode } from 'react';\nimport { Button } from '@/ds/components/Button';\nimport { CodeEditor } from '@/ds/components/CodeEditor';\nimport { Field, FieldLabel } from '@/ds/components/Field';\nimport { Form } from '@/ds/components/Form';\nimport { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '@/ds/components/Select';\nimport { SideDialog } from '@/ds/components/SideDialog';\nimport type { SideDialogRootProps } from '@/ds/components/SideDialog';\nimport { TextAndIcon } from '@/ds/components/Text';\nimport { Txt } from '@/ds/components/Txt';\nimport { useLinkComponent } from '@/lib/framework';\nimport { toast } from '@/utils/toast';\n\nexport type SaveAsDatasetItemDialogProps = {\n initialInput: string;\n initialGroundTruth: string;\n /** JSON string of the expected trajectory */\n initialTrajectory?: string;\n /** Whether the trajectory is still being fetched */\n trajectoryLoading?: boolean;\n /** JSON string of the tool mocks (array of { toolName, args, output }) */\n initialToolMocks?: string;\n breadcrumb: ReactNode;\n isOpen: boolean;\n onClose: () => void;\n level?: SideDialogRootProps['level'];\n source?: {\n type: 'csv' | 'json' | 'trace' | 'llm' | 'experiment-result' | 'candidate-screener';\n referenceId?: string;\n };\n};\n\nexport function SaveAsDatasetItemDialog({\n initialInput,\n initialGroundTruth,\n initialTrajectory,\n trajectoryLoading,\n initialToolMocks,\n breadcrumb,\n isOpen,\n onClose,\n level = 2,\n source,\n}: SaveAsDatasetItemDialogProps) {\n const [selectedDatasetId, setSelectedDatasetId] = useState<string>('');\n const [input, setInput] = useState('');\n const [groundTruth, setGroundTruth] = useState('');\n const [expectedTrajectory, setExpectedTrajectory] = useState('');\n const [toolMocks, setToolMocks] = useState('');\n // source is passed through — not editable in the UI\n\n const { data, isLoading: isDatasetsLoading } = useDatasets();\n const { addItem } = useDatasetMutations();\n const { navigate, paths } = useLinkComponent();\n\n const datasets = data?.datasets ?? [];\n\n const prevOpenRef = useRef(false);\n const trajectorySeededRef = useRef(false);\n const inputSeededRef = useRef(false);\n const groundTruthSeededRef = useRef(false);\n useEffect(() => {\n if (isOpen && !prevOpenRef.current) {\n setInput(initialInput);\n setGroundTruth(initialGroundTruth);\n setExpectedTrajectory(initialTrajectory ?? '');\n setToolMocks(initialToolMocks ?? '');\n trajectorySeededRef.current = !!initialTrajectory;\n inputSeededRef.current = initialInput !== '{}';\n groundTruthSeededRef.current = !!initialGroundTruth;\n }\n prevOpenRef.current = isOpen;\n if (!isOpen) {\n trajectorySeededRef.current = false;\n inputSeededRef.current = false;\n groundTruthSeededRef.current = false;\n }\n }, [isOpen, initialInput, initialGroundTruth, initialTrajectory, initialToolMocks]);\n\n // Mark fields as user-edited so async seeding won't overwrite them.\n const handleInputChange = (value: string) => {\n inputSeededRef.current = true;\n setInput(value);\n };\n\n const handleGroundTruthChange = (value: string) => {\n groundTruthSeededRef.current = true;\n setGroundTruth(value);\n };\n\n const handleExpectedTrajectoryChange = (value: string) => {\n trajectorySeededRef.current = true;\n setExpectedTrajectory(value);\n };\n\n const handleToolMocksChange = (value: string) => {\n setToolMocks(value);\n };\n\n // Seed input when it arrives asynchronously after the dialog is already open\n useEffect(() => {\n if (isOpen && initialInput !== '{}' && !inputSeededRef.current) {\n setInput(initialInput);\n inputSeededRef.current = true;\n }\n }, [isOpen, initialInput]);\n\n // Seed groundTruth when it arrives asynchronously after the dialog is already open\n useEffect(() => {\n if (isOpen && initialGroundTruth && !groundTruthSeededRef.current) {\n setGroundTruth(initialGroundTruth);\n groundTruthSeededRef.current = true;\n }\n }, [isOpen, initialGroundTruth]);\n\n // Seed trajectory when it arrives asynchronously after the dialog is already open\n useEffect(() => {\n if (isOpen && initialTrajectory && !trajectorySeededRef.current) {\n setExpectedTrajectory(initialTrajectory);\n trajectorySeededRef.current = true;\n }\n }, [isOpen, initialTrajectory]);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!selectedDatasetId) {\n toast.error('Please select a dataset');\n return;\n }\n\n let parsedInput: unknown;\n try {\n parsedInput = JSON.parse(input);\n } catch {\n toast.error('Input must be valid JSON');\n return;\n }\n\n let parsedGroundTruth: unknown | undefined;\n if (groundTruth.trim()) {\n try {\n parsedGroundTruth = JSON.parse(groundTruth);\n } catch {\n toast.error('Ground Truth must be valid JSON');\n return;\n }\n }\n\n let parsedTrajectory: AddDatasetItemParams['expectedTrajectory'];\n if (expectedTrajectory.trim()) {\n try {\n parsedTrajectory = JSON.parse(expectedTrajectory);\n } catch {\n toast.error('Expected Trajectory must be valid JSON');\n return;\n }\n }\n\n let parsedToolMocks: DatasetItemToolMock[] | undefined;\n if (toolMocks.trim()) {\n try {\n const parsed = JSON.parse(toolMocks);\n if (!Array.isArray(parsed)) {\n toast.error('Tool Mocks must be a JSON array');\n return;\n }\n parsedToolMocks = parsed as DatasetItemToolMock[];\n } catch {\n toast.error('Tool Mocks must be valid JSON');\n return;\n }\n }\n\n try {\n const item = await addItem.mutateAsync({\n datasetId: selectedDatasetId,\n input: parsedInput,\n groundTruth: parsedGroundTruth,\n expectedTrajectory: parsedTrajectory,\n toolMocks: parsedToolMocks,\n ...(source ? { source } : {}),\n });\n\n const targetDataset = datasets.find(d => d.id === selectedDatasetId);\n // Opens the dataset with the new item's drawer; apps without that route return ''.\n const itemHref = paths.datasetItemLink(selectedDatasetId, item.id);\n toast.success(`Added to \"${targetDataset?.name}\"`, {\n action: itemHref ? { label: 'Go to dataset', onClick: () => navigate(itemHref) } : undefined,\n });\n\n setSelectedDatasetId('');\n setInput('{}');\n setGroundTruth('');\n setExpectedTrajectory('');\n setToolMocks('');\n onClose();\n } catch (error) {\n toast.error(`Failed to save item: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n };\n\n const handleCancel = () => {\n setSelectedDatasetId('');\n onClose();\n };\n\n return (\n <SideDialog\n dialogTitle=\"Save as Dataset Item\"\n dialogDescription=\"Save data as a dataset item\"\n isOpen={isOpen}\n onClose={onClose}\n level={level}\n >\n <SideDialog.Top>\n {breadcrumb}›\n <TextAndIcon>\n <DatabaseIcon /> Save as Dataset Item\n </TextAndIcon>\n </SideDialog.Top>\n\n <SideDialog.Content>\n <SideDialog.Header>\n <SideDialog.Heading>\n <DatabaseIcon /> Save as Dataset Item\n </SideDialog.Heading>\n </SideDialog.Header>\n\n <Form onSubmit={handleSubmit}>\n <Field>\n <FieldLabel required>Dataset</FieldLabel>\n <Select\n value={selectedDatasetId}\n onValueChange={setSelectedDatasetId}\n disabled={addItem.isPending || isDatasetsLoading}\n >\n <SelectTrigger>\n <SelectValue placeholder={isDatasetsLoading ? 'Loading datasets...' : 'Select a dataset'} />\n </SelectTrigger>\n <SelectContent>\n {datasets.length === 0 ? (\n <Txt as=\"p\" variant=\"body\" tone=\"muted\" className=\"px-2 py-4 text-center\">\n No datasets available\n </Txt>\n ) : (\n datasets.map(dataset => (\n <SelectItem key={dataset.id} value={dataset.id}>\n {dataset.name}\n </SelectItem>\n ))\n )}\n </SelectContent>\n </Select>\n </Field>\n\n <Field>\n <FieldLabel required>Input (JSON)</FieldLabel>\n <CodeEditor value={input} onChange={handleInputChange} showCopyButton={false} className=\"min-h-30\" />\n </Field>\n\n <Field>\n <FieldLabel>Ground Truth (JSON, optional)</FieldLabel>\n <CodeEditor\n value={groundTruth}\n onChange={handleGroundTruthChange}\n showCopyButton={false}\n className=\"min-h-20\"\n />\n </Field>\n\n <Field>\n <FieldLabel>Expected Trajectory (JSON, optional)</FieldLabel>\n <CodeEditor\n value={expectedTrajectory}\n onChange={handleExpectedTrajectoryChange}\n showCopyButton={false}\n className=\"min-h-20\"\n />\n </Field>\n\n <Field>\n <FieldLabel>Tool Mocks (JSON, optional)</FieldLabel>\n <CodeEditor\n value={toolMocks}\n onChange={handleToolMocksChange}\n showCopyButton={false}\n className=\"min-h-20\"\n />\n </Field>\n\n <div className=\"flex justify-end gap-2 pt-4\">\n <Button icon={<X />} type=\"button\" onClick={handleCancel}>\n Cancel\n </Button>\n <Button\n icon={<Check />}\n type=\"submit\"\n variant=\"default\"\n disabled={addItem.isPending || trajectoryLoading || !selectedDatasetId || datasets.length === 0}\n >\n {addItem.isPending ? 'Saving...' : trajectoryLoading ? 'Loading...' : 'Save Item'}\n </Button>\n </div>\n </Form>\n </SideDialog.Content>\n </SideDialog>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"save-as-dataset-item-dialog.es.js","sources":["../../../../src/domains/datasets/components/save-as-dataset-item-dialog.tsx"],"sourcesContent":["'use client';\n\nimport type { DatasetItemToolMock, AddDatasetItemParams } from '@mastra/client-js';\nimport { useDatasetMutations, useDatasets } from '@mastra/react/hooks/datasets';\nimport { Check, X } from 'lucide-react';\nimport { useState, useEffect, useRef } from 'react';\nimport type { ReactNode } from 'react';\nimport { Button } from '@/ds/components/Button';\nimport { CodeEditor } from '@/ds/components/CodeEditor';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport type { DataPanelProps } from '@/ds/components/DataPanel';\nimport { Field, FieldLabel } from '@/ds/components/Field';\nimport { Form } from '@/ds/components/Form';\nimport { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '@/ds/components/Select';\nimport { Txt } from '@/ds/components/Txt';\nimport { useLinkComponent } from '@/lib/framework';\nimport { toast } from '@/utils/toast';\n\nconst CREATE_DATASET_VALUE = '__create-dataset__';\n\nexport type CreateDatasetDialogRenderProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSuccess: (datasetId: string) => void;\n};\n\nexport type SaveAsDatasetItemDialogProps = {\n initialInput: string;\n initialGroundTruth: string;\n /** JSON string of the expected trajectory */\n initialTrajectory?: string;\n /** Whether the trajectory is still being fetched */\n trajectoryLoading?: boolean;\n /** JSON string of the tool mocks (array of { toolName, args, output }) */\n initialToolMocks?: string;\n breadcrumb: ReactNode;\n isOpen: boolean;\n onClose: () => void;\n /** Sibling-drawer elevation (see `DataPanel`); render after the panel it covers. */\n depth?: DataPanelProps['depth'];\n source?: {\n type: 'csv' | 'json' | 'trace' | 'llm' | 'experiment-result' | 'candidate-screener';\n referenceId?: string;\n };\n /**\n * Renders a create-dataset dialog. When set, the Dataset select offers \"Create dataset\" as its\n * first option and selects the new dataset once created.\n */\n renderCreateDatasetDialog?: (props: CreateDatasetDialogRenderProps) => ReactNode;\n};\n\nexport function SaveAsDatasetItemDialog({\n initialInput,\n initialGroundTruth,\n initialTrajectory,\n trajectoryLoading,\n initialToolMocks,\n breadcrumb,\n isOpen,\n onClose,\n depth = 2,\n source,\n renderCreateDatasetDialog,\n}: SaveAsDatasetItemDialogProps) {\n const [selectedDatasetId, setSelectedDatasetId] = useState<string>('');\n const [isCreateDatasetOpen, setIsCreateDatasetOpen] = useState(false);\n const [input, setInput] = useState('');\n const [groundTruth, setGroundTruth] = useState('');\n const [expectedTrajectory, setExpectedTrajectory] = useState('');\n const [toolMocks, setToolMocks] = useState('');\n // source is passed through — not editable in the UI\n\n const { data, isLoading: isDatasetsLoading } = useDatasets();\n const { addItem } = useDatasetMutations();\n const { navigate, paths } = useLinkComponent();\n\n const datasets = data?.datasets ?? [];\n // A just-created dataset is selected before the list refetch returns it; treat that gap as loading.\n const isSelectedDatasetListed = datasets.some(dataset => dataset.id === selectedDatasetId);\n const isSelectionLoading = isDatasetsLoading || (!!selectedDatasetId && !isSelectedDatasetListed);\n\n const handleDatasetChange = (value: string) => {\n if (value === CREATE_DATASET_VALUE) {\n setIsCreateDatasetOpen(true);\n return;\n }\n setSelectedDatasetId(value);\n };\n\n const prevOpenRef = useRef(false);\n const trajectorySeededRef = useRef(false);\n const inputSeededRef = useRef(false);\n const groundTruthSeededRef = useRef(false);\n useEffect(() => {\n if (isOpen && !prevOpenRef.current) {\n setInput(initialInput);\n setGroundTruth(initialGroundTruth);\n setExpectedTrajectory(initialTrajectory ?? '');\n setToolMocks(initialToolMocks ?? '');\n trajectorySeededRef.current = !!initialTrajectory;\n inputSeededRef.current = initialInput !== '{}';\n groundTruthSeededRef.current = !!initialGroundTruth;\n }\n prevOpenRef.current = isOpen;\n if (!isOpen) {\n trajectorySeededRef.current = false;\n inputSeededRef.current = false;\n groundTruthSeededRef.current = false;\n }\n }, [isOpen, initialInput, initialGroundTruth, initialTrajectory, initialToolMocks]);\n\n // Mark fields as user-edited so async seeding won't overwrite them.\n const handleInputChange = (value: string) => {\n inputSeededRef.current = true;\n setInput(value);\n };\n\n const handleGroundTruthChange = (value: string) => {\n groundTruthSeededRef.current = true;\n setGroundTruth(value);\n };\n\n const handleExpectedTrajectoryChange = (value: string) => {\n trajectorySeededRef.current = true;\n setExpectedTrajectory(value);\n };\n\n const handleToolMocksChange = (value: string) => {\n setToolMocks(value);\n };\n\n // Seed input when it arrives asynchronously after the dialog is already open\n useEffect(() => {\n if (isOpen && initialInput !== '{}' && !inputSeededRef.current) {\n setInput(initialInput);\n inputSeededRef.current = true;\n }\n }, [isOpen, initialInput]);\n\n // Seed groundTruth when it arrives asynchronously after the dialog is already open\n useEffect(() => {\n if (isOpen && initialGroundTruth && !groundTruthSeededRef.current) {\n setGroundTruth(initialGroundTruth);\n groundTruthSeededRef.current = true;\n }\n }, [isOpen, initialGroundTruth]);\n\n // Seed trajectory when it arrives asynchronously after the dialog is already open\n useEffect(() => {\n if (isOpen && initialTrajectory && !trajectorySeededRef.current) {\n setExpectedTrajectory(initialTrajectory);\n trajectorySeededRef.current = true;\n }\n }, [isOpen, initialTrajectory]);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!selectedDatasetId) {\n toast.error('Please select a dataset');\n return;\n }\n\n let parsedInput: unknown;\n try {\n parsedInput = JSON.parse(input);\n } catch {\n toast.error('Input must be valid JSON');\n return;\n }\n\n let parsedGroundTruth: unknown | undefined;\n if (groundTruth.trim()) {\n try {\n parsedGroundTruth = JSON.parse(groundTruth);\n } catch {\n toast.error('Ground Truth must be valid JSON');\n return;\n }\n }\n\n let parsedTrajectory: AddDatasetItemParams['expectedTrajectory'];\n if (expectedTrajectory.trim()) {\n try {\n parsedTrajectory = JSON.parse(expectedTrajectory);\n } catch {\n toast.error('Expected Trajectory must be valid JSON');\n return;\n }\n }\n\n let parsedToolMocks: DatasetItemToolMock[] | undefined;\n if (toolMocks.trim()) {\n try {\n const parsed = JSON.parse(toolMocks);\n if (!Array.isArray(parsed)) {\n toast.error('Tool Mocks must be a JSON array');\n return;\n }\n parsedToolMocks = parsed as DatasetItemToolMock[];\n } catch {\n toast.error('Tool Mocks must be valid JSON');\n return;\n }\n }\n\n try {\n const item = await addItem.mutateAsync({\n datasetId: selectedDatasetId,\n input: parsedInput,\n groundTruth: parsedGroundTruth,\n expectedTrajectory: parsedTrajectory,\n toolMocks: parsedToolMocks,\n ...(source ? { source } : {}),\n });\n\n const targetDataset = datasets.find(d => d.id === selectedDatasetId);\n // Opens the dataset with the new item's drawer; apps without that route return ''.\n const itemHref = paths.datasetItemLink(selectedDatasetId, item.id);\n toast.success(`Added to \"${targetDataset?.name}\"`, {\n action: itemHref ? { label: 'Go to dataset', onClick: () => navigate(itemHref) } : undefined,\n });\n\n setSelectedDatasetId('');\n setInput('{}');\n setGroundTruth('');\n setExpectedTrajectory('');\n setToolMocks('');\n onClose();\n } catch (error) {\n toast.error(`Failed to save item: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n };\n\n const handleCancel = () => {\n setSelectedDatasetId('');\n onClose();\n };\n\n return (\n <DataPanel\n open={isOpen}\n onClose={handleCancel}\n title=\"Save as Dataset Item\"\n description=\"Save data as a dataset item\"\n depth={depth}\n >\n <DataPanel.Header>\n <DataPanel.Heading>\n Save as Dataset Item\n <b className=\"whitespace-nowrap\">{breadcrumb}</b>\n </DataPanel.Heading>\n <DataPanel.HeaderActions>\n <DataPanel.CloseButton icon=\"x\" onClick={handleCancel} label=\"Close save as dataset item\" tooltip=\"Close\" />\n </DataPanel.HeaderActions>\n </DataPanel.Header>\n\n <DataPanel.Content>\n <Form onSubmit={handleSubmit}>\n <Field>\n <FieldLabel required>Dataset</FieldLabel>\n <Select\n // Base UI resets an unmatched non-null value to null when items change, which would wipe a\n // just-created dataset before the refetch lists it; null means \"no selection\" and is left alone.\n value={isSelectedDatasetListed ? selectedDatasetId : null}\n onValueChange={handleDatasetChange}\n disabled={addItem.isPending || isSelectionLoading}\n >\n <SelectTrigger>\n <SelectValue placeholder={isSelectionLoading ? 'Loading datasets...' : 'Select a dataset'} />\n </SelectTrigger>\n <SelectContent>\n {renderCreateDatasetDialog && <SelectItem value={CREATE_DATASET_VALUE}>Create dataset</SelectItem>}\n {datasets.length === 0\n ? !renderCreateDatasetDialog && (\n <Txt as=\"p\" variant=\"body\" tone=\"muted\" className=\"px-2 py-4 text-center\">\n No datasets available\n </Txt>\n )\n : datasets.map(dataset => (\n <SelectItem key={dataset.id} value={dataset.id}>\n {dataset.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </Field>\n\n <Field>\n <FieldLabel required>Input (JSON)</FieldLabel>\n <CodeEditor value={input} onChange={handleInputChange} showCopyButton={false} className=\"min-h-30\" />\n </Field>\n\n <Field>\n <FieldLabel>Ground Truth (JSON, optional)</FieldLabel>\n <CodeEditor\n value={groundTruth}\n onChange={handleGroundTruthChange}\n showCopyButton={false}\n className=\"min-h-20\"\n />\n </Field>\n\n <Field>\n <FieldLabel>Expected Trajectory (JSON, optional)</FieldLabel>\n <CodeEditor\n value={expectedTrajectory}\n onChange={handleExpectedTrajectoryChange}\n showCopyButton={false}\n className=\"min-h-20\"\n />\n </Field>\n\n <Field>\n <FieldLabel>Tool Mocks (JSON, optional)</FieldLabel>\n <CodeEditor\n value={toolMocks}\n onChange={handleToolMocksChange}\n showCopyButton={false}\n className=\"min-h-20\"\n />\n </Field>\n\n <div className=\"flex justify-end gap-2 pt-4\">\n <Button icon={<X />} type=\"button\" onClick={handleCancel}>\n Cancel\n </Button>\n <Button\n icon={<Check />}\n type=\"submit\"\n variant=\"default\"\n disabled={addItem.isPending || trajectoryLoading || !isSelectedDatasetListed}\n >\n {addItem.isPending ? 'Saving...' : trajectoryLoading ? 'Loading...' : 'Save Item'}\n </Button>\n </div>\n </Form>\n </DataPanel.Content>\n\n {/* Rendered inside the drawer so the dialog nests in its focus scope instead of dismissing it. */}\n {renderCreateDatasetDialog?.({\n open: isCreateDatasetOpen,\n onOpenChange: setIsCreateDatasetOpen,\n onSuccess: setSelectedDatasetId,\n })}\n </DataPanel>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -16,12 +16,12 @@ const field = require('../../../field-BCU5ZtWV.cjs');
|
|
|
16
16
|
require('../../../field-control-aria-WzMGs0A4.cjs');
|
|
17
17
|
const form = require('../../../form-Cw-n1rd9.cjs');
|
|
18
18
|
const select = require('../../../select-CbNLtiAs.cjs');
|
|
19
|
-
const sideDialog = require('../../../side-dialog-BzULMBaH.cjs');
|
|
20
|
-
const textAndIcon = require('../../../text-and-icon-BcyWJ1Fj.cjs');
|
|
21
|
-
const utils_id = require('../../../utils/id.cjs.js');
|
|
22
19
|
const Txt = require('../../../Txt-CIS2G5Jx.cjs');
|
|
23
20
|
require('../../../lib/framework.cjs.js');
|
|
24
21
|
const toast = require('../../../toast-DxKdVSyw.cjs');
|
|
22
|
+
const sideDialog = require('../../../side-dialog-BzULMBaH.cjs');
|
|
23
|
+
const textAndIcon = require('../../../text-and-icon-BcyWJ1Fj.cjs');
|
|
24
|
+
const utils_id = require('../../../utils/id.cjs.js');
|
|
25
25
|
|
|
26
26
|
function itemLabel(item) {
|
|
27
27
|
const preview = (() => {
|
|
@@ -12,12 +12,12 @@ import { F as Field, e as FieldLabel, b as FieldDescription } from '../../../fie
|
|
|
12
12
|
import '../../../field-control-aria-DB6y41tQ.js';
|
|
13
13
|
import { F as Form } from '../../../form-CMfC7JKB.js';
|
|
14
14
|
import { S as Select, d as SelectTrigger, e as SelectValue, a as SelectContent, c as SelectItem } from '../../../select-CQtsggxJ.js';
|
|
15
|
-
import { S as SideDialog } from '../../../side-dialog-bm8NPDXy.js';
|
|
16
|
-
import { T as TextAndIcon } from '../../../text-and-icon-CRYBkgtj.js';
|
|
17
|
-
import { getShortId } from '../../../utils/id.es.js';
|
|
18
15
|
import { T as Txt } from '../../../Txt-BtIGLRk1.js';
|
|
19
16
|
import '../../../lib/framework.es.js';
|
|
20
17
|
import { t as toast } from '../../../toast-5aQbZBbY.js';
|
|
18
|
+
import { S as SideDialog } from '../../../side-dialog-bm8NPDXy.js';
|
|
19
|
+
import { T as TextAndIcon } from '../../../text-and-icon-CRYBkgtj.js';
|
|
20
|
+
import { getShortId } from '../../../utils/id.es.js';
|
|
21
21
|
|
|
22
22
|
function itemLabel(item) {
|
|
23
23
|
const preview = (() => {
|
|
@@ -8,10 +8,8 @@ const safeStringify = require('@mastra/core/utils/safe-stringify');
|
|
|
8
8
|
const react = require('@mastra/react');
|
|
9
9
|
const traces = require('@mastra/react/hooks/traces');
|
|
10
10
|
const reactQuery = require('@tanstack/react-query');
|
|
11
|
-
const lucideReact = require('lucide-react');
|
|
12
11
|
const domains_datasets_components_saveAsDatasetItemDialog = require('../../datasets/components/save-as-dataset-item-dialog.cjs.js');
|
|
13
12
|
require('@mastra/react/hooks/datasets');
|
|
14
|
-
const textAndIcon = require('../../../text-and-icon-BcyWJ1Fj.cjs');
|
|
15
13
|
const utils_id = require('../../../utils/id.cjs.js');
|
|
16
14
|
|
|
17
15
|
function getInitialInput(traceDetails) {
|
|
@@ -27,7 +25,8 @@ function TraceAsItemDialog({
|
|
|
27
25
|
traceId,
|
|
28
26
|
isOpen,
|
|
29
27
|
onClose,
|
|
30
|
-
|
|
28
|
+
depth,
|
|
29
|
+
renderCreateDatasetDialog
|
|
31
30
|
}) {
|
|
32
31
|
const client = react.useMastraClient();
|
|
33
32
|
const { data: lazySpanDetail } = traces.useSpanDetail({
|
|
@@ -69,15 +68,12 @@ function TraceAsItemDialog({
|
|
|
69
68
|
initialTrajectory,
|
|
70
69
|
trajectoryLoading: isTrajectoryLoading,
|
|
71
70
|
initialToolMocks,
|
|
72
|
-
breadcrumb:
|
|
73
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.EyeIcon, {}),
|
|
74
|
-
" ",
|
|
75
|
-
utils_id.getShortId(traceId)
|
|
76
|
-
] }),
|
|
71
|
+
breadcrumb: utils_id.getShortId(traceId),
|
|
77
72
|
isOpen,
|
|
78
73
|
onClose,
|
|
79
|
-
|
|
80
|
-
source: traceId ? { type: "trace", referenceId: traceId } : void 0
|
|
74
|
+
depth,
|
|
75
|
+
source: traceId ? { type: "trace", referenceId: traceId } : void 0,
|
|
76
|
+
renderCreateDatasetDialog
|
|
81
77
|
}
|
|
82
78
|
);
|
|
83
79
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-as-item-dialog.cjs.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.cjs.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":["safeStringify","useMastraClient","useSpanDetail","useQuery","collectToolMocks","jsx","SaveAsDatasetItemDialog","getShortId"],"mappings":"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"}
|
|
@@ -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;;;;"}
|