@mastra/playground-ui 66.0.0 → 66.0.1-alpha.0

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 (109) hide show
  1. package/dist/domains/traces/components/format-trace-thread-messages.cjs.js +52 -0
  2. package/dist/domains/traces/components/format-trace-thread-messages.cjs.js.map +1 -1
  3. package/dist/domains/traces/components/format-trace-thread-messages.es.js +51 -1
  4. package/dist/domains/traces/components/format-trace-thread-messages.es.js.map +1 -1
  5. package/dist/domains/traces/components/read-only-tool-call-provider.cjs.js +23 -0
  6. package/dist/domains/traces/components/read-only-tool-call-provider.cjs.js.map +1 -0
  7. package/dist/domains/traces/components/read-only-tool-call-provider.d.ts +1 -0
  8. package/dist/domains/traces/components/read-only-tool-call-provider.es.js +22 -0
  9. package/dist/domains/traces/components/read-only-tool-call-provider.es.js.map +1 -0
  10. package/dist/domains/traces/components/span-data-panel-view.cjs.js +123 -67
  11. package/dist/domains/traces/components/span-data-panel-view.cjs.js.map +1 -1
  12. package/dist/domains/traces/components/span-data-panel-view.es.js +131 -75
  13. package/dist/domains/traces/components/span-data-panel-view.es.js.map +1 -1
  14. package/dist/domains/traces/components/span-details-view.cjs.js +19 -11
  15. package/dist/domains/traces/components/span-details-view.cjs.js.map +1 -1
  16. package/dist/domains/traces/components/span-details-view.es.js +22 -14
  17. package/dist/domains/traces/components/span-details-view.es.js.map +1 -1
  18. package/dist/domains/traces/components/span-outcome.cjs.js +78 -0
  19. package/dist/domains/traces/components/span-outcome.cjs.js.map +1 -0
  20. package/dist/domains/traces/components/span-outcome.d.ts +1 -0
  21. package/dist/domains/traces/components/span-outcome.es.js +77 -0
  22. package/dist/domains/traces/components/span-outcome.es.js.map +1 -0
  23. package/dist/domains/traces/components/span-outcome.utils.cjs.js +360 -0
  24. package/dist/domains/traces/components/span-outcome.utils.cjs.js.map +1 -0
  25. package/dist/domains/traces/components/span-outcome.utils.d.ts +1 -0
  26. package/dist/domains/traces/components/span-outcome.utils.es.js +357 -0
  27. package/dist/domains/traces/components/span-outcome.utils.es.js.map +1 -0
  28. package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +32 -15
  29. package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js.map +1 -1
  30. package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +32 -16
  31. package/dist/domains/traces/components/span-payload/span-error-renderer.es.js.map +1 -1
  32. package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +2 -2
  33. package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +2 -2
  34. package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +2 -10
  35. package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js.map +1 -1
  36. package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +2 -10
  37. package/dist/domains/traces/components/span-payload/span-output-renderers.es.js.map +1 -1
  38. package/dist/domains/traces/components/span-payload/span-payload-json.cjs.js +22 -1
  39. package/dist/domains/traces/components/span-payload/span-payload-json.cjs.js.map +1 -1
  40. package/dist/domains/traces/components/span-payload/span-payload-json.es.js +22 -1
  41. package/dist/domains/traces/components/span-payload/span-payload-json.es.js.map +1 -1
  42. package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +1 -1
  43. package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +1 -1
  44. package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +1 -1
  45. package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +1 -1
  46. package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +4 -7
  47. package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js.map +1 -1
  48. package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +4 -7
  49. package/dist/domains/traces/components/span-payload/span-payload-processor.es.js.map +1 -1
  50. package/dist/domains/traces/components/span-payload/span-payload-registry.cjs.js +21 -19
  51. package/dist/domains/traces/components/span-payload/span-payload-registry.cjs.js.map +1 -1
  52. package/dist/domains/traces/components/span-payload/span-payload-registry.es.js +22 -20
  53. package/dist/domains/traces/components/span-payload/span-payload-registry.es.js.map +1 -1
  54. package/dist/domains/traces/components/span-payload/span-payload-section.cjs.js +62 -19
  55. package/dist/domains/traces/components/span-payload/span-payload-section.cjs.js.map +1 -1
  56. package/dist/domains/traces/components/span-payload/span-payload-section.es.js +62 -20
  57. package/dist/domains/traces/components/span-payload/span-payload-section.es.js.map +1 -1
  58. package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +1 -1
  59. package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +1 -1
  60. package/dist/domains/traces/components/span-payload/span-processor-attributes.cjs.js +51 -140
  61. package/dist/domains/traces/components/span-payload/span-processor-attributes.cjs.js.map +1 -1
  62. package/dist/domains/traces/components/span-payload/span-processor-attributes.es.js +54 -143
  63. package/dist/domains/traces/components/span-payload/span-processor-attributes.es.js.map +1 -1
  64. package/dist/domains/traces/components/span-payload/span-processor-mutations.cjs.js +99 -0
  65. package/dist/domains/traces/components/span-payload/span-processor-mutations.cjs.js.map +1 -0
  66. package/dist/domains/traces/components/span-payload/span-processor-mutations.d.ts +1 -0
  67. package/dist/domains/traces/components/span-payload/span-processor-mutations.es.js +98 -0
  68. package/dist/domains/traces/components/span-payload/span-processor-mutations.es.js.map +1 -0
  69. package/dist/domains/traces/components/span-payload/span-tools-section.cjs.js +48 -3
  70. package/dist/domains/traces/components/span-payload/span-tools-section.cjs.js.map +1 -1
  71. package/dist/domains/traces/components/span-payload/span-tools-section.es.js +48 -5
  72. package/dist/domains/traces/components/span-payload/span-tools-section.es.js.map +1 -1
  73. package/dist/domains/traces/components/span-payload.cjs.js +6 -1
  74. package/dist/domains/traces/components/span-payload.es.js +5 -4
  75. package/dist/domains/traces/components/thread-trace/thread-trace-spans.cjs.js +1 -1
  76. package/dist/domains/traces/components/thread-trace/thread-trace-spans.es.js +1 -1
  77. package/dist/domains/traces/components/trace-data-panel-view.cjs.js +1 -1
  78. package/dist/domains/traces/components/trace-data-panel-view.es.js +1 -1
  79. package/dist/domains/traces/components/trace-details-view.cjs.js +1 -1
  80. package/dist/domains/traces/components/trace-details-view.es.js +1 -1
  81. package/dist/domains/traces/components/trace-thread-item-view.cjs.js +26 -38
  82. package/dist/domains/traces/components/trace-thread-item-view.cjs.js.map +1 -1
  83. package/dist/domains/traces/components/trace-thread-item-view.es.js +26 -38
  84. package/dist/domains/traces/components/trace-thread-item-view.es.js.map +1 -1
  85. package/dist/domains/traces/components.cjs.js +7 -2
  86. package/dist/domains/traces/components.es.js +6 -5
  87. package/dist/domains/traces/hooks/use-trace-span-navigation.cjs.js +1 -1
  88. package/dist/domains/traces/hooks/use-trace-span-navigation.es.js +1 -1
  89. package/dist/domains/traces.cjs.js +7 -2
  90. package/dist/domains/traces.es.js +6 -5
  91. package/dist/{span-payload-primitives-Fi1kSYyM.js → span-payload-primitives-CNDSzk1Q.js} +2 -2
  92. package/dist/{span-payload-primitives-Fi1kSYyM.js.map → span-payload-primitives-CNDSzk1Q.js.map} +1 -1
  93. package/dist/{span-payload-primitives-rxerCV7Y.cjs → span-payload-primitives-DNhjpAtm.cjs} +2 -2
  94. package/dist/{span-payload-primitives-rxerCV7Y.cjs.map → span-payload-primitives-DNhjpAtm.cjs.map} +1 -1
  95. package/dist/src/domains/traces/components/format-trace-thread-messages.d.ts +14 -0
  96. package/dist/src/domains/traces/components/read-only-tool-call-provider.d.ts +5 -0
  97. package/dist/src/domains/traces/components/span-outcome.d.ts +15 -0
  98. package/dist/src/domains/traces/components/span-outcome.utils.d.ts +32 -0
  99. package/dist/src/domains/traces/components/span-payload/index.d.ts +4 -3
  100. package/dist/src/domains/traces/components/span-payload/span-error-renderer.d.ts +2 -0
  101. package/dist/src/domains/traces/components/span-payload/span-payload-json.d.ts +3 -1
  102. package/dist/src/domains/traces/components/span-payload/span-payload-processor.d.ts +1 -4
  103. package/dist/src/domains/traces/components/span-payload/span-payload-registry.d.ts +5 -14
  104. package/dist/src/domains/traces/components/span-payload/span-payload-section.d.ts +20 -1
  105. package/dist/src/domains/traces/components/span-payload/span-processor-attributes.d.ts +4 -4
  106. package/dist/src/domains/traces/components/span-payload/span-processor-mutations.d.ts +5 -0
  107. package/dist/src/domains/traces/components/span-payload/span-tools-section.d.ts +14 -2
  108. package/dist/style.css +22 -2
  109. package/package.json +6 -6
@@ -7,21 +7,35 @@ const require_DataPanel = require("../../../DataPanel-Ded_OhrA.cjs");
7
7
  const require_tabs_content = require("../../../tabs-content-DJ-d-ICe.cjs");
8
8
  const require_DataKeysAndValues = require("../../../DataKeysAndValues-CHQcnHzv.cjs");
9
9
  const require_domains_traces_utils_span_utils = require("../utils/span-utils.cjs.js");
10
+ const require_domains_traces_components_span_outcome = require("./span-outcome.cjs.js");
10
11
  const require_domains_traces_components_span_payload_span_payload_registry = require("./span-payload/span-payload-registry.cjs.js");
12
+ const require_domains_traces_components_span_outcome_utils = require("./span-outcome.utils.cjs.js");
11
13
  const require_domains_traces_components_span_payload_span_input_renderers = require("./span-payload/span-input-renderers.cjs.js");
12
14
  const require_domains_traces_components_span_payload_span_output_renderers = require("./span-payload/span-output-renderers.cjs.js");
13
15
  const require_domains_traces_components_span_payload_span_error_renderer = require("./span-payload/span-error-renderer.cjs.js");
14
16
  const require_domains_traces_components_span_payload_span_payload_section = require("./span-payload/span-payload-section.cjs.js");
15
17
  const require_domains_traces_components_span_payload_span_processor_attributes = require("./span-payload/span-processor-attributes.cjs.js");
18
+ const require_domains_traces_components_span_payload_span_processor_mutations = require("./span-payload/span-processor-mutations.cjs.js");
16
19
  const require_domains_traces_components_span_payload_span_tools_section = require("./span-payload/span-tools-section.cjs.js");
17
20
  const require_domains_traces_components_span_summary_description = require("./span-summary-description.cjs.js");
18
21
  const require_domains_traces_components_span_token_usage = require("./span-token-usage.cjs.js");
19
22
  const require_domains_traces_components_trace_id_button = require("./trace-id-button.cjs.js");
23
+ let react = require("react");
20
24
  let react_jsx_runtime = require("react/jsx-runtime");
21
25
  let lucide_react = require("lucide-react");
22
- let _mastra_core_observability = require("@mastra/core/observability");
23
26
  // src/domains/traces/components/span-data-panel-view.tsx
24
27
  var BODY_CLASS = "min-h-0 flex-1 overflow-y-auto p-2";
28
+ var LEAD = [
29
+ "error",
30
+ "changes",
31
+ "input",
32
+ "output"
33
+ ];
34
+ var REST = [
35
+ "tools",
36
+ "metadata",
37
+ "attributes"
38
+ ];
25
39
  function SpanDataPanelView({ traceId, spanId, span, isLoading, onPrevious, onNext, onClose, onShowTrace, activeTab, onTabChange, feedbackTabSlot, feedbackTabBadge, isAnchor, className }) {
26
40
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
27
41
  className: require_utils.cn("flex min-h-0 flex-1 flex-col overflow-hidden", className),
@@ -71,8 +85,80 @@ function SpanDataPanelView({ traceId, spanId, span, isLoading, onPrevious, onNex
71
85
  });
72
86
  }
73
87
  function SpanDataPanelContent({ span, traceId, spanId, activeTab, onTabChange, feedbackTabSlot, feedbackTabBadge, isAnchor }) {
74
- const hasContext = (isAnchor ?? span.parentSpanId == null) && Boolean(span.tags?.length || span.sessionId || span.requestId || span.userId || span.organizationId || span.experimentId);
88
+ const isRoot = isAnchor ?? span.parentSpanId == null;
89
+ const hasContext = isRoot && Boolean(span.tags?.length || span.sessionId || span.requestId || span.userId || span.organizationId || span.experimentId);
90
+ const outcome = require_domains_traces_components_span_outcome_utils.getSpanOutcome(span);
91
+ const showOutcome = outcome != null && (!isRoot || outcome.tone === "error" || outcome.tone === "warning");
92
+ const outputPayload = require_domains_traces_components_span_payload_span_payload_registry.getSpanOutputPayload(span);
93
+ const evidence = outcome?.evidence === "output" && outputPayload == null ? void 0 : outcome?.evidence;
94
+ const toolCallsInOutcome = showOutcome && evidence === "toolCalls";
95
+ const changesInOutcome = showOutcome && evidence === "changes";
96
+ const errorInOutcome = showOutcome && evidence === "error";
97
+ const changes = require_domains_traces_components_span_outcome_utils.getSpanChanges(span);
98
+ const sections = {
99
+ error: span.error != null && !errorInOutcome && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_payload_section.SpanPayloadSection, {
100
+ title: "Error",
101
+ raw: span.error,
102
+ framed: false,
103
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_error_renderer.SpanErrorRenderer, { span })
104
+ }),
105
+ changes: changes.length > 0 && !changesInOutcome && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_payload_section.SpanPayloadSection, {
106
+ title: "Changes",
107
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.ArrowLeftRightIcon, {}),
108
+ raw: changes,
109
+ hasPreview: true,
110
+ emphasis: evidence === "changes",
111
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_processor_mutations.SpanProcessorMutations, { span })
112
+ }),
113
+ output: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_payload_section.SpanPayloadSection, {
114
+ title: "Output",
115
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.FileOutputIcon, {}),
116
+ raw: outputPayload,
117
+ hasPreview: require_domains_traces_components_span_payload_span_payload_registry.hasSpanOutputPreview(span),
118
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_output_renderers.SpanOutputRenderer, { span })
119
+ }),
120
+ input: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_payload_section.SpanPayloadSection, {
121
+ title: "Input",
122
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.FileInputIcon, {}),
123
+ raw: span.input,
124
+ hasPreview: require_domains_traces_components_span_payload_span_payload_registry.hasSpanInputPreview(span),
125
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_input_renderers.SpanInputRenderer, { span })
126
+ }),
127
+ tools: toolCallsInOutcome ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_tools_section.SpanAvailableToolsSection, { span }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_tools_section.SpanToolsSection, { span }),
128
+ metadata: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_payload_section.SpanPayloadJsonSection, {
129
+ title: "Metadata",
130
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.BracesIcon, {}),
131
+ raw: span.metadata
132
+ }),
133
+ attributes: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_payload_section.SpanPayloadJsonSection, {
134
+ title: "Attributes",
135
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.BracesIcon, {}),
136
+ raw: span.attributes
137
+ })
138
+ };
75
139
  const detailsBody = /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
140
+ showOutcome && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_outcome.SpanOutcomeSummary, {
141
+ outcome,
142
+ showDetail: !evidence,
143
+ className: "mb-3",
144
+ renderProof: errorInOutcome ? (headline) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_payload_section.SpanPayloadSection, {
145
+ title: "Error",
146
+ heading: headline,
147
+ raw: span.error,
148
+ framed: false,
149
+ clip: false,
150
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_error_renderer.SpanErrorDetails, { span })
151
+ }) : changesInOutcome ? (headline) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_payload_section.SpanPayloadSection, {
152
+ title: "Changes",
153
+ heading: headline,
154
+ raw: changes,
155
+ hasPreview: true,
156
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_processor_mutations.SpanProcessorMutations, { span })
157
+ }) : toolCallsInOutcome ? (headline) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_tools_section.SpanToolCallsSection, {
158
+ span,
159
+ heading: headline
160
+ }) : void 0
161
+ }),
76
162
  require_domains_traces_utils_span_utils.isTokenLimitExceeded(span) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
77
163
  className: "mb-3",
78
164
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Notice.Notice, {
@@ -81,77 +167,47 @@ function SpanDataPanelContent({ span, traceId, spanId, activeTab, onTabChange, f
81
167
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Notice.Notice.Message, { children: require_domains_traces_utils_span_utils.getTokenLimitMessage(span) })
82
168
  })
83
169
  }),
84
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_payload_section.SpanPayloadSection, {
85
- title: "Error",
86
- raw: span.error,
87
- framed: false,
88
- className: "mb-3",
89
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_error_renderer.SpanErrorRenderer, { span })
90
- }),
91
170
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_token_usage.SpanModelSummary, {
92
171
  span,
93
172
  className: "mb-4"
94
173
  }),
95
- hasContext && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_DataKeysAndValues.DataKeysAndValues, { children: (isAnchor ?? span.parentSpanId == null) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
96
- span.tags && span.tags.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_DataKeysAndValues.DataKeysAndValues.Key, { children: "Tags" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_DataKeysAndValues.DataKeysAndValues.Value, { children: span.tags.join(", ") })] }),
97
- span.sessionId && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_DataKeysAndValues.DataKeysAndValues.Key, { children: "Session Id" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_DataKeysAndValues.DataKeysAndValues.ValueWithCopyBtn, {
98
- copyTooltip: "Copy Session Id to clipboard",
99
- copyValue: span.sessionId,
100
- children: span.sessionId
101
- })] }),
102
- span.requestId && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_DataKeysAndValues.DataKeysAndValues.Key, { children: "Request Id" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_DataKeysAndValues.DataKeysAndValues.ValueWithCopyBtn, {
103
- copyTooltip: "Copy Request Id to clipboard",
104
- copyValue: span.requestId,
105
- children: span.requestId
106
- })] }),
107
- span.userId && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_DataKeysAndValues.DataKeysAndValues.Key, { children: "User Id" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_DataKeysAndValues.DataKeysAndValues.ValueWithCopyBtn, {
108
- copyTooltip: "Copy User Id to clipboard",
109
- copyValue: span.userId,
110
- children: span.userId
111
- })] }),
112
- span.organizationId && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_DataKeysAndValues.DataKeysAndValues.Key, { children: "Organization Id" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_DataKeysAndValues.DataKeysAndValues.ValueWithCopyBtn, {
113
- copyTooltip: "Copy Organization Id to clipboard",
114
- copyValue: span.organizationId,
115
- children: span.organizationId
116
- })] }),
117
- span.experimentId && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_DataKeysAndValues.DataKeysAndValues.Key, { children: "Experiment Id" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_DataKeysAndValues.DataKeysAndValues.ValueWithCopyBtn, {
118
- copyTooltip: "Copy Experiment Id to clipboard",
119
- copyValue: span.experimentId,
120
- children: span.experimentId
121
- })] })
122
- ] }) }),
174
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_processor_attributes.SpanProcessorAttributes, {
175
+ span,
176
+ className: "mb-4"
177
+ }),
123
178
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
124
- className: require_utils.cn("grid gap-4", hasContext && "mt-4"),
179
+ className: "grid gap-4",
125
180
  children: [
126
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_payload_section.SpanPayloadSection, {
127
- title: "Input",
128
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.FileInputIcon, {}),
129
- raw: span.input,
130
- hasPreview: require_domains_traces_components_span_payload_span_payload_registry.hasSpanInputPreview(span),
131
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_input_renderers.SpanInputRenderer, { span })
132
- }),
133
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_payload_section.SpanPayloadSection, {
134
- title: "Output",
135
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.FileOutputIcon, {}),
136
- raw: require_domains_traces_components_span_payload_span_payload_registry.getSpanOutputPayload(span),
137
- hasPreview: (0, _mastra_core_observability.describeSpanOutput)(require_domains_traces_components_span_payload_span_payload_registry.asCoreSpan(span))?.type !== "json",
138
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_output_renderers.SpanOutputRenderer, { span })
139
- }),
140
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_tools_section.SpanToolsSection, { span }),
141
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_payload_section.SpanPayloadSection, {
142
- title: "Metadata",
143
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.BracesIcon, {}),
144
- raw: span.metadata,
145
- hasPreview: false,
146
- children: null
147
- }),
148
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_payload_section.SpanPayloadSection, {
149
- title: "Attributes",
150
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.BracesIcon, {}),
151
- raw: span.attributes,
152
- hasPreview: (0, _mastra_core_observability.describeProcessorPipeline)(require_domains_traces_components_span_payload_span_payload_registry.asCoreSpan(span)) !== void 0,
153
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_span_payload_span_processor_attributes.SpanProcessorAttributes, { span })
154
- })
181
+ LEAD.map((section) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react.Fragment, { children: sections[section] }, section)),
182
+ hasContext && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_DataKeysAndValues.DataKeysAndValues, { children: isRoot && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
183
+ span.tags && span.tags.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_DataKeysAndValues.DataKeysAndValues.Key, { children: "Tags" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_DataKeysAndValues.DataKeysAndValues.Value, { children: span.tags.join(", ") })] }),
184
+ span.sessionId && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_DataKeysAndValues.DataKeysAndValues.Key, { children: "Session Id" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_DataKeysAndValues.DataKeysAndValues.ValueWithCopyBtn, {
185
+ copyTooltip: "Copy Session Id to clipboard",
186
+ copyValue: span.sessionId,
187
+ children: span.sessionId
188
+ })] }),
189
+ span.requestId && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_DataKeysAndValues.DataKeysAndValues.Key, { children: "Request Id" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_DataKeysAndValues.DataKeysAndValues.ValueWithCopyBtn, {
190
+ copyTooltip: "Copy Request Id to clipboard",
191
+ copyValue: span.requestId,
192
+ children: span.requestId
193
+ })] }),
194
+ span.userId && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_DataKeysAndValues.DataKeysAndValues.Key, { children: "User Id" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_DataKeysAndValues.DataKeysAndValues.ValueWithCopyBtn, {
195
+ copyTooltip: "Copy User Id to clipboard",
196
+ copyValue: span.userId,
197
+ children: span.userId
198
+ })] }),
199
+ span.organizationId && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_DataKeysAndValues.DataKeysAndValues.Key, { children: "Organization Id" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_DataKeysAndValues.DataKeysAndValues.ValueWithCopyBtn, {
200
+ copyTooltip: "Copy Organization Id to clipboard",
201
+ copyValue: span.organizationId,
202
+ children: span.organizationId
203
+ })] }),
204
+ span.experimentId && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_DataKeysAndValues.DataKeysAndValues.Key, { children: "Experiment Id" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_DataKeysAndValues.DataKeysAndValues.ValueWithCopyBtn, {
205
+ copyTooltip: "Copy Experiment Id to clipboard",
206
+ copyValue: span.experimentId,
207
+ children: span.experimentId
208
+ })] })
209
+ ] }) }),
210
+ REST.map((section) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react.Fragment, { children: sections[section] }, section))
155
211
  ]
156
212
  })
157
213
  ] });
@@ -1 +1 @@
1
- {"version":3,"file":"span-data-panel-view.cjs.js","names":["cn","DataPanel","TraceIdButton","SpanRunId","SpanSummaryDescription","Button","ExternalLinkIcon","_Fragment","isTokenLimitExceeded","Notice","getTokenLimitMessage","SpanPayloadSection","SpanErrorRenderer","SpanModelSummary","DataKeysAndValues","FileInputIcon","hasSpanInputPreview","SpanInputRenderer","FileOutputIcon","getSpanOutputPayload","describeSpanOutput","asCoreSpan","SpanOutputRenderer","SpanToolsSection","BracesIcon","describeProcessorPipeline","SpanProcessorAttributes","Tabs","TabList","Tab","TabContent"],"sources":["../../../../src/domains/traces/components/span-data-panel-view.tsx"],"sourcesContent":["import { describeProcessorPipeline, describeSpanOutput } from '@mastra/core/observability';\nimport { BracesIcon, ExternalLinkIcon, FileInputIcon, FileOutputIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport type { SpanRecord } from '../types';\nimport { getTokenLimitMessage, isTokenLimitExceeded } from '../utils/span-utils';\nimport {\n SpanErrorRenderer,\n SpanInputRenderer,\n getSpanOutputPayload,\n hasSpanInputPreview,\n SpanOutputRenderer,\n SpanPayloadSection,\n SpanProcessorAttributes,\n} from './span-payload';\nimport { asCoreSpan } from './span-payload/span-payload-registry';\nimport { SpanToolsSection } from './span-payload/span-tools-section';\nimport { SpanRunId, SpanSummaryDescription } from './span-summary-description';\nimport { SpanModelSummary } from './span-token-usage';\nimport { TraceIdButton } from './trace-id-button';\nimport { Button } from '@/ds/components/Button';\nimport { DataKeysAndValues } from '@/ds/components/DataKeysAndValues';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport { Notice } from '@/ds/components/Notice';\nimport { Tab, TabContent, TabList, Tabs } from '@/ds/components/Tabs';\nimport { cn } from '@/lib/utils';\n\n// Mirrors `DataPanel.Content` padding without requiring the Drawer root (this view also renders standalone).\nconst BODY_CLASS = 'min-h-0 flex-1 overflow-y-auto p-2';\n\nexport interface SpanDataPanelViewProps {\n traceId: string;\n spanId: string;\n /** Full span record. Caller fetches via useSpanDetail. */\n span: SpanRecord | undefined;\n isLoading?: boolean;\n /** Previous/next buttons show only when one is provided; omit both where a span tree already navigates. */\n onPrevious?: () => void;\n onNext?: () => void;\n /** When provided, an × button in the header closes the span column. */\n onClose?: () => void;\n /**\n * When provided, a \"Go to trace\" button in the header calls it with the span's ids.\n * The caller decides where the trace opens (e.g. its own traces route).\n */\n onShowTrace?: (span: { traceId: string; spanId: string }) => void;\n activeTab?: string;\n onTabChange?: (tab: string) => void;\n /**\n * When provided, a \"Feedback\" tab appears; the slot receives the loaded span and renders\n * whatever feedback UI the consumer wants.\n */\n feedbackTabSlot?: (args: { span: SpanRecord; traceId: string; spanId: string }) => ReactNode;\n /** Optional indicator rendered after the \"Feedback\" tab label (e.g. a needs-review dot). */\n feedbackTabBadge?: ReactNode;\n /**\n * Whether this span is the displayed root of the current view (trace root or\n * branch anchor). Controls visibility of trace-level metadata fields. Defaults\n * to `span.parentSpanId == null` (trace case) when omitted.\n */\n isAnchor?: boolean;\n /** Extra classes for the panel root (e.g. flattening the card when nested in the trace panel). */\n className?: string;\n}\n\nexport function SpanDataPanelView({\n traceId,\n spanId,\n span,\n isLoading,\n onPrevious,\n onNext,\n onClose,\n onShowTrace,\n activeTab,\n onTabChange,\n feedbackTabSlot,\n feedbackTabBadge,\n isAnchor,\n className,\n}: SpanDataPanelViewProps) {\n // Not a DataPanel: this is the span column rendered inside `TraceDataPanelView`,\n // which already provides the panel chrome.\n return (\n <section className={cn('flex min-h-0 flex-1 flex-col overflow-hidden', className)}>\n <DataPanel.Header>\n <DataPanel.HeaderContent>\n <DataPanel.Heading>\n Span\n <TraceIdButton id={spanId} maxLength={6} ellipsis={false} />\n </DataPanel.Heading>\n {span?.runId && <SpanRunId runId={span.runId} />}\n {span && <SpanSummaryDescription span={span} />}\n </DataPanel.HeaderContent>\n <DataPanel.HeaderActions>\n {onShowTrace && (\n <Button\n size=\"icon-sm\"\n variant=\"ghost\"\n aria-label=\"Go to trace\"\n tooltip=\"Go to trace\"\n className=\"shrink-0\"\n onClick={() => onShowTrace({ traceId, spanId })}\n >\n <ExternalLinkIcon />\n </Button>\n )}\n {(onPrevious || onNext) && (\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Go to previous span\"\n nextLabel=\"Go to next span\"\n />\n )}\n {onClose && <DataPanel.CloseButton icon=\"x\" onClick={onClose} label=\"Close span\" tooltip=\"Close span\" />}\n </DataPanel.HeaderActions>\n </DataPanel.Header>\n\n {isLoading ? (\n <DataPanel.LoadingData>Loading span details...</DataPanel.LoadingData>\n ) : !span ? (\n <DataPanel.NoData>Span not found.</DataPanel.NoData>\n ) : (\n <SpanDataPanelContent\n span={span}\n traceId={traceId}\n spanId={spanId}\n activeTab={activeTab}\n onTabChange={onTabChange}\n feedbackTabSlot={feedbackTabSlot}\n feedbackTabBadge={feedbackTabBadge}\n isAnchor={isAnchor}\n />\n )}\n </section>\n );\n}\n\nfunction SpanDataPanelContent({\n span,\n traceId,\n spanId,\n activeTab,\n onTabChange,\n feedbackTabSlot,\n feedbackTabBadge,\n isAnchor,\n}: {\n span: SpanRecord;\n traceId: string;\n spanId: string;\n activeTab?: string;\n onTabChange?: (tab: string) => void;\n feedbackTabSlot?: (args: { span: SpanRecord; traceId: string; spanId: string }) => ReactNode;\n feedbackTabBadge?: ReactNode;\n isAnchor?: boolean;\n}) {\n const hasContext =\n (isAnchor ?? span.parentSpanId == null) &&\n Boolean(\n span.tags?.length || span.sessionId || span.requestId || span.userId || span.organizationId || span.experimentId,\n );\n\n const detailsBody = (\n <>\n {isTokenLimitExceeded(span) && (\n <div className=\"mb-3\">\n <Notice variant=\"warning\" title=\"Token Limit Exceeded\">\n <Notice.Message>{getTokenLimitMessage(span)}</Notice.Message>\n </Notice>\n </div>\n )}\n\n <SpanPayloadSection title=\"Error\" raw={span.error} framed={false} className=\"mb-3\">\n <SpanErrorRenderer span={span} />\n </SpanPayloadSection>\n\n <SpanModelSummary span={span} className=\"mb-4\" />\n\n {hasContext && (\n <DataKeysAndValues>\n {/* Anchor-only: rich trace-context fields. Live on the full SpanRecord, not on the\n * lightweight payload, so they only have values once the full span is loaded. */}\n {(isAnchor ?? span.parentSpanId == null) && (\n <>\n {span.tags && span.tags.length > 0 && (\n <>\n <DataKeysAndValues.Key>Tags</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{span.tags.join(', ')}</DataKeysAndValues.Value>\n </>\n )}\n {span.sessionId && (\n <>\n <DataKeysAndValues.Key>Session Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn\n copyTooltip=\"Copy Session Id to clipboard\"\n copyValue={span.sessionId}\n >\n {span.sessionId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n {span.requestId && (\n <>\n <DataKeysAndValues.Key>Request Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn\n copyTooltip=\"Copy Request Id to clipboard\"\n copyValue={span.requestId}\n >\n {span.requestId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n {span.userId && (\n <>\n <DataKeysAndValues.Key>User Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn copyTooltip=\"Copy User Id to clipboard\" copyValue={span.userId}>\n {span.userId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n {span.organizationId && (\n <>\n <DataKeysAndValues.Key>Organization Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn\n copyTooltip=\"Copy Organization Id to clipboard\"\n copyValue={span.organizationId}\n >\n {span.organizationId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n {span.experimentId && (\n <>\n <DataKeysAndValues.Key>Experiment Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn\n copyTooltip=\"Copy Experiment Id to clipboard\"\n copyValue={span.experimentId}\n >\n {span.experimentId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n </>\n )}\n </DataKeysAndValues>\n )}\n\n <div className={cn('grid gap-4', hasContext && 'mt-4')}>\n <SpanPayloadSection\n title=\"Input\"\n icon={<FileInputIcon />}\n raw={span.input}\n hasPreview={hasSpanInputPreview(span)}\n >\n <SpanInputRenderer span={span} />\n </SpanPayloadSection>\n <SpanPayloadSection\n title=\"Output\"\n icon={<FileOutputIcon />}\n raw={getSpanOutputPayload(span)}\n hasPreview={describeSpanOutput(asCoreSpan(span))?.type !== 'json'}\n >\n <SpanOutputRenderer span={span} />\n </SpanPayloadSection>\n <SpanToolsSection span={span} />\n <SpanPayloadSection title=\"Metadata\" icon={<BracesIcon />} raw={span.metadata} hasPreview={false}>\n {null}\n </SpanPayloadSection>\n <SpanPayloadSection\n title=\"Attributes\"\n icon={<BracesIcon />}\n raw={span.attributes}\n hasPreview={describeProcessorPipeline(asCoreSpan(span)) !== undefined}\n >\n <SpanProcessorAttributes span={span} />\n </SpanPayloadSection>\n </div>\n </>\n );\n\n // No extra tab slots → render details directly without the Tabs/TabList wrapper.\n if (!feedbackTabSlot) {\n return <div className={BODY_CLASS}>{detailsBody}</div>;\n }\n\n // Same chrome as the trace column: tab list in a header row, content scrolling beneath it.\n return (\n <Tabs\n defaultTab=\"details\"\n value={activeTab}\n onValueChange={onTabChange}\n className=\"grid min-h-0 flex-1 grid-rows-[auto_1fr]\"\n >\n <DataPanel.Header>\n <TabList variant=\"pill-ghost\" size=\"sm\">\n <Tab value=\"details\">Details</Tab>\n <Tab value=\"feedback\">Feedback{feedbackTabBadge != null && <> ({feedbackTabBadge})</>}</Tab>\n </TabList>\n </DataPanel.Header>\n\n <TabContent value=\"details\" flush>\n <div className={BODY_CLASS}>{detailsBody}</div>\n </TabContent>\n <TabContent value=\"feedback\" flush>\n <div className={BODY_CLASS}>{feedbackTabSlot({ span, traceId, spanId })}</div>\n </TabContent>\n </Tabs>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"span-data-panel-view.cjs.js","names":["cn","DataPanel","TraceIdButton","SpanRunId","SpanSummaryDescription","Button","ExternalLinkIcon","getSpanOutcome","getSpanOutputPayload","getSpanChanges","SpanPayloadSection","SpanErrorRenderer","ArrowLeftRightIcon","SpanProcessorMutations","FileOutputIcon","hasSpanOutputPreview","SpanOutputRenderer","FileInputIcon","hasSpanInputPreview","SpanInputRenderer","SpanAvailableToolsSection","SpanToolsSection","SpanPayloadJsonSection","BracesIcon","_Fragment","SpanOutcomeSummary","SpanErrorDetails","SpanToolCallsSection","isTokenLimitExceeded","Notice","getTokenLimitMessage","SpanModelSummary","SpanProcessorAttributes","Fragment","DataKeysAndValues","Tabs","TabList","Tab","TabContent"],"sources":["../../../../src/domains/traces/components/span-data-panel-view.tsx"],"sourcesContent":["import { ArrowLeftRightIcon, BracesIcon, ExternalLinkIcon, FileInputIcon, FileOutputIcon } from 'lucide-react';\nimport { Fragment } from 'react';\nimport type { ReactNode } from 'react';\nimport type { SpanRecord } from '../types';\nimport { getTokenLimitMessage, isTokenLimitExceeded } from '../utils/span-utils';\nimport { SpanOutcomeSummary } from './span-outcome';\nimport { getSpanChanges, getSpanOutcome } from './span-outcome.utils';\nimport {\n SpanErrorDetails,\n SpanErrorRenderer,\n SpanInputRenderer,\n getSpanOutputPayload,\n hasSpanInputPreview,\n hasSpanOutputPreview,\n SpanOutputRenderer,\n SpanPayloadSection,\n SpanPayloadJsonSection,\n SpanProcessorAttributes,\n SpanProcessorMutations,\n} from './span-payload';\nimport { SpanAvailableToolsSection, SpanToolCallsSection, SpanToolsSection } from './span-payload/span-tools-section';\nimport { SpanRunId, SpanSummaryDescription } from './span-summary-description';\nimport { SpanModelSummary } from './span-token-usage';\nimport { TraceIdButton } from './trace-id-button';\nimport { Button } from '@/ds/components/Button';\nimport { DataKeysAndValues } from '@/ds/components/DataKeysAndValues';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport { Notice } from '@/ds/components/Notice';\nimport { Tab, TabContent, TabList, Tabs } from '@/ds/components/Tabs';\nimport { cn } from '@/lib/utils';\n\n// Mirrors `DataPanel.Content` padding without requiring the Drawer root (this view also renders standalone).\nconst BODY_CLASS = 'min-h-0 flex-1 overflow-y-auto p-2';\n\ntype SpanSection = 'error' | 'changes' | 'output' | 'input' | 'tools' | 'metadata' | 'attributes';\n// Every span reads the same way: how it failed, what it changed, what it received, what it returned,\n// then the rest, with the raw metadata and attributes last.\nconst LEAD: SpanSection[] = ['error', 'changes', 'input', 'output'];\nconst REST: SpanSection[] = ['tools', 'metadata', 'attributes'];\n\nexport interface SpanDataPanelViewProps {\n traceId: string;\n spanId: string;\n /** Full span record. Caller fetches via useSpanDetail. */\n span: SpanRecord | undefined;\n isLoading?: boolean;\n /** Previous/next buttons show only when one is provided; omit both where a span tree already navigates. */\n onPrevious?: () => void;\n onNext?: () => void;\n /** When provided, an × button in the header closes the span column. */\n onClose?: () => void;\n /**\n * When provided, a \"Go to trace\" button in the header calls it with the span's ids.\n * The caller decides where the trace opens (e.g. its own traces route).\n */\n onShowTrace?: (span: { traceId: string; spanId: string }) => void;\n activeTab?: string;\n onTabChange?: (tab: string) => void;\n /**\n * When provided, a \"Feedback\" tab appears; the slot receives the loaded span and renders\n * whatever feedback UI the consumer wants.\n */\n feedbackTabSlot?: (args: { span: SpanRecord; traceId: string; spanId: string }) => ReactNode;\n /** Optional indicator rendered after the \"Feedback\" tab label (e.g. a needs-review dot). */\n feedbackTabBadge?: ReactNode;\n /**\n * Whether this span is the displayed root of the current view (trace root or\n * branch anchor). Controls visibility of trace-level metadata fields. Defaults\n * to `span.parentSpanId == null` (trace case) when omitted.\n */\n isAnchor?: boolean;\n /** Extra classes for the panel root (e.g. flattening the card when nested in the trace panel). */\n className?: string;\n}\n\nexport function SpanDataPanelView({\n traceId,\n spanId,\n span,\n isLoading,\n onPrevious,\n onNext,\n onClose,\n onShowTrace,\n activeTab,\n onTabChange,\n feedbackTabSlot,\n feedbackTabBadge,\n isAnchor,\n className,\n}: SpanDataPanelViewProps) {\n // Not a DataPanel: this is the span column rendered inside `TraceDataPanelView`,\n // which already provides the panel chrome.\n return (\n <section className={cn('flex min-h-0 flex-1 flex-col overflow-hidden', className)}>\n <DataPanel.Header>\n <DataPanel.HeaderContent>\n <DataPanel.Heading>\n Span\n <TraceIdButton id={spanId} maxLength={6} ellipsis={false} />\n </DataPanel.Heading>\n {span?.runId && <SpanRunId runId={span.runId} />}\n {span && <SpanSummaryDescription span={span} />}\n </DataPanel.HeaderContent>\n <DataPanel.HeaderActions>\n {onShowTrace && (\n <Button\n size=\"icon-sm\"\n variant=\"ghost\"\n aria-label=\"Go to trace\"\n tooltip=\"Go to trace\"\n className=\"shrink-0\"\n onClick={() => onShowTrace({ traceId, spanId })}\n >\n <ExternalLinkIcon />\n </Button>\n )}\n {(onPrevious || onNext) && (\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Go to previous span\"\n nextLabel=\"Go to next span\"\n />\n )}\n {onClose && <DataPanel.CloseButton icon=\"x\" onClick={onClose} label=\"Close span\" tooltip=\"Close span\" />}\n </DataPanel.HeaderActions>\n </DataPanel.Header>\n\n {isLoading ? (\n <DataPanel.LoadingData>Loading span details...</DataPanel.LoadingData>\n ) : !span ? (\n <DataPanel.NoData>Span not found.</DataPanel.NoData>\n ) : (\n <SpanDataPanelContent\n span={span}\n traceId={traceId}\n spanId={spanId}\n activeTab={activeTab}\n onTabChange={onTabChange}\n feedbackTabSlot={feedbackTabSlot}\n feedbackTabBadge={feedbackTabBadge}\n isAnchor={isAnchor}\n />\n )}\n </section>\n );\n}\n\nfunction SpanDataPanelContent({\n span,\n traceId,\n spanId,\n activeTab,\n onTabChange,\n feedbackTabSlot,\n feedbackTabBadge,\n isAnchor,\n}: {\n span: SpanRecord;\n traceId: string;\n spanId: string;\n activeTab?: string;\n onTabChange?: (tab: string) => void;\n feedbackTabSlot?: (args: { span: SpanRecord; traceId: string; spanId: string }) => ReactNode;\n feedbackTabBadge?: ReactNode;\n isAnchor?: boolean;\n}) {\n const isRoot = isAnchor ?? span.parentSpanId == null;\n const hasContext =\n isRoot &&\n Boolean(\n span.tags?.length || span.sessionId || span.requestId || span.userId || span.organizationId || span.experimentId,\n );\n const outcome = getSpanOutcome(span);\n // The root span's input and output already tell its story; only a failed or stopped run needs a summary on top.\n const showOutcome = outcome != null && (!isRoot || outcome.tone === 'error' || outcome.tone === 'warning');\n const outputPayload = getSpanOutputPayload(span);\n const evidence = outcome?.evidence === 'output' && outputPayload == null ? undefined : outcome?.evidence;\n const toolCallsInOutcome = showOutcome && evidence === 'toolCalls';\n const changesInOutcome = showOutcome && evidence === 'changes';\n const errorInOutcome = showOutcome && evidence === 'error';\n const changes = getSpanChanges(span);\n\n const sections: Record<SpanSection, ReactNode> = {\n // A failed span says so in the summary on top, with its error; only spans with no summary need the section.\n error: span.error != null && !errorInOutcome && (\n <SpanPayloadSection title=\"Error\" raw={span.error} framed={false}>\n <SpanErrorRenderer span={span} />\n </SpanPayloadSection>\n ),\n // A failed or stopped processor still shows what it changed before it stopped.\n changes: changes.length > 0 && !changesInOutcome && (\n <SpanPayloadSection\n title=\"Changes\"\n icon={<ArrowLeftRightIcon />}\n raw={changes}\n hasPreview\n emphasis={evidence === 'changes'}\n >\n <SpanProcessorMutations span={span} />\n </SpanPayloadSection>\n ),\n output: (\n <SpanPayloadSection\n title=\"Output\"\n icon={<FileOutputIcon />}\n raw={outputPayload}\n hasPreview={hasSpanOutputPreview(span)}\n >\n <SpanOutputRenderer span={span} />\n </SpanPayloadSection>\n ),\n input: (\n <SpanPayloadSection\n title=\"Input\"\n icon={<FileInputIcon />}\n raw={span.input}\n hasPreview={hasSpanInputPreview(span)}\n >\n <SpanInputRenderer span={span} />\n </SpanPayloadSection>\n ),\n // The tool calls already sit in the summary; the tools the model could pick from still read here.\n tools: toolCallsInOutcome ? <SpanAvailableToolsSection span={span} /> : <SpanToolsSection span={span} />,\n metadata: <SpanPayloadJsonSection title=\"Metadata\" icon={<BracesIcon />} raw={span.metadata} />,\n attributes: <SpanPayloadJsonSection title=\"Attributes\" icon={<BracesIcon />} raw={span.attributes} />,\n };\n\n const detailsBody = (\n <>\n {showOutcome && (\n <SpanOutcomeSummary\n outcome={outcome}\n showDetail={!evidence}\n className=\"mb-3\"\n // The error, changes or tool calls prove the headline, so they sit in the notice under it rather than in a section of their own.\n renderProof={\n errorInOutcome\n ? headline => (\n <SpanPayloadSection title=\"Error\" heading={headline} raw={span.error} framed={false} clip={false}>\n <SpanErrorDetails span={span} />\n </SpanPayloadSection>\n )\n : changesInOutcome\n ? headline => (\n <SpanPayloadSection title=\"Changes\" heading={headline} raw={changes} hasPreview>\n <SpanProcessorMutations span={span} />\n </SpanPayloadSection>\n )\n : toolCallsInOutcome\n ? headline => <SpanToolCallsSection span={span} heading={headline} />\n : undefined\n }\n />\n )}\n\n {isTokenLimitExceeded(span) && (\n <div className=\"mb-3\">\n <Notice variant=\"warning\" title=\"Token Limit Exceeded\">\n <Notice.Message>{getTokenLimitMessage(span)}</Notice.Message>\n </Notice>\n </div>\n )}\n\n <SpanModelSummary span={span} className=\"mb-4\" />\n <SpanProcessorAttributes span={span} className=\"mb-4\" />\n\n <div className=\"grid gap-4\">\n {LEAD.map(section => (\n <Fragment key={section}>{sections[section]}</Fragment>\n ))}\n {hasContext && (\n <DataKeysAndValues>\n {/* Anchor-only: rich trace-context fields. Live on the full SpanRecord, not on the\n * lightweight payload, so they only have values once the full span is loaded. */}\n {isRoot && (\n <>\n {span.tags && span.tags.length > 0 && (\n <>\n <DataKeysAndValues.Key>Tags</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{span.tags.join(', ')}</DataKeysAndValues.Value>\n </>\n )}\n {span.sessionId && (\n <>\n <DataKeysAndValues.Key>Session Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn\n copyTooltip=\"Copy Session Id to clipboard\"\n copyValue={span.sessionId}\n >\n {span.sessionId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n {span.requestId && (\n <>\n <DataKeysAndValues.Key>Request Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn\n copyTooltip=\"Copy Request Id to clipboard\"\n copyValue={span.requestId}\n >\n {span.requestId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n {span.userId && (\n <>\n <DataKeysAndValues.Key>User Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn copyTooltip=\"Copy User Id to clipboard\" copyValue={span.userId}>\n {span.userId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n {span.organizationId && (\n <>\n <DataKeysAndValues.Key>Organization Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn\n copyTooltip=\"Copy Organization Id to clipboard\"\n copyValue={span.organizationId}\n >\n {span.organizationId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n {span.experimentId && (\n <>\n <DataKeysAndValues.Key>Experiment Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn\n copyTooltip=\"Copy Experiment Id to clipboard\"\n copyValue={span.experimentId}\n >\n {span.experimentId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n </>\n )}\n </DataKeysAndValues>\n )}\n {REST.map(section => (\n <Fragment key={section}>{sections[section]}</Fragment>\n ))}\n </div>\n </>\n );\n\n // No extra tab slots → render details directly without the Tabs/TabList wrapper.\n if (!feedbackTabSlot) {\n return <div className={BODY_CLASS}>{detailsBody}</div>;\n }\n\n // Same chrome as the trace column: tab list in a header row, content scrolling beneath it.\n return (\n <Tabs\n defaultTab=\"details\"\n value={activeTab}\n onValueChange={onTabChange}\n className=\"grid min-h-0 flex-1 grid-rows-[auto_1fr]\"\n >\n <DataPanel.Header>\n <TabList variant=\"pill-ghost\" size=\"sm\">\n <Tab value=\"details\">Details</Tab>\n <Tab value=\"feedback\">Feedback{feedbackTabBadge != null && <> ({feedbackTabBadge})</>}</Tab>\n </TabList>\n </DataPanel.Header>\n\n <TabContent value=\"details\" flush>\n <div className={BODY_CLASS}>{detailsBody}</div>\n </TabContent>\n <TabContent value=\"feedback\" flush>\n <div className={BODY_CLASS}>{feedbackTabSlot({ span, traceId, spanId })}</div>\n </TabContent>\n </Tabs>\n );\n}\n"],"mappings":"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"}
@@ -6,21 +6,35 @@ import { t as DataPanel } from "../../../DataPanel-CfLkwH2X.js";
6
6
  import { t as TabContent } from "../../../tabs-content-CDCk47md.js";
7
7
  import { t as DataKeysAndValues } from "../../../DataKeysAndValues-B2jquIjh.js";
8
8
  import { getTokenLimitMessage, isTokenLimitExceeded } from "../utils/span-utils.es.js";
9
- import { asCoreSpan, getSpanOutputPayload, hasSpanInputPreview } from "./span-payload/span-payload-registry.es.js";
9
+ import { SpanOutcomeSummary } from "./span-outcome.es.js";
10
+ import { getSpanOutputPayload, hasSpanInputPreview, hasSpanOutputPreview } from "./span-payload/span-payload-registry.es.js";
11
+ import { getSpanChanges, getSpanOutcome } from "./span-outcome.utils.es.js";
10
12
  import { SpanInputRenderer } from "./span-payload/span-input-renderers.es.js";
11
13
  import { SpanOutputRenderer } from "./span-payload/span-output-renderers.es.js";
12
- import { SpanErrorRenderer } from "./span-payload/span-error-renderer.es.js";
13
- import { SpanPayloadSection } from "./span-payload/span-payload-section.es.js";
14
+ import { SpanErrorDetails, SpanErrorRenderer } from "./span-payload/span-error-renderer.es.js";
15
+ import { SpanPayloadJsonSection, SpanPayloadSection } from "./span-payload/span-payload-section.es.js";
14
16
  import { SpanProcessorAttributes } from "./span-payload/span-processor-attributes.es.js";
15
- import { SpanToolsSection } from "./span-payload/span-tools-section.es.js";
17
+ import { SpanProcessorMutations } from "./span-payload/span-processor-mutations.es.js";
18
+ import { SpanAvailableToolsSection, SpanToolCallsSection, SpanToolsSection } from "./span-payload/span-tools-section.es.js";
16
19
  import { SpanRunId, SpanSummaryDescription } from "./span-summary-description.es.js";
17
20
  import { SpanModelSummary } from "./span-token-usage.es.js";
18
21
  import { TraceIdButton } from "./trace-id-button.es.js";
19
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
20
- import { BracesIcon, ExternalLinkIcon, FileInputIcon, FileOutputIcon } from "lucide-react";
21
- import { describeProcessorPipeline, describeSpanOutput } from "@mastra/core/observability";
22
+ import { Fragment } from "react";
23
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
24
+ import { ArrowLeftRightIcon, BracesIcon, ExternalLinkIcon, FileInputIcon, FileOutputIcon } from "lucide-react";
22
25
  // src/domains/traces/components/span-data-panel-view.tsx
23
26
  var BODY_CLASS = "min-h-0 flex-1 overflow-y-auto p-2";
27
+ var LEAD = [
28
+ "error",
29
+ "changes",
30
+ "input",
31
+ "output"
32
+ ];
33
+ var REST = [
34
+ "tools",
35
+ "metadata",
36
+ "attributes"
37
+ ];
24
38
  function SpanDataPanelView({ traceId, spanId, span, isLoading, onPrevious, onNext, onClose, onShowTrace, activeTab, onTabChange, feedbackTabSlot, feedbackTabBadge, isAnchor, className }) {
25
39
  return /* @__PURE__ */ jsxs("section", {
26
40
  className: cn("flex min-h-0 flex-1 flex-col overflow-hidden", className),
@@ -70,8 +84,80 @@ function SpanDataPanelView({ traceId, spanId, span, isLoading, onPrevious, onNex
70
84
  });
71
85
  }
72
86
  function SpanDataPanelContent({ span, traceId, spanId, activeTab, onTabChange, feedbackTabSlot, feedbackTabBadge, isAnchor }) {
73
- const hasContext = (isAnchor ?? span.parentSpanId == null) && Boolean(span.tags?.length || span.sessionId || span.requestId || span.userId || span.organizationId || span.experimentId);
74
- const detailsBody = /* @__PURE__ */ jsxs(Fragment, { children: [
87
+ const isRoot = isAnchor ?? span.parentSpanId == null;
88
+ const hasContext = isRoot && Boolean(span.tags?.length || span.sessionId || span.requestId || span.userId || span.organizationId || span.experimentId);
89
+ const outcome = getSpanOutcome(span);
90
+ const showOutcome = outcome != null && (!isRoot || outcome.tone === "error" || outcome.tone === "warning");
91
+ const outputPayload = getSpanOutputPayload(span);
92
+ const evidence = outcome?.evidence === "output" && outputPayload == null ? void 0 : outcome?.evidence;
93
+ const toolCallsInOutcome = showOutcome && evidence === "toolCalls";
94
+ const changesInOutcome = showOutcome && evidence === "changes";
95
+ const errorInOutcome = showOutcome && evidence === "error";
96
+ const changes = getSpanChanges(span);
97
+ const sections = {
98
+ error: span.error != null && !errorInOutcome && /* @__PURE__ */ jsx(SpanPayloadSection, {
99
+ title: "Error",
100
+ raw: span.error,
101
+ framed: false,
102
+ children: /* @__PURE__ */ jsx(SpanErrorRenderer, { span })
103
+ }),
104
+ changes: changes.length > 0 && !changesInOutcome && /* @__PURE__ */ jsx(SpanPayloadSection, {
105
+ title: "Changes",
106
+ icon: /* @__PURE__ */ jsx(ArrowLeftRightIcon, {}),
107
+ raw: changes,
108
+ hasPreview: true,
109
+ emphasis: evidence === "changes",
110
+ children: /* @__PURE__ */ jsx(SpanProcessorMutations, { span })
111
+ }),
112
+ output: /* @__PURE__ */ jsx(SpanPayloadSection, {
113
+ title: "Output",
114
+ icon: /* @__PURE__ */ jsx(FileOutputIcon, {}),
115
+ raw: outputPayload,
116
+ hasPreview: hasSpanOutputPreview(span),
117
+ children: /* @__PURE__ */ jsx(SpanOutputRenderer, { span })
118
+ }),
119
+ input: /* @__PURE__ */ jsx(SpanPayloadSection, {
120
+ title: "Input",
121
+ icon: /* @__PURE__ */ jsx(FileInputIcon, {}),
122
+ raw: span.input,
123
+ hasPreview: hasSpanInputPreview(span),
124
+ children: /* @__PURE__ */ jsx(SpanInputRenderer, { span })
125
+ }),
126
+ tools: toolCallsInOutcome ? /* @__PURE__ */ jsx(SpanAvailableToolsSection, { span }) : /* @__PURE__ */ jsx(SpanToolsSection, { span }),
127
+ metadata: /* @__PURE__ */ jsx(SpanPayloadJsonSection, {
128
+ title: "Metadata",
129
+ icon: /* @__PURE__ */ jsx(BracesIcon, {}),
130
+ raw: span.metadata
131
+ }),
132
+ attributes: /* @__PURE__ */ jsx(SpanPayloadJsonSection, {
133
+ title: "Attributes",
134
+ icon: /* @__PURE__ */ jsx(BracesIcon, {}),
135
+ raw: span.attributes
136
+ })
137
+ };
138
+ const detailsBody = /* @__PURE__ */ jsxs(Fragment$1, { children: [
139
+ showOutcome && /* @__PURE__ */ jsx(SpanOutcomeSummary, {
140
+ outcome,
141
+ showDetail: !evidence,
142
+ className: "mb-3",
143
+ renderProof: errorInOutcome ? (headline) => /* @__PURE__ */ jsx(SpanPayloadSection, {
144
+ title: "Error",
145
+ heading: headline,
146
+ raw: span.error,
147
+ framed: false,
148
+ clip: false,
149
+ children: /* @__PURE__ */ jsx(SpanErrorDetails, { span })
150
+ }) : changesInOutcome ? (headline) => /* @__PURE__ */ jsx(SpanPayloadSection, {
151
+ title: "Changes",
152
+ heading: headline,
153
+ raw: changes,
154
+ hasPreview: true,
155
+ children: /* @__PURE__ */ jsx(SpanProcessorMutations, { span })
156
+ }) : toolCallsInOutcome ? (headline) => /* @__PURE__ */ jsx(SpanToolCallsSection, {
157
+ span,
158
+ heading: headline
159
+ }) : void 0
160
+ }),
75
161
  isTokenLimitExceeded(span) && /* @__PURE__ */ jsx("div", {
76
162
  className: "mb-3",
77
163
  children: /* @__PURE__ */ jsx(Notice, {
@@ -80,77 +166,47 @@ function SpanDataPanelContent({ span, traceId, spanId, activeTab, onTabChange, f
80
166
  children: /* @__PURE__ */ jsx(Notice.Message, { children: getTokenLimitMessage(span) })
81
167
  })
82
168
  }),
83
- /* @__PURE__ */ jsx(SpanPayloadSection, {
84
- title: "Error",
85
- raw: span.error,
86
- framed: false,
87
- className: "mb-3",
88
- children: /* @__PURE__ */ jsx(SpanErrorRenderer, { span })
89
- }),
90
169
  /* @__PURE__ */ jsx(SpanModelSummary, {
91
170
  span,
92
171
  className: "mb-4"
93
172
  }),
94
- hasContext && /* @__PURE__ */ jsx(DataKeysAndValues, { children: (isAnchor ?? span.parentSpanId == null) && /* @__PURE__ */ jsxs(Fragment, { children: [
95
- span.tags && span.tags.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(DataKeysAndValues.Key, { children: "Tags" }), /* @__PURE__ */ jsx(DataKeysAndValues.Value, { children: span.tags.join(", ") })] }),
96
- span.sessionId && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(DataKeysAndValues.Key, { children: "Session Id" }), /* @__PURE__ */ jsx(DataKeysAndValues.ValueWithCopyBtn, {
97
- copyTooltip: "Copy Session Id to clipboard",
98
- copyValue: span.sessionId,
99
- children: span.sessionId
100
- })] }),
101
- span.requestId && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(DataKeysAndValues.Key, { children: "Request Id" }), /* @__PURE__ */ jsx(DataKeysAndValues.ValueWithCopyBtn, {
102
- copyTooltip: "Copy Request Id to clipboard",
103
- copyValue: span.requestId,
104
- children: span.requestId
105
- })] }),
106
- span.userId && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(DataKeysAndValues.Key, { children: "User Id" }), /* @__PURE__ */ jsx(DataKeysAndValues.ValueWithCopyBtn, {
107
- copyTooltip: "Copy User Id to clipboard",
108
- copyValue: span.userId,
109
- children: span.userId
110
- })] }),
111
- span.organizationId && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(DataKeysAndValues.Key, { children: "Organization Id" }), /* @__PURE__ */ jsx(DataKeysAndValues.ValueWithCopyBtn, {
112
- copyTooltip: "Copy Organization Id to clipboard",
113
- copyValue: span.organizationId,
114
- children: span.organizationId
115
- })] }),
116
- span.experimentId && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(DataKeysAndValues.Key, { children: "Experiment Id" }), /* @__PURE__ */ jsx(DataKeysAndValues.ValueWithCopyBtn, {
117
- copyTooltip: "Copy Experiment Id to clipboard",
118
- copyValue: span.experimentId,
119
- children: span.experimentId
120
- })] })
121
- ] }) }),
173
+ /* @__PURE__ */ jsx(SpanProcessorAttributes, {
174
+ span,
175
+ className: "mb-4"
176
+ }),
122
177
  /* @__PURE__ */ jsxs("div", {
123
- className: cn("grid gap-4", hasContext && "mt-4"),
178
+ className: "grid gap-4",
124
179
  children: [
125
- /* @__PURE__ */ jsx(SpanPayloadSection, {
126
- title: "Input",
127
- icon: /* @__PURE__ */ jsx(FileInputIcon, {}),
128
- raw: span.input,
129
- hasPreview: hasSpanInputPreview(span),
130
- children: /* @__PURE__ */ jsx(SpanInputRenderer, { span })
131
- }),
132
- /* @__PURE__ */ jsx(SpanPayloadSection, {
133
- title: "Output",
134
- icon: /* @__PURE__ */ jsx(FileOutputIcon, {}),
135
- raw: getSpanOutputPayload(span),
136
- hasPreview: describeSpanOutput(asCoreSpan(span))?.type !== "json",
137
- children: /* @__PURE__ */ jsx(SpanOutputRenderer, { span })
138
- }),
139
- /* @__PURE__ */ jsx(SpanToolsSection, { span }),
140
- /* @__PURE__ */ jsx(SpanPayloadSection, {
141
- title: "Metadata",
142
- icon: /* @__PURE__ */ jsx(BracesIcon, {}),
143
- raw: span.metadata,
144
- hasPreview: false,
145
- children: null
146
- }),
147
- /* @__PURE__ */ jsx(SpanPayloadSection, {
148
- title: "Attributes",
149
- icon: /* @__PURE__ */ jsx(BracesIcon, {}),
150
- raw: span.attributes,
151
- hasPreview: describeProcessorPipeline(asCoreSpan(span)) !== void 0,
152
- children: /* @__PURE__ */ jsx(SpanProcessorAttributes, { span })
153
- })
180
+ LEAD.map((section) => /* @__PURE__ */ jsx(Fragment, { children: sections[section] }, section)),
181
+ hasContext && /* @__PURE__ */ jsx(DataKeysAndValues, { children: isRoot && /* @__PURE__ */ jsxs(Fragment$1, { children: [
182
+ span.tags && span.tags.length > 0 && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(DataKeysAndValues.Key, { children: "Tags" }), /* @__PURE__ */ jsx(DataKeysAndValues.Value, { children: span.tags.join(", ") })] }),
183
+ span.sessionId && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(DataKeysAndValues.Key, { children: "Session Id" }), /* @__PURE__ */ jsx(DataKeysAndValues.ValueWithCopyBtn, {
184
+ copyTooltip: "Copy Session Id to clipboard",
185
+ copyValue: span.sessionId,
186
+ children: span.sessionId
187
+ })] }),
188
+ span.requestId && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(DataKeysAndValues.Key, { children: "Request Id" }), /* @__PURE__ */ jsx(DataKeysAndValues.ValueWithCopyBtn, {
189
+ copyTooltip: "Copy Request Id to clipboard",
190
+ copyValue: span.requestId,
191
+ children: span.requestId
192
+ })] }),
193
+ span.userId && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(DataKeysAndValues.Key, { children: "User Id" }), /* @__PURE__ */ jsx(DataKeysAndValues.ValueWithCopyBtn, {
194
+ copyTooltip: "Copy User Id to clipboard",
195
+ copyValue: span.userId,
196
+ children: span.userId
197
+ })] }),
198
+ span.organizationId && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(DataKeysAndValues.Key, { children: "Organization Id" }), /* @__PURE__ */ jsx(DataKeysAndValues.ValueWithCopyBtn, {
199
+ copyTooltip: "Copy Organization Id to clipboard",
200
+ copyValue: span.organizationId,
201
+ children: span.organizationId
202
+ })] }),
203
+ span.experimentId && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(DataKeysAndValues.Key, { children: "Experiment Id" }), /* @__PURE__ */ jsx(DataKeysAndValues.ValueWithCopyBtn, {
204
+ copyTooltip: "Copy Experiment Id to clipboard",
205
+ copyValue: span.experimentId,
206
+ children: span.experimentId
207
+ })] })
208
+ ] }) }),
209
+ REST.map((section) => /* @__PURE__ */ jsx(Fragment, { children: sections[section] }, section))
154
210
  ]
155
211
  })
156
212
  ] });
@@ -172,7 +228,7 @@ function SpanDataPanelContent({ span, traceId, spanId, activeTab, onTabChange, f
172
228
  children: "Details"
173
229
  }), /* @__PURE__ */ jsxs(Tab, {
174
230
  value: "feedback",
175
- children: ["Feedback", feedbackTabBadge != null && /* @__PURE__ */ jsxs(Fragment, { children: [
231
+ children: ["Feedback", feedbackTabBadge != null && /* @__PURE__ */ jsxs(Fragment$1, { children: [
176
232
  " (",
177
233
  feedbackTabBadge,
178
234
  ")"