@mastra/playground-ui 48.0.0-alpha.1 → 48.0.0-alpha.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/CHANGELOG.md +141 -0
  2. package/dist/components/DataList.cjs.js +4 -4
  3. package/dist/components/DataList.es.js +4 -4
  4. package/dist/components/EnvironmentVariablesEditor.cjs.js +1 -1
  5. package/dist/components/EnvironmentVariablesEditor.es.js +1 -1
  6. package/dist/components/LogsDataList.cjs.js +2 -2
  7. package/dist/components/LogsDataList.es.js +2 -2
  8. package/dist/components/MarkdownRenderer.cjs.js +1 -1
  9. package/dist/components/MarkdownRenderer.es.js +1 -1
  10. package/dist/components/ai/plan.cjs.js +1 -1
  11. package/dist/components/ai/plan.es.js +1 -1
  12. package/dist/{data-list-B3P5IlxV.cjs → data-list-Cb-piK4z.cjs} +2 -2
  13. package/dist/{data-list-B3P5IlxV.cjs.map → data-list-Cb-piK4z.cjs.map} +1 -1
  14. package/dist/{data-list-CZC8N3I4.js → data-list-CnQRIUyN.js} +2 -2
  15. package/dist/{data-list-CZC8N3I4.js.map → data-list-CnQRIUyN.js.map} +1 -1
  16. package/dist/{data-list-skeleton-ClGPuUja.cjs → data-list-skeleton--tiF5mjH.cjs} +4 -4
  17. package/dist/data-list-skeleton--tiF5mjH.cjs.map +1 -0
  18. package/dist/{data-list-skeleton-BDQEjCWH.js → data-list-skeleton-DeEqsrIz.js} +4 -4
  19. package/dist/data-list-skeleton-DeEqsrIz.js.map +1 -0
  20. package/dist/{data-list-top-cell-Dfg0AKmr.cjs → data-list-top-cell-CU8KoWys.cjs} +8 -3
  21. package/dist/data-list-top-cell-CU8KoWys.cjs.map +1 -0
  22. package/dist/{data-list-top-cell-S98SdRsx.js → data-list-top-cell-D9VTy6Sk.js} +8 -3
  23. package/dist/data-list-top-cell-D9VTy6Sk.js.map +1 -0
  24. package/dist/domains/logs/components/logs-list-view.cjs.js +2 -2
  25. package/dist/domains/logs/components/logs-list-view.es.js +2 -2
  26. package/dist/domains/metrics/components/memory-card-view.cjs.js +1 -1
  27. package/dist/domains/metrics/components/memory-card-view.es.js +1 -1
  28. package/dist/domains/metrics/components/model-usage-cost-card-view.cjs.js +1 -1
  29. package/dist/domains/metrics/components/model-usage-cost-card-view.es.js +1 -1
  30. package/dist/domains/metrics/components/scores-card-view.cjs.js +1 -1
  31. package/dist/domains/metrics/components/scores-card-view.es.js +1 -1
  32. package/dist/domains/metrics/drilldown.cjs.js +1 -1
  33. package/dist/domains/metrics/drilldown.cjs.js.map +1 -1
  34. package/dist/domains/metrics/drilldown.es.js +1 -1
  35. package/dist/domains/metrics/drilldown.es.js.map +1 -1
  36. package/dist/domains/metrics/hooks/use-metrics.cjs.js.map +1 -1
  37. package/dist/domains/metrics/hooks/use-metrics.es.js.map +1 -1
  38. package/dist/domains/traces/components/trace-data-panel-view.cjs.js +4 -4
  39. package/dist/domains/traces/components/trace-data-panel-view.cjs.js.map +1 -1
  40. package/dist/domains/traces/components/trace-data-panel-view.es.js +4 -4
  41. package/dist/domains/traces/components/trace-data-panel-view.es.js.map +1 -1
  42. package/dist/domains/traces/components/traces-list-view.cjs.js +3 -3
  43. package/dist/domains/traces/components/traces-list-view.es.js +3 -3
  44. package/dist/ee/signals/components/signals-empty-state.cjs.js +1 -1
  45. package/dist/ee/signals/components/signals-empty-state.cjs.js.map +1 -1
  46. package/dist/ee/signals/components/signals-empty-state.es.js +1 -1
  47. package/dist/ee/signals/components/signals-empty-state.es.js.map +1 -1
  48. package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +1 -1
  49. package/dist/ee/topics/components/topic-trace-summary-list.es.js +1 -1
  50. package/dist/icons/GithubIcon.cjs.js +7 -10
  51. package/dist/icons/GithubIcon.cjs.js.map +1 -1
  52. package/dist/icons/GithubIcon.es.js +8 -11
  53. package/dist/icons/GithubIcon.es.js.map +1 -1
  54. package/dist/icons/LinearIcon.cjs.js +10 -0
  55. package/dist/icons/LinearIcon.cjs.js.map +1 -0
  56. package/dist/icons/LinearIcon.d.ts +2 -0
  57. package/dist/icons/LinearIcon.es.js +6 -0
  58. package/dist/icons/LinearIcon.es.js.map +1 -0
  59. package/dist/icons/SlackIcon.cjs.js +39 -0
  60. package/dist/icons/SlackIcon.cjs.js.map +1 -0
  61. package/dist/icons/SlackIcon.d.ts +2 -0
  62. package/dist/icons/SlackIcon.es.js +35 -0
  63. package/dist/icons/SlackIcon.es.js.map +1 -0
  64. package/dist/{logs-data-list-C9Q9MHsz.js → logs-data-list-CAa2nwZC.js} +2 -2
  65. package/dist/{logs-data-list-C9Q9MHsz.js.map → logs-data-list-CAa2nwZC.js.map} +1 -1
  66. package/dist/{logs-data-list-DTt_DmNk.cjs → logs-data-list-DWf9fEtC.cjs} +2 -2
  67. package/dist/{logs-data-list-DTt_DmNk.cjs.map → logs-data-list-DWf9fEtC.cjs.map} +1 -1
  68. package/dist/{markdown-renderer-CqAR8lve.js → markdown-renderer-Bi2fWeoF.js} +15 -2
  69. package/dist/markdown-renderer-Bi2fWeoF.js.map +1 -0
  70. package/dist/{markdown-renderer-CfWz5SWN.cjs → markdown-renderer-DwfNrhEH.cjs} +15 -2
  71. package/dist/markdown-renderer-DwfNrhEH.cjs.map +1 -0
  72. package/dist/src/domains/metrics/drilldown.d.ts +1 -1
  73. package/dist/src/domains/metrics/hooks/use-metrics.d.ts +1 -1
  74. package/dist/src/ds/components/DataList/data-list-root.d.ts +13 -1
  75. package/dist/src/ds/components/DataList/data-list-skeleton.d.ts +3 -1
  76. package/dist/src/ds/icons/LinearIcon.d.ts +2 -0
  77. package/dist/src/ds/icons/SlackIcon.d.ts +2 -0
  78. package/dist/src/ds/icons/index.d.ts +2 -0
  79. package/dist/{traces-data-list-a3sYTxch.js → traces-data-list-DtuaCDES.js} +3 -3
  80. package/dist/{traces-data-list-a3sYTxch.js.map → traces-data-list-DtuaCDES.js.map} +1 -1
  81. package/dist/{traces-data-list-D3TOjHkm.cjs → traces-data-list-vsvvvEiP.cjs} +3 -3
  82. package/dist/{traces-data-list-D3TOjHkm.cjs.map → traces-data-list-vsvvvEiP.cjs.map} +1 -1
  83. package/package.json +7 -7
  84. package/dist/data-list-skeleton-BDQEjCWH.js.map +0 -1
  85. package/dist/data-list-skeleton-ClGPuUja.cjs.map +0 -1
  86. package/dist/data-list-top-cell-Dfg0AKmr.cjs.map +0 -1
  87. package/dist/data-list-top-cell-S98SdRsx.js.map +0 -1
  88. package/dist/markdown-renderer-CfWz5SWN.cjs.map +0 -1
  89. package/dist/markdown-renderer-CqAR8lve.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"use-metrics.es.js","sources":["../../../../src/domains/metrics/hooks/use-metrics.tsx"],"sourcesContent":["/* eslint-disable react-refresh/only-export-components */\nimport { format } from 'date-fns';\nimport { createContext, useContext, useMemo } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { buildMetricsDimensionalFilter } from '../metrics-filters';\nimport type { MetricsDimensionalFilter } from '../metrics-filters';\nimport type { PropertyFilterToken } from '@/ds/components/PropertyFilter/types';\n\nconst DATE_PRESETS = [\n { label: 'Last 24 hours', value: '24h' },\n { label: 'Last 3 days', value: '3d' },\n { label: 'Last 7 days', value: '7d' },\n { label: 'Last 14 days', value: '14d' },\n { label: 'Last 30 days', value: '30d' },\n] as const;\n\nexport type DatePreset = (typeof DATE_PRESETS)[number]['value'] | 'custom';\n\nexport { DATE_PRESETS };\n\nconst VALID_PRESETS = new Set<string>(DATE_PRESETS.map(p => p.value));\n\nexport function isValidPreset(value: string | null | undefined): value is DatePreset {\n return typeof value === 'string' && (VALID_PRESETS.has(value) || value === 'custom');\n}\n\nexport type DateRange = { from?: Date; to?: Date };\n\n/** Internal — all state is derived from the URL-backed props the owner passes.\n * There is intentionally no local mirror; keeping a mirror caused URL ↔ state\n * feedback loops that re-rendered the entire metrics tree on every keystroke.\n */\ntype MetricsContextValue = {\n datePreset: DatePreset;\n setDatePreset: (v: DatePreset) => void;\n customRange: DateRange | undefined;\n setCustomRange: (v: DateRange | undefined) => void;\n dateRangeLabel: string;\n filterTokens: PropertyFilterToken[];\n setFilterTokens: (tokens: PropertyFilterToken[]) => void;\n dimensionalFilter: MetricsDimensionalFilter;\n /** Stable JSON representation of `dimensionalFilter`, safe for query keys. */\n dimensionalFilterKey: string;\n /** Base path drilldown links should target for the Traces page. */\n tracesBasePath: string | undefined;\n /** Base path drilldown links should target for the Logs page. */\n logsBasePath: string | undefined;\n};\n\nexport const MetricsContext = createContext<MetricsContextValue>({\n datePreset: '24h',\n setDatePreset: () => {},\n customRange: undefined,\n setCustomRange: () => {},\n dateRangeLabel: 'Last 24 hours',\n filterTokens: [],\n setFilterTokens: () => {},\n dimensionalFilter: {},\n dimensionalFilterKey: '{}',\n tracesBasePath: undefined,\n logsBasePath: undefined,\n});\n\nexport function useMetrics() {\n return useContext(MetricsContext);\n}\n\nfunction getDateRangeLabel(preset: DatePreset, customRange: DateRange | undefined) {\n if (preset !== 'custom') {\n return DATE_PRESETS.find(p => p.value === preset)?.label ?? preset;\n }\n if (customRange?.from) {\n if (customRange.to) {\n return `${format(customRange.from, 'MMM d, yyyy')} – ${format(customRange.to, 'MMM d, yyyy')}`;\n }\n return format(customRange.from, 'MMM d, yyyy');\n }\n return 'Custom range';\n}\n\n/**\n * URL-driven metrics provider.\n *\n * The owner (page) is expected to:\n * - pass the current `preset` / `filterTokens` derived from `useSearchParams`\n * - pass `onPresetChange` / `onFilterTokensChange` that update the URL\n *\n * The provider never stores its own copies — changes round-trip through the URL\n * exactly once, which keeps re-renders bounded no matter how much data is on\n * screen.\n */\nexport function MetricsProvider({\n children,\n preset,\n filterTokens,\n onPresetChange,\n onFilterTokensChange,\n customRange,\n onCustomRangeChange,\n tracesBasePath,\n logsBasePath,\n}: {\n children: ReactNode;\n preset: DatePreset;\n filterTokens: PropertyFilterToken[];\n onPresetChange: (preset: DatePreset) => void;\n onFilterTokensChange: (tokens: PropertyFilterToken[]) => void;\n customRange?: DateRange;\n onCustomRangeChange?: (range: DateRange | undefined) => void;\n /** Base path for drilldown links to the Traces page. Defaults to `/observability` when omitted. */\n tracesBasePath?: string;\n /** Base path for drilldown links to the Logs page. Defaults to `/logs` when omitted. */\n logsBasePath?: string;\n}) {\n // Stable key for memo dependencies — the parent may re-create the tokens\n // array on every render (e.g. from `useMemo(... , [searchParams])`), but the\n // *content* usually doesn't change.\n const filterTokensKey = useMemo(() => JSON.stringify(filterTokens), [filterTokens]);\n\n // Intentional: re-pin only when the serialized content changes, not on every\n // parent render that allocates a new array.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const stableFilterTokens = useMemo(() => filterTokens, [filterTokensKey]);\n\n const dimensionalFilter = useMemo(() => buildMetricsDimensionalFilter(stableFilterTokens), [stableFilterTokens]);\n\n const dimensionalFilterKey = useMemo(() => JSON.stringify(dimensionalFilter), [dimensionalFilter]);\n\n const dateRangeLabel = getDateRangeLabel(preset, customRange);\n\n const value = useMemo<MetricsContextValue>(\n () => ({\n datePreset: preset,\n setDatePreset: onPresetChange,\n customRange,\n setCustomRange: onCustomRangeChange ?? (() => {}),\n dateRangeLabel,\n filterTokens: stableFilterTokens,\n setFilterTokens: onFilterTokensChange,\n dimensionalFilter,\n dimensionalFilterKey,\n tracesBasePath,\n logsBasePath,\n }),\n [\n preset,\n onPresetChange,\n customRange,\n onCustomRangeChange,\n dateRangeLabel,\n stableFilterTokens,\n onFilterTokensChange,\n dimensionalFilter,\n dimensionalFilterKey,\n tracesBasePath,\n logsBasePath,\n ],\n );\n\n return <MetricsContext.Provider value={value}>{children}</MetricsContext.Provider>;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-metrics.es.js","sources":["../../../../src/domains/metrics/hooks/use-metrics.tsx"],"sourcesContent":["/* eslint-disable react-refresh/only-export-components */\nimport { format } from 'date-fns';\nimport { createContext, useContext, useMemo } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { buildMetricsDimensionalFilter } from '../metrics-filters';\nimport type { MetricsDimensionalFilter } from '../metrics-filters';\nimport type { PropertyFilterToken } from '@/ds/components/PropertyFilter/types';\n\nconst DATE_PRESETS = [\n { label: 'Last 24 hours', value: '24h' },\n { label: 'Last 3 days', value: '3d' },\n { label: 'Last 7 days', value: '7d' },\n { label: 'Last 14 days', value: '14d' },\n { label: 'Last 30 days', value: '30d' },\n] as const;\n\nexport type DatePreset = (typeof DATE_PRESETS)[number]['value'] | 'custom';\n\nexport { DATE_PRESETS };\n\nconst VALID_PRESETS = new Set<string>(DATE_PRESETS.map(p => p.value));\n\nexport function isValidPreset(value: string | null | undefined): value is DatePreset {\n return typeof value === 'string' && (VALID_PRESETS.has(value) || value === 'custom');\n}\n\nexport type DateRange = { from?: Date; to?: Date };\n\n/** Internal — all state is derived from the URL-backed props the owner passes.\n * There is intentionally no local mirror; keeping a mirror caused URL ↔ state\n * feedback loops that re-rendered the entire metrics tree on every keystroke.\n */\ntype MetricsContextValue = {\n datePreset: DatePreset;\n setDatePreset: (v: DatePreset) => void;\n customRange: DateRange | undefined;\n setCustomRange: (v: DateRange | undefined) => void;\n dateRangeLabel: string;\n filterTokens: PropertyFilterToken[];\n setFilterTokens: (tokens: PropertyFilterToken[]) => void;\n dimensionalFilter: MetricsDimensionalFilter;\n /** Stable JSON representation of `dimensionalFilter`, safe for query keys. */\n dimensionalFilterKey: string;\n /** Base path drilldown links should target for the Traces page. */\n tracesBasePath: string | undefined;\n /** Base path drilldown links should target for the Logs page. */\n logsBasePath: string | undefined;\n};\n\nexport const MetricsContext = createContext<MetricsContextValue>({\n datePreset: '24h',\n setDatePreset: () => {},\n customRange: undefined,\n setCustomRange: () => {},\n dateRangeLabel: 'Last 24 hours',\n filterTokens: [],\n setFilterTokens: () => {},\n dimensionalFilter: {},\n dimensionalFilterKey: '{}',\n tracesBasePath: undefined,\n logsBasePath: undefined,\n});\n\nexport function useMetrics() {\n return useContext(MetricsContext);\n}\n\nfunction getDateRangeLabel(preset: DatePreset, customRange: DateRange | undefined) {\n if (preset !== 'custom') {\n return DATE_PRESETS.find(p => p.value === preset)?.label ?? preset;\n }\n if (customRange?.from) {\n if (customRange.to) {\n return `${format(customRange.from, 'MMM d, yyyy')} – ${format(customRange.to, 'MMM d, yyyy')}`;\n }\n return format(customRange.from, 'MMM d, yyyy');\n }\n return 'Custom range';\n}\n\n/**\n * URL-driven metrics provider.\n *\n * The owner (page) is expected to:\n * - pass the current `preset` / `filterTokens` derived from `useSearchParams`\n * - pass `onPresetChange` / `onFilterTokensChange` that update the URL\n *\n * The provider never stores its own copies — changes round-trip through the URL\n * exactly once, which keeps re-renders bounded no matter how much data is on\n * screen.\n */\nexport function MetricsProvider({\n children,\n preset,\n filterTokens,\n onPresetChange,\n onFilterTokensChange,\n customRange,\n onCustomRangeChange,\n tracesBasePath,\n logsBasePath,\n}: {\n children: ReactNode;\n preset: DatePreset;\n filterTokens: PropertyFilterToken[];\n onPresetChange: (preset: DatePreset) => void;\n onFilterTokensChange: (tokens: PropertyFilterToken[]) => void;\n customRange?: DateRange;\n onCustomRangeChange?: (range: DateRange | undefined) => void;\n /** Base path for drilldown links to the Traces page. Defaults to `/traces` when omitted. */\n tracesBasePath?: string;\n /** Base path for drilldown links to the Logs page. Defaults to `/logs` when omitted. */\n logsBasePath?: string;\n}) {\n // Stable key for memo dependencies — the parent may re-create the tokens\n // array on every render (e.g. from `useMemo(... , [searchParams])`), but the\n // *content* usually doesn't change.\n const filterTokensKey = useMemo(() => JSON.stringify(filterTokens), [filterTokens]);\n\n // Intentional: re-pin only when the serialized content changes, not on every\n // parent render that allocates a new array.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const stableFilterTokens = useMemo(() => filterTokens, [filterTokensKey]);\n\n const dimensionalFilter = useMemo(() => buildMetricsDimensionalFilter(stableFilterTokens), [stableFilterTokens]);\n\n const dimensionalFilterKey = useMemo(() => JSON.stringify(dimensionalFilter), [dimensionalFilter]);\n\n const dateRangeLabel = getDateRangeLabel(preset, customRange);\n\n const value = useMemo<MetricsContextValue>(\n () => ({\n datePreset: preset,\n setDatePreset: onPresetChange,\n customRange,\n setCustomRange: onCustomRangeChange ?? (() => {}),\n dateRangeLabel,\n filterTokens: stableFilterTokens,\n setFilterTokens: onFilterTokensChange,\n dimensionalFilter,\n dimensionalFilterKey,\n tracesBasePath,\n logsBasePath,\n }),\n [\n preset,\n onPresetChange,\n customRange,\n onCustomRangeChange,\n dateRangeLabel,\n stableFilterTokens,\n onFilterTokensChange,\n dimensionalFilter,\n dimensionalFilterKey,\n tracesBasePath,\n logsBasePath,\n ],\n );\n\n return <MetricsContext.Provider value={value}>{children}</MetricsContext.Provider>;\n}\n"],"names":[],"mappings":"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"}
@@ -51,7 +51,7 @@ function TraceDataPanelView({
51
51
  onSpanSelect?.(void 0);
52
52
  return;
53
53
  }
54
- if (!spans) return;
54
+ if (isLoading || !spans) return;
55
55
  const found = spans.find((s) => s.spanId === initialSpanId);
56
56
  if (found) {
57
57
  setSelectedSpanId(initialSpanId);
@@ -60,12 +60,12 @@ function TraceDataPanelView({
60
60
  setSelectedSpanId(void 0);
61
61
  onSpanSelect?.(void 0);
62
62
  }
63
- }, [initialSpanId, spans]);
63
+ }, [initialSpanId, spans, isLoading]);
64
64
  React.useEffect(() => {
65
- if (!selectedSpanId || !contentRef.current) return;
65
+ if (isLoading || !selectedSpanId || !contentRef.current) return;
66
66
  const el = contentRef.current.querySelector(`[data-span-id="${selectedSpanId}"]`);
67
67
  el?.scrollIntoView({ block: "nearest" });
68
- }, [selectedSpanId]);
68
+ }, [selectedSpanId, isLoading]);
69
69
  const hierarchicalSpans = React.useMemo(() => domains_traces_components_formatHierarchicalSpans.formatHierarchicalSpans(spans ?? [], anchorSpanId), [spans, anchorSpanId]);
70
70
  const [expandedSpanIds, setExpandedSpanIds] = React.useState([]);
71
71
  React.useEffect(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"trace-data-panel-view.cjs.js","sources":["../../../../src/domains/traces/components/trace-data-panel-view.tsx"],"sourcesContent":["import type { LightSpanRecord } from '@mastra/core/storage';\nimport {\n CircleGaugeIcon,\n ChevronsDownUpIcon,\n ChevronsUpDownIcon,\n DownloadIcon,\n Link2Icon,\n Loader2Icon,\n SaveIcon,\n WrenchIcon,\n} from 'lucide-react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { getAllSpanIds } from '../hooks/get-all-span-ids';\nimport { useDownloadTraceJson } from '../hooks/use-download-trace-json';\nimport { formatHierarchicalSpans } from './format-hierarchical-spans';\nimport { TraceKeysAndValues } from './trace-keys-and-values';\nimport { TraceTimeline } from './trace-timeline';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport { Notice } from '@/ds/components/Notice';\nimport { Icon } from '@/ds/icons/Icon';\nimport type { LinkComponent } from '@/ds/types/link-component';\nimport { truncateString } from '@/lib/truncate-string';\n\nexport type TraceDataPanelPlacement = 'traces-list' | 'trace-page';\n\nexport interface TraceDataPanelViewProps {\n traceId: string;\n /** Lightweight spans for the trace. Caller fetches via useTraceLightSpans. */\n spans: LightSpanRecord[] | undefined;\n isLoading?: boolean;\n onClose: () => void;\n onSpanSelect?: (spanId: string | undefined) => void;\n onEvaluateTrace?: () => void;\n /** When set, a \"Save as Dataset Item\" button appears; the consumer owns the dialog. */\n onSaveAsDatasetItem?: (args: { traceId: string; rootSpanId: string | undefined }) => void;\n /** When set, an \"Add tool mocks to item\" button appears; the consumer owns the dialog. */\n onAddTraceMocksToItem?: (args: { traceId: string }) => void;\n initialSpanId?: string | null;\n onPrevious?: () => void;\n onNext?: () => void;\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n placement: TraceDataPanelPlacement;\n timelineChartWidth?: 'wide' | 'default';\n /** When both are provided, renders an \"Open trace page\" button. */\n LinkComponent?: LinkComponent;\n traceHref?: string;\n /**\n * Span treated as the displayed root of the timeline. Required for branch\n * subtrees from `getBranch` where the anchor has a real parent that's outside\n * `spans`. When omitted, the span with no parent is used (trace case).\n */\n anchorSpanId?: string;\n /**\n * Whether to render the \"Evaluating traces and saving them as dataset items is\n * available in Mastra Studio\" info notice when neither `onEvaluateTrace` nor\n * `onSaveAsDatasetItem` is provided. Defaults to `true`. Pass `false` when this\n * panel is rendered inside Studio in a context that intentionally omits those\n * handlers (e.g. inline below an experiment result).\n */\n showUnavailableFeaturesMsg?: boolean;\n}\n\nexport function TraceDataPanelView({\n traceId,\n spans,\n isLoading,\n onClose,\n onSpanSelect,\n onEvaluateTrace,\n onSaveAsDatasetItem,\n onAddTraceMocksToItem,\n initialSpanId,\n onPrevious,\n onNext,\n collapsed: controlledCollapsed,\n onCollapsedChange,\n placement,\n timelineChartWidth = 'default',\n LinkComponent,\n traceHref,\n anchorSpanId,\n showUnavailableFeaturesMsg = true,\n}: TraceDataPanelViewProps) {\n const isOnTracePage = placement === 'trace-page';\n const [internalCollapsed, setInternalCollapsed] = useState(false);\n const collapsed = controlledCollapsed ?? internalCollapsed;\n const setCollapsed = onCollapsedChange ?? setInternalCollapsed;\n\n const { download: downloadTraceJson, isPending: isDownloadingTrace } = useDownloadTraceJson();\n\n const contentRef = useRef<HTMLDivElement>(null);\n const [selectedSpanId, setSelectedSpanId] = useState<string | undefined>(initialSpanId ?? undefined);\n\n // Sync selected span when initialSpanId or trace data changes\n useEffect(() => {\n // No span requested: clear immediately.\n if (!initialSpanId) {\n setSelectedSpanId(undefined);\n onSpanSelect?.(undefined);\n return;\n }\n // Span requested: wait for trace data before deciding so an in-flight\n // fetch doesn't wipe a URL-provided selection.\n if (!spans) return;\n\n const found = spans.find(s => s.spanId === initialSpanId);\n if (found) {\n setSelectedSpanId(initialSpanId);\n onSpanSelect?.(initialSpanId);\n } else {\n setSelectedSpanId(undefined);\n onSpanSelect?.(undefined);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialSpanId, spans]);\n\n // Scroll the selected span into view within the timeline\n useEffect(() => {\n if (!selectedSpanId || !contentRef.current) return;\n const el = contentRef.current.querySelector(`[data-span-id=\"${selectedSpanId}\"]`);\n el?.scrollIntoView({ block: 'nearest' });\n }, [selectedSpanId]);\n\n const hierarchicalSpans = useMemo(() => formatHierarchicalSpans(spans ?? [], anchorSpanId), [spans, anchorSpanId]);\n\n const [expandedSpanIds, setExpandedSpanIds] = useState<string[]>([]);\n\n useEffect(() => {\n if (hierarchicalSpans.length > 0) {\n setExpandedSpanIds(getAllSpanIds(hierarchicalSpans));\n }\n }, [hierarchicalSpans]);\n\n const rootSpan = useMemo(\n () => (anchorSpanId ? spans?.find(s => s.spanId === anchorSpanId) : spans?.find(s => s.parentSpanId == null)),\n [spans, anchorSpanId],\n );\n\n const handleSpanClick = (id: string) => {\n const newId = selectedSpanId === id ? undefined : id;\n setSelectedSpanId(newId);\n onSpanSelect?.(newId);\n };\n\n const showOpenTracePageLink = !isOnTracePage && LinkComponent && traceHref;\n\n // Shared across both header layouts (list side panel and full trace page) so a trace can be\n // downloaded from wherever it's being inspected.\n const downloadTraceButton = (\n <Button\n size=\"md\"\n tooltip=\"Download trace JSON\"\n aria-label=\"Download trace JSON\"\n disabled={isDownloadingTrace}\n onClick={() => downloadTraceJson(traceId)}\n >\n {isDownloadingTrace ? <Loader2Icon className=\"animate-spin\" /> : <DownloadIcon />}\n </Button>\n );\n\n return (\n <DataPanel collapsed={collapsed}>\n <DataPanel.Header>\n {isOnTracePage ? (\n <>\n <DataPanel.Heading>Trace Timeline</DataPanel.Heading>\n <ButtonsGroup className=\"ml-auto shrink-0\">{downloadTraceButton}</ButtonsGroup>\n </>\n ) : (\n <>\n <DataPanel.Heading>\n Trace <b># {truncateString(traceId, 12)}</b>\n </DataPanel.Heading>\n <ButtonsGroup className=\"ml-auto shrink-0\">\n {onCollapsedChange && (\n <Button\n size=\"md\"\n tooltip={collapsed ? 'Expand panel' : 'Collapse panel'}\n onClick={() => setCollapsed(!collapsed)}\n >\n {collapsed ? <ChevronsUpDownIcon /> : <ChevronsDownUpIcon />}\n </Button>\n )}\n {(onPrevious || onNext) && (\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Previous trace\"\n nextLabel=\"Next trace\"\n />\n )}\n {showOpenTracePageLink && (\n <Button\n as={LinkComponent}\n href={traceHref}\n size=\"md\"\n tooltip=\"Open trace page\"\n aria-label=\"Open trace page\"\n >\n <Link2Icon />\n </Button>\n )}\n {downloadTraceButton}\n <DataPanel.CloseButton onClick={onClose} />\n </ButtonsGroup>\n </>\n )}\n </DataPanel.Header>\n\n {!collapsed &&\n (isLoading ? (\n <DataPanel.LoadingData>Loading trace...</DataPanel.LoadingData>\n ) : hierarchicalSpans.length === 0 ? (\n <DataPanel.NoData>No spans found for this trace.</DataPanel.NoData>\n ) : (\n <DataPanel.Content ref={contentRef}>\n {!isOnTracePage && rootSpan && <TraceKeysAndValues rootSpan={rootSpan} className=\"mb-6\" />}\n\n {!isOnTracePage && (onEvaluateTrace || onSaveAsDatasetItem || onAddTraceMocksToItem) && (\n <div className=\"mb-6 flex flex-wrap items-center justify-between gap-4\">\n {onEvaluateTrace && (\n <Button size=\"sm\" onClick={onEvaluateTrace}>\n <Icon>\n <CircleGaugeIcon />\n </Icon>\n Evaluate Trace\n </Button>\n )}\n {onSaveAsDatasetItem && (\n <Button size=\"sm\" onClick={() => onSaveAsDatasetItem({ traceId, rootSpanId: rootSpan?.spanId })}>\n <Icon>\n <SaveIcon />\n </Icon>\n Save as Dataset Item\n </Button>\n )}\n {onAddTraceMocksToItem && (\n <Button size=\"sm\" onClick={() => onAddTraceMocksToItem({ traceId })}>\n <Icon>\n <WrenchIcon />\n </Icon>\n Add tool mocks to item\n </Button>\n )}\n </div>\n )}\n\n {!isOnTracePage &&\n !onEvaluateTrace &&\n !onSaveAsDatasetItem &&\n !onAddTraceMocksToItem &&\n showUnavailableFeaturesMsg && (\n <Notice variant=\"info\" className=\"mb-6\">\n <Notice.Message>\n Evaluating traces and saving them as dataset items is available in Mastra Studio (local or\n deployed).\n </Notice.Message>\n </Notice>\n )}\n\n <TraceTimeline\n hierarchicalSpans={hierarchicalSpans}\n onSpanClick={handleSpanClick}\n selectedSpanId={selectedSpanId}\n expandedSpanIds={expandedSpanIds}\n setExpandedSpanIds={setExpandedSpanIds}\n chartWidth={timelineChartWidth}\n />\n </DataPanel.Content>\n ))}\n </DataPanel>\n );\n}\n"],"names":["useState","useDownloadTraceJson","useRef","useEffect","useMemo","formatHierarchicalSpans","getAllSpanIds","jsx","Button","Loader2Icon","DownloadIcon","jsxs","DataPanel","Fragment","ButtonsGroup","truncateString","ChevronsUpDownIcon","ChevronsDownUpIcon","Link2Icon","TraceKeysAndValues","Icon","CircleGaugeIcon","SaveIcon","WrenchIcon","Notice","TraceTimeline"],"mappings":"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"}
1
+ {"version":3,"file":"trace-data-panel-view.cjs.js","sources":["../../../../src/domains/traces/components/trace-data-panel-view.tsx"],"sourcesContent":["import type { LightSpanRecord } from '@mastra/core/storage';\nimport {\n CircleGaugeIcon,\n ChevronsDownUpIcon,\n ChevronsUpDownIcon,\n DownloadIcon,\n Link2Icon,\n Loader2Icon,\n SaveIcon,\n WrenchIcon,\n} from 'lucide-react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { getAllSpanIds } from '../hooks/get-all-span-ids';\nimport { useDownloadTraceJson } from '../hooks/use-download-trace-json';\nimport { formatHierarchicalSpans } from './format-hierarchical-spans';\nimport { TraceKeysAndValues } from './trace-keys-and-values';\nimport { TraceTimeline } from './trace-timeline';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport { Notice } from '@/ds/components/Notice';\nimport { Icon } from '@/ds/icons/Icon';\nimport type { LinkComponent } from '@/ds/types/link-component';\nimport { truncateString } from '@/lib/truncate-string';\n\nexport type TraceDataPanelPlacement = 'traces-list' | 'trace-page';\n\nexport interface TraceDataPanelViewProps {\n traceId: string;\n /** Lightweight spans for the trace. Caller fetches via useTraceLightSpans. */\n spans: LightSpanRecord[] | undefined;\n isLoading?: boolean;\n onClose: () => void;\n onSpanSelect?: (spanId: string | undefined) => void;\n onEvaluateTrace?: () => void;\n /** When set, a \"Save as Dataset Item\" button appears; the consumer owns the dialog. */\n onSaveAsDatasetItem?: (args: { traceId: string; rootSpanId: string | undefined }) => void;\n /** When set, an \"Add tool mocks to item\" button appears; the consumer owns the dialog. */\n onAddTraceMocksToItem?: (args: { traceId: string }) => void;\n initialSpanId?: string | null;\n onPrevious?: () => void;\n onNext?: () => void;\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n placement: TraceDataPanelPlacement;\n timelineChartWidth?: 'wide' | 'default';\n /** When both are provided, renders an \"Open trace page\" button. */\n LinkComponent?: LinkComponent;\n traceHref?: string;\n /**\n * Span treated as the displayed root of the timeline. Required for branch\n * subtrees from `getBranch` where the anchor has a real parent that's outside\n * `spans`. When omitted, the span with no parent is used (trace case).\n */\n anchorSpanId?: string;\n /**\n * Whether to render the \"Evaluating traces and saving them as dataset items is\n * available in Mastra Studio\" info notice when neither `onEvaluateTrace` nor\n * `onSaveAsDatasetItem` is provided. Defaults to `true`. Pass `false` when this\n * panel is rendered inside Studio in a context that intentionally omits those\n * handlers (e.g. inline below an experiment result).\n */\n showUnavailableFeaturesMsg?: boolean;\n}\n\nexport function TraceDataPanelView({\n traceId,\n spans,\n isLoading,\n onClose,\n onSpanSelect,\n onEvaluateTrace,\n onSaveAsDatasetItem,\n onAddTraceMocksToItem,\n initialSpanId,\n onPrevious,\n onNext,\n collapsed: controlledCollapsed,\n onCollapsedChange,\n placement,\n timelineChartWidth = 'default',\n LinkComponent,\n traceHref,\n anchorSpanId,\n showUnavailableFeaturesMsg = true,\n}: TraceDataPanelViewProps) {\n const isOnTracePage = placement === 'trace-page';\n const [internalCollapsed, setInternalCollapsed] = useState(false);\n const collapsed = controlledCollapsed ?? internalCollapsed;\n const setCollapsed = onCollapsedChange ?? setInternalCollapsed;\n\n const { download: downloadTraceJson, isPending: isDownloadingTrace } = useDownloadTraceJson();\n\n const contentRef = useRef<HTMLDivElement>(null);\n const [selectedSpanId, setSelectedSpanId] = useState<string | undefined>(initialSpanId ?? undefined);\n\n // Sync selected span when initialSpanId or trace data changes\n useEffect(() => {\n // No span requested: clear immediately.\n if (!initialSpanId) {\n setSelectedSpanId(undefined);\n onSpanSelect?.(undefined);\n return;\n }\n // Span requested: wait for trace data before deciding so an in-flight\n // fetch doesn't wipe a URL-provided selection. Callers that default their\n // spans to `[]` while loading only say so through `isLoading`.\n if (isLoading || !spans) return;\n\n const found = spans.find(s => s.spanId === initialSpanId);\n if (found) {\n setSelectedSpanId(initialSpanId);\n onSpanSelect?.(initialSpanId);\n } else {\n setSelectedSpanId(undefined);\n onSpanSelect?.(undefined);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialSpanId, spans, isLoading]);\n\n // Scroll the selected span into view within the timeline, which only exists\n // once the trace has loaded.\n useEffect(() => {\n if (isLoading || !selectedSpanId || !contentRef.current) return;\n const el = contentRef.current.querySelector(`[data-span-id=\"${selectedSpanId}\"]`);\n el?.scrollIntoView({ block: 'nearest' });\n }, [selectedSpanId, isLoading]);\n\n const hierarchicalSpans = useMemo(() => formatHierarchicalSpans(spans ?? [], anchorSpanId), [spans, anchorSpanId]);\n\n const [expandedSpanIds, setExpandedSpanIds] = useState<string[]>([]);\n\n useEffect(() => {\n if (hierarchicalSpans.length > 0) {\n setExpandedSpanIds(getAllSpanIds(hierarchicalSpans));\n }\n }, [hierarchicalSpans]);\n\n const rootSpan = useMemo(\n () => (anchorSpanId ? spans?.find(s => s.spanId === anchorSpanId) : spans?.find(s => s.parentSpanId == null)),\n [spans, anchorSpanId],\n );\n\n const handleSpanClick = (id: string) => {\n const newId = selectedSpanId === id ? undefined : id;\n setSelectedSpanId(newId);\n onSpanSelect?.(newId);\n };\n\n const showOpenTracePageLink = !isOnTracePage && LinkComponent && traceHref;\n\n // Shared across both header layouts (list side panel and full trace page) so a trace can be\n // downloaded from wherever it's being inspected.\n const downloadTraceButton = (\n <Button\n size=\"md\"\n tooltip=\"Download trace JSON\"\n aria-label=\"Download trace JSON\"\n disabled={isDownloadingTrace}\n onClick={() => downloadTraceJson(traceId)}\n >\n {isDownloadingTrace ? <Loader2Icon className=\"animate-spin\" /> : <DownloadIcon />}\n </Button>\n );\n\n return (\n <DataPanel collapsed={collapsed}>\n <DataPanel.Header>\n {isOnTracePage ? (\n <>\n <DataPanel.Heading>Trace Timeline</DataPanel.Heading>\n <ButtonsGroup className=\"ml-auto shrink-0\">{downloadTraceButton}</ButtonsGroup>\n </>\n ) : (\n <>\n <DataPanel.Heading>\n Trace <b># {truncateString(traceId, 12)}</b>\n </DataPanel.Heading>\n <ButtonsGroup className=\"ml-auto shrink-0\">\n {onCollapsedChange && (\n <Button\n size=\"md\"\n tooltip={collapsed ? 'Expand panel' : 'Collapse panel'}\n onClick={() => setCollapsed(!collapsed)}\n >\n {collapsed ? <ChevronsUpDownIcon /> : <ChevronsDownUpIcon />}\n </Button>\n )}\n {(onPrevious || onNext) && (\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Previous trace\"\n nextLabel=\"Next trace\"\n />\n )}\n {showOpenTracePageLink && (\n <Button\n as={LinkComponent}\n href={traceHref}\n size=\"md\"\n tooltip=\"Open trace page\"\n aria-label=\"Open trace page\"\n >\n <Link2Icon />\n </Button>\n )}\n {downloadTraceButton}\n <DataPanel.CloseButton onClick={onClose} />\n </ButtonsGroup>\n </>\n )}\n </DataPanel.Header>\n\n {!collapsed &&\n (isLoading ? (\n <DataPanel.LoadingData>Loading trace...</DataPanel.LoadingData>\n ) : hierarchicalSpans.length === 0 ? (\n <DataPanel.NoData>No spans found for this trace.</DataPanel.NoData>\n ) : (\n <DataPanel.Content ref={contentRef}>\n {!isOnTracePage && rootSpan && <TraceKeysAndValues rootSpan={rootSpan} className=\"mb-6\" />}\n\n {!isOnTracePage && (onEvaluateTrace || onSaveAsDatasetItem || onAddTraceMocksToItem) && (\n <div className=\"mb-6 flex flex-wrap items-center justify-between gap-4\">\n {onEvaluateTrace && (\n <Button size=\"sm\" onClick={onEvaluateTrace}>\n <Icon>\n <CircleGaugeIcon />\n </Icon>\n Evaluate Trace\n </Button>\n )}\n {onSaveAsDatasetItem && (\n <Button size=\"sm\" onClick={() => onSaveAsDatasetItem({ traceId, rootSpanId: rootSpan?.spanId })}>\n <Icon>\n <SaveIcon />\n </Icon>\n Save as Dataset Item\n </Button>\n )}\n {onAddTraceMocksToItem && (\n <Button size=\"sm\" onClick={() => onAddTraceMocksToItem({ traceId })}>\n <Icon>\n <WrenchIcon />\n </Icon>\n Add tool mocks to item\n </Button>\n )}\n </div>\n )}\n\n {!isOnTracePage &&\n !onEvaluateTrace &&\n !onSaveAsDatasetItem &&\n !onAddTraceMocksToItem &&\n showUnavailableFeaturesMsg && (\n <Notice variant=\"info\" className=\"mb-6\">\n <Notice.Message>\n Evaluating traces and saving them as dataset items is available in Mastra Studio (local or\n deployed).\n </Notice.Message>\n </Notice>\n )}\n\n <TraceTimeline\n hierarchicalSpans={hierarchicalSpans}\n onSpanClick={handleSpanClick}\n selectedSpanId={selectedSpanId}\n expandedSpanIds={expandedSpanIds}\n setExpandedSpanIds={setExpandedSpanIds}\n chartWidth={timelineChartWidth}\n />\n </DataPanel.Content>\n ))}\n </DataPanel>\n );\n}\n"],"names":["useState","useDownloadTraceJson","useRef","useEffect","useMemo","formatHierarchicalSpans","getAllSpanIds","jsx","Button","Loader2Icon","DownloadIcon","jsxs","DataPanel","Fragment","ButtonsGroup","truncateString","ChevronsUpDownIcon","ChevronsDownUpIcon","Link2Icon","TraceKeysAndValues","Icon","CircleGaugeIcon","SaveIcon","WrenchIcon","Notice","TraceTimeline"],"mappings":"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"}
@@ -47,7 +47,7 @@ function TraceDataPanelView({
47
47
  onSpanSelect?.(void 0);
48
48
  return;
49
49
  }
50
- if (!spans) return;
50
+ if (isLoading || !spans) return;
51
51
  const found = spans.find((s) => s.spanId === initialSpanId);
52
52
  if (found) {
53
53
  setSelectedSpanId(initialSpanId);
@@ -56,12 +56,12 @@ function TraceDataPanelView({
56
56
  setSelectedSpanId(void 0);
57
57
  onSpanSelect?.(void 0);
58
58
  }
59
- }, [initialSpanId, spans]);
59
+ }, [initialSpanId, spans, isLoading]);
60
60
  useEffect(() => {
61
- if (!selectedSpanId || !contentRef.current) return;
61
+ if (isLoading || !selectedSpanId || !contentRef.current) return;
62
62
  const el = contentRef.current.querySelector(`[data-span-id="${selectedSpanId}"]`);
63
63
  el?.scrollIntoView({ block: "nearest" });
64
- }, [selectedSpanId]);
64
+ }, [selectedSpanId, isLoading]);
65
65
  const hierarchicalSpans = useMemo(() => formatHierarchicalSpans(spans ?? [], anchorSpanId), [spans, anchorSpanId]);
66
66
  const [expandedSpanIds, setExpandedSpanIds] = useState([]);
67
67
  useEffect(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"trace-data-panel-view.es.js","sources":["../../../../src/domains/traces/components/trace-data-panel-view.tsx"],"sourcesContent":["import type { LightSpanRecord } from '@mastra/core/storage';\nimport {\n CircleGaugeIcon,\n ChevronsDownUpIcon,\n ChevronsUpDownIcon,\n DownloadIcon,\n Link2Icon,\n Loader2Icon,\n SaveIcon,\n WrenchIcon,\n} from 'lucide-react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { getAllSpanIds } from '../hooks/get-all-span-ids';\nimport { useDownloadTraceJson } from '../hooks/use-download-trace-json';\nimport { formatHierarchicalSpans } from './format-hierarchical-spans';\nimport { TraceKeysAndValues } from './trace-keys-and-values';\nimport { TraceTimeline } from './trace-timeline';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport { Notice } from '@/ds/components/Notice';\nimport { Icon } from '@/ds/icons/Icon';\nimport type { LinkComponent } from '@/ds/types/link-component';\nimport { truncateString } from '@/lib/truncate-string';\n\nexport type TraceDataPanelPlacement = 'traces-list' | 'trace-page';\n\nexport interface TraceDataPanelViewProps {\n traceId: string;\n /** Lightweight spans for the trace. Caller fetches via useTraceLightSpans. */\n spans: LightSpanRecord[] | undefined;\n isLoading?: boolean;\n onClose: () => void;\n onSpanSelect?: (spanId: string | undefined) => void;\n onEvaluateTrace?: () => void;\n /** When set, a \"Save as Dataset Item\" button appears; the consumer owns the dialog. */\n onSaveAsDatasetItem?: (args: { traceId: string; rootSpanId: string | undefined }) => void;\n /** When set, an \"Add tool mocks to item\" button appears; the consumer owns the dialog. */\n onAddTraceMocksToItem?: (args: { traceId: string }) => void;\n initialSpanId?: string | null;\n onPrevious?: () => void;\n onNext?: () => void;\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n placement: TraceDataPanelPlacement;\n timelineChartWidth?: 'wide' | 'default';\n /** When both are provided, renders an \"Open trace page\" button. */\n LinkComponent?: LinkComponent;\n traceHref?: string;\n /**\n * Span treated as the displayed root of the timeline. Required for branch\n * subtrees from `getBranch` where the anchor has a real parent that's outside\n * `spans`. When omitted, the span with no parent is used (trace case).\n */\n anchorSpanId?: string;\n /**\n * Whether to render the \"Evaluating traces and saving them as dataset items is\n * available in Mastra Studio\" info notice when neither `onEvaluateTrace` nor\n * `onSaveAsDatasetItem` is provided. Defaults to `true`. Pass `false` when this\n * panel is rendered inside Studio in a context that intentionally omits those\n * handlers (e.g. inline below an experiment result).\n */\n showUnavailableFeaturesMsg?: boolean;\n}\n\nexport function TraceDataPanelView({\n traceId,\n spans,\n isLoading,\n onClose,\n onSpanSelect,\n onEvaluateTrace,\n onSaveAsDatasetItem,\n onAddTraceMocksToItem,\n initialSpanId,\n onPrevious,\n onNext,\n collapsed: controlledCollapsed,\n onCollapsedChange,\n placement,\n timelineChartWidth = 'default',\n LinkComponent,\n traceHref,\n anchorSpanId,\n showUnavailableFeaturesMsg = true,\n}: TraceDataPanelViewProps) {\n const isOnTracePage = placement === 'trace-page';\n const [internalCollapsed, setInternalCollapsed] = useState(false);\n const collapsed = controlledCollapsed ?? internalCollapsed;\n const setCollapsed = onCollapsedChange ?? setInternalCollapsed;\n\n const { download: downloadTraceJson, isPending: isDownloadingTrace } = useDownloadTraceJson();\n\n const contentRef = useRef<HTMLDivElement>(null);\n const [selectedSpanId, setSelectedSpanId] = useState<string | undefined>(initialSpanId ?? undefined);\n\n // Sync selected span when initialSpanId or trace data changes\n useEffect(() => {\n // No span requested: clear immediately.\n if (!initialSpanId) {\n setSelectedSpanId(undefined);\n onSpanSelect?.(undefined);\n return;\n }\n // Span requested: wait for trace data before deciding so an in-flight\n // fetch doesn't wipe a URL-provided selection.\n if (!spans) return;\n\n const found = spans.find(s => s.spanId === initialSpanId);\n if (found) {\n setSelectedSpanId(initialSpanId);\n onSpanSelect?.(initialSpanId);\n } else {\n setSelectedSpanId(undefined);\n onSpanSelect?.(undefined);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialSpanId, spans]);\n\n // Scroll the selected span into view within the timeline\n useEffect(() => {\n if (!selectedSpanId || !contentRef.current) return;\n const el = contentRef.current.querySelector(`[data-span-id=\"${selectedSpanId}\"]`);\n el?.scrollIntoView({ block: 'nearest' });\n }, [selectedSpanId]);\n\n const hierarchicalSpans = useMemo(() => formatHierarchicalSpans(spans ?? [], anchorSpanId), [spans, anchorSpanId]);\n\n const [expandedSpanIds, setExpandedSpanIds] = useState<string[]>([]);\n\n useEffect(() => {\n if (hierarchicalSpans.length > 0) {\n setExpandedSpanIds(getAllSpanIds(hierarchicalSpans));\n }\n }, [hierarchicalSpans]);\n\n const rootSpan = useMemo(\n () => (anchorSpanId ? spans?.find(s => s.spanId === anchorSpanId) : spans?.find(s => s.parentSpanId == null)),\n [spans, anchorSpanId],\n );\n\n const handleSpanClick = (id: string) => {\n const newId = selectedSpanId === id ? undefined : id;\n setSelectedSpanId(newId);\n onSpanSelect?.(newId);\n };\n\n const showOpenTracePageLink = !isOnTracePage && LinkComponent && traceHref;\n\n // Shared across both header layouts (list side panel and full trace page) so a trace can be\n // downloaded from wherever it's being inspected.\n const downloadTraceButton = (\n <Button\n size=\"md\"\n tooltip=\"Download trace JSON\"\n aria-label=\"Download trace JSON\"\n disabled={isDownloadingTrace}\n onClick={() => downloadTraceJson(traceId)}\n >\n {isDownloadingTrace ? <Loader2Icon className=\"animate-spin\" /> : <DownloadIcon />}\n </Button>\n );\n\n return (\n <DataPanel collapsed={collapsed}>\n <DataPanel.Header>\n {isOnTracePage ? (\n <>\n <DataPanel.Heading>Trace Timeline</DataPanel.Heading>\n <ButtonsGroup className=\"ml-auto shrink-0\">{downloadTraceButton}</ButtonsGroup>\n </>\n ) : (\n <>\n <DataPanel.Heading>\n Trace <b># {truncateString(traceId, 12)}</b>\n </DataPanel.Heading>\n <ButtonsGroup className=\"ml-auto shrink-0\">\n {onCollapsedChange && (\n <Button\n size=\"md\"\n tooltip={collapsed ? 'Expand panel' : 'Collapse panel'}\n onClick={() => setCollapsed(!collapsed)}\n >\n {collapsed ? <ChevronsUpDownIcon /> : <ChevronsDownUpIcon />}\n </Button>\n )}\n {(onPrevious || onNext) && (\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Previous trace\"\n nextLabel=\"Next trace\"\n />\n )}\n {showOpenTracePageLink && (\n <Button\n as={LinkComponent}\n href={traceHref}\n size=\"md\"\n tooltip=\"Open trace page\"\n aria-label=\"Open trace page\"\n >\n <Link2Icon />\n </Button>\n )}\n {downloadTraceButton}\n <DataPanel.CloseButton onClick={onClose} />\n </ButtonsGroup>\n </>\n )}\n </DataPanel.Header>\n\n {!collapsed &&\n (isLoading ? (\n <DataPanel.LoadingData>Loading trace...</DataPanel.LoadingData>\n ) : hierarchicalSpans.length === 0 ? (\n <DataPanel.NoData>No spans found for this trace.</DataPanel.NoData>\n ) : (\n <DataPanel.Content ref={contentRef}>\n {!isOnTracePage && rootSpan && <TraceKeysAndValues rootSpan={rootSpan} className=\"mb-6\" />}\n\n {!isOnTracePage && (onEvaluateTrace || onSaveAsDatasetItem || onAddTraceMocksToItem) && (\n <div className=\"mb-6 flex flex-wrap items-center justify-between gap-4\">\n {onEvaluateTrace && (\n <Button size=\"sm\" onClick={onEvaluateTrace}>\n <Icon>\n <CircleGaugeIcon />\n </Icon>\n Evaluate Trace\n </Button>\n )}\n {onSaveAsDatasetItem && (\n <Button size=\"sm\" onClick={() => onSaveAsDatasetItem({ traceId, rootSpanId: rootSpan?.spanId })}>\n <Icon>\n <SaveIcon />\n </Icon>\n Save as Dataset Item\n </Button>\n )}\n {onAddTraceMocksToItem && (\n <Button size=\"sm\" onClick={() => onAddTraceMocksToItem({ traceId })}>\n <Icon>\n <WrenchIcon />\n </Icon>\n Add tool mocks to item\n </Button>\n )}\n </div>\n )}\n\n {!isOnTracePage &&\n !onEvaluateTrace &&\n !onSaveAsDatasetItem &&\n !onAddTraceMocksToItem &&\n showUnavailableFeaturesMsg && (\n <Notice variant=\"info\" className=\"mb-6\">\n <Notice.Message>\n Evaluating traces and saving them as dataset items is available in Mastra Studio (local or\n deployed).\n </Notice.Message>\n </Notice>\n )}\n\n <TraceTimeline\n hierarchicalSpans={hierarchicalSpans}\n onSpanClick={handleSpanClick}\n selectedSpanId={selectedSpanId}\n expandedSpanIds={expandedSpanIds}\n setExpandedSpanIds={setExpandedSpanIds}\n chartWidth={timelineChartWidth}\n />\n </DataPanel.Content>\n ))}\n </DataPanel>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trace-data-panel-view.es.js","sources":["../../../../src/domains/traces/components/trace-data-panel-view.tsx"],"sourcesContent":["import type { LightSpanRecord } from '@mastra/core/storage';\nimport {\n CircleGaugeIcon,\n ChevronsDownUpIcon,\n ChevronsUpDownIcon,\n DownloadIcon,\n Link2Icon,\n Loader2Icon,\n SaveIcon,\n WrenchIcon,\n} from 'lucide-react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { getAllSpanIds } from '../hooks/get-all-span-ids';\nimport { useDownloadTraceJson } from '../hooks/use-download-trace-json';\nimport { formatHierarchicalSpans } from './format-hierarchical-spans';\nimport { TraceKeysAndValues } from './trace-keys-and-values';\nimport { TraceTimeline } from './trace-timeline';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport { Notice } from '@/ds/components/Notice';\nimport { Icon } from '@/ds/icons/Icon';\nimport type { LinkComponent } from '@/ds/types/link-component';\nimport { truncateString } from '@/lib/truncate-string';\n\nexport type TraceDataPanelPlacement = 'traces-list' | 'trace-page';\n\nexport interface TraceDataPanelViewProps {\n traceId: string;\n /** Lightweight spans for the trace. Caller fetches via useTraceLightSpans. */\n spans: LightSpanRecord[] | undefined;\n isLoading?: boolean;\n onClose: () => void;\n onSpanSelect?: (spanId: string | undefined) => void;\n onEvaluateTrace?: () => void;\n /** When set, a \"Save as Dataset Item\" button appears; the consumer owns the dialog. */\n onSaveAsDatasetItem?: (args: { traceId: string; rootSpanId: string | undefined }) => void;\n /** When set, an \"Add tool mocks to item\" button appears; the consumer owns the dialog. */\n onAddTraceMocksToItem?: (args: { traceId: string }) => void;\n initialSpanId?: string | null;\n onPrevious?: () => void;\n onNext?: () => void;\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n placement: TraceDataPanelPlacement;\n timelineChartWidth?: 'wide' | 'default';\n /** When both are provided, renders an \"Open trace page\" button. */\n LinkComponent?: LinkComponent;\n traceHref?: string;\n /**\n * Span treated as the displayed root of the timeline. Required for branch\n * subtrees from `getBranch` where the anchor has a real parent that's outside\n * `spans`. When omitted, the span with no parent is used (trace case).\n */\n anchorSpanId?: string;\n /**\n * Whether to render the \"Evaluating traces and saving them as dataset items is\n * available in Mastra Studio\" info notice when neither `onEvaluateTrace` nor\n * `onSaveAsDatasetItem` is provided. Defaults to `true`. Pass `false` when this\n * panel is rendered inside Studio in a context that intentionally omits those\n * handlers (e.g. inline below an experiment result).\n */\n showUnavailableFeaturesMsg?: boolean;\n}\n\nexport function TraceDataPanelView({\n traceId,\n spans,\n isLoading,\n onClose,\n onSpanSelect,\n onEvaluateTrace,\n onSaveAsDatasetItem,\n onAddTraceMocksToItem,\n initialSpanId,\n onPrevious,\n onNext,\n collapsed: controlledCollapsed,\n onCollapsedChange,\n placement,\n timelineChartWidth = 'default',\n LinkComponent,\n traceHref,\n anchorSpanId,\n showUnavailableFeaturesMsg = true,\n}: TraceDataPanelViewProps) {\n const isOnTracePage = placement === 'trace-page';\n const [internalCollapsed, setInternalCollapsed] = useState(false);\n const collapsed = controlledCollapsed ?? internalCollapsed;\n const setCollapsed = onCollapsedChange ?? setInternalCollapsed;\n\n const { download: downloadTraceJson, isPending: isDownloadingTrace } = useDownloadTraceJson();\n\n const contentRef = useRef<HTMLDivElement>(null);\n const [selectedSpanId, setSelectedSpanId] = useState<string | undefined>(initialSpanId ?? undefined);\n\n // Sync selected span when initialSpanId or trace data changes\n useEffect(() => {\n // No span requested: clear immediately.\n if (!initialSpanId) {\n setSelectedSpanId(undefined);\n onSpanSelect?.(undefined);\n return;\n }\n // Span requested: wait for trace data before deciding so an in-flight\n // fetch doesn't wipe a URL-provided selection. Callers that default their\n // spans to `[]` while loading only say so through `isLoading`.\n if (isLoading || !spans) return;\n\n const found = spans.find(s => s.spanId === initialSpanId);\n if (found) {\n setSelectedSpanId(initialSpanId);\n onSpanSelect?.(initialSpanId);\n } else {\n setSelectedSpanId(undefined);\n onSpanSelect?.(undefined);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialSpanId, spans, isLoading]);\n\n // Scroll the selected span into view within the timeline, which only exists\n // once the trace has loaded.\n useEffect(() => {\n if (isLoading || !selectedSpanId || !contentRef.current) return;\n const el = contentRef.current.querySelector(`[data-span-id=\"${selectedSpanId}\"]`);\n el?.scrollIntoView({ block: 'nearest' });\n }, [selectedSpanId, isLoading]);\n\n const hierarchicalSpans = useMemo(() => formatHierarchicalSpans(spans ?? [], anchorSpanId), [spans, anchorSpanId]);\n\n const [expandedSpanIds, setExpandedSpanIds] = useState<string[]>([]);\n\n useEffect(() => {\n if (hierarchicalSpans.length > 0) {\n setExpandedSpanIds(getAllSpanIds(hierarchicalSpans));\n }\n }, [hierarchicalSpans]);\n\n const rootSpan = useMemo(\n () => (anchorSpanId ? spans?.find(s => s.spanId === anchorSpanId) : spans?.find(s => s.parentSpanId == null)),\n [spans, anchorSpanId],\n );\n\n const handleSpanClick = (id: string) => {\n const newId = selectedSpanId === id ? undefined : id;\n setSelectedSpanId(newId);\n onSpanSelect?.(newId);\n };\n\n const showOpenTracePageLink = !isOnTracePage && LinkComponent && traceHref;\n\n // Shared across both header layouts (list side panel and full trace page) so a trace can be\n // downloaded from wherever it's being inspected.\n const downloadTraceButton = (\n <Button\n size=\"md\"\n tooltip=\"Download trace JSON\"\n aria-label=\"Download trace JSON\"\n disabled={isDownloadingTrace}\n onClick={() => downloadTraceJson(traceId)}\n >\n {isDownloadingTrace ? <Loader2Icon className=\"animate-spin\" /> : <DownloadIcon />}\n </Button>\n );\n\n return (\n <DataPanel collapsed={collapsed}>\n <DataPanel.Header>\n {isOnTracePage ? (\n <>\n <DataPanel.Heading>Trace Timeline</DataPanel.Heading>\n <ButtonsGroup className=\"ml-auto shrink-0\">{downloadTraceButton}</ButtonsGroup>\n </>\n ) : (\n <>\n <DataPanel.Heading>\n Trace <b># {truncateString(traceId, 12)}</b>\n </DataPanel.Heading>\n <ButtonsGroup className=\"ml-auto shrink-0\">\n {onCollapsedChange && (\n <Button\n size=\"md\"\n tooltip={collapsed ? 'Expand panel' : 'Collapse panel'}\n onClick={() => setCollapsed(!collapsed)}\n >\n {collapsed ? <ChevronsUpDownIcon /> : <ChevronsDownUpIcon />}\n </Button>\n )}\n {(onPrevious || onNext) && (\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Previous trace\"\n nextLabel=\"Next trace\"\n />\n )}\n {showOpenTracePageLink && (\n <Button\n as={LinkComponent}\n href={traceHref}\n size=\"md\"\n tooltip=\"Open trace page\"\n aria-label=\"Open trace page\"\n >\n <Link2Icon />\n </Button>\n )}\n {downloadTraceButton}\n <DataPanel.CloseButton onClick={onClose} />\n </ButtonsGroup>\n </>\n )}\n </DataPanel.Header>\n\n {!collapsed &&\n (isLoading ? (\n <DataPanel.LoadingData>Loading trace...</DataPanel.LoadingData>\n ) : hierarchicalSpans.length === 0 ? (\n <DataPanel.NoData>No spans found for this trace.</DataPanel.NoData>\n ) : (\n <DataPanel.Content ref={contentRef}>\n {!isOnTracePage && rootSpan && <TraceKeysAndValues rootSpan={rootSpan} className=\"mb-6\" />}\n\n {!isOnTracePage && (onEvaluateTrace || onSaveAsDatasetItem || onAddTraceMocksToItem) && (\n <div className=\"mb-6 flex flex-wrap items-center justify-between gap-4\">\n {onEvaluateTrace && (\n <Button size=\"sm\" onClick={onEvaluateTrace}>\n <Icon>\n <CircleGaugeIcon />\n </Icon>\n Evaluate Trace\n </Button>\n )}\n {onSaveAsDatasetItem && (\n <Button size=\"sm\" onClick={() => onSaveAsDatasetItem({ traceId, rootSpanId: rootSpan?.spanId })}>\n <Icon>\n <SaveIcon />\n </Icon>\n Save as Dataset Item\n </Button>\n )}\n {onAddTraceMocksToItem && (\n <Button size=\"sm\" onClick={() => onAddTraceMocksToItem({ traceId })}>\n <Icon>\n <WrenchIcon />\n </Icon>\n Add tool mocks to item\n </Button>\n )}\n </div>\n )}\n\n {!isOnTracePage &&\n !onEvaluateTrace &&\n !onSaveAsDatasetItem &&\n !onAddTraceMocksToItem &&\n showUnavailableFeaturesMsg && (\n <Notice variant=\"info\" className=\"mb-6\">\n <Notice.Message>\n Evaluating traces and saving them as dataset items is available in Mastra Studio (local or\n deployed).\n </Notice.Message>\n </Notice>\n )}\n\n <TraceTimeline\n hierarchicalSpans={hierarchicalSpans}\n onSpanClick={handleSpanClick}\n selectedSpanId={selectedSpanId}\n expandedSpanIds={expandedSpanIds}\n setExpandedSpanIds={setExpandedSpanIds}\n chartWidth={timelineChartWidth}\n />\n </DataPanel.Content>\n ))}\n </DataPanel>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -8,9 +8,9 @@ const React = require('react');
8
8
  const domains_traces_traceListColumns = require('../trace-list-columns.cjs.js');
9
9
  const domains_traces_utils_spanUtils = require('../utils/span-utils.cjs.js');
10
10
  const domains_metrics_components_metricsUtils = require('../../metrics/components/metrics-utils.cjs.js');
11
- const dataList = require('../../../data-list-B3P5IlxV.cjs');
12
- const dataListSkeleton = require('../../../data-list-skeleton-ClGPuUja.cjs');
13
- const tracesDataList = require('../../../traces-data-list-D3TOjHkm.cjs');
11
+ const dataList = require('../../../data-list-Cb-piK4z.cjs');
12
+ const dataListSkeleton = require('../../../data-list-skeleton--tiF5mjH.cjs');
13
+ const tracesDataList = require('../../../traces-data-list-vsvvvEiP.cjs');
14
14
  const utils_cn = require('../../../cn-vA5sWo9W.cjs');
15
15
 
16
16
  const ROW_HEIGHT = 36;
@@ -4,9 +4,9 @@ import { useRef, useEffect } from 'react';
4
4
  import { buildTraceListColumns, hasTraceColumn, DEFAULT_TRACE_COLUMN_PREFERENCES, formatTraceMetadataValue } from '../trace-list-columns.es.js';
5
5
  import { getInputPreview, formatSpanDuration } from '../utils/span-utils.es.js';
6
6
  import { formatCompact, formatCost } from '../../metrics/components/metrics-utils.es.js';
7
- import { D as DataList } from '../../../data-list-CZC8N3I4.js';
8
- import { D as DataListSkeleton } from '../../../data-list-skeleton-BDQEjCWH.js';
9
- import { T as TracesDataList } from '../../../traces-data-list-a3sYTxch.js';
7
+ import { D as DataList } from '../../../data-list-CnQRIUyN.js';
8
+ import { D as DataListSkeleton } from '../../../data-list-skeleton-DeEqsrIz.js';
9
+ import { T as TracesDataList } from '../../../traces-data-list-DtuaCDES.js';
10
10
  import { c as cn } from '../../../cn-BakJzhuv.js';
11
11
 
12
12
  const ROW_HEIGHT = 36;
@@ -221,7 +221,7 @@ const SignalsEmptyState = ({
221
221
  ]
222
222
  }
223
223
  ),
224
- /* @__PURE__ */ jsxRuntime.jsx(Button.Button, { as: LinkComponent, href: "/observability", variant: "primary", size: "sm", children: "View incoming traces" })
224
+ /* @__PURE__ */ jsxRuntime.jsx(Button.Button, { as: LinkComponent, href: "/traces", variant: "primary", size: "sm", children: "View incoming traces" })
225
225
  ] })
226
226
  ] })
227
227
  ] }) });
@@ -1 +1 @@
1
- {"version":3,"file":"signals-empty-state.cjs.js","sources":["../../../../src/ee/signals/components/signals-empty-state.tsx"],"sourcesContent":["import type { TraceSignalName } from '@mastra/client-js';\nimport { CpuIcon } from 'lucide-react';\nimport type { CSSProperties, ReactNode } from 'react';\n\nimport './signals-empty-state.css';\nimport { Button } from '../../../ds/components/Button';\nimport { Card } from '../../../ds/components/Card';\nimport { nodeColor } from '../../../ds/components/SankeyChart/sankeyColor';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport { getSignalHue } from '../signal-colors';\n\ntype SignalDefinition = {\n key: TraceSignalName;\n label: string;\n description: string;\n};\n\nconst signalDefinitions: SignalDefinition[] = [\n { key: 'goal', label: 'Goal', description: 'What the user is trying to achieve.' },\n { key: 'outcome', label: 'Outcome', description: 'Whether the interaction was completed, unresolved, or blocked.' },\n {\n key: 'behavior',\n label: 'Behavior',\n description:\n 'The observable actions and patterns in the trace, including tool use, retries, failures, and recovery.',\n },\n { key: 'sentiment', label: 'Sentiment', description: \"The user's emotional state or attitude.\" },\n];\nconst signalLabels = signalDefinitions.map(signal => signal.label);\n\nconst traceRows = [\n ['chat.completion', '1.2s'],\n ['tool.search_docs', '340ms'],\n ['workflow.support', '2.8s'],\n];\n\nconst signalStyle = (label: string): CSSProperties => ({\n color: nodeColor(getSignalHue(label)),\n});\n\nconst PipelineConnector = () => (\n <div aria-hidden=\"true\" className=\"relative hidden h-full items-center lg:flex\">\n <div className=\"border-border1 w-full border-t border-dashed\" />\n <span className=\"signals-pipeline-connector bg-positive1 absolute left-1/2 size-2.5 -translate-x-1/2 rounded-full shadow-[0_0_12px_currentColor]\" />\n </div>\n);\n\nexport type TraceIntelligenceProgress = {\n status: 'collecting' | 'processing' | 'ready';\n traceCount: number;\n signals: Record<TraceSignalName, { generated: number; embedded: number }>;\n availableSignals: TraceSignalName[];\n};\n\nexport type SignalsEmptyStateProps = {\n actionSlot?: ReactNode;\n LinkComponent?: LinkComponent;\n progress?: TraceIntelligenceProgress;\n isRangeEmpty?: boolean;\n};\n\nfunction formatNumber(value: number) {\n return new Intl.NumberFormat('en-US').format(value);\n}\n\nfunction statusCopy(progress?: TraceIntelligenceProgress, isRangeEmpty?: boolean) {\n if (isRangeEmpty) {\n return {\n title: 'No Trace Intelligence themes in this date range.',\n body: 'Choose a wider snapshot date range, or wait for newly processed traces to form recurring themes.',\n };\n }\n if (!progress || progress.status === 'collecting') {\n return {\n title: 'Collecting traces for Trace Intelligence.',\n body: 'Trace Intelligence starts grouping recurring patterns after your deployed agents send enough completed traces.',\n };\n }\n if (progress.status === 'ready') {\n return {\n title: 'Trace Intelligence themes are ready.',\n body: 'Select at least two available trace signal types to see how goals, outcomes, behaviors, and sentiment connect.',\n };\n }\n return {\n title: 'Analyzing traces for Trace Intelligence.',\n body: 'Trace signals have started processing. Themes appear after enough generated and embedded trace signals form recurring patterns.',\n };\n}\n\nfunction ProgressSummary({ progress }: { progress: TraceIntelligenceProgress }) {\n return (\n <dl className=\"mt-4 grid gap-2 sm:grid-cols-3\">\n <div className=\"border-border1 bg-surface3 rounded-md border px-3 py-2\">\n <dt className=\"text-neutral3 text-xs\">Traces analyzed</dt>\n <dd className=\"text-neutral6 mt-1 text-lg font-semibold\">{formatNumber(progress.traceCount)}</dd>\n </div>\n <div className=\"border-border1 bg-surface3 rounded-md border px-3 py-2\">\n <dt className=\"text-neutral3 text-xs\">Trace signal types ready</dt>\n <dd className=\"text-neutral6 mt-1 text-lg font-semibold\">{progress.availableSignals.length} of 4</dd>\n </div>\n <div className=\"border-border1 bg-surface3 rounded-md border px-3 py-2\">\n <dt className=\"text-neutral3 text-xs\">Status</dt>\n <dd className=\"text-neutral6 mt-1 text-lg font-semibold capitalize\">{progress.status}</dd>\n </div>\n </dl>\n );\n}\n\nfunction SignalProgressList({ progress }: { progress?: TraceIntelligenceProgress }) {\n if (!progress) return null;\n\n return (\n <ul aria-label=\"Trace signal processing progress\" className=\"mt-3 grid gap-2 sm:grid-cols-2 lg:grid-cols-4\">\n {signalDefinitions.map(signal => {\n const value = progress.signals[signal.key];\n const isReady = progress.availableSignals.includes(signal.key);\n return (\n <li className=\"border-border1 bg-surface2 rounded-md border px-3 py-2\" key={signal.label}>\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-sm font-semibold\" style={signalStyle(signal.label)}>\n {signal.label}\n </span>\n <span className=\"text-neutral4 text-xs\">{isReady ? 'Themes ready' : 'Processing'}</span>\n </div>\n <p className=\"text-neutral3 mt-1 text-xs\">\n {formatNumber(value.generated)} generated · {formatNumber(value.embedded)} embedded\n </p>\n </li>\n );\n })}\n </ul>\n );\n}\n\nexport const SignalsEmptyState = ({\n actionSlot,\n LinkComponent = 'a',\n progress,\n isRangeEmpty,\n}: SignalsEmptyStateProps) => {\n const copy = statusCopy(progress, isRangeEmpty);\n\n return (\n <section className=\"bg-surface1 min-h-full w-full p-6 md:px-10 lg:px-12 xl:px-[4.375rem]\">\n <div className=\"mx-auto w-full max-w-260\">\n <header>\n <p className=\"text-neutral4 flex items-center gap-2 font-mono text-xs tracking-wider uppercase\">\n <span aria-hidden=\"true\" className=\"bg-accent1 size-2 rounded-full\" />\n Trace Intelligence\n </p>\n <h1 className=\"text-header-xl text-neutral6 mt-2 font-medium tracking-tight\">\n Understand what drives every agent interaction\n </h1>\n <p className=\"text-neutral3 mt-2 max-w-180 text-sm leading-5\">\n Trace Intelligence groups recurring goals, outcomes, behaviors, and sentiment across completed traces.\n </p>\n </header>\n\n <div\n role=\"list\"\n aria-label=\"Trace Intelligence analysis pipeline\"\n className=\"mt-14 grid gap-4 lg:grid-cols-[17.5rem_4.5rem_17.5rem_4.5rem_minmax(0,1fr)] lg:gap-0\"\n >\n <div role=\"listitem\" className=\"min-h-50 p-5\">\n <h2 className=\"text-neutral6 text-lg font-semibold\">Traces</h2>\n <p className=\"text-neutral3 mt-0.5 text-xs\">Every agent interaction</p>\n <p className=\"text-neutral3 mt-5 font-mono text-[0.6875rem] tracking-[0.18em] uppercase\">Input</p>\n <div className=\"mt-2.5 space-y-2\">\n {traceRows.map(([name, duration]) => (\n <div\n className=\"border-border1 bg-surface3 text-ui-xs flex items-center justify-between rounded border px-3 py-1.5 font-mono\"\n key={name}\n >\n <span className=\"text-neutral4\">{name}</span>\n <span className=\"text-neutral3\">{duration}</span>\n </div>\n ))}\n </div>\n </div>\n\n <PipelineConnector />\n\n <Card\n as=\"div\"\n role=\"listitem\"\n className=\"flex min-h-50 flex-col items-center p-5 text-center\"\n elevation=\"elevated\"\n >\n <h2 className=\"text-neutral6 text-lg font-semibold\">Trace Intelligence</h2>\n <p className=\"text-neutral3 mt-0.5 text-xs\">Finds recurring themes</p>\n <div aria-hidden=\"true\" className=\"relative mt-5 flex size-20 items-center justify-center\">\n <span className=\"signals-engine-pulse border-positive1/15 absolute size-20 rounded-full border\" />\n <span className=\"border-positive1/25 absolute size-14 rounded-full border\" />\n <span className=\"border-positive1/40 bg-positive1/5 absolute size-9 rounded-full border shadow-[0_0_24px_var(--color-positive1)]\" />\n <CpuIcon className=\"text-positive1 relative size-4\" />\n </div>\n <p className=\"text-ui-xs text-neutral3 mt-3 max-w-40 leading-4\">\n Clusters similar trace signals into themes for each dimension\n </p>\n </Card>\n\n <PipelineConnector />\n\n <div role=\"listitem\" className=\"min-h-50 p-5\">\n <h2 className=\"text-neutral6 text-lg font-semibold\">Theme analysis</h2>\n <p className=\"text-neutral3 mt-0.5 text-xs\">How recurring patterns connect</p>\n <p className=\"text-neutral3 mt-5 font-mono text-[0.6875rem] tracking-[0.18em] uppercase\">Output</p>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {signalLabels.map(label => (\n <span\n className=\"signals-chip bg-surface3 inline-flex items-center gap-2 rounded border border-current/25 px-2.5 py-1.5 text-xs font-medium shadow-[0_0_14px_color-mix(in_oklch,currentColor_12%,transparent)]\"\n key={label}\n style={signalStyle(label)}\n >\n <span aria-hidden=\"true\" className=\"size-1.5 rounded-full bg-current shadow-[0_0_7px_currentColor]\" />\n {label}\n </span>\n ))}\n </div>\n </div>\n </div>\n\n <section className=\"mt-10\" aria-labelledby=\"signal-definitions-heading\">\n <h2 id=\"signal-definitions-heading\" className=\"text-neutral6 text-lg font-semibold\">\n What each trace signal means\n </h2>\n <ul aria-label=\"Trace signal definitions\" className=\"mt-4 grid gap-3 sm:grid-cols-2\">\n {signalDefinitions.map(signal => (\n <li className=\"px-1 py-2\" key={signal.label}>\n <h3 className=\"text-sm font-semibold\" style={signalStyle(signal.label)}>\n {signal.label}\n </h3>\n <p className=\"text-neutral3 mt-1.5 text-xs leading-5\">{signal.description}</p>\n </li>\n ))}\n </ul>\n </section>\n\n <aside className=\"border-border1 bg-surface2 mt-9 rounded-md border px-5 py-4\">\n <div className=\"flex min-w-0 items-start gap-3\">\n <span\n aria-hidden=\"true\"\n className=\"bg-warning1 mt-1.5 size-2 shrink-0 rounded-full shadow-[0_0_9px_currentColor]\"\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-neutral3 text-xs leading-5\">\n <strong className=\"text-neutral5 font-semibold\">{copy.title}</strong> {copy.body}\n </p>\n {progress ? <ProgressSummary progress={progress} /> : null}\n <SignalProgressList progress={progress} />\n </div>\n </div>\n <div className=\"mt-4 flex shrink-0 flex-wrap items-center gap-2 sm:justify-end\">\n {actionSlot}\n <Button\n as=\"a\"\n href=\"https://mastra.ai/en/docs/mastra-platform/trace-intelligence\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n variant=\"outline\"\n size=\"sm\"\n >\n Read the docs<span className=\"sr-only\"> (opens in new tab)</span>\n </Button>\n <Button as={LinkComponent} href=\"/observability\" variant=\"primary\" size=\"sm\">\n View incoming traces\n </Button>\n </div>\n </aside>\n </div>\n </section>\n );\n};\n"],"names":["nodeColor","getSignalHue","jsxs","jsx","Card","CpuIcon","Button"],"mappings":"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"}
1
+ {"version":3,"file":"signals-empty-state.cjs.js","sources":["../../../../src/ee/signals/components/signals-empty-state.tsx"],"sourcesContent":["import type { TraceSignalName } from '@mastra/client-js';\nimport { CpuIcon } from 'lucide-react';\nimport type { CSSProperties, ReactNode } from 'react';\n\nimport './signals-empty-state.css';\nimport { Button } from '../../../ds/components/Button';\nimport { Card } from '../../../ds/components/Card';\nimport { nodeColor } from '../../../ds/components/SankeyChart/sankeyColor';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport { getSignalHue } from '../signal-colors';\n\ntype SignalDefinition = {\n key: TraceSignalName;\n label: string;\n description: string;\n};\n\nconst signalDefinitions: SignalDefinition[] = [\n { key: 'goal', label: 'Goal', description: 'What the user is trying to achieve.' },\n { key: 'outcome', label: 'Outcome', description: 'Whether the interaction was completed, unresolved, or blocked.' },\n {\n key: 'behavior',\n label: 'Behavior',\n description:\n 'The observable actions and patterns in the trace, including tool use, retries, failures, and recovery.',\n },\n { key: 'sentiment', label: 'Sentiment', description: \"The user's emotional state or attitude.\" },\n];\nconst signalLabels = signalDefinitions.map(signal => signal.label);\n\nconst traceRows = [\n ['chat.completion', '1.2s'],\n ['tool.search_docs', '340ms'],\n ['workflow.support', '2.8s'],\n];\n\nconst signalStyle = (label: string): CSSProperties => ({\n color: nodeColor(getSignalHue(label)),\n});\n\nconst PipelineConnector = () => (\n <div aria-hidden=\"true\" className=\"relative hidden h-full items-center lg:flex\">\n <div className=\"border-border1 w-full border-t border-dashed\" />\n <span className=\"signals-pipeline-connector bg-positive1 absolute left-1/2 size-2.5 -translate-x-1/2 rounded-full shadow-[0_0_12px_currentColor]\" />\n </div>\n);\n\nexport type TraceIntelligenceProgress = {\n status: 'collecting' | 'processing' | 'ready';\n traceCount: number;\n signals: Record<TraceSignalName, { generated: number; embedded: number }>;\n availableSignals: TraceSignalName[];\n};\n\nexport type SignalsEmptyStateProps = {\n actionSlot?: ReactNode;\n LinkComponent?: LinkComponent;\n progress?: TraceIntelligenceProgress;\n isRangeEmpty?: boolean;\n};\n\nfunction formatNumber(value: number) {\n return new Intl.NumberFormat('en-US').format(value);\n}\n\nfunction statusCopy(progress?: TraceIntelligenceProgress, isRangeEmpty?: boolean) {\n if (isRangeEmpty) {\n return {\n title: 'No Trace Intelligence themes in this date range.',\n body: 'Choose a wider snapshot date range, or wait for newly processed traces to form recurring themes.',\n };\n }\n if (!progress || progress.status === 'collecting') {\n return {\n title: 'Collecting traces for Trace Intelligence.',\n body: 'Trace Intelligence starts grouping recurring patterns after your deployed agents send enough completed traces.',\n };\n }\n if (progress.status === 'ready') {\n return {\n title: 'Trace Intelligence themes are ready.',\n body: 'Select at least two available trace signal types to see how goals, outcomes, behaviors, and sentiment connect.',\n };\n }\n return {\n title: 'Analyzing traces for Trace Intelligence.',\n body: 'Trace signals have started processing. Themes appear after enough generated and embedded trace signals form recurring patterns.',\n };\n}\n\nfunction ProgressSummary({ progress }: { progress: TraceIntelligenceProgress }) {\n return (\n <dl className=\"mt-4 grid gap-2 sm:grid-cols-3\">\n <div className=\"border-border1 bg-surface3 rounded-md border px-3 py-2\">\n <dt className=\"text-neutral3 text-xs\">Traces analyzed</dt>\n <dd className=\"text-neutral6 mt-1 text-lg font-semibold\">{formatNumber(progress.traceCount)}</dd>\n </div>\n <div className=\"border-border1 bg-surface3 rounded-md border px-3 py-2\">\n <dt className=\"text-neutral3 text-xs\">Trace signal types ready</dt>\n <dd className=\"text-neutral6 mt-1 text-lg font-semibold\">{progress.availableSignals.length} of 4</dd>\n </div>\n <div className=\"border-border1 bg-surface3 rounded-md border px-3 py-2\">\n <dt className=\"text-neutral3 text-xs\">Status</dt>\n <dd className=\"text-neutral6 mt-1 text-lg font-semibold capitalize\">{progress.status}</dd>\n </div>\n </dl>\n );\n}\n\nfunction SignalProgressList({ progress }: { progress?: TraceIntelligenceProgress }) {\n if (!progress) return null;\n\n return (\n <ul aria-label=\"Trace signal processing progress\" className=\"mt-3 grid gap-2 sm:grid-cols-2 lg:grid-cols-4\">\n {signalDefinitions.map(signal => {\n const value = progress.signals[signal.key];\n const isReady = progress.availableSignals.includes(signal.key);\n return (\n <li className=\"border-border1 bg-surface2 rounded-md border px-3 py-2\" key={signal.label}>\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-sm font-semibold\" style={signalStyle(signal.label)}>\n {signal.label}\n </span>\n <span className=\"text-neutral4 text-xs\">{isReady ? 'Themes ready' : 'Processing'}</span>\n </div>\n <p className=\"text-neutral3 mt-1 text-xs\">\n {formatNumber(value.generated)} generated · {formatNumber(value.embedded)} embedded\n </p>\n </li>\n );\n })}\n </ul>\n );\n}\n\nexport const SignalsEmptyState = ({\n actionSlot,\n LinkComponent = 'a',\n progress,\n isRangeEmpty,\n}: SignalsEmptyStateProps) => {\n const copy = statusCopy(progress, isRangeEmpty);\n\n return (\n <section className=\"bg-surface1 min-h-full w-full p-6 md:px-10 lg:px-12 xl:px-[4.375rem]\">\n <div className=\"mx-auto w-full max-w-260\">\n <header>\n <p className=\"text-neutral4 flex items-center gap-2 font-mono text-xs tracking-wider uppercase\">\n <span aria-hidden=\"true\" className=\"bg-accent1 size-2 rounded-full\" />\n Trace Intelligence\n </p>\n <h1 className=\"text-header-xl text-neutral6 mt-2 font-medium tracking-tight\">\n Understand what drives every agent interaction\n </h1>\n <p className=\"text-neutral3 mt-2 max-w-180 text-sm leading-5\">\n Trace Intelligence groups recurring goals, outcomes, behaviors, and sentiment across completed traces.\n </p>\n </header>\n\n <div\n role=\"list\"\n aria-label=\"Trace Intelligence analysis pipeline\"\n className=\"mt-14 grid gap-4 lg:grid-cols-[17.5rem_4.5rem_17.5rem_4.5rem_minmax(0,1fr)] lg:gap-0\"\n >\n <div role=\"listitem\" className=\"min-h-50 p-5\">\n <h2 className=\"text-neutral6 text-lg font-semibold\">Traces</h2>\n <p className=\"text-neutral3 mt-0.5 text-xs\">Every agent interaction</p>\n <p className=\"text-neutral3 mt-5 font-mono text-[0.6875rem] tracking-[0.18em] uppercase\">Input</p>\n <div className=\"mt-2.5 space-y-2\">\n {traceRows.map(([name, duration]) => (\n <div\n className=\"border-border1 bg-surface3 text-ui-xs flex items-center justify-between rounded border px-3 py-1.5 font-mono\"\n key={name}\n >\n <span className=\"text-neutral4\">{name}</span>\n <span className=\"text-neutral3\">{duration}</span>\n </div>\n ))}\n </div>\n </div>\n\n <PipelineConnector />\n\n <Card\n as=\"div\"\n role=\"listitem\"\n className=\"flex min-h-50 flex-col items-center p-5 text-center\"\n elevation=\"elevated\"\n >\n <h2 className=\"text-neutral6 text-lg font-semibold\">Trace Intelligence</h2>\n <p className=\"text-neutral3 mt-0.5 text-xs\">Finds recurring themes</p>\n <div aria-hidden=\"true\" className=\"relative mt-5 flex size-20 items-center justify-center\">\n <span className=\"signals-engine-pulse border-positive1/15 absolute size-20 rounded-full border\" />\n <span className=\"border-positive1/25 absolute size-14 rounded-full border\" />\n <span className=\"border-positive1/40 bg-positive1/5 absolute size-9 rounded-full border shadow-[0_0_24px_var(--color-positive1)]\" />\n <CpuIcon className=\"text-positive1 relative size-4\" />\n </div>\n <p className=\"text-ui-xs text-neutral3 mt-3 max-w-40 leading-4\">\n Clusters similar trace signals into themes for each dimension\n </p>\n </Card>\n\n <PipelineConnector />\n\n <div role=\"listitem\" className=\"min-h-50 p-5\">\n <h2 className=\"text-neutral6 text-lg font-semibold\">Theme analysis</h2>\n <p className=\"text-neutral3 mt-0.5 text-xs\">How recurring patterns connect</p>\n <p className=\"text-neutral3 mt-5 font-mono text-[0.6875rem] tracking-[0.18em] uppercase\">Output</p>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {signalLabels.map(label => (\n <span\n className=\"signals-chip bg-surface3 inline-flex items-center gap-2 rounded border border-current/25 px-2.5 py-1.5 text-xs font-medium shadow-[0_0_14px_color-mix(in_oklch,currentColor_12%,transparent)]\"\n key={label}\n style={signalStyle(label)}\n >\n <span aria-hidden=\"true\" className=\"size-1.5 rounded-full bg-current shadow-[0_0_7px_currentColor]\" />\n {label}\n </span>\n ))}\n </div>\n </div>\n </div>\n\n <section className=\"mt-10\" aria-labelledby=\"signal-definitions-heading\">\n <h2 id=\"signal-definitions-heading\" className=\"text-neutral6 text-lg font-semibold\">\n What each trace signal means\n </h2>\n <ul aria-label=\"Trace signal definitions\" className=\"mt-4 grid gap-3 sm:grid-cols-2\">\n {signalDefinitions.map(signal => (\n <li className=\"px-1 py-2\" key={signal.label}>\n <h3 className=\"text-sm font-semibold\" style={signalStyle(signal.label)}>\n {signal.label}\n </h3>\n <p className=\"text-neutral3 mt-1.5 text-xs leading-5\">{signal.description}</p>\n </li>\n ))}\n </ul>\n </section>\n\n <aside className=\"border-border1 bg-surface2 mt-9 rounded-md border px-5 py-4\">\n <div className=\"flex min-w-0 items-start gap-3\">\n <span\n aria-hidden=\"true\"\n className=\"bg-warning1 mt-1.5 size-2 shrink-0 rounded-full shadow-[0_0_9px_currentColor]\"\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-neutral3 text-xs leading-5\">\n <strong className=\"text-neutral5 font-semibold\">{copy.title}</strong> {copy.body}\n </p>\n {progress ? <ProgressSummary progress={progress} /> : null}\n <SignalProgressList progress={progress} />\n </div>\n </div>\n <div className=\"mt-4 flex shrink-0 flex-wrap items-center gap-2 sm:justify-end\">\n {actionSlot}\n <Button\n as=\"a\"\n href=\"https://mastra.ai/en/docs/mastra-platform/trace-intelligence\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n variant=\"outline\"\n size=\"sm\"\n >\n Read the docs<span className=\"sr-only\"> (opens in new tab)</span>\n </Button>\n <Button as={LinkComponent} href=\"/traces\" variant=\"primary\" size=\"sm\">\n View incoming traces\n </Button>\n </div>\n </aside>\n </div>\n </section>\n );\n};\n"],"names":["nodeColor","getSignalHue","jsxs","jsx","Card","CpuIcon","Button"],"mappings":"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"}
@@ -217,7 +217,7 @@ const SignalsEmptyState = ({
217
217
  ]
218
218
  }
219
219
  ),
220
- /* @__PURE__ */ jsx(Button, { as: LinkComponent, href: "/observability", variant: "primary", size: "sm", children: "View incoming traces" })
220
+ /* @__PURE__ */ jsx(Button, { as: LinkComponent, href: "/traces", variant: "primary", size: "sm", children: "View incoming traces" })
221
221
  ] })
222
222
  ] })
223
223
  ] }) });
@@ -1 +1 @@
1
- {"version":3,"file":"signals-empty-state.es.js","sources":["../../../../src/ee/signals/components/signals-empty-state.tsx"],"sourcesContent":["import type { TraceSignalName } from '@mastra/client-js';\nimport { CpuIcon } from 'lucide-react';\nimport type { CSSProperties, ReactNode } from 'react';\n\nimport './signals-empty-state.css';\nimport { Button } from '../../../ds/components/Button';\nimport { Card } from '../../../ds/components/Card';\nimport { nodeColor } from '../../../ds/components/SankeyChart/sankeyColor';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport { getSignalHue } from '../signal-colors';\n\ntype SignalDefinition = {\n key: TraceSignalName;\n label: string;\n description: string;\n};\n\nconst signalDefinitions: SignalDefinition[] = [\n { key: 'goal', label: 'Goal', description: 'What the user is trying to achieve.' },\n { key: 'outcome', label: 'Outcome', description: 'Whether the interaction was completed, unresolved, or blocked.' },\n {\n key: 'behavior',\n label: 'Behavior',\n description:\n 'The observable actions and patterns in the trace, including tool use, retries, failures, and recovery.',\n },\n { key: 'sentiment', label: 'Sentiment', description: \"The user's emotional state or attitude.\" },\n];\nconst signalLabels = signalDefinitions.map(signal => signal.label);\n\nconst traceRows = [\n ['chat.completion', '1.2s'],\n ['tool.search_docs', '340ms'],\n ['workflow.support', '2.8s'],\n];\n\nconst signalStyle = (label: string): CSSProperties => ({\n color: nodeColor(getSignalHue(label)),\n});\n\nconst PipelineConnector = () => (\n <div aria-hidden=\"true\" className=\"relative hidden h-full items-center lg:flex\">\n <div className=\"border-border1 w-full border-t border-dashed\" />\n <span className=\"signals-pipeline-connector bg-positive1 absolute left-1/2 size-2.5 -translate-x-1/2 rounded-full shadow-[0_0_12px_currentColor]\" />\n </div>\n);\n\nexport type TraceIntelligenceProgress = {\n status: 'collecting' | 'processing' | 'ready';\n traceCount: number;\n signals: Record<TraceSignalName, { generated: number; embedded: number }>;\n availableSignals: TraceSignalName[];\n};\n\nexport type SignalsEmptyStateProps = {\n actionSlot?: ReactNode;\n LinkComponent?: LinkComponent;\n progress?: TraceIntelligenceProgress;\n isRangeEmpty?: boolean;\n};\n\nfunction formatNumber(value: number) {\n return new Intl.NumberFormat('en-US').format(value);\n}\n\nfunction statusCopy(progress?: TraceIntelligenceProgress, isRangeEmpty?: boolean) {\n if (isRangeEmpty) {\n return {\n title: 'No Trace Intelligence themes in this date range.',\n body: 'Choose a wider snapshot date range, or wait for newly processed traces to form recurring themes.',\n };\n }\n if (!progress || progress.status === 'collecting') {\n return {\n title: 'Collecting traces for Trace Intelligence.',\n body: 'Trace Intelligence starts grouping recurring patterns after your deployed agents send enough completed traces.',\n };\n }\n if (progress.status === 'ready') {\n return {\n title: 'Trace Intelligence themes are ready.',\n body: 'Select at least two available trace signal types to see how goals, outcomes, behaviors, and sentiment connect.',\n };\n }\n return {\n title: 'Analyzing traces for Trace Intelligence.',\n body: 'Trace signals have started processing. Themes appear after enough generated and embedded trace signals form recurring patterns.',\n };\n}\n\nfunction ProgressSummary({ progress }: { progress: TraceIntelligenceProgress }) {\n return (\n <dl className=\"mt-4 grid gap-2 sm:grid-cols-3\">\n <div className=\"border-border1 bg-surface3 rounded-md border px-3 py-2\">\n <dt className=\"text-neutral3 text-xs\">Traces analyzed</dt>\n <dd className=\"text-neutral6 mt-1 text-lg font-semibold\">{formatNumber(progress.traceCount)}</dd>\n </div>\n <div className=\"border-border1 bg-surface3 rounded-md border px-3 py-2\">\n <dt className=\"text-neutral3 text-xs\">Trace signal types ready</dt>\n <dd className=\"text-neutral6 mt-1 text-lg font-semibold\">{progress.availableSignals.length} of 4</dd>\n </div>\n <div className=\"border-border1 bg-surface3 rounded-md border px-3 py-2\">\n <dt className=\"text-neutral3 text-xs\">Status</dt>\n <dd className=\"text-neutral6 mt-1 text-lg font-semibold capitalize\">{progress.status}</dd>\n </div>\n </dl>\n );\n}\n\nfunction SignalProgressList({ progress }: { progress?: TraceIntelligenceProgress }) {\n if (!progress) return null;\n\n return (\n <ul aria-label=\"Trace signal processing progress\" className=\"mt-3 grid gap-2 sm:grid-cols-2 lg:grid-cols-4\">\n {signalDefinitions.map(signal => {\n const value = progress.signals[signal.key];\n const isReady = progress.availableSignals.includes(signal.key);\n return (\n <li className=\"border-border1 bg-surface2 rounded-md border px-3 py-2\" key={signal.label}>\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-sm font-semibold\" style={signalStyle(signal.label)}>\n {signal.label}\n </span>\n <span className=\"text-neutral4 text-xs\">{isReady ? 'Themes ready' : 'Processing'}</span>\n </div>\n <p className=\"text-neutral3 mt-1 text-xs\">\n {formatNumber(value.generated)} generated · {formatNumber(value.embedded)} embedded\n </p>\n </li>\n );\n })}\n </ul>\n );\n}\n\nexport const SignalsEmptyState = ({\n actionSlot,\n LinkComponent = 'a',\n progress,\n isRangeEmpty,\n}: SignalsEmptyStateProps) => {\n const copy = statusCopy(progress, isRangeEmpty);\n\n return (\n <section className=\"bg-surface1 min-h-full w-full p-6 md:px-10 lg:px-12 xl:px-[4.375rem]\">\n <div className=\"mx-auto w-full max-w-260\">\n <header>\n <p className=\"text-neutral4 flex items-center gap-2 font-mono text-xs tracking-wider uppercase\">\n <span aria-hidden=\"true\" className=\"bg-accent1 size-2 rounded-full\" />\n Trace Intelligence\n </p>\n <h1 className=\"text-header-xl text-neutral6 mt-2 font-medium tracking-tight\">\n Understand what drives every agent interaction\n </h1>\n <p className=\"text-neutral3 mt-2 max-w-180 text-sm leading-5\">\n Trace Intelligence groups recurring goals, outcomes, behaviors, and sentiment across completed traces.\n </p>\n </header>\n\n <div\n role=\"list\"\n aria-label=\"Trace Intelligence analysis pipeline\"\n className=\"mt-14 grid gap-4 lg:grid-cols-[17.5rem_4.5rem_17.5rem_4.5rem_minmax(0,1fr)] lg:gap-0\"\n >\n <div role=\"listitem\" className=\"min-h-50 p-5\">\n <h2 className=\"text-neutral6 text-lg font-semibold\">Traces</h2>\n <p className=\"text-neutral3 mt-0.5 text-xs\">Every agent interaction</p>\n <p className=\"text-neutral3 mt-5 font-mono text-[0.6875rem] tracking-[0.18em] uppercase\">Input</p>\n <div className=\"mt-2.5 space-y-2\">\n {traceRows.map(([name, duration]) => (\n <div\n className=\"border-border1 bg-surface3 text-ui-xs flex items-center justify-between rounded border px-3 py-1.5 font-mono\"\n key={name}\n >\n <span className=\"text-neutral4\">{name}</span>\n <span className=\"text-neutral3\">{duration}</span>\n </div>\n ))}\n </div>\n </div>\n\n <PipelineConnector />\n\n <Card\n as=\"div\"\n role=\"listitem\"\n className=\"flex min-h-50 flex-col items-center p-5 text-center\"\n elevation=\"elevated\"\n >\n <h2 className=\"text-neutral6 text-lg font-semibold\">Trace Intelligence</h2>\n <p className=\"text-neutral3 mt-0.5 text-xs\">Finds recurring themes</p>\n <div aria-hidden=\"true\" className=\"relative mt-5 flex size-20 items-center justify-center\">\n <span className=\"signals-engine-pulse border-positive1/15 absolute size-20 rounded-full border\" />\n <span className=\"border-positive1/25 absolute size-14 rounded-full border\" />\n <span className=\"border-positive1/40 bg-positive1/5 absolute size-9 rounded-full border shadow-[0_0_24px_var(--color-positive1)]\" />\n <CpuIcon className=\"text-positive1 relative size-4\" />\n </div>\n <p className=\"text-ui-xs text-neutral3 mt-3 max-w-40 leading-4\">\n Clusters similar trace signals into themes for each dimension\n </p>\n </Card>\n\n <PipelineConnector />\n\n <div role=\"listitem\" className=\"min-h-50 p-5\">\n <h2 className=\"text-neutral6 text-lg font-semibold\">Theme analysis</h2>\n <p className=\"text-neutral3 mt-0.5 text-xs\">How recurring patterns connect</p>\n <p className=\"text-neutral3 mt-5 font-mono text-[0.6875rem] tracking-[0.18em] uppercase\">Output</p>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {signalLabels.map(label => (\n <span\n className=\"signals-chip bg-surface3 inline-flex items-center gap-2 rounded border border-current/25 px-2.5 py-1.5 text-xs font-medium shadow-[0_0_14px_color-mix(in_oklch,currentColor_12%,transparent)]\"\n key={label}\n style={signalStyle(label)}\n >\n <span aria-hidden=\"true\" className=\"size-1.5 rounded-full bg-current shadow-[0_0_7px_currentColor]\" />\n {label}\n </span>\n ))}\n </div>\n </div>\n </div>\n\n <section className=\"mt-10\" aria-labelledby=\"signal-definitions-heading\">\n <h2 id=\"signal-definitions-heading\" className=\"text-neutral6 text-lg font-semibold\">\n What each trace signal means\n </h2>\n <ul aria-label=\"Trace signal definitions\" className=\"mt-4 grid gap-3 sm:grid-cols-2\">\n {signalDefinitions.map(signal => (\n <li className=\"px-1 py-2\" key={signal.label}>\n <h3 className=\"text-sm font-semibold\" style={signalStyle(signal.label)}>\n {signal.label}\n </h3>\n <p className=\"text-neutral3 mt-1.5 text-xs leading-5\">{signal.description}</p>\n </li>\n ))}\n </ul>\n </section>\n\n <aside className=\"border-border1 bg-surface2 mt-9 rounded-md border px-5 py-4\">\n <div className=\"flex min-w-0 items-start gap-3\">\n <span\n aria-hidden=\"true\"\n className=\"bg-warning1 mt-1.5 size-2 shrink-0 rounded-full shadow-[0_0_9px_currentColor]\"\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-neutral3 text-xs leading-5\">\n <strong className=\"text-neutral5 font-semibold\">{copy.title}</strong> {copy.body}\n </p>\n {progress ? <ProgressSummary progress={progress} /> : null}\n <SignalProgressList progress={progress} />\n </div>\n </div>\n <div className=\"mt-4 flex shrink-0 flex-wrap items-center gap-2 sm:justify-end\">\n {actionSlot}\n <Button\n as=\"a\"\n href=\"https://mastra.ai/en/docs/mastra-platform/trace-intelligence\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n variant=\"outline\"\n size=\"sm\"\n >\n Read the docs<span className=\"sr-only\"> (opens in new tab)</span>\n </Button>\n <Button as={LinkComponent} href=\"/observability\" variant=\"primary\" size=\"sm\">\n View incoming traces\n </Button>\n </div>\n </aside>\n </div>\n </section>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"signals-empty-state.es.js","sources":["../../../../src/ee/signals/components/signals-empty-state.tsx"],"sourcesContent":["import type { TraceSignalName } from '@mastra/client-js';\nimport { CpuIcon } from 'lucide-react';\nimport type { CSSProperties, ReactNode } from 'react';\n\nimport './signals-empty-state.css';\nimport { Button } from '../../../ds/components/Button';\nimport { Card } from '../../../ds/components/Card';\nimport { nodeColor } from '../../../ds/components/SankeyChart/sankeyColor';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport { getSignalHue } from '../signal-colors';\n\ntype SignalDefinition = {\n key: TraceSignalName;\n label: string;\n description: string;\n};\n\nconst signalDefinitions: SignalDefinition[] = [\n { key: 'goal', label: 'Goal', description: 'What the user is trying to achieve.' },\n { key: 'outcome', label: 'Outcome', description: 'Whether the interaction was completed, unresolved, or blocked.' },\n {\n key: 'behavior',\n label: 'Behavior',\n description:\n 'The observable actions and patterns in the trace, including tool use, retries, failures, and recovery.',\n },\n { key: 'sentiment', label: 'Sentiment', description: \"The user's emotional state or attitude.\" },\n];\nconst signalLabels = signalDefinitions.map(signal => signal.label);\n\nconst traceRows = [\n ['chat.completion', '1.2s'],\n ['tool.search_docs', '340ms'],\n ['workflow.support', '2.8s'],\n];\n\nconst signalStyle = (label: string): CSSProperties => ({\n color: nodeColor(getSignalHue(label)),\n});\n\nconst PipelineConnector = () => (\n <div aria-hidden=\"true\" className=\"relative hidden h-full items-center lg:flex\">\n <div className=\"border-border1 w-full border-t border-dashed\" />\n <span className=\"signals-pipeline-connector bg-positive1 absolute left-1/2 size-2.5 -translate-x-1/2 rounded-full shadow-[0_0_12px_currentColor]\" />\n </div>\n);\n\nexport type TraceIntelligenceProgress = {\n status: 'collecting' | 'processing' | 'ready';\n traceCount: number;\n signals: Record<TraceSignalName, { generated: number; embedded: number }>;\n availableSignals: TraceSignalName[];\n};\n\nexport type SignalsEmptyStateProps = {\n actionSlot?: ReactNode;\n LinkComponent?: LinkComponent;\n progress?: TraceIntelligenceProgress;\n isRangeEmpty?: boolean;\n};\n\nfunction formatNumber(value: number) {\n return new Intl.NumberFormat('en-US').format(value);\n}\n\nfunction statusCopy(progress?: TraceIntelligenceProgress, isRangeEmpty?: boolean) {\n if (isRangeEmpty) {\n return {\n title: 'No Trace Intelligence themes in this date range.',\n body: 'Choose a wider snapshot date range, or wait for newly processed traces to form recurring themes.',\n };\n }\n if (!progress || progress.status === 'collecting') {\n return {\n title: 'Collecting traces for Trace Intelligence.',\n body: 'Trace Intelligence starts grouping recurring patterns after your deployed agents send enough completed traces.',\n };\n }\n if (progress.status === 'ready') {\n return {\n title: 'Trace Intelligence themes are ready.',\n body: 'Select at least two available trace signal types to see how goals, outcomes, behaviors, and sentiment connect.',\n };\n }\n return {\n title: 'Analyzing traces for Trace Intelligence.',\n body: 'Trace signals have started processing. Themes appear after enough generated and embedded trace signals form recurring patterns.',\n };\n}\n\nfunction ProgressSummary({ progress }: { progress: TraceIntelligenceProgress }) {\n return (\n <dl className=\"mt-4 grid gap-2 sm:grid-cols-3\">\n <div className=\"border-border1 bg-surface3 rounded-md border px-3 py-2\">\n <dt className=\"text-neutral3 text-xs\">Traces analyzed</dt>\n <dd className=\"text-neutral6 mt-1 text-lg font-semibold\">{formatNumber(progress.traceCount)}</dd>\n </div>\n <div className=\"border-border1 bg-surface3 rounded-md border px-3 py-2\">\n <dt className=\"text-neutral3 text-xs\">Trace signal types ready</dt>\n <dd className=\"text-neutral6 mt-1 text-lg font-semibold\">{progress.availableSignals.length} of 4</dd>\n </div>\n <div className=\"border-border1 bg-surface3 rounded-md border px-3 py-2\">\n <dt className=\"text-neutral3 text-xs\">Status</dt>\n <dd className=\"text-neutral6 mt-1 text-lg font-semibold capitalize\">{progress.status}</dd>\n </div>\n </dl>\n );\n}\n\nfunction SignalProgressList({ progress }: { progress?: TraceIntelligenceProgress }) {\n if (!progress) return null;\n\n return (\n <ul aria-label=\"Trace signal processing progress\" className=\"mt-3 grid gap-2 sm:grid-cols-2 lg:grid-cols-4\">\n {signalDefinitions.map(signal => {\n const value = progress.signals[signal.key];\n const isReady = progress.availableSignals.includes(signal.key);\n return (\n <li className=\"border-border1 bg-surface2 rounded-md border px-3 py-2\" key={signal.label}>\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-sm font-semibold\" style={signalStyle(signal.label)}>\n {signal.label}\n </span>\n <span className=\"text-neutral4 text-xs\">{isReady ? 'Themes ready' : 'Processing'}</span>\n </div>\n <p className=\"text-neutral3 mt-1 text-xs\">\n {formatNumber(value.generated)} generated · {formatNumber(value.embedded)} embedded\n </p>\n </li>\n );\n })}\n </ul>\n );\n}\n\nexport const SignalsEmptyState = ({\n actionSlot,\n LinkComponent = 'a',\n progress,\n isRangeEmpty,\n}: SignalsEmptyStateProps) => {\n const copy = statusCopy(progress, isRangeEmpty);\n\n return (\n <section className=\"bg-surface1 min-h-full w-full p-6 md:px-10 lg:px-12 xl:px-[4.375rem]\">\n <div className=\"mx-auto w-full max-w-260\">\n <header>\n <p className=\"text-neutral4 flex items-center gap-2 font-mono text-xs tracking-wider uppercase\">\n <span aria-hidden=\"true\" className=\"bg-accent1 size-2 rounded-full\" />\n Trace Intelligence\n </p>\n <h1 className=\"text-header-xl text-neutral6 mt-2 font-medium tracking-tight\">\n Understand what drives every agent interaction\n </h1>\n <p className=\"text-neutral3 mt-2 max-w-180 text-sm leading-5\">\n Trace Intelligence groups recurring goals, outcomes, behaviors, and sentiment across completed traces.\n </p>\n </header>\n\n <div\n role=\"list\"\n aria-label=\"Trace Intelligence analysis pipeline\"\n className=\"mt-14 grid gap-4 lg:grid-cols-[17.5rem_4.5rem_17.5rem_4.5rem_minmax(0,1fr)] lg:gap-0\"\n >\n <div role=\"listitem\" className=\"min-h-50 p-5\">\n <h2 className=\"text-neutral6 text-lg font-semibold\">Traces</h2>\n <p className=\"text-neutral3 mt-0.5 text-xs\">Every agent interaction</p>\n <p className=\"text-neutral3 mt-5 font-mono text-[0.6875rem] tracking-[0.18em] uppercase\">Input</p>\n <div className=\"mt-2.5 space-y-2\">\n {traceRows.map(([name, duration]) => (\n <div\n className=\"border-border1 bg-surface3 text-ui-xs flex items-center justify-between rounded border px-3 py-1.5 font-mono\"\n key={name}\n >\n <span className=\"text-neutral4\">{name}</span>\n <span className=\"text-neutral3\">{duration}</span>\n </div>\n ))}\n </div>\n </div>\n\n <PipelineConnector />\n\n <Card\n as=\"div\"\n role=\"listitem\"\n className=\"flex min-h-50 flex-col items-center p-5 text-center\"\n elevation=\"elevated\"\n >\n <h2 className=\"text-neutral6 text-lg font-semibold\">Trace Intelligence</h2>\n <p className=\"text-neutral3 mt-0.5 text-xs\">Finds recurring themes</p>\n <div aria-hidden=\"true\" className=\"relative mt-5 flex size-20 items-center justify-center\">\n <span className=\"signals-engine-pulse border-positive1/15 absolute size-20 rounded-full border\" />\n <span className=\"border-positive1/25 absolute size-14 rounded-full border\" />\n <span className=\"border-positive1/40 bg-positive1/5 absolute size-9 rounded-full border shadow-[0_0_24px_var(--color-positive1)]\" />\n <CpuIcon className=\"text-positive1 relative size-4\" />\n </div>\n <p className=\"text-ui-xs text-neutral3 mt-3 max-w-40 leading-4\">\n Clusters similar trace signals into themes for each dimension\n </p>\n </Card>\n\n <PipelineConnector />\n\n <div role=\"listitem\" className=\"min-h-50 p-5\">\n <h2 className=\"text-neutral6 text-lg font-semibold\">Theme analysis</h2>\n <p className=\"text-neutral3 mt-0.5 text-xs\">How recurring patterns connect</p>\n <p className=\"text-neutral3 mt-5 font-mono text-[0.6875rem] tracking-[0.18em] uppercase\">Output</p>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {signalLabels.map(label => (\n <span\n className=\"signals-chip bg-surface3 inline-flex items-center gap-2 rounded border border-current/25 px-2.5 py-1.5 text-xs font-medium shadow-[0_0_14px_color-mix(in_oklch,currentColor_12%,transparent)]\"\n key={label}\n style={signalStyle(label)}\n >\n <span aria-hidden=\"true\" className=\"size-1.5 rounded-full bg-current shadow-[0_0_7px_currentColor]\" />\n {label}\n </span>\n ))}\n </div>\n </div>\n </div>\n\n <section className=\"mt-10\" aria-labelledby=\"signal-definitions-heading\">\n <h2 id=\"signal-definitions-heading\" className=\"text-neutral6 text-lg font-semibold\">\n What each trace signal means\n </h2>\n <ul aria-label=\"Trace signal definitions\" className=\"mt-4 grid gap-3 sm:grid-cols-2\">\n {signalDefinitions.map(signal => (\n <li className=\"px-1 py-2\" key={signal.label}>\n <h3 className=\"text-sm font-semibold\" style={signalStyle(signal.label)}>\n {signal.label}\n </h3>\n <p className=\"text-neutral3 mt-1.5 text-xs leading-5\">{signal.description}</p>\n </li>\n ))}\n </ul>\n </section>\n\n <aside className=\"border-border1 bg-surface2 mt-9 rounded-md border px-5 py-4\">\n <div className=\"flex min-w-0 items-start gap-3\">\n <span\n aria-hidden=\"true\"\n className=\"bg-warning1 mt-1.5 size-2 shrink-0 rounded-full shadow-[0_0_9px_currentColor]\"\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-neutral3 text-xs leading-5\">\n <strong className=\"text-neutral5 font-semibold\">{copy.title}</strong> {copy.body}\n </p>\n {progress ? <ProgressSummary progress={progress} /> : null}\n <SignalProgressList progress={progress} />\n </div>\n </div>\n <div className=\"mt-4 flex shrink-0 flex-wrap items-center gap-2 sm:justify-end\">\n {actionSlot}\n <Button\n as=\"a\"\n href=\"https://mastra.ai/en/docs/mastra-platform/trace-intelligence\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n variant=\"outline\"\n size=\"sm\"\n >\n Read the docs<span className=\"sr-only\"> (opens in new tab)</span>\n </Button>\n <Button as={LinkComponent} href=\"/traces\" variant=\"primary\" size=\"sm\">\n View incoming traces\n </Button>\n </div>\n </aside>\n </div>\n </section>\n );\n};\n"],"names":[],"mappings":";;;;;;;AAiBA,MAAM,iBAAA,GAAwC;AAAA,EAC5C,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,aAAa,qCAAA,EAAsC;AAAA,EACjF,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,SAAA,EAAW,aAAa,gEAAA,EAAiE;AAAA,EAClH;AAAA,IACE,GAAA,EAAK,UAAA;AAAA,IACL,KAAA,EAAO,UAAA;AAAA,IACP,WAAA,EACE;AAAA,GACJ;AAAA,EACA,EAAE,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,WAAA,EAAa,aAAa,yCAAA;AACvD,CAAA;AACA,MAAM,YAAA,GAAe,iBAAA,CAAkB,GAAA,CAAI,CAAA,MAAA,KAAU,OAAO,KAAK,CAAA;AAEjE,MAAM,SAAA,GAAY;AAAA,EAChB,CAAC,mBAAmB,MAAM,CAAA;AAAA,EAC1B,CAAC,oBAAoB,OAAO,CAAA;AAAA,EAC5B,CAAC,oBAAoB,MAAM;AAC7B,CAAA;AAEA,MAAM,WAAA,GAAc,CAAC,KAAA,MAAkC;AAAA,EACrD,KAAA,EAAO,SAAA,CAAU,YAAA,CAAa,KAAK,CAAC;AACtC,CAAA,CAAA;AAEA,MAAM,oBAAoB,sBACxB,IAAA,CAAC,SAAI,aAAA,EAAY,MAAA,EAAO,WAAU,6CAAA,EAChC,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8CAAA,EAA+C,CAAA;AAAA,kBAC9D,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iIAAA,EAAkI;AAAA,CAAA,EACpJ,CAAA;AAiBF,SAAS,aAAa,KAAA,EAAe;AACnC,EAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AACpD;AAEA,SAAS,UAAA,CAAW,UAAsC,YAAA,EAAwB;AAChF,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,kDAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AACA,EAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,YAAA,EAAc;AACjD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,2CAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AACA,EAAA,IAAI,QAAA,CAAS,WAAW,OAAA,EAAS;AAC/B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,sCAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,0CAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACR;AACF;AAEA,SAAS,eAAA,CAAgB,EAAE,QAAA,EAAS,EAA4C;AAC9E,EAAA,uBACE,IAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gCAAA,EACZ,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wDAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,iBAAA,EAAe,CAAA;AAAA,0BACpD,IAAA,EAAA,EAAG,SAAA,EAAU,4CAA4C,QAAA,EAAA,YAAA,CAAa,QAAA,CAAS,UAAU,CAAA,EAAE;AAAA,KAAA,EAC9F,CAAA;AAAA,oBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wDAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,0BAAA,EAAwB,CAAA;AAAA,sBAC9D,IAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,0CAAA,EAA4C,QAAA,EAAA;AAAA,QAAA,QAAA,CAAS,gBAAA,CAAiB,MAAA;AAAA,QAAO;AAAA,OAAA,EAAK;AAAA,KAAA,EAClG,CAAA;AAAA,oBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wDAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,sBAC5C,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qDAAA,EAAuD,mBAAS,MAAA,EAAO;AAAA,KAAA,EACvF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,kBAAA,CAAmB,EAAE,QAAA,EAAS,EAA6C;AAClF,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,uBACE,GAAA,CAAC,QAAG,YAAA,EAAW,kCAAA,EAAmC,WAAU,+CAAA,EACzD,QAAA,EAAA,iBAAA,CAAkB,IAAI,CAAA,MAAA,KAAU;AAC/B,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAA;AACzC,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,gBAAA,CAAiB,QAAA,CAAS,OAAO,GAAG,CAAA;AAC7D,IAAA,uBACE,IAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,wDAAA,EACZ,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yCAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,uBAAA,EAAwB,KAAA,EAAO,YAAY,MAAA,CAAO,KAAK,CAAA,EACpE,QAAA,EAAA,MAAA,CAAO,KAAA,EACV,CAAA;AAAA,4BACC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAyB,QAAA,EAAA,OAAA,GAAU,iBAAiB,YAAA,EAAa;AAAA,OAAA,EACnF,CAAA;AAAA,sBACA,IAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4BAAA,EACV,QAAA,EAAA;AAAA,QAAA,YAAA,CAAa,MAAM,SAAS,CAAA;AAAA,QAAE,eAAA;AAAA,QAAc,YAAA,CAAa,MAAM,QAAQ,CAAA;AAAA,QAAE;AAAA,OAAA,EAC5E;AAAA,KAAA,EAAA,EAT0E,OAAO,KAUnF,CAAA;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;AAEO,MAAM,oBAAoB,CAAC;AAAA,EAChC,UAAA;AAAA,EACA,aAAA,GAAgB,GAAA;AAAA,EAChB,QAAA;AAAA,EACA;AACF,CAAA,KAA8B;AAC5B,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,QAAA,EAAU,YAAY,CAAA;AAE9C,EAAA,2BACG,SAAA,EAAA,EAAQ,SAAA,EAAU,wEACjB,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0BAAA,EACb,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,QAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,GAAA,EAAA,EAAE,WAAU,kFAAA,EACX,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAY,MAAA,EAAO,SAAA,EAAU,gCAAA,EAAiC,CAAA;AAAA,QAAE;AAAA,OAAA,EAExE,CAAA;AAAA,sBACA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,8DAAA,EAA+D,QAAA,EAAA,gDAAA,EAE7E,CAAA;AAAA,sBACA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gDAAA,EAAiD,QAAA,EAAA,wGAAA,EAE9D;AAAA,KAAA,EACF,CAAA;AAAA,oBAEA,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,MAAA;AAAA,QACL,YAAA,EAAW,sCAAA;AAAA,QACX,SAAA,EAAU,sFAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,UAAA,EAAW,SAAA,EAAU,cAAA,EAC7B,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qCAAA,EAAsC,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,4BAC1D,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAAA,EAA+B,QAAA,EAAA,yBAAA,EAAuB,CAAA;AAAA,4BACnE,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2EAAA,EAA4E,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,4BAC9F,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACZ,QAAA,EAAA,SAAA,CAAU,IAAI,CAAC,CAAC,IAAA,EAAM,QAAQ,CAAA,qBAC7B,IAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,8GAAA;AAAA,gBAGV,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAiB,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,kCACtC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAiB,QAAA,EAAA,QAAA,EAAS;AAAA;AAAA,eAAA;AAAA,cAHrC;AAAA,aAKR,CAAA,EACH;AAAA,WAAA,EACF,CAAA;AAAA,8BAEC,iBAAA,EAAA,EAAkB,CAAA;AAAA,0BAEnB,IAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAG,KAAA;AAAA,cACH,IAAA,EAAK,UAAA;AAAA,cACL,SAAA,EAAU,qDAAA;AAAA,cACV,SAAA,EAAU,UAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qCAAA,EAAsC,QAAA,EAAA,oBAAA,EAAkB,CAAA;AAAA,gCACtE,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAAA,EAA+B,QAAA,EAAA,wBAAA,EAAsB,CAAA;AAAA,gCAClE,IAAA,CAAC,KAAA,EAAA,EAAI,aAAA,EAAY,MAAA,EAAO,WAAU,wDAAA,EAChC,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,+EAAA,EAAgF,CAAA;AAAA,kCAChG,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0DAAA,EAA2D,CAAA;AAAA,kCAC3E,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iHAAA,EAAkH,CAAA;AAAA,kCAClI,GAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,gCAAA,EAAiC;AAAA,iBAAA,EACtD,CAAA;AAAA,gCACA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kDAAA,EAAmD,QAAA,EAAA,+DAAA,EAEhE;AAAA;AAAA;AAAA,WACF;AAAA,8BAEC,iBAAA,EAAA,EAAkB,CAAA;AAAA,0BAEnB,IAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,UAAA,EAAW,WAAU,cAAA,EAC7B,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qCAAA,EAAsC,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,4BAClE,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAAA,EAA+B,QAAA,EAAA,gCAAA,EAA8B,CAAA;AAAA,4BAC1E,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2EAAA,EAA4E,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,gCAC9F,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACZ,QAAA,EAAA,YAAA,CAAa,IAAI,CAAA,KAAA,qBAChB,IAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,+LAAA;AAAA,gBAEV,KAAA,EAAO,YAAY,KAAK,CAAA;AAAA,gBAExB,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAY,MAAA,EAAO,SAAA,EAAU,gEAAA,EAAiE,CAAA;AAAA,kBACnG;AAAA;AAAA,eAAA;AAAA,cAJI;AAAA,aAMR,CAAA,EACH;AAAA,WAAA,EACF;AAAA;AAAA;AAAA,KACF;AAAA,oBAEA,IAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,OAAA,EAAQ,mBAAgB,4BAAA,EACzC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,EAAA,EAAG,4BAAA,EAA6B,SAAA,EAAU,uCAAsC,QAAA,EAAA,8BAAA,EAEpF,CAAA;AAAA,sBACA,GAAA,CAAC,IAAA,EAAA,EAAG,YAAA,EAAW,0BAAA,EAA2B,SAAA,EAAU,gCAAA,EACjD,QAAA,EAAA,iBAAA,CAAkB,GAAA,CAAI,CAAA,MAAA,qBACrB,IAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,WAAU,uBAAA,EAAwB,KAAA,EAAO,YAAY,MAAA,CAAO,KAAK,CAAA,EAClE,QAAA,EAAA,MAAA,CAAO,KAAA,EACV,CAAA;AAAA,wBACA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wCAAA,EAA0C,iBAAO,WAAA,EAAY;AAAA,OAAA,EAAA,EAJ7C,MAAA,CAAO,KAKtC,CACD,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,oBAEA,IAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,6DAAA,EACf,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gCAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAY,MAAA;AAAA,YACZ,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,wBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,GAAA,EAAA,EAAE,WAAU,iCAAA,EACX,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,6BAAA,EAA+B,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,YAAS,GAAA;AAAA,YAAE,IAAA,CAAK;AAAA,WAAA,EAC9E,CAAA;AAAA,UACC,QAAA,mBAAW,GAAA,CAAC,eAAA,EAAA,EAAgB,QAAA,EAAoB,CAAA,GAAK,IAAA;AAAA,0BACtD,GAAA,CAAC,sBAAmB,QAAA,EAAoB;AAAA,SAAA,EAC1C;AAAA,OAAA,EACF,CAAA;AAAA,sBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gEAAA,EACZ,QAAA,EAAA;AAAA,QAAA,UAAA;AAAA,wBACD,IAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAG,GAAA;AAAA,YACH,IAAA,EAAK,8DAAA;AAAA,YACL,MAAA,EAAO,QAAA;AAAA,YACP,GAAA,EAAI,qBAAA;AAAA,YACJ,OAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAK,IAAA;AAAA,YACN,QAAA,EAAA;AAAA,cAAA,eAAA;AAAA,8BACc,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,qBAAA,EAAmB;AAAA;AAAA;AAAA,SAC5D;AAAA,wBACA,GAAA,CAAC,MAAA,EAAA,EAAO,EAAA,EAAI,aAAA,EAAe,IAAA,EAAK,WAAU,OAAA,EAAQ,SAAA,EAAU,IAAA,EAAK,IAAA,EAAK,QAAA,EAAA,sBAAA,EAEtE;AAAA,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;;;;"}
@@ -7,7 +7,7 @@ const lucideReact = require('lucide-react');
7
7
  const React = require('react');
8
8
  const ee_topics_utils = require('../utils.cjs.js');
9
9
  const Button = require('../../../Button-Bm94fEF2.cjs');
10
- const dataList = require('../../../data-list-B3P5IlxV.cjs');
10
+ const dataList = require('../../../data-list-Cb-piK4z.cjs');
11
11
  const inputGroup = require('../../../input-group-CH72YUVL.cjs');
12
12
 
13
13
  function TopicTraceSummaryList({
@@ -3,7 +3,7 @@ import { SearchIcon } from 'lucide-react';
3
3
  import { useState, useMemo } from 'react';
4
4
  import { getVisibleTraceSummaries } from '../utils.es.js';
5
5
  import { B as Button } from '../../../Button-Bx2lFdqb.js';
6
- import { D as DataList } from '../../../data-list-CZC8N3I4.js';
6
+ import { D as DataList } from '../../../data-list-CnQRIUyN.js';
7
7
  import { I as InputGroup, a as InputGroupAddon, c as InputGroupInput } from '../../../input-group-Dzs-ai0n.js';
8
8
 
9
9
  function TopicTraceSummaryList({
@@ -4,16 +4,13 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
5
  const jsxRuntime = require('react/jsx-runtime');
6
6
 
7
- const GithubIcon = (props) => /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "15", height: "15", viewBox: "0 0 15 15", fill: "none", xmlns: "http://www.w3.org/2000/svg", ...props, children: [
8
- /* @__PURE__ */ jsxRuntime.jsx("g", { clipPath: "url(#clip0_21999_22095)", children: /* @__PURE__ */ jsxRuntime.jsx(
9
- "path",
10
- {
11
- d: "M7.5 0.75C3.6325 0.75 0.5 3.8825 0.5 7.75C0.5 10.8475 2.50375 13.4637 5.28625 14.3912C5.63625 14.4525 5.7675 14.2425 5.7675 14.0587C5.7675 13.8925 5.75875 13.3412 5.75875 12.755C4 13.0787 3.545 12.3262 3.405 11.9325C3.32625 11.7312 2.985 11.11 2.6875 10.9437C2.4425 10.8125 2.0925 10.4887 2.67875 10.48C3.23 10.4712 3.62375 10.9875 3.755 11.1975C4.385 12.2562 5.39125 11.9587 5.79375 11.775C5.855 11.32 6.03875 11.0137 6.24 10.8387C4.6825 10.6637 3.055 10.06 3.055 7.3825C3.055 6.62125 3.32625 5.99125 3.7725 5.50125C3.7025 5.32625 3.4575 4.60875 3.8425 3.64625C3.8425 3.64625 4.42875 3.4625 5.7675 4.36375C6.3275 4.20625 6.9225 4.1275 7.5175 4.1275C8.1125 4.1275 8.7075 4.20625 9.2675 4.36375C10.6062 3.45375 11.1925 3.64625 11.1925 3.64625C11.5775 4.60875 11.3325 5.32625 11.2625 5.50125C11.7087 5.99125 11.98 6.6125 11.98 7.3825C11.98 10.0687 10.3438 10.6637 8.78625 10.8387C9.04 11.0575 9.25875 11.4775 9.25875 12.1337C9.25875 13.07 9.25 13.8225 9.25 14.0587C9.25 14.2425 9.38125 14.4612 9.73125 14.3912C11.1209 13.9221 12.3284 13.029 13.1839 11.8377C14.0393 10.6463 14.4996 9.21668 14.5 7.75C14.5 3.8825 11.3675 0.75 7.5 0.75Z",
12
- fill: "currentColor"
13
- }
14
- ) }),
15
- /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsx("clipPath", { id: "clip0_21999_22095", children: /* @__PURE__ */ jsxRuntime.jsx("rect", { width: "14", height: "14", fill: "currentColor", transform: "translate(0.5 0.75)" }) }) })
16
- ] });
7
+ const GithubIcon = (props) => /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "15", height: "15", viewBox: "0 0 15 15", fill: "none", xmlns: "http://www.w3.org/2000/svg", ...props, children: /* @__PURE__ */ jsxRuntime.jsx(
8
+ "path",
9
+ {
10
+ d: "M7.5 0.75C3.6325 0.75 0.5 3.8825 0.5 7.75C0.5 10.8475 2.50375 13.4637 5.28625 14.3912C5.63625 14.4525 5.7675 14.2425 5.7675 14.0587C5.7675 13.8925 5.75875 13.3412 5.75875 12.755C4 13.0787 3.545 12.3262 3.405 11.9325C3.32625 11.7312 2.985 11.11 2.6875 10.9437C2.4425 10.8125 2.0925 10.4887 2.67875 10.48C3.23 10.4712 3.62375 10.9875 3.755 11.1975C4.385 12.2562 5.39125 11.9587 5.79375 11.775C5.855 11.32 6.03875 11.0137 6.24 10.8387C4.6825 10.6637 3.055 10.06 3.055 7.3825C3.055 6.62125 3.32625 5.99125 3.7725 5.50125C3.7025 5.32625 3.4575 4.60875 3.8425 3.64625C3.8425 3.64625 4.42875 3.4625 5.7675 4.36375C6.3275 4.20625 6.9225 4.1275 7.5175 4.1275C8.1125 4.1275 8.7075 4.20625 9.2675 4.36375C10.6062 3.45375 11.1925 3.64625 11.1925 3.64625C11.5775 4.60875 11.3325 5.32625 11.2625 5.50125C11.7087 5.99125 11.98 6.6125 11.98 7.3825C11.98 10.0687 10.3438 10.6637 8.78625 10.8387C9.04 11.0575 9.25875 11.4775 9.25875 12.1337C9.25875 13.07 9.25 13.8225 9.25 14.0587C9.25 14.2425 9.38125 14.4612 9.73125 14.3912C11.1209 13.9221 12.3284 13.029 13.1839 11.8377C14.0393 10.6463 14.4996 9.21668 14.5 7.75C14.5 3.8825 11.3675 0.75 7.5 0.75Z",
11
+ fill: "currentColor"
12
+ }
13
+ ) });
17
14
 
18
15
  exports.GithubIcon = GithubIcon;
19
16
  //# sourceMappingURL=GithubIcon.cjs.js.map