@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.
Files changed (61) hide show
  1. package/README.md +10 -2
  2. package/components.css +340 -0
  3. package/dist/code-DJReJPSX.cjs.map +1 -1
  4. package/dist/code-DLuATvYu.js.map +1 -1
  5. package/dist/components/Breadcrumb.cjs.js +4 -2
  6. package/dist/components/Breadcrumb.cjs.js.map +1 -1
  7. package/dist/components/Breadcrumb.es.js +5 -3
  8. package/dist/components/Breadcrumb.es.js.map +1 -1
  9. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +2 -0
  10. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js.map +1 -1
  11. package/dist/domains/chat/tools/badges/workflow-badge.es.js +2 -0
  12. package/dist/domains/chat/tools/badges/workflow-badge.es.js.map +1 -1
  13. package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js +104 -92
  14. package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js.map +1 -1
  15. package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js +105 -93
  16. package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js.map +1 -1
  17. package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.cjs.js +3 -3
  18. package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.es.js +3 -3
  19. package/dist/domains/observability/components/trace-as-item-dialog.cjs.js +6 -10
  20. package/dist/domains/observability/components/trace-as-item-dialog.cjs.js.map +1 -1
  21. package/dist/domains/observability/components/trace-as-item-dialog.es.js +7 -11
  22. package/dist/domains/observability/components/trace-as-item-dialog.es.js.map +1 -1
  23. package/dist/domains/scores/components/score-as-item-dialog.cjs.js +3 -9
  24. package/dist/domains/scores/components/score-as-item-dialog.cjs.js.map +1 -1
  25. package/dist/domains/scores/components/score-as-item-dialog.es.js +4 -10
  26. package/dist/domains/scores/components/score-as-item-dialog.es.js.map +1 -1
  27. package/dist/domains/scores/components/score-data-panel.cjs.js +9 -1
  28. package/dist/domains/scores/components/score-data-panel.cjs.js.map +1 -1
  29. package/dist/domains/scores/components/score-data-panel.es.js +9 -1
  30. package/dist/domains/scores/components/score-data-panel.es.js.map +1 -1
  31. package/dist/domains/traces/components/thread-view-by-trace.cjs.js +1 -0
  32. package/dist/domains/traces/components/thread-view-by-trace.cjs.js.map +1 -1
  33. package/dist/domains/traces/components/thread-view-by-trace.es.js +1 -0
  34. package/dist/domains/traces/components/thread-view-by-trace.es.js.map +1 -1
  35. package/dist/domains/traces/components/trace-data-panel.cjs.js +1 -0
  36. package/dist/domains/traces/components/trace-data-panel.cjs.js.map +1 -1
  37. package/dist/domains/traces/components/trace-data-panel.es.js +1 -0
  38. package/dist/domains/traces/components/trace-data-panel.es.js.map +1 -1
  39. package/dist/domains/workflows/workflow/workflow-input-data.cjs.js +1 -0
  40. package/dist/domains/workflows/workflow/workflow-input-data.cjs.js.map +1 -1
  41. package/dist/domains/workflows/workflow/workflow-input-data.es.js +1 -0
  42. package/dist/domains/workflows/workflow/workflow-input-data.es.js.map +1 -1
  43. package/dist/primitives/raised-surface.cjs.js.map +1 -1
  44. package/dist/primitives/raised-surface.es.js.map +1 -1
  45. package/dist/src/domains/datasets/components/index.d.ts +1 -1
  46. package/dist/src/domains/datasets/components/save-as-dataset-item-dialog.d.ts +14 -3
  47. package/dist/src/domains/observability/components/trace-as-item-dialog.d.ts +5 -3
  48. package/dist/src/domains/scores/components/score-as-item-dialog.d.ts +3 -3
  49. package/dist/src/ds/components/Breadcrumb/Breadcrumb.d.ts +2 -2
  50. package/dist/src/ds/components/Code/code.d.ts +1 -1
  51. package/dist/src/ds/primitives/raised-surface.d.ts +1 -1
  52. package/dist/style.css +22 -19
  53. package/dist/toast.css +1 -1
  54. package/dist/tokens.cjs.js.map +1 -1
  55. package/dist/tokens.es.js.map +1 -1
  56. package/dist/use-text-highlight.css +4 -4
  57. package/package.json +16 -12
  58. package/sources.css +1 -0
  59. package/theme/code.css +17 -0
  60. package/theme/surfaces.css +2 -2
  61. package/theme.css +2 -0
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-badge.cjs.js","sources":["../../../../../src/domains/chat/tools/badges/workflow-badge.tsx"],"sourcesContent":["import type { GetWorkflowResponse } from '@mastra/client-js';\nimport { useWorkflow } from '@mastra/react/hooks/workflows';\nimport { Eye } from 'lucide-react';\nimport { useContext, useEffect } from 'react';\nimport { BackgroundTaskMetadataDialogTrigger } from './background-task-metadata-dialog';\nimport type { MessageMetadata } from '@/domains/chat';\n\nimport { LoadingBadge } from '@/domains/chat/components/loading-badge';\nimport { NetworkChoiceMetadataDialogTrigger } from '@/domains/chat/components/network-choice-metadata-dialog';\nimport { SectionLabel } from '@/domains/chat/components/section-label';\nimport { awaitsToolApproval } from '@/domains/chat/tools/badges/awaits-tool-approval';\nimport type { ToolApprovalRequest } from '@/domains/chat/tools/badges/tool-approval-badge';\nimport { ToolApprovalBadge } from '@/domains/chat/tools/badges/tool-approval-badge';\nimport { useEntityRequestContext } from '@/domains/request-context/hooks/use-entity-request-context';\nimport {\n WorkflowGraph,\n WorkflowRunContext,\n WorkflowSelectedStepProvider,\n WorkflowStepDetailProvider,\n useWorkflowStepDetail,\n} from '@/domains/workflows';\nimport { WorkflowStepDetailContent } from '@/domains/workflows/components/workflow-step-detail';\nimport { PlaygroundWorkflowRunProvider } from '@/domains/workflows/context/playground-workflow-run-provider';\nimport type { WorkflowRunStreamResult } from '@/domains/workflows/context/workflow-run-context';\nimport { ToolCallMono } from '@/ds/components/ai/tool-call';\nimport { Button } from '@/ds/components/Button';\nimport { CodeEditor } from '@/ds/components/CodeEditor';\nimport { WorkflowIcon } from '@/ds/icons/WorkflowIcon';\nimport { useLinkComponent } from '@/lib/framework';\n\nexport interface WorkflowBadgeProps extends Omit<ToolApprovalRequest, 'toolCalled'> {\n workflowId: string;\n result?: any;\n isStreaming?: boolean;\n metadata?: MessageMetadata;\n suspendPayload?: any;\n toolCalled?: boolean;\n}\n\nexport const WorkflowBadge = ({\n result,\n workflowId,\n isStreaming,\n metadata,\n toolCallId,\n toolApprovalMetadata,\n suspendPayload,\n toolName,\n isNetwork,\n toolCalled,\n}: WorkflowBadgeProps) => {\n const { runId, status } = result || {};\n const { data: workflow, isLoading: isWorkflowLoading } = useWorkflow({\n workflowId,\n requestContext: useEntityRequestContext('workflow', workflowId)[0],\n queryOptions: { enabled: Boolean(workflowId) },\n });\n const routingDecision = metadata?.mode === 'network' ? metadata.routingDecision : undefined;\n const selectionReason =\n metadata?.mode === 'network' ? (routingDecision?.selectionReason ?? metadata.selectionReason) : undefined;\n const agentNetworkInput = metadata?.mode === 'network' ? (routingDecision ?? metadata.agentInput) : undefined;\n\n const bgEntry =\n (metadata?.mode === 'stream' || metadata?.mode === 'generate') && metadata?.backgroundTasks\n ? metadata.backgroundTasks[toolCallId]\n : undefined;\n\n let suspendPayloadSlot =\n typeof suspendPayload === 'string' ? (\n <ToolCallMono copyText={suspendPayload} className=\"text-muted-foreground\">\n {suspendPayload}\n </ToolCallMono>\n ) : (\n <CodeEditor data={suspendPayload} data-testid=\"tool-suspend-payload\" />\n );\n\n if (isWorkflowLoading || !workflow) return <LoadingBadge />;\n\n const toolCalledOrFinished = toolCalled ?? !!status;\n const showsRun = isStreaming || Boolean(runId);\n const hasBody =\n showsRun ||\n Boolean(suspendPayload) ||\n awaitsToolApproval({ toolApprovalMetadata, toolCalled: toolCalledOrFinished });\n\n return (\n <ToolApprovalBadge\n approval={{\n toolCalled: toolCalledOrFinished,\n toolCallId,\n toolApprovalMetadata,\n toolName,\n isNetwork,\n isGenerateMode: metadata?.mode === 'generate',\n }}\n data-testid=\"workflow-badge\"\n icon={<WorkflowIcon className=\"text-span-workflow\" />}\n title={workflow.name}\n initialCollapsed={false}\n extraInfo={\n metadata?.mode === 'network' ? (\n <NetworkChoiceMetadataDialogTrigger\n selectionReason={selectionReason ?? ''}\n input={agentNetworkInput as string | Record<string, unknown> | undefined}\n />\n ) : bgEntry?.taskId && bgEntry?.startedAt ? (\n <BackgroundTaskMetadataDialogTrigger backgroundTask={bgEntry} />\n ) : null\n }\n >\n {hasBody && (\n <>\n {!isStreaming && runId && (\n <PlaygroundWorkflowRunProvider workflowId={workflowId} initialRunId={runId} withoutTimeTravel>\n <WorkflowBadgeExtended workflowId={workflowId} workflow={workflow} runId={runId} />\n </PlaygroundWorkflowRunProvider>\n )}\n\n {isStreaming && <WorkflowBadgeExtended workflowId={workflowId} workflow={workflow} runId={runId} />}\n\n {suspendPayloadSlot !== undefined && suspendPayload && (\n <div>\n <SectionLabel>Workflow suspend payload</SectionLabel>\n {suspendPayloadSlot}\n </div>\n )}\n </>\n )}\n </ToolApprovalBadge>\n );\n};\n\ninterface WorkflowBadgeExtendedProps {\n workflowId: string;\n runId?: string;\n workflow: GetWorkflowResponse;\n}\n\nconst WorkflowBadgeExtended = ({ workflowId, workflow, runId }: WorkflowBadgeExtendedProps) => {\n const requestContext = useEntityRequestContext('workflow', workflowId)[0];\n const { Link } = useLinkComponent();\n const { isLoadingRunExecutionResult } = useContext(WorkflowRunContext);\n\n return (\n <>\n <div className=\"flex items-center gap-2 pb-2\">\n <Button icon={<WorkflowIcon />} render={<Link href={`/workflows/${workflowId}/graph`} />}>\n Go to workflow\n </Button>\n {runId && (\n <Button icon={<Eye />} render={<Link href={`/workflows/${workflowId}/graph/${runId}`} />}>\n See run\n </Button>\n )}\n </div>\n\n <WorkflowSelectedStepProvider>\n <WorkflowStepDetailProvider>\n <div className=\"h-[60vh] w-full overflow-hidden rounded-md\">\n <WorkflowGraph\n workflowId={workflowId}\n workflow={workflow}\n isLoading={isLoadingRunExecutionResult}\n requestContext={requestContext}\n />\n </div>\n <WorkflowBadgeStepDetail requestContext={requestContext} />\n </WorkflowStepDetailProvider>\n </WorkflowSelectedStepProvider>\n </>\n );\n};\n\nconst WorkflowBadgeStepDetail = ({ requestContext }: { requestContext: Record<string, any> }) => {\n const { stepDetail } = useWorkflowStepDetail();\n if (!stepDetail) return null;\n return (\n <div className=\"mt-2 flex max-h-[60vh] flex-col overflow-hidden rounded-md border border-border bg-background\">\n <WorkflowStepDetailContent requestContext={requestContext} />\n </div>\n );\n};\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport const useWorkflowStream = (workflowFullState?: WorkflowRunStreamResult) => {\n const { setResult } = useContext(WorkflowRunContext);\n\n useEffect(() => {\n if (!workflowFullState) return;\n setResult(workflowFullState);\n }, [workflowFullState, setResult]);\n};\n"],"names":["useWorkflow","useEntityRequestContext","jsx","ToolCallMono","CodeEditor","LoadingBadge","awaitsToolApproval","ToolApprovalBadge","WorkflowIcon","NetworkChoiceMetadataDialogTrigger","BackgroundTaskMetadataDialogTrigger","jsxs","Fragment","PlaygroundWorkflowRunProvider","SectionLabel","useLinkComponent","useContext","WorkflowRunContext","Button","Eye","WorkflowSelectedStepProvider","WorkflowStepDetailProvider","WorkflowGraph","useWorkflowStepDetail","WorkflowStepDetailContent","useEffect"],"mappings":"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"}
1
+ {"version":3,"file":"workflow-badge.cjs.js","sources":["../../../../../src/domains/chat/tools/badges/workflow-badge.tsx"],"sourcesContent":["import type { GetWorkflowResponse } from '@mastra/client-js';\nimport { useWorkflow } from '@mastra/react/hooks/workflows';\nimport { Eye } from 'lucide-react';\nimport { useContext, useEffect } from 'react';\nimport { BackgroundTaskMetadataDialogTrigger } from './background-task-metadata-dialog';\nimport type { MessageMetadata } from '@/domains/chat';\n\nimport { LoadingBadge } from '@/domains/chat/components/loading-badge';\nimport { NetworkChoiceMetadataDialogTrigger } from '@/domains/chat/components/network-choice-metadata-dialog';\nimport { SectionLabel } from '@/domains/chat/components/section-label';\nimport { awaitsToolApproval } from '@/domains/chat/tools/badges/awaits-tool-approval';\nimport type { ToolApprovalRequest } from '@/domains/chat/tools/badges/tool-approval-badge';\nimport { ToolApprovalBadge } from '@/domains/chat/tools/badges/tool-approval-badge';\nimport { useEntityRequestContext } from '@/domains/request-context/hooks/use-entity-request-context';\nimport {\n WorkflowGraph,\n WorkflowRunContext,\n WorkflowSelectedStepProvider,\n WorkflowStepDetailProvider,\n useWorkflowStepDetail,\n} from '@/domains/workflows';\nimport { WorkflowStepDetailContent } from '@/domains/workflows/components/workflow-step-detail';\nimport { PlaygroundWorkflowRunProvider } from '@/domains/workflows/context/playground-workflow-run-provider';\nimport type { WorkflowRunStreamResult } from '@/domains/workflows/context/workflow-run-context';\nimport { ToolCallMono } from '@/ds/components/ai/tool-call';\nimport { Button } from '@/ds/components/Button';\nimport { CodeEditor } from '@/ds/components/CodeEditor';\nimport { WorkflowIcon } from '@/ds/icons/WorkflowIcon';\nimport { useLinkComponent } from '@/lib/framework';\n\nexport interface WorkflowBadgeProps extends Omit<ToolApprovalRequest, 'toolCalled'> {\n workflowId: string;\n result?: any;\n isStreaming?: boolean;\n metadata?: MessageMetadata;\n suspendPayload?: any;\n toolCalled?: boolean;\n}\n\nexport const WorkflowBadge = ({\n result,\n workflowId,\n isStreaming,\n metadata,\n toolCallId,\n toolApprovalMetadata,\n suspendPayload,\n toolName,\n isNetwork,\n toolCalled,\n}: WorkflowBadgeProps) => {\n const { runId, status } = result || {};\n const { data: workflow, isLoading: isWorkflowLoading } = useWorkflow({\n workflowId,\n requestContext: useEntityRequestContext('workflow', workflowId)[0],\n queryOptions: { enabled: Boolean(workflowId) },\n });\n const routingDecision = metadata?.mode === 'network' ? metadata.routingDecision : undefined;\n const selectionReason =\n metadata?.mode === 'network' ? (routingDecision?.selectionReason ?? metadata.selectionReason) : undefined;\n const agentNetworkInput = metadata?.mode === 'network' ? (routingDecision ?? metadata.agentInput) : undefined;\n\n const bgEntry =\n (metadata?.mode === 'stream' || metadata?.mode === 'generate') && metadata?.backgroundTasks\n ? metadata.backgroundTasks[toolCallId]\n : undefined;\n\n let suspendPayloadSlot =\n typeof suspendPayload === 'string' ? (\n <ToolCallMono copyText={suspendPayload} className=\"text-muted-foreground\">\n {suspendPayload}\n </ToolCallMono>\n ) : (\n <CodeEditor data={suspendPayload} data-testid=\"tool-suspend-payload\" />\n );\n\n if (isWorkflowLoading || !workflow) return <LoadingBadge />;\n\n const toolCalledOrFinished = toolCalled ?? !!status;\n const showsRun = isStreaming || Boolean(runId);\n const hasBody =\n showsRun ||\n Boolean(suspendPayload) ||\n awaitsToolApproval({ toolApprovalMetadata, toolCalled: toolCalledOrFinished });\n\n return (\n <ToolApprovalBadge\n approval={{\n toolCalled: toolCalledOrFinished,\n toolCallId,\n toolApprovalMetadata,\n toolName,\n isNetwork,\n isGenerateMode: metadata?.mode === 'generate',\n }}\n data-testid=\"workflow-badge\"\n icon={<WorkflowIcon className=\"text-span-workflow\" />}\n title={workflow.name}\n initialCollapsed={false}\n extraInfo={\n metadata?.mode === 'network' ? (\n <NetworkChoiceMetadataDialogTrigger\n selectionReason={selectionReason ?? ''}\n input={agentNetworkInput as string | Record<string, unknown> | undefined}\n />\n ) : bgEntry?.taskId && bgEntry?.startedAt ? (\n <BackgroundTaskMetadataDialogTrigger backgroundTask={bgEntry} />\n ) : null\n }\n >\n {hasBody && (\n <>\n {!isStreaming && runId && (\n <PlaygroundWorkflowRunProvider workflowId={workflowId} initialRunId={runId} withoutTimeTravel>\n <WorkflowBadgeExtended workflowId={workflowId} workflow={workflow} runId={runId} />\n </PlaygroundWorkflowRunProvider>\n )}\n\n {isStreaming && <WorkflowBadgeExtended workflowId={workflowId} workflow={workflow} runId={runId} />}\n\n {suspendPayloadSlot !== undefined && suspendPayload && (\n <div>\n <SectionLabel>Workflow suspend payload</SectionLabel>\n {suspendPayloadSlot}\n </div>\n )}\n </>\n )}\n </ToolApprovalBadge>\n );\n};\n\ninterface WorkflowBadgeExtendedProps {\n workflowId: string;\n runId?: string;\n workflow: GetWorkflowResponse;\n}\n\nconst WorkflowBadgeExtended = ({ workflowId, workflow, runId }: WorkflowBadgeExtendedProps) => {\n const requestContext = useEntityRequestContext('workflow', workflowId)[0];\n const { Link } = useLinkComponent();\n const { isLoadingRunExecutionResult } = useContext(WorkflowRunContext);\n\n return (\n <>\n <div className=\"flex items-center gap-2 pb-2\">\n <Button icon={<WorkflowIcon />} render={<Link href={`/workflows/${workflowId}/graph`} />}>\n Go to workflow\n </Button>\n {runId && (\n <Button icon={<Eye />} render={<Link href={`/workflows/${workflowId}/graph/${runId}`} />}>\n See run\n </Button>\n )}\n </div>\n\n <WorkflowSelectedStepProvider>\n <WorkflowStepDetailProvider>\n <div className=\"h-[60vh] w-full overflow-hidden rounded-md\">\n <WorkflowGraph\n workflowId={workflowId}\n workflow={workflow}\n isLoading={isLoadingRunExecutionResult}\n requestContext={requestContext}\n />\n </div>\n <WorkflowBadgeStepDetail requestContext={requestContext} />\n </WorkflowStepDetailProvider>\n </WorkflowSelectedStepProvider>\n </>\n );\n};\n\nconst WorkflowBadgeStepDetail = ({ requestContext }: { requestContext: Record<string, any> }) => {\n const { stepDetail } = useWorkflowStepDetail();\n if (!stepDetail) return null;\n return (\n <div className=\"mt-2 flex max-h-[60vh] flex-col overflow-hidden rounded-md border border-border bg-background\">\n <WorkflowStepDetailContent requestContext={requestContext} />\n </div>\n );\n};\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport const useWorkflowStream = (workflowFullState?: WorkflowRunStreamResult) => {\n const { setResult } = useContext(WorkflowRunContext);\n\n useEffect(() => {\n if (!workflowFullState) return;\n setResult(workflowFullState);\n }, [workflowFullState, setResult]);\n};\n"],"names":["useWorkflow","useEntityRequestContext","jsx","ToolCallMono","CodeEditor","LoadingBadge","awaitsToolApproval","ToolApprovalBadge","WorkflowIcon","NetworkChoiceMetadataDialogTrigger","BackgroundTaskMetadataDialogTrigger","jsxs","Fragment","PlaygroundWorkflowRunProvider","SectionLabel","useLinkComponent","useContext","WorkflowRunContext","Button","Eye","WorkflowSelectedStepProvider","WorkflowStepDetailProvider","WorkflowGraph","useWorkflowStepDetail","WorkflowStepDetailContent","useEffect"],"mappings":"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"}
@@ -11,6 +11,7 @@ import { ToolApprovalBadge } from './tool-approval-badge.es.js';
11
11
  import { useEntityRequestContext } from '../../../request-context/hooks/use-entity-request-context.es.js';
12
12
  import { WorkflowRunContext } from '../../../workflows/context/workflow-run-context.es.js';
13
13
  import '@tanstack/react-query';
14
+ import '../../../../toast-5aQbZBbY.js';
14
15
  import { useWorkflowStepDetail } from '../../../workflows/context/workflow-step-detail-context.es.js';
15
16
  import { WorkflowStepDetailProvider } from '../../../workflows/context/workflow-step-detail-provider.es.js';
16
17
  import { WorkflowSelectedStepProvider } from '../../../workflows/context/workflow-selected-step-context.es.js';
@@ -29,6 +30,7 @@ import 'react-hook-form';
29
30
  import '../../../../lib/form/field-context.es.js';
30
31
  import '../../../../lib/form/utils.es.js';
31
32
  import 'date-fns';
33
+ import '../../../../popover-BqRniR9J.js';
32
34
  import '@autoform/core';
33
35
  import '@autoform/react';
34
36
  import '@lukeed/uuid';
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-badge.es.js","sources":["../../../../../src/domains/chat/tools/badges/workflow-badge.tsx"],"sourcesContent":["import type { GetWorkflowResponse } from '@mastra/client-js';\nimport { useWorkflow } from '@mastra/react/hooks/workflows';\nimport { Eye } from 'lucide-react';\nimport { useContext, useEffect } from 'react';\nimport { BackgroundTaskMetadataDialogTrigger } from './background-task-metadata-dialog';\nimport type { MessageMetadata } from '@/domains/chat';\n\nimport { LoadingBadge } from '@/domains/chat/components/loading-badge';\nimport { NetworkChoiceMetadataDialogTrigger } from '@/domains/chat/components/network-choice-metadata-dialog';\nimport { SectionLabel } from '@/domains/chat/components/section-label';\nimport { awaitsToolApproval } from '@/domains/chat/tools/badges/awaits-tool-approval';\nimport type { ToolApprovalRequest } from '@/domains/chat/tools/badges/tool-approval-badge';\nimport { ToolApprovalBadge } from '@/domains/chat/tools/badges/tool-approval-badge';\nimport { useEntityRequestContext } from '@/domains/request-context/hooks/use-entity-request-context';\nimport {\n WorkflowGraph,\n WorkflowRunContext,\n WorkflowSelectedStepProvider,\n WorkflowStepDetailProvider,\n useWorkflowStepDetail,\n} from '@/domains/workflows';\nimport { WorkflowStepDetailContent } from '@/domains/workflows/components/workflow-step-detail';\nimport { PlaygroundWorkflowRunProvider } from '@/domains/workflows/context/playground-workflow-run-provider';\nimport type { WorkflowRunStreamResult } from '@/domains/workflows/context/workflow-run-context';\nimport { ToolCallMono } from '@/ds/components/ai/tool-call';\nimport { Button } from '@/ds/components/Button';\nimport { CodeEditor } from '@/ds/components/CodeEditor';\nimport { WorkflowIcon } from '@/ds/icons/WorkflowIcon';\nimport { useLinkComponent } from '@/lib/framework';\n\nexport interface WorkflowBadgeProps extends Omit<ToolApprovalRequest, 'toolCalled'> {\n workflowId: string;\n result?: any;\n isStreaming?: boolean;\n metadata?: MessageMetadata;\n suspendPayload?: any;\n toolCalled?: boolean;\n}\n\nexport const WorkflowBadge = ({\n result,\n workflowId,\n isStreaming,\n metadata,\n toolCallId,\n toolApprovalMetadata,\n suspendPayload,\n toolName,\n isNetwork,\n toolCalled,\n}: WorkflowBadgeProps) => {\n const { runId, status } = result || {};\n const { data: workflow, isLoading: isWorkflowLoading } = useWorkflow({\n workflowId,\n requestContext: useEntityRequestContext('workflow', workflowId)[0],\n queryOptions: { enabled: Boolean(workflowId) },\n });\n const routingDecision = metadata?.mode === 'network' ? metadata.routingDecision : undefined;\n const selectionReason =\n metadata?.mode === 'network' ? (routingDecision?.selectionReason ?? metadata.selectionReason) : undefined;\n const agentNetworkInput = metadata?.mode === 'network' ? (routingDecision ?? metadata.agentInput) : undefined;\n\n const bgEntry =\n (metadata?.mode === 'stream' || metadata?.mode === 'generate') && metadata?.backgroundTasks\n ? metadata.backgroundTasks[toolCallId]\n : undefined;\n\n let suspendPayloadSlot =\n typeof suspendPayload === 'string' ? (\n <ToolCallMono copyText={suspendPayload} className=\"text-muted-foreground\">\n {suspendPayload}\n </ToolCallMono>\n ) : (\n <CodeEditor data={suspendPayload} data-testid=\"tool-suspend-payload\" />\n );\n\n if (isWorkflowLoading || !workflow) return <LoadingBadge />;\n\n const toolCalledOrFinished = toolCalled ?? !!status;\n const showsRun = isStreaming || Boolean(runId);\n const hasBody =\n showsRun ||\n Boolean(suspendPayload) ||\n awaitsToolApproval({ toolApprovalMetadata, toolCalled: toolCalledOrFinished });\n\n return (\n <ToolApprovalBadge\n approval={{\n toolCalled: toolCalledOrFinished,\n toolCallId,\n toolApprovalMetadata,\n toolName,\n isNetwork,\n isGenerateMode: metadata?.mode === 'generate',\n }}\n data-testid=\"workflow-badge\"\n icon={<WorkflowIcon className=\"text-span-workflow\" />}\n title={workflow.name}\n initialCollapsed={false}\n extraInfo={\n metadata?.mode === 'network' ? (\n <NetworkChoiceMetadataDialogTrigger\n selectionReason={selectionReason ?? ''}\n input={agentNetworkInput as string | Record<string, unknown> | undefined}\n />\n ) : bgEntry?.taskId && bgEntry?.startedAt ? (\n <BackgroundTaskMetadataDialogTrigger backgroundTask={bgEntry} />\n ) : null\n }\n >\n {hasBody && (\n <>\n {!isStreaming && runId && (\n <PlaygroundWorkflowRunProvider workflowId={workflowId} initialRunId={runId} withoutTimeTravel>\n <WorkflowBadgeExtended workflowId={workflowId} workflow={workflow} runId={runId} />\n </PlaygroundWorkflowRunProvider>\n )}\n\n {isStreaming && <WorkflowBadgeExtended workflowId={workflowId} workflow={workflow} runId={runId} />}\n\n {suspendPayloadSlot !== undefined && suspendPayload && (\n <div>\n <SectionLabel>Workflow suspend payload</SectionLabel>\n {suspendPayloadSlot}\n </div>\n )}\n </>\n )}\n </ToolApprovalBadge>\n );\n};\n\ninterface WorkflowBadgeExtendedProps {\n workflowId: string;\n runId?: string;\n workflow: GetWorkflowResponse;\n}\n\nconst WorkflowBadgeExtended = ({ workflowId, workflow, runId }: WorkflowBadgeExtendedProps) => {\n const requestContext = useEntityRequestContext('workflow', workflowId)[0];\n const { Link } = useLinkComponent();\n const { isLoadingRunExecutionResult } = useContext(WorkflowRunContext);\n\n return (\n <>\n <div className=\"flex items-center gap-2 pb-2\">\n <Button icon={<WorkflowIcon />} render={<Link href={`/workflows/${workflowId}/graph`} />}>\n Go to workflow\n </Button>\n {runId && (\n <Button icon={<Eye />} render={<Link href={`/workflows/${workflowId}/graph/${runId}`} />}>\n See run\n </Button>\n )}\n </div>\n\n <WorkflowSelectedStepProvider>\n <WorkflowStepDetailProvider>\n <div className=\"h-[60vh] w-full overflow-hidden rounded-md\">\n <WorkflowGraph\n workflowId={workflowId}\n workflow={workflow}\n isLoading={isLoadingRunExecutionResult}\n requestContext={requestContext}\n />\n </div>\n <WorkflowBadgeStepDetail requestContext={requestContext} />\n </WorkflowStepDetailProvider>\n </WorkflowSelectedStepProvider>\n </>\n );\n};\n\nconst WorkflowBadgeStepDetail = ({ requestContext }: { requestContext: Record<string, any> }) => {\n const { stepDetail } = useWorkflowStepDetail();\n if (!stepDetail) return null;\n return (\n <div className=\"mt-2 flex max-h-[60vh] flex-col overflow-hidden rounded-md border border-border bg-background\">\n <WorkflowStepDetailContent requestContext={requestContext} />\n </div>\n );\n};\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport const useWorkflowStream = (workflowFullState?: WorkflowRunStreamResult) => {\n const { setResult } = useContext(WorkflowRunContext);\n\n useEffect(() => {\n if (!workflowFullState) return;\n setResult(workflowFullState);\n }, [workflowFullState, setResult]);\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workflow-badge.es.js","sources":["../../../../../src/domains/chat/tools/badges/workflow-badge.tsx"],"sourcesContent":["import type { GetWorkflowResponse } from '@mastra/client-js';\nimport { useWorkflow } from '@mastra/react/hooks/workflows';\nimport { Eye } from 'lucide-react';\nimport { useContext, useEffect } from 'react';\nimport { BackgroundTaskMetadataDialogTrigger } from './background-task-metadata-dialog';\nimport type { MessageMetadata } from '@/domains/chat';\n\nimport { LoadingBadge } from '@/domains/chat/components/loading-badge';\nimport { NetworkChoiceMetadataDialogTrigger } from '@/domains/chat/components/network-choice-metadata-dialog';\nimport { SectionLabel } from '@/domains/chat/components/section-label';\nimport { awaitsToolApproval } from '@/domains/chat/tools/badges/awaits-tool-approval';\nimport type { ToolApprovalRequest } from '@/domains/chat/tools/badges/tool-approval-badge';\nimport { ToolApprovalBadge } from '@/domains/chat/tools/badges/tool-approval-badge';\nimport { useEntityRequestContext } from '@/domains/request-context/hooks/use-entity-request-context';\nimport {\n WorkflowGraph,\n WorkflowRunContext,\n WorkflowSelectedStepProvider,\n WorkflowStepDetailProvider,\n useWorkflowStepDetail,\n} from '@/domains/workflows';\nimport { WorkflowStepDetailContent } from '@/domains/workflows/components/workflow-step-detail';\nimport { PlaygroundWorkflowRunProvider } from '@/domains/workflows/context/playground-workflow-run-provider';\nimport type { WorkflowRunStreamResult } from '@/domains/workflows/context/workflow-run-context';\nimport { ToolCallMono } from '@/ds/components/ai/tool-call';\nimport { Button } from '@/ds/components/Button';\nimport { CodeEditor } from '@/ds/components/CodeEditor';\nimport { WorkflowIcon } from '@/ds/icons/WorkflowIcon';\nimport { useLinkComponent } from '@/lib/framework';\n\nexport interface WorkflowBadgeProps extends Omit<ToolApprovalRequest, 'toolCalled'> {\n workflowId: string;\n result?: any;\n isStreaming?: boolean;\n metadata?: MessageMetadata;\n suspendPayload?: any;\n toolCalled?: boolean;\n}\n\nexport const WorkflowBadge = ({\n result,\n workflowId,\n isStreaming,\n metadata,\n toolCallId,\n toolApprovalMetadata,\n suspendPayload,\n toolName,\n isNetwork,\n toolCalled,\n}: WorkflowBadgeProps) => {\n const { runId, status } = result || {};\n const { data: workflow, isLoading: isWorkflowLoading } = useWorkflow({\n workflowId,\n requestContext: useEntityRequestContext('workflow', workflowId)[0],\n queryOptions: { enabled: Boolean(workflowId) },\n });\n const routingDecision = metadata?.mode === 'network' ? metadata.routingDecision : undefined;\n const selectionReason =\n metadata?.mode === 'network' ? (routingDecision?.selectionReason ?? metadata.selectionReason) : undefined;\n const agentNetworkInput = metadata?.mode === 'network' ? (routingDecision ?? metadata.agentInput) : undefined;\n\n const bgEntry =\n (metadata?.mode === 'stream' || metadata?.mode === 'generate') && metadata?.backgroundTasks\n ? metadata.backgroundTasks[toolCallId]\n : undefined;\n\n let suspendPayloadSlot =\n typeof suspendPayload === 'string' ? (\n <ToolCallMono copyText={suspendPayload} className=\"text-muted-foreground\">\n {suspendPayload}\n </ToolCallMono>\n ) : (\n <CodeEditor data={suspendPayload} data-testid=\"tool-suspend-payload\" />\n );\n\n if (isWorkflowLoading || !workflow) return <LoadingBadge />;\n\n const toolCalledOrFinished = toolCalled ?? !!status;\n const showsRun = isStreaming || Boolean(runId);\n const hasBody =\n showsRun ||\n Boolean(suspendPayload) ||\n awaitsToolApproval({ toolApprovalMetadata, toolCalled: toolCalledOrFinished });\n\n return (\n <ToolApprovalBadge\n approval={{\n toolCalled: toolCalledOrFinished,\n toolCallId,\n toolApprovalMetadata,\n toolName,\n isNetwork,\n isGenerateMode: metadata?.mode === 'generate',\n }}\n data-testid=\"workflow-badge\"\n icon={<WorkflowIcon className=\"text-span-workflow\" />}\n title={workflow.name}\n initialCollapsed={false}\n extraInfo={\n metadata?.mode === 'network' ? (\n <NetworkChoiceMetadataDialogTrigger\n selectionReason={selectionReason ?? ''}\n input={agentNetworkInput as string | Record<string, unknown> | undefined}\n />\n ) : bgEntry?.taskId && bgEntry?.startedAt ? (\n <BackgroundTaskMetadataDialogTrigger backgroundTask={bgEntry} />\n ) : null\n }\n >\n {hasBody && (\n <>\n {!isStreaming && runId && (\n <PlaygroundWorkflowRunProvider workflowId={workflowId} initialRunId={runId} withoutTimeTravel>\n <WorkflowBadgeExtended workflowId={workflowId} workflow={workflow} runId={runId} />\n </PlaygroundWorkflowRunProvider>\n )}\n\n {isStreaming && <WorkflowBadgeExtended workflowId={workflowId} workflow={workflow} runId={runId} />}\n\n {suspendPayloadSlot !== undefined && suspendPayload && (\n <div>\n <SectionLabel>Workflow suspend payload</SectionLabel>\n {suspendPayloadSlot}\n </div>\n )}\n </>\n )}\n </ToolApprovalBadge>\n );\n};\n\ninterface WorkflowBadgeExtendedProps {\n workflowId: string;\n runId?: string;\n workflow: GetWorkflowResponse;\n}\n\nconst WorkflowBadgeExtended = ({ workflowId, workflow, runId }: WorkflowBadgeExtendedProps) => {\n const requestContext = useEntityRequestContext('workflow', workflowId)[0];\n const { Link } = useLinkComponent();\n const { isLoadingRunExecutionResult } = useContext(WorkflowRunContext);\n\n return (\n <>\n <div className=\"flex items-center gap-2 pb-2\">\n <Button icon={<WorkflowIcon />} render={<Link href={`/workflows/${workflowId}/graph`} />}>\n Go to workflow\n </Button>\n {runId && (\n <Button icon={<Eye />} render={<Link href={`/workflows/${workflowId}/graph/${runId}`} />}>\n See run\n </Button>\n )}\n </div>\n\n <WorkflowSelectedStepProvider>\n <WorkflowStepDetailProvider>\n <div className=\"h-[60vh] w-full overflow-hidden rounded-md\">\n <WorkflowGraph\n workflowId={workflowId}\n workflow={workflow}\n isLoading={isLoadingRunExecutionResult}\n requestContext={requestContext}\n />\n </div>\n <WorkflowBadgeStepDetail requestContext={requestContext} />\n </WorkflowStepDetailProvider>\n </WorkflowSelectedStepProvider>\n </>\n );\n};\n\nconst WorkflowBadgeStepDetail = ({ requestContext }: { requestContext: Record<string, any> }) => {\n const { stepDetail } = useWorkflowStepDetail();\n if (!stepDetail) return null;\n return (\n <div className=\"mt-2 flex max-h-[60vh] flex-col overflow-hidden rounded-md border border-border bg-background\">\n <WorkflowStepDetailContent requestContext={requestContext} />\n </div>\n );\n};\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport const useWorkflowStream = (workflowFullState?: WorkflowRunStreamResult) => {\n const { setResult } = useContext(WorkflowRunContext);\n\n useEffect(() => {\n if (!workflowFullState) return;\n setResult(workflowFullState);\n }, [workflowFullState, setResult]);\n};\n"],"names":[],"mappings":"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"}
@@ -8,16 +8,16 @@ const lucideReact = require('lucide-react');
8
8
  const React = require('react');
9
9
  const Button = require('../../../Button-DH1aTzbs.cjs');
10
10
  const codeEditor = require('../../../code-editor-DQuJ1XXd.cjs');
11
+ const dataPanel = require('../../../data-panel-BkfjzriB.cjs');
11
12
  const field = require('../../../field-BCU5ZtWV.cjs');
12
13
  require('../../../field-control-aria-WzMGs0A4.cjs');
13
14
  const form = require('../../../form-Cw-n1rd9.cjs');
14
15
  const select = require('../../../select-CbNLtiAs.cjs');
15
- const sideDialog = require('../../../side-dialog-BzULMBaH.cjs');
16
- const textAndIcon = require('../../../text-and-icon-BcyWJ1Fj.cjs');
17
16
  const Txt = require('../../../Txt-CIS2G5Jx.cjs');
18
17
  const lib_framework = require('../../../lib/framework.cjs.js');
19
18
  const toast = require('../../../toast-DxKdVSyw.cjs');
20
19
 
20
+ const CREATE_DATASET_VALUE = "__create-dataset__";
21
21
  function SaveAsDatasetItemDialog({
22
22
  initialInput,
23
23
  initialGroundTruth,
@@ -27,10 +27,12 @@ function SaveAsDatasetItemDialog({
27
27
  breadcrumb,
28
28
  isOpen,
29
29
  onClose,
30
- level = 2,
31
- source
30
+ depth = 2,
31
+ source,
32
+ renderCreateDatasetDialog
32
33
  }) {
33
34
  const [selectedDatasetId, setSelectedDatasetId] = React.useState("");
35
+ const [isCreateDatasetOpen, setIsCreateDatasetOpen] = React.useState(false);
34
36
  const [input, setInput] = React.useState("");
35
37
  const [groundTruth, setGroundTruth] = React.useState("");
36
38
  const [expectedTrajectory, setExpectedTrajectory] = React.useState("");
@@ -39,6 +41,15 @@ function SaveAsDatasetItemDialog({
39
41
  const { addItem } = datasets.useDatasetMutations();
40
42
  const { navigate, paths } = lib_framework.useLinkComponent();
41
43
  const datasets$1 = data?.datasets ?? [];
44
+ const isSelectedDatasetListed = datasets$1.some((dataset) => dataset.id === selectedDatasetId);
45
+ const isSelectionLoading = isDatasetsLoading || !!selectedDatasetId && !isSelectedDatasetListed;
46
+ const handleDatasetChange = (value) => {
47
+ if (value === CREATE_DATASET_VALUE) {
48
+ setIsCreateDatasetOpen(true);
49
+ return;
50
+ }
51
+ setSelectedDatasetId(value);
52
+ };
42
53
  const prevOpenRef = React.useRef(false);
43
54
  const trajectorySeededRef = React.useRef(false);
44
55
  const inputSeededRef = React.useRef(false);
@@ -167,98 +178,99 @@ function SaveAsDatasetItemDialog({
167
178
  onClose();
168
179
  };
169
180
  return /* @__PURE__ */ jsxRuntime.jsxs(
170
- sideDialog.SideDialog,
181
+ dataPanel.DataPanel,
171
182
  {
172
- dialogTitle: "Save as Dataset Item",
173
- dialogDescription: "Save data as a dataset item",
174
- isOpen,
175
- onClose,
176
- level,
183
+ open: isOpen,
184
+ onClose: handleCancel,
185
+ title: "Save as Dataset Item",
186
+ description: "Save data as a dataset item",
187
+ depth,
177
188
  children: [
178
- /* @__PURE__ */ jsxRuntime.jsxs(sideDialog.SideDialog.Top, { children: [
179
- breadcrumb,
180
- "›",
181
- /* @__PURE__ */ jsxRuntime.jsxs(textAndIcon.TextAndIcon, { children: [
182
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.DatabaseIcon, {}),
183
- " Save as Dataset Item"
184
- ] })
189
+ /* @__PURE__ */ jsxRuntime.jsxs(dataPanel.DataPanel.Header, { children: [
190
+ /* @__PURE__ */ jsxRuntime.jsxs(dataPanel.DataPanel.Heading, { children: [
191
+ "Save as Dataset Item",
192
+ /* @__PURE__ */ jsxRuntime.jsx("b", { className: "whitespace-nowrap", children: breadcrumb })
193
+ ] }),
194
+ /* @__PURE__ */ jsxRuntime.jsx(dataPanel.DataPanel.HeaderActions, { children: /* @__PURE__ */ jsxRuntime.jsx(dataPanel.DataPanel.CloseButton, { icon: "x", onClick: handleCancel, label: "Close save as dataset item", tooltip: "Close" }) })
185
195
  ] }),
186
- /* @__PURE__ */ jsxRuntime.jsxs(sideDialog.SideDialog.Content, { children: [
187
- /* @__PURE__ */ jsxRuntime.jsx(sideDialog.SideDialog.Header, { children: /* @__PURE__ */ jsxRuntime.jsxs(sideDialog.SideDialog.Heading, { children: [
188
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.DatabaseIcon, {}),
189
- " Save as Dataset Item"
190
- ] }) }),
191
- /* @__PURE__ */ jsxRuntime.jsxs(form.Form, { onSubmit: handleSubmit, children: [
192
- /* @__PURE__ */ jsxRuntime.jsxs(field.Field, { children: [
193
- /* @__PURE__ */ jsxRuntime.jsx(field.FieldLabel, { required: true, children: "Dataset" }),
194
- /* @__PURE__ */ jsxRuntime.jsxs(
195
- select.Select,
196
- {
197
- value: selectedDatasetId,
198
- onValueChange: setSelectedDatasetId,
199
- disabled: addItem.isPending || isDatasetsLoading,
200
- children: [
201
- /* @__PURE__ */ jsxRuntime.jsx(select.SelectTrigger, { children: /* @__PURE__ */ jsxRuntime.jsx(select.SelectValue, { placeholder: isDatasetsLoading ? "Loading datasets..." : "Select a dataset" }) }),
202
- /* @__PURE__ */ jsxRuntime.jsx(select.SelectContent, { children: datasets$1.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(Txt.Txt, { as: "p", variant: "body", tone: "muted", className: "px-2 py-4 text-center", children: "No datasets available" }) : datasets$1.map((dataset) => /* @__PURE__ */ jsxRuntime.jsx(select.SelectItem, { value: dataset.id, children: dataset.name }, dataset.id)) })
203
- ]
204
- }
205
- )
206
- ] }),
207
- /* @__PURE__ */ jsxRuntime.jsxs(field.Field, { children: [
208
- /* @__PURE__ */ jsxRuntime.jsx(field.FieldLabel, { required: true, children: "Input (JSON)" }),
209
- /* @__PURE__ */ jsxRuntime.jsx(codeEditor.CodeEditor, { value: input, onChange: handleInputChange, showCopyButton: false, className: "min-h-30" })
210
- ] }),
211
- /* @__PURE__ */ jsxRuntime.jsxs(field.Field, { children: [
212
- /* @__PURE__ */ jsxRuntime.jsx(field.FieldLabel, { children: "Ground Truth (JSON, optional)" }),
213
- /* @__PURE__ */ jsxRuntime.jsx(
214
- codeEditor.CodeEditor,
215
- {
216
- value: groundTruth,
217
- onChange: handleGroundTruthChange,
218
- showCopyButton: false,
219
- className: "min-h-20"
220
- }
221
- )
222
- ] }),
223
- /* @__PURE__ */ jsxRuntime.jsxs(field.Field, { children: [
224
- /* @__PURE__ */ jsxRuntime.jsx(field.FieldLabel, { children: "Expected Trajectory (JSON, optional)" }),
225
- /* @__PURE__ */ jsxRuntime.jsx(
226
- codeEditor.CodeEditor,
227
- {
228
- value: expectedTrajectory,
229
- onChange: handleExpectedTrajectoryChange,
230
- showCopyButton: false,
231
- className: "min-h-20"
232
- }
233
- )
234
- ] }),
235
- /* @__PURE__ */ jsxRuntime.jsxs(field.Field, { children: [
236
- /* @__PURE__ */ jsxRuntime.jsx(field.FieldLabel, { children: "Tool Mocks (JSON, optional)" }),
237
- /* @__PURE__ */ jsxRuntime.jsx(
238
- codeEditor.CodeEditor,
239
- {
240
- value: toolMocks,
241
- onChange: handleToolMocksChange,
242
- showCopyButton: false,
243
- className: "min-h-20"
244
- }
245
- )
246
- ] }),
247
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-2 pt-4", children: [
248
- /* @__PURE__ */ jsxRuntime.jsx(Button.Button, { icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, {}), type: "button", onClick: handleCancel, children: "Cancel" }),
249
- /* @__PURE__ */ jsxRuntime.jsx(
250
- Button.Button,
251
- {
252
- icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, {}),
253
- type: "submit",
254
- variant: "default",
255
- disabled: addItem.isPending || trajectoryLoading || !selectedDatasetId || datasets$1.length === 0,
256
- children: addItem.isPending ? "Saving..." : trajectoryLoading ? "Loading..." : "Save Item"
257
- }
258
- )
259
- ] })
196
+ /* @__PURE__ */ jsxRuntime.jsx(dataPanel.DataPanel.Content, { children: /* @__PURE__ */ jsxRuntime.jsxs(form.Form, { onSubmit: handleSubmit, children: [
197
+ /* @__PURE__ */ jsxRuntime.jsxs(field.Field, { children: [
198
+ /* @__PURE__ */ jsxRuntime.jsx(field.FieldLabel, { required: true, children: "Dataset" }),
199
+ /* @__PURE__ */ jsxRuntime.jsxs(
200
+ select.Select,
201
+ {
202
+ value: isSelectedDatasetListed ? selectedDatasetId : null,
203
+ onValueChange: handleDatasetChange,
204
+ disabled: addItem.isPending || isSelectionLoading,
205
+ children: [
206
+ /* @__PURE__ */ jsxRuntime.jsx(select.SelectTrigger, { children: /* @__PURE__ */ jsxRuntime.jsx(select.SelectValue, { placeholder: isSelectionLoading ? "Loading datasets..." : "Select a dataset" }) }),
207
+ /* @__PURE__ */ jsxRuntime.jsxs(select.SelectContent, { children: [
208
+ renderCreateDatasetDialog && /* @__PURE__ */ jsxRuntime.jsx(select.SelectItem, { value: CREATE_DATASET_VALUE, children: "Create dataset" }),
209
+ datasets$1.length === 0 ? !renderCreateDatasetDialog && /* @__PURE__ */ jsxRuntime.jsx(Txt.Txt, { as: "p", variant: "body", tone: "muted", className: "px-2 py-4 text-center", children: "No datasets available" }) : datasets$1.map((dataset) => /* @__PURE__ */ jsxRuntime.jsx(select.SelectItem, { value: dataset.id, children: dataset.name }, dataset.id))
210
+ ] })
211
+ ]
212
+ }
213
+ )
214
+ ] }),
215
+ /* @__PURE__ */ jsxRuntime.jsxs(field.Field, { children: [
216
+ /* @__PURE__ */ jsxRuntime.jsx(field.FieldLabel, { required: true, children: "Input (JSON)" }),
217
+ /* @__PURE__ */ jsxRuntime.jsx(codeEditor.CodeEditor, { value: input, onChange: handleInputChange, showCopyButton: false, className: "min-h-30" })
218
+ ] }),
219
+ /* @__PURE__ */ jsxRuntime.jsxs(field.Field, { children: [
220
+ /* @__PURE__ */ jsxRuntime.jsx(field.FieldLabel, { children: "Ground Truth (JSON, optional)" }),
221
+ /* @__PURE__ */ jsxRuntime.jsx(
222
+ codeEditor.CodeEditor,
223
+ {
224
+ value: groundTruth,
225
+ onChange: handleGroundTruthChange,
226
+ showCopyButton: false,
227
+ className: "min-h-20"
228
+ }
229
+ )
230
+ ] }),
231
+ /* @__PURE__ */ jsxRuntime.jsxs(field.Field, { children: [
232
+ /* @__PURE__ */ jsxRuntime.jsx(field.FieldLabel, { children: "Expected Trajectory (JSON, optional)" }),
233
+ /* @__PURE__ */ jsxRuntime.jsx(
234
+ codeEditor.CodeEditor,
235
+ {
236
+ value: expectedTrajectory,
237
+ onChange: handleExpectedTrajectoryChange,
238
+ showCopyButton: false,
239
+ className: "min-h-20"
240
+ }
241
+ )
242
+ ] }),
243
+ /* @__PURE__ */ jsxRuntime.jsxs(field.Field, { children: [
244
+ /* @__PURE__ */ jsxRuntime.jsx(field.FieldLabel, { children: "Tool Mocks (JSON, optional)" }),
245
+ /* @__PURE__ */ jsxRuntime.jsx(
246
+ codeEditor.CodeEditor,
247
+ {
248
+ value: toolMocks,
249
+ onChange: handleToolMocksChange,
250
+ showCopyButton: false,
251
+ className: "min-h-20"
252
+ }
253
+ )
254
+ ] }),
255
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-2 pt-4", children: [
256
+ /* @__PURE__ */ jsxRuntime.jsx(Button.Button, { icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, {}), type: "button", onClick: handleCancel, children: "Cancel" }),
257
+ /* @__PURE__ */ jsxRuntime.jsx(
258
+ Button.Button,
259
+ {
260
+ icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, {}),
261
+ type: "submit",
262
+ variant: "default",
263
+ disabled: addItem.isPending || trajectoryLoading || !isSelectedDatasetListed,
264
+ children: addItem.isPending ? "Saving..." : trajectoryLoading ? "Loading..." : "Save Item"
265
+ }
266
+ )
260
267
  ] })
261
- ] })
268
+ ] }) }),
269
+ renderCreateDatasetDialog?.({
270
+ open: isCreateDatasetOpen,
271
+ onOpenChange: setIsCreateDatasetOpen,
272
+ onSuccess: setSelectedDatasetId
273
+ })
262
274
  ]
263
275
  }
264
276
  );
@@ -1 +1 @@
1
- {"version":3,"file":"save-as-dataset-item-dialog.cjs.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":["useState","useDatasets","useDatasetMutations","useLinkComponent","datasets","useRef","useEffect","toast","jsxs","SideDialog","TextAndIcon","jsx","DatabaseIcon","Form","Field","FieldLabel","Select","SelectTrigger","SelectValue","SelectContent","Txt","SelectItem","CodeEditor","Button","X","Check"],"mappings":"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"}
1
+ {"version":3,"file":"save-as-dataset-item-dialog.cjs.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":["useState","useDatasets","useDatasetMutations","useLinkComponent","datasets","useRef","useEffect","toast","jsxs","DataPanel","jsx","Form","Field","FieldLabel","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Txt","CodeEditor","Button","X","Check"],"mappings":"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"}