@mastra/playground-ui 64.0.0 → 65.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +10 -2
  2. package/components.css +340 -0
  3. package/dist/code-DJReJPSX.cjs.map +1 -1
  4. package/dist/code-DLuATvYu.js.map +1 -1
  5. package/dist/components/Breadcrumb.cjs.js +4 -2
  6. package/dist/components/Breadcrumb.cjs.js.map +1 -1
  7. package/dist/components/Breadcrumb.es.js +5 -3
  8. package/dist/components/Breadcrumb.es.js.map +1 -1
  9. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +2 -0
  10. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js.map +1 -1
  11. package/dist/domains/chat/tools/badges/workflow-badge.es.js +2 -0
  12. package/dist/domains/chat/tools/badges/workflow-badge.es.js.map +1 -1
  13. package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js +104 -92
  14. package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js.map +1 -1
  15. package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js +105 -93
  16. package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js.map +1 -1
  17. package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.cjs.js +3 -3
  18. package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.es.js +3 -3
  19. package/dist/domains/observability/components/trace-as-item-dialog.cjs.js +6 -10
  20. package/dist/domains/observability/components/trace-as-item-dialog.cjs.js.map +1 -1
  21. package/dist/domains/observability/components/trace-as-item-dialog.es.js +7 -11
  22. package/dist/domains/observability/components/trace-as-item-dialog.es.js.map +1 -1
  23. package/dist/domains/scores/components/score-as-item-dialog.cjs.js +3 -9
  24. package/dist/domains/scores/components/score-as-item-dialog.cjs.js.map +1 -1
  25. package/dist/domains/scores/components/score-as-item-dialog.es.js +4 -10
  26. package/dist/domains/scores/components/score-as-item-dialog.es.js.map +1 -1
  27. package/dist/domains/scores/components/score-data-panel.cjs.js +9 -1
  28. package/dist/domains/scores/components/score-data-panel.cjs.js.map +1 -1
  29. package/dist/domains/scores/components/score-data-panel.es.js +9 -1
  30. package/dist/domains/scores/components/score-data-panel.es.js.map +1 -1
  31. package/dist/domains/traces/components/thread-view-by-trace.cjs.js +1 -0
  32. package/dist/domains/traces/components/thread-view-by-trace.cjs.js.map +1 -1
  33. package/dist/domains/traces/components/thread-view-by-trace.es.js +1 -0
  34. package/dist/domains/traces/components/thread-view-by-trace.es.js.map +1 -1
  35. package/dist/domains/traces/components/trace-data-panel.cjs.js +1 -0
  36. package/dist/domains/traces/components/trace-data-panel.cjs.js.map +1 -1
  37. package/dist/domains/traces/components/trace-data-panel.es.js +1 -0
  38. package/dist/domains/traces/components/trace-data-panel.es.js.map +1 -1
  39. package/dist/domains/workflows/workflow/workflow-input-data.cjs.js +1 -0
  40. package/dist/domains/workflows/workflow/workflow-input-data.cjs.js.map +1 -1
  41. package/dist/domains/workflows/workflow/workflow-input-data.es.js +1 -0
  42. package/dist/domains/workflows/workflow/workflow-input-data.es.js.map +1 -1
  43. package/dist/primitives/raised-surface.cjs.js.map +1 -1
  44. package/dist/primitives/raised-surface.es.js.map +1 -1
  45. package/dist/src/domains/datasets/components/index.d.ts +1 -1
  46. package/dist/src/domains/datasets/components/save-as-dataset-item-dialog.d.ts +14 -3
  47. package/dist/src/domains/observability/components/trace-as-item-dialog.d.ts +5 -3
  48. package/dist/src/domains/scores/components/score-as-item-dialog.d.ts +3 -3
  49. package/dist/src/ds/components/Breadcrumb/Breadcrumb.d.ts +2 -2
  50. package/dist/src/ds/components/Code/code.d.ts +1 -1
  51. package/dist/src/ds/primitives/raised-surface.d.ts +1 -1
  52. package/dist/style.css +22 -19
  53. package/dist/toast.css +1 -1
  54. package/dist/tokens.cjs.js.map +1 -1
  55. package/dist/tokens.es.js.map +1 -1
  56. package/dist/use-text-highlight.css +4 -4
  57. package/package.json +16 -12
  58. package/sources.css +1 -0
  59. package/theme/code.css +17 -0
  60. package/theme/surfaces.css +2 -2
  61. package/theme.css +2 -0
@@ -1,9 +1,7 @@
1
- import { jsx, jsxs } from 'react/jsx-runtime';
1
+ import { jsx } from 'react/jsx-runtime';
2
2
  import { safeStringify } from '@mastra/core/utils/safe-stringify';
3
- import { CalculatorIcon } from 'lucide-react';
4
3
  import { SaveAsDatasetItemDialog } from '../../datasets/components/save-as-dataset-item-dialog.es.js';
5
4
  import '@mastra/react/hooks/datasets';
6
- import { T as TextAndIcon } from '../../../text-and-icon-CRYBkgtj.js';
7
5
  import { getShortId } from '../../../utils/id.es.js';
8
6
 
9
7
  function getInitialInput(score) {
@@ -14,20 +12,16 @@ function getInitialGroundTruth(score) {
14
12
  if (!score) return "";
15
13
  return safeStringify({ score: score.score, reason: score.reason ?? null }, 2);
16
14
  }
17
- function ScoreAsItemDialog({ score, isOpen, onClose, level = 2 }) {
15
+ function ScoreAsItemDialog({ score, isOpen, onClose, depth }) {
18
16
  return /* @__PURE__ */ jsx(
19
17
  SaveAsDatasetItemDialog,
20
18
  {
21
19
  initialInput: getInitialInput(score),
22
20
  initialGroundTruth: getInitialGroundTruth(score),
23
- breadcrumb: /* @__PURE__ */ jsxs(TextAndIcon, { children: [
24
- /* @__PURE__ */ jsx(CalculatorIcon, {}),
25
- " ",
26
- getShortId(score?.id)
27
- ] }),
21
+ breadcrumb: getShortId(score?.id),
28
22
  isOpen,
29
23
  onClose,
30
- level,
24
+ depth,
31
25
  source: score?.traceId ? { type: "trace", referenceId: score.traceId } : void 0
32
26
  }
33
27
  );
@@ -1 +1 @@
1
- {"version":3,"file":"score-as-item-dialog.es.js","sources":["../../../../src/domains/scores/components/score-as-item-dialog.tsx"],"sourcesContent":["'use client';\n\nimport type { ClientScoreRowData } from '@mastra/client-js';\nimport type { ScoreRowData } from '@mastra/core/evals';\nimport { safeStringify } from '@mastra/core/utils/safe-stringify';\nimport { CalculatorIcon } from 'lucide-react';\nimport { SaveAsDatasetItemDialog } from '@/domains/datasets';\nimport type { SideDialogRootProps } from '@/ds/components/SideDialog';\nimport { TextAndIcon, getShortId } from '@/ds/components/Text';\n\ntype ScoreForDatasetItem = ScoreRowData | ClientScoreRowData;\n\nexport type ScoreAsItemDialogProps = {\n score?: ScoreForDatasetItem;\n isOpen: boolean;\n onClose: () => void;\n level?: SideDialogRootProps['level'];\n};\n\nfunction getInitialInput(score?: ScoreForDatasetItem): string {\n if (!score) return '{}';\n // input = the full scorer.run() payload: { input, output, groundTruth }\n // groundTruth from the original experiment is not available on ScoreRowData,\n // so we omit it — user can add it manually in the editor\n return safeStringify({ input: score.input, output: score.output, groundTruth: null }, 2);\n}\n\nfunction getInitialGroundTruth(score?: ScoreForDatasetItem): string {\n if (!score) return '';\n // ground truth = expected scorer result — pre-fill with actual score/reason so user can adjust\n return safeStringify({ score: score.score, reason: score.reason ?? null }, 2);\n}\n\nexport function ScoreAsItemDialog({ score, isOpen, onClose, level = 2 }: ScoreAsItemDialogProps) {\n return (\n <SaveAsDatasetItemDialog\n initialInput={getInitialInput(score)}\n initialGroundTruth={getInitialGroundTruth(score)}\n breadcrumb={\n <TextAndIcon>\n <CalculatorIcon /> {getShortId(score?.id)}\n </TextAndIcon>\n }\n isOpen={isOpen}\n onClose={onClose}\n level={level}\n source={score?.traceId ? { type: 'trace', referenceId: score.traceId } : undefined}\n />\n );\n}\n"],"names":[],"mappings":";;;;;;;;AAmBA,SAAS,gBAAgB,KAAA,EAAqC;AAC5D,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAInB,EAAA,OAAO,aAAA,CAAc,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAK,EAAG,CAAC,CAAA;AACzF;AAEA,SAAS,sBAAsB,KAAA,EAAqC;AAClE,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AAEnB,EAAA,OAAO,aAAA,CAAc,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,QAAQ,KAAA,CAAM,MAAA,IAAU,IAAA,EAAK,EAAG,CAAC,CAAA;AAC9E;AAEO,SAAS,kBAAkB,EAAE,KAAA,EAAO,QAAQ,OAAA,EAAS,KAAA,GAAQ,GAAE,EAA2B;AAC/F,EAAA,uBACE,GAAA;AAAA,IAAC,uBAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAc,gBAAgB,KAAK,CAAA;AAAA,MACnC,kBAAA,EAAoB,sBAAsB,KAAK,CAAA;AAAA,MAC/C,UAAA,uBACG,WAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,CAAA;AAAA,QAAE,GAAA;AAAA,QAAE,UAAA,CAAW,OAAO,EAAE;AAAA,OAAA,EAC1C,CAAA;AAAA,MAEF,MAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA,EAAQ,OAAO,OAAA,GAAU,EAAE,MAAM,OAAA,EAAS,WAAA,EAAa,KAAA,CAAM,OAAA,EAAQ,GAAI;AAAA;AAAA,GAC3E;AAEJ;;;;"}
1
+ {"version":3,"file":"score-as-item-dialog.es.js","sources":["../../../../src/domains/scores/components/score-as-item-dialog.tsx"],"sourcesContent":["'use client';\n\nimport type { ClientScoreRowData } from '@mastra/client-js';\nimport type { ScoreRowData } from '@mastra/core/evals';\nimport { safeStringify } from '@mastra/core/utils/safe-stringify';\nimport { SaveAsDatasetItemDialog } from '@/domains/datasets';\nimport type { DataPanelProps } from '@/ds/components/DataPanel';\nimport { getShortId } from '@/ds/components/Text';\n\ntype ScoreForDatasetItem = ScoreRowData | ClientScoreRowData;\n\nexport type ScoreAsItemDialogProps = {\n score?: ScoreForDatasetItem;\n isOpen: boolean;\n onClose: () => void;\n depth?: DataPanelProps['depth'];\n};\n\nfunction getInitialInput(score?: ScoreForDatasetItem): string {\n if (!score) return '{}';\n // input = the full scorer.run() payload: { input, output, groundTruth }\n // groundTruth from the original experiment is not available on ScoreRowData,\n // so we omit it — user can add it manually in the editor\n return safeStringify({ input: score.input, output: score.output, groundTruth: null }, 2);\n}\n\nfunction getInitialGroundTruth(score?: ScoreForDatasetItem): string {\n if (!score) return '';\n // ground truth = expected scorer result — pre-fill with actual score/reason so user can adjust\n return safeStringify({ score: score.score, reason: score.reason ?? null }, 2);\n}\n\nexport function ScoreAsItemDialog({ score, isOpen, onClose, depth }: ScoreAsItemDialogProps) {\n return (\n <SaveAsDatasetItemDialog\n initialInput={getInitialInput(score)}\n initialGroundTruth={getInitialGroundTruth(score)}\n breadcrumb={getShortId(score?.id)}\n isOpen={isOpen}\n onClose={onClose}\n depth={depth}\n source={score?.traceId ? { type: 'trace', referenceId: score.traceId } : undefined}\n />\n );\n}\n"],"names":[],"mappings":";;;;;;AAkBA,SAAS,gBAAgB,KAAA,EAAqC;AAC5D,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAInB,EAAA,OAAO,aAAA,CAAc,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAK,EAAG,CAAC,CAAA;AACzF;AAEA,SAAS,sBAAsB,KAAA,EAAqC;AAClE,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AAEnB,EAAA,OAAO,aAAA,CAAc,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,QAAQ,KAAA,CAAM,MAAA,IAAU,IAAA,EAAK,EAAG,CAAC,CAAA;AAC9E;AAEO,SAAS,kBAAkB,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,OAAM,EAA2B;AAC3F,EAAA,uBACE,GAAA;AAAA,IAAC,uBAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAc,gBAAgB,KAAK,CAAA;AAAA,MACnC,kBAAA,EAAoB,sBAAsB,KAAK,CAAA;AAAA,MAC/C,UAAA,EAAY,UAAA,CAAW,KAAA,EAAO,EAAE,CAAA;AAAA,MAChC,MAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA,EAAQ,OAAO,OAAA,GAAU,EAAE,MAAM,OAAA,EAAS,WAAA,EAAa,KAAA,CAAM,OAAA,EAAQ,GAAI;AAAA;AAAA,GAC3E;AAEJ;;;;"}
@@ -170,7 +170,15 @@ function ScoreDataPanel({ score, onClose, onPrevious, onNext, depth }) {
170
170
  ] })
171
171
  ] })
172
172
  ] }) }),
173
- score && /* @__PURE__ */ jsxRuntime.jsx(domains_scores_components_scoreAsItemDialog.ScoreAsItemDialog, { score, isOpen: datasetDialogOpen, onClose: () => setDatasetDialogOpen(false) })
173
+ score && /* @__PURE__ */ jsxRuntime.jsx(
174
+ domains_scores_components_scoreAsItemDialog.ScoreAsItemDialog,
175
+ {
176
+ score,
177
+ isOpen: datasetDialogOpen,
178
+ onClose: () => setDatasetDialogOpen(false),
179
+ depth: (depth ?? 1) > 1 ? 3 : 2
180
+ }
181
+ )
174
182
  ] });
175
183
  }
176
184
 
@@ -1 +1 @@
1
- {"version":3,"file":"score-data-panel.cjs.js","sources":["../../../../src/domains/scores/components/score-data-panel.tsx"],"sourcesContent":["import type { ClientScoreRowData } from '@mastra/client-js';\nimport { FileInputIcon, FileOutputIcon, GaugeIcon, ReceiptText, SaveIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport { ScoreAsItemDialog } from './score-as-item-dialog';\nimport { Button } from '@/ds/components/Button';\nimport { DataKeysAndValues } from '@/ds/components/DataKeysAndValues';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport { Txt } from '@/ds/components/Txt';\nimport { useLinkComponent } from '@/lib/framework';\nimport { cn } from '@/utils/cn';\nimport { formatTimestampPrecise } from '@/utils/date-format';\n\nfunction isCodeBasedScorer(score?: ClientScoreRowData): boolean {\n if (!score) return false;\n const scorer = score.scorer as Record<string, unknown> | undefined;\n if (scorer?.hasJudge === false) return true;\n if (scorer?.hasJudge === true) return false;\n return !score.preprocessPrompt && !score.analyzePrompt && !score.generateScorePrompt && !score.generateReasonPrompt;\n}\n\nfunction buildDialogTitle(sectionTitle: string, icon: React.ReactNode, score: ClientScoreRowData) {\n return (\n <>\n <Txt as=\"span\" variant=\"eyebrow\" tone=\"faint\" className=\"flex items-center gap-1.5 [&>svg]:size-3.5\">\n {icon}\n {sectionTitle}\n </Txt>\n <span>\n › Score <b className=\"text-muted-foreground\">#{score.id}</b>\n </span>\n </>\n );\n}\n\nexport interface ScoreDataPanelProps {\n /** Always mount the panel and pass `undefined` to close it, so the drawer can animate out. */\n score?: ClientScoreRowData;\n onClose: () => void;\n onPrevious?: () => void;\n onNext?: () => void;\n depth?: 1 | 2 | 3;\n}\n\nexport function ScoreDataPanel({ score, onClose, onPrevious, onNext, depth }: ScoreDataPanelProps) {\n const { Link, paths } = useLinkComponent();\n const [datasetDialogOpen, setDatasetDialogOpen] = useState(false);\n const isCodeBased = isCodeBasedScorer(score);\n const naText = isCodeBased ? 'N/A — code-based scorer does not use prompts' : 'N/A — step not configured';\n\n return (\n <>\n <DataPanel open={!!score} onClose={onClose} title={score ? `Score ${score.id}` : 'Score'} depth={depth}>\n {score && (\n <>\n <DataPanel.Header>\n <DataPanel.Heading>\n Score\n <DataPanel.CopyId id={score.id} />\n </DataPanel.Heading>\n <DataPanel.HeaderActions>\n {(onPrevious || onNext) && (\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Go to previous score\"\n nextLabel=\"Go to next score\"\n />\n )}\n <DataPanel.CloseButton icon=\"x\" onClick={onClose} label=\"Close score\" tooltip=\"Close score\" />\n </DataPanel.HeaderActions>\n </DataPanel.Header>\n\n <DataPanel.Content>\n <DataKeysAndValues>\n {score.scorer?.name != null && (\n <>\n <DataKeysAndValues.Key>Scorer</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{String(score.scorer.name)}</DataKeysAndValues.Value>\n </>\n )}\n {score.createdAt && (\n <>\n <DataKeysAndValues.Key>Created</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{formatTimestampPrecise(score.createdAt)}</DataKeysAndValues.Value>\n </>\n )}\n {score.traceId && (\n <>\n <DataKeysAndValues.Key>Trace Id</DataKeysAndValues.Key>\n {paths.traceLink(score.traceId) ? (\n <DataKeysAndValues.ValueLink href={paths.traceLink(score.traceId)} as={Link}>\n {score.traceId}\n </DataKeysAndValues.ValueLink>\n ) : (\n <DataKeysAndValues.Value>{score.traceId}</DataKeysAndValues.Value>\n )}\n </>\n )}\n {score.spanId && score.traceId && (\n <>\n <DataKeysAndValues.Key>Span Id</DataKeysAndValues.Key>\n {paths.traceLink(score.traceId, score.spanId) ? (\n <DataKeysAndValues.ValueLink href={paths.traceLink(score.traceId, score.spanId)} as={Link}>\n {score.spanId}\n </DataKeysAndValues.ValueLink>\n ) : (\n <DataKeysAndValues.Value>{score.spanId}</DataKeysAndValues.Value>\n )}\n </>\n )}\n </DataKeysAndValues>\n\n <div className=\"my-6 flex justify-end\">\n <Button size=\"sm\" onClick={() => setDatasetDialogOpen(true)} icon={<SaveIcon />}>\n Save as Dataset Item\n </Button>\n </div>\n\n <div className=\"mb-6 text-muted-foreground\">\n <div\n className={cn(\n 'text-placeholder',\n 'flex items-baseline gap-2',\n '[&>svg]:size-5 [&>svg]:translate-y-1',\n )}\n >\n <GaugeIcon />\n <Txt as=\"span\" variant=\"body\">\n Score:\n </Txt>\n <Txt\n as=\"b\"\n variant=\"body\"\n tone=\"muted\"\n className=\"tabular-nums\"\n >{`${score.score == null || Number.isNaN(score.score) ? 'n/a' : score.score}`}</Txt>\n </div>\n <Txt as=\"p\" variant=\"body-sm\" className=\"mt-2\">\n {score.reason ||\n (isCodeBased ? 'N/A — code-based scorer does not generate a reason' : 'N/A — step not configured')}\n </Txt>\n </div>\n\n <div className=\"grid gap-4\">\n <DataPanel.CodeSection\n title=\"Input\"\n dialogTitle={buildDialogTitle('Input', <FileInputIcon />, score)}\n icon={<FileInputIcon />}\n codeStr={JSON.stringify(score.input ?? null, null, 2)}\n />\n <DataPanel.CodeSection\n title=\"Output\"\n dialogTitle={buildDialogTitle('Output', <FileOutputIcon />, score)}\n icon={<FileOutputIcon />}\n codeStr={JSON.stringify(score.output ?? null, null, 2)}\n />\n <DataPanel.CodeSection\n title=\"Preprocess Prompt\"\n dialogTitle={buildDialogTitle('Preprocess Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.preprocessPrompt || naText}\n simplified={true}\n />\n <DataPanel.CodeSection\n title=\"Analyze Prompt\"\n dialogTitle={buildDialogTitle('Analyze Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.analyzePrompt || naText}\n simplified={true}\n />\n <DataPanel.CodeSection\n title=\"Generate Score Prompt\"\n dialogTitle={buildDialogTitle('Generate Score Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.generateScorePrompt || naText}\n simplified={true}\n />\n <DataPanel.CodeSection\n title=\"Generate Reason Prompt\"\n dialogTitle={buildDialogTitle('Generate Reason Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.generateReasonPrompt || naText}\n simplified={true}\n />\n </div>\n </DataPanel.Content>\n </>\n )}\n </DataPanel>\n\n {score && (\n <ScoreAsItemDialog score={score} isOpen={datasetDialogOpen} onClose={() => setDatasetDialogOpen(false)} />\n )}\n </>\n );\n}\n"],"names":["jsxs","Fragment","Txt","useLinkComponent","useState","jsx","DataPanel","DataKeysAndValues","formatTimestampPrecise","Button","SaveIcon","cn","GaugeIcon","FileInputIcon","FileOutputIcon","ReceiptText","ScoreAsItemDialog"],"mappings":"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"}
1
+ {"version":3,"file":"score-data-panel.cjs.js","sources":["../../../../src/domains/scores/components/score-data-panel.tsx"],"sourcesContent":["import type { ClientScoreRowData } from '@mastra/client-js';\nimport { FileInputIcon, FileOutputIcon, GaugeIcon, ReceiptText, SaveIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport { ScoreAsItemDialog } from './score-as-item-dialog';\nimport { Button } from '@/ds/components/Button';\nimport { DataKeysAndValues } from '@/ds/components/DataKeysAndValues';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport { Txt } from '@/ds/components/Txt';\nimport { useLinkComponent } from '@/lib/framework';\nimport { cn } from '@/utils/cn';\nimport { formatTimestampPrecise } from '@/utils/date-format';\n\nfunction isCodeBasedScorer(score?: ClientScoreRowData): boolean {\n if (!score) return false;\n const scorer = score.scorer as Record<string, unknown> | undefined;\n if (scorer?.hasJudge === false) return true;\n if (scorer?.hasJudge === true) return false;\n return !score.preprocessPrompt && !score.analyzePrompt && !score.generateScorePrompt && !score.generateReasonPrompt;\n}\n\nfunction buildDialogTitle(sectionTitle: string, icon: React.ReactNode, score: ClientScoreRowData) {\n return (\n <>\n <Txt as=\"span\" variant=\"eyebrow\" tone=\"faint\" className=\"flex items-center gap-1.5 [&>svg]:size-3.5\">\n {icon}\n {sectionTitle}\n </Txt>\n <span>\n › Score <b className=\"text-muted-foreground\">#{score.id}</b>\n </span>\n </>\n );\n}\n\nexport interface ScoreDataPanelProps {\n /** Always mount the panel and pass `undefined` to close it, so the drawer can animate out. */\n score?: ClientScoreRowData;\n onClose: () => void;\n onPrevious?: () => void;\n onNext?: () => void;\n depth?: 1 | 2 | 3;\n}\n\nexport function ScoreDataPanel({ score, onClose, onPrevious, onNext, depth }: ScoreDataPanelProps) {\n const { Link, paths } = useLinkComponent();\n const [datasetDialogOpen, setDatasetDialogOpen] = useState(false);\n const isCodeBased = isCodeBasedScorer(score);\n const naText = isCodeBased ? 'N/A — code-based scorer does not use prompts' : 'N/A — step not configured';\n\n return (\n <>\n <DataPanel open={!!score} onClose={onClose} title={score ? `Score ${score.id}` : 'Score'} depth={depth}>\n {score && (\n <>\n <DataPanel.Header>\n <DataPanel.Heading>\n Score\n <DataPanel.CopyId id={score.id} />\n </DataPanel.Heading>\n <DataPanel.HeaderActions>\n {(onPrevious || onNext) && (\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Go to previous score\"\n nextLabel=\"Go to next score\"\n />\n )}\n <DataPanel.CloseButton icon=\"x\" onClick={onClose} label=\"Close score\" tooltip=\"Close score\" />\n </DataPanel.HeaderActions>\n </DataPanel.Header>\n\n <DataPanel.Content>\n <DataKeysAndValues>\n {score.scorer?.name != null && (\n <>\n <DataKeysAndValues.Key>Scorer</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{String(score.scorer.name)}</DataKeysAndValues.Value>\n </>\n )}\n {score.createdAt && (\n <>\n <DataKeysAndValues.Key>Created</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{formatTimestampPrecise(score.createdAt)}</DataKeysAndValues.Value>\n </>\n )}\n {score.traceId && (\n <>\n <DataKeysAndValues.Key>Trace Id</DataKeysAndValues.Key>\n {paths.traceLink(score.traceId) ? (\n <DataKeysAndValues.ValueLink href={paths.traceLink(score.traceId)} as={Link}>\n {score.traceId}\n </DataKeysAndValues.ValueLink>\n ) : (\n <DataKeysAndValues.Value>{score.traceId}</DataKeysAndValues.Value>\n )}\n </>\n )}\n {score.spanId && score.traceId && (\n <>\n <DataKeysAndValues.Key>Span Id</DataKeysAndValues.Key>\n {paths.traceLink(score.traceId, score.spanId) ? (\n <DataKeysAndValues.ValueLink href={paths.traceLink(score.traceId, score.spanId)} as={Link}>\n {score.spanId}\n </DataKeysAndValues.ValueLink>\n ) : (\n <DataKeysAndValues.Value>{score.spanId}</DataKeysAndValues.Value>\n )}\n </>\n )}\n </DataKeysAndValues>\n\n <div className=\"my-6 flex justify-end\">\n <Button size=\"sm\" onClick={() => setDatasetDialogOpen(true)} icon={<SaveIcon />}>\n Save as Dataset Item\n </Button>\n </div>\n\n <div className=\"mb-6 text-muted-foreground\">\n <div\n className={cn(\n 'text-placeholder',\n 'flex items-baseline gap-2',\n '[&>svg]:size-5 [&>svg]:translate-y-1',\n )}\n >\n <GaugeIcon />\n <Txt as=\"span\" variant=\"body\">\n Score:\n </Txt>\n <Txt\n as=\"b\"\n variant=\"body\"\n tone=\"muted\"\n className=\"tabular-nums\"\n >{`${score.score == null || Number.isNaN(score.score) ? 'n/a' : score.score}`}</Txt>\n </div>\n <Txt as=\"p\" variant=\"body-sm\" className=\"mt-2\">\n {score.reason ||\n (isCodeBased ? 'N/A — code-based scorer does not generate a reason' : 'N/A — step not configured')}\n </Txt>\n </div>\n\n <div className=\"grid gap-4\">\n <DataPanel.CodeSection\n title=\"Input\"\n dialogTitle={buildDialogTitle('Input', <FileInputIcon />, score)}\n icon={<FileInputIcon />}\n codeStr={JSON.stringify(score.input ?? null, null, 2)}\n />\n <DataPanel.CodeSection\n title=\"Output\"\n dialogTitle={buildDialogTitle('Output', <FileOutputIcon />, score)}\n icon={<FileOutputIcon />}\n codeStr={JSON.stringify(score.output ?? null, null, 2)}\n />\n <DataPanel.CodeSection\n title=\"Preprocess Prompt\"\n dialogTitle={buildDialogTitle('Preprocess Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.preprocessPrompt || naText}\n simplified={true}\n />\n <DataPanel.CodeSection\n title=\"Analyze Prompt\"\n dialogTitle={buildDialogTitle('Analyze Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.analyzePrompt || naText}\n simplified={true}\n />\n <DataPanel.CodeSection\n title=\"Generate Score Prompt\"\n dialogTitle={buildDialogTitle('Generate Score Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.generateScorePrompt || naText}\n simplified={true}\n />\n <DataPanel.CodeSection\n title=\"Generate Reason Prompt\"\n dialogTitle={buildDialogTitle('Generate Reason Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.generateReasonPrompt || naText}\n simplified={true}\n />\n </div>\n </DataPanel.Content>\n </>\n )}\n </DataPanel>\n\n {score && (\n <ScoreAsItemDialog\n score={score}\n isOpen={datasetDialogOpen}\n onClose={() => setDatasetDialogOpen(false)}\n depth={(depth ?? 1) > 1 ? 3 : 2}\n />\n )}\n </>\n );\n}\n"],"names":["jsxs","Fragment","Txt","useLinkComponent","useState","jsx","DataPanel","DataKeysAndValues","formatTimestampPrecise","Button","SaveIcon","cn","GaugeIcon","FileInputIcon","FileOutputIcon","ReceiptText","ScoreAsItemDialog"],"mappings":"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"}
@@ -166,7 +166,15 @@ function ScoreDataPanel({ score, onClose, onPrevious, onNext, depth }) {
166
166
  ] })
167
167
  ] })
168
168
  ] }) }),
169
- score && /* @__PURE__ */ jsx(ScoreAsItemDialog, { score, isOpen: datasetDialogOpen, onClose: () => setDatasetDialogOpen(false) })
169
+ score && /* @__PURE__ */ jsx(
170
+ ScoreAsItemDialog,
171
+ {
172
+ score,
173
+ isOpen: datasetDialogOpen,
174
+ onClose: () => setDatasetDialogOpen(false),
175
+ depth: (depth ?? 1) > 1 ? 3 : 2
176
+ }
177
+ )
170
178
  ] });
171
179
  }
172
180
 
@@ -1 +1 @@
1
- {"version":3,"file":"score-data-panel.es.js","sources":["../../../../src/domains/scores/components/score-data-panel.tsx"],"sourcesContent":["import type { ClientScoreRowData } from '@mastra/client-js';\nimport { FileInputIcon, FileOutputIcon, GaugeIcon, ReceiptText, SaveIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport { ScoreAsItemDialog } from './score-as-item-dialog';\nimport { Button } from '@/ds/components/Button';\nimport { DataKeysAndValues } from '@/ds/components/DataKeysAndValues';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport { Txt } from '@/ds/components/Txt';\nimport { useLinkComponent } from '@/lib/framework';\nimport { cn } from '@/utils/cn';\nimport { formatTimestampPrecise } from '@/utils/date-format';\n\nfunction isCodeBasedScorer(score?: ClientScoreRowData): boolean {\n if (!score) return false;\n const scorer = score.scorer as Record<string, unknown> | undefined;\n if (scorer?.hasJudge === false) return true;\n if (scorer?.hasJudge === true) return false;\n return !score.preprocessPrompt && !score.analyzePrompt && !score.generateScorePrompt && !score.generateReasonPrompt;\n}\n\nfunction buildDialogTitle(sectionTitle: string, icon: React.ReactNode, score: ClientScoreRowData) {\n return (\n <>\n <Txt as=\"span\" variant=\"eyebrow\" tone=\"faint\" className=\"flex items-center gap-1.5 [&>svg]:size-3.5\">\n {icon}\n {sectionTitle}\n </Txt>\n <span>\n › Score <b className=\"text-muted-foreground\">#{score.id}</b>\n </span>\n </>\n );\n}\n\nexport interface ScoreDataPanelProps {\n /** Always mount the panel and pass `undefined` to close it, so the drawer can animate out. */\n score?: ClientScoreRowData;\n onClose: () => void;\n onPrevious?: () => void;\n onNext?: () => void;\n depth?: 1 | 2 | 3;\n}\n\nexport function ScoreDataPanel({ score, onClose, onPrevious, onNext, depth }: ScoreDataPanelProps) {\n const { Link, paths } = useLinkComponent();\n const [datasetDialogOpen, setDatasetDialogOpen] = useState(false);\n const isCodeBased = isCodeBasedScorer(score);\n const naText = isCodeBased ? 'N/A — code-based scorer does not use prompts' : 'N/A — step not configured';\n\n return (\n <>\n <DataPanel open={!!score} onClose={onClose} title={score ? `Score ${score.id}` : 'Score'} depth={depth}>\n {score && (\n <>\n <DataPanel.Header>\n <DataPanel.Heading>\n Score\n <DataPanel.CopyId id={score.id} />\n </DataPanel.Heading>\n <DataPanel.HeaderActions>\n {(onPrevious || onNext) && (\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Go to previous score\"\n nextLabel=\"Go to next score\"\n />\n )}\n <DataPanel.CloseButton icon=\"x\" onClick={onClose} label=\"Close score\" tooltip=\"Close score\" />\n </DataPanel.HeaderActions>\n </DataPanel.Header>\n\n <DataPanel.Content>\n <DataKeysAndValues>\n {score.scorer?.name != null && (\n <>\n <DataKeysAndValues.Key>Scorer</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{String(score.scorer.name)}</DataKeysAndValues.Value>\n </>\n )}\n {score.createdAt && (\n <>\n <DataKeysAndValues.Key>Created</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{formatTimestampPrecise(score.createdAt)}</DataKeysAndValues.Value>\n </>\n )}\n {score.traceId && (\n <>\n <DataKeysAndValues.Key>Trace Id</DataKeysAndValues.Key>\n {paths.traceLink(score.traceId) ? (\n <DataKeysAndValues.ValueLink href={paths.traceLink(score.traceId)} as={Link}>\n {score.traceId}\n </DataKeysAndValues.ValueLink>\n ) : (\n <DataKeysAndValues.Value>{score.traceId}</DataKeysAndValues.Value>\n )}\n </>\n )}\n {score.spanId && score.traceId && (\n <>\n <DataKeysAndValues.Key>Span Id</DataKeysAndValues.Key>\n {paths.traceLink(score.traceId, score.spanId) ? (\n <DataKeysAndValues.ValueLink href={paths.traceLink(score.traceId, score.spanId)} as={Link}>\n {score.spanId}\n </DataKeysAndValues.ValueLink>\n ) : (\n <DataKeysAndValues.Value>{score.spanId}</DataKeysAndValues.Value>\n )}\n </>\n )}\n </DataKeysAndValues>\n\n <div className=\"my-6 flex justify-end\">\n <Button size=\"sm\" onClick={() => setDatasetDialogOpen(true)} icon={<SaveIcon />}>\n Save as Dataset Item\n </Button>\n </div>\n\n <div className=\"mb-6 text-muted-foreground\">\n <div\n className={cn(\n 'text-placeholder',\n 'flex items-baseline gap-2',\n '[&>svg]:size-5 [&>svg]:translate-y-1',\n )}\n >\n <GaugeIcon />\n <Txt as=\"span\" variant=\"body\">\n Score:\n </Txt>\n <Txt\n as=\"b\"\n variant=\"body\"\n tone=\"muted\"\n className=\"tabular-nums\"\n >{`${score.score == null || Number.isNaN(score.score) ? 'n/a' : score.score}`}</Txt>\n </div>\n <Txt as=\"p\" variant=\"body-sm\" className=\"mt-2\">\n {score.reason ||\n (isCodeBased ? 'N/A — code-based scorer does not generate a reason' : 'N/A — step not configured')}\n </Txt>\n </div>\n\n <div className=\"grid gap-4\">\n <DataPanel.CodeSection\n title=\"Input\"\n dialogTitle={buildDialogTitle('Input', <FileInputIcon />, score)}\n icon={<FileInputIcon />}\n codeStr={JSON.stringify(score.input ?? null, null, 2)}\n />\n <DataPanel.CodeSection\n title=\"Output\"\n dialogTitle={buildDialogTitle('Output', <FileOutputIcon />, score)}\n icon={<FileOutputIcon />}\n codeStr={JSON.stringify(score.output ?? null, null, 2)}\n />\n <DataPanel.CodeSection\n title=\"Preprocess Prompt\"\n dialogTitle={buildDialogTitle('Preprocess Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.preprocessPrompt || naText}\n simplified={true}\n />\n <DataPanel.CodeSection\n title=\"Analyze Prompt\"\n dialogTitle={buildDialogTitle('Analyze Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.analyzePrompt || naText}\n simplified={true}\n />\n <DataPanel.CodeSection\n title=\"Generate Score Prompt\"\n dialogTitle={buildDialogTitle('Generate Score Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.generateScorePrompt || naText}\n simplified={true}\n />\n <DataPanel.CodeSection\n title=\"Generate Reason Prompt\"\n dialogTitle={buildDialogTitle('Generate Reason Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.generateReasonPrompt || naText}\n simplified={true}\n />\n </div>\n </DataPanel.Content>\n </>\n )}\n </DataPanel>\n\n {score && (\n <ScoreAsItemDialog score={score} isOpen={datasetDialogOpen} onClose={() => setDatasetDialogOpen(false)} />\n )}\n </>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAYA,SAAS,kBAAkB,KAAA,EAAqC;AAC9D,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,EAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,EAAA,IAAI,MAAA,EAAQ,QAAA,KAAa,KAAA,EAAO,OAAO,IAAA;AACvC,EAAA,IAAI,MAAA,EAAQ,QAAA,KAAa,IAAA,EAAM,OAAO,KAAA;AACtC,EAAA,OAAO,CAAC,KAAA,CAAM,gBAAA,IAAoB,CAAC,KAAA,CAAM,iBAAiB,CAAC,KAAA,CAAM,mBAAA,IAAuB,CAAC,KAAA,CAAM,oBAAA;AACjG;AAEA,SAAS,gBAAA,CAAiB,YAAA,EAAsB,IAAA,EAAuB,KAAA,EAA2B;AAChG,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,GAAA,EAAA,EAAI,IAAG,MAAA,EAAO,OAAA,EAAQ,WAAU,IAAA,EAAK,OAAA,EAAQ,WAAU,4CAAA,EACrD,QAAA,EAAA;AAAA,MAAA,IAAA;AAAA,MACA;AAAA,KAAA,EACH,CAAA;AAAA,yBACC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,MAAA,UAAA;AAAA,sBACI,IAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA;AAAA,QAAA,GAAA;AAAA,QAAE,KAAA,CAAM;AAAA,OAAA,EAAG;AAAA,KAAA,EAC1D;AAAA,GAAA,EACF,CAAA;AAEJ;AAWO,SAAS,eAAe,EAAE,KAAA,EAAO,SAAS,UAAA,EAAY,MAAA,EAAQ,OAAM,EAAwB;AACjG,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,gBAAA,EAAiB;AACzC,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,SAAS,KAAK,CAAA;AAChE,EAAA,MAAM,WAAA,GAAc,kBAAkB,KAAK,CAAA;AAC3C,EAAA,MAAM,MAAA,GAAS,cAAc,8CAAA,GAAiD,2BAAA;AAE9E,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,IAAA,EAAM,CAAC,CAAC,OAAO,OAAA,EAAkB,KAAA,EAAO,KAAA,GAAQ,CAAA,MAAA,EAAS,MAAM,EAAE,CAAA,CAAA,GAAK,OAAA,EAAS,KAAA,EACvF,mCACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,SAAA,CAAU,QAAV,EACC,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,SAAA,CAAU,SAAV,EAAkB,QAAA,EAAA;AAAA,UAAA,OAAA;AAAA,8BAEhB,SAAA,CAAU,MAAA,EAAV,EAAiB,EAAA,EAAI,MAAM,EAAA,EAAI;AAAA,SAAA,EAClC,CAAA;AAAA,wBACA,IAAA,CAAC,SAAA,CAAU,aAAA,EAAV,EACG,QAAA,EAAA;AAAA,UAAA,CAAA,UAAA,IAAc,MAAA,qBACd,GAAA;AAAA,YAAC,SAAA,CAAU,WAAA;AAAA,YAAV;AAAA,cACC,UAAA;AAAA,cACA,MAAA;AAAA,cACA,aAAA,EAAc,sBAAA;AAAA,cACd,SAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BAEF,GAAA,CAAC,SAAA,CAAU,WAAA,EAAV,EAAsB,IAAA,EAAK,GAAA,EAAI,OAAA,EAAS,OAAA,EAAS,KAAA,EAAM,aAAA,EAAc,OAAA,EAAQ,aAAA,EAAc;AAAA,SAAA,EAC9F;AAAA,OAAA,EACF,CAAA;AAAA,sBAEA,IAAA,CAAC,SAAA,CAAU,OAAA,EAAV,EACC,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,iBAAA,EAAA,EACE,QAAA,EAAA;AAAA,UAAA,KAAA,CAAM,MAAA,EAAQ,IAAA,IAAQ,IAAA,oBACrB,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,iBAAA,CAAkB,GAAA,EAAlB,EAAsB,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,4BAC7B,GAAA,CAAC,kBAAkB,KAAA,EAAlB,EAAyB,iBAAO,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA,EAAE;AAAA,WAAA,EACtD,CAAA;AAAA,UAED,KAAA,CAAM,6BACL,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,iBAAA,CAAkB,GAAA,EAAlB,EAAsB,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,gCAC7B,iBAAA,CAAkB,KAAA,EAAlB,EAAyB,QAAA,EAAA,sBAAA,CAAuB,KAAA,CAAM,SAAS,CAAA,EAAE;AAAA,WAAA,EACpE,CAAA;AAAA,UAED,KAAA,CAAM,2BACL,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,iBAAA,CAAkB,GAAA,EAAlB,EAAsB,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,YAC9B,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,OAAO,CAAA,uBAC3B,iBAAA,CAAkB,SAAA,EAAlB,EAA4B,IAAA,EAAM,KAAA,CAAM,SAAA,CAAU,MAAM,OAAO,CAAA,EAAG,EAAA,EAAI,IAAA,EACpE,QAAA,EAAA,KAAA,CAAM,OAAA,EACT,CAAA,mBAEA,GAAA,CAAC,iBAAA,CAAkB,KAAA,EAAlB,EAAyB,QAAA,EAAA,KAAA,CAAM,OAAA,EAAQ;AAAA,WAAA,EAE5C,CAAA;AAAA,UAED,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,OAAA,oBACrB,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,iBAAA,CAAkB,GAAA,EAAlB,EAAsB,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,YAC7B,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,MAAM,CAAA,mBAC1C,GAAA,CAAC,iBAAA,CAAkB,SAAA,EAAlB,EAA4B,IAAA,EAAM,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,MAAM,CAAA,EAAG,EAAA,EAAI,IAAA,EAClF,QAAA,EAAA,KAAA,CAAM,MAAA,EACT,CAAA,mBAEA,GAAA,CAAC,iBAAA,CAAkB,KAAA,EAAlB,EAAyB,gBAAM,MAAA,EAAO;AAAA,WAAA,EAE3C;AAAA,SAAA,EAEJ,CAAA;AAAA,4BAEC,KAAA,EAAA,EAAI,SAAA,EAAU,yBACb,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,MAAK,IAAA,EAAK,OAAA,EAAS,MAAM,oBAAA,CAAqB,IAAI,CAAA,EAAG,IAAA,sBAAO,QAAA,EAAA,EAAS,CAAA,EAAI,kCAEjF,CAAA,EACF,CAAA;AAAA,wBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,0BAAA,IAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,kBAAA;AAAA,gBACA,2BAAA;AAAA,gBACA;AAAA,eACF;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,SAAA,EAAA,EAAU,CAAA;AAAA,oCACV,GAAA,EAAA,EAAI,EAAA,EAAG,MAAA,EAAO,OAAA,EAAQ,QAAO,QAAA,EAAA,QAAA,EAE9B,CAAA;AAAA,gCACA,GAAA;AAAA,kBAAC,GAAA;AAAA,kBAAA;AAAA,oBACC,EAAA,EAAG,GAAA;AAAA,oBACH,OAAA,EAAQ,MAAA;AAAA,oBACR,IAAA,EAAK,OAAA;AAAA,oBACL,SAAA,EAAU,cAAA;AAAA,oBACV,QAAA,EAAA,CAAA,EAAG,KAAA,CAAM,KAAA,IAAS,IAAA,IAAQ,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA,GAAI,KAAA,GAAQ,KAAA,CAAM,KAAK,CAAA;AAAA;AAAA;AAAG;AAAA;AAAA,WAChF;AAAA,0BACA,GAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAG,GAAA,EAAI,OAAA,EAAQ,SAAA,EAAU,SAAA,EAAU,MAAA,EACrC,QAAA,EAAA,KAAA,CAAM,MAAA,KACJ,WAAA,GAAc,oDAAA,GAAuD,2BAAA,CAAA,EAC1E;AAAA,SAAA,EACF,CAAA;AAAA,wBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,SAAA,CAAU,WAAA;AAAA,YAAV;AAAA,cACC,KAAA,EAAM,OAAA;AAAA,cACN,aAAa,gBAAA,CAAiB,OAAA,kBAAS,GAAA,CAAC,aAAA,EAAA,EAAc,GAAI,KAAK,CAAA;AAAA,cAC/D,IAAA,sBAAO,aAAA,EAAA,EAAc,CAAA;AAAA,cACrB,SAAS,IAAA,CAAK,SAAA,CAAU,MAAM,KAAA,IAAS,IAAA,EAAM,MAAM,CAAC;AAAA;AAAA,WACtD;AAAA,0BACA,GAAA;AAAA,YAAC,SAAA,CAAU,WAAA;AAAA,YAAV;AAAA,cACC,KAAA,EAAM,QAAA;AAAA,cACN,aAAa,gBAAA,CAAiB,QAAA,kBAAU,GAAA,CAAC,cAAA,EAAA,EAAe,GAAI,KAAK,CAAA;AAAA,cACjE,IAAA,sBAAO,cAAA,EAAA,EAAe,CAAA;AAAA,cACtB,SAAS,IAAA,CAAK,SAAA,CAAU,MAAM,MAAA,IAAU,IAAA,EAAM,MAAM,CAAC;AAAA;AAAA,WACvD;AAAA,0BACA,GAAA;AAAA,YAAC,SAAA,CAAU,WAAA;AAAA,YAAV;AAAA,cACC,KAAA,EAAM,mBAAA;AAAA,cACN,aAAa,gBAAA,CAAiB,mBAAA,kBAAqB,GAAA,CAAC,WAAA,EAAA,EAAY,GAAI,KAAK,CAAA;AAAA,cACzE,IAAA,sBAAO,WAAA,EAAA,EAAY,CAAA;AAAA,cACnB,OAAA,EAAS,MAAM,gBAAA,IAAoB,MAAA;AAAA,cACnC,UAAA,EAAY;AAAA;AAAA,WACd;AAAA,0BACA,GAAA;AAAA,YAAC,SAAA,CAAU,WAAA;AAAA,YAAV;AAAA,cACC,KAAA,EAAM,gBAAA;AAAA,cACN,aAAa,gBAAA,CAAiB,gBAAA,kBAAkB,GAAA,CAAC,WAAA,EAAA,EAAY,GAAI,KAAK,CAAA;AAAA,cACtE,IAAA,sBAAO,WAAA,EAAA,EAAY,CAAA;AAAA,cACnB,OAAA,EAAS,MAAM,aAAA,IAAiB,MAAA;AAAA,cAChC,UAAA,EAAY;AAAA;AAAA,WACd;AAAA,0BACA,GAAA;AAAA,YAAC,SAAA,CAAU,WAAA;AAAA,YAAV;AAAA,cACC,KAAA,EAAM,uBAAA;AAAA,cACN,aAAa,gBAAA,CAAiB,uBAAA,kBAAyB,GAAA,CAAC,WAAA,EAAA,EAAY,GAAI,KAAK,CAAA;AAAA,cAC7E,IAAA,sBAAO,WAAA,EAAA,EAAY,CAAA;AAAA,cACnB,OAAA,EAAS,MAAM,mBAAA,IAAuB,MAAA;AAAA,cACtC,UAAA,EAAY;AAAA;AAAA,WACd;AAAA,0BACA,GAAA;AAAA,YAAC,SAAA,CAAU,WAAA;AAAA,YAAV;AAAA,cACC,KAAA,EAAM,wBAAA;AAAA,cACN,aAAa,gBAAA,CAAiB,wBAAA,kBAA0B,GAAA,CAAC,WAAA,EAAA,EAAY,GAAI,KAAK,CAAA;AAAA,cAC9E,IAAA,sBAAO,WAAA,EAAA,EAAY,CAAA;AAAA,cACnB,OAAA,EAAS,MAAM,oBAAA,IAAwB,MAAA;AAAA,cACvC,UAAA,EAAY;AAAA;AAAA;AACd,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA,EAEJ,CAAA;AAAA,IAEC,KAAA,oBACC,GAAA,CAAC,iBAAA,EAAA,EAAkB,KAAA,EAAc,MAAA,EAAQ,mBAAmB,OAAA,EAAS,MAAM,oBAAA,CAAqB,KAAK,CAAA,EAAG;AAAA,GAAA,EAE5G,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"score-data-panel.es.js","sources":["../../../../src/domains/scores/components/score-data-panel.tsx"],"sourcesContent":["import type { ClientScoreRowData } from '@mastra/client-js';\nimport { FileInputIcon, FileOutputIcon, GaugeIcon, ReceiptText, SaveIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport { ScoreAsItemDialog } from './score-as-item-dialog';\nimport { Button } from '@/ds/components/Button';\nimport { DataKeysAndValues } from '@/ds/components/DataKeysAndValues';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport { Txt } from '@/ds/components/Txt';\nimport { useLinkComponent } from '@/lib/framework';\nimport { cn } from '@/utils/cn';\nimport { formatTimestampPrecise } from '@/utils/date-format';\n\nfunction isCodeBasedScorer(score?: ClientScoreRowData): boolean {\n if (!score) return false;\n const scorer = score.scorer as Record<string, unknown> | undefined;\n if (scorer?.hasJudge === false) return true;\n if (scorer?.hasJudge === true) return false;\n return !score.preprocessPrompt && !score.analyzePrompt && !score.generateScorePrompt && !score.generateReasonPrompt;\n}\n\nfunction buildDialogTitle(sectionTitle: string, icon: React.ReactNode, score: ClientScoreRowData) {\n return (\n <>\n <Txt as=\"span\" variant=\"eyebrow\" tone=\"faint\" className=\"flex items-center gap-1.5 [&>svg]:size-3.5\">\n {icon}\n {sectionTitle}\n </Txt>\n <span>\n › Score <b className=\"text-muted-foreground\">#{score.id}</b>\n </span>\n </>\n );\n}\n\nexport interface ScoreDataPanelProps {\n /** Always mount the panel and pass `undefined` to close it, so the drawer can animate out. */\n score?: ClientScoreRowData;\n onClose: () => void;\n onPrevious?: () => void;\n onNext?: () => void;\n depth?: 1 | 2 | 3;\n}\n\nexport function ScoreDataPanel({ score, onClose, onPrevious, onNext, depth }: ScoreDataPanelProps) {\n const { Link, paths } = useLinkComponent();\n const [datasetDialogOpen, setDatasetDialogOpen] = useState(false);\n const isCodeBased = isCodeBasedScorer(score);\n const naText = isCodeBased ? 'N/A — code-based scorer does not use prompts' : 'N/A — step not configured';\n\n return (\n <>\n <DataPanel open={!!score} onClose={onClose} title={score ? `Score ${score.id}` : 'Score'} depth={depth}>\n {score && (\n <>\n <DataPanel.Header>\n <DataPanel.Heading>\n Score\n <DataPanel.CopyId id={score.id} />\n </DataPanel.Heading>\n <DataPanel.HeaderActions>\n {(onPrevious || onNext) && (\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Go to previous score\"\n nextLabel=\"Go to next score\"\n />\n )}\n <DataPanel.CloseButton icon=\"x\" onClick={onClose} label=\"Close score\" tooltip=\"Close score\" />\n </DataPanel.HeaderActions>\n </DataPanel.Header>\n\n <DataPanel.Content>\n <DataKeysAndValues>\n {score.scorer?.name != null && (\n <>\n <DataKeysAndValues.Key>Scorer</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{String(score.scorer.name)}</DataKeysAndValues.Value>\n </>\n )}\n {score.createdAt && (\n <>\n <DataKeysAndValues.Key>Created</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{formatTimestampPrecise(score.createdAt)}</DataKeysAndValues.Value>\n </>\n )}\n {score.traceId && (\n <>\n <DataKeysAndValues.Key>Trace Id</DataKeysAndValues.Key>\n {paths.traceLink(score.traceId) ? (\n <DataKeysAndValues.ValueLink href={paths.traceLink(score.traceId)} as={Link}>\n {score.traceId}\n </DataKeysAndValues.ValueLink>\n ) : (\n <DataKeysAndValues.Value>{score.traceId}</DataKeysAndValues.Value>\n )}\n </>\n )}\n {score.spanId && score.traceId && (\n <>\n <DataKeysAndValues.Key>Span Id</DataKeysAndValues.Key>\n {paths.traceLink(score.traceId, score.spanId) ? (\n <DataKeysAndValues.ValueLink href={paths.traceLink(score.traceId, score.spanId)} as={Link}>\n {score.spanId}\n </DataKeysAndValues.ValueLink>\n ) : (\n <DataKeysAndValues.Value>{score.spanId}</DataKeysAndValues.Value>\n )}\n </>\n )}\n </DataKeysAndValues>\n\n <div className=\"my-6 flex justify-end\">\n <Button size=\"sm\" onClick={() => setDatasetDialogOpen(true)} icon={<SaveIcon />}>\n Save as Dataset Item\n </Button>\n </div>\n\n <div className=\"mb-6 text-muted-foreground\">\n <div\n className={cn(\n 'text-placeholder',\n 'flex items-baseline gap-2',\n '[&>svg]:size-5 [&>svg]:translate-y-1',\n )}\n >\n <GaugeIcon />\n <Txt as=\"span\" variant=\"body\">\n Score:\n </Txt>\n <Txt\n as=\"b\"\n variant=\"body\"\n tone=\"muted\"\n className=\"tabular-nums\"\n >{`${score.score == null || Number.isNaN(score.score) ? 'n/a' : score.score}`}</Txt>\n </div>\n <Txt as=\"p\" variant=\"body-sm\" className=\"mt-2\">\n {score.reason ||\n (isCodeBased ? 'N/A — code-based scorer does not generate a reason' : 'N/A — step not configured')}\n </Txt>\n </div>\n\n <div className=\"grid gap-4\">\n <DataPanel.CodeSection\n title=\"Input\"\n dialogTitle={buildDialogTitle('Input', <FileInputIcon />, score)}\n icon={<FileInputIcon />}\n codeStr={JSON.stringify(score.input ?? null, null, 2)}\n />\n <DataPanel.CodeSection\n title=\"Output\"\n dialogTitle={buildDialogTitle('Output', <FileOutputIcon />, score)}\n icon={<FileOutputIcon />}\n codeStr={JSON.stringify(score.output ?? null, null, 2)}\n />\n <DataPanel.CodeSection\n title=\"Preprocess Prompt\"\n dialogTitle={buildDialogTitle('Preprocess Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.preprocessPrompt || naText}\n simplified={true}\n />\n <DataPanel.CodeSection\n title=\"Analyze Prompt\"\n dialogTitle={buildDialogTitle('Analyze Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.analyzePrompt || naText}\n simplified={true}\n />\n <DataPanel.CodeSection\n title=\"Generate Score Prompt\"\n dialogTitle={buildDialogTitle('Generate Score Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.generateScorePrompt || naText}\n simplified={true}\n />\n <DataPanel.CodeSection\n title=\"Generate Reason Prompt\"\n dialogTitle={buildDialogTitle('Generate Reason Prompt', <ReceiptText />, score)}\n icon={<ReceiptText />}\n codeStr={score.generateReasonPrompt || naText}\n simplified={true}\n />\n </div>\n </DataPanel.Content>\n </>\n )}\n </DataPanel>\n\n {score && (\n <ScoreAsItemDialog\n score={score}\n isOpen={datasetDialogOpen}\n onClose={() => setDatasetDialogOpen(false)}\n depth={(depth ?? 1) > 1 ? 3 : 2}\n />\n )}\n </>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -10,6 +10,7 @@ const lucideReact = require('lucide-react');
10
10
  const React = require('react');
11
11
  require('@mastra/react/hooks/scores');
12
12
  require('@base-ui/react/combobox');
13
+ require('../../../toast-DxKdVSyw.cjs');
13
14
  const domains_scores_components_traceScoresTab = require('../../scores/components/trace-scores-tab.cjs.js');
14
15
  require('@mastra/core/utils/safe-stringify');
15
16
  require('@mastra/react/hooks/datasets');
@@ -1 +1 @@
1
- {"version":3,"file":"thread-view-by-trace.cjs.js","sources":["../../../../src/domains/traces/components/thread-view-by-trace.tsx"],"sourcesContent":["import { useMastraClient } from '@mastra/react';\nimport { traceSpansQueryOptions, useTraceSpans } from '@mastra/react/hooks/traces';\nimport { useQueries } from '@tanstack/react-query';\nimport { ExternalLinkIcon, MessageSquareReplyIcon, MessageSquareTextIcon } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport { TraceScoresTab } from '@/domains/scores';\nimport { ThreadTrace, useThreadTraceRow } from '@/domains/traces/components/thread-trace';\nimport type { ThreadTraceSelectedSpan } from '@/domains/traces/components/thread-trace';\n\nimport { ThreadViewSkeleton } from '@/domains/traces/components/thread-view-skeleton';\nimport { TraceFeedbackTab } from '@/domains/traces/components/trace-feedback-tab';\nimport { TraceThreadItemView } from '@/domains/traces/components/trace-thread-item-view';\nimport { TracesErrorContent } from '@/domains/traces/components/traces-error-content';\nimport { useTracesListSource } from '@/domains/traces/hooks/use-traces-list-source';\nimport type { UseTracesListSourceArgs } from '@/domains/traces/hooks/use-traces-list-source';\nimport { Button } from '@/ds/components/Button';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { ScorersIcon } from '@/ds/icons/ScorersIcon';\nimport { useLinkComponent } from '@/lib/framework';\n\n// `queryTraces` requires a time range; start at the epoch so it covers the whole thread, like the legacy endpoint.\nconst THREAD_WINDOW_FROM = new Date(0).toISOString();\n\nexport interface ThreadViewByTraceProps {\n threadId: string;\n /** Lists the thread through the trace-query API; `false` falls back to `listTracesLight`. */\n withQueryTrace: boolean;\n /** Shows the per-trace Feedback tab and fetches its feedback. */\n withFeedback: boolean;\n /** Fires when a span detail opens or closes (`null`). */\n onSelectedSpanChange?: (selected: ThreadTraceSelectedSpan | null) => void;\n /** Opens a score from a trace's Scores tab; the app owns routing. */\n onOpenScore: (traceId: string, scoreId: string) => void;\n /** Turns loaded per page: the latest ones on open, then older ones as the reader scrolls up. */\n pageSize?: number;\n}\n\n/**\n * A memory thread rendered as its traces, like a chat: one row per agent turn (oldest at the top),\n * opened on the latest turns, with older turns loaded as the reader scrolls up. Each row shows the\n * reconstructed messages on the left and the span tree on the right. Clicking a span opens its\n * detail panel on the side so the conversation stays readable.\n */\nexport function ThreadViewByTrace({\n threadId,\n withQueryTrace,\n withFeedback,\n onSelectedSpanChange,\n onOpenScore,\n pageSize = 10,\n}: ThreadViewByTraceProps) {\n const legacyFilters = useMemo<UseTracesListSourceArgs['legacyFilters']>(() => ({ threadId }), [threadId]);\n const { rows, isLoading, isPlaceholderData, error, hasNextPage, isFetchingNextPage, fetchNextPage } =\n useTracesListSource({\n initialAutoRefetch: false,\n withQueryTrace,\n legacyFilters,\n limit: pageSize,\n query: now => ({\n timeRange: {\n from: THREAD_WINDOW_FROM,\n to: now.toISOString(),\n },\n where: { op: 'eq', left: { path: 'threadId' }, right: { literal: threadId } },\n orderBy: [{ field: 'startedAt', direction: 'desc' }],\n }),\n });\n // Pages come newest first; the conversation reads oldest first.\n const traceIds = rows.map(trace => trace.traceId).reverse();\n const listSettled = !isLoading && !isPlaceholderData;\n\n // The first page is shown only once its turns' spans have settled too, so the rows mount complete\n // instead of each one loading on its own. Older pages keep their per-row loading.\n const client = useMastraClient();\n const [readyThreadId, setReadyThreadId] = useState<string | null>(null);\n const isReady = readyThreadId === threadId;\n const firstPageSpansSettled = useQueries({\n queries: (isReady || !listSettled ? [] : traceIds).map(traceId => ({\n ...traceSpansQueryOptions(client, traceId),\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n })),\n combine: results => results.every(result => !result.isPending),\n });\n if (!isReady && listSettled && firstPageSpansSettled) setReadyThreadId(threadId);\n\n if (error) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <TracesErrorContent error={error} resource=\"traces\" errorTitle=\"Failed to load traces\" />\n </div>\n );\n }\n\n if (!isReady) return <ThreadViewSkeleton withFeedback={withFeedback} />;\n\n if (traceIds.length === 0) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <Txt variant=\"body\" tone=\"muted\">\n No traces found for this thread.\n </Txt>\n </div>\n );\n }\n\n return (\n <ThreadTrace\n key={threadId}\n traceIds={traceIds}\n onSelectedSpanChange={onSelectedSpanChange}\n onLoadOlder={() => {\n if (hasNextPage && !isFetchingNextPage) fetchNextPage();\n }}\n >\n <ThreadTrace.List data-testid=\"thread-view-by-trace\">\n {traceIds.map((traceId, index) => (\n <ThreadTrace.Row key={traceId} traceId={traceId}>\n <ThreadTraceRowContent turn={index + 1} withFeedback={withFeedback} onOpenScore={onOpenScore} />\n </ThreadTrace.Row>\n ))}\n </ThreadTrace.List>\n <ThreadTrace.SpanPanel />\n </ThreadTrace>\n );\n}\n\nfunction ThreadTraceRowContent({\n turn,\n withFeedback,\n onOpenScore,\n}: {\n /** 1-based position among the loaded turns. */\n turn: number;\n withFeedback: boolean;\n onOpenScore: (traceId: string, scoreId: string) => void;\n}) {\n const { traceId, highlightSpans } = useThreadTraceRow();\n const { Link, paths } = useLinkComponent();\n const traceHref = paths.traceLink(traceId);\n // Same query the span tree observes (passive: the tree drives refetches).\n const { data: traceData } = useTraceSpans({ traceId: traceId, passive: true, queryOptions: { enabled: !!traceId } });\n const rootSpanId = traceData?.spans.find(span => span.parentSpanId == null)?.spanId;\n\n return (\n <>\n <ThreadTrace.Divider label={`Turn ${turn}`}>\n {traceHref && (\n <>\n <Button render={<Link href={traceHref} />} variant=\"ghost\" size=\"sm\" icon={<ExternalLinkIcon />}>\n Go to trace\n </Button>\n <span aria-hidden className=\"h-4 w-px bg-border\" />\n </>\n )}\n <ThreadTrace.TabList>\n <ThreadTrace.Tab value=\"messages\">\n <Icon size=\"xs\">\n <MessageSquareTextIcon />\n </Icon>\n Messages\n </ThreadTrace.Tab>\n {withFeedback && (\n <ThreadTrace.Tab value=\"feedback\">\n <Icon size=\"xs\">\n <MessageSquareReplyIcon />\n </Icon>\n Feedback\n </ThreadTrace.Tab>\n )}\n <ThreadTrace.Tab value=\"scores\">\n <Icon size=\"xs\">\n <ScorersIcon />\n </Icon>\n Scores\n </ThreadTrace.Tab>\n </ThreadTrace.TabList>\n </ThreadTrace.Divider>\n <ThreadTrace.RowBody>\n <ThreadTrace.Messages>\n <ThreadTrace.TabContent value=\"messages\" flush>\n <TraceThreadItemView traceId={traceId} onHighlightSpans={highlightSpans} />\n </ThreadTrace.TabContent>\n {withFeedback && (\n <ThreadTrace.TabContent value=\"feedback\" className=\"min-h-0 py-3\">\n <TraceFeedbackTab key={traceId} traceId={traceId} variant=\"thread\" />\n </ThreadTrace.TabContent>\n )}\n <ThreadTrace.TabContent value=\"scores\" className=\"min-h-0 py-3\">\n {rootSpanId ? (\n <TraceScoresTab\n key={traceId}\n traceId={traceId}\n spanId={rootSpanId}\n onScoreSelect={scoreId => onOpenScore(traceId, scoreId)}\n />\n ) : null}\n </ThreadTrace.TabContent>\n </ThreadTrace.Messages>\n <ThreadTrace.Details>\n <ThreadTrace.Spans />\n </ThreadTrace.Details>\n </ThreadTrace.RowBody>\n </>\n );\n}\n"],"names":["useMemo","useTracesListSource","useMastraClient","useState","useQueries","traceSpansQueryOptions","jsx","TracesErrorContent","ThreadViewSkeleton","Txt","jsxs","ThreadTrace","useThreadTraceRow","useLinkComponent","useTraceSpans","Fragment","Button","ExternalLinkIcon","Icon","MessageSquareTextIcon","MessageSquareReplyIcon","ScorersIcon","TraceThreadItemView","TraceFeedbackTab","TraceScoresTab"],"mappings":"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"}
1
+ {"version":3,"file":"thread-view-by-trace.cjs.js","sources":["../../../../src/domains/traces/components/thread-view-by-trace.tsx"],"sourcesContent":["import { useMastraClient } from '@mastra/react';\nimport { traceSpansQueryOptions, useTraceSpans } from '@mastra/react/hooks/traces';\nimport { useQueries } from '@tanstack/react-query';\nimport { ExternalLinkIcon, MessageSquareReplyIcon, MessageSquareTextIcon } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport { TraceScoresTab } from '@/domains/scores';\nimport { ThreadTrace, useThreadTraceRow } from '@/domains/traces/components/thread-trace';\nimport type { ThreadTraceSelectedSpan } from '@/domains/traces/components/thread-trace';\n\nimport { ThreadViewSkeleton } from '@/domains/traces/components/thread-view-skeleton';\nimport { TraceFeedbackTab } from '@/domains/traces/components/trace-feedback-tab';\nimport { TraceThreadItemView } from '@/domains/traces/components/trace-thread-item-view';\nimport { TracesErrorContent } from '@/domains/traces/components/traces-error-content';\nimport { useTracesListSource } from '@/domains/traces/hooks/use-traces-list-source';\nimport type { UseTracesListSourceArgs } from '@/domains/traces/hooks/use-traces-list-source';\nimport { Button } from '@/ds/components/Button';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { ScorersIcon } from '@/ds/icons/ScorersIcon';\nimport { useLinkComponent } from '@/lib/framework';\n\n// `queryTraces` requires a time range; start at the epoch so it covers the whole thread, like the legacy endpoint.\nconst THREAD_WINDOW_FROM = new Date(0).toISOString();\n\nexport interface ThreadViewByTraceProps {\n threadId: string;\n /** Lists the thread through the trace-query API; `false` falls back to `listTracesLight`. */\n withQueryTrace: boolean;\n /** Shows the per-trace Feedback tab and fetches its feedback. */\n withFeedback: boolean;\n /** Fires when a span detail opens or closes (`null`). */\n onSelectedSpanChange?: (selected: ThreadTraceSelectedSpan | null) => void;\n /** Opens a score from a trace's Scores tab; the app owns routing. */\n onOpenScore: (traceId: string, scoreId: string) => void;\n /** Turns loaded per page: the latest ones on open, then older ones as the reader scrolls up. */\n pageSize?: number;\n}\n\n/**\n * A memory thread rendered as its traces, like a chat: one row per agent turn (oldest at the top),\n * opened on the latest turns, with older turns loaded as the reader scrolls up. Each row shows the\n * reconstructed messages on the left and the span tree on the right. Clicking a span opens its\n * detail panel on the side so the conversation stays readable.\n */\nexport function ThreadViewByTrace({\n threadId,\n withQueryTrace,\n withFeedback,\n onSelectedSpanChange,\n onOpenScore,\n pageSize = 10,\n}: ThreadViewByTraceProps) {\n const legacyFilters = useMemo<UseTracesListSourceArgs['legacyFilters']>(() => ({ threadId }), [threadId]);\n const { rows, isLoading, isPlaceholderData, error, hasNextPage, isFetchingNextPage, fetchNextPage } =\n useTracesListSource({\n initialAutoRefetch: false,\n withQueryTrace,\n legacyFilters,\n limit: pageSize,\n query: now => ({\n timeRange: {\n from: THREAD_WINDOW_FROM,\n to: now.toISOString(),\n },\n where: { op: 'eq', left: { path: 'threadId' }, right: { literal: threadId } },\n orderBy: [{ field: 'startedAt', direction: 'desc' }],\n }),\n });\n // Pages come newest first; the conversation reads oldest first.\n const traceIds = rows.map(trace => trace.traceId).reverse();\n const listSettled = !isLoading && !isPlaceholderData;\n\n // The first page is shown only once its turns' spans have settled too, so the rows mount complete\n // instead of each one loading on its own. Older pages keep their per-row loading.\n const client = useMastraClient();\n const [readyThreadId, setReadyThreadId] = useState<string | null>(null);\n const isReady = readyThreadId === threadId;\n const firstPageSpansSettled = useQueries({\n queries: (isReady || !listSettled ? [] : traceIds).map(traceId => ({\n ...traceSpansQueryOptions(client, traceId),\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n })),\n combine: results => results.every(result => !result.isPending),\n });\n if (!isReady && listSettled && firstPageSpansSettled) setReadyThreadId(threadId);\n\n if (error) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <TracesErrorContent error={error} resource=\"traces\" errorTitle=\"Failed to load traces\" />\n </div>\n );\n }\n\n if (!isReady) return <ThreadViewSkeleton withFeedback={withFeedback} />;\n\n if (traceIds.length === 0) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <Txt variant=\"body\" tone=\"muted\">\n No traces found for this thread.\n </Txt>\n </div>\n );\n }\n\n return (\n <ThreadTrace\n key={threadId}\n traceIds={traceIds}\n onSelectedSpanChange={onSelectedSpanChange}\n onLoadOlder={() => {\n if (hasNextPage && !isFetchingNextPage) fetchNextPage();\n }}\n >\n <ThreadTrace.List data-testid=\"thread-view-by-trace\">\n {traceIds.map((traceId, index) => (\n <ThreadTrace.Row key={traceId} traceId={traceId}>\n <ThreadTraceRowContent turn={index + 1} withFeedback={withFeedback} onOpenScore={onOpenScore} />\n </ThreadTrace.Row>\n ))}\n </ThreadTrace.List>\n <ThreadTrace.SpanPanel />\n </ThreadTrace>\n );\n}\n\nfunction ThreadTraceRowContent({\n turn,\n withFeedback,\n onOpenScore,\n}: {\n /** 1-based position among the loaded turns. */\n turn: number;\n withFeedback: boolean;\n onOpenScore: (traceId: string, scoreId: string) => void;\n}) {\n const { traceId, highlightSpans } = useThreadTraceRow();\n const { Link, paths } = useLinkComponent();\n const traceHref = paths.traceLink(traceId);\n // Same query the span tree observes (passive: the tree drives refetches).\n const { data: traceData } = useTraceSpans({ traceId: traceId, passive: true, queryOptions: { enabled: !!traceId } });\n const rootSpanId = traceData?.spans.find(span => span.parentSpanId == null)?.spanId;\n\n return (\n <>\n <ThreadTrace.Divider label={`Turn ${turn}`}>\n {traceHref && (\n <>\n <Button render={<Link href={traceHref} />} variant=\"ghost\" size=\"sm\" icon={<ExternalLinkIcon />}>\n Go to trace\n </Button>\n <span aria-hidden className=\"h-4 w-px bg-border\" />\n </>\n )}\n <ThreadTrace.TabList>\n <ThreadTrace.Tab value=\"messages\">\n <Icon size=\"xs\">\n <MessageSquareTextIcon />\n </Icon>\n Messages\n </ThreadTrace.Tab>\n {withFeedback && (\n <ThreadTrace.Tab value=\"feedback\">\n <Icon size=\"xs\">\n <MessageSquareReplyIcon />\n </Icon>\n Feedback\n </ThreadTrace.Tab>\n )}\n <ThreadTrace.Tab value=\"scores\">\n <Icon size=\"xs\">\n <ScorersIcon />\n </Icon>\n Scores\n </ThreadTrace.Tab>\n </ThreadTrace.TabList>\n </ThreadTrace.Divider>\n <ThreadTrace.RowBody>\n <ThreadTrace.Messages>\n <ThreadTrace.TabContent value=\"messages\" flush>\n <TraceThreadItemView traceId={traceId} onHighlightSpans={highlightSpans} />\n </ThreadTrace.TabContent>\n {withFeedback && (\n <ThreadTrace.TabContent value=\"feedback\" className=\"min-h-0 py-3\">\n <TraceFeedbackTab key={traceId} traceId={traceId} variant=\"thread\" />\n </ThreadTrace.TabContent>\n )}\n <ThreadTrace.TabContent value=\"scores\" className=\"min-h-0 py-3\">\n {rootSpanId ? (\n <TraceScoresTab\n key={traceId}\n traceId={traceId}\n spanId={rootSpanId}\n onScoreSelect={scoreId => onOpenScore(traceId, scoreId)}\n />\n ) : null}\n </ThreadTrace.TabContent>\n </ThreadTrace.Messages>\n <ThreadTrace.Details>\n <ThreadTrace.Spans />\n </ThreadTrace.Details>\n </ThreadTrace.RowBody>\n </>\n );\n}\n"],"names":["useMemo","useTracesListSource","useMastraClient","useState","useQueries","traceSpansQueryOptions","jsx","TracesErrorContent","ThreadViewSkeleton","Txt","jsxs","ThreadTrace","useThreadTraceRow","useLinkComponent","useTraceSpans","Fragment","Button","ExternalLinkIcon","Icon","MessageSquareTextIcon","MessageSquareReplyIcon","ScorersIcon","TraceThreadItemView","TraceFeedbackTab","TraceScoresTab"],"mappings":"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"}
@@ -6,6 +6,7 @@ import { ExternalLinkIcon, MessageSquareTextIcon, MessageSquareReplyIcon } from
6
6
  import { useMemo, useState } from 'react';
7
7
  import '@mastra/react/hooks/scores';
8
8
  import '@base-ui/react/combobox';
9
+ import '../../../toast-5aQbZBbY.js';
9
10
  import { TraceScoresTab } from '../../scores/components/trace-scores-tab.es.js';
10
11
  import '@mastra/core/utils/safe-stringify';
11
12
  import '@mastra/react/hooks/datasets';
@@ -1 +1 @@
1
- {"version":3,"file":"thread-view-by-trace.es.js","sources":["../../../../src/domains/traces/components/thread-view-by-trace.tsx"],"sourcesContent":["import { useMastraClient } from '@mastra/react';\nimport { traceSpansQueryOptions, useTraceSpans } from '@mastra/react/hooks/traces';\nimport { useQueries } from '@tanstack/react-query';\nimport { ExternalLinkIcon, MessageSquareReplyIcon, MessageSquareTextIcon } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport { TraceScoresTab } from '@/domains/scores';\nimport { ThreadTrace, useThreadTraceRow } from '@/domains/traces/components/thread-trace';\nimport type { ThreadTraceSelectedSpan } from '@/domains/traces/components/thread-trace';\n\nimport { ThreadViewSkeleton } from '@/domains/traces/components/thread-view-skeleton';\nimport { TraceFeedbackTab } from '@/domains/traces/components/trace-feedback-tab';\nimport { TraceThreadItemView } from '@/domains/traces/components/trace-thread-item-view';\nimport { TracesErrorContent } from '@/domains/traces/components/traces-error-content';\nimport { useTracesListSource } from '@/domains/traces/hooks/use-traces-list-source';\nimport type { UseTracesListSourceArgs } from '@/domains/traces/hooks/use-traces-list-source';\nimport { Button } from '@/ds/components/Button';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { ScorersIcon } from '@/ds/icons/ScorersIcon';\nimport { useLinkComponent } from '@/lib/framework';\n\n// `queryTraces` requires a time range; start at the epoch so it covers the whole thread, like the legacy endpoint.\nconst THREAD_WINDOW_FROM = new Date(0).toISOString();\n\nexport interface ThreadViewByTraceProps {\n threadId: string;\n /** Lists the thread through the trace-query API; `false` falls back to `listTracesLight`. */\n withQueryTrace: boolean;\n /** Shows the per-trace Feedback tab and fetches its feedback. */\n withFeedback: boolean;\n /** Fires when a span detail opens or closes (`null`). */\n onSelectedSpanChange?: (selected: ThreadTraceSelectedSpan | null) => void;\n /** Opens a score from a trace's Scores tab; the app owns routing. */\n onOpenScore: (traceId: string, scoreId: string) => void;\n /** Turns loaded per page: the latest ones on open, then older ones as the reader scrolls up. */\n pageSize?: number;\n}\n\n/**\n * A memory thread rendered as its traces, like a chat: one row per agent turn (oldest at the top),\n * opened on the latest turns, with older turns loaded as the reader scrolls up. Each row shows the\n * reconstructed messages on the left and the span tree on the right. Clicking a span opens its\n * detail panel on the side so the conversation stays readable.\n */\nexport function ThreadViewByTrace({\n threadId,\n withQueryTrace,\n withFeedback,\n onSelectedSpanChange,\n onOpenScore,\n pageSize = 10,\n}: ThreadViewByTraceProps) {\n const legacyFilters = useMemo<UseTracesListSourceArgs['legacyFilters']>(() => ({ threadId }), [threadId]);\n const { rows, isLoading, isPlaceholderData, error, hasNextPage, isFetchingNextPage, fetchNextPage } =\n useTracesListSource({\n initialAutoRefetch: false,\n withQueryTrace,\n legacyFilters,\n limit: pageSize,\n query: now => ({\n timeRange: {\n from: THREAD_WINDOW_FROM,\n to: now.toISOString(),\n },\n where: { op: 'eq', left: { path: 'threadId' }, right: { literal: threadId } },\n orderBy: [{ field: 'startedAt', direction: 'desc' }],\n }),\n });\n // Pages come newest first; the conversation reads oldest first.\n const traceIds = rows.map(trace => trace.traceId).reverse();\n const listSettled = !isLoading && !isPlaceholderData;\n\n // The first page is shown only once its turns' spans have settled too, so the rows mount complete\n // instead of each one loading on its own. Older pages keep their per-row loading.\n const client = useMastraClient();\n const [readyThreadId, setReadyThreadId] = useState<string | null>(null);\n const isReady = readyThreadId === threadId;\n const firstPageSpansSettled = useQueries({\n queries: (isReady || !listSettled ? [] : traceIds).map(traceId => ({\n ...traceSpansQueryOptions(client, traceId),\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n })),\n combine: results => results.every(result => !result.isPending),\n });\n if (!isReady && listSettled && firstPageSpansSettled) setReadyThreadId(threadId);\n\n if (error) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <TracesErrorContent error={error} resource=\"traces\" errorTitle=\"Failed to load traces\" />\n </div>\n );\n }\n\n if (!isReady) return <ThreadViewSkeleton withFeedback={withFeedback} />;\n\n if (traceIds.length === 0) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <Txt variant=\"body\" tone=\"muted\">\n No traces found for this thread.\n </Txt>\n </div>\n );\n }\n\n return (\n <ThreadTrace\n key={threadId}\n traceIds={traceIds}\n onSelectedSpanChange={onSelectedSpanChange}\n onLoadOlder={() => {\n if (hasNextPage && !isFetchingNextPage) fetchNextPage();\n }}\n >\n <ThreadTrace.List data-testid=\"thread-view-by-trace\">\n {traceIds.map((traceId, index) => (\n <ThreadTrace.Row key={traceId} traceId={traceId}>\n <ThreadTraceRowContent turn={index + 1} withFeedback={withFeedback} onOpenScore={onOpenScore} />\n </ThreadTrace.Row>\n ))}\n </ThreadTrace.List>\n <ThreadTrace.SpanPanel />\n </ThreadTrace>\n );\n}\n\nfunction ThreadTraceRowContent({\n turn,\n withFeedback,\n onOpenScore,\n}: {\n /** 1-based position among the loaded turns. */\n turn: number;\n withFeedback: boolean;\n onOpenScore: (traceId: string, scoreId: string) => void;\n}) {\n const { traceId, highlightSpans } = useThreadTraceRow();\n const { Link, paths } = useLinkComponent();\n const traceHref = paths.traceLink(traceId);\n // Same query the span tree observes (passive: the tree drives refetches).\n const { data: traceData } = useTraceSpans({ traceId: traceId, passive: true, queryOptions: { enabled: !!traceId } });\n const rootSpanId = traceData?.spans.find(span => span.parentSpanId == null)?.spanId;\n\n return (\n <>\n <ThreadTrace.Divider label={`Turn ${turn}`}>\n {traceHref && (\n <>\n <Button render={<Link href={traceHref} />} variant=\"ghost\" size=\"sm\" icon={<ExternalLinkIcon />}>\n Go to trace\n </Button>\n <span aria-hidden className=\"h-4 w-px bg-border\" />\n </>\n )}\n <ThreadTrace.TabList>\n <ThreadTrace.Tab value=\"messages\">\n <Icon size=\"xs\">\n <MessageSquareTextIcon />\n </Icon>\n Messages\n </ThreadTrace.Tab>\n {withFeedback && (\n <ThreadTrace.Tab value=\"feedback\">\n <Icon size=\"xs\">\n <MessageSquareReplyIcon />\n </Icon>\n Feedback\n </ThreadTrace.Tab>\n )}\n <ThreadTrace.Tab value=\"scores\">\n <Icon size=\"xs\">\n <ScorersIcon />\n </Icon>\n Scores\n </ThreadTrace.Tab>\n </ThreadTrace.TabList>\n </ThreadTrace.Divider>\n <ThreadTrace.RowBody>\n <ThreadTrace.Messages>\n <ThreadTrace.TabContent value=\"messages\" flush>\n <TraceThreadItemView traceId={traceId} onHighlightSpans={highlightSpans} />\n </ThreadTrace.TabContent>\n {withFeedback && (\n <ThreadTrace.TabContent value=\"feedback\" className=\"min-h-0 py-3\">\n <TraceFeedbackTab key={traceId} traceId={traceId} variant=\"thread\" />\n </ThreadTrace.TabContent>\n )}\n <ThreadTrace.TabContent value=\"scores\" className=\"min-h-0 py-3\">\n {rootSpanId ? (\n <TraceScoresTab\n key={traceId}\n traceId={traceId}\n spanId={rootSpanId}\n onScoreSelect={scoreId => onOpenScore(traceId, scoreId)}\n />\n ) : null}\n </ThreadTrace.TabContent>\n </ThreadTrace.Messages>\n <ThreadTrace.Details>\n <ThreadTrace.Spans />\n </ThreadTrace.Details>\n </ThreadTrace.RowBody>\n </>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"thread-view-by-trace.es.js","sources":["../../../../src/domains/traces/components/thread-view-by-trace.tsx"],"sourcesContent":["import { useMastraClient } from '@mastra/react';\nimport { traceSpansQueryOptions, useTraceSpans } from '@mastra/react/hooks/traces';\nimport { useQueries } from '@tanstack/react-query';\nimport { ExternalLinkIcon, MessageSquareReplyIcon, MessageSquareTextIcon } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport { TraceScoresTab } from '@/domains/scores';\nimport { ThreadTrace, useThreadTraceRow } from '@/domains/traces/components/thread-trace';\nimport type { ThreadTraceSelectedSpan } from '@/domains/traces/components/thread-trace';\n\nimport { ThreadViewSkeleton } from '@/domains/traces/components/thread-view-skeleton';\nimport { TraceFeedbackTab } from '@/domains/traces/components/trace-feedback-tab';\nimport { TraceThreadItemView } from '@/domains/traces/components/trace-thread-item-view';\nimport { TracesErrorContent } from '@/domains/traces/components/traces-error-content';\nimport { useTracesListSource } from '@/domains/traces/hooks/use-traces-list-source';\nimport type { UseTracesListSourceArgs } from '@/domains/traces/hooks/use-traces-list-source';\nimport { Button } from '@/ds/components/Button';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { ScorersIcon } from '@/ds/icons/ScorersIcon';\nimport { useLinkComponent } from '@/lib/framework';\n\n// `queryTraces` requires a time range; start at the epoch so it covers the whole thread, like the legacy endpoint.\nconst THREAD_WINDOW_FROM = new Date(0).toISOString();\n\nexport interface ThreadViewByTraceProps {\n threadId: string;\n /** Lists the thread through the trace-query API; `false` falls back to `listTracesLight`. */\n withQueryTrace: boolean;\n /** Shows the per-trace Feedback tab and fetches its feedback. */\n withFeedback: boolean;\n /** Fires when a span detail opens or closes (`null`). */\n onSelectedSpanChange?: (selected: ThreadTraceSelectedSpan | null) => void;\n /** Opens a score from a trace's Scores tab; the app owns routing. */\n onOpenScore: (traceId: string, scoreId: string) => void;\n /** Turns loaded per page: the latest ones on open, then older ones as the reader scrolls up. */\n pageSize?: number;\n}\n\n/**\n * A memory thread rendered as its traces, like a chat: one row per agent turn (oldest at the top),\n * opened on the latest turns, with older turns loaded as the reader scrolls up. Each row shows the\n * reconstructed messages on the left and the span tree on the right. Clicking a span opens its\n * detail panel on the side so the conversation stays readable.\n */\nexport function ThreadViewByTrace({\n threadId,\n withQueryTrace,\n withFeedback,\n onSelectedSpanChange,\n onOpenScore,\n pageSize = 10,\n}: ThreadViewByTraceProps) {\n const legacyFilters = useMemo<UseTracesListSourceArgs['legacyFilters']>(() => ({ threadId }), [threadId]);\n const { rows, isLoading, isPlaceholderData, error, hasNextPage, isFetchingNextPage, fetchNextPage } =\n useTracesListSource({\n initialAutoRefetch: false,\n withQueryTrace,\n legacyFilters,\n limit: pageSize,\n query: now => ({\n timeRange: {\n from: THREAD_WINDOW_FROM,\n to: now.toISOString(),\n },\n where: { op: 'eq', left: { path: 'threadId' }, right: { literal: threadId } },\n orderBy: [{ field: 'startedAt', direction: 'desc' }],\n }),\n });\n // Pages come newest first; the conversation reads oldest first.\n const traceIds = rows.map(trace => trace.traceId).reverse();\n const listSettled = !isLoading && !isPlaceholderData;\n\n // The first page is shown only once its turns' spans have settled too, so the rows mount complete\n // instead of each one loading on its own. Older pages keep their per-row loading.\n const client = useMastraClient();\n const [readyThreadId, setReadyThreadId] = useState<string | null>(null);\n const isReady = readyThreadId === threadId;\n const firstPageSpansSettled = useQueries({\n queries: (isReady || !listSettled ? [] : traceIds).map(traceId => ({\n ...traceSpansQueryOptions(client, traceId),\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n })),\n combine: results => results.every(result => !result.isPending),\n });\n if (!isReady && listSettled && firstPageSpansSettled) setReadyThreadId(threadId);\n\n if (error) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <TracesErrorContent error={error} resource=\"traces\" errorTitle=\"Failed to load traces\" />\n </div>\n );\n }\n\n if (!isReady) return <ThreadViewSkeleton withFeedback={withFeedback} />;\n\n if (traceIds.length === 0) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <Txt variant=\"body\" tone=\"muted\">\n No traces found for this thread.\n </Txt>\n </div>\n );\n }\n\n return (\n <ThreadTrace\n key={threadId}\n traceIds={traceIds}\n onSelectedSpanChange={onSelectedSpanChange}\n onLoadOlder={() => {\n if (hasNextPage && !isFetchingNextPage) fetchNextPage();\n }}\n >\n <ThreadTrace.List data-testid=\"thread-view-by-trace\">\n {traceIds.map((traceId, index) => (\n <ThreadTrace.Row key={traceId} traceId={traceId}>\n <ThreadTraceRowContent turn={index + 1} withFeedback={withFeedback} onOpenScore={onOpenScore} />\n </ThreadTrace.Row>\n ))}\n </ThreadTrace.List>\n <ThreadTrace.SpanPanel />\n </ThreadTrace>\n );\n}\n\nfunction ThreadTraceRowContent({\n turn,\n withFeedback,\n onOpenScore,\n}: {\n /** 1-based position among the loaded turns. */\n turn: number;\n withFeedback: boolean;\n onOpenScore: (traceId: string, scoreId: string) => void;\n}) {\n const { traceId, highlightSpans } = useThreadTraceRow();\n const { Link, paths } = useLinkComponent();\n const traceHref = paths.traceLink(traceId);\n // Same query the span tree observes (passive: the tree drives refetches).\n const { data: traceData } = useTraceSpans({ traceId: traceId, passive: true, queryOptions: { enabled: !!traceId } });\n const rootSpanId = traceData?.spans.find(span => span.parentSpanId == null)?.spanId;\n\n return (\n <>\n <ThreadTrace.Divider label={`Turn ${turn}`}>\n {traceHref && (\n <>\n <Button render={<Link href={traceHref} />} variant=\"ghost\" size=\"sm\" icon={<ExternalLinkIcon />}>\n Go to trace\n </Button>\n <span aria-hidden className=\"h-4 w-px bg-border\" />\n </>\n )}\n <ThreadTrace.TabList>\n <ThreadTrace.Tab value=\"messages\">\n <Icon size=\"xs\">\n <MessageSquareTextIcon />\n </Icon>\n Messages\n </ThreadTrace.Tab>\n {withFeedback && (\n <ThreadTrace.Tab value=\"feedback\">\n <Icon size=\"xs\">\n <MessageSquareReplyIcon />\n </Icon>\n Feedback\n </ThreadTrace.Tab>\n )}\n <ThreadTrace.Tab value=\"scores\">\n <Icon size=\"xs\">\n <ScorersIcon />\n </Icon>\n Scores\n </ThreadTrace.Tab>\n </ThreadTrace.TabList>\n </ThreadTrace.Divider>\n <ThreadTrace.RowBody>\n <ThreadTrace.Messages>\n <ThreadTrace.TabContent value=\"messages\" flush>\n <TraceThreadItemView traceId={traceId} onHighlightSpans={highlightSpans} />\n </ThreadTrace.TabContent>\n {withFeedback && (\n <ThreadTrace.TabContent value=\"feedback\" className=\"min-h-0 py-3\">\n <TraceFeedbackTab key={traceId} traceId={traceId} variant=\"thread\" />\n </ThreadTrace.TabContent>\n )}\n <ThreadTrace.TabContent value=\"scores\" className=\"min-h-0 py-3\">\n {rootSpanId ? (\n <TraceScoresTab\n key={traceId}\n traceId={traceId}\n spanId={rootSpanId}\n onScoreSelect={scoreId => onOpenScore(traceId, scoreId)}\n />\n ) : null}\n </ThreadTrace.TabContent>\n </ThreadTrace.Messages>\n <ThreadTrace.Details>\n <ThreadTrace.Spans />\n </ThreadTrace.Details>\n </ThreadTrace.RowBody>\n </>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -15,6 +15,7 @@ require('@mastra/react/hooks/datasets');
15
15
  require('../../../Button-DH1aTzbs.cjs');
16
16
  require('../../../field-control-aria-WzMGs0A4.cjs');
17
17
  require('../../../lib/framework.cjs.js');
18
+ require('../../../toast-DxKdVSyw.cjs');
18
19
  const domains_traces_components_traceDataPanelView = require('./trace-data-panel-view.cjs.js');
19
20
  const dialog = require('../../../dialog-BMUfQ9XU.cjs');
20
21
 
@@ -1 +1 @@
1
- {"version":3,"file":"trace-data-panel.cjs.js","sources":["../../../../src/domains/traces/components/trace-data-panel.tsx"],"sourcesContent":["import { useScorers } from '@mastra/react/hooks/scores';\nimport { useState, type ComponentProps } from 'react';\nimport { SpanScoring } from '@/domains/scores';\nimport { TraceDataPanelView, type TraceSideView } from '@/domains/traces/components/trace-data-panel-view';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/ds/components/Dialog';\n\ntype TraceDataPanelProps = Omit<\n ComponentProps<typeof TraceDataPanelView>,\n 'sideView' | 'onSideViewChange' | 'onEvaluateTrace'\n>;\n\n/**\n * Owns the trace panel's side column view so scoring can land on \"Scores\". Mount it with a\n * `key` on the trace (and anchor span) so a view picked on a previous trace never leaks into the next one.\n */\nexport function TraceDataPanel(props: TraceDataPanelProps) {\n const [sideView, setSideView] = useState<TraceSideView>();\n const [isScoringOpen, setIsScoringOpen] = useState(false);\n const { data: scorers, isLoading: isLoadingScorers } = useScorers();\n const rootSpan = props.anchorSpanId\n ? props.spans?.find(span => span.spanId === props.anchorSpanId)\n : props.spans?.find(span => span.parentSpanId == null);\n\n return (\n <>\n <TraceDataPanelView\n {...props}\n onEvaluateTrace={() => setIsScoringOpen(true)}\n sideView={sideView}\n onSideViewChange={setSideView}\n />\n <Dialog open={isScoringOpen} onOpenChange={setIsScoringOpen}>\n <DialogContent size=\"lg\">\n <DialogHeader>\n <DialogTitle>Score trace</DialogTitle>\n </DialogHeader>\n\n {isScoringOpen && rootSpan && (\n <SpanScoring\n traceId={props.traceId}\n spanId={rootSpan.spanId}\n entityType={rootSpan.entityType === 'agent' ? 'Agent' : 'Workflow'}\n isTopLevelSpan={!rootSpan.parentSpanId}\n scorers={scorers}\n isLoadingScorers={isLoadingScorers}\n onSuccess={() => {\n setIsScoringOpen(false);\n setSideView('scores');\n }}\n />\n )}\n </DialogContent>\n </Dialog>\n </>\n );\n}\n"],"names":["useState","useScorers","jsxs","Fragment","jsx","TraceDataPanelView","Dialog","DialogContent","DialogHeader","DialogTitle","SpanScoring"],"mappings":";;;;;;;;;;;;;;;;;;;;AAeO,SAAS,eAAe,KAAA,EAA4B;AACzD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,cAAA,EAAwB;AACxD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAAS,KAAK,CAAA;AACxD,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,gBAAA,KAAqBC,iBAAA,EAAW;AAClE,EAAA,MAAM,WAAW,KAAA,CAAM,YAAA,GACnB,MAAM,KAAA,EAAO,IAAA,CAAK,UAAQ,IAAA,CAAK,MAAA,KAAW,KAAA,CAAM,YAAY,IAC5D,KAAA,CAAM,KAAA,EAAO,KAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,gBAAgB,IAAI,CAAA;AAEvD,EAAA,uBACEC,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAC,cAAA;AAAA,MAACC,+DAAA;AAAA,MAAA;AAAA,QACE,GAAG,KAAA;AAAA,QACJ,eAAA,EAAiB,MAAM,gBAAA,CAAiB,IAAI,CAAA;AAAA,QAC5C,QAAA;AAAA,QACA,gBAAA,EAAkB;AAAA;AAAA,KACpB;AAAA,oBACAD,cAAA,CAACE,iBAAO,IAAA,EAAM,aAAA,EAAe,cAAc,gBAAA,EACzC,QAAA,kBAAAJ,eAAA,CAACK,oBAAA,EAAA,EAAc,IAAA,EAAK,IAAA,EAClB,QAAA,EAAA;AAAA,sBAAAH,cAAA,CAACI,mBAAA,EAAA,EACC,QAAA,kBAAAJ,cAAA,CAACK,kBAAA,EAAA,EAAY,QAAA,EAAA,aAAA,EAAW,CAAA,EAC1B,CAAA;AAAA,MAEC,iBAAiB,QAAA,oBAChBL,cAAA;AAAA,QAACM,iDAAA;AAAA,QAAA;AAAA,UACC,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,QAAQ,QAAA,CAAS,MAAA;AAAA,UACjB,UAAA,EAAY,QAAA,CAAS,UAAA,KAAe,OAAA,GAAU,OAAA,GAAU,UAAA;AAAA,UACxD,cAAA,EAAgB,CAAC,QAAA,CAAS,YAAA;AAAA,UAC1B,OAAA;AAAA,UACA,gBAAA;AAAA,UACA,WAAW,MAAM;AACf,YAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,YAAA,WAAA,CAAY,QAAQ,CAAA;AAAA,UACtB;AAAA;AAAA;AACF,KAAA,EAEJ,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"trace-data-panel.cjs.js","sources":["../../../../src/domains/traces/components/trace-data-panel.tsx"],"sourcesContent":["import { useScorers } from '@mastra/react/hooks/scores';\nimport { useState, type ComponentProps } from 'react';\nimport { SpanScoring } from '@/domains/scores';\nimport { TraceDataPanelView, type TraceSideView } from '@/domains/traces/components/trace-data-panel-view';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/ds/components/Dialog';\n\ntype TraceDataPanelProps = Omit<\n ComponentProps<typeof TraceDataPanelView>,\n 'sideView' | 'onSideViewChange' | 'onEvaluateTrace'\n>;\n\n/**\n * Owns the trace panel's side column view so scoring can land on \"Scores\". Mount it with a\n * `key` on the trace (and anchor span) so a view picked on a previous trace never leaks into the next one.\n */\nexport function TraceDataPanel(props: TraceDataPanelProps) {\n const [sideView, setSideView] = useState<TraceSideView>();\n const [isScoringOpen, setIsScoringOpen] = useState(false);\n const { data: scorers, isLoading: isLoadingScorers } = useScorers();\n const rootSpan = props.anchorSpanId\n ? props.spans?.find(span => span.spanId === props.anchorSpanId)\n : props.spans?.find(span => span.parentSpanId == null);\n\n return (\n <>\n <TraceDataPanelView\n {...props}\n onEvaluateTrace={() => setIsScoringOpen(true)}\n sideView={sideView}\n onSideViewChange={setSideView}\n />\n <Dialog open={isScoringOpen} onOpenChange={setIsScoringOpen}>\n <DialogContent size=\"lg\">\n <DialogHeader>\n <DialogTitle>Score trace</DialogTitle>\n </DialogHeader>\n\n {isScoringOpen && rootSpan && (\n <SpanScoring\n traceId={props.traceId}\n spanId={rootSpan.spanId}\n entityType={rootSpan.entityType === 'agent' ? 'Agent' : 'Workflow'}\n isTopLevelSpan={!rootSpan.parentSpanId}\n scorers={scorers}\n isLoadingScorers={isLoadingScorers}\n onSuccess={() => {\n setIsScoringOpen(false);\n setSideView('scores');\n }}\n />\n )}\n </DialogContent>\n </Dialog>\n </>\n );\n}\n"],"names":["useState","useScorers","jsxs","Fragment","jsx","TraceDataPanelView","Dialog","DialogContent","DialogHeader","DialogTitle","SpanScoring"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAeO,SAAS,eAAe,KAAA,EAA4B;AACzD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,cAAA,EAAwB;AACxD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAAS,KAAK,CAAA;AACxD,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,gBAAA,KAAqBC,iBAAA,EAAW;AAClE,EAAA,MAAM,WAAW,KAAA,CAAM,YAAA,GACnB,MAAM,KAAA,EAAO,IAAA,CAAK,UAAQ,IAAA,CAAK,MAAA,KAAW,KAAA,CAAM,YAAY,IAC5D,KAAA,CAAM,KAAA,EAAO,KAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,gBAAgB,IAAI,CAAA;AAEvD,EAAA,uBACEC,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAC,cAAA;AAAA,MAACC,+DAAA;AAAA,MAAA;AAAA,QACE,GAAG,KAAA;AAAA,QACJ,eAAA,EAAiB,MAAM,gBAAA,CAAiB,IAAI,CAAA;AAAA,QAC5C,QAAA;AAAA,QACA,gBAAA,EAAkB;AAAA;AAAA,KACpB;AAAA,oBACAD,cAAA,CAACE,iBAAO,IAAA,EAAM,aAAA,EAAe,cAAc,gBAAA,EACzC,QAAA,kBAAAJ,eAAA,CAACK,oBAAA,EAAA,EAAc,IAAA,EAAK,IAAA,EAClB,QAAA,EAAA;AAAA,sBAAAH,cAAA,CAACI,mBAAA,EAAA,EACC,QAAA,kBAAAJ,cAAA,CAACK,kBAAA,EAAA,EAAY,QAAA,EAAA,aAAA,EAAW,CAAA,EAC1B,CAAA;AAAA,MAEC,iBAAiB,QAAA,oBAChBL,cAAA;AAAA,QAACM,iDAAA;AAAA,QAAA;AAAA,UACC,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,QAAQ,QAAA,CAAS,MAAA;AAAA,UACjB,UAAA,EAAY,QAAA,CAAS,UAAA,KAAe,OAAA,GAAU,OAAA,GAAU,UAAA;AAAA,UACxD,cAAA,EAAgB,CAAC,QAAA,CAAS,YAAA;AAAA,UAC1B,OAAA;AAAA,UACA,gBAAA;AAAA,UACA,WAAW,MAAM;AACf,YAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,YAAA,WAAA,CAAY,QAAQ,CAAA;AAAA,UACtB;AAAA;AAAA;AACF,KAAA,EAEJ,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -11,6 +11,7 @@ import '@mastra/react/hooks/datasets';
11
11
  import '../../../Button-EGoajBQY.js';
12
12
  import '../../../field-control-aria-DB6y41tQ.js';
13
13
  import '../../../lib/framework.es.js';
14
+ import '../../../toast-5aQbZBbY.js';
14
15
  import { TraceDataPanelView } from './trace-data-panel-view.es.js';
15
16
  import { D as Dialog, d as DialogContent, g as DialogHeader, j as DialogTitle } from '../../../dialog-j2e95YNV.js';
16
17
 
@@ -1 +1 @@
1
- {"version":3,"file":"trace-data-panel.es.js","sources":["../../../../src/domains/traces/components/trace-data-panel.tsx"],"sourcesContent":["import { useScorers } from '@mastra/react/hooks/scores';\nimport { useState, type ComponentProps } from 'react';\nimport { SpanScoring } from '@/domains/scores';\nimport { TraceDataPanelView, type TraceSideView } from '@/domains/traces/components/trace-data-panel-view';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/ds/components/Dialog';\n\ntype TraceDataPanelProps = Omit<\n ComponentProps<typeof TraceDataPanelView>,\n 'sideView' | 'onSideViewChange' | 'onEvaluateTrace'\n>;\n\n/**\n * Owns the trace panel's side column view so scoring can land on \"Scores\". Mount it with a\n * `key` on the trace (and anchor span) so a view picked on a previous trace never leaks into the next one.\n */\nexport function TraceDataPanel(props: TraceDataPanelProps) {\n const [sideView, setSideView] = useState<TraceSideView>();\n const [isScoringOpen, setIsScoringOpen] = useState(false);\n const { data: scorers, isLoading: isLoadingScorers } = useScorers();\n const rootSpan = props.anchorSpanId\n ? props.spans?.find(span => span.spanId === props.anchorSpanId)\n : props.spans?.find(span => span.parentSpanId == null);\n\n return (\n <>\n <TraceDataPanelView\n {...props}\n onEvaluateTrace={() => setIsScoringOpen(true)}\n sideView={sideView}\n onSideViewChange={setSideView}\n />\n <Dialog open={isScoringOpen} onOpenChange={setIsScoringOpen}>\n <DialogContent size=\"lg\">\n <DialogHeader>\n <DialogTitle>Score trace</DialogTitle>\n </DialogHeader>\n\n {isScoringOpen && rootSpan && (\n <SpanScoring\n traceId={props.traceId}\n spanId={rootSpan.spanId}\n entityType={rootSpan.entityType === 'agent' ? 'Agent' : 'Workflow'}\n isTopLevelSpan={!rootSpan.parentSpanId}\n scorers={scorers}\n isLoadingScorers={isLoadingScorers}\n onSuccess={() => {\n setIsScoringOpen(false);\n setSideView('scores');\n }}\n />\n )}\n </DialogContent>\n </Dialog>\n </>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAeO,SAAS,eAAe,KAAA,EAA4B;AACzD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAAA,EAAwB;AACxD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,KAAK,CAAA;AACxD,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,gBAAA,KAAqB,UAAA,EAAW;AAClE,EAAA,MAAM,WAAW,KAAA,CAAM,YAAA,GACnB,MAAM,KAAA,EAAO,IAAA,CAAK,UAAQ,IAAA,CAAK,MAAA,KAAW,KAAA,CAAM,YAAY,IAC5D,KAAA,CAAM,KAAA,EAAO,KAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,gBAAgB,IAAI,CAAA;AAEvD,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACE,GAAG,KAAA;AAAA,QACJ,eAAA,EAAiB,MAAM,gBAAA,CAAiB,IAAI,CAAA;AAAA,QAC5C,QAAA;AAAA,QACA,gBAAA,EAAkB;AAAA;AAAA,KACpB;AAAA,oBACA,GAAA,CAAC,UAAO,IAAA,EAAM,aAAA,EAAe,cAAc,gBAAA,EACzC,QAAA,kBAAA,IAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAK,IAAA,EAClB,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,YAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,QAAA,EAAA,aAAA,EAAW,CAAA,EAC1B,CAAA;AAAA,MAEC,iBAAiB,QAAA,oBAChB,GAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,QAAQ,QAAA,CAAS,MAAA;AAAA,UACjB,UAAA,EAAY,QAAA,CAAS,UAAA,KAAe,OAAA,GAAU,OAAA,GAAU,UAAA;AAAA,UACxD,cAAA,EAAgB,CAAC,QAAA,CAAS,YAAA;AAAA,UAC1B,OAAA;AAAA,UACA,gBAAA;AAAA,UACA,WAAW,MAAM;AACf,YAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,YAAA,WAAA,CAAY,QAAQ,CAAA;AAAA,UACtB;AAAA;AAAA;AACF,KAAA,EAEJ,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"trace-data-panel.es.js","sources":["../../../../src/domains/traces/components/trace-data-panel.tsx"],"sourcesContent":["import { useScorers } from '@mastra/react/hooks/scores';\nimport { useState, type ComponentProps } from 'react';\nimport { SpanScoring } from '@/domains/scores';\nimport { TraceDataPanelView, type TraceSideView } from '@/domains/traces/components/trace-data-panel-view';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/ds/components/Dialog';\n\ntype TraceDataPanelProps = Omit<\n ComponentProps<typeof TraceDataPanelView>,\n 'sideView' | 'onSideViewChange' | 'onEvaluateTrace'\n>;\n\n/**\n * Owns the trace panel's side column view so scoring can land on \"Scores\". Mount it with a\n * `key` on the trace (and anchor span) so a view picked on a previous trace never leaks into the next one.\n */\nexport function TraceDataPanel(props: TraceDataPanelProps) {\n const [sideView, setSideView] = useState<TraceSideView>();\n const [isScoringOpen, setIsScoringOpen] = useState(false);\n const { data: scorers, isLoading: isLoadingScorers } = useScorers();\n const rootSpan = props.anchorSpanId\n ? props.spans?.find(span => span.spanId === props.anchorSpanId)\n : props.spans?.find(span => span.parentSpanId == null);\n\n return (\n <>\n <TraceDataPanelView\n {...props}\n onEvaluateTrace={() => setIsScoringOpen(true)}\n sideView={sideView}\n onSideViewChange={setSideView}\n />\n <Dialog open={isScoringOpen} onOpenChange={setIsScoringOpen}>\n <DialogContent size=\"lg\">\n <DialogHeader>\n <DialogTitle>Score trace</DialogTitle>\n </DialogHeader>\n\n {isScoringOpen && rootSpan && (\n <SpanScoring\n traceId={props.traceId}\n spanId={rootSpan.spanId}\n entityType={rootSpan.entityType === 'agent' ? 'Agent' : 'Workflow'}\n isTopLevelSpan={!rootSpan.parentSpanId}\n scorers={scorers}\n isLoadingScorers={isLoadingScorers}\n onSuccess={() => {\n setIsScoringOpen(false);\n setSideView('scores');\n }}\n />\n )}\n </DialogContent>\n </Dialog>\n </>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAeO,SAAS,eAAe,KAAA,EAA4B;AACzD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAAA,EAAwB;AACxD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,KAAK,CAAA;AACxD,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,gBAAA,KAAqB,UAAA,EAAW;AAClE,EAAA,MAAM,WAAW,KAAA,CAAM,YAAA,GACnB,MAAM,KAAA,EAAO,IAAA,CAAK,UAAQ,IAAA,CAAK,MAAA,KAAW,KAAA,CAAM,YAAY,IAC5D,KAAA,CAAM,KAAA,EAAO,KAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,gBAAgB,IAAI,CAAA;AAEvD,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACE,GAAG,KAAA;AAAA,QACJ,eAAA,EAAiB,MAAM,gBAAA,CAAiB,IAAI,CAAA;AAAA,QAC5C,QAAA;AAAA,QACA,gBAAA,EAAkB;AAAA;AAAA,KACpB;AAAA,oBACA,GAAA,CAAC,UAAO,IAAA,EAAM,aAAA,EAAe,cAAc,gBAAA,EACzC,QAAA,kBAAA,IAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAK,IAAA,EAClB,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,YAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,QAAA,EAAA,aAAA,EAAW,CAAA,EAC1B,CAAA;AAAA,MAEC,iBAAiB,QAAA,oBAChB,GAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,QAAQ,QAAA,CAAS,MAAA;AAAA,UACjB,UAAA,EAAY,QAAA,CAAS,UAAA,KAAe,OAAA,GAAU,OAAA,GAAU,UAAA;AAAA,UACxD,cAAA,EAAgB,CAAC,QAAA,CAAS,YAAA;AAAA,UAC1B,OAAA;AAAA,UACA,gBAAA;AAAA,UACA,WAAW,MAAM;AACf,YAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,YAAA,WAAA,CAAY,QAAQ,CAAA;AAAA,UACtB;AAAA;AAAA;AACF,KAAA,EAEJ,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -19,6 +19,7 @@ require('../../../lib/form/utils.cjs.js');
19
19
  require('../../../Button-DH1aTzbs.cjs');
20
20
  require('../../../field-control-aria-WzMGs0A4.cjs');
21
21
  require('date-fns');
22
+ require('../../../popover-AfnrAYck.cjs');
22
23
  const utils_cn = require('../../../cn-DlOJCxrS.cjs');
23
24
  require('@autoform/core');
24
25
  require('@autoform/react');
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-input-data.cjs.js","sources":["../../../../src/domains/workflows/workflow/workflow-input-data.tsx"],"sourcesContent":["import { Play } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { useRef, useState } from 'react';\nimport type { ZodSchema } from 'zod';\n\nimport { createProcessorInput, parseProcessorDraft } from './input/processor-input';\nimport type { ProcessorDraft } from './input/processor-input';\nimport { WorkflowJsonInput } from './input/workflow-json-input';\nimport { WorkflowProcessorInput } from './input/workflow-processor-input';\nimport { WorkflowInputTypeToggle } from './workflow-input-type-toggle';\nimport type { WorkflowInputType } from './workflow-input-type-toggle';\nimport { Button } from '@/ds/components/Button';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/ds/components/Collapsible';\nimport { DisclosureChevron } from '@/ds/components/DisclosureChevron';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { DynamicForm } from '@/lib/form';\nimport { getFormShapeError, parseJsonDraft, validateJsonDraft } from '@/lib/form/json-draft';\nimport type { JsonDraftValue } from '@/lib/form/json-draft';\nimport { cn } from '@/utils/cn';\n\nexport interface WorkflowInputDataProps {\n schema: ZodSchema;\n defaultValues?: unknown;\n isSubmitLoading: boolean;\n submitButtonLabel: string;\n onSubmit: (data: any) => void;\n children?: React.ReactNode;\n isProcessorWorkflow?: boolean;\n submitActions?: React.ReactNode;\n leftActions?: React.ReactNode;\n headingSlot?: ReactNode;\n collapsible?: boolean;\n submitButtonIcon?: ReactNode;\n submitButtonVariant?: React.ComponentProps<typeof Button>['variant'];\n submitButtonFullWidth?: boolean;\n hideInputTypeLabel?: boolean;\n inputTypeLabel?: string;\n hideHeading?: boolean;\n}\n\ntype InputDraft =\n | { type: 'json'; value: string }\n | { type: 'form'; value: unknown }\n | { type: 'simple'; value: ProcessorDraft };\n\nconst defaultSubmitIcon = (\n <Icon>\n <Play />\n </Icon>\n);\n\nfunction createInitialDraft(defaultValues: unknown, isProcessorWorkflow: boolean | undefined): InputDraft {\n if (!isProcessorWorkflow) return { type: 'form', value: defaultValues };\n const input = defaultValues ?? createProcessorInput();\n const draft = parseProcessorDraft(input);\n return draft ? { type: 'simple', value: draft } : { type: 'json', value: JSON.stringify(input, null, 2) };\n}\n\nexport const WorkflowInputData = ({\n schema,\n defaultValues,\n isSubmitLoading,\n submitButtonLabel,\n onSubmit,\n children,\n isProcessorWorkflow,\n submitActions,\n leftActions,\n headingSlot,\n collapsible = true,\n submitButtonIcon = defaultSubmitIcon,\n submitButtonVariant = 'primary',\n submitButtonFullWidth,\n hideInputTypeLabel,\n inputTypeLabel = 'Run input',\n hideHeading,\n}: WorkflowInputDataProps) => {\n const [draft, setDraft] = useState(() => createInitialDraft(defaultValues, isProcessorWorkflow));\n // The Form view is uncontrolled: state here would only re-render this tree on every keystroke.\n const formValues = useRef<unknown>(defaultValues);\n const [errors, setErrors] = useState<string[]>([]);\n\n function readDraftValue(): JsonDraftValue {\n if (draft.type === 'json') return parseJsonDraft(draft.value);\n return { ok: true, value: draft.type === 'form' ? formValues.current : draft.value };\n }\n\n function submitJsonDraft(text: string) {\n const result = validateJsonDraft(schema, text);\n if (result.ok) onSubmit(result.value);\n else setErrors(result.errors);\n }\n\n function changeInputType(type: WorkflowInputType) {\n if (type === draft.type) return;\n setErrors([]);\n const current = readDraftValue();\n if (!current.ok) return setErrors([current.error]);\n if (type === 'json') {\n return setDraft({ type, value: JSON.stringify(current.value === undefined ? {} : current.value, null, 2) });\n }\n if (type === 'simple') {\n const processorDraft = parseProcessorDraft(current.value);\n if (processorDraft) return setDraft({ type, value: processorDraft });\n return setErrors([\n 'Simple input requires a messages array with text parts and a string phase. Correct the JSON first.',\n ]);\n }\n const formShapeError = getFormShapeError(schema, current.value);\n return formShapeError ? setErrors([formShapeError]) : setDraft({ type, value: current.value });\n }\n\n const defaultHeading = (\n <Txt as=\"span\" variant=\"subheading\" tone=\"ink\">\n Trigger a run\n </Txt>\n );\n const toggleSitsInLabelRow = !collapsible && !hideHeading;\n const toggleSitsAboveInput = collapsible || hideHeading || hideInputTypeLabel;\n const inputTypeToggle = (\n <WorkflowInputTypeToggle\n value={draft.type}\n onChange={changeInputType}\n disabled={isSubmitLoading}\n includeSimple={isProcessorWorkflow}\n compact={toggleSitsInLabelRow}\n />\n );\n\n const body = (\n <>\n {!hideInputTypeLabel && (\n <div className=\"flex justify-between gap-3 px-5 py-3\">\n <Txt as=\"p\" variant=\"caption\" tone=\"muted\">\n {inputTypeLabel}\n </Txt>\n {toggleSitsInLabelRow && <div className=\"shrink-0\">{inputTypeToggle}</div>}\n </div>\n )}\n\n <div className=\"px-5\">\n {toggleSitsAboveInput && <div className=\"pb-4\">{inputTypeToggle}</div>}\n\n <div\n className={cn('pb-4', {\n 'pointer-events-none opacity-50': isSubmitLoading,\n })}\n >\n {draft.type === 'json' ? (\n <WorkflowJsonInput\n value={draft.value}\n onChange={value => {\n setDraft({ type: 'json', value });\n setErrors([]);\n }}\n errors={errors}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={() => submitJsonDraft(draft.value)}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </WorkflowJsonInput>\n ) : draft.type === 'simple' && isProcessorWorkflow ? (\n <WorkflowProcessorInput\n schema={schema}\n value={draft.value}\n onChange={value => setDraft({ type: 'simple', value })}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={onSubmit}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </WorkflowProcessorInput>\n ) : (\n <WorkflowFormInput\n schema={schema}\n onValuesChange={value => {\n formValues.current = value;\n }}\n defaultValues={draft.value}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={onSubmit}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </WorkflowFormInput>\n )}\n </div>\n </div>\n </>\n );\n\n if (!collapsible) {\n return (\n <>\n {!hideHeading && <div className=\"border-b border-border pb-3\">{headingSlot ?? defaultHeading}</div>}\n <div>{body}</div>\n </>\n );\n }\n\n return (\n <Collapsible defaultOpen>\n <CollapsibleTrigger className=\"flex w-full items-center gap-2 pb-3 text-left\">\n <DisclosureChevron direction=\"right\" className=\"size-4 text-muted-foreground\" />\n {headingSlot ?? defaultHeading}\n </CollapsibleTrigger>\n\n <CollapsibleContent keepMounted>{body}</CollapsibleContent>\n </Collapsible>\n );\n};\n\nconst WorkflowFormInput = ({\n schema,\n defaultValues,\n isSubmitLoading,\n submitButtonLabel,\n onSubmit,\n children,\n submitActions,\n leftActions,\n submitButtonIcon,\n submitButtonVariant,\n submitButtonFullWidth,\n onValuesChange,\n}: WorkflowInputDataProps & { onValuesChange: (value: unknown) => void }) => (\n <DynamicForm\n schema={schema}\n defaultValues={defaultValues}\n onValuesChange={onValuesChange}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={onSubmit}\n readOnly={isSubmitLoading}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </DynamicForm>\n);\n"],"names":["jsx","Icon","Play","createProcessorInput","parseProcessorDraft","collapsible","useState","useRef","parseJsonDraft","validateJsonDraft","getFormShapeError","Txt","WorkflowInputTypeToggle","jsxs","Fragment","cn","WorkflowJsonInput","WorkflowProcessorInput","Collapsible","CollapsibleTrigger","DisclosureChevron","CollapsibleContent","DynamicForm"],"mappings":"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"}
1
+ {"version":3,"file":"workflow-input-data.cjs.js","sources":["../../../../src/domains/workflows/workflow/workflow-input-data.tsx"],"sourcesContent":["import { Play } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { useRef, useState } from 'react';\nimport type { ZodSchema } from 'zod';\n\nimport { createProcessorInput, parseProcessorDraft } from './input/processor-input';\nimport type { ProcessorDraft } from './input/processor-input';\nimport { WorkflowJsonInput } from './input/workflow-json-input';\nimport { WorkflowProcessorInput } from './input/workflow-processor-input';\nimport { WorkflowInputTypeToggle } from './workflow-input-type-toggle';\nimport type { WorkflowInputType } from './workflow-input-type-toggle';\nimport { Button } from '@/ds/components/Button';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/ds/components/Collapsible';\nimport { DisclosureChevron } from '@/ds/components/DisclosureChevron';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { DynamicForm } from '@/lib/form';\nimport { getFormShapeError, parseJsonDraft, validateJsonDraft } from '@/lib/form/json-draft';\nimport type { JsonDraftValue } from '@/lib/form/json-draft';\nimport { cn } from '@/utils/cn';\n\nexport interface WorkflowInputDataProps {\n schema: ZodSchema;\n defaultValues?: unknown;\n isSubmitLoading: boolean;\n submitButtonLabel: string;\n onSubmit: (data: any) => void;\n children?: React.ReactNode;\n isProcessorWorkflow?: boolean;\n submitActions?: React.ReactNode;\n leftActions?: React.ReactNode;\n headingSlot?: ReactNode;\n collapsible?: boolean;\n submitButtonIcon?: ReactNode;\n submitButtonVariant?: React.ComponentProps<typeof Button>['variant'];\n submitButtonFullWidth?: boolean;\n hideInputTypeLabel?: boolean;\n inputTypeLabel?: string;\n hideHeading?: boolean;\n}\n\ntype InputDraft =\n | { type: 'json'; value: string }\n | { type: 'form'; value: unknown }\n | { type: 'simple'; value: ProcessorDraft };\n\nconst defaultSubmitIcon = (\n <Icon>\n <Play />\n </Icon>\n);\n\nfunction createInitialDraft(defaultValues: unknown, isProcessorWorkflow: boolean | undefined): InputDraft {\n if (!isProcessorWorkflow) return { type: 'form', value: defaultValues };\n const input = defaultValues ?? createProcessorInput();\n const draft = parseProcessorDraft(input);\n return draft ? { type: 'simple', value: draft } : { type: 'json', value: JSON.stringify(input, null, 2) };\n}\n\nexport const WorkflowInputData = ({\n schema,\n defaultValues,\n isSubmitLoading,\n submitButtonLabel,\n onSubmit,\n children,\n isProcessorWorkflow,\n submitActions,\n leftActions,\n headingSlot,\n collapsible = true,\n submitButtonIcon = defaultSubmitIcon,\n submitButtonVariant = 'primary',\n submitButtonFullWidth,\n hideInputTypeLabel,\n inputTypeLabel = 'Run input',\n hideHeading,\n}: WorkflowInputDataProps) => {\n const [draft, setDraft] = useState(() => createInitialDraft(defaultValues, isProcessorWorkflow));\n // The Form view is uncontrolled: state here would only re-render this tree on every keystroke.\n const formValues = useRef<unknown>(defaultValues);\n const [errors, setErrors] = useState<string[]>([]);\n\n function readDraftValue(): JsonDraftValue {\n if (draft.type === 'json') return parseJsonDraft(draft.value);\n return { ok: true, value: draft.type === 'form' ? formValues.current : draft.value };\n }\n\n function submitJsonDraft(text: string) {\n const result = validateJsonDraft(schema, text);\n if (result.ok) onSubmit(result.value);\n else setErrors(result.errors);\n }\n\n function changeInputType(type: WorkflowInputType) {\n if (type === draft.type) return;\n setErrors([]);\n const current = readDraftValue();\n if (!current.ok) return setErrors([current.error]);\n if (type === 'json') {\n return setDraft({ type, value: JSON.stringify(current.value === undefined ? {} : current.value, null, 2) });\n }\n if (type === 'simple') {\n const processorDraft = parseProcessorDraft(current.value);\n if (processorDraft) return setDraft({ type, value: processorDraft });\n return setErrors([\n 'Simple input requires a messages array with text parts and a string phase. Correct the JSON first.',\n ]);\n }\n const formShapeError = getFormShapeError(schema, current.value);\n return formShapeError ? setErrors([formShapeError]) : setDraft({ type, value: current.value });\n }\n\n const defaultHeading = (\n <Txt as=\"span\" variant=\"subheading\" tone=\"ink\">\n Trigger a run\n </Txt>\n );\n const toggleSitsInLabelRow = !collapsible && !hideHeading;\n const toggleSitsAboveInput = collapsible || hideHeading || hideInputTypeLabel;\n const inputTypeToggle = (\n <WorkflowInputTypeToggle\n value={draft.type}\n onChange={changeInputType}\n disabled={isSubmitLoading}\n includeSimple={isProcessorWorkflow}\n compact={toggleSitsInLabelRow}\n />\n );\n\n const body = (\n <>\n {!hideInputTypeLabel && (\n <div className=\"flex justify-between gap-3 px-5 py-3\">\n <Txt as=\"p\" variant=\"caption\" tone=\"muted\">\n {inputTypeLabel}\n </Txt>\n {toggleSitsInLabelRow && <div className=\"shrink-0\">{inputTypeToggle}</div>}\n </div>\n )}\n\n <div className=\"px-5\">\n {toggleSitsAboveInput && <div className=\"pb-4\">{inputTypeToggle}</div>}\n\n <div\n className={cn('pb-4', {\n 'pointer-events-none opacity-50': isSubmitLoading,\n })}\n >\n {draft.type === 'json' ? (\n <WorkflowJsonInput\n value={draft.value}\n onChange={value => {\n setDraft({ type: 'json', value });\n setErrors([]);\n }}\n errors={errors}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={() => submitJsonDraft(draft.value)}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </WorkflowJsonInput>\n ) : draft.type === 'simple' && isProcessorWorkflow ? (\n <WorkflowProcessorInput\n schema={schema}\n value={draft.value}\n onChange={value => setDraft({ type: 'simple', value })}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={onSubmit}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </WorkflowProcessorInput>\n ) : (\n <WorkflowFormInput\n schema={schema}\n onValuesChange={value => {\n formValues.current = value;\n }}\n defaultValues={draft.value}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={onSubmit}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </WorkflowFormInput>\n )}\n </div>\n </div>\n </>\n );\n\n if (!collapsible) {\n return (\n <>\n {!hideHeading && <div className=\"border-b border-border pb-3\">{headingSlot ?? defaultHeading}</div>}\n <div>{body}</div>\n </>\n );\n }\n\n return (\n <Collapsible defaultOpen>\n <CollapsibleTrigger className=\"flex w-full items-center gap-2 pb-3 text-left\">\n <DisclosureChevron direction=\"right\" className=\"size-4 text-muted-foreground\" />\n {headingSlot ?? defaultHeading}\n </CollapsibleTrigger>\n\n <CollapsibleContent keepMounted>{body}</CollapsibleContent>\n </Collapsible>\n );\n};\n\nconst WorkflowFormInput = ({\n schema,\n defaultValues,\n isSubmitLoading,\n submitButtonLabel,\n onSubmit,\n children,\n submitActions,\n leftActions,\n submitButtonIcon,\n submitButtonVariant,\n submitButtonFullWidth,\n onValuesChange,\n}: WorkflowInputDataProps & { onValuesChange: (value: unknown) => void }) => (\n <DynamicForm\n schema={schema}\n defaultValues={defaultValues}\n onValuesChange={onValuesChange}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={onSubmit}\n readOnly={isSubmitLoading}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </DynamicForm>\n);\n"],"names":["jsx","Icon","Play","createProcessorInput","parseProcessorDraft","collapsible","useState","useRef","parseJsonDraft","validateJsonDraft","getFormShapeError","Txt","WorkflowInputTypeToggle","jsxs","Fragment","cn","WorkflowJsonInput","WorkflowProcessorInput","Collapsible","CollapsibleTrigger","DisclosureChevron","CollapsibleContent","DynamicForm"],"mappings":"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"}
@@ -15,6 +15,7 @@ import '../../../lib/form/utils.es.js';
15
15
  import '../../../Button-EGoajBQY.js';
16
16
  import '../../../field-control-aria-DB6y41tQ.js';
17
17
  import 'date-fns';
18
+ import '../../../popover-BqRniR9J.js';
18
19
  import { c as cn } from '../../../cn-CQUhN5Jx.js';
19
20
  import '@autoform/core';
20
21
  import '@autoform/react';