@mastra/playground-ui 65.0.0-alpha.12 → 65.0.0-alpha.13

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 (135) hide show
  1. package/dist/components/Button.cjs.js +1 -1
  2. package/dist/components/Button.es.js +1 -1
  3. package/dist/components/CommandPalette.cjs.js +1 -1
  4. package/dist/components/CommandPalette.es.js +1 -1
  5. package/dist/components/DataList.cjs.js +17 -15
  6. package/dist/components/DataList.cjs.js.map +1 -1
  7. package/dist/components/DataList.es.js +5 -4
  8. package/dist/components/DataList.es.js.map +1 -1
  9. package/dist/components/EnvironmentVariablesEditor.cjs.js +1 -1
  10. package/dist/components/EnvironmentVariablesEditor.es.js +1 -1
  11. package/dist/components/FilterBar.cjs.js +2 -2
  12. package/dist/components/FilterBar.es.js +2 -2
  13. package/dist/components/Kbd.cjs.js +1 -1
  14. package/dist/components/Kbd.es.js +1 -1
  15. package/dist/components/LogsDataList.cjs.js +2 -5
  16. package/dist/components/LogsDataList.cjs.js.map +1 -1
  17. package/dist/components/LogsDataList.es.js +2 -5
  18. package/dist/components/LogsDataList.es.js.map +1 -1
  19. package/dist/components/SavedViews.cjs.js +1 -1
  20. package/dist/components/SavedViews.es.js +1 -1
  21. package/dist/components/Sidebar.cjs.js +63 -59
  22. package/dist/components/Sidebar.cjs.js.map +1 -1
  23. package/dist/components/Sidebar.es.js +64 -61
  24. package/dist/components/Sidebar.es.js.map +1 -1
  25. package/dist/data-list-CNE43dvA.js +138 -0
  26. package/dist/data-list-CNE43dvA.js.map +1 -0
  27. package/dist/data-list-GysSTouz.cjs +142 -0
  28. package/dist/data-list-GysSTouz.cjs.map +1 -0
  29. package/dist/{data-list-skeleton-DY0F40WQ.cjs → data-list-skeleton-B4fWheXy.cjs} +6 -6
  30. package/dist/{data-list-skeleton-DY0F40WQ.cjs.map → data-list-skeleton-B4fWheXy.cjs.map} +1 -1
  31. package/dist/{data-list-skeleton-Drzrws2O.js → data-list-skeleton-DEsAkWzg.js} +2 -2
  32. package/dist/{data-list-skeleton-Drzrws2O.js.map → data-list-skeleton-DEsAkWzg.js.map} +1 -1
  33. package/dist/data-list-spacer-D8nS9lSi.cjs +218 -0
  34. package/dist/data-list-spacer-D8nS9lSi.cjs.map +1 -0
  35. package/dist/data-list-spacer-DyJPUaKa.js +209 -0
  36. package/dist/data-list-spacer-DyJPUaKa.js.map +1 -0
  37. package/dist/{data-list-DlXU1PLQ.cjs → data-list-top-Bh9IIrxB.cjs} +39 -342
  38. package/dist/data-list-top-Bh9IIrxB.cjs.map +1 -0
  39. package/dist/{data-list-DATsbxcn.js → data-list-top-Bx8mU5aQ.js} +30 -334
  40. package/dist/data-list-top-Bx8mU5aQ.js.map +1 -0
  41. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +0 -2
  42. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js.map +1 -1
  43. package/dist/domains/chat/tools/badges/workflow-badge.es.js +0 -2
  44. package/dist/domains/chat/tools/badges/workflow-badge.es.js.map +1 -1
  45. package/dist/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.cjs.js +19 -11
  46. package/dist/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.cjs.js.map +1 -1
  47. package/dist/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.es.js +19 -11
  48. package/dist/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.es.js.map +1 -1
  49. package/dist/domains/datasets/components/add-dataset-item-dialog/build-add-item-payload.cjs.js +7 -8
  50. package/dist/domains/datasets/components/add-dataset-item-dialog/build-add-item-payload.cjs.js.map +1 -1
  51. package/dist/domains/datasets/components/add-dataset-item-dialog/build-add-item-payload.es.js +7 -8
  52. package/dist/domains/datasets/components/add-dataset-item-dialog/build-add-item-payload.es.js.map +1 -1
  53. package/dist/domains/logs/components/logs-list-view.cjs.js +2 -3
  54. package/dist/domains/logs/components/logs-list-view.cjs.js.map +1 -1
  55. package/dist/domains/logs/components/logs-list-view.es.js +2 -3
  56. package/dist/domains/logs/components/logs-list-view.es.js.map +1 -1
  57. package/dist/domains/observability/components/trace-as-item-dialog.cjs.js +14 -2
  58. package/dist/domains/observability/components/trace-as-item-dialog.cjs.js.map +1 -1
  59. package/dist/domains/observability/components/trace-as-item-dialog.es.js +14 -2
  60. package/dist/domains/observability/components/trace-as-item-dialog.es.js.map +1 -1
  61. package/dist/domains/scores/components/trace-scores-tab.cjs.js +1 -2
  62. package/dist/domains/scores/components/trace-scores-tab.cjs.js.map +1 -1
  63. package/dist/domains/scores/components/trace-scores-tab.es.js +1 -2
  64. package/dist/domains/scores/components/trace-scores-tab.es.js.map +1 -1
  65. package/dist/domains/traces/components/trace-data-panel.cjs.js +0 -2
  66. package/dist/domains/traces/components/trace-data-panel.cjs.js.map +1 -1
  67. package/dist/domains/traces/components/trace-data-panel.es.js +0 -2
  68. package/dist/domains/traces/components/trace-data-panel.es.js.map +1 -1
  69. package/dist/domains/traces/components/trace-error-cell.cjs.js +1 -3
  70. package/dist/domains/traces/components/trace-error-cell.cjs.js.map +1 -1
  71. package/dist/domains/traces/components/trace-error-cell.es.js +1 -3
  72. package/dist/domains/traces/components/trace-error-cell.es.js.map +1 -1
  73. package/dist/domains/traces/components/trace-time-range-chip.cjs.js +1 -1
  74. package/dist/domains/traces/components/trace-time-range-chip.es.js +1 -1
  75. package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.cjs.js +2 -2
  76. package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.es.js +2 -2
  77. package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.cjs.js +1 -1
  78. package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.es.js +1 -1
  79. package/dist/domains/traces/components/traces-list-view.cjs.js +5 -4
  80. package/dist/domains/traces/components/traces-list-view.cjs.js.map +1 -1
  81. package/dist/domains/traces/components/traces-list-view.es.js +4 -3
  82. package/dist/domains/traces/components/traces-list-view.es.js.map +1 -1
  83. package/dist/domains/traces/components/traces-page-skeleton.cjs.js +1 -4
  84. package/dist/domains/traces/components/traces-page-skeleton.cjs.js.map +1 -1
  85. package/dist/domains/traces/components/traces-page-skeleton.es.js +1 -4
  86. package/dist/domains/traces/components/traces-page-skeleton.es.js.map +1 -1
  87. package/dist/domains/workflows/components/workflows-list/workflows-list.cjs.js +2 -2
  88. package/dist/domains/workflows/components/workflows-list/workflows-list.es.js +2 -2
  89. package/dist/ee/signals/components/entity-index-list.cjs.js +1 -3
  90. package/dist/ee/signals/components/entity-index-list.cjs.js.map +1 -1
  91. package/dist/ee/signals/components/entity-index-list.es.js +1 -3
  92. package/dist/ee/signals/components/entity-index-list.es.js.map +1 -1
  93. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +1 -3
  94. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js.map +1 -1
  95. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +1 -3
  96. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js.map +1 -1
  97. package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +1 -1
  98. package/dist/ee/topics/components/topic-trace-summary-list.es.js +1 -1
  99. package/dist/{filter-bar-C6NdZctn.cjs → filter-bar-CjBb01b6.cjs} +3 -3
  100. package/dist/{filter-bar-C6NdZctn.cjs.map → filter-bar-CjBb01b6.cjs.map} +1 -1
  101. package/dist/{filter-bar-chip-DgvuQv6c.cjs → filter-bar-chip-C_64m7nX.cjs} +2 -2
  102. package/dist/{filter-bar-chip-DgvuQv6c.cjs.map → filter-bar-chip-C_64m7nX.cjs.map} +1 -1
  103. package/dist/{filter-bar-chip-DM73lTpx.js → filter-bar-chip-D2kKMSRA.js} +2 -2
  104. package/dist/{filter-bar-chip-DM73lTpx.js.map → filter-bar-chip-D2kKMSRA.js.map} +1 -1
  105. package/dist/{filter-bar-DW0fD4bu.js → filter-bar-pXSJt2ye.js} +3 -3
  106. package/dist/{filter-bar-DW0fD4bu.js.map → filter-bar-pXSJt2ye.js.map} +1 -1
  107. package/dist/{kbd-Xgv5HKEi.cjs → kbd-B2zbS_A6.cjs} +2 -2
  108. package/dist/{kbd-Xgv5HKEi.cjs.map → kbd-B2zbS_A6.cjs.map} +1 -1
  109. package/dist/{kbd-7Xx2pm9f.js → kbd-CYtMrOov.js} +2 -2
  110. package/dist/{kbd-7Xx2pm9f.js.map → kbd-CYtMrOov.js.map} +1 -1
  111. package/dist/layout/tabbed-container.cjs.js +1 -1
  112. package/dist/layout/tabbed-container.es.js +1 -1
  113. package/dist/{logs-data-list-eoGKicgL.js → logs-data-list-C0MU5rID.js} +3 -2
  114. package/dist/{logs-data-list-eoGKicgL.js.map → logs-data-list-C0MU5rID.js.map} +1 -1
  115. package/dist/{logs-data-list-DEZuSjqt.cjs → logs-data-list-D3bYEiD_.cjs} +22 -21
  116. package/dist/{logs-data-list-DEZuSjqt.cjs.map → logs-data-list-D3bYEiD_.cjs.map} +1 -1
  117. package/dist/resize/collapsible-panel.cjs.js +1 -1
  118. package/dist/resize/collapsible-panel.es.js +1 -1
  119. package/dist/src/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.d.ts +2 -2
  120. package/dist/src/domains/datasets/components/add-dataset-item-dialog/build-add-item-payload.d.ts +2 -0
  121. package/dist/src/ds/components/DataList/data-list-root.d.ts +2 -0
  122. package/dist/src/ds/components/Sidebar/header/sidebar-badge.d.ts +7 -0
  123. package/dist/src/ds/components/Sidebar/header/sidebar-button-hint.d.ts +7 -0
  124. package/dist/src/ds/components/Sidebar/header/sidebar-search-trigger.d.ts +14 -3
  125. package/dist/src/ds/components/Sidebar/index.d.ts +1 -0
  126. package/dist/src/ds/components/Sidebar/root/sidebar-trigger.d.ts +2 -2
  127. package/dist/src/ds/components/Sidebar/sidebar.d.ts +5 -1
  128. package/dist/style.css +25 -9
  129. package/dist/{traces-data-list-CcxqCHkj.js → traces-data-list-CZSWoHpd.js} +4 -2
  130. package/dist/{traces-data-list-CcxqCHkj.js.map → traces-data-list-CZSWoHpd.js.map} +1 -1
  131. package/dist/{traces-data-list-mCKFilYu.cjs → traces-data-list-CqQ5d-M1.cjs} +20 -18
  132. package/dist/{traces-data-list-mCKFilYu.cjs.map → traces-data-list-CqQ5d-M1.cjs.map} +1 -1
  133. package/package.json +6 -6
  134. package/dist/data-list-DATsbxcn.js.map +0 -1
  135. package/dist/data-list-DlXU1PLQ.cjs.map +0 -1
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCO,MAAM,gBAAgB,CAAC;AAAA,EAC5B,MAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,oBAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,KAA0B;AACxB,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,UAAU,EAAC;AACrC,EAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,iBAAA,KAAsB,WAAA,CAAY;AAAA,IACnE,UAAA;AAAA,IACA,cAAA,EAAgB,uBAAA,CAAwB,UAAA,EAAY,UAAU,EAAE,CAAC,CAAA;AAAA,IACjE,YAAA,EAAc,EAAE,OAAA,EAAS,OAAA,CAAQ,UAAU,CAAA;AAAE,GAC9C,CAAA;AACD,EAAA,MAAM,eAAA,GAAkB,QAAA,EAAU,IAAA,KAAS,SAAA,GAAY,SAAS,eAAA,GAAkB,MAAA;AAClF,EAAA,MAAM,kBACJ,QAAA,EAAU,IAAA,KAAS,YAAa,eAAA,EAAiB,eAAA,IAAmB,SAAS,eAAA,GAAmB,MAAA;AAClG,EAAA,MAAM,oBAAoB,QAAA,EAAU,IAAA,KAAS,SAAA,GAAa,eAAA,IAAmB,SAAS,UAAA,GAAc,MAAA;AAEpG,EAAA,MAAM,OAAA,GAAA,CACH,QAAA,EAAU,IAAA,KAAS,QAAA,IAAY,QAAA,EAAU,IAAA,KAAS,UAAA,KAAe,QAAA,EAAU,eAAA,GACxE,QAAA,CAAS,eAAA,CAAgB,UAAU,CAAA,GACnC,MAAA;AAEN,EAAA,IAAI,qBACF,OAAO,cAAA,KAAmB,QAAA,mBACxB,GAAA,CAAC,gBAAa,QAAA,EAAU,cAAA,EAAgB,SAAA,EAAU,uBAAA,EAC/C,0BACH,CAAA,mBAEA,GAAA,CAAC,cAAW,IAAA,EAAM,cAAA,EAAgB,eAAY,sBAAA,EAAuB,CAAA;AAGzE,EAAA,IAAI,iBAAA,IAAqB,CAAC,QAAA,EAAU,2BAAQ,YAAA,EAAA,EAAa,CAAA;AAEzD,EAAA,MAAM,oBAAA,GAAuB,UAAA,IAAc,CAAC,CAAC,MAAA;AAC7C,EAAA,MAAM,QAAA,GAAW,WAAA,IAAe,OAAA,CAAQ,KAAK,CAAA;AAC7C,EAAA,MAAM,OAAA,GACJ,QAAA,IACA,OAAA,CAAQ,cAAc,CAAA,IACtB,mBAAmB,EAAE,oBAAA,EAAsB,UAAA,EAAY,oBAAA,EAAsB,CAAA;AAE/E,EAAA,uBACE,GAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,QAAA,EAAU;AAAA,QACR,UAAA,EAAY,oBAAA;AAAA,QACZ,UAAA;AAAA,QACA,oBAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA;AAAA,QACA,cAAA,EAAgB,UAAU,IAAA,KAAS;AAAA,OACrC;AAAA,MACA,aAAA,EAAY,gBAAA;AAAA,MACZ,IAAA,kBAAM,GAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,oBAAA,EAAqB,CAAA;AAAA,MACnD,OAAO,QAAA,CAAS,IAAA;AAAA,MAChB,gBAAA,EAAkB,KAAA;AAAA,MAClB,SAAA,EACE,QAAA,EAAU,IAAA,KAAS,SAAA,mBACjB,GAAA;AAAA,QAAC,kCAAA;AAAA,QAAA;AAAA,UACC,iBAAiB,eAAA,IAAmB,EAAA;AAAA,UACpC,KAAA,EAAO;AAAA;AAAA,OACT,GACE,SAAS,MAAA,IAAU,OAAA,EAAS,4BAC9B,GAAA,CAAC,mCAAA,EAAA,EAAoC,cAAA,EAAgB,OAAA,EAAS,CAAA,GAC5D,IAAA;AAAA,MAGL,qCACC,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,QAAA,CAAC,WAAA,IAAe,KAAA,oBACf,GAAA,CAAC,6BAAA,EAAA,EAA8B,YAAwB,YAAA,EAAc,KAAA,EAAO,iBAAA,EAAiB,IAAA,EAC3F,QAAA,kBAAA,GAAA,CAAC,qBAAA,EAAA,EAAsB,UAAA,EAAwB,QAAA,EAAoB,OAAc,CAAA,EACnF,CAAA;AAAA,QAGD,WAAA,oBAAe,GAAA,CAAC,qBAAA,EAAA,EAAsB,UAAA,EAAwB,UAAoB,KAAA,EAAc,CAAA;AAAA,QAEhG,kBAAA,KAAuB,MAAA,IAAa,cAAA,oBACnC,IAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,gBAAa,QAAA,EAAA,0BAAA,EAAwB,CAAA;AAAA,UACrC;AAAA,SAAA,EACH;AAAA,OAAA,EAEJ;AAAA;AAAA,GAEJ;AAEJ;AAQA,MAAM,wBAAwB,CAAC,EAAE,UAAA,EAAY,QAAA,EAAU,OAAM,KAAkC;AAC7F,EAAA,MAAM,cAAA,GAAiB,uBAAA,CAAwB,UAAA,EAAY,UAAU,EAAE,CAAC,CAAA;AACxE,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,gBAAA,EAAiB;AAClC,EAAA,MAAM,EAAE,2BAAA,EAA4B,GAAI,UAAA,CAAW,kBAAkB,CAAA;AAErE,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8BAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,IAAA,kBAAM,GAAA,CAAC,YAAA,EAAA,EAAa,CAAA,EAAI,MAAA,kBAAQ,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,CAAA,WAAA,EAAc,UAAU,CAAA,MAAA,CAAA,EAAU,GAAI,QAAA,EAAA,gBAAA,EAE1F,CAAA;AAAA,MACC,yBACC,GAAA,CAAC,MAAA,EAAA,EAAO,IAAA,kBAAM,GAAA,CAAC,OAAI,CAAA,EAAI,MAAA,kBAAQ,GAAA,CAAC,IAAA,EAAA,EAAK,MAAM,CAAA,WAAA,EAAc,UAAU,UAAU,KAAK,CAAA,CAAA,EAAI,GAAI,QAAA,EAAA,SAAA,EAE1F;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAEA,GAAA,CAAC,4BAAA,EAAA,EACC,QAAA,kBAAA,IAAA,CAAC,0BAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,4CAAA,EACb,QAAA,kBAAA,GAAA;AAAA,QAAC,aAAA;AAAA,QAAA;AAAA,UACC,UAAA;AAAA,UACA,QAAA;AAAA,UACA,SAAA,EAAW,2BAAA;AAAA,UACX;AAAA;AAAA,OACF,EACF,CAAA;AAAA,sBACA,GAAA,CAAC,2BAAwB,cAAA,EAAgC;AAAA,KAAA,EAC3D,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA;AAEA,MAAM,uBAAA,GAA0B,CAAC,EAAE,cAAA,EAAe,KAA+C;AAC/F,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,qBAAA,EAAsB;AAC7C,EAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AACxB,EAAA,2BACG,KAAA,EAAA,EAAI,SAAA,EAAU,iGACb,QAAA,kBAAA,GAAA,CAAC,yBAAA,EAAA,EAA0B,gBAAgC,CAAA,EAC7D,CAAA;AAEJ,CAAA;AAGO,MAAM,iBAAA,GAAoB,CAAC,iBAAA,KAAgD;AAChF,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,UAAA,CAAW,kBAAkB,CAAA;AAEnD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACxB,IAAA,SAAA,CAAU,iBAAiB,CAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,iBAAA,EAAmB,SAAS,CAAC,CAAA;AACnC;;;;"}
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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"}
@@ -70,6 +70,14 @@ const STEPS = {
70
70
  };
71
71
  const GROUND_TRUTH_PLACEHOLDER = '{ "text": "The answer you expect" }';
72
72
  const hasContent = (value) => !["", "{}"].includes(value.trim());
73
+ const isJson = (value) => {
74
+ try {
75
+ JSON.parse(value);
76
+ return true;
77
+ } catch {
78
+ return false;
79
+ }
80
+ };
73
81
  const STEP_COUNT = Object.keys(STEPS).length;
74
82
  const STEP_OF_FIELD = {
75
83
  input: 1,
@@ -183,7 +191,7 @@ function AddDatasetItemForm({
183
191
  const errorOf = (field) => formError?.field === field ? formError.message : void 0;
184
192
  const apiErrorsOf = (field) => apiErrors?.field === field ? apiErrors.errors : [];
185
193
  const isInvalid = (field) => Boolean(errorOf(field)) || apiErrorsOf(field).length > 0;
186
- const editJson = (field) => (value) => {
194
+ const editField = (field) => (value) => {
187
195
  update(() => ({ [field]: value }));
188
196
  setApiErrors(void 0);
189
197
  };
@@ -205,15 +213,15 @@ function AddDatasetItemForm({
205
213
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid items-start gap-5 sm:grid-cols-2", children: [
206
214
  /* @__PURE__ */ jsxRuntime.jsxs(field.Field, { invalid: isInvalid("input"), children: [
207
215
  /* @__PURE__ */ jsxRuntime.jsx(field.FieldLabel, { required: true, children: "Input" }),
208
- /* @__PURE__ */ jsxRuntime.jsx(field.FieldDescription, { children: "What the target receives when this item runs." }),
216
+ /* @__PURE__ */ jsxRuntime.jsx(field.FieldDescription, { children: "What the target receives when this item runs. JSON or plain text." }),
209
217
  /* @__PURE__ */ jsxRuntime.jsx(
210
218
  codeEditor.CodeEditor,
211
219
  {
212
220
  value: draft.input,
213
- onChange: editJson("input"),
214
- "aria-label": "Input JSON",
221
+ onChange: editField("input"),
222
+ "aria-label": "Input",
215
223
  showCopyButton: hasContent(draft.input),
216
- showFormatButton: hasContent(draft.input),
224
+ showFormatButton: hasContent(draft.input) && isJson(draft.input),
217
225
  className: "h-[220px]"
218
226
  }
219
227
  ),
@@ -222,16 +230,16 @@ function AddDatasetItemForm({
222
230
  ] }),
223
231
  /* @__PURE__ */ jsxRuntime.jsxs(field.Field, { invalid: isInvalid("groundTruth"), children: [
224
232
  /* @__PURE__ */ jsxRuntime.jsx(field.FieldLabel, { children: "Ground truth" }),
225
- /* @__PURE__ */ jsxRuntime.jsx(field.FieldDescription, { children: "The expected answer scorers compare against." }),
233
+ /* @__PURE__ */ jsxRuntime.jsx(field.FieldDescription, { children: "The expected answer scorers compare against. JSON or plain text." }),
226
234
  /* @__PURE__ */ jsxRuntime.jsx(
227
235
  codeEditor.CodeEditor,
228
236
  {
229
237
  value: draft.groundTruth,
230
- onChange: editJson("groundTruth"),
231
- "aria-label": "Ground truth JSON",
238
+ onChange: editField("groundTruth"),
239
+ "aria-label": "Ground truth",
232
240
  placeholder: GROUND_TRUTH_PLACEHOLDER,
233
241
  showCopyButton: hasContent(draft.groundTruth),
234
- showFormatButton: hasContent(draft.groundTruth),
242
+ showFormatButton: hasContent(draft.groundTruth) && isJson(draft.groundTruth),
235
243
  className: "h-[220px]"
236
244
  }
237
245
  ),
@@ -245,7 +253,7 @@ function AddDatasetItemForm({
245
253
  codeEditor.CodeEditor,
246
254
  {
247
255
  value: draft.toolMocks,
248
- onChange: editJson("toolMocks"),
256
+ onChange: editField("toolMocks"),
249
257
  "aria-label": "Tool mocks JSON",
250
258
  placeholder: TOOL_MOCKS_PLACEHOLDER,
251
259
  showCopyButton: hasContent(draft.toolMocks),
@@ -269,7 +277,7 @@ function AddDatasetItemForm({
269
277
  codeEditor.CodeEditor,
270
278
  {
271
279
  value: draft.requestContext,
272
- onChange: editJson("requestContext"),
280
+ onChange: editField("requestContext"),
273
281
  "aria-label": "Request context JSON",
274
282
  placeholder: requestContextPlaceholder(targetDataset?.requestContextSchema),
275
283
  showCopyButton: hasContent(draft.requestContext),
@@ -1 +1 @@
1
- {"version":3,"file":"add-dataset-item-dialog.cjs.js","sources":["../../../../../src/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.tsx"],"sourcesContent":["import type { AddDatasetItemParams } from '@mastra/client-js';\nimport { useDataset, useDatasetMutations, useDatasets } from '@mastra/react/hooks/datasets';\nimport { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport type { CreateDatasetDialogRenderProps } from '../save-as-dataset-item-dialog';\nimport { buildAddItemPayload } from './build-add-item-payload';\nimport type { AddItemDraft, AddItemError, AddItemField } from './build-add-item-payload';\nimport { CollapsibleSettingsRow } from './collapsible-settings-row';\nimport { DatasetFieldErrors } from './dataset-field-errors';\nimport { DatasetPicker } from './dataset-picker';\nimport { parseFieldErrors } from './field-errors';\nimport type { FieldErrors } from './field-errors';\nimport { TrajectoryEditor } from './trajectory-editor';\nimport { toTrajectoryStepRow } from './trajectory-types';\nimport type { TrajectoryExpectation } from './trajectory-types';\nimport { useTargetAgentTools } from './use-target-agent-tools';\nimport { Badge } from '@/ds/components/Badge';\nimport { Button } from '@/ds/components/Button';\nimport { CodeEditor } from '@/ds/components/CodeEditor';\nimport {\n Dialog,\n DialogAction,\n DialogBody,\n DialogCancel,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/ds/components/Dialog';\nimport { Field, FieldDescription, FieldError, FieldLabel } from '@/ds/components/Field';\nimport { Txt } from '@/ds/components/Txt';\nimport { SettingsContainer } from '@/ds/new/settings';\nimport { useLinkComponent } from '@/lib/framework';\nimport { cn } from '@/lib/utils';\nimport { toast } from '@/utils/toast';\n\nexport interface AddDatasetItemDialogProps {\n /** The dataset to add the item to. Without it, the dialog asks which dataset. */\n datasetId?: string;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSuccess?: () => void;\n /** Raw JSON prefilled in the input editor. */\n initialInput?: string;\n /** Raw JSON prefilled in the ground truth editor. */\n initialGroundTruth?: string;\n /** Raw JSON array prefilled in the tool mocks editor. */\n initialToolMocks?: string;\n /** Steps prefilled in the trajectory editor; switches the expected trajectory on. */\n initialTrajectory?: TrajectoryExpectation;\n /** Where the item comes from; sent as is. */\n source?: AddDatasetItemParams['source'];\n /** Renders a create-dataset dialog, offered first in the dataset picker. The created dataset gets picked. */\n renderCreateDatasetDialog?: (props: CreateDatasetDialogRenderProps) => ReactNode;\n}\n\ntype InitialValues = Pick<\n AddDatasetItemDialogProps,\n 'initialInput' | 'initialGroundTruth' | 'initialToolMocks' | 'initialTrajectory'\n>;\n\nconst initialDraft = ({\n initialInput,\n initialGroundTruth,\n initialToolMocks,\n initialTrajectory,\n}: InitialValues): AddItemDraft => {\n const steps = initialTrajectory?.steps ?? [];\n return {\n input: initialInput ?? '{}',\n groundTruth: initialGroundTruth ?? '',\n toolMocks: initialToolMocks ?? '',\n requestContextEnabled: false,\n requestContext: '',\n trajectoryEnabled: steps.length > 0,\n ordering: initialTrajectory?.ordering ?? 'relaxed',\n trajectorySteps: steps.map(toTrajectoryStepRow),\n };\n};\n\nconst TOOL_MOCKS_PLACEHOLDER = `[\n { \"toolName\": \"getWeather\", \"args\": { \"city\": \"Paris\" }, \"output\": { \"temp\": 18 } },\n { \"toolName\": \"getForecast\", \"args\": {}, \"output\": { \"days\": 5 }, \"matchArgs\": \"ignore\" }\n]`;\n\n/** The keys of the dataset's request context schema, as a JSON object to fill in. */\nconst requestContextPlaceholder = (schema: unknown) => {\n const properties = typeof schema === 'object' && schema !== null && 'properties' in schema ? schema.properties : {};\n const keys = typeof properties === 'object' && properties !== null ? Object.keys(properties) : [];\n if (keys.length === 0) return '{ \"tenantId\": \"acme\" }';\n return JSON.stringify(Object.fromEntries(keys.map(key => [key, ''])), null, 2);\n};\n\ntype WizardStep = 1 | 2 | 3;\n\n/** Only steps whose fields don't describe themselves carry a description. */\nconst STEPS: Record<WizardStep, { title: string; description?: ReactNode; optional?: boolean }> = {\n 1: { title: 'Input and ground truth' },\n 2: {\n title: 'Tool mocks',\n optional: true,\n description:\n 'Return fixed results instead of running the real tools. When the target calls a tool listed here with the same args, it gets your output back. Leave empty to run tools for real.',\n },\n 3: {\n title: 'Context and trajectory',\n optional: true,\n description:\n 'Pass values to the run, or check the steps the target takes. Leave both off to add the item without them.',\n },\n};\n\nconst GROUND_TRUTH_PLACEHOLDER = '{ \"text\": \"The answer you expect\" }';\n\n/** Copying an editor that holds nothing worth copying is noise. */\nconst hasContent = (value: string) => !['', '{}'].includes(value.trim());\n\nconst STEP_COUNT = Object.keys(STEPS).length;\n\nconst STEP_OF_FIELD: Record<AddItemField, WizardStep> = {\n input: 1,\n groundTruth: 1,\n toolMocks: 2,\n requestContext: 3,\n expectedTrajectory: 3,\n};\n\nconst isAddItemField = (field: string): field is AddItemField => field in STEP_OF_FIELD;\n\nconst stepTransition = 'animate-in fade-in slide-in-from-bottom-2 duration-200 motion-reduce:animate-none';\n\n/**\n * Add an item to a dataset in three steps: the input and its expected answer, tool mocks, then the request\n * context and expected trajectory. Only the first step is required; the others can be left empty.\n */\nexport function AddDatasetItemDialog({ open, onOpenChange, ...props }: AddDatasetItemDialogProps) {\n const { addItem } = useDatasetMutations();\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange} pending={addItem.isPending}>\n <DialogContent size=\"xl\">\n {/* The form unmounts on close, so every open starts fresh from the initial values. */}\n <AddDatasetItemForm {...props} addItem={addItem} onOpenChange={onOpenChange} />\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction WizardHeader({ step }: { step: WizardStep }) {\n const { title, description, optional } = STEPS[step];\n\n return (\n <DialogHeader key={step} className={stepTransition}>\n <div className=\"flex min-w-0 items-center gap-2\">\n <DialogTitle>{title}</DialogTitle>\n {optional && <Badge size=\"sm\">Optional</Badge>}\n </div>\n {description && <DialogDescription>{description}</DialogDescription>}\n </DialogHeader>\n );\n}\n\nfunction StepProgress({ step }: { step: WizardStep }) {\n return (\n <div className=\"mr-auto flex items-center gap-2\">\n <ol className=\"flex gap-1\" aria-label={`Step ${step} of ${STEP_COUNT}`}>\n {Object.keys(STEPS).map((key, index) => (\n <li\n key={key}\n aria-current={index + 1 === step ? 'step' : undefined}\n className={cn('h-1 w-6 rounded-full transition-colors', index < step ? 'bg-success-indicator' : 'bg-fill')}\n />\n ))}\n </ol>\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\" aria-hidden=\"true\">\n Step {step} of {STEP_COUNT}\n </Txt>\n </div>\n );\n}\n\ntype AddDatasetItemFormProps = Omit<AddDatasetItemDialogProps, 'open'> & {\n addItem: ReturnType<typeof useDatasetMutations>['addItem'];\n};\n\nfunction AddDatasetItemForm({\n datasetId,\n onOpenChange,\n onSuccess,\n source,\n renderCreateDatasetDialog,\n addItem,\n ...initialValues\n}: AddDatasetItemFormProps) {\n const [step, setStep] = useState<WizardStep>(1);\n const [draft, setDraft] = useState(() => initialDraft(initialValues));\n const [formError, setFormError] = useState<AddItemError>();\n const [apiErrors, setApiErrors] = useState<FieldErrors>();\n const [pickedDatasetId, setPickedDatasetId] = useState('');\n const [isCreateDatasetOpen, setIsCreateDatasetOpen] = useState(false);\n\n const targetDatasetId = datasetId ?? pickedDatasetId;\n const { data: targetDataset } = useDataset({\n datasetId: targetDatasetId,\n queryOptions: { enabled: Boolean(targetDatasetId) },\n });\n const { toolNames } = useTargetAgentTools(targetDatasetId, { enabled: true });\n const { data: datasetList, isLoading: isDatasetsLoading } = useDatasets({ queryOptions: { enabled: !datasetId } });\n const { navigate, paths } = useLinkComponent();\n\n const datasets = datasetList?.datasets ?? [];\n const pickedDataset = datasets.find(dataset => dataset.id === pickedDatasetId);\n // Picking needs the dataset listed: a just-created one is picked before the refetch returns it.\n const hasDataset = datasetId !== undefined || pickedDataset !== undefined;\n\n const update = (patch: (current: AddItemDraft) => Partial<AddItemDraft>) => {\n setDraft(current => ({ ...current, ...patch(current) }));\n setFormError(undefined);\n };\n\n const showError = (error: AddItemError) => {\n setFormError(error);\n setStep(STEP_OF_FIELD[error.field]);\n };\n\n /** Checks what was entered so far, then moves on; the trajectory is checked once reached. */\n const advance = () => {\n const checked = buildAddItemPayload({ ...draft, trajectoryEnabled: false });\n if ('error' in checked) return showError(checked.error);\n setStep(step === 1 ? 2 : 3);\n };\n\n const handleSubmit = async () => {\n const payload = buildAddItemPayload(draft);\n if ('error' in payload) return showError(payload.error);\n\n try {\n const item = await addItem.mutateAsync({\n datasetId: targetDatasetId,\n ...payload.params,\n ...(source ? { source } : {}),\n });\n if (pickedDataset) {\n // Opens the dataset with the new item's drawer; apps without that route return ''.\n const itemHref = paths.datasetItemLink(pickedDataset.id, item.id);\n toast.success(`Added to ${pickedDataset.name}`, {\n action: itemHref ? { label: 'Go to dataset', onClick: () => navigate(itemHref) } : undefined,\n });\n } else {\n toast.success('Item added successfully');\n }\n onOpenChange(false);\n onSuccess?.();\n } catch (error) {\n const fieldErrors = parseFieldErrors(error);\n if (fieldErrors) {\n setApiErrors(fieldErrors);\n if (isAddItemField(fieldErrors.field)) setStep(STEP_OF_FIELD[fieldErrors.field]);\n return;\n }\n toast.error(`Failed to add item: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n };\n\n const errorOf = (field: AddItemField) => (formError?.field === field ? formError.message : undefined);\n const apiErrorsOf = (field: AddItemField) => (apiErrors?.field === field ? apiErrors.errors : []);\n const isInvalid = (field: AddItemField) => Boolean(errorOf(field)) || apiErrorsOf(field).length > 0;\n\n const editJson = (field: 'input' | 'groundTruth' | 'toolMocks' | 'requestContext') => (value: string) => {\n update(() => ({ [field]: value }));\n setApiErrors(undefined);\n };\n\n return (\n <>\n <WizardHeader step={step} />\n\n <DialogBody>\n {/* Every step stays mounted so what was entered survives going back and forth. */}\n <div hidden={step !== 1} className={cn('flex flex-col gap-6', stepTransition)}>\n {datasetId === undefined && (\n <DatasetPicker\n datasets={datasets}\n value={pickedDatasetId}\n onValueChange={setPickedDatasetId}\n loading={isDatasetsLoading || (Boolean(pickedDatasetId) && !pickedDataset)}\n disabled={addItem.isPending}\n onCreateDataset={renderCreateDatasetDialog ? () => setIsCreateDatasetOpen(true) : undefined}\n />\n )}\n\n <div className=\"grid items-start gap-5 sm:grid-cols-2\">\n <Field invalid={isInvalid('input')}>\n <FieldLabel required>Input</FieldLabel>\n <FieldDescription>What the target receives when this item runs.</FieldDescription>\n <CodeEditor\n value={draft.input}\n onChange={editJson('input')}\n aria-label=\"Input JSON\"\n showCopyButton={hasContent(draft.input)}\n showFormatButton={hasContent(draft.input)}\n className=\"h-[220px]\"\n />\n <FieldError>{errorOf('input')}</FieldError>\n <DatasetFieldErrors field=\"input\" errors={apiErrorsOf('input')} />\n </Field>\n <Field invalid={isInvalid('groundTruth')}>\n <FieldLabel>Ground truth</FieldLabel>\n <FieldDescription>The expected answer scorers compare against.</FieldDescription>\n <CodeEditor\n value={draft.groundTruth}\n onChange={editJson('groundTruth')}\n aria-label=\"Ground truth JSON\"\n placeholder={GROUND_TRUTH_PLACEHOLDER}\n showCopyButton={hasContent(draft.groundTruth)}\n showFormatButton={hasContent(draft.groundTruth)}\n className=\"h-[220px]\"\n />\n <FieldError>{errorOf('groundTruth')}</FieldError>\n <DatasetFieldErrors field=\"groundTruth\" errors={apiErrorsOf('groundTruth')} />\n </Field>\n </div>\n </div>\n\n <div hidden={step !== 2} className={stepTransition}>\n <Field invalid={isInvalid('toolMocks')}>\n <CodeEditor\n value={draft.toolMocks}\n onChange={editJson('toolMocks')}\n aria-label=\"Tool mocks JSON\"\n placeholder={TOOL_MOCKS_PLACEHOLDER}\n showCopyButton={hasContent(draft.toolMocks)}\n showFormatButton={hasContent(draft.toolMocks)}\n className=\"h-80\"\n />\n <FieldError>{errorOf('toolMocks')}</FieldError>\n <DatasetFieldErrors field=\"toolMocks\" errors={apiErrorsOf('toolMocks')} />\n </Field>\n </div>\n\n <div hidden={step !== 3} className={stepTransition}>\n <SettingsContainer>\n <CollapsibleSettingsRow\n label=\"Request context\"\n description=\"Values passed to the target when this item runs.\"\n enabled={draft.requestContextEnabled}\n onEnabledChange={requestContextEnabled => update(() => ({ requestContextEnabled }))}\n errorMsg={errorOf('requestContext')}\n >\n <CodeEditor\n value={draft.requestContext}\n onChange={editJson('requestContext')}\n aria-label=\"Request context JSON\"\n placeholder={requestContextPlaceholder(targetDataset?.requestContextSchema)}\n showCopyButton={hasContent(draft.requestContext)}\n showFormatButton={hasContent(draft.requestContext)}\n className=\"min-h-[120px]\"\n />\n </CollapsibleSettingsRow>\n <CollapsibleSettingsRow\n label=\"Expected trajectory\"\n description=\"The steps the target should take to produce its answer.\"\n enabled={draft.trajectoryEnabled}\n onEnabledChange={trajectoryEnabled => update(() => ({ trajectoryEnabled }))}\n errorMsg={errorOf('expectedTrajectory')}\n >\n <TrajectoryEditor\n ordering={draft.ordering}\n onOrderingChange={ordering => update(() => ({ ordering }))}\n steps={draft.trajectorySteps}\n onStepsChange={change => update(current => ({ trajectorySteps: change(current.trajectorySteps) }))}\n toolNames={toolNames}\n />\n </CollapsibleSettingsRow>\n </SettingsContainer>\n </div>\n </DialogBody>\n\n <DialogFooter>\n <StepProgress step={step} />\n {step === 1 ? (\n <DialogCancel>Cancel</DialogCancel>\n ) : (\n <Button\n variant=\"ghost\"\n disabled={addItem.isPending}\n onClick={() => setStep(current => (current - 1) as WizardStep)}\n >\n Back\n </Button>\n )}\n {step < 3 ? (\n <DialogAction disabled={!hasDataset} onConfirm={advance}>\n Next\n </DialogAction>\n ) : (\n <DialogAction onConfirm={() => void handleSubmit()}>Add item</DialogAction>\n )}\n </DialogFooter>\n\n {/* Rendered inside the dialog so the nested dialog stays in its focus scope instead of dismissing it. */}\n {renderCreateDatasetDialog?.({\n open: isCreateDatasetOpen,\n onOpenChange: setIsCreateDatasetOpen,\n onSuccess: setPickedDatasetId,\n })}\n </>\n );\n}\n"],"names":["toTrajectoryStepRow","useDatasetMutations","Dialog","jsx","DialogContent","jsxs","DialogHeader","DialogTitle","Badge","DialogDescription","cn","Txt","useState","useDataset","useTargetAgentTools","useDatasets","useLinkComponent","datasets","buildAddItemPayload","toast","parseFieldErrors","Fragment","DialogBody","DatasetPicker","Field","FieldLabel","FieldDescription","CodeEditor","FieldError","DatasetFieldErrors","SettingsContainer","CollapsibleSettingsRow","TrajectoryEditor","DialogFooter","DialogCancel","Button","DialogAction"],"mappings":"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"}
1
+ {"version":3,"file":"add-dataset-item-dialog.cjs.js","sources":["../../../../../src/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.tsx"],"sourcesContent":["import type { AddDatasetItemParams } from '@mastra/client-js';\nimport { useDataset, useDatasetMutations, useDatasets } from '@mastra/react/hooks/datasets';\nimport { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport type { CreateDatasetDialogRenderProps } from '../save-as-dataset-item-dialog';\nimport { buildAddItemPayload } from './build-add-item-payload';\nimport type { AddItemDraft, AddItemError, AddItemField } from './build-add-item-payload';\nimport { CollapsibleSettingsRow } from './collapsible-settings-row';\nimport { DatasetFieldErrors } from './dataset-field-errors';\nimport { DatasetPicker } from './dataset-picker';\nimport { parseFieldErrors } from './field-errors';\nimport type { FieldErrors } from './field-errors';\nimport { TrajectoryEditor } from './trajectory-editor';\nimport { toTrajectoryStepRow } from './trajectory-types';\nimport type { TrajectoryExpectation } from './trajectory-types';\nimport { useTargetAgentTools } from './use-target-agent-tools';\nimport { Badge } from '@/ds/components/Badge';\nimport { Button } from '@/ds/components/Button';\nimport { CodeEditor } from '@/ds/components/CodeEditor';\nimport {\n Dialog,\n DialogAction,\n DialogBody,\n DialogCancel,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/ds/components/Dialog';\nimport { Field, FieldDescription, FieldError, FieldLabel } from '@/ds/components/Field';\nimport { Txt } from '@/ds/components/Txt';\nimport { SettingsContainer } from '@/ds/new/settings';\nimport { useLinkComponent } from '@/lib/framework';\nimport { cn } from '@/lib/utils';\nimport { toast } from '@/utils/toast';\n\nexport interface AddDatasetItemDialogProps {\n /** The dataset to add the item to. Without it, the dialog asks which dataset. */\n datasetId?: string;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSuccess?: () => void;\n /** JSON or plain text prefilled in the input editor. */\n initialInput?: string;\n /** JSON or plain text prefilled in the ground truth editor. */\n initialGroundTruth?: string;\n /** Raw JSON array prefilled in the tool mocks editor. */\n initialToolMocks?: string;\n /** Steps prefilled in the trajectory editor; switches the expected trajectory on. */\n initialTrajectory?: TrajectoryExpectation;\n /** Where the item comes from; sent as is. */\n source?: AddDatasetItemParams['source'];\n /** Renders a create-dataset dialog, offered first in the dataset picker. The created dataset gets picked. */\n renderCreateDatasetDialog?: (props: CreateDatasetDialogRenderProps) => ReactNode;\n}\n\ntype InitialValues = Pick<\n AddDatasetItemDialogProps,\n 'initialInput' | 'initialGroundTruth' | 'initialToolMocks' | 'initialTrajectory'\n>;\n\nconst initialDraft = ({\n initialInput,\n initialGroundTruth,\n initialToolMocks,\n initialTrajectory,\n}: InitialValues): AddItemDraft => {\n const steps = initialTrajectory?.steps ?? [];\n return {\n input: initialInput ?? '{}',\n groundTruth: initialGroundTruth ?? '',\n toolMocks: initialToolMocks ?? '',\n requestContextEnabled: false,\n requestContext: '',\n trajectoryEnabled: steps.length > 0,\n ordering: initialTrajectory?.ordering ?? 'relaxed',\n trajectorySteps: steps.map(toTrajectoryStepRow),\n };\n};\n\nconst TOOL_MOCKS_PLACEHOLDER = `[\n { \"toolName\": \"getWeather\", \"args\": { \"city\": \"Paris\" }, \"output\": { \"temp\": 18 } },\n { \"toolName\": \"getForecast\", \"args\": {}, \"output\": { \"days\": 5 }, \"matchArgs\": \"ignore\" }\n]`;\n\n/** The keys of the dataset's request context schema, as a JSON object to fill in. */\nconst requestContextPlaceholder = (schema: unknown) => {\n const properties = typeof schema === 'object' && schema !== null && 'properties' in schema ? schema.properties : {};\n const keys = typeof properties === 'object' && properties !== null ? Object.keys(properties) : [];\n if (keys.length === 0) return '{ \"tenantId\": \"acme\" }';\n return JSON.stringify(Object.fromEntries(keys.map(key => [key, ''])), null, 2);\n};\n\ntype WizardStep = 1 | 2 | 3;\n\n/** Only steps whose fields don't describe themselves carry a description. */\nconst STEPS: Record<WizardStep, { title: string; description?: ReactNode; optional?: boolean }> = {\n 1: { title: 'Input and ground truth' },\n 2: {\n title: 'Tool mocks',\n optional: true,\n description:\n 'Return fixed results instead of running the real tools. When the target calls a tool listed here with the same args, it gets your output back. Leave empty to run tools for real.',\n },\n 3: {\n title: 'Context and trajectory',\n optional: true,\n description:\n 'Pass values to the run, or check the steps the target takes. Leave both off to add the item without them.',\n },\n};\n\nconst GROUND_TRUTH_PLACEHOLDER = '{ \"text\": \"The answer you expect\" }';\n\n/** Copying an editor that holds nothing worth copying is noise. */\nconst hasContent = (value: string) => !['', '{}'].includes(value.trim());\n\n/** Only JSON can be formatted; offering it on plain text would only fail. */\nconst isJson = (value: string) => {\n try {\n JSON.parse(value);\n return true;\n } catch {\n return false;\n }\n};\n\nconst STEP_COUNT = Object.keys(STEPS).length;\n\nconst STEP_OF_FIELD: Record<AddItemField, WizardStep> = {\n input: 1,\n groundTruth: 1,\n toolMocks: 2,\n requestContext: 3,\n expectedTrajectory: 3,\n};\n\nconst isAddItemField = (field: string): field is AddItemField => field in STEP_OF_FIELD;\n\nconst stepTransition = 'animate-in fade-in slide-in-from-bottom-2 duration-200 motion-reduce:animate-none';\n\n/**\n * Add an item to a dataset in three steps: the input and its expected answer, tool mocks, then the request\n * context and expected trajectory. Only the first step is required; the others can be left empty.\n */\nexport function AddDatasetItemDialog({ open, onOpenChange, ...props }: AddDatasetItemDialogProps) {\n const { addItem } = useDatasetMutations();\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange} pending={addItem.isPending}>\n <DialogContent size=\"xl\">\n {/* The form unmounts on close, so every open starts fresh from the initial values. */}\n <AddDatasetItemForm {...props} addItem={addItem} onOpenChange={onOpenChange} />\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction WizardHeader({ step }: { step: WizardStep }) {\n const { title, description, optional } = STEPS[step];\n\n return (\n <DialogHeader key={step} className={stepTransition}>\n <div className=\"flex min-w-0 items-center gap-2\">\n <DialogTitle>{title}</DialogTitle>\n {optional && <Badge size=\"sm\">Optional</Badge>}\n </div>\n {description && <DialogDescription>{description}</DialogDescription>}\n </DialogHeader>\n );\n}\n\nfunction StepProgress({ step }: { step: WizardStep }) {\n return (\n <div className=\"mr-auto flex items-center gap-2\">\n <ol className=\"flex gap-1\" aria-label={`Step ${step} of ${STEP_COUNT}`}>\n {Object.keys(STEPS).map((key, index) => (\n <li\n key={key}\n aria-current={index + 1 === step ? 'step' : undefined}\n className={cn('h-1 w-6 rounded-full transition-colors', index < step ? 'bg-success-indicator' : 'bg-fill')}\n />\n ))}\n </ol>\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\" aria-hidden=\"true\">\n Step {step} of {STEP_COUNT}\n </Txt>\n </div>\n );\n}\n\ntype AddDatasetItemFormProps = Omit<AddDatasetItemDialogProps, 'open'> & {\n addItem: ReturnType<typeof useDatasetMutations>['addItem'];\n};\n\nfunction AddDatasetItemForm({\n datasetId,\n onOpenChange,\n onSuccess,\n source,\n renderCreateDatasetDialog,\n addItem,\n ...initialValues\n}: AddDatasetItemFormProps) {\n const [step, setStep] = useState<WizardStep>(1);\n const [draft, setDraft] = useState(() => initialDraft(initialValues));\n const [formError, setFormError] = useState<AddItemError>();\n const [apiErrors, setApiErrors] = useState<FieldErrors>();\n const [pickedDatasetId, setPickedDatasetId] = useState('');\n const [isCreateDatasetOpen, setIsCreateDatasetOpen] = useState(false);\n\n const targetDatasetId = datasetId ?? pickedDatasetId;\n const { data: targetDataset } = useDataset({\n datasetId: targetDatasetId,\n queryOptions: { enabled: Boolean(targetDatasetId) },\n });\n const { toolNames } = useTargetAgentTools(targetDatasetId, { enabled: true });\n const { data: datasetList, isLoading: isDatasetsLoading } = useDatasets({ queryOptions: { enabled: !datasetId } });\n const { navigate, paths } = useLinkComponent();\n\n const datasets = datasetList?.datasets ?? [];\n const pickedDataset = datasets.find(dataset => dataset.id === pickedDatasetId);\n // Picking needs the dataset listed: a just-created one is picked before the refetch returns it.\n const hasDataset = datasetId !== undefined || pickedDataset !== undefined;\n\n const update = (patch: (current: AddItemDraft) => Partial<AddItemDraft>) => {\n setDraft(current => ({ ...current, ...patch(current) }));\n setFormError(undefined);\n };\n\n const showError = (error: AddItemError) => {\n setFormError(error);\n setStep(STEP_OF_FIELD[error.field]);\n };\n\n /** Checks what was entered so far, then moves on; the trajectory is checked once reached. */\n const advance = () => {\n const checked = buildAddItemPayload({ ...draft, trajectoryEnabled: false });\n if ('error' in checked) return showError(checked.error);\n setStep(step === 1 ? 2 : 3);\n };\n\n const handleSubmit = async () => {\n const payload = buildAddItemPayload(draft);\n if ('error' in payload) return showError(payload.error);\n\n try {\n const item = await addItem.mutateAsync({\n datasetId: targetDatasetId,\n ...payload.params,\n ...(source ? { source } : {}),\n });\n if (pickedDataset) {\n // Opens the dataset with the new item's drawer; apps without that route return ''.\n const itemHref = paths.datasetItemLink(pickedDataset.id, item.id);\n toast.success(`Added to ${pickedDataset.name}`, {\n action: itemHref ? { label: 'Go to dataset', onClick: () => navigate(itemHref) } : undefined,\n });\n } else {\n toast.success('Item added successfully');\n }\n onOpenChange(false);\n onSuccess?.();\n } catch (error) {\n const fieldErrors = parseFieldErrors(error);\n if (fieldErrors) {\n setApiErrors(fieldErrors);\n if (isAddItemField(fieldErrors.field)) setStep(STEP_OF_FIELD[fieldErrors.field]);\n return;\n }\n toast.error(`Failed to add item: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n };\n\n const errorOf = (field: AddItemField) => (formError?.field === field ? formError.message : undefined);\n const apiErrorsOf = (field: AddItemField) => (apiErrors?.field === field ? apiErrors.errors : []);\n const isInvalid = (field: AddItemField) => Boolean(errorOf(field)) || apiErrorsOf(field).length > 0;\n\n const editField = (field: 'input' | 'groundTruth' | 'toolMocks' | 'requestContext') => (value: string) => {\n update(() => ({ [field]: value }));\n setApiErrors(undefined);\n };\n\n return (\n <>\n <WizardHeader step={step} />\n\n <DialogBody>\n {/* Every step stays mounted so what was entered survives going back and forth. */}\n <div hidden={step !== 1} className={cn('flex flex-col gap-6', stepTransition)}>\n {datasetId === undefined && (\n <DatasetPicker\n datasets={datasets}\n value={pickedDatasetId}\n onValueChange={setPickedDatasetId}\n loading={isDatasetsLoading || (Boolean(pickedDatasetId) && !pickedDataset)}\n disabled={addItem.isPending}\n onCreateDataset={renderCreateDatasetDialog ? () => setIsCreateDatasetOpen(true) : undefined}\n />\n )}\n\n <div className=\"grid items-start gap-5 sm:grid-cols-2\">\n <Field invalid={isInvalid('input')}>\n <FieldLabel required>Input</FieldLabel>\n <FieldDescription>What the target receives when this item runs. JSON or plain text.</FieldDescription>\n <CodeEditor\n value={draft.input}\n onChange={editField('input')}\n aria-label=\"Input\"\n showCopyButton={hasContent(draft.input)}\n showFormatButton={hasContent(draft.input) && isJson(draft.input)}\n className=\"h-[220px]\"\n />\n <FieldError>{errorOf('input')}</FieldError>\n <DatasetFieldErrors field=\"input\" errors={apiErrorsOf('input')} />\n </Field>\n <Field invalid={isInvalid('groundTruth')}>\n <FieldLabel>Ground truth</FieldLabel>\n <FieldDescription>The expected answer scorers compare against. JSON or plain text.</FieldDescription>\n <CodeEditor\n value={draft.groundTruth}\n onChange={editField('groundTruth')}\n aria-label=\"Ground truth\"\n placeholder={GROUND_TRUTH_PLACEHOLDER}\n showCopyButton={hasContent(draft.groundTruth)}\n showFormatButton={hasContent(draft.groundTruth) && isJson(draft.groundTruth)}\n className=\"h-[220px]\"\n />\n <FieldError>{errorOf('groundTruth')}</FieldError>\n <DatasetFieldErrors field=\"groundTruth\" errors={apiErrorsOf('groundTruth')} />\n </Field>\n </div>\n </div>\n\n <div hidden={step !== 2} className={stepTransition}>\n <Field invalid={isInvalid('toolMocks')}>\n <CodeEditor\n value={draft.toolMocks}\n onChange={editField('toolMocks')}\n aria-label=\"Tool mocks JSON\"\n placeholder={TOOL_MOCKS_PLACEHOLDER}\n showCopyButton={hasContent(draft.toolMocks)}\n showFormatButton={hasContent(draft.toolMocks)}\n className=\"h-80\"\n />\n <FieldError>{errorOf('toolMocks')}</FieldError>\n <DatasetFieldErrors field=\"toolMocks\" errors={apiErrorsOf('toolMocks')} />\n </Field>\n </div>\n\n <div hidden={step !== 3} className={stepTransition}>\n <SettingsContainer>\n <CollapsibleSettingsRow\n label=\"Request context\"\n description=\"Values passed to the target when this item runs.\"\n enabled={draft.requestContextEnabled}\n onEnabledChange={requestContextEnabled => update(() => ({ requestContextEnabled }))}\n errorMsg={errorOf('requestContext')}\n >\n <CodeEditor\n value={draft.requestContext}\n onChange={editField('requestContext')}\n aria-label=\"Request context JSON\"\n placeholder={requestContextPlaceholder(targetDataset?.requestContextSchema)}\n showCopyButton={hasContent(draft.requestContext)}\n showFormatButton={hasContent(draft.requestContext)}\n className=\"min-h-[120px]\"\n />\n </CollapsibleSettingsRow>\n <CollapsibleSettingsRow\n label=\"Expected trajectory\"\n description=\"The steps the target should take to produce its answer.\"\n enabled={draft.trajectoryEnabled}\n onEnabledChange={trajectoryEnabled => update(() => ({ trajectoryEnabled }))}\n errorMsg={errorOf('expectedTrajectory')}\n >\n <TrajectoryEditor\n ordering={draft.ordering}\n onOrderingChange={ordering => update(() => ({ ordering }))}\n steps={draft.trajectorySteps}\n onStepsChange={change => update(current => ({ trajectorySteps: change(current.trajectorySteps) }))}\n toolNames={toolNames}\n />\n </CollapsibleSettingsRow>\n </SettingsContainer>\n </div>\n </DialogBody>\n\n <DialogFooter>\n <StepProgress step={step} />\n {step === 1 ? (\n <DialogCancel>Cancel</DialogCancel>\n ) : (\n <Button\n variant=\"ghost\"\n disabled={addItem.isPending}\n onClick={() => setStep(current => (current - 1) as WizardStep)}\n >\n Back\n </Button>\n )}\n {step < 3 ? (\n <DialogAction disabled={!hasDataset} onConfirm={advance}>\n Next\n </DialogAction>\n ) : (\n <DialogAction onConfirm={() => void handleSubmit()}>Add item</DialogAction>\n )}\n </DialogFooter>\n\n {/* Rendered inside the dialog so the nested dialog stays in its focus scope instead of dismissing it. */}\n {renderCreateDatasetDialog?.({\n open: isCreateDatasetOpen,\n onOpenChange: setIsCreateDatasetOpen,\n onSuccess: setPickedDatasetId,\n })}\n </>\n );\n}\n"],"names":["toTrajectoryStepRow","useDatasetMutations","Dialog","jsx","DialogContent","jsxs","DialogHeader","DialogTitle","Badge","DialogDescription","cn","Txt","useState","useDataset","useTargetAgentTools","useDatasets","useLinkComponent","datasets","buildAddItemPayload","toast","parseFieldErrors","Fragment","DialogBody","DatasetPicker","Field","FieldLabel","FieldDescription","CodeEditor","FieldError","DatasetFieldErrors","SettingsContainer","CollapsibleSettingsRow","TrajectoryEditor","DialogFooter","DialogCancel","Button","DialogAction"],"mappings":"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"}
@@ -66,6 +66,14 @@ const STEPS = {
66
66
  };
67
67
  const GROUND_TRUTH_PLACEHOLDER = '{ "text": "The answer you expect" }';
68
68
  const hasContent = (value) => !["", "{}"].includes(value.trim());
69
+ const isJson = (value) => {
70
+ try {
71
+ JSON.parse(value);
72
+ return true;
73
+ } catch {
74
+ return false;
75
+ }
76
+ };
69
77
  const STEP_COUNT = Object.keys(STEPS).length;
70
78
  const STEP_OF_FIELD = {
71
79
  input: 1,
@@ -179,7 +187,7 @@ function AddDatasetItemForm({
179
187
  const errorOf = (field) => formError?.field === field ? formError.message : void 0;
180
188
  const apiErrorsOf = (field) => apiErrors?.field === field ? apiErrors.errors : [];
181
189
  const isInvalid = (field) => Boolean(errorOf(field)) || apiErrorsOf(field).length > 0;
182
- const editJson = (field) => (value) => {
190
+ const editField = (field) => (value) => {
183
191
  update(() => ({ [field]: value }));
184
192
  setApiErrors(void 0);
185
193
  };
@@ -201,15 +209,15 @@ function AddDatasetItemForm({
201
209
  /* @__PURE__ */ jsxs("div", { className: "grid items-start gap-5 sm:grid-cols-2", children: [
202
210
  /* @__PURE__ */ jsxs(Field, { invalid: isInvalid("input"), children: [
203
211
  /* @__PURE__ */ jsx(FieldLabel, { required: true, children: "Input" }),
204
- /* @__PURE__ */ jsx(FieldDescription, { children: "What the target receives when this item runs." }),
212
+ /* @__PURE__ */ jsx(FieldDescription, { children: "What the target receives when this item runs. JSON or plain text." }),
205
213
  /* @__PURE__ */ jsx(
206
214
  CodeEditor,
207
215
  {
208
216
  value: draft.input,
209
- onChange: editJson("input"),
210
- "aria-label": "Input JSON",
217
+ onChange: editField("input"),
218
+ "aria-label": "Input",
211
219
  showCopyButton: hasContent(draft.input),
212
- showFormatButton: hasContent(draft.input),
220
+ showFormatButton: hasContent(draft.input) && isJson(draft.input),
213
221
  className: "h-[220px]"
214
222
  }
215
223
  ),
@@ -218,16 +226,16 @@ function AddDatasetItemForm({
218
226
  ] }),
219
227
  /* @__PURE__ */ jsxs(Field, { invalid: isInvalid("groundTruth"), children: [
220
228
  /* @__PURE__ */ jsx(FieldLabel, { children: "Ground truth" }),
221
- /* @__PURE__ */ jsx(FieldDescription, { children: "The expected answer scorers compare against." }),
229
+ /* @__PURE__ */ jsx(FieldDescription, { children: "The expected answer scorers compare against. JSON or plain text." }),
222
230
  /* @__PURE__ */ jsx(
223
231
  CodeEditor,
224
232
  {
225
233
  value: draft.groundTruth,
226
- onChange: editJson("groundTruth"),
227
- "aria-label": "Ground truth JSON",
234
+ onChange: editField("groundTruth"),
235
+ "aria-label": "Ground truth",
228
236
  placeholder: GROUND_TRUTH_PLACEHOLDER,
229
237
  showCopyButton: hasContent(draft.groundTruth),
230
- showFormatButton: hasContent(draft.groundTruth),
238
+ showFormatButton: hasContent(draft.groundTruth) && isJson(draft.groundTruth),
231
239
  className: "h-[220px]"
232
240
  }
233
241
  ),
@@ -241,7 +249,7 @@ function AddDatasetItemForm({
241
249
  CodeEditor,
242
250
  {
243
251
  value: draft.toolMocks,
244
- onChange: editJson("toolMocks"),
252
+ onChange: editField("toolMocks"),
245
253
  "aria-label": "Tool mocks JSON",
246
254
  placeholder: TOOL_MOCKS_PLACEHOLDER,
247
255
  showCopyButton: hasContent(draft.toolMocks),
@@ -265,7 +273,7 @@ function AddDatasetItemForm({
265
273
  CodeEditor,
266
274
  {
267
275
  value: draft.requestContext,
268
- onChange: editJson("requestContext"),
276
+ onChange: editField("requestContext"),
269
277
  "aria-label": "Request context JSON",
270
278
  placeholder: requestContextPlaceholder(targetDataset?.requestContextSchema),
271
279
  showCopyButton: hasContent(draft.requestContext),
@@ -1 +1 @@
1
- {"version":3,"file":"add-dataset-item-dialog.es.js","sources":["../../../../../src/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.tsx"],"sourcesContent":["import type { AddDatasetItemParams } from '@mastra/client-js';\nimport { useDataset, useDatasetMutations, useDatasets } from '@mastra/react/hooks/datasets';\nimport { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport type { CreateDatasetDialogRenderProps } from '../save-as-dataset-item-dialog';\nimport { buildAddItemPayload } from './build-add-item-payload';\nimport type { AddItemDraft, AddItemError, AddItemField } from './build-add-item-payload';\nimport { CollapsibleSettingsRow } from './collapsible-settings-row';\nimport { DatasetFieldErrors } from './dataset-field-errors';\nimport { DatasetPicker } from './dataset-picker';\nimport { parseFieldErrors } from './field-errors';\nimport type { FieldErrors } from './field-errors';\nimport { TrajectoryEditor } from './trajectory-editor';\nimport { toTrajectoryStepRow } from './trajectory-types';\nimport type { TrajectoryExpectation } from './trajectory-types';\nimport { useTargetAgentTools } from './use-target-agent-tools';\nimport { Badge } from '@/ds/components/Badge';\nimport { Button } from '@/ds/components/Button';\nimport { CodeEditor } from '@/ds/components/CodeEditor';\nimport {\n Dialog,\n DialogAction,\n DialogBody,\n DialogCancel,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/ds/components/Dialog';\nimport { Field, FieldDescription, FieldError, FieldLabel } from '@/ds/components/Field';\nimport { Txt } from '@/ds/components/Txt';\nimport { SettingsContainer } from '@/ds/new/settings';\nimport { useLinkComponent } from '@/lib/framework';\nimport { cn } from '@/lib/utils';\nimport { toast } from '@/utils/toast';\n\nexport interface AddDatasetItemDialogProps {\n /** The dataset to add the item to. Without it, the dialog asks which dataset. */\n datasetId?: string;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSuccess?: () => void;\n /** Raw JSON prefilled in the input editor. */\n initialInput?: string;\n /** Raw JSON prefilled in the ground truth editor. */\n initialGroundTruth?: string;\n /** Raw JSON array prefilled in the tool mocks editor. */\n initialToolMocks?: string;\n /** Steps prefilled in the trajectory editor; switches the expected trajectory on. */\n initialTrajectory?: TrajectoryExpectation;\n /** Where the item comes from; sent as is. */\n source?: AddDatasetItemParams['source'];\n /** Renders a create-dataset dialog, offered first in the dataset picker. The created dataset gets picked. */\n renderCreateDatasetDialog?: (props: CreateDatasetDialogRenderProps) => ReactNode;\n}\n\ntype InitialValues = Pick<\n AddDatasetItemDialogProps,\n 'initialInput' | 'initialGroundTruth' | 'initialToolMocks' | 'initialTrajectory'\n>;\n\nconst initialDraft = ({\n initialInput,\n initialGroundTruth,\n initialToolMocks,\n initialTrajectory,\n}: InitialValues): AddItemDraft => {\n const steps = initialTrajectory?.steps ?? [];\n return {\n input: initialInput ?? '{}',\n groundTruth: initialGroundTruth ?? '',\n toolMocks: initialToolMocks ?? '',\n requestContextEnabled: false,\n requestContext: '',\n trajectoryEnabled: steps.length > 0,\n ordering: initialTrajectory?.ordering ?? 'relaxed',\n trajectorySteps: steps.map(toTrajectoryStepRow),\n };\n};\n\nconst TOOL_MOCKS_PLACEHOLDER = `[\n { \"toolName\": \"getWeather\", \"args\": { \"city\": \"Paris\" }, \"output\": { \"temp\": 18 } },\n { \"toolName\": \"getForecast\", \"args\": {}, \"output\": { \"days\": 5 }, \"matchArgs\": \"ignore\" }\n]`;\n\n/** The keys of the dataset's request context schema, as a JSON object to fill in. */\nconst requestContextPlaceholder = (schema: unknown) => {\n const properties = typeof schema === 'object' && schema !== null && 'properties' in schema ? schema.properties : {};\n const keys = typeof properties === 'object' && properties !== null ? Object.keys(properties) : [];\n if (keys.length === 0) return '{ \"tenantId\": \"acme\" }';\n return JSON.stringify(Object.fromEntries(keys.map(key => [key, ''])), null, 2);\n};\n\ntype WizardStep = 1 | 2 | 3;\n\n/** Only steps whose fields don't describe themselves carry a description. */\nconst STEPS: Record<WizardStep, { title: string; description?: ReactNode; optional?: boolean }> = {\n 1: { title: 'Input and ground truth' },\n 2: {\n title: 'Tool mocks',\n optional: true,\n description:\n 'Return fixed results instead of running the real tools. When the target calls a tool listed here with the same args, it gets your output back. Leave empty to run tools for real.',\n },\n 3: {\n title: 'Context and trajectory',\n optional: true,\n description:\n 'Pass values to the run, or check the steps the target takes. Leave both off to add the item without them.',\n },\n};\n\nconst GROUND_TRUTH_PLACEHOLDER = '{ \"text\": \"The answer you expect\" }';\n\n/** Copying an editor that holds nothing worth copying is noise. */\nconst hasContent = (value: string) => !['', '{}'].includes(value.trim());\n\nconst STEP_COUNT = Object.keys(STEPS).length;\n\nconst STEP_OF_FIELD: Record<AddItemField, WizardStep> = {\n input: 1,\n groundTruth: 1,\n toolMocks: 2,\n requestContext: 3,\n expectedTrajectory: 3,\n};\n\nconst isAddItemField = (field: string): field is AddItemField => field in STEP_OF_FIELD;\n\nconst stepTransition = 'animate-in fade-in slide-in-from-bottom-2 duration-200 motion-reduce:animate-none';\n\n/**\n * Add an item to a dataset in three steps: the input and its expected answer, tool mocks, then the request\n * context and expected trajectory. Only the first step is required; the others can be left empty.\n */\nexport function AddDatasetItemDialog({ open, onOpenChange, ...props }: AddDatasetItemDialogProps) {\n const { addItem } = useDatasetMutations();\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange} pending={addItem.isPending}>\n <DialogContent size=\"xl\">\n {/* The form unmounts on close, so every open starts fresh from the initial values. */}\n <AddDatasetItemForm {...props} addItem={addItem} onOpenChange={onOpenChange} />\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction WizardHeader({ step }: { step: WizardStep }) {\n const { title, description, optional } = STEPS[step];\n\n return (\n <DialogHeader key={step} className={stepTransition}>\n <div className=\"flex min-w-0 items-center gap-2\">\n <DialogTitle>{title}</DialogTitle>\n {optional && <Badge size=\"sm\">Optional</Badge>}\n </div>\n {description && <DialogDescription>{description}</DialogDescription>}\n </DialogHeader>\n );\n}\n\nfunction StepProgress({ step }: { step: WizardStep }) {\n return (\n <div className=\"mr-auto flex items-center gap-2\">\n <ol className=\"flex gap-1\" aria-label={`Step ${step} of ${STEP_COUNT}`}>\n {Object.keys(STEPS).map((key, index) => (\n <li\n key={key}\n aria-current={index + 1 === step ? 'step' : undefined}\n className={cn('h-1 w-6 rounded-full transition-colors', index < step ? 'bg-success-indicator' : 'bg-fill')}\n />\n ))}\n </ol>\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\" aria-hidden=\"true\">\n Step {step} of {STEP_COUNT}\n </Txt>\n </div>\n );\n}\n\ntype AddDatasetItemFormProps = Omit<AddDatasetItemDialogProps, 'open'> & {\n addItem: ReturnType<typeof useDatasetMutations>['addItem'];\n};\n\nfunction AddDatasetItemForm({\n datasetId,\n onOpenChange,\n onSuccess,\n source,\n renderCreateDatasetDialog,\n addItem,\n ...initialValues\n}: AddDatasetItemFormProps) {\n const [step, setStep] = useState<WizardStep>(1);\n const [draft, setDraft] = useState(() => initialDraft(initialValues));\n const [formError, setFormError] = useState<AddItemError>();\n const [apiErrors, setApiErrors] = useState<FieldErrors>();\n const [pickedDatasetId, setPickedDatasetId] = useState('');\n const [isCreateDatasetOpen, setIsCreateDatasetOpen] = useState(false);\n\n const targetDatasetId = datasetId ?? pickedDatasetId;\n const { data: targetDataset } = useDataset({\n datasetId: targetDatasetId,\n queryOptions: { enabled: Boolean(targetDatasetId) },\n });\n const { toolNames } = useTargetAgentTools(targetDatasetId, { enabled: true });\n const { data: datasetList, isLoading: isDatasetsLoading } = useDatasets({ queryOptions: { enabled: !datasetId } });\n const { navigate, paths } = useLinkComponent();\n\n const datasets = datasetList?.datasets ?? [];\n const pickedDataset = datasets.find(dataset => dataset.id === pickedDatasetId);\n // Picking needs the dataset listed: a just-created one is picked before the refetch returns it.\n const hasDataset = datasetId !== undefined || pickedDataset !== undefined;\n\n const update = (patch: (current: AddItemDraft) => Partial<AddItemDraft>) => {\n setDraft(current => ({ ...current, ...patch(current) }));\n setFormError(undefined);\n };\n\n const showError = (error: AddItemError) => {\n setFormError(error);\n setStep(STEP_OF_FIELD[error.field]);\n };\n\n /** Checks what was entered so far, then moves on; the trajectory is checked once reached. */\n const advance = () => {\n const checked = buildAddItemPayload({ ...draft, trajectoryEnabled: false });\n if ('error' in checked) return showError(checked.error);\n setStep(step === 1 ? 2 : 3);\n };\n\n const handleSubmit = async () => {\n const payload = buildAddItemPayload(draft);\n if ('error' in payload) return showError(payload.error);\n\n try {\n const item = await addItem.mutateAsync({\n datasetId: targetDatasetId,\n ...payload.params,\n ...(source ? { source } : {}),\n });\n if (pickedDataset) {\n // Opens the dataset with the new item's drawer; apps without that route return ''.\n const itemHref = paths.datasetItemLink(pickedDataset.id, item.id);\n toast.success(`Added to ${pickedDataset.name}`, {\n action: itemHref ? { label: 'Go to dataset', onClick: () => navigate(itemHref) } : undefined,\n });\n } else {\n toast.success('Item added successfully');\n }\n onOpenChange(false);\n onSuccess?.();\n } catch (error) {\n const fieldErrors = parseFieldErrors(error);\n if (fieldErrors) {\n setApiErrors(fieldErrors);\n if (isAddItemField(fieldErrors.field)) setStep(STEP_OF_FIELD[fieldErrors.field]);\n return;\n }\n toast.error(`Failed to add item: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n };\n\n const errorOf = (field: AddItemField) => (formError?.field === field ? formError.message : undefined);\n const apiErrorsOf = (field: AddItemField) => (apiErrors?.field === field ? apiErrors.errors : []);\n const isInvalid = (field: AddItemField) => Boolean(errorOf(field)) || apiErrorsOf(field).length > 0;\n\n const editJson = (field: 'input' | 'groundTruth' | 'toolMocks' | 'requestContext') => (value: string) => {\n update(() => ({ [field]: value }));\n setApiErrors(undefined);\n };\n\n return (\n <>\n <WizardHeader step={step} />\n\n <DialogBody>\n {/* Every step stays mounted so what was entered survives going back and forth. */}\n <div hidden={step !== 1} className={cn('flex flex-col gap-6', stepTransition)}>\n {datasetId === undefined && (\n <DatasetPicker\n datasets={datasets}\n value={pickedDatasetId}\n onValueChange={setPickedDatasetId}\n loading={isDatasetsLoading || (Boolean(pickedDatasetId) && !pickedDataset)}\n disabled={addItem.isPending}\n onCreateDataset={renderCreateDatasetDialog ? () => setIsCreateDatasetOpen(true) : undefined}\n />\n )}\n\n <div className=\"grid items-start gap-5 sm:grid-cols-2\">\n <Field invalid={isInvalid('input')}>\n <FieldLabel required>Input</FieldLabel>\n <FieldDescription>What the target receives when this item runs.</FieldDescription>\n <CodeEditor\n value={draft.input}\n onChange={editJson('input')}\n aria-label=\"Input JSON\"\n showCopyButton={hasContent(draft.input)}\n showFormatButton={hasContent(draft.input)}\n className=\"h-[220px]\"\n />\n <FieldError>{errorOf('input')}</FieldError>\n <DatasetFieldErrors field=\"input\" errors={apiErrorsOf('input')} />\n </Field>\n <Field invalid={isInvalid('groundTruth')}>\n <FieldLabel>Ground truth</FieldLabel>\n <FieldDescription>The expected answer scorers compare against.</FieldDescription>\n <CodeEditor\n value={draft.groundTruth}\n onChange={editJson('groundTruth')}\n aria-label=\"Ground truth JSON\"\n placeholder={GROUND_TRUTH_PLACEHOLDER}\n showCopyButton={hasContent(draft.groundTruth)}\n showFormatButton={hasContent(draft.groundTruth)}\n className=\"h-[220px]\"\n />\n <FieldError>{errorOf('groundTruth')}</FieldError>\n <DatasetFieldErrors field=\"groundTruth\" errors={apiErrorsOf('groundTruth')} />\n </Field>\n </div>\n </div>\n\n <div hidden={step !== 2} className={stepTransition}>\n <Field invalid={isInvalid('toolMocks')}>\n <CodeEditor\n value={draft.toolMocks}\n onChange={editJson('toolMocks')}\n aria-label=\"Tool mocks JSON\"\n placeholder={TOOL_MOCKS_PLACEHOLDER}\n showCopyButton={hasContent(draft.toolMocks)}\n showFormatButton={hasContent(draft.toolMocks)}\n className=\"h-80\"\n />\n <FieldError>{errorOf('toolMocks')}</FieldError>\n <DatasetFieldErrors field=\"toolMocks\" errors={apiErrorsOf('toolMocks')} />\n </Field>\n </div>\n\n <div hidden={step !== 3} className={stepTransition}>\n <SettingsContainer>\n <CollapsibleSettingsRow\n label=\"Request context\"\n description=\"Values passed to the target when this item runs.\"\n enabled={draft.requestContextEnabled}\n onEnabledChange={requestContextEnabled => update(() => ({ requestContextEnabled }))}\n errorMsg={errorOf('requestContext')}\n >\n <CodeEditor\n value={draft.requestContext}\n onChange={editJson('requestContext')}\n aria-label=\"Request context JSON\"\n placeholder={requestContextPlaceholder(targetDataset?.requestContextSchema)}\n showCopyButton={hasContent(draft.requestContext)}\n showFormatButton={hasContent(draft.requestContext)}\n className=\"min-h-[120px]\"\n />\n </CollapsibleSettingsRow>\n <CollapsibleSettingsRow\n label=\"Expected trajectory\"\n description=\"The steps the target should take to produce its answer.\"\n enabled={draft.trajectoryEnabled}\n onEnabledChange={trajectoryEnabled => update(() => ({ trajectoryEnabled }))}\n errorMsg={errorOf('expectedTrajectory')}\n >\n <TrajectoryEditor\n ordering={draft.ordering}\n onOrderingChange={ordering => update(() => ({ ordering }))}\n steps={draft.trajectorySteps}\n onStepsChange={change => update(current => ({ trajectorySteps: change(current.trajectorySteps) }))}\n toolNames={toolNames}\n />\n </CollapsibleSettingsRow>\n </SettingsContainer>\n </div>\n </DialogBody>\n\n <DialogFooter>\n <StepProgress step={step} />\n {step === 1 ? (\n <DialogCancel>Cancel</DialogCancel>\n ) : (\n <Button\n variant=\"ghost\"\n disabled={addItem.isPending}\n onClick={() => setStep(current => (current - 1) as WizardStep)}\n >\n Back\n </Button>\n )}\n {step < 3 ? (\n <DialogAction disabled={!hasDataset} onConfirm={advance}>\n Next\n </DialogAction>\n ) : (\n <DialogAction onConfirm={() => void handleSubmit()}>Add item</DialogAction>\n )}\n </DialogFooter>\n\n {/* Rendered inside the dialog so the nested dialog stays in its focus scope instead of dismissing it. */}\n {renderCreateDatasetDialog?.({\n open: isCreateDatasetOpen,\n onOpenChange: setIsCreateDatasetOpen,\n onSuccess: setPickedDatasetId,\n })}\n </>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"add-dataset-item-dialog.es.js","sources":["../../../../../src/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.tsx"],"sourcesContent":["import type { AddDatasetItemParams } from '@mastra/client-js';\nimport { useDataset, useDatasetMutations, useDatasets } from '@mastra/react/hooks/datasets';\nimport { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport type { CreateDatasetDialogRenderProps } from '../save-as-dataset-item-dialog';\nimport { buildAddItemPayload } from './build-add-item-payload';\nimport type { AddItemDraft, AddItemError, AddItemField } from './build-add-item-payload';\nimport { CollapsibleSettingsRow } from './collapsible-settings-row';\nimport { DatasetFieldErrors } from './dataset-field-errors';\nimport { DatasetPicker } from './dataset-picker';\nimport { parseFieldErrors } from './field-errors';\nimport type { FieldErrors } from './field-errors';\nimport { TrajectoryEditor } from './trajectory-editor';\nimport { toTrajectoryStepRow } from './trajectory-types';\nimport type { TrajectoryExpectation } from './trajectory-types';\nimport { useTargetAgentTools } from './use-target-agent-tools';\nimport { Badge } from '@/ds/components/Badge';\nimport { Button } from '@/ds/components/Button';\nimport { CodeEditor } from '@/ds/components/CodeEditor';\nimport {\n Dialog,\n DialogAction,\n DialogBody,\n DialogCancel,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/ds/components/Dialog';\nimport { Field, FieldDescription, FieldError, FieldLabel } from '@/ds/components/Field';\nimport { Txt } from '@/ds/components/Txt';\nimport { SettingsContainer } from '@/ds/new/settings';\nimport { useLinkComponent } from '@/lib/framework';\nimport { cn } from '@/lib/utils';\nimport { toast } from '@/utils/toast';\n\nexport interface AddDatasetItemDialogProps {\n /** The dataset to add the item to. Without it, the dialog asks which dataset. */\n datasetId?: string;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSuccess?: () => void;\n /** JSON or plain text prefilled in the input editor. */\n initialInput?: string;\n /** JSON or plain text prefilled in the ground truth editor. */\n initialGroundTruth?: string;\n /** Raw JSON array prefilled in the tool mocks editor. */\n initialToolMocks?: string;\n /** Steps prefilled in the trajectory editor; switches the expected trajectory on. */\n initialTrajectory?: TrajectoryExpectation;\n /** Where the item comes from; sent as is. */\n source?: AddDatasetItemParams['source'];\n /** Renders a create-dataset dialog, offered first in the dataset picker. The created dataset gets picked. */\n renderCreateDatasetDialog?: (props: CreateDatasetDialogRenderProps) => ReactNode;\n}\n\ntype InitialValues = Pick<\n AddDatasetItemDialogProps,\n 'initialInput' | 'initialGroundTruth' | 'initialToolMocks' | 'initialTrajectory'\n>;\n\nconst initialDraft = ({\n initialInput,\n initialGroundTruth,\n initialToolMocks,\n initialTrajectory,\n}: InitialValues): AddItemDraft => {\n const steps = initialTrajectory?.steps ?? [];\n return {\n input: initialInput ?? '{}',\n groundTruth: initialGroundTruth ?? '',\n toolMocks: initialToolMocks ?? '',\n requestContextEnabled: false,\n requestContext: '',\n trajectoryEnabled: steps.length > 0,\n ordering: initialTrajectory?.ordering ?? 'relaxed',\n trajectorySteps: steps.map(toTrajectoryStepRow),\n };\n};\n\nconst TOOL_MOCKS_PLACEHOLDER = `[\n { \"toolName\": \"getWeather\", \"args\": { \"city\": \"Paris\" }, \"output\": { \"temp\": 18 } },\n { \"toolName\": \"getForecast\", \"args\": {}, \"output\": { \"days\": 5 }, \"matchArgs\": \"ignore\" }\n]`;\n\n/** The keys of the dataset's request context schema, as a JSON object to fill in. */\nconst requestContextPlaceholder = (schema: unknown) => {\n const properties = typeof schema === 'object' && schema !== null && 'properties' in schema ? schema.properties : {};\n const keys = typeof properties === 'object' && properties !== null ? Object.keys(properties) : [];\n if (keys.length === 0) return '{ \"tenantId\": \"acme\" }';\n return JSON.stringify(Object.fromEntries(keys.map(key => [key, ''])), null, 2);\n};\n\ntype WizardStep = 1 | 2 | 3;\n\n/** Only steps whose fields don't describe themselves carry a description. */\nconst STEPS: Record<WizardStep, { title: string; description?: ReactNode; optional?: boolean }> = {\n 1: { title: 'Input and ground truth' },\n 2: {\n title: 'Tool mocks',\n optional: true,\n description:\n 'Return fixed results instead of running the real tools. When the target calls a tool listed here with the same args, it gets your output back. Leave empty to run tools for real.',\n },\n 3: {\n title: 'Context and trajectory',\n optional: true,\n description:\n 'Pass values to the run, or check the steps the target takes. Leave both off to add the item without them.',\n },\n};\n\nconst GROUND_TRUTH_PLACEHOLDER = '{ \"text\": \"The answer you expect\" }';\n\n/** Copying an editor that holds nothing worth copying is noise. */\nconst hasContent = (value: string) => !['', '{}'].includes(value.trim());\n\n/** Only JSON can be formatted; offering it on plain text would only fail. */\nconst isJson = (value: string) => {\n try {\n JSON.parse(value);\n return true;\n } catch {\n return false;\n }\n};\n\nconst STEP_COUNT = Object.keys(STEPS).length;\n\nconst STEP_OF_FIELD: Record<AddItemField, WizardStep> = {\n input: 1,\n groundTruth: 1,\n toolMocks: 2,\n requestContext: 3,\n expectedTrajectory: 3,\n};\n\nconst isAddItemField = (field: string): field is AddItemField => field in STEP_OF_FIELD;\n\nconst stepTransition = 'animate-in fade-in slide-in-from-bottom-2 duration-200 motion-reduce:animate-none';\n\n/**\n * Add an item to a dataset in three steps: the input and its expected answer, tool mocks, then the request\n * context and expected trajectory. Only the first step is required; the others can be left empty.\n */\nexport function AddDatasetItemDialog({ open, onOpenChange, ...props }: AddDatasetItemDialogProps) {\n const { addItem } = useDatasetMutations();\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange} pending={addItem.isPending}>\n <DialogContent size=\"xl\">\n {/* The form unmounts on close, so every open starts fresh from the initial values. */}\n <AddDatasetItemForm {...props} addItem={addItem} onOpenChange={onOpenChange} />\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction WizardHeader({ step }: { step: WizardStep }) {\n const { title, description, optional } = STEPS[step];\n\n return (\n <DialogHeader key={step} className={stepTransition}>\n <div className=\"flex min-w-0 items-center gap-2\">\n <DialogTitle>{title}</DialogTitle>\n {optional && <Badge size=\"sm\">Optional</Badge>}\n </div>\n {description && <DialogDescription>{description}</DialogDescription>}\n </DialogHeader>\n );\n}\n\nfunction StepProgress({ step }: { step: WizardStep }) {\n return (\n <div className=\"mr-auto flex items-center gap-2\">\n <ol className=\"flex gap-1\" aria-label={`Step ${step} of ${STEP_COUNT}`}>\n {Object.keys(STEPS).map((key, index) => (\n <li\n key={key}\n aria-current={index + 1 === step ? 'step' : undefined}\n className={cn('h-1 w-6 rounded-full transition-colors', index < step ? 'bg-success-indicator' : 'bg-fill')}\n />\n ))}\n </ol>\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\" aria-hidden=\"true\">\n Step {step} of {STEP_COUNT}\n </Txt>\n </div>\n );\n}\n\ntype AddDatasetItemFormProps = Omit<AddDatasetItemDialogProps, 'open'> & {\n addItem: ReturnType<typeof useDatasetMutations>['addItem'];\n};\n\nfunction AddDatasetItemForm({\n datasetId,\n onOpenChange,\n onSuccess,\n source,\n renderCreateDatasetDialog,\n addItem,\n ...initialValues\n}: AddDatasetItemFormProps) {\n const [step, setStep] = useState<WizardStep>(1);\n const [draft, setDraft] = useState(() => initialDraft(initialValues));\n const [formError, setFormError] = useState<AddItemError>();\n const [apiErrors, setApiErrors] = useState<FieldErrors>();\n const [pickedDatasetId, setPickedDatasetId] = useState('');\n const [isCreateDatasetOpen, setIsCreateDatasetOpen] = useState(false);\n\n const targetDatasetId = datasetId ?? pickedDatasetId;\n const { data: targetDataset } = useDataset({\n datasetId: targetDatasetId,\n queryOptions: { enabled: Boolean(targetDatasetId) },\n });\n const { toolNames } = useTargetAgentTools(targetDatasetId, { enabled: true });\n const { data: datasetList, isLoading: isDatasetsLoading } = useDatasets({ queryOptions: { enabled: !datasetId } });\n const { navigate, paths } = useLinkComponent();\n\n const datasets = datasetList?.datasets ?? [];\n const pickedDataset = datasets.find(dataset => dataset.id === pickedDatasetId);\n // Picking needs the dataset listed: a just-created one is picked before the refetch returns it.\n const hasDataset = datasetId !== undefined || pickedDataset !== undefined;\n\n const update = (patch: (current: AddItemDraft) => Partial<AddItemDraft>) => {\n setDraft(current => ({ ...current, ...patch(current) }));\n setFormError(undefined);\n };\n\n const showError = (error: AddItemError) => {\n setFormError(error);\n setStep(STEP_OF_FIELD[error.field]);\n };\n\n /** Checks what was entered so far, then moves on; the trajectory is checked once reached. */\n const advance = () => {\n const checked = buildAddItemPayload({ ...draft, trajectoryEnabled: false });\n if ('error' in checked) return showError(checked.error);\n setStep(step === 1 ? 2 : 3);\n };\n\n const handleSubmit = async () => {\n const payload = buildAddItemPayload(draft);\n if ('error' in payload) return showError(payload.error);\n\n try {\n const item = await addItem.mutateAsync({\n datasetId: targetDatasetId,\n ...payload.params,\n ...(source ? { source } : {}),\n });\n if (pickedDataset) {\n // Opens the dataset with the new item's drawer; apps without that route return ''.\n const itemHref = paths.datasetItemLink(pickedDataset.id, item.id);\n toast.success(`Added to ${pickedDataset.name}`, {\n action: itemHref ? { label: 'Go to dataset', onClick: () => navigate(itemHref) } : undefined,\n });\n } else {\n toast.success('Item added successfully');\n }\n onOpenChange(false);\n onSuccess?.();\n } catch (error) {\n const fieldErrors = parseFieldErrors(error);\n if (fieldErrors) {\n setApiErrors(fieldErrors);\n if (isAddItemField(fieldErrors.field)) setStep(STEP_OF_FIELD[fieldErrors.field]);\n return;\n }\n toast.error(`Failed to add item: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n };\n\n const errorOf = (field: AddItemField) => (formError?.field === field ? formError.message : undefined);\n const apiErrorsOf = (field: AddItemField) => (apiErrors?.field === field ? apiErrors.errors : []);\n const isInvalid = (field: AddItemField) => Boolean(errorOf(field)) || apiErrorsOf(field).length > 0;\n\n const editField = (field: 'input' | 'groundTruth' | 'toolMocks' | 'requestContext') => (value: string) => {\n update(() => ({ [field]: value }));\n setApiErrors(undefined);\n };\n\n return (\n <>\n <WizardHeader step={step} />\n\n <DialogBody>\n {/* Every step stays mounted so what was entered survives going back and forth. */}\n <div hidden={step !== 1} className={cn('flex flex-col gap-6', stepTransition)}>\n {datasetId === undefined && (\n <DatasetPicker\n datasets={datasets}\n value={pickedDatasetId}\n onValueChange={setPickedDatasetId}\n loading={isDatasetsLoading || (Boolean(pickedDatasetId) && !pickedDataset)}\n disabled={addItem.isPending}\n onCreateDataset={renderCreateDatasetDialog ? () => setIsCreateDatasetOpen(true) : undefined}\n />\n )}\n\n <div className=\"grid items-start gap-5 sm:grid-cols-2\">\n <Field invalid={isInvalid('input')}>\n <FieldLabel required>Input</FieldLabel>\n <FieldDescription>What the target receives when this item runs. JSON or plain text.</FieldDescription>\n <CodeEditor\n value={draft.input}\n onChange={editField('input')}\n aria-label=\"Input\"\n showCopyButton={hasContent(draft.input)}\n showFormatButton={hasContent(draft.input) && isJson(draft.input)}\n className=\"h-[220px]\"\n />\n <FieldError>{errorOf('input')}</FieldError>\n <DatasetFieldErrors field=\"input\" errors={apiErrorsOf('input')} />\n </Field>\n <Field invalid={isInvalid('groundTruth')}>\n <FieldLabel>Ground truth</FieldLabel>\n <FieldDescription>The expected answer scorers compare against. JSON or plain text.</FieldDescription>\n <CodeEditor\n value={draft.groundTruth}\n onChange={editField('groundTruth')}\n aria-label=\"Ground truth\"\n placeholder={GROUND_TRUTH_PLACEHOLDER}\n showCopyButton={hasContent(draft.groundTruth)}\n showFormatButton={hasContent(draft.groundTruth) && isJson(draft.groundTruth)}\n className=\"h-[220px]\"\n />\n <FieldError>{errorOf('groundTruth')}</FieldError>\n <DatasetFieldErrors field=\"groundTruth\" errors={apiErrorsOf('groundTruth')} />\n </Field>\n </div>\n </div>\n\n <div hidden={step !== 2} className={stepTransition}>\n <Field invalid={isInvalid('toolMocks')}>\n <CodeEditor\n value={draft.toolMocks}\n onChange={editField('toolMocks')}\n aria-label=\"Tool mocks JSON\"\n placeholder={TOOL_MOCKS_PLACEHOLDER}\n showCopyButton={hasContent(draft.toolMocks)}\n showFormatButton={hasContent(draft.toolMocks)}\n className=\"h-80\"\n />\n <FieldError>{errorOf('toolMocks')}</FieldError>\n <DatasetFieldErrors field=\"toolMocks\" errors={apiErrorsOf('toolMocks')} />\n </Field>\n </div>\n\n <div hidden={step !== 3} className={stepTransition}>\n <SettingsContainer>\n <CollapsibleSettingsRow\n label=\"Request context\"\n description=\"Values passed to the target when this item runs.\"\n enabled={draft.requestContextEnabled}\n onEnabledChange={requestContextEnabled => update(() => ({ requestContextEnabled }))}\n errorMsg={errorOf('requestContext')}\n >\n <CodeEditor\n value={draft.requestContext}\n onChange={editField('requestContext')}\n aria-label=\"Request context JSON\"\n placeholder={requestContextPlaceholder(targetDataset?.requestContextSchema)}\n showCopyButton={hasContent(draft.requestContext)}\n showFormatButton={hasContent(draft.requestContext)}\n className=\"min-h-[120px]\"\n />\n </CollapsibleSettingsRow>\n <CollapsibleSettingsRow\n label=\"Expected trajectory\"\n description=\"The steps the target should take to produce its answer.\"\n enabled={draft.trajectoryEnabled}\n onEnabledChange={trajectoryEnabled => update(() => ({ trajectoryEnabled }))}\n errorMsg={errorOf('expectedTrajectory')}\n >\n <TrajectoryEditor\n ordering={draft.ordering}\n onOrderingChange={ordering => update(() => ({ ordering }))}\n steps={draft.trajectorySteps}\n onStepsChange={change => update(current => ({ trajectorySteps: change(current.trajectorySteps) }))}\n toolNames={toolNames}\n />\n </CollapsibleSettingsRow>\n </SettingsContainer>\n </div>\n </DialogBody>\n\n <DialogFooter>\n <StepProgress step={step} />\n {step === 1 ? (\n <DialogCancel>Cancel</DialogCancel>\n ) : (\n <Button\n variant=\"ghost\"\n disabled={addItem.isPending}\n onClick={() => setStep(current => (current - 1) as WizardStep)}\n >\n Back\n </Button>\n )}\n {step < 3 ? (\n <DialogAction disabled={!hasDataset} onConfirm={advance}>\n Next\n </DialogAction>\n ) : (\n <DialogAction onConfirm={() => void handleSubmit()}>Add item</DialogAction>\n )}\n </DialogFooter>\n\n {/* Rendered inside the dialog so the nested dialog stays in its focus scope instead of dismissing it. */}\n {renderCreateDatasetDialog?.({\n open: isCreateDatasetOpen,\n onOpenChange: setIsCreateDatasetOpen,\n onSuccess: setPickedDatasetId,\n })}\n </>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -11,6 +11,10 @@ const parseJson = (raw) => {
11
11
  return { ok: false };
12
12
  }
13
13
  };
14
+ const parseJsonOrText = (raw) => {
15
+ const parsed = parseJson(raw);
16
+ return parsed.ok ? parsed.value : raw;
17
+ };
14
18
  const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
15
19
  const parseOptionalObject = (raw) => {
16
20
  if (!raw.trim()) return { ok: true };
@@ -46,14 +50,9 @@ function toExpectedStep(row, index) {
46
50
  return { step: { name, stepType: row.stepType, ...args } };
47
51
  }
48
52
  function buildAddItemPayload(draft) {
49
- const input = parseJson(draft.input);
50
- if (!input.ok) return { error: { field: "input", message: "Input must be valid JSON" } };
51
- const params = { input: input.value };
52
- if (draft.groundTruth.trim()) {
53
- const groundTruth = parseJson(draft.groundTruth);
54
- if (!groundTruth.ok) return { error: { field: "groundTruth", message: "Ground truth must be valid JSON" } };
55
- params.groundTruth = groundTruth.value;
56
- }
53
+ if (!draft.input.trim()) return { error: { field: "input", message: "Input is required" } };
54
+ const params = { input: parseJsonOrText(draft.input) };
55
+ if (draft.groundTruth.trim()) params.groundTruth = parseJsonOrText(draft.groundTruth);
57
56
  const toolMocks = parseToolMocks(draft.toolMocks);
58
57
  if ("message" in toolMocks) return { error: { field: "toolMocks", message: toolMocks.message } };
59
58
  if (toolMocks.toolMocks) params.toolMocks = toolMocks.toolMocks;
@@ -1 +1 @@
1
- {"version":3,"file":"build-add-item-payload.cjs.js","sources":["../../../../../src/domains/datasets/components/add-dataset-item-dialog/build-add-item-payload.ts"],"sourcesContent":["import type { AddDatasetItemParams, DatasetItemToolMock } from '@mastra/client-js';\nimport { isToolStepType } from './trajectory-types';\nimport type { ExpectedStep, TrajectoryOrdering, TrajectoryStepRow } from './trajectory-types';\n\nexport type AddItemField = 'input' | 'groundTruth' | 'toolMocks' | 'requestContext' | 'expectedTrajectory';\n\nexport interface AddItemError {\n field: AddItemField;\n message: string;\n}\n\nexport interface AddItemDraft {\n input: string;\n groundTruth: string;\n /** Raw JSON: an ordered array of mocks, sent as written so every mock the runtime supports can be declared. */\n toolMocks: string;\n requestContextEnabled: boolean;\n /** Raw JSON object of values passed to the target. */\n requestContext: string;\n trajectoryEnabled: boolean;\n ordering: TrajectoryOrdering;\n trajectorySteps: TrajectoryStepRow[];\n}\n\nexport type AddItemParams = Omit<AddDatasetItemParams, 'datasetId'>;\n\ntype JsonResult = { ok: true; value: unknown } | { ok: false };\n\nconst parseJson = (raw: string): JsonResult => {\n try {\n return { ok: true, value: JSON.parse(raw) };\n } catch {\n return { ok: false };\n }\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\n/** Blank sends nothing; anything else must be a JSON object. */\nconst parseOptionalObject = (raw: string): { ok: true; value?: Record<string, unknown> } | { ok: false } => {\n if (!raw.trim()) return { ok: true };\n const parsed = parseJson(raw);\n if (!parsed.ok || !isRecord(parsed.value)) return { ok: false };\n return { ok: true, value: parsed.value };\n};\n\nconst isToolMock = (value: unknown): value is DatasetItemToolMock =>\n isRecord(value) && typeof value.toolName === 'string' && isRecord(value.args);\n\n/** Blank sends nothing; anything else must be a JSON array of `{ toolName, args, output }` mocks. */\nfunction parseToolMocks(raw: string): { toolMocks?: DatasetItemToolMock[] } | { message: string } {\n if (!raw.trim()) return {};\n const parsed = parseJson(raw);\n if (!parsed.ok) return { message: 'Tool mocks must be valid JSON' };\n if (!Array.isArray(parsed.value)) return { message: 'Tool mocks must be a JSON array' };\n if (!parsed.value.every(isToolMock))\n return { message: 'Each tool mock needs a \"toolName\" string and an \"args\" object' };\n return parsed.value.length > 0 ? { toolMocks: parsed.value } : {};\n}\n\nfunction toExpectedStep(row: TrajectoryStepRow, index: number): { step: ExpectedStep } | { message: string } {\n const label = `Step ${index + 1}`;\n const name = row.name.trim();\n if (!name) return { message: `${label} needs a name` };\n\n // Only tool steps have expected args; any other type parses blank and sends none.\n const toolArgs = parseOptionalObject(isToolStepType(row.stepType) ? row.toolArgs : '');\n if (!toolArgs.ok) return { message: `The expected args of ${label.toLowerCase()} must be a JSON object` };\n const args = toolArgs.value ? { toolArgs: toolArgs.value } : {};\n\n // A prefilled row keeps its recorded details; the editor's name and args replace the recorded ones.\n const { recorded } = row;\n if (recorded?.stepType === 'tool_call' || recorded?.stepType === 'mcp_tool_call') {\n const { toolArgs: _recordedArgs, ...details } = recorded;\n return { step: { ...details, name, ...args } };\n }\n if (recorded) return { step: { ...recorded, name } };\n\n if (row.stepType === 'generic') return { step: { name } };\n if (!isToolStepType(row.stepType)) return { step: { name, stepType: row.stepType } };\n return { step: { name, stepType: row.stepType, ...args } };\n}\n\n/** The request body for the dialog, or the first error with the field that owns it. Options that are off are left out. */\nexport function buildAddItemPayload(draft: AddItemDraft): { params: AddItemParams } | { error: AddItemError } {\n const input = parseJson(draft.input);\n if (!input.ok) return { error: { field: 'input', message: 'Input must be valid JSON' } };\n const params: AddItemParams = { input: input.value };\n\n if (draft.groundTruth.trim()) {\n const groundTruth = parseJson(draft.groundTruth);\n if (!groundTruth.ok) return { error: { field: 'groundTruth', message: 'Ground truth must be valid JSON' } };\n params.groundTruth = groundTruth.value;\n }\n\n const toolMocks = parseToolMocks(draft.toolMocks);\n if ('message' in toolMocks) return { error: { field: 'toolMocks', message: toolMocks.message } };\n if (toolMocks.toolMocks) params.toolMocks = toolMocks.toolMocks;\n\n if (draft.requestContextEnabled) {\n const requestContext = parseOptionalObject(draft.requestContext);\n if (!requestContext.ok)\n return { error: { field: 'requestContext', message: 'Request context must be a JSON object' } };\n if (requestContext.value) params.requestContext = requestContext.value;\n }\n\n if (draft.trajectoryEnabled && draft.trajectorySteps.length > 0) {\n const steps: ExpectedStep[] = [];\n for (const [index, row] of draft.trajectorySteps.entries()) {\n const result = toExpectedStep(row, index);\n if ('message' in result) return { error: { field: 'expectedTrajectory', message: result.message } };\n steps.push(result.step);\n }\n params.expectedTrajectory = { ordering: draft.ordering, steps };\n }\n\n return { params };\n}\n"],"names":["isToolStepType"],"mappings":"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"}
1
+ {"version":3,"file":"build-add-item-payload.cjs.js","sources":["../../../../../src/domains/datasets/components/add-dataset-item-dialog/build-add-item-payload.ts"],"sourcesContent":["import type { AddDatasetItemParams, DatasetItemToolMock } from '@mastra/client-js';\nimport { isToolStepType } from './trajectory-types';\nimport type { ExpectedStep, TrajectoryOrdering, TrajectoryStepRow } from './trajectory-types';\n\nexport type AddItemField = 'input' | 'groundTruth' | 'toolMocks' | 'requestContext' | 'expectedTrajectory';\n\nexport interface AddItemError {\n field: AddItemField;\n message: string;\n}\n\nexport interface AddItemDraft {\n /** JSON is sent parsed; anything else is sent as plain text. */\n input: string;\n /** Like the input; blank sends nothing. */\n groundTruth: string;\n /** Raw JSON: an ordered array of mocks, sent as written so every mock the runtime supports can be declared. */\n toolMocks: string;\n requestContextEnabled: boolean;\n /** Raw JSON object of values passed to the target. */\n requestContext: string;\n trajectoryEnabled: boolean;\n ordering: TrajectoryOrdering;\n trajectorySteps: TrajectoryStepRow[];\n}\n\nexport type AddItemParams = Omit<AddDatasetItemParams, 'datasetId'>;\n\ntype JsonResult = { ok: true; value: unknown } | { ok: false };\n\nconst parseJson = (raw: string): JsonResult => {\n try {\n return { ok: true, value: JSON.parse(raw) };\n } catch {\n return { ok: false };\n }\n};\n\n/** Text that parses as JSON is sent as that value; any other text is sent as a string. */\nconst parseJsonOrText = (raw: string): unknown => {\n const parsed = parseJson(raw);\n return parsed.ok ? parsed.value : raw;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\n/** Blank sends nothing; anything else must be a JSON object. */\nconst parseOptionalObject = (raw: string): { ok: true; value?: Record<string, unknown> } | { ok: false } => {\n if (!raw.trim()) return { ok: true };\n const parsed = parseJson(raw);\n if (!parsed.ok || !isRecord(parsed.value)) return { ok: false };\n return { ok: true, value: parsed.value };\n};\n\nconst isToolMock = (value: unknown): value is DatasetItemToolMock =>\n isRecord(value) && typeof value.toolName === 'string' && isRecord(value.args);\n\n/** Blank sends nothing; anything else must be a JSON array of `{ toolName, args, output }` mocks. */\nfunction parseToolMocks(raw: string): { toolMocks?: DatasetItemToolMock[] } | { message: string } {\n if (!raw.trim()) return {};\n const parsed = parseJson(raw);\n if (!parsed.ok) return { message: 'Tool mocks must be valid JSON' };\n if (!Array.isArray(parsed.value)) return { message: 'Tool mocks must be a JSON array' };\n if (!parsed.value.every(isToolMock))\n return { message: 'Each tool mock needs a \"toolName\" string and an \"args\" object' };\n return parsed.value.length > 0 ? { toolMocks: parsed.value } : {};\n}\n\nfunction toExpectedStep(row: TrajectoryStepRow, index: number): { step: ExpectedStep } | { message: string } {\n const label = `Step ${index + 1}`;\n const name = row.name.trim();\n if (!name) return { message: `${label} needs a name` };\n\n // Only tool steps have expected args; any other type parses blank and sends none.\n const toolArgs = parseOptionalObject(isToolStepType(row.stepType) ? row.toolArgs : '');\n if (!toolArgs.ok) return { message: `The expected args of ${label.toLowerCase()} must be a JSON object` };\n const args = toolArgs.value ? { toolArgs: toolArgs.value } : {};\n\n // A prefilled row keeps its recorded details; the editor's name and args replace the recorded ones.\n const { recorded } = row;\n if (recorded?.stepType === 'tool_call' || recorded?.stepType === 'mcp_tool_call') {\n const { toolArgs: _recordedArgs, ...details } = recorded;\n return { step: { ...details, name, ...args } };\n }\n if (recorded) return { step: { ...recorded, name } };\n\n if (row.stepType === 'generic') return { step: { name } };\n if (!isToolStepType(row.stepType)) return { step: { name, stepType: row.stepType } };\n return { step: { name, stepType: row.stepType, ...args } };\n}\n\n/** The request body for the dialog, or the first error with the field that owns it. Options that are off are left out. */\nexport function buildAddItemPayload(draft: AddItemDraft): { params: AddItemParams } | { error: AddItemError } {\n if (!draft.input.trim()) return { error: { field: 'input', message: 'Input is required' } };\n const params: AddItemParams = { input: parseJsonOrText(draft.input) };\n\n if (draft.groundTruth.trim()) params.groundTruth = parseJsonOrText(draft.groundTruth);\n\n const toolMocks = parseToolMocks(draft.toolMocks);\n if ('message' in toolMocks) return { error: { field: 'toolMocks', message: toolMocks.message } };\n if (toolMocks.toolMocks) params.toolMocks = toolMocks.toolMocks;\n\n if (draft.requestContextEnabled) {\n const requestContext = parseOptionalObject(draft.requestContext);\n if (!requestContext.ok)\n return { error: { field: 'requestContext', message: 'Request context must be a JSON object' } };\n if (requestContext.value) params.requestContext = requestContext.value;\n }\n\n if (draft.trajectoryEnabled && draft.trajectorySteps.length > 0) {\n const steps: ExpectedStep[] = [];\n for (const [index, row] of draft.trajectorySteps.entries()) {\n const result = toExpectedStep(row, index);\n if ('message' in result) return { error: { field: 'expectedTrajectory', message: result.message } };\n steps.push(result.step);\n }\n params.expectedTrajectory = { ordering: draft.ordering, steps };\n }\n\n return { params };\n}\n"],"names":["isToolStepType"],"mappings":"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"}