@mastra/playground-ui 57.0.0 → 58.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (763) hide show
  1. package/README.md +25 -0
  2. package/dist/{Button-KUj0U-5I.js → Button-B8nF87ai.js} +2 -8
  3. package/dist/Button-B8nF87ai.js.map +1 -0
  4. package/dist/{Button-MMZPEb_q.cjs → Button-BAMnPqos.cjs} +1 -7
  5. package/dist/Button-BAMnPqos.cjs.map +1 -0
  6. package/dist/{Card-DwGasv0K.cjs → Card-BbwF20OW.cjs} +3 -3
  7. package/dist/Card-BbwF20OW.cjs.map +1 -0
  8. package/dist/{Card-B_buJ5yF.js → Card-DmT57Pve.js} +3 -3
  9. package/dist/Card-DmT57Pve.js.map +1 -0
  10. package/dist/{EmptyState-DiSP6UIy.cjs → EmptyState-2XQgeju6.cjs} +12 -3
  11. package/dist/EmptyState-2XQgeju6.cjs.map +1 -0
  12. package/dist/{EmptyState-B6cyZw6m.js → EmptyState-Bc4nJ9QH.js} +13 -4
  13. package/dist/EmptyState-Bc4nJ9QH.js.map +1 -0
  14. package/dist/{Notice-CPyYcX5J.cjs → Notice-AUNd8fqT.cjs} +2 -2
  15. package/dist/{Notice-CPyYcX5J.cjs.map → Notice-AUNd8fqT.cjs.map} +1 -1
  16. package/dist/{Notice-KC18b8Nd.js → Notice-WT8G4OA6.js} +2 -2
  17. package/dist/{Notice-KC18b8Nd.js.map → Notice-WT8G4OA6.js.map} +1 -1
  18. package/dist/{ask-user-DaRRR4qQ.cjs → ask-user-BPpgiE7k.cjs} +3 -3
  19. package/dist/{ask-user-DaRRR4qQ.cjs.map → ask-user-BPpgiE7k.cjs.map} +1 -1
  20. package/dist/{ask-user-C4DTzEQF.js → ask-user-jDUt7hgT.js} +3 -3
  21. package/dist/{ask-user-C4DTzEQF.js.map → ask-user-jDUt7hgT.js.map} +1 -1
  22. package/dist/buttons-group.css +2 -14
  23. package/dist/{chat-notification-DeKD1Ifx.js → chat-notification-CmdRGO_D.js} +2 -2
  24. package/dist/{chat-notification-DeKD1Ifx.js.map → chat-notification-CmdRGO_D.js.map} +1 -1
  25. package/dist/{chat-notification-C5Ox5tuS.cjs → chat-notification-DJykWtoj.cjs} +2 -2
  26. package/dist/{chat-notification-C5Ox5tuS.cjs.map → chat-notification-DJykWtoj.cjs.map} +1 -1
  27. package/dist/{chat-signal-DiAHks6_.js → chat-signal-Vg8pGXwH.js} +2 -2
  28. package/dist/{chat-signal-DiAHks6_.js.map → chat-signal-Vg8pGXwH.js.map} +1 -1
  29. package/dist/{chat-signal-ClyJeml8.cjs → chat-signal-xs3FkPts.cjs} +2 -2
  30. package/dist/{chat-signal-ClyJeml8.cjs.map → chat-signal-xs3FkPts.cjs.map} +1 -1
  31. package/dist/{code-block-D37olB3O.js → code-block-BD2N5Yi2.js} +5 -5
  32. package/dist/{code-block-D37olB3O.js.map → code-block-BD2N5Yi2.js.map} +1 -1
  33. package/dist/{code-block-BoTq0TMr.cjs → code-block-fI67m2KV.cjs} +5 -5
  34. package/dist/{code-block-BoTq0TMr.cjs.map → code-block-fI67m2KV.cjs.map} +1 -1
  35. package/dist/{code-editor-BQTDma1I.js → code-editor-C-0srcj0.js} +4 -3
  36. package/dist/code-editor-C-0srcj0.js.map +1 -0
  37. package/dist/{code-editor-BfoJXq9l.cjs → code-editor-CFu_BYpQ.cjs} +4 -3
  38. package/dist/code-editor-CFu_BYpQ.cjs.map +1 -0
  39. package/dist/{combobox-Bn_uyUSB.cjs → combobox-BoSB-muq.cjs} +17 -9
  40. package/dist/combobox-BoSB-muq.cjs.map +1 -0
  41. package/dist/{combobox-Cykfy5wc.js → combobox-Cd0JPUQW.js} +17 -9
  42. package/dist/combobox-Cd0JPUQW.js.map +1 -0
  43. package/dist/{combobox-styles-iuJUkJEQ.js → combobox-styles-BhUqhOvz.js} +4 -2
  44. package/dist/combobox-styles-BhUqhOvz.js.map +1 -0
  45. package/dist/{combobox-styles-CSsS2LEx.cjs → combobox-styles-LHrC0tU0.cjs} +4 -2
  46. package/dist/combobox-styles-LHrC0tU0.cjs.map +1 -0
  47. package/dist/{command-B7H-emho.cjs → command-AVQzLcYR.cjs} +2 -2
  48. package/dist/{command-B7H-emho.cjs.map → command-AVQzLcYR.cjs.map} +1 -1
  49. package/dist/{command-Bmy4PznC.js → command-DhiJvyMM.js} +2 -2
  50. package/dist/{command-Bmy4PznC.js.map → command-DhiJvyMM.js.map} +1 -1
  51. package/dist/components/AlertDialog.cjs.js +2 -2
  52. package/dist/components/AlertDialog.cjs.js.map +1 -1
  53. package/dist/components/AlertDialog.es.js +3 -3
  54. package/dist/components/AlertDialog.es.js.map +1 -1
  55. package/dist/components/Button.cjs.js +1 -1
  56. package/dist/components/Button.es.js +2 -2
  57. package/dist/components/Card.cjs.js +1 -1
  58. package/dist/components/Card.es.js +1 -1
  59. package/dist/components/ClampedText.cjs.js +1 -1
  60. package/dist/components/ClampedText.es.js +1 -1
  61. package/dist/components/CodeBlock.cjs.js +1 -1
  62. package/dist/components/CodeBlock.es.js +1 -1
  63. package/dist/components/CodeEditor.cjs.js +1 -1
  64. package/dist/components/CodeEditor.es.js +1 -1
  65. package/dist/components/Columns.cjs.js +2 -106
  66. package/dist/components/Columns.cjs.js.map +1 -1
  67. package/dist/components/Columns.es.js +4 -107
  68. package/dist/components/Columns.es.js.map +1 -1
  69. package/dist/components/Combobox.cjs.js +2 -2
  70. package/dist/components/Combobox.es.js +2 -2
  71. package/dist/components/Command.cjs.js +1 -1
  72. package/dist/components/Command.es.js +1 -1
  73. package/dist/components/CommandPalette.cjs.js +1 -1
  74. package/dist/components/CommandPalette.es.js +1 -1
  75. package/dist/components/Comment.cjs.js +3 -3
  76. package/dist/components/Comment.cjs.js.map +1 -1
  77. package/dist/components/Comment.es.js +3 -3
  78. package/dist/components/Comment.es.js.map +1 -1
  79. package/dist/components/CopyButton.cjs.js +1 -1
  80. package/dist/components/CopyButton.es.js +1 -1
  81. package/dist/components/DataCodeSection.cjs.js +1 -1
  82. package/dist/components/DataCodeSection.es.js +1 -1
  83. package/dist/components/DataDetailsPanel.cjs.js +2 -2
  84. package/dist/components/DataDetailsPanel.es.js +2 -2
  85. package/dist/components/DataKeysAndValues.cjs.js +1 -1
  86. package/dist/components/DataKeysAndValues.es.js +1 -1
  87. package/dist/components/DataList.cjs.js +3 -3
  88. package/dist/components/DataList.es.js +3 -3
  89. package/dist/components/DataPanel.cjs.js +1 -1
  90. package/dist/components/DataPanel.es.js +1 -1
  91. package/dist/components/DateRangeTimeline.cjs.js +1 -1
  92. package/dist/components/DateRangeTimeline.es.js +1 -1
  93. package/dist/components/DateTimePicker.cjs.js +10 -4
  94. package/dist/components/DateTimePicker.cjs.js.map +1 -1
  95. package/dist/components/DateTimePicker.es.js +10 -4
  96. package/dist/components/DateTimePicker.es.js.map +1 -1
  97. package/dist/components/DateTimeRangePicker.cjs.js +1 -1
  98. package/dist/components/DateTimeRangePicker.es.js +1 -1
  99. package/dist/components/Dialog.cjs.js +2 -2
  100. package/dist/components/Dialog.es.js +3 -3
  101. package/dist/components/DisabledFeatureButton.cjs.js +1 -1
  102. package/dist/components/DisabledFeatureButton.es.js +1 -1
  103. package/dist/components/Drawer.cjs.js +1 -1
  104. package/dist/components/Drawer.es.js +1 -1
  105. package/dist/components/EmptyState.cjs.js +1 -1
  106. package/dist/components/EmptyState.es.js +1 -1
  107. package/dist/components/EnvironmentVariablesEditor.cjs.js +4 -4
  108. package/dist/components/EnvironmentVariablesEditor.es.js +4 -4
  109. package/dist/components/ErrorBoundary.cjs.js +1 -1
  110. package/dist/components/ErrorBoundary.es.js +1 -1
  111. package/dist/components/FilterBar.cjs.js +3 -3
  112. package/dist/components/FilterBar.es.js +4 -4
  113. package/dist/components/FormFieldBlocks.cjs.js +4 -4
  114. package/dist/components/FormFieldBlocks.es.js +4 -4
  115. package/dist/components/Input.cjs.js +1 -1
  116. package/dist/components/Input.es.js +1 -1
  117. package/dist/components/InputGroup.cjs.js +1 -1
  118. package/dist/components/InputGroup.es.js +1 -1
  119. package/dist/components/JSONSchemaForm.cjs.js +3 -3
  120. package/dist/components/JSONSchemaForm.es.js +3 -3
  121. package/dist/components/ListSearch.cjs.js +1 -1
  122. package/dist/components/ListSearch.es.js +1 -1
  123. package/dist/components/LogsDataList.cjs.js +1 -3
  124. package/dist/components/LogsDataList.cjs.js.map +1 -1
  125. package/dist/components/LogsDataList.es.js +1 -3
  126. package/dist/components/LogsDataList.es.js.map +1 -1
  127. package/dist/components/MainSidebar.cjs.js +125 -11
  128. package/dist/components/MainSidebar.cjs.js.map +1 -1
  129. package/dist/components/MainSidebar.es.js +120 -1
  130. package/dist/components/MainSidebar.es.js.map +1 -1
  131. package/dist/components/MarkdownRenderer.cjs.js +1 -1
  132. package/dist/components/MarkdownRenderer.es.js +1 -1
  133. package/dist/components/Message.cjs.js +1 -1
  134. package/dist/components/Message.es.js +1 -1
  135. package/dist/components/MetricsCard.cjs.js +1 -1
  136. package/dist/components/MetricsCard.es.js +1 -1
  137. package/dist/components/MetricsKpiCard.cjs.js +1 -1
  138. package/dist/components/MetricsKpiCard.es.js +1 -1
  139. package/dist/components/Notice.cjs.js +1 -1
  140. package/dist/components/Notice.es.js +1 -1
  141. package/dist/components/PageHeader.cjs.js +1 -1
  142. package/dist/components/PageHeader.es.js +1 -1
  143. package/dist/components/PageLayout.cjs.js +26 -3
  144. package/dist/components/PageLayout.cjs.js.map +1 -1
  145. package/dist/components/PageLayout.es.js +27 -4
  146. package/dist/components/PageLayout.es.js.map +1 -1
  147. package/dist/components/PrevNextNav.cjs.js +1 -1
  148. package/dist/components/PrevNextNav.es.js +1 -1
  149. package/dist/components/PropertyFilter.cjs.js +5 -5
  150. package/dist/components/PropertyFilter.cjs.js.map +1 -1
  151. package/dist/components/PropertyFilter.es.js +6 -6
  152. package/dist/components/PropertyFilter.es.js.map +1 -1
  153. package/dist/components/RuleBuilder.cjs.js +3 -3
  154. package/dist/components/RuleBuilder.es.js +3 -3
  155. package/dist/components/Select.cjs.js +1 -1
  156. package/dist/components/Select.es.js +1 -1
  157. package/dist/components/SideDialog.cjs.js +3 -3
  158. package/dist/components/SideDialog.es.js +3 -3
  159. package/dist/components/Tabs.cjs.js +3 -3
  160. package/dist/components/Tabs.es.js +3 -3
  161. package/dist/components/Textarea.cjs.js +1 -1
  162. package/dist/components/Textarea.es.js +1 -1
  163. package/dist/components/ThreadList.cjs.js +1 -1
  164. package/dist/components/ThreadList.es.js +1 -1
  165. package/dist/components/Truncate.cjs.js +1 -1
  166. package/dist/components/Truncate.es.js +1 -1
  167. package/dist/components/Workflow.cjs.js +4 -4
  168. package/dist/components/Workflow.es.js +4 -4
  169. package/dist/components/ai/ask-user.cjs.js +1 -1
  170. package/dist/components/ai/ask-user.es.js +1 -1
  171. package/dist/components/ai/chat-event.cjs.js +3 -3
  172. package/dist/components/ai/chat-event.es.js +4 -4
  173. package/dist/components/ai/plan.cjs.js +2 -2
  174. package/dist/components/ai/plan.es.js +2 -2
  175. package/dist/components/ai/tool-approval.cjs.js +1 -1
  176. package/dist/components/ai/tool-approval.es.js +1 -1
  177. package/dist/components/ai/tool-call.cjs.js +2 -2
  178. package/dist/components/ai/tool-call.es.js +3 -3
  179. package/dist/{copy-button-B5ZCtnTb.cjs → copy-button-D2MTGxq_.cjs} +2 -2
  180. package/dist/{copy-button-B5ZCtnTb.cjs.map → copy-button-D2MTGxq_.cjs.map} +1 -1
  181. package/dist/{copy-button-DZqxEuiE.js → copy-button-DcZ1mdw4.js} +2 -2
  182. package/dist/{copy-button-DZqxEuiE.js.map → copy-button-DcZ1mdw4.js.map} +1 -1
  183. package/dist/{data-code-section-DJRr65hS.js → data-code-section-C75shCII.js} +5 -5
  184. package/dist/{data-code-section-DJRr65hS.js.map → data-code-section-C75shCII.js.map} +1 -1
  185. package/dist/{data-code-section-iXzoOYMX.cjs → data-code-section-DzLc9O0B.cjs} +5 -5
  186. package/dist/{data-code-section-iXzoOYMX.cjs.map → data-code-section-DzLc9O0B.cjs.map} +1 -1
  187. package/dist/{data-keys-and-values-DhC4U4Yl.js → data-keys-and-values-BTYDB-K2.js} +3 -20
  188. package/dist/data-keys-and-values-BTYDB-K2.js.map +1 -0
  189. package/dist/{data-keys-and-values-BduKvvC5.cjs → data-keys-and-values-CMJ9zHKm.cjs} +3 -20
  190. package/dist/data-keys-and-values-CMJ9zHKm.cjs.map +1 -0
  191. package/dist/{data-list-DSbuTWLI.cjs → data-list-CH3HAhK5.cjs} +5 -5
  192. package/dist/data-list-CH3HAhK5.cjs.map +1 -0
  193. package/dist/{data-list-Cn0Ls4l2.js → data-list-DXjH5wkB.js} +5 -5
  194. package/dist/data-list-DXjH5wkB.js.map +1 -0
  195. package/dist/{data-list-spacer-C0YimRXC.js → data-list-spacer-BQ4_YeyT.js} +2 -2
  196. package/dist/{data-list-spacer-C0YimRXC.js.map → data-list-spacer-BQ4_YeyT.js.map} +1 -1
  197. package/dist/{data-list-spacer-DUBpzv_H.cjs → data-list-spacer-GIVW2hB1.cjs} +2 -2
  198. package/dist/{data-list-spacer-DUBpzv_H.cjs.map → data-list-spacer-GIVW2hB1.cjs.map} +1 -1
  199. package/dist/{data-panel-Bd_Xsz-W.cjs → data-panel-CIu6JToM.cjs} +3 -3
  200. package/dist/{data-panel-Bd_Xsz-W.cjs.map → data-panel-CIu6JToM.cjs.map} +1 -1
  201. package/dist/{data-panel-Y7wD0xlR.js → data-panel-CPZ2GuZN.js} +3 -3
  202. package/dist/{data-panel-Y7wD0xlR.js.map → data-panel-CPZ2GuZN.js.map} +1 -1
  203. package/dist/{date-time-range-picker-D2g3RU5B.cjs → date-time-range-picker-BCzvSYx3.cjs} +3 -3
  204. package/dist/{date-time-range-picker-D2g3RU5B.cjs.map → date-time-range-picker-BCzvSYx3.cjs.map} +1 -1
  205. package/dist/{date-time-range-picker-Cb86jLFc.js → date-time-range-picker-C-t3Kdpk.js} +3 -3
  206. package/dist/{date-time-range-picker-Cb86jLFc.js.map → date-time-range-picker-C-t3Kdpk.js.map} +1 -1
  207. package/dist/{dialog-DMOXPT0N.js → dialog-Dtfe1ylw.js} +5 -5
  208. package/dist/dialog-Dtfe1ylw.js.map +1 -0
  209. package/dist/{dialog-Bilo4jEU.cjs → dialog-Vvcjm0rZ.cjs} +4 -4
  210. package/dist/dialog-Vvcjm0rZ.cjs.map +1 -0
  211. package/dist/domains/auth/components/permission-denied.cjs.js +22 -0
  212. package/dist/domains/auth/components/permission-denied.cjs.js.map +1 -0
  213. package/dist/domains/auth/components/permission-denied.d.ts +2 -0
  214. package/dist/domains/auth/components/permission-denied.es.js +18 -0
  215. package/dist/domains/auth/components/permission-denied.es.js.map +1 -0
  216. package/dist/domains/auth/components/session-expired.cjs.js +40 -0
  217. package/dist/domains/auth/components/session-expired.cjs.js.map +1 -0
  218. package/dist/domains/auth/components/session-expired.d.ts +2 -0
  219. package/dist/domains/auth/components/session-expired.es.js +36 -0
  220. package/dist/domains/auth/components/session-expired.es.js.map +1 -0
  221. package/dist/domains/auth/services/sso-login.cjs.js +28 -0
  222. package/dist/domains/auth/services/sso-login.cjs.js.map +1 -0
  223. package/dist/domains/auth/services/sso-login.d.ts +2 -0
  224. package/dist/domains/auth/services/sso-login.es.js +24 -0
  225. package/dist/domains/auth/services/sso-login.es.js.map +1 -0
  226. package/dist/domains/chat/attachments/attachment-preview-dialog.cjs.js +2 -3
  227. package/dist/domains/chat/attachments/attachment-preview-dialog.cjs.js.map +1 -1
  228. package/dist/domains/chat/attachments/attachment-preview-dialog.es.js +2 -3
  229. package/dist/domains/chat/attachments/attachment-preview-dialog.es.js.map +1 -1
  230. package/dist/domains/chat/attachments/composer-attachment.cjs.js +1 -2
  231. package/dist/domains/chat/attachments/composer-attachment.cjs.js.map +1 -1
  232. package/dist/domains/chat/attachments/composer-attachment.es.js +1 -2
  233. package/dist/domains/chat/attachments/composer-attachment.es.js.map +1 -1
  234. package/dist/domains/chat/components/badge-wrapper.cjs.js +1 -1
  235. package/dist/domains/chat/components/badge-wrapper.es.js +1 -1
  236. package/dist/domains/chat/components/network-choice-metadata-dialog.cjs.js +3 -3
  237. package/dist/domains/chat/components/network-choice-metadata-dialog.es.js +3 -3
  238. package/dist/domains/chat/messages/notification-signal-notice.cjs.js +1 -1
  239. package/dist/domains/chat/messages/notification-signal-notice.es.js +1 -1
  240. package/dist/domains/chat/messages/reasoning.cjs.js +1 -1
  241. package/dist/domains/chat/messages/reasoning.es.js +1 -1
  242. package/dist/domains/chat/messages/renderers/message-text.cjs.js +2 -2
  243. package/dist/domains/chat/messages/renderers/message-text.es.js +2 -2
  244. package/dist/domains/chat/messages/renderers/status-renderers.cjs.js +1 -1
  245. package/dist/domains/chat/messages/renderers/status-renderers.es.js +1 -1
  246. package/dist/domains/chat/messages/signal-badge.cjs.js +1 -1
  247. package/dist/domains/chat/messages/signal-badge.es.js +1 -1
  248. package/dist/domains/chat/messages/tripwire-notice.cjs.js +1 -1
  249. package/dist/domains/chat/messages/tripwire-notice.es.js +1 -1
  250. package/dist/domains/chat/tools/badges/ask-user-badge.cjs.js +1 -1
  251. package/dist/domains/chat/tools/badges/ask-user-badge.es.js +1 -1
  252. package/dist/domains/chat/tools/badges/code-mode-badge.cjs.js +2 -2
  253. package/dist/domains/chat/tools/badges/code-mode-badge.es.js +2 -2
  254. package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +1 -1
  255. package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +1 -1
  256. package/dist/domains/chat/tools/badges/observation-renderer.cjs.js +1 -1
  257. package/dist/domains/chat/tools/badges/observation-renderer.es.js +1 -1
  258. package/dist/domains/chat/tools/badges/tool-approval-buttons.cjs.js +1 -1
  259. package/dist/domains/chat/tools/badges/tool-approval-buttons.es.js +1 -1
  260. package/dist/domains/logs/components/log-details-view.cjs.js +2 -2
  261. package/dist/domains/logs/components/log-details-view.es.js +2 -2
  262. package/dist/domains/logs/components/logs-error-content.cjs.js +6 -7
  263. package/dist/domains/logs/components/logs-error-content.cjs.js.map +1 -1
  264. package/dist/domains/logs/components/logs-error-content.es.js +4 -5
  265. package/dist/domains/logs/components/logs-error-content.es.js.map +1 -1
  266. package/dist/domains/logs/components/logs-list-view.cjs.js +1 -1
  267. package/dist/domains/logs/components/logs-list-view.es.js +1 -1
  268. package/dist/domains/logs/components/logs-toolbar.cjs.js +1 -1
  269. package/dist/domains/logs/components/logs-toolbar.es.js +1 -1
  270. package/dist/domains/logs/components/no-logs-info.cjs.js +2 -2
  271. package/dist/domains/logs/components/no-logs-info.es.js +2 -2
  272. package/dist/domains/memory/components/flame-graph.cjs.js +1 -1
  273. package/dist/domains/memory/components/flame-graph.es.js +1 -1
  274. package/dist/domains/memory/components/memory-studio-panel.cjs.js +1 -1
  275. package/dist/domains/memory/components/memory-studio-panel.es.js +1 -1
  276. package/dist/domains/memory/components/observation-detail-view.cjs.js +1 -1
  277. package/dist/domains/memory/components/observation-detail-view.es.js +1 -1
  278. package/dist/domains/metrics/components/card-action-buttons.cjs.js +1 -1
  279. package/dist/domains/metrics/components/card-action-buttons.es.js +1 -1
  280. package/dist/domains/metrics/components/date-range-selector.cjs.js +1 -1
  281. package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
  282. package/dist/domains/metrics/components/kpi-card-view.cjs.js +1 -1
  283. package/dist/domains/metrics/components/kpi-card-view.es.js +1 -1
  284. package/dist/domains/metrics/components/latency-card-view.cjs.js +4 -4
  285. package/dist/domains/metrics/components/latency-card-view.es.js +4 -4
  286. package/dist/domains/metrics/components/memory-card-view.cjs.js +5 -5
  287. package/dist/domains/metrics/components/memory-card-view.es.js +5 -5
  288. package/dist/domains/metrics/components/model-usage-cost-card-view.cjs.js +2 -2
  289. package/dist/domains/metrics/components/model-usage-cost-card-view.es.js +2 -2
  290. package/dist/domains/metrics/components/scores-card-view.cjs.js +5 -5
  291. package/dist/domains/metrics/components/scores-card-view.es.js +5 -5
  292. package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js +4 -4
  293. package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js +4 -4
  294. package/dist/domains/metrics/components/token-usage-timeline-card-view.cjs.js +4 -4
  295. package/dist/domains/metrics/components/token-usage-timeline-card-view.es.js +4 -4
  296. package/dist/domains/metrics/components/traces-volume-card-view.cjs.js +4 -4
  297. package/dist/domains/metrics/components/traces-volume-card-view.es.js +4 -4
  298. package/dist/domains/traces/components/no-traces-info.cjs.js +1 -1
  299. package/dist/domains/traces/components/no-traces-info.es.js +1 -1
  300. package/dist/domains/traces/components/span-data-panel-view.cjs.js +19 -8
  301. package/dist/domains/traces/components/span-data-panel-view.cjs.js.map +1 -1
  302. package/dist/domains/traces/components/span-data-panel-view.es.js +20 -9
  303. package/dist/domains/traces/components/span-data-panel-view.es.js.map +1 -1
  304. package/dist/domains/traces/components/span-details-view.cjs.js +5 -3
  305. package/dist/domains/traces/components/span-details-view.cjs.js.map +1 -1
  306. package/dist/domains/traces/components/span-details-view.es.js +6 -4
  307. package/dist/domains/traces/components/span-details-view.es.js.map +1 -1
  308. package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +3 -3
  309. package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +3 -3
  310. package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +5 -3
  311. package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js.map +1 -1
  312. package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +5 -3
  313. package/dist/domains/traces/components/span-payload/span-input-renderers.es.js.map +1 -1
  314. package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +13 -12
  315. package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js.map +1 -1
  316. package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +7 -6
  317. package/dist/domains/traces/components/span-payload/span-output-renderers.es.js.map +1 -1
  318. package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +1 -1
  319. package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +1 -1
  320. package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +2 -2
  321. package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +2 -2
  322. package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +79 -0
  323. package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js.map +1 -0
  324. package/dist/domains/traces/components/span-payload/span-payload-processor.d.ts +2 -0
  325. package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +75 -0
  326. package/dist/domains/traces/components/span-payload/span-payload-processor.es.js.map +1 -0
  327. package/dist/domains/traces/components/span-payload/span-payload-registry.cjs.js +2 -0
  328. package/dist/domains/traces/components/span-payload/span-payload-registry.cjs.js.map +1 -1
  329. package/dist/domains/traces/components/span-payload/span-payload-registry.es.js +2 -1
  330. package/dist/domains/traces/components/span-payload/span-payload-registry.es.js.map +1 -1
  331. package/dist/domains/traces/components/span-payload/span-payload-section.cjs.js +2 -2
  332. package/dist/domains/traces/components/span-payload/span-payload-section.es.js +2 -2
  333. package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +2 -2
  334. package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +2 -2
  335. package/dist/domains/traces/components/span-payload/span-processor-attributes.cjs.js +85 -0
  336. package/dist/domains/traces/components/span-payload/span-processor-attributes.cjs.js.map +1 -0
  337. package/dist/domains/traces/components/span-payload/span-processor-attributes.d.ts +2 -0
  338. package/dist/domains/traces/components/span-payload/span-processor-attributes.es.js +81 -0
  339. package/dist/domains/traces/components/span-payload/span-processor-attributes.es.js.map +1 -0
  340. package/dist/domains/traces/components/span-payload.cjs.js +4 -0
  341. package/dist/domains/traces/components/span-payload.cjs.js.map +1 -1
  342. package/dist/domains/traces/components/span-payload.es.js +2 -0
  343. package/dist/domains/traces/components/span-payload.es.js.map +1 -1
  344. package/dist/domains/traces/components/span-summary-description.cjs.js +1 -1
  345. package/dist/domains/traces/components/span-summary-description.es.js +1 -1
  346. package/dist/domains/traces/components/span-timing-hover-card.cjs.js +1 -1
  347. package/dist/domains/traces/components/span-timing-hover-card.es.js +1 -1
  348. package/dist/domains/traces/components/span-token-usage.cjs.js +1 -1
  349. package/dist/domains/traces/components/span-token-usage.es.js +1 -1
  350. package/dist/domains/traces/components/thread-trace/thread-trace-details.cjs.js +1 -1
  351. package/dist/domains/traces/components/thread-trace/thread-trace-details.es.js +1 -1
  352. package/dist/domains/traces/components/thread-trace/thread-trace-messages.cjs.js +4 -4
  353. package/dist/domains/traces/components/thread-trace/thread-trace-messages.es.js +4 -4
  354. package/dist/domains/traces/components/thread-trace/thread-trace-spans.cjs.js +1 -1
  355. package/dist/domains/traces/components/thread-trace/thread-trace-spans.es.js +1 -1
  356. package/dist/domains/traces/components/trace-columns-menu.cjs.js +4 -4
  357. package/dist/domains/traces/components/trace-columns-menu.cjs.js.map +1 -1
  358. package/dist/domains/traces/components/trace-columns-menu.es.js +4 -4
  359. package/dist/domains/traces/components/trace-columns-menu.es.js.map +1 -1
  360. package/dist/domains/traces/components/trace-data-panel-view.cjs.js +12 -16
  361. package/dist/domains/traces/components/trace-data-panel-view.cjs.js.map +1 -1
  362. package/dist/domains/traces/components/trace-data-panel-view.es.js +12 -16
  363. package/dist/domains/traces/components/trace-data-panel-view.es.js.map +1 -1
  364. package/dist/domains/traces/components/trace-id-button.cjs.js +1 -1
  365. package/dist/domains/traces/components/trace-id-button.es.js +1 -1
  366. package/dist/domains/traces/components/trace-summary-description.cjs.js +8 -1
  367. package/dist/domains/traces/components/trace-summary-description.cjs.js.map +1 -1
  368. package/dist/domains/traces/components/trace-summary-description.es.js +8 -1
  369. package/dist/domains/traces/components/trace-summary-description.es.js.map +1 -1
  370. package/dist/domains/traces/components/trace-time-range-chip.cjs.js +2 -2
  371. package/dist/domains/traces/components/trace-time-range-chip.es.js +2 -2
  372. package/dist/domains/traces/components/traces-error-content.cjs.js +6 -6
  373. package/dist/domains/traces/components/traces-error-content.cjs.js.map +1 -1
  374. package/dist/domains/traces/components/traces-error-content.es.js +4 -4
  375. package/dist/domains/traces/components/traces-error-content.es.js.map +1 -1
  376. package/dist/domains/traces/components/traces-list-mode-toggle.cjs.js +1 -1
  377. package/dist/domains/traces/components/traces-list-mode-toggle.es.js +1 -1
  378. package/dist/domains/traces/components/traces-list-view.cjs.js +2 -2
  379. package/dist/domains/traces/components/traces-list-view.es.js +2 -2
  380. package/dist/domains/traces/components/traces-page-skeleton.cjs.js +0 -2
  381. package/dist/domains/traces/components/traces-page-skeleton.cjs.js.map +1 -1
  382. package/dist/domains/traces/components/traces-page-skeleton.es.js +0 -2
  383. package/dist/domains/traces/components/traces-page-skeleton.es.js.map +1 -1
  384. package/dist/domains/traces/components.cjs.js +4 -2
  385. package/dist/domains/traces/components.cjs.js.map +1 -1
  386. package/dist/domains/traces/components.es.js +2 -1
  387. package/dist/domains/traces/components.es.js.map +1 -1
  388. package/dist/domains/traces.cjs.js +4 -2
  389. package/dist/domains/traces.cjs.js.map +1 -1
  390. package/dist/domains/traces.es.js +2 -1
  391. package/dist/domains/traces.es.js.map +1 -1
  392. package/dist/{drawer-CnCsgToD.js → drawer-DZnqDb9H.js} +4 -4
  393. package/dist/drawer-DZnqDb9H.js.map +1 -0
  394. package/dist/{drawer-B6Ftum77.cjs → drawer-DpldATv1.cjs} +3 -3
  395. package/dist/drawer-DpldATv1.cjs.map +1 -0
  396. package/dist/ee/signals/components/entity-index-compact-grid.cjs.js +1 -1
  397. package/dist/ee/signals/components/entity-index-compact-grid.es.js +1 -1
  398. package/dist/ee/signals/components/entity-index-list.cjs.js +1 -3
  399. package/dist/ee/signals/components/entity-index-list.cjs.js.map +1 -1
  400. package/dist/ee/signals/components/entity-index-list.es.js +1 -3
  401. package/dist/ee/signals/components/entity-index-list.es.js.map +1 -1
  402. package/dist/ee/signals/components/signals-empty-state.cjs.js +2 -3
  403. package/dist/ee/signals/components/signals-empty-state.cjs.js.map +1 -1
  404. package/dist/ee/signals/components/signals-empty-state.es.js +2 -3
  405. package/dist/ee/signals/components/signals-empty-state.es.js.map +1 -1
  406. package/dist/ee/signals/components/trace-intelligence-entity-detail.cjs.js +1 -1
  407. package/dist/ee/signals/components/trace-intelligence-entity-detail.es.js +1 -1
  408. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +11 -13
  409. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js.map +1 -1
  410. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +9 -11
  411. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js.map +1 -1
  412. package/dist/ee/signals/examples-pager.cjs.js +1 -3
  413. package/dist/ee/signals/examples-pager.cjs.js.map +1 -1
  414. package/dist/ee/signals/examples-pager.es.js +1 -3
  415. package/dist/ee/signals/examples-pager.es.js.map +1 -1
  416. package/dist/ee/signals/flow-card.cjs.js +1 -1
  417. package/dist/ee/signals/flow-card.es.js +1 -1
  418. package/dist/ee/signals/noise-detail-panel.cjs.js +1 -1
  419. package/dist/ee/signals/noise-detail-panel.es.js +1 -1
  420. package/dist/ee/signals/sankey-signals.cjs.js +1 -1
  421. package/dist/ee/signals/sankey-signals.es.js +1 -1
  422. package/dist/ee/signals/settings/signal-definition-form-dialog.cjs.js +5 -5
  423. package/dist/ee/signals/settings/signal-definition-form-dialog.es.js +5 -5
  424. package/dist/ee/signals/settings/trace-signal-settings.cjs.js +2 -2
  425. package/dist/ee/signals/settings/trace-signal-settings.es.js +2 -2
  426. package/dist/ee/signals/signals-error-state.cjs.js +2 -2
  427. package/dist/ee/signals/signals-error-state.cjs.js.map +1 -1
  428. package/dist/ee/signals/signals-error-state.es.js +2 -2
  429. package/dist/ee/signals/signals-error-state.es.js.map +1 -1
  430. package/dist/ee/signals/snapshot-timeline.cjs.js +1 -2
  431. package/dist/ee/signals/snapshot-timeline.cjs.js.map +1 -1
  432. package/dist/ee/signals/snapshot-timeline.es.js +1 -2
  433. package/dist/ee/signals/snapshot-timeline.es.js.map +1 -1
  434. package/dist/ee/signals/theme-detail-panel.cjs.js +1 -1
  435. package/dist/ee/signals/theme-detail-panel.es.js +1 -1
  436. package/dist/ee/signals/theme-filter-banner.cjs.js +1 -1
  437. package/dist/ee/signals/theme-filter-banner.es.js +1 -1
  438. package/dist/ee/signals/trace-insight-view.cjs.js +3 -12
  439. package/dist/ee/signals/trace-insight-view.cjs.js.map +1 -1
  440. package/dist/ee/signals/trace-insight-view.es.js +3 -12
  441. package/dist/ee/signals/trace-insight-view.es.js.map +1 -1
  442. package/dist/ee/signals/view-mode-tab.cjs.js +1 -1
  443. package/dist/ee/signals/view-mode-tab.es.js +1 -1
  444. package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +10 -19
  445. package/dist/ee/topics/components/topic-trace-summary-list.cjs.js.map +1 -1
  446. package/dist/ee/topics/components/topic-trace-summary-list.es.js +10 -19
  447. package/dist/ee/topics/components/topic-trace-summary-list.es.js.map +1 -1
  448. package/dist/{filter-bar-chip-BlvuAPve.js → filter-bar-chip-7X4Aw_WH.js} +3 -3
  449. package/dist/{filter-bar-chip-BlvuAPve.js.map → filter-bar-chip-7X4Aw_WH.js.map} +1 -1
  450. package/dist/{filter-bar-chip-B_k_vbip.cjs → filter-bar-chip-BdZHI76J.cjs} +3 -3
  451. package/dist/{filter-bar-chip-B_k_vbip.cjs.map → filter-bar-chip-BdZHI76J.cjs.map} +1 -1
  452. package/dist/hooks/use-fluid-hover.cjs.js +2 -4
  453. package/dist/hooks/use-fluid-hover.cjs.js.map +1 -1
  454. package/dist/hooks/use-fluid-hover.es.js +2 -4
  455. package/dist/hooks/use-fluid-hover.es.js.map +1 -1
  456. package/dist/{input-B1RysHyq.js → input-CHghVv3k.js} +3 -3
  457. package/dist/input-CHghVv3k.js.map +1 -0
  458. package/dist/{input-CDLMprJS.cjs → input-bd223EJW.cjs} +2 -2
  459. package/dist/input-bd223EJW.cjs.map +1 -0
  460. package/dist/{input-group-DaIV9Orp.cjs → input-group-BfnJ0RIj.cjs} +3 -3
  461. package/dist/input-group-BfnJ0RIj.cjs.map +1 -0
  462. package/dist/{input-group-B-pskRGt.js → input-group-Jt7lZsN9.js} +4 -4
  463. package/dist/input-group-Jt7lZsN9.js.map +1 -0
  464. package/dist/layout/tabbed-container.cjs.js +6 -6
  465. package/dist/layout/tabbed-container.es.js +6 -6
  466. package/dist/{list-search-DK2yMiME.js → list-search-FJ1O5F3S.js} +2 -2
  467. package/dist/{list-search-DK2yMiME.js.map → list-search-FJ1O5F3S.js.map} +1 -1
  468. package/dist/{list-search-DhReauU5.cjs → list-search-S1mco9Bl.cjs} +2 -2
  469. package/dist/{list-search-DhReauU5.cjs.map → list-search-S1mco9Bl.cjs.map} +1 -1
  470. package/dist/{logs-data-list-DgoCLb6k.cjs → logs-data-list-BGJTRyO_.cjs} +2 -2
  471. package/dist/{logs-data-list-DgoCLb6k.cjs.map → logs-data-list-BGJTRyO_.cjs.map} +1 -1
  472. package/dist/{logs-data-list-B24gfDle.js → logs-data-list-XU1hCwI5.js} +2 -2
  473. package/dist/{logs-data-list-B24gfDle.js.map → logs-data-list-XU1hCwI5.js.map} +1 -1
  474. package/dist/{main-sidebar-Cf5G9iaC.js → main-sidebar-link-active-C9QPj3D6.js} +7 -119
  475. package/dist/main-sidebar-link-active-C9QPj3D6.js.map +1 -0
  476. package/dist/{main-sidebar-DYfRxFn4.cjs → main-sidebar-link-active-UEuukSeT.cjs} +5 -118
  477. package/dist/main-sidebar-link-active-UEuukSeT.cjs.map +1 -0
  478. package/dist/{markdown-renderer-BUqHHH4y.js → markdown-renderer-BBYgxsXL.js} +3 -3
  479. package/dist/{markdown-renderer-BUqHHH4y.js.map → markdown-renderer-BBYgxsXL.js.map} +1 -1
  480. package/dist/{markdown-renderer-CZLwgva-.cjs → markdown-renderer-Du_Zd1T-.cjs} +3 -3
  481. package/dist/{markdown-renderer-CZLwgva-.cjs.map → markdown-renderer-Du_Zd1T-.cjs.map} +1 -1
  482. package/dist/{metrics-card-CN4VRQQJ.js → metrics-card-Bzm6m1dy.js} +3 -3
  483. package/dist/{metrics-card-CN4VRQQJ.js.map → metrics-card-Bzm6m1dy.js.map} +1 -1
  484. package/dist/{metrics-card-DStXI6yn.cjs → metrics-card-DCCHIG-z.cjs} +3 -3
  485. package/dist/{metrics-card-DStXI6yn.cjs.map → metrics-card-DCCHIG-z.cjs.map} +1 -1
  486. package/dist/{metrics-kpi-card-CvOXyEGn.cjs → metrics-kpi-card-Bhb4R4z0.cjs} +2 -2
  487. package/dist/{metrics-kpi-card-CvOXyEGn.cjs.map → metrics-kpi-card-Bhb4R4z0.cjs.map} +1 -1
  488. package/dist/{metrics-kpi-card-C-XLN_Us.js → metrics-kpi-card-BrnFhFQm.js} +2 -2
  489. package/dist/{metrics-kpi-card-C-XLN_Us.js.map → metrics-kpi-card-BrnFhFQm.js.map} +1 -1
  490. package/dist/new/layout/app-shell.cjs.js +13 -0
  491. package/dist/new/layout/app-shell.cjs.js.map +1 -1
  492. package/dist/new/layout/app-shell.es.js +13 -1
  493. package/dist/new/layout/app-shell.es.js.map +1 -1
  494. package/dist/new/layout/page-header.cjs.js +1 -1
  495. package/dist/new/layout/page-header.es.js +1 -1
  496. package/dist/new/settings.cjs.js +42 -2
  497. package/dist/new/settings.cjs.js.map +1 -1
  498. package/dist/new/settings.es.js +43 -3
  499. package/dist/new/settings.es.js.map +1 -1
  500. package/dist/new/sidebar.cjs.js +33 -33
  501. package/dist/new/sidebar.cjs.js.map +1 -1
  502. package/dist/new/sidebar.es.js +3 -3
  503. package/dist/new/sidebar.es.js.map +1 -1
  504. package/dist/{page-header-CSigVThQ.js → page-header-CyXAezlZ.js} +25 -26
  505. package/dist/page-header-CyXAezlZ.js.map +1 -0
  506. package/dist/{page-header-DzEEkOca.cjs → page-header-Dk3s3XtC.cjs} +25 -26
  507. package/dist/page-header-Dk3s3XtC.cjs.map +1 -0
  508. package/dist/primitives/control-size.cjs.js +1 -2
  509. package/dist/primitives/control-size.cjs.js.map +1 -1
  510. package/dist/primitives/control-size.es.js +1 -2
  511. package/dist/primitives/control-size.es.js.map +1 -1
  512. package/dist/primitives/form-element.cjs.js +10 -5
  513. package/dist/primitives/form-element.cjs.js.map +1 -1
  514. package/dist/primitives/form-element.es.js +8 -5
  515. package/dist/primitives/form-element.es.js.map +1 -1
  516. package/dist/primitives/menu-item.cjs.js +1 -1
  517. package/dist/primitives/menu-item.cjs.js.map +1 -1
  518. package/dist/primitives/menu-item.es.js +1 -1
  519. package/dist/primitives/menu-item.es.js.map +1 -1
  520. package/dist/primitives/raised-surface.cjs.js +8 -3
  521. package/dist/primitives/raised-surface.cjs.js.map +1 -1
  522. package/dist/primitives/raised-surface.es.js +8 -4
  523. package/dist/primitives/raised-surface.es.js.map +1 -1
  524. package/dist/primitives/trigger-button.cjs.js +1 -1
  525. package/dist/primitives/trigger-button.es.js +1 -1
  526. package/dist/{property-filter-applied-uYr-sCdm.js → property-filter-applied-CYDiZtR7.js} +3 -3
  527. package/dist/{property-filter-applied-uYr-sCdm.js.map → property-filter-applied-CYDiZtR7.js.map} +1 -1
  528. package/dist/{property-filter-applied-DxSZN3Om.cjs → property-filter-applied-F6cN2lrX.cjs} +3 -3
  529. package/dist/{property-filter-applied-DxSZN3Om.cjs.map → property-filter-applied-F6cN2lrX.cjs.map} +1 -1
  530. package/dist/resize/panel-drawer.cjs.js +1 -1
  531. package/dist/resize/panel-drawer.es.js +1 -1
  532. package/dist/{search-field-block-Bg9GPPaA.cjs → search-field-block-7-ufp4uG.cjs} +3 -3
  533. package/dist/{search-field-block-Bg9GPPaA.cjs.map → search-field-block-7-ufp4uG.cjs.map} +1 -1
  534. package/dist/{search-field-block-B0twxGWI.js → search-field-block-fU3tStmB.js} +3 -3
  535. package/dist/{search-field-block-B0twxGWI.js.map → search-field-block-fU3tStmB.js.map} +1 -1
  536. package/dist/{select-65j5NjtJ.cjs → select-BByMAS0L.cjs} +4 -2
  537. package/dist/select-BByMAS0L.cjs.map +1 -0
  538. package/dist/{select-BiY-SoMJ.js → select-Dkmx3L5p.js} +4 -2
  539. package/dist/select-Dkmx3L5p.js.map +1 -0
  540. package/dist/{select-field-block-D_b9N7od.js → select-field-block-BfiHq9t6.js} +2 -2
  541. package/dist/{select-field-block-D_b9N7od.js.map → select-field-block-BfiHq9t6.js.map} +1 -1
  542. package/dist/{select-field-block-CZbN1w__.cjs → select-field-block-DJo2cX9Y.cjs} +2 -2
  543. package/dist/{select-field-block-CZbN1w__.cjs.map → select-field-block-DJo2cX9Y.cjs.map} +1 -1
  544. package/dist/{span-payload-primitives-DlIOpCII.js → span-payload-primitives-CzLh6axt.js} +3 -3
  545. package/dist/{span-payload-primitives-DlIOpCII.js.map → span-payload-primitives-CzLh6axt.js.map} +1 -1
  546. package/dist/{span-payload-primitives-BjBTICfq.cjs → span-payload-primitives-KEXwIaeZ.cjs} +3 -3
  547. package/dist/{span-payload-primitives-BjBTICfq.cjs.map → span-payload-primitives-KEXwIaeZ.cjs.map} +1 -1
  548. package/dist/src/domains/auth/components/permission-denied.d.ts +6 -0
  549. package/dist/src/{ds/components/PermissionDenied → domains/auth/components}/permission-denied.stories.d.ts +1 -3
  550. package/dist/src/domains/auth/components/session-expired.d.ts +5 -0
  551. package/dist/src/{ds/components/SessionExpired → domains/auth/components}/session-expired.stories.d.ts +1 -2
  552. package/dist/src/domains/auth/services/sso-login.d.ts +7 -0
  553. package/dist/src/domains/logs/components/logs-error-content.d.ts +2 -2
  554. package/dist/src/domains/traces/components/index.d.ts +0 -1
  555. package/dist/src/domains/traces/components/span-payload/index.d.ts +2 -0
  556. package/dist/src/domains/traces/components/span-payload/span-payload-processor.d.ts +10 -0
  557. package/dist/src/domains/traces/components/span-payload/span-payload-registry.d.ts +1 -0
  558. package/dist/src/domains/traces/components/span-payload/span-payload.stories.d.ts +2 -0
  559. package/dist/src/domains/traces/components/span-payload/span-processor-attributes.d.ts +10 -0
  560. package/dist/src/domains/traces/components/trace-data-panel-view.stories.d.ts +94 -0
  561. package/dist/src/domains/traces/components/trace-summary-description.d.ts +1 -0
  562. package/dist/src/domains/traces/components/traces-error-content.d.ts +2 -2
  563. package/dist/src/ds/components/Button/Button.d.ts +1 -1
  564. package/dist/src/ds/components/ButtonsGroup/buttons-group.stories.d.ts +2 -2
  565. package/dist/src/ds/components/Columns/column-root.d.ts +1 -3
  566. package/dist/src/ds/components/Columns/columns.stories.d.ts +0 -1
  567. package/dist/src/ds/components/Columns/index.d.ts +0 -1
  568. package/dist/src/ds/components/Combobox/combobox-styles.d.ts +1 -2
  569. package/dist/src/ds/components/Combobox/combobox.d.ts +3 -0
  570. package/dist/src/ds/components/Combobox/combobox.stories.d.ts +1 -0
  571. package/dist/src/ds/components/DataKeysAndValues/data-keys-and-values-root.d.ts +1 -2
  572. package/dist/src/ds/components/DataKeysAndValues/data-keys-and-values.stories.d.ts +1 -2
  573. package/dist/src/ds/components/EmptyState/EmptyState.d.ts +6 -2
  574. package/dist/src/ds/components/EmptyState/empty-state.stories.d.ts +1 -0
  575. package/dist/src/ds/components/PageLayout/page-layout.d.ts +8 -3
  576. package/dist/src/ds/components/PageLayout/page-layout.stories.d.ts +3 -0
  577. package/dist/src/ds/components/Select/select.d.ts +3 -4
  578. package/dist/src/ds/components/Select/select.stories.d.ts +2 -2
  579. package/dist/src/ds/new/layout/app-shell/index.d.ts +1 -0
  580. package/dist/src/ds/new/layout/app-shell/main-card.d.ts +5 -0
  581. package/dist/src/ds/new/settings/index.d.ts +1 -1
  582. package/dist/src/ds/new/settings/settings.stories.d.ts +2 -0
  583. package/dist/src/ds/primitives/control-size.d.ts +1 -1
  584. package/dist/src/ds/primitives/fields-on-surfaces.stories.d.ts +6 -0
  585. package/dist/src/ds/primitives/form-element.d.ts +3 -1
  586. package/dist/src/ds/primitives/raised-surface.d.ts +4 -31
  587. package/dist/src/ds/tokens/colors.d.ts +3 -0
  588. package/dist/src/ds/tokens/shadows.d.ts +1 -0
  589. package/dist/src/{ds/components/IntegrationDialog/integration-dialog.stories.d.ts → hooks/stories/browser/use-autoscroll.stories.d.ts} +6 -8
  590. package/dist/src/hooks/stories/browser/use-copy-to-clipboard.stories.d.ts +22 -0
  591. package/dist/src/hooks/stories/browser/use-fluid-hover.stories.d.ts +17 -0
  592. package/dist/src/hooks/stories/browser/use-in-view.stories.d.ts +17 -0
  593. package/dist/src/hooks/stories/browser/use-is-apple-platform.stories.d.ts +17 -0
  594. package/dist/src/hooks/stories/browser/use-is-mobile.stories.d.ts +32 -0
  595. package/dist/src/hooks/stories/browser/use-isomorphic-layout-effect.stories.d.ts +32 -0
  596. package/dist/src/hooks/stories/browser/use-keyboard-shortcut-label.stories.d.ts +22 -0
  597. package/dist/src/hooks/stories/browser/use-register-fluid-hover-item.stories.d.ts +17 -0
  598. package/dist/src/hooks/stories/environment/use-custom-environment-variables-editor.stories.d.ts +17 -0
  599. package/dist/src/hooks/stories/environment/use-environment-variables-editor.stories.d.ts +17 -0
  600. package/dist/src/hooks/stories/state/use-debounced-value.stories.d.ts +32 -0
  601. package/dist/src/hooks/stories/state/use-expiring-local-storage-state.stories.d.ts +17 -0
  602. package/dist/src/hooks/stories/state/use-local-storage-state.stories.d.ts +17 -0
  603. package/dist/src/hooks/stories/text/use-is-clamped.stories.d.ts +17 -0
  604. package/dist/src/hooks/stories/text/use-measured-auto-height.stories.d.ts +17 -0
  605. package/dist/src/hooks/stories/text/use-scroll-to-first-highlight.stories.d.ts +17 -0
  606. package/dist/src/hooks/stories/text/use-text-highlight.stories.d.ts +17 -0
  607. package/dist/src/lib/keyboard/use-keyboard-scope-depth.stories.d.ts +17 -0
  608. package/dist/src/lib/keyboard/use-keyboard-shortcuts-context.stories.d.ts +17 -0
  609. package/dist/src/lib/keyboard/use-table-keydown.stories.d.ts +15 -0
  610. package/dist/style.css +147 -107
  611. package/dist/{tabs-content-DMrffE9p.js → tabs-content-7ODUUdQ0.js} +2 -2
  612. package/dist/{tabs-content-DMrffE9p.js.map → tabs-content-7ODUUdQ0.js.map} +1 -1
  613. package/dist/{tabs-content-CuUlcS67.cjs → tabs-content-DlCJoQUW.cjs} +2 -2
  614. package/dist/{tabs-content-CuUlcS67.cjs.map → tabs-content-DlCJoQUW.cjs.map} +1 -1
  615. package/dist/{tabs-root-DrK1hxeV.cjs → tabs-root-COCL6jcx.cjs} +2 -2
  616. package/dist/{tabs-root-DrK1hxeV.cjs.map → tabs-root-COCL6jcx.cjs.map} +1 -1
  617. package/dist/{tabs-root-B2sdkQ3A.js → tabs-root-UNPxoGhW.js} +2 -2
  618. package/dist/{tabs-root-B2sdkQ3A.js.map → tabs-root-UNPxoGhW.js.map} +1 -1
  619. package/dist/{tabs-tab-ClmulJmM.cjs → tabs-tab-DFmRMdi3.cjs} +2 -2
  620. package/dist/{tabs-tab-ClmulJmM.cjs.map → tabs-tab-DFmRMdi3.cjs.map} +1 -1
  621. package/dist/{tabs-tab-u6LS5twu.js → tabs-tab-DluwCnDF.js} +2 -2
  622. package/dist/{tabs-tab-u6LS5twu.js.map → tabs-tab-DluwCnDF.js.map} +1 -1
  623. package/dist/{text-field-block-Cihf0IRw.js → text-field-block-DGIM1i3Z.js} +2 -2
  624. package/dist/{text-field-block-Cihf0IRw.js.map → text-field-block-DGIM1i3Z.js.map} +1 -1
  625. package/dist/{text-field-block-BmWGMw3a.cjs → text-field-block-DePCgDOh.cjs} +2 -2
  626. package/dist/{text-field-block-BmWGMw3a.cjs.map → text-field-block-DePCgDOh.cjs.map} +1 -1
  627. package/dist/{textarea-DdnzLrI9.js → textarea-B6wvS_CQ.js} +3 -3
  628. package/dist/textarea-B6wvS_CQ.js.map +1 -0
  629. package/dist/{textarea-5b6XcMrq.cjs → textarea-gUBUqpol.cjs} +2 -2
  630. package/dist/textarea-gUBUqpol.cjs.map +1 -0
  631. package/dist/{time-picker-PXFCgAuR.cjs → time-picker-BNhe7Zpb.cjs} +2 -2
  632. package/dist/{time-picker-PXFCgAuR.cjs.map → time-picker-BNhe7Zpb.cjs.map} +1 -1
  633. package/dist/{time-picker-DMroqHbw.js → time-picker-kvCsW78V.js} +2 -2
  634. package/dist/{time-picker-DMroqHbw.js.map → time-picker-kvCsW78V.js.map} +1 -1
  635. package/dist/tokens.cjs.js +4 -0
  636. package/dist/tokens.cjs.js.map +1 -1
  637. package/dist/tokens.es.js +4 -0
  638. package/dist/tokens.es.js.map +1 -1
  639. package/dist/{tool-approval-DzOGIKRh.js → tool-approval-DXUFyrSl.js} +2 -2
  640. package/dist/{tool-approval-DzOGIKRh.js.map → tool-approval-DXUFyrSl.js.map} +1 -1
  641. package/dist/{tool-approval-DYX_ZNWc.cjs → tool-approval-LIy1nZZJ.cjs} +2 -2
  642. package/dist/{tool-approval-DYX_ZNWc.cjs.map → tool-approval-LIy1nZZJ.cjs.map} +1 -1
  643. package/dist/{tool-call-HNNRcirD.js → tool-call-Bs-9Cah5.js} +2 -2
  644. package/dist/{tool-call-HNNRcirD.js.map → tool-call-Bs-9Cah5.js.map} +1 -1
  645. package/dist/{tool-call-vZeZ5XT5.cjs → tool-call-C0JeHe8Z.cjs} +2 -2
  646. package/dist/{tool-call-vZeZ5XT5.cjs.map → tool-call-C0JeHe8Z.cjs.map} +1 -1
  647. package/dist/{traces-data-list-DHrC158-.js → traces-data-list-Cjy5a-1f.js} +3 -3
  648. package/dist/{traces-data-list-DHrC158-.js.map → traces-data-list-Cjy5a-1f.js.map} +1 -1
  649. package/dist/{traces-data-list-DNOtQze4.cjs → traces-data-list-DLeKSbaZ.cjs} +3 -3
  650. package/dist/{traces-data-list-DNOtQze4.cjs.map → traces-data-list-DLeKSbaZ.cjs.map} +1 -1
  651. package/package.json +13 -13
  652. package/theme/surfaces.css +8 -0
  653. package/theme.css +7 -0
  654. package/dist/Button-KUj0U-5I.js.map +0 -1
  655. package/dist/Button-MMZPEb_q.cjs.map +0 -1
  656. package/dist/Card-B_buJ5yF.js.map +0 -1
  657. package/dist/Card-DwGasv0K.cjs.map +0 -1
  658. package/dist/EmptyState-B6cyZw6m.js.map +0 -1
  659. package/dist/EmptyState-DiSP6UIy.cjs.map +0 -1
  660. package/dist/ErrorState-B0839u-q.cjs +0 -21
  661. package/dist/ErrorState-B0839u-q.cjs.map +0 -1
  662. package/dist/ErrorState-HyRJdaA2.js +0 -19
  663. package/dist/ErrorState-HyRJdaA2.js.map +0 -1
  664. package/dist/PermissionDenied-CTqnE57B.js +0 -27
  665. package/dist/PermissionDenied-CTqnE57B.js.map +0 -1
  666. package/dist/PermissionDenied-fdVmTjjf.cjs +0 -29
  667. package/dist/PermissionDenied-fdVmTjjf.cjs.map +0 -1
  668. package/dist/SessionExpired-B9e1Kx4I.js +0 -44
  669. package/dist/SessionExpired-B9e1Kx4I.js.map +0 -1
  670. package/dist/SessionExpired-GSQkcV9f.cjs +0 -46
  671. package/dist/SessionExpired-GSQkcV9f.cjs.map +0 -1
  672. package/dist/code-editor-BQTDma1I.js.map +0 -1
  673. package/dist/code-editor-BfoJXq9l.cjs.map +0 -1
  674. package/dist/combobox-Bn_uyUSB.cjs.map +0 -1
  675. package/dist/combobox-Cykfy5wc.js.map +0 -1
  676. package/dist/combobox-styles-CSsS2LEx.cjs.map +0 -1
  677. package/dist/combobox-styles-iuJUkJEQ.js.map +0 -1
  678. package/dist/components/DataFilter.cjs.js +0 -173
  679. package/dist/components/DataFilter.cjs.js.map +0 -1
  680. package/dist/components/DataFilter.d.ts +0 -2
  681. package/dist/components/DataFilter.es.js +0 -169
  682. package/dist/components/DataFilter.es.js.map +0 -1
  683. package/dist/components/ErrorState.cjs.js +0 -10
  684. package/dist/components/ErrorState.cjs.js.map +0 -1
  685. package/dist/components/ErrorState.d.ts +0 -2
  686. package/dist/components/ErrorState.es.js +0 -2
  687. package/dist/components/ErrorState.es.js.map +0 -1
  688. package/dist/components/IntegrationDialog.cjs.js +0 -104
  689. package/dist/components/IntegrationDialog.cjs.js.map +0 -1
  690. package/dist/components/IntegrationDialog.d.ts +0 -2
  691. package/dist/components/IntegrationDialog.es.js +0 -100
  692. package/dist/components/IntegrationDialog.es.js.map +0 -1
  693. package/dist/components/PermissionDenied.cjs.js +0 -10
  694. package/dist/components/PermissionDenied.cjs.js.map +0 -1
  695. package/dist/components/PermissionDenied.d.ts +0 -2
  696. package/dist/components/PermissionDenied.es.js +0 -2
  697. package/dist/components/PermissionDenied.es.js.map +0 -1
  698. package/dist/components/Sections.cjs.js +0 -13
  699. package/dist/components/Sections.cjs.js.map +0 -1
  700. package/dist/components/Sections.d.ts +0 -2
  701. package/dist/components/Sections.es.js +0 -9
  702. package/dist/components/Sections.es.js.map +0 -1
  703. package/dist/components/SessionExpired.cjs.js +0 -10
  704. package/dist/components/SessionExpired.cjs.js.map +0 -1
  705. package/dist/components/SessionExpired.d.ts +0 -2
  706. package/dist/components/SessionExpired.es.js +0 -2
  707. package/dist/components/SessionExpired.es.js.map +0 -1
  708. package/dist/components/SettingsLayout.cjs.js +0 -10
  709. package/dist/components/SettingsLayout.cjs.js.map +0 -1
  710. package/dist/components/SettingsLayout.d.ts +0 -2
  711. package/dist/components/SettingsLayout.es.js +0 -2
  712. package/dist/components/SettingsLayout.es.js.map +0 -1
  713. package/dist/data-keys-and-values-BduKvvC5.cjs.map +0 -1
  714. package/dist/data-keys-and-values-DhC4U4Yl.js.map +0 -1
  715. package/dist/data-list-Cn0Ls4l2.js.map +0 -1
  716. package/dist/data-list-DSbuTWLI.cjs.map +0 -1
  717. package/dist/dialog-Bilo4jEU.cjs.map +0 -1
  718. package/dist/dialog-DMOXPT0N.js.map +0 -1
  719. package/dist/domains/traces/components/trace-keys-and-values.cjs.js +0 -70
  720. package/dist/domains/traces/components/trace-keys-and-values.cjs.js.map +0 -1
  721. package/dist/domains/traces/components/trace-keys-and-values.d.ts +0 -2
  722. package/dist/domains/traces/components/trace-keys-and-values.es.js +0 -66
  723. package/dist/domains/traces/components/trace-keys-and-values.es.js.map +0 -1
  724. package/dist/drawer-B6Ftum77.cjs.map +0 -1
  725. package/dist/drawer-CnCsgToD.js.map +0 -1
  726. package/dist/input-B1RysHyq.js.map +0 -1
  727. package/dist/input-CDLMprJS.cjs.map +0 -1
  728. package/dist/input-group-B-pskRGt.js.map +0 -1
  729. package/dist/input-group-DaIV9Orp.cjs.map +0 -1
  730. package/dist/main-sidebar-Cf5G9iaC.js.map +0 -1
  731. package/dist/main-sidebar-DYfRxFn4.cjs.map +0 -1
  732. package/dist/page-header-CSigVThQ.js.map +0 -1
  733. package/dist/page-header-DzEEkOca.cjs.map +0 -1
  734. package/dist/select-65j5NjtJ.cjs.map +0 -1
  735. package/dist/select-BiY-SoMJ.js.map +0 -1
  736. package/dist/settings-layout-BGvMSClL.cjs +0 -49
  737. package/dist/settings-layout-BGvMSClL.cjs.map +0 -1
  738. package/dist/settings-layout-DA-JWqW3.js +0 -47
  739. package/dist/settings-layout-DA-JWqW3.js.map +0 -1
  740. package/dist/src/domains/traces/components/trace-keys-and-values.d.ts +0 -24
  741. package/dist/src/domains/traces/components/trace-keys-and-values.stories.d.ts +0 -28
  742. package/dist/src/ds/components/Columns/multi-column.d.ts +0 -7
  743. package/dist/src/ds/components/DataFilter/index.d.ts +0 -2
  744. package/dist/src/ds/components/DataFilter/select-data-filter.d.ts +0 -40
  745. package/dist/src/ds/components/DataFilter/select-data-filter.stories.d.ts +0 -8
  746. package/dist/src/ds/components/ErrorState/ErrorState.d.ts +0 -8
  747. package/dist/src/ds/components/ErrorState/error-state.stories.d.ts +0 -8
  748. package/dist/src/ds/components/ErrorState/index.d.ts +0 -2
  749. package/dist/src/ds/components/IntegrationDialog/__fixtures__/integrations-catalog.d.ts +0 -2
  750. package/dist/src/ds/components/IntegrationDialog/index.d.ts +0 -2
  751. package/dist/src/ds/components/IntegrationDialog/integration-dialog.d.ts +0 -28
  752. package/dist/src/ds/components/PermissionDenied/PermissionDenied.d.ts +0 -16
  753. package/dist/src/ds/components/PermissionDenied/index.d.ts +0 -2
  754. package/dist/src/ds/components/Sections/index.d.ts +0 -1
  755. package/dist/src/ds/components/Sections/sections.d.ts +0 -5
  756. package/dist/src/ds/components/Sections/sections.stories.d.ts +0 -8
  757. package/dist/src/ds/components/SessionExpired/SessionExpired.d.ts +0 -11
  758. package/dist/src/ds/components/SessionExpired/index.d.ts +0 -2
  759. package/dist/src/ds/components/SettingsLayout/index.d.ts +0 -1
  760. package/dist/src/ds/components/SettingsLayout/settings-layout.stories.d.ts +0 -52
  761. package/dist/textarea-5b6XcMrq.cjs.map +0 -1
  762. package/dist/textarea-DdnzLrI9.js.map +0 -1
  763. /package/dist/src/ds/{components/SettingsLayout → new/settings}/settings-layout.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"trace-columns-menu.es.js","sources":["../../../../src/domains/traces/components/trace-columns-menu.tsx"],"sourcesContent":["import { Columns3Icon, PlusIcon, Columns3, X } from 'lucide-react';\nimport { useMemo, useState, type FormEvent } from 'react';\nimport { TRACE_CUSTOM_COLUMN_FIELDS, TRACE_CUSTOM_COLUMN_LABELS, TRACE_USAGE_COLUMNS } from '../trace-list-columns';\nimport type { TraceColumnPreferences, TraceCustomColumn, TraceOptionalColumn } from '../trace-list-columns';\nimport { Button } from '@/ds/components/Button';\nimport { Combobox } from '@/ds/components/Combobox';\nimport {\n Dialog,\n DialogBody,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/ds/components/Dialog';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu';\nimport { FieldBlock } from '@/ds/components/FormFieldBlocks';\n\nconst METADATA_KEY_FIELD_NAME = 'trace-metadata-key';\nconst EMPTY_KEYS: readonly string[] = [];\n\nconst STANDARD_COLUMNS: readonly TraceOptionalColumn[] = ['type', 'input', 'duration', 'endTime', 'environment'];\n\nconst COLUMN_LABELS: Record<TraceOptionalColumn, string> = {\n type: 'Type',\n input: 'Input',\n duration: 'Duration',\n endTime: 'End',\n environment: 'Environment',\n inputTokens: 'Input tokens',\n outputTokens: 'Output tokens',\n totalTokens: 'Total tokens',\n estimatedCost: 'Estimated cost',\n};\n\ntype TraceColumnsMenuProps = {\n preferences: TraceColumnPreferences;\n /** Top-level metadata keys observed on traces in the current time range, offered in the picker. */\n availableMetadataKeys?: readonly string[];\n usageDisabledReason?: string;\n onToggleColumn: (column: TraceOptionalColumn) => void;\n onAddCustomColumn: (field: TraceCustomColumn) => void;\n onRemoveCustomColumn: (field: TraceCustomColumn) => void;\n onAddMetadataColumn: (key: string) => void;\n onRemoveMetadataColumn: (key: string) => void;\n onReset: () => void;\n};\n\nexport function TraceColumnsMenu({\n preferences,\n availableMetadataKeys = EMPTY_KEYS,\n usageDisabledReason,\n onToggleColumn,\n onAddCustomColumn,\n onRemoveCustomColumn,\n onAddMetadataColumn,\n onRemoveMetadataColumn,\n onReset,\n}: TraceColumnsMenuProps) {\n const [isMetadataDialogOpen, setIsMetadataDialogOpen] = useState(false);\n const [metadataKey, setMetadataKey] = useState('');\n const [metadataError, setMetadataError] = useState<string | undefined>();\n\n // Keys already shown as columns are left out; a typed key that discovery\n // hasn't seen is kept in the list so the trigger can display it once picked.\n const metadataKeyOptions = useMemo(() => {\n const keys = availableMetadataKeys.filter(key => !preferences.metadataKeys.includes(key));\n if (metadataKey && !keys.includes(metadataKey)) keys.push(metadataKey);\n return keys.map(key => ({ label: key, value: key }));\n }, [availableMetadataKeys, preferences.metadataKeys, metadataKey]);\n\n const handleDialogOpenChange = (open: boolean) => {\n setIsMetadataDialogOpen(open);\n if (!open) {\n setMetadataKey('');\n setMetadataError(undefined);\n }\n };\n\n const handleAddMetadata = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const normalizedKey = metadataKey.trim();\n if (!normalizedKey) {\n setMetadataError('Enter a metadata key.');\n return;\n }\n if (preferences.metadataKeys.includes(normalizedKey)) {\n setMetadataError('That metadata column is already visible.');\n return;\n }\n\n onAddMetadataColumn(normalizedKey);\n handleDialogOpenChange(false);\n };\n\n return (\n <>\n <DropdownMenu>\n <DropdownMenu.Trigger\n render={\n <Button variant=\"ghost\" size=\"md\" icon={<Columns3Icon aria-hidden />}>\n Columns\n </Button>\n }\n />\n <DropdownMenu.Content align=\"end\" className=\"min-w-56\">\n <DropdownMenu.Label>Standard columns</DropdownMenu.Label>\n {STANDARD_COLUMNS.map(column => (\n <DropdownMenu.CheckboxItem\n key={column}\n checked={preferences.visibleColumns.includes(column)}\n onCheckedChange={() => onToggleColumn(column)}\n >\n {COLUMN_LABELS[column]}\n </DropdownMenu.CheckboxItem>\n ))}\n\n <DropdownMenu.Separator />\n <DropdownMenu.Label>Usage columns</DropdownMenu.Label>\n {TRACE_USAGE_COLUMNS.map(column => (\n <DropdownMenu.CheckboxItem\n key={column}\n checked={preferences.visibleColumns.includes(column)}\n disabled={Boolean(usageDisabledReason)}\n onCheckedChange={() => onToggleColumn(column)}\n >\n {COLUMN_LABELS[column]}\n </DropdownMenu.CheckboxItem>\n ))}\n {usageDisabledReason && (\n <p className=\"px-2 py-1 text-meta text-placeholder\" role=\"note\">\n {usageDisabledReason}\n </p>\n )}\n\n <DropdownMenu.Separator />\n <DropdownMenu.Label>Custom columns</DropdownMenu.Label>\n {TRACE_CUSTOM_COLUMN_FIELDS.map(field => {\n const isVisible = preferences.customColumns.includes(field);\n return (\n <DropdownMenu.CheckboxItem\n key={field}\n checked={isVisible}\n onCheckedChange={() => (isVisible ? onRemoveCustomColumn(field) : onAddCustomColumn(field))}\n >\n {TRACE_CUSTOM_COLUMN_LABELS[field]}\n </DropdownMenu.CheckboxItem>\n );\n })}\n\n <DropdownMenu.Separator />\n <DropdownMenu.Label>Metadata columns</DropdownMenu.Label>\n {preferences.metadataKeys.map(key => (\n <DropdownMenu.CheckboxItem\n key={key}\n checked\n title={key}\n onCheckedChange={() => onRemoveMetadataColumn(key)}\n >\n {key}\n </DropdownMenu.CheckboxItem>\n ))}\n <DropdownMenu.Item onSelect={() => setIsMetadataDialogOpen(true)}>\n <PlusIcon aria-hidden />\n Add metadata column\n </DropdownMenu.Item>\n\n <DropdownMenu.Separator />\n <DropdownMenu.Item onSelect={onReset}>Reset to defaults</DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu>\n\n <Dialog open={isMetadataDialogOpen} onOpenChange={handleDialogOpenChange}>\n <DialogContent>\n <form onSubmit={handleAddMetadata}>\n <DialogHeader>\n <DialogTitle>Add metadata column</DialogTitle>\n <DialogDescription>\n Pick a top-level trace metadata key observed in the current time range, or type one. Only the key is\n saved, never its values.\n </DialogDescription>\n </DialogHeader>\n <DialogBody>\n <FieldBlock.Column>\n <FieldBlock.Label name={METADATA_KEY_FIELD_NAME}>Metadata key</FieldBlock.Label>\n <Combobox\n id={`input-${METADATA_KEY_FIELD_NAME}`}\n name={METADATA_KEY_FIELD_NAME}\n options={metadataKeyOptions}\n value={metadataKey}\n onValueChange={key => {\n setMetadataKey(key);\n setMetadataError(undefined);\n }}\n allowCustomValue\n placeholder=\"Select a metadata key…\"\n searchPlaceholder=\"Search metadata keys…\"\n emptyText=\"No metadata keys observed. Type one to add it.\"\n error={metadataError}\n />\n </FieldBlock.Column>\n </DialogBody>\n <DialogFooter>\n <Button icon={<X />} type=\"button\" variant=\"outline\" onClick={() => handleDialogOpenChange(false)}>\n Cancel\n </Button>\n <Button icon={<Columns3 />} type=\"submit\" variant=\"primary\">\n Add column\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n </>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trace-columns-menu.es.js","sources":["../../../../src/domains/traces/components/trace-columns-menu.tsx"],"sourcesContent":["import { Columns3Icon, PlusIcon, Columns3, X } from 'lucide-react';\nimport { useMemo, useState, type FormEvent } from 'react';\nimport { TRACE_CUSTOM_COLUMN_FIELDS, TRACE_CUSTOM_COLUMN_LABELS, TRACE_USAGE_COLUMNS } from '../trace-list-columns';\nimport type { TraceColumnPreferences, TraceCustomColumn, TraceOptionalColumn } from '../trace-list-columns';\nimport { Button } from '@/ds/components/Button';\nimport { Combobox } from '@/ds/components/Combobox';\nimport {\n Dialog,\n DialogBody,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/ds/components/Dialog';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu';\nimport { FieldBlock } from '@/ds/components/FormFieldBlocks';\n\nconst METADATA_KEY_FIELD_NAME = 'trace-metadata-key';\nconst EMPTY_KEYS: readonly string[] = [];\n\nconst STANDARD_COLUMNS: readonly TraceOptionalColumn[] = ['type', 'input', 'duration', 'endTime', 'environment'];\n\nconst COLUMN_LABELS: Record<TraceOptionalColumn, string> = {\n type: 'Type',\n input: 'Input',\n duration: 'Duration',\n endTime: 'End',\n environment: 'Environment',\n inputTokens: 'Input tokens',\n outputTokens: 'Output tokens',\n totalTokens: 'Total tokens',\n estimatedCost: 'Estimated cost',\n};\n\ntype TraceColumnsMenuProps = {\n preferences: TraceColumnPreferences;\n /** Top-level metadata keys observed on traces in the current time range, offered in the picker. */\n availableMetadataKeys?: readonly string[];\n usageDisabledReason?: string;\n onToggleColumn: (column: TraceOptionalColumn) => void;\n onAddCustomColumn: (field: TraceCustomColumn) => void;\n onRemoveCustomColumn: (field: TraceCustomColumn) => void;\n onAddMetadataColumn: (key: string) => void;\n onRemoveMetadataColumn: (key: string) => void;\n onReset: () => void;\n};\n\nexport function TraceColumnsMenu({\n preferences,\n availableMetadataKeys = EMPTY_KEYS,\n usageDisabledReason,\n onToggleColumn,\n onAddCustomColumn,\n onRemoveCustomColumn,\n onAddMetadataColumn,\n onRemoveMetadataColumn,\n onReset,\n}: TraceColumnsMenuProps) {\n const [isMetadataDialogOpen, setIsMetadataDialogOpen] = useState(false);\n const [metadataKey, setMetadataKey] = useState('');\n const [metadataError, setMetadataError] = useState<string | undefined>();\n\n // Keys already shown as columns are left out; a typed key that discovery\n // hasn't seen is kept in the list so the trigger can display it once picked.\n const metadataKeyOptions = useMemo(() => {\n const keys = availableMetadataKeys.filter(key => !preferences.metadataKeys.includes(key));\n if (metadataKey && !keys.includes(metadataKey)) keys.push(metadataKey);\n return keys.map(key => ({ label: key, value: key }));\n }, [availableMetadataKeys, preferences.metadataKeys, metadataKey]);\n\n const handleDialogOpenChange = (open: boolean) => {\n setIsMetadataDialogOpen(open);\n if (!open) {\n setMetadataKey('');\n setMetadataError(undefined);\n }\n };\n\n const handleAddMetadata = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const normalizedKey = metadataKey.trim();\n if (!normalizedKey) {\n setMetadataError('Enter a metadata key.');\n return;\n }\n if (preferences.metadataKeys.includes(normalizedKey)) {\n setMetadataError('That metadata column is already visible.');\n return;\n }\n\n onAddMetadataColumn(normalizedKey);\n handleDialogOpenChange(false);\n };\n\n return (\n <>\n <DropdownMenu>\n <DropdownMenu.Trigger\n render={\n <Button variant=\"ghost\" size=\"md\" icon={<Columns3Icon aria-hidden />}>\n Columns\n </Button>\n }\n />\n <DropdownMenu.Content align=\"end\" className=\"min-w-56\">\n <DropdownMenu.Label>Standard columns</DropdownMenu.Label>\n {STANDARD_COLUMNS.map(column => (\n <DropdownMenu.CheckboxItem\n key={column}\n checked={preferences.visibleColumns.includes(column)}\n onCheckedChange={() => onToggleColumn(column)}\n >\n {COLUMN_LABELS[column]}\n </DropdownMenu.CheckboxItem>\n ))}\n\n <DropdownMenu.Separator />\n <DropdownMenu.Label>Usage columns</DropdownMenu.Label>\n {TRACE_USAGE_COLUMNS.map(column => (\n <DropdownMenu.CheckboxItem\n key={column}\n checked={preferences.visibleColumns.includes(column)}\n disabled={Boolean(usageDisabledReason)}\n onCheckedChange={() => onToggleColumn(column)}\n >\n {COLUMN_LABELS[column]}\n </DropdownMenu.CheckboxItem>\n ))}\n {usageDisabledReason && (\n <p className=\"px-2 py-1 text-meta text-placeholder\" role=\"note\">\n {usageDisabledReason}\n </p>\n )}\n\n <DropdownMenu.Separator />\n <DropdownMenu.Label>Custom columns</DropdownMenu.Label>\n {TRACE_CUSTOM_COLUMN_FIELDS.map(field => {\n const isVisible = preferences.customColumns.includes(field);\n return (\n <DropdownMenu.CheckboxItem\n key={field}\n checked={isVisible}\n onCheckedChange={() => (isVisible ? onRemoveCustomColumn(field) : onAddCustomColumn(field))}\n >\n {TRACE_CUSTOM_COLUMN_LABELS[field]}\n </DropdownMenu.CheckboxItem>\n );\n })}\n\n <DropdownMenu.Separator />\n <DropdownMenu.Label>Metadata columns</DropdownMenu.Label>\n {preferences.metadataKeys.map(key => (\n <DropdownMenu.CheckboxItem\n key={key}\n checked\n title={key}\n onCheckedChange={() => onRemoveMetadataColumn(key)}\n >\n {key}\n </DropdownMenu.CheckboxItem>\n ))}\n <DropdownMenu.Item onSelect={() => setIsMetadataDialogOpen(true)}>\n <PlusIcon aria-hidden />\n Add metadata column\n </DropdownMenu.Item>\n\n <DropdownMenu.Separator />\n <DropdownMenu.Item onSelect={onReset}>Reset to defaults</DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu>\n\n <Dialog open={isMetadataDialogOpen} onOpenChange={handleDialogOpenChange}>\n <DialogContent>\n <form onSubmit={handleAddMetadata}>\n <DialogHeader>\n <DialogTitle>Add metadata column</DialogTitle>\n <DialogDescription>\n Pick a top-level trace metadata key observed in the current time range, or type one. Only the key is\n saved, never its values.\n </DialogDescription>\n </DialogHeader>\n <DialogBody>\n <FieldBlock.Column>\n <FieldBlock.Label name={METADATA_KEY_FIELD_NAME}>Metadata key</FieldBlock.Label>\n <Combobox\n id={`input-${METADATA_KEY_FIELD_NAME}`}\n name={METADATA_KEY_FIELD_NAME}\n options={metadataKeyOptions}\n value={metadataKey}\n onValueChange={key => {\n setMetadataKey(key);\n setMetadataError(undefined);\n }}\n allowCustomValue\n placeholder=\"Select a metadata key…\"\n searchPlaceholder=\"Search metadata keys…\"\n emptyText=\"No metadata keys observed. Type one to add it.\"\n error={metadataError}\n />\n </FieldBlock.Column>\n </DialogBody>\n <DialogFooter>\n <Button icon={<X />} type=\"button\" onClick={() => handleDialogOpenChange(false)}>\n Cancel\n </Button>\n <Button icon={<Columns3 />} type=\"submit\" variant=\"primary\">\n Add column\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n </>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -13,14 +13,14 @@ const domains_traces_components_traceIdButton = require('./trace-id-button.cjs.j
13
13
  const domains_traces_components_traceSpanTimeline = require('./trace-span-timeline.cjs.js');
14
14
  const domains_traces_components_traceSpanTree = require('./trace-span-tree.cjs.js');
15
15
  const domains_traces_components_traceSummaryDescription = require('./trace-summary-description.cjs.js');
16
- const Button = require('../../../Button-MMZPEb_q.cjs');
16
+ const Button = require('../../../Button-BAMnPqos.cjs');
17
17
  const buttonsGroup = require('../../../buttons-group-CoZP3lJt.cjs');
18
- const dataPanel = require('../../../data-panel-Bd_Xsz-W.cjs');
18
+ const dataPanel = require('../../../data-panel-CIu6JToM.cjs');
19
19
  const dropdownMenu = require('../../../dropdown-menu-j2y37TL5.cjs');
20
- const searchFieldBlock = require('../../../search-field-block-Bg9GPPaA.cjs');
21
- const Notice = require('../../../Notice-CPyYcX5J.cjs');
22
- const tabsRoot = require('../../../tabs-root-DrK1hxeV.cjs');
23
- const tabsTab = require('../../../tabs-tab-ClmulJmM.cjs');
20
+ const searchFieldBlock = require('../../../search-field-block-7-ufp4uG.cjs');
21
+ const Notice = require('../../../Notice-AUNd8fqT.cjs');
22
+ const tabsRoot = require('../../../tabs-root-COCL6jcx.cjs');
23
+ const tabsTab = require('../../../tabs-tab-DFmRMdi3.cjs');
24
24
  const icons_Icon = require('../../../icons/Icon.cjs.js');
25
25
  const icons_ScorersIcon = require('../../../icons/ScorersIcon.cjs.js');
26
26
  const hooks_useScrollToFirstHighlight = require('../../../hooks/use-scroll-to-first-highlight.cjs.js');
@@ -161,6 +161,7 @@ function TraceDataPanelView({
161
161
  setSelectedSpanId(newId);
162
162
  onSpanSelect?.(newId);
163
163
  };
164
+ const traceSummary = rootSpan && /* @__PURE__ */ jsxRuntime.jsx(domains_traces_components_traceSummaryDescription.TraceSummaryDescription, { rootSpan, usage, entityHref, LinkComponent });
164
165
  const traceActionsMenu = traceId && /* @__PURE__ */ jsxRuntime.jsxs(dropdownMenu.DropdownMenu, { children: [
165
166
  /* @__PURE__ */ jsxRuntime.jsx(
166
167
  dropdownMenu.DropdownMenu.Trigger,
@@ -204,7 +205,10 @@ function TraceDataPanelView({
204
205
  children: traceId && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
205
206
  headerSlot,
206
207
  /* @__PURE__ */ jsxRuntime.jsx(dataPanel.DataPanel.Header, { children: isOnTracePage ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
207
- /* @__PURE__ */ jsxRuntime.jsx(dataPanel.DataPanel.Heading, { children: "Trace Timeline" }),
208
+ /* @__PURE__ */ jsxRuntime.jsxs(dataPanel.DataPanel.HeaderContent, { children: [
209
+ /* @__PURE__ */ jsxRuntime.jsx(dataPanel.DataPanel.Heading, { children: "Trace Timeline" }),
210
+ traceSummary
211
+ ] }),
208
212
  /* @__PURE__ */ jsxRuntime.jsx(dataPanel.DataPanel.HeaderActions, { children: traceActionsMenu })
209
213
  ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
210
214
  /* @__PURE__ */ jsxRuntime.jsx(dataPanel.DataPanel.CloseButton, { onClick: onClose }),
@@ -213,15 +217,7 @@ function TraceDataPanelView({
213
217
  "Trace",
214
218
  /* @__PURE__ */ jsxRuntime.jsx(domains_traces_components_traceIdButton.TraceIdButton, { id: traceId })
215
219
  ] }),
216
- rootSpan && /* @__PURE__ */ jsxRuntime.jsx(
217
- domains_traces_components_traceSummaryDescription.TraceSummaryDescription,
218
- {
219
- rootSpan,
220
- usage,
221
- entityHref,
222
- LinkComponent
223
- }
224
- )
220
+ traceSummary
225
221
  ] }),
226
222
  /* @__PURE__ */ jsxRuntime.jsxs(dataPanel.DataPanel.HeaderActions, { children: [
227
223
  onEvaluateTrace && /* @__PURE__ */ jsxRuntime.jsxs(Button.Button, { variant: "primary", size: "sm", onClick: onEvaluateTrace, disabled: !rootSpan, children: [
@@ -1 +1 @@
1
- {"version":3,"file":"trace-data-panel-view.cjs.js","sources":["../../../../src/domains/traces/components/trace-data-panel-view.tsx"],"sourcesContent":["import {\n ChartGanttIcon,\n CircleGaugeIcon,\n DownloadIcon,\n Link2Icon,\n ListTreeIcon,\n Loader2Icon,\n MessageSquareReplyIcon,\n MessageSquareTextIcon,\n MoreHorizontalIcon,\n SaveIcon,\n WrenchIcon,\n} from 'lucide-react';\nimport { useEffect, useId, useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { getAllSpanIds } from '../hooks/get-all-span-ids';\nimport { useDownloadTraceJson } from '../hooks/use-download-trace-json';\nimport { useTraceSearch } from '../hooks/use-trace-search';\nimport type { TraceUsageSummary } from '../trace-list-columns';\nimport type { SearchableSpan } from '../types';\nimport { formatHierarchicalSpans } from './format-hierarchical-spans';\nimport { TraceIdButton } from './trace-id-button';\nimport { TraceSpanTimeline } from './trace-span-timeline';\nimport { TraceSpanTree } from './trace-span-tree';\nimport { TraceSummaryDescription } from './trace-summary-description';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport type { DataPanelProps } from '@/ds/components/DataPanel';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu';\nimport { SearchFieldBlock } from '@/ds/components/FormFieldBlocks';\nimport { Notice } from '@/ds/components/Notice';\nimport { Tab, TabList, Tabs } from '@/ds/components/Tabs';\nimport { Icon } from '@/ds/icons/Icon';\nimport { ScorersIcon } from '@/ds/icons/ScorersIcon';\nimport type { LinkComponent } from '@/ds/types/link-component';\nimport { useScrollToFirstHighlight } from '@/hooks/use-scroll-to-first-highlight';\nimport { useTextHighlight } from '@/hooks/use-text-highlight';\nimport { cn } from '@/lib/utils';\n\nexport type TraceDataPanelPlacement = 'traces-list' | 'trace-page';\n\nexport type TraceSpanView = 'tree' | 'timeline';\n\n/** What the side column next to the span tree shows. */\nexport type TraceSideView = 'messages' | 'feedback' | 'scores';\n\nexport interface TraceDataPanelViewProps {\n /** Keep the panel mounted and pass `undefined` to close it, so the drawer animates out. */\n traceId?: string;\n /** Lightweight spans for the trace. Caller fetches via useTraceLightSpans. */\n spans: SearchableSpan[] | undefined;\n isLoading?: boolean;\n onClose: () => void;\n onSpanSelect?: (spanId: string | undefined) => void;\n onEvaluateTrace?: () => void;\n /** When set, an \"Add full trace to dataset\" 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 /** Drawer width; defaults to `wide` since the panel lays out several columns. */\n size?: DataPanelProps['size'];\n /** Elevation when opened next to other sibling panels. */\n depth?: DataPanelProps['depth'];\n /** Rendered inside the drawer above the trace header (e.g. inbox feedback context). */\n headerSlot?: ReactNode;\n /** Accessible drawer name; defaults to the trace id. */\n title?: string;\n placement: TraceDataPanelPlacement;\n /** @deprecated No longer used: the panel renders the span tree with the duration as text. */\n timelineChartWidth?: 'wide' | 'default';\n /** When both are provided, renders an \"Open trace page\" button. */\n LinkComponent?: LinkComponent;\n traceHref?: string;\n /** When provided, the entity name in the trace summary links to the entity's page. */\n entityHref?: string;\n /** Token and estimated-cost totals shown in the compact trace summary. */\n usage?: TraceUsageSummary;\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 * When provided, a \"Scores\" tab appears; the slot renders whatever trace-level\n * scoring UI the consumer wants.\n */\n scoresTabSlot?: (args: { traceId: string; rootSpanId: string | undefined }) => ReactNode;\n /** Optional count shown in the \"Scores\" tab label. */\n scoresTabBadge?: ReactNode;\n /**\n * When provided, a \"Feedback\" tab appears; the slot renders the trace-level\n * feedback UI. Trace feedback is not scoped to a span — the span panel owns that.\n */\n feedbackTabSlot?: (args: { traceId: string }) => ReactNode;\n /** Optional count rendered after the \"Feedback\" tab label, e.g. `Feedback (3)`. */\n feedbackTabBadge?: ReactNode;\n /** Span ids to feature in the timeline; every other span is faded. */\n featuredSpanIds?: string[];\n /**\n * The \"Messages\" view of the side column next to the span tree (typically the\n * trace as one reconstructed agent turn). Rendered without content padding.\n */\n messagesPanelSlot?: ReactNode;\n /** Controlled span view (tree or timeline); falls back to local state starting on the tree. */\n spanView?: TraceSpanView;\n onSpanViewChange?: (view: TraceSpanView) => void;\n /** Controlled side column view; falls back to the first available view. */\n sideView?: TraceSideView;\n onSideViewChange?: (view: TraceSideView) => void;\n /**\n * Rendered as a column to the right of the timeline inside the same card;\n * typically the span detail.\n */\n spanPanelSlot?: ReactNode;\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 size = 'wide',\n depth,\n headerSlot,\n title,\n placement,\n LinkComponent,\n traceHref,\n entityHref,\n usage,\n anchorSpanId,\n showUnavailableFeaturesMsg = true,\n scoresTabSlot,\n scoresTabBadge,\n feedbackTabSlot,\n feedbackTabBadge,\n featuredSpanIds,\n messagesPanelSlot,\n sideView: controlledSideView,\n onSideViewChange,\n spanView: controlledSpanView,\n onSpanViewChange,\n spanPanelSlot,\n}: TraceDataPanelViewProps) {\n const isOnTracePage = placement === 'trace-page';\n\n // The side column next to the span tree hosts Messages / Feedback / Scores;\n // which one is shown is purely a local viewing choice.\n const sideViews = useMemo(() => {\n const views: Array<{ value: TraceSideView; label: ReactNode }> = [];\n if (messagesPanelSlot) {\n views.push({\n value: 'messages',\n label: (\n <>\n <Icon size=\"xs\">\n <MessageSquareTextIcon />\n </Icon>\n Messages\n </>\n ),\n });\n }\n if (feedbackTabSlot) {\n views.push({\n value: 'feedback',\n label: (\n <>\n <Icon size=\"xs\">\n <MessageSquareReplyIcon />\n </Icon>\n Feedback{feedbackTabBadge != null && <> ({feedbackTabBadge})</>}\n </>\n ),\n });\n }\n if (scoresTabSlot) {\n views.push({\n value: 'scores',\n label: (\n <>\n <Icon size=\"xs\">\n <ScorersIcon />\n </Icon>\n Scores{scoresTabBadge != null && <> ({scoresTabBadge})</>}\n </>\n ),\n });\n }\n return views;\n }, [messagesPanelSlot, feedbackTabSlot, feedbackTabBadge, scoresTabSlot, scoresTabBadge]);\n const [uncontrolledSideView, setUncontrolledSideView] = useState<TraceSideView>();\n const chosenSideView = controlledSideView ?? uncontrolledSideView;\n const sideView = (sideViews.find(view => view.value === chosenSideView) ?? sideViews[0])?.value;\n const handleSideViewChange = (view: TraceSideView) => {\n setUncontrolledSideView(view);\n onSideViewChange?.(view);\n };\n\n const [uncontrolledSpanView, setUncontrolledSpanView] = useState<TraceSpanView>('tree');\n const spanView = controlledSpanView ?? uncontrolledSpanView;\n const setSpanView = (view: TraceSpanView) => {\n setUncontrolledSpanView(view);\n onSpanViewChange?.(view);\n };\n\n const { download: downloadTraceJson, isPending: isDownloadingTrace } = useDownloadTraceJson();\n\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 const searchFieldName = useId();\n const { query, setQuery, results, payloadOnlyMatchIds } = useTraceSearch(spans ?? []);\n\n const hierarchicalSpans = useMemo(\n () =>\n formatHierarchicalSpans(\n // Carried on the span rather than drilled as a prop: the tree is rebuilt here and\n // rendered several components deeper.\n results.map(span => ({ ...span, matchedInPayloadOnly: payloadOnlyMatchIds.has(span.spanId) })),\n anchorSpanId,\n ),\n [results, payloadOnlyMatchIds, anchorSpanId],\n );\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 const handleSpanClick = (id: string) => {\n const newId = selectedSpanId === id ? undefined : id;\n setSelectedSpanId(newId);\n onSpanSelect?.(newId);\n };\n\n const traceActionsMenu = traceId && (\n <DropdownMenu>\n <DropdownMenu.Trigger\n render={\n <Button size=\"sm\" variant=\"ghost\" tooltip=\"Open trace actions\" aria-label=\"Open trace actions\">\n <MoreHorizontalIcon />\n </Button>\n }\n />\n <DropdownMenu.Content align=\"end\">\n {!isOnTracePage && onSaveAsDatasetItem && (\n <DropdownMenu.Item onSelect={() => onSaveAsDatasetItem({ traceId, rootSpanId: rootSpan?.spanId })}>\n <SaveIcon />\n Add full trace to dataset\n </DropdownMenu.Item>\n )}\n {!isOnTracePage && onAddTraceMocksToItem && (\n <DropdownMenu.Item onSelect={() => onAddTraceMocksToItem({ traceId })}>\n <WrenchIcon />\n Add tool mocks to item\n </DropdownMenu.Item>\n )}\n {!isOnTracePage && LinkComponent && traceHref && (\n <DropdownMenu.Item render={<LinkComponent href={traceHref} />}>\n <Link2Icon />\n Open trace page\n </DropdownMenu.Item>\n )}\n <DropdownMenu.Item disabled={isDownloadingTrace} onSelect={() => downloadTraceJson(traceId)}>\n {isDownloadingTrace ? <Loader2Icon className=\"animate-spin\" /> : <DownloadIcon />}\n Download trace JSON\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu>\n );\n\n const sideColumn =\n traceId && sideView ? (\n <div data-trace-side-column className=\"flex h-full min-h-0 min-w-0 flex-col overflow-hidden\">\n {/* Same chrome as the trace column's Spans/Timeline header, so the two tab rows line up. */}\n <Tabs<TraceSideView> defaultTab={sideView} value={sideView} onValueChange={handleSideViewChange}>\n <DataPanel.Header className=\"border-b border-border\">\n <TabList variant=\"pill-ghost\" size=\"sm\">\n {sideViews.map(view => (\n <Tab key={view.value} value={view.value}>\n {view.label}\n </Tab>\n ))}\n </TabList>\n </DataPanel.Header>\n </Tabs>\n {/* The turn view brings its own padding; feedback and scores use the panel's. */}\n {sideView === 'messages' && <DataPanel.Content className=\"p-0\">{messagesPanelSlot}</DataPanel.Content>}\n {sideView === 'feedback' && <DataPanel.Content>{feedbackTabSlot?.({ traceId })}</DataPanel.Content>}\n {sideView === 'scores' && (\n <DataPanel.Content>{scoresTabSlot?.({ traceId, rootSpanId: rootSpan?.spanId })}</DataPanel.Content>\n )}\n </div>\n ) : null;\n\n return (\n <DataPanel\n open={!!traceId}\n onClose={onClose}\n title={title ?? (isOnTracePage ? 'Trace Timeline' : `Trace ${traceId ?? ''}`)}\n size={size}\n depth={depth}\n >\n {traceId && (\n <>\n {headerSlot}\n <DataPanel.Header>\n {isOnTracePage ? (\n <>\n <DataPanel.Heading>Trace Timeline</DataPanel.Heading>\n <DataPanel.HeaderActions>{traceActionsMenu}</DataPanel.HeaderActions>\n </>\n ) : (\n <>\n <DataPanel.CloseButton onClick={onClose} />\n <DataPanel.HeaderContent>\n <DataPanel.Heading>\n Trace\n <TraceIdButton id={traceId} />\n </DataPanel.Heading>\n {rootSpan && (\n <TraceSummaryDescription\n rootSpan={rootSpan}\n usage={usage}\n entityHref={entityHref}\n LinkComponent={LinkComponent}\n />\n )}\n </DataPanel.HeaderContent>\n <DataPanel.HeaderActions>\n {onEvaluateTrace && (\n <Button variant=\"primary\" size=\"sm\" onClick={onEvaluateTrace} disabled={!rootSpan}>\n <CircleGaugeIcon />\n Score trace\n </Button>\n )}\n {traceActionsMenu}\n {(onPrevious || onNext) && (\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Go to previous trace\"\n nextLabel=\"Go to next trace\"\n />\n )}\n </DataPanel.HeaderActions>\n </>\n )}\n </DataPanel.Header>\n\n <TracePanelColumns\n sideColumnSlot={sideColumn}\n spanPanelSlot={spanPanelSlot}\n highlightQuery={query}\n spanPanelKey={selectedSpanId}\n >\n {!isLoading && !spans?.length ? (\n <DataPanel.NoData>No spans found for this trace.</DataPanel.NoData>\n ) : (\n (() => {\n // Shared by the Spans and Timeline tabs: both views render the same\n // filtered `hierarchicalSpans`, so one query drives both.\n const isTimeline = spanView === 'timeline';\n const searchHeader = (\n <DataPanel.Header className=\"gap-2 border-b border-border\">\n <SearchFieldBlock\n name={searchFieldName}\n label=\"Search spans\"\n labelIsHidden\n placeholder=\"Search spans...\"\n value={query}\n onChange={e => setQuery(e.target.value)}\n onReset={() => setQuery('')}\n size=\"sm\"\n className=\"w-full\"\n />\n <ButtonsGroup size=\"sm\" className=\"shrink-0\">\n <Button\n variant={isTimeline ? 'default' : 'primary'}\n aria-pressed={!isTimeline}\n tooltip=\"Span tree\"\n onClick={() => setSpanView('tree')}\n >\n <ListTreeIcon />\n </Button>\n <Button\n variant={isTimeline ? 'primary' : 'default'}\n aria-pressed={isTimeline}\n tooltip=\"Timeline\"\n onClick={() => setSpanView('timeline')}\n >\n <ChartGanttIcon />\n </Button>\n </ButtonsGroup>\n </DataPanel.Header>\n );\n const noSearchResults = !isLoading && hierarchicalSpans.length === 0 && (\n <DataPanel.NoData>No spans match your search.</DataPanel.NoData>\n );\n const viewProps = {\n hierarchicalSpans,\n onSpanClick: handleSpanClick,\n selectedSpanId,\n expandedSpanIds,\n setExpandedSpanIds,\n featuredSpanIds,\n isLoading,\n };\n\n return (\n <>\n {searchHeader}\n <DataPanel.Content>\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 {/* Both views share selection + expansion state, and stay mounted with no\n results because they host the search field: unmounting would strand the\n user with a query they can no longer clear. */}\n {isTimeline ? <TraceSpanTimeline {...viewProps} /> : <TraceSpanTree {...viewProps} />}\n {noSearchResults}\n </DataPanel.Content>\n </>\n );\n })()\n )}\n </TracePanelColumns>\n </>\n )}\n </DataPanel>\n );\n}\n\n/**\n * Lays out the card body as three columns — `[side] [trace] [span]` — inside the\n * same card. The side column (messages / feedback / scores) is independent of the\n * Spans/Timeline tabs, so it sits beside them rather than inside a tab. The span\n * cell always exists and collapses to zero when hidden, so opening/closing it\n * animates via `grid-template-columns` rather than mounting/unmounting a DOM\n * column (which cannot be transitioned).\n * Search matches — span names in the timeline tree as well as values in the span\n * detail — are highlighted while a query is active.\n */\nfunction TracePanelColumns({\n sideColumnSlot,\n spanPanelSlot,\n highlightQuery,\n spanPanelKey,\n children,\n}: {\n /** Fixed-width column on the left; the trace and span tracks share the remaining space. */\n sideColumnSlot?: ReactNode;\n spanPanelSlot?: ReactNode;\n highlightQuery: string;\n /** Identity of the span shown in the panel; changing it re-triggers the match scroll. */\n spanPanelKey?: string;\n children: ReactNode;\n}) {\n // A single hook call on the common ancestor covers both the timeline tree and\n // the span detail, so span names and payload values highlight together.\n const { ref: highlightRef } = useTextHighlight<HTMLDivElement>(highlightQuery);\n\n // Scoped to the span-panel column only: a match deep in a large payload sits below\n // the fold, so the first painted match is brought into view when the panel opens.\n // The timeline column must never be scrolled by this.\n const { ref: scrollToMatchRef } = useScrollToFirstHighlight<HTMLDivElement>(highlightQuery, spanPanelKey);\n\n return (\n <div\n ref={highlightRef}\n data-trace-columns\n className={cn(\n 'grid min-h-0 flex-1 transition-[grid-template-columns] duration-300 ease-in-out',\n sideColumnSlot\n ? spanPanelSlot\n ? 'grid-cols-[18rem_1fr_1fr] lg:grid-cols-[24rem_1fr_1fr]'\n : 'grid-cols-[18rem_1fr_0fr] lg:grid-cols-[24rem_1fr_0fr]'\n : spanPanelSlot\n ? 'grid-cols-[0px_1fr_1fr]'\n : 'grid-cols-[0px_1fr_0fr]',\n )}\n >\n <div className={cn('flex min-h-0 min-w-0 flex-col overflow-hidden', sideColumnSlot && 'border-r border-border')}>\n {sideColumnSlot}\n </div>\n <div className=\"flex min-h-0 min-w-0 flex-col overflow-hidden\">{children}</div>\n {/* Searchable: the span detail is where a match hides inside a large payload. */}\n <div\n ref={scrollToMatchRef}\n data-highlight\n className={cn(\n 'flex min-h-0 min-w-0 flex-col overflow-hidden',\n spanPanelSlot && 'animate-in border-l border-border duration-300 fade-in-0',\n )}\n >\n {spanPanelSlot}\n </div>\n </div>\n );\n}\n"],"names":["useMemo","jsxs","Fragment","jsx","Icon","MessageSquareTextIcon","MessageSquareReplyIcon","ScorersIcon","useState","useDownloadTraceJson","useEffect","useId","useTraceSearch","formatHierarchicalSpans","getAllSpanIds","DropdownMenu","Button","MoreHorizontalIcon","SaveIcon","WrenchIcon","Link2Icon","Loader2Icon","DownloadIcon","Tabs","DataPanel","TabList","Tab","TraceIdButton","TraceSummaryDescription","CircleGaugeIcon","SearchFieldBlock","ButtonsGroup","ListTreeIcon","ChartGanttIcon","Notice","TraceSpanTimeline","TraceSpanTree","useTextHighlight","useScrollToFirstHighlight","cn"],"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 {\n ChartGanttIcon,\n CircleGaugeIcon,\n DownloadIcon,\n Link2Icon,\n ListTreeIcon,\n Loader2Icon,\n MessageSquareReplyIcon,\n MessageSquareTextIcon,\n MoreHorizontalIcon,\n SaveIcon,\n WrenchIcon,\n} from 'lucide-react';\nimport { useEffect, useId, useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { getAllSpanIds } from '../hooks/get-all-span-ids';\nimport { useDownloadTraceJson } from '../hooks/use-download-trace-json';\nimport { useTraceSearch } from '../hooks/use-trace-search';\nimport type { TraceUsageSummary } from '../trace-list-columns';\nimport type { SearchableSpan } from '../types';\nimport { formatHierarchicalSpans } from './format-hierarchical-spans';\nimport { TraceIdButton } from './trace-id-button';\nimport { TraceSpanTimeline } from './trace-span-timeline';\nimport { TraceSpanTree } from './trace-span-tree';\nimport { TraceSummaryDescription } from './trace-summary-description';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport type { DataPanelProps } from '@/ds/components/DataPanel';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu';\nimport { SearchFieldBlock } from '@/ds/components/FormFieldBlocks';\nimport { Notice } from '@/ds/components/Notice';\nimport { Tab, TabList, Tabs } from '@/ds/components/Tabs';\nimport { Icon } from '@/ds/icons/Icon';\nimport { ScorersIcon } from '@/ds/icons/ScorersIcon';\nimport type { LinkComponent } from '@/ds/types/link-component';\nimport { useScrollToFirstHighlight } from '@/hooks/use-scroll-to-first-highlight';\nimport { useTextHighlight } from '@/hooks/use-text-highlight';\nimport { cn } from '@/lib/utils';\n\nexport type TraceDataPanelPlacement = 'traces-list' | 'trace-page';\n\nexport type TraceSpanView = 'tree' | 'timeline';\n\n/** What the side column next to the span tree shows. */\nexport type TraceSideView = 'messages' | 'feedback' | 'scores';\n\nexport interface TraceDataPanelViewProps {\n /** Keep the panel mounted and pass `undefined` to close it, so the drawer animates out. */\n traceId?: string;\n /** Lightweight spans for the trace. Caller fetches via useTraceLightSpans. */\n spans: SearchableSpan[] | undefined;\n isLoading?: boolean;\n onClose: () => void;\n onSpanSelect?: (spanId: string | undefined) => void;\n onEvaluateTrace?: () => void;\n /** When set, an \"Add full trace to dataset\" 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 /** Drawer width; defaults to `wide` since the panel lays out several columns. */\n size?: DataPanelProps['size'];\n /** Elevation when opened next to other sibling panels. */\n depth?: DataPanelProps['depth'];\n /** Rendered inside the drawer above the trace header (e.g. inbox feedback context). */\n headerSlot?: ReactNode;\n /** Accessible drawer name; defaults to the trace id. */\n title?: string;\n placement: TraceDataPanelPlacement;\n /** @deprecated No longer used: the panel renders the span tree with the duration as text. */\n timelineChartWidth?: 'wide' | 'default';\n /** When both are provided, renders an \"Open trace page\" button. */\n LinkComponent?: LinkComponent;\n traceHref?: string;\n /** When provided, the entity name in the trace summary links to the entity's page. */\n entityHref?: string;\n /** Token and estimated-cost totals shown in the compact trace summary. */\n usage?: TraceUsageSummary;\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 * When provided, a \"Scores\" tab appears; the slot renders whatever trace-level\n * scoring UI the consumer wants.\n */\n scoresTabSlot?: (args: { traceId: string; rootSpanId: string | undefined }) => ReactNode;\n /** Optional count shown in the \"Scores\" tab label. */\n scoresTabBadge?: ReactNode;\n /**\n * When provided, a \"Feedback\" tab appears; the slot renders the trace-level\n * feedback UI. Trace feedback is not scoped to a span — the span panel owns that.\n */\n feedbackTabSlot?: (args: { traceId: string }) => ReactNode;\n /** Optional count rendered after the \"Feedback\" tab label, e.g. `Feedback (3)`. */\n feedbackTabBadge?: ReactNode;\n /** Span ids to feature in the timeline; every other span is faded. */\n featuredSpanIds?: string[];\n /**\n * The \"Messages\" view of the side column next to the span tree (typically the\n * trace as one reconstructed agent turn). Rendered without content padding.\n */\n messagesPanelSlot?: ReactNode;\n /** Controlled span view (tree or timeline); falls back to local state starting on the tree. */\n spanView?: TraceSpanView;\n onSpanViewChange?: (view: TraceSpanView) => void;\n /** Controlled side column view; falls back to the first available view. */\n sideView?: TraceSideView;\n onSideViewChange?: (view: TraceSideView) => void;\n /**\n * Rendered as a column to the right of the timeline inside the same card;\n * typically the span detail.\n */\n spanPanelSlot?: ReactNode;\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 size = 'wide',\n depth,\n headerSlot,\n title,\n placement,\n LinkComponent,\n traceHref,\n entityHref,\n usage,\n anchorSpanId,\n showUnavailableFeaturesMsg = true,\n scoresTabSlot,\n scoresTabBadge,\n feedbackTabSlot,\n feedbackTabBadge,\n featuredSpanIds,\n messagesPanelSlot,\n sideView: controlledSideView,\n onSideViewChange,\n spanView: controlledSpanView,\n onSpanViewChange,\n spanPanelSlot,\n}: TraceDataPanelViewProps) {\n const isOnTracePage = placement === 'trace-page';\n\n // The side column next to the span tree hosts Messages / Feedback / Scores;\n // which one is shown is purely a local viewing choice.\n const sideViews = useMemo(() => {\n const views: Array<{ value: TraceSideView; label: ReactNode }> = [];\n if (messagesPanelSlot) {\n views.push({\n value: 'messages',\n label: (\n <>\n <Icon size=\"xs\">\n <MessageSquareTextIcon />\n </Icon>\n Messages\n </>\n ),\n });\n }\n if (feedbackTabSlot) {\n views.push({\n value: 'feedback',\n label: (\n <>\n <Icon size=\"xs\">\n <MessageSquareReplyIcon />\n </Icon>\n Feedback{feedbackTabBadge != null && <> ({feedbackTabBadge})</>}\n </>\n ),\n });\n }\n if (scoresTabSlot) {\n views.push({\n value: 'scores',\n label: (\n <>\n <Icon size=\"xs\">\n <ScorersIcon />\n </Icon>\n Scores{scoresTabBadge != null && <> ({scoresTabBadge})</>}\n </>\n ),\n });\n }\n return views;\n }, [messagesPanelSlot, feedbackTabSlot, feedbackTabBadge, scoresTabSlot, scoresTabBadge]);\n const [uncontrolledSideView, setUncontrolledSideView] = useState<TraceSideView>();\n const chosenSideView = controlledSideView ?? uncontrolledSideView;\n const sideView = (sideViews.find(view => view.value === chosenSideView) ?? sideViews[0])?.value;\n const handleSideViewChange = (view: TraceSideView) => {\n setUncontrolledSideView(view);\n onSideViewChange?.(view);\n };\n\n const [uncontrolledSpanView, setUncontrolledSpanView] = useState<TraceSpanView>('tree');\n const spanView = controlledSpanView ?? uncontrolledSpanView;\n const setSpanView = (view: TraceSpanView) => {\n setUncontrolledSpanView(view);\n onSpanViewChange?.(view);\n };\n\n const { download: downloadTraceJson, isPending: isDownloadingTrace } = useDownloadTraceJson();\n\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 const searchFieldName = useId();\n const { query, setQuery, results, payloadOnlyMatchIds } = useTraceSearch(spans ?? []);\n\n const hierarchicalSpans = useMemo(\n () =>\n formatHierarchicalSpans(\n // Carried on the span rather than drilled as a prop: the tree is rebuilt here and\n // rendered several components deeper.\n results.map(span => ({ ...span, matchedInPayloadOnly: payloadOnlyMatchIds.has(span.spanId) })),\n anchorSpanId,\n ),\n [results, payloadOnlyMatchIds, anchorSpanId],\n );\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 const handleSpanClick = (id: string) => {\n const newId = selectedSpanId === id ? undefined : id;\n setSelectedSpanId(newId);\n onSpanSelect?.(newId);\n };\n\n const traceSummary = rootSpan && (\n <TraceSummaryDescription rootSpan={rootSpan} usage={usage} entityHref={entityHref} LinkComponent={LinkComponent} />\n );\n\n const traceActionsMenu = traceId && (\n <DropdownMenu>\n <DropdownMenu.Trigger\n render={\n <Button size=\"sm\" variant=\"ghost\" tooltip=\"Open trace actions\" aria-label=\"Open trace actions\">\n <MoreHorizontalIcon />\n </Button>\n }\n />\n <DropdownMenu.Content align=\"end\">\n {!isOnTracePage && onSaveAsDatasetItem && (\n <DropdownMenu.Item onSelect={() => onSaveAsDatasetItem({ traceId, rootSpanId: rootSpan?.spanId })}>\n <SaveIcon />\n Add full trace to dataset\n </DropdownMenu.Item>\n )}\n {!isOnTracePage && onAddTraceMocksToItem && (\n <DropdownMenu.Item onSelect={() => onAddTraceMocksToItem({ traceId })}>\n <WrenchIcon />\n Add tool mocks to item\n </DropdownMenu.Item>\n )}\n {!isOnTracePage && LinkComponent && traceHref && (\n <DropdownMenu.Item render={<LinkComponent href={traceHref} />}>\n <Link2Icon />\n Open trace page\n </DropdownMenu.Item>\n )}\n <DropdownMenu.Item disabled={isDownloadingTrace} onSelect={() => downloadTraceJson(traceId)}>\n {isDownloadingTrace ? <Loader2Icon className=\"animate-spin\" /> : <DownloadIcon />}\n Download trace JSON\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu>\n );\n\n const sideColumn =\n traceId && sideView ? (\n <div data-trace-side-column className=\"flex h-full min-h-0 min-w-0 flex-col overflow-hidden\">\n {/* Same chrome as the trace column's Spans/Timeline header, so the two tab rows line up. */}\n <Tabs<TraceSideView> defaultTab={sideView} value={sideView} onValueChange={handleSideViewChange}>\n <DataPanel.Header className=\"border-b border-border\">\n <TabList variant=\"pill-ghost\" size=\"sm\">\n {sideViews.map(view => (\n <Tab key={view.value} value={view.value}>\n {view.label}\n </Tab>\n ))}\n </TabList>\n </DataPanel.Header>\n </Tabs>\n {/* The turn view brings its own padding; feedback and scores use the panel's. */}\n {sideView === 'messages' && <DataPanel.Content className=\"p-0\">{messagesPanelSlot}</DataPanel.Content>}\n {sideView === 'feedback' && <DataPanel.Content>{feedbackTabSlot?.({ traceId })}</DataPanel.Content>}\n {sideView === 'scores' && (\n <DataPanel.Content>{scoresTabSlot?.({ traceId, rootSpanId: rootSpan?.spanId })}</DataPanel.Content>\n )}\n </div>\n ) : null;\n\n return (\n <DataPanel\n open={!!traceId}\n onClose={onClose}\n title={title ?? (isOnTracePage ? 'Trace Timeline' : `Trace ${traceId ?? ''}`)}\n size={size}\n depth={depth}\n >\n {traceId && (\n <>\n {headerSlot}\n <DataPanel.Header>\n {isOnTracePage ? (\n <>\n <DataPanel.HeaderContent>\n <DataPanel.Heading>Trace Timeline</DataPanel.Heading>\n {traceSummary}\n </DataPanel.HeaderContent>\n <DataPanel.HeaderActions>{traceActionsMenu}</DataPanel.HeaderActions>\n </>\n ) : (\n <>\n <DataPanel.CloseButton onClick={onClose} />\n <DataPanel.HeaderContent>\n <DataPanel.Heading>\n Trace\n <TraceIdButton id={traceId} />\n </DataPanel.Heading>\n {traceSummary}\n </DataPanel.HeaderContent>\n <DataPanel.HeaderActions>\n {onEvaluateTrace && (\n <Button variant=\"primary\" size=\"sm\" onClick={onEvaluateTrace} disabled={!rootSpan}>\n <CircleGaugeIcon />\n Score trace\n </Button>\n )}\n {traceActionsMenu}\n {(onPrevious || onNext) && (\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Go to previous trace\"\n nextLabel=\"Go to next trace\"\n />\n )}\n </DataPanel.HeaderActions>\n </>\n )}\n </DataPanel.Header>\n\n <TracePanelColumns\n sideColumnSlot={sideColumn}\n spanPanelSlot={spanPanelSlot}\n highlightQuery={query}\n spanPanelKey={selectedSpanId}\n >\n {!isLoading && !spans?.length ? (\n <DataPanel.NoData>No spans found for this trace.</DataPanel.NoData>\n ) : (\n (() => {\n // Shared by the Spans and Timeline tabs: both views render the same\n // filtered `hierarchicalSpans`, so one query drives both.\n const isTimeline = spanView === 'timeline';\n const searchHeader = (\n <DataPanel.Header className=\"gap-2 border-b border-border\">\n <SearchFieldBlock\n name={searchFieldName}\n label=\"Search spans\"\n labelIsHidden\n placeholder=\"Search spans...\"\n value={query}\n onChange={e => setQuery(e.target.value)}\n onReset={() => setQuery('')}\n size=\"sm\"\n className=\"w-full\"\n />\n <ButtonsGroup size=\"sm\" className=\"shrink-0\">\n <Button\n variant={isTimeline ? 'default' : 'primary'}\n aria-pressed={!isTimeline}\n tooltip=\"Span tree\"\n onClick={() => setSpanView('tree')}\n >\n <ListTreeIcon />\n </Button>\n <Button\n variant={isTimeline ? 'primary' : 'default'}\n aria-pressed={isTimeline}\n tooltip=\"Timeline\"\n onClick={() => setSpanView('timeline')}\n >\n <ChartGanttIcon />\n </Button>\n </ButtonsGroup>\n </DataPanel.Header>\n );\n const noSearchResults = !isLoading && hierarchicalSpans.length === 0 && (\n <DataPanel.NoData>No spans match your search.</DataPanel.NoData>\n );\n const viewProps = {\n hierarchicalSpans,\n onSpanClick: handleSpanClick,\n selectedSpanId,\n expandedSpanIds,\n setExpandedSpanIds,\n featuredSpanIds,\n isLoading,\n };\n\n return (\n <>\n {searchHeader}\n <DataPanel.Content>\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 {/* Both views share selection + expansion state, and stay mounted with no\n results because they host the search field: unmounting would strand the\n user with a query they can no longer clear. */}\n {isTimeline ? <TraceSpanTimeline {...viewProps} /> : <TraceSpanTree {...viewProps} />}\n {noSearchResults}\n </DataPanel.Content>\n </>\n );\n })()\n )}\n </TracePanelColumns>\n </>\n )}\n </DataPanel>\n );\n}\n\n/**\n * Lays out the card body as three columns — `[side] [trace] [span]` — inside the\n * same card. The side column (messages / feedback / scores) is independent of the\n * Spans/Timeline tabs, so it sits beside them rather than inside a tab. The span\n * cell always exists and collapses to zero when hidden, so opening/closing it\n * animates via `grid-template-columns` rather than mounting/unmounting a DOM\n * column (which cannot be transitioned).\n * Search matches — span names in the timeline tree as well as values in the span\n * detail — are highlighted while a query is active.\n */\nfunction TracePanelColumns({\n sideColumnSlot,\n spanPanelSlot,\n highlightQuery,\n spanPanelKey,\n children,\n}: {\n /** Fixed-width column on the left; the trace and span tracks share the remaining space. */\n sideColumnSlot?: ReactNode;\n spanPanelSlot?: ReactNode;\n highlightQuery: string;\n /** Identity of the span shown in the panel; changing it re-triggers the match scroll. */\n spanPanelKey?: string;\n children: ReactNode;\n}) {\n // A single hook call on the common ancestor covers both the timeline tree and\n // the span detail, so span names and payload values highlight together.\n const { ref: highlightRef } = useTextHighlight<HTMLDivElement>(highlightQuery);\n\n // Scoped to the span-panel column only: a match deep in a large payload sits below\n // the fold, so the first painted match is brought into view when the panel opens.\n // The timeline column must never be scrolled by this.\n const { ref: scrollToMatchRef } = useScrollToFirstHighlight<HTMLDivElement>(highlightQuery, spanPanelKey);\n\n return (\n <div\n ref={highlightRef}\n data-trace-columns\n className={cn(\n 'grid min-h-0 flex-1 transition-[grid-template-columns] duration-300 ease-in-out',\n sideColumnSlot\n ? spanPanelSlot\n ? 'grid-cols-[18rem_1fr_1fr] lg:grid-cols-[24rem_1fr_1fr]'\n : 'grid-cols-[18rem_1fr_0fr] lg:grid-cols-[24rem_1fr_0fr]'\n : spanPanelSlot\n ? 'grid-cols-[0px_1fr_1fr]'\n : 'grid-cols-[0px_1fr_0fr]',\n )}\n >\n <div className={cn('flex min-h-0 min-w-0 flex-col overflow-hidden', sideColumnSlot && 'border-r border-border')}>\n {sideColumnSlot}\n </div>\n <div className=\"flex min-h-0 min-w-0 flex-col overflow-hidden\">{children}</div>\n {/* Searchable: the span detail is where a match hides inside a large payload. */}\n <div\n ref={scrollToMatchRef}\n data-highlight\n className={cn(\n 'flex min-h-0 min-w-0 flex-col overflow-hidden',\n spanPanelSlot && 'animate-in border-l border-border duration-300 fade-in-0',\n )}\n >\n {spanPanelSlot}\n </div>\n </div>\n );\n}\n"],"names":["useMemo","jsxs","Fragment","jsx","Icon","MessageSquareTextIcon","MessageSquareReplyIcon","ScorersIcon","useState","useDownloadTraceJson","useEffect","useId","useTraceSearch","formatHierarchicalSpans","getAllSpanIds","TraceSummaryDescription","DropdownMenu","Button","MoreHorizontalIcon","SaveIcon","WrenchIcon","Link2Icon","Loader2Icon","DownloadIcon","Tabs","DataPanel","TabList","Tab","TraceIdButton","CircleGaugeIcon","SearchFieldBlock","ButtonsGroup","ListTreeIcon","ChartGanttIcon","Notice","TraceSpanTimeline","TraceSpanTree","useTextHighlight","useScrollToFirstHighlight","cn"],"mappings":"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"}
@@ -9,14 +9,14 @@ import { TraceIdButton } from './trace-id-button.es.js';
9
9
  import { TraceSpanTimeline } from './trace-span-timeline.es.js';
10
10
  import { TraceSpanTree } from './trace-span-tree.es.js';
11
11
  import { TraceSummaryDescription } from './trace-summary-description.es.js';
12
- import { B as Button } from '../../../Button-KUj0U-5I.js';
12
+ import { B as Button } from '../../../Button-B8nF87ai.js';
13
13
  import { B as ButtonsGroup } from '../../../buttons-group-DsZgrZBZ.js';
14
- import { D as DataPanel } from '../../../data-panel-Y7wD0xlR.js';
14
+ import { D as DataPanel } from '../../../data-panel-CPZ2GuZN.js';
15
15
  import { D as DropdownMenu } from '../../../dropdown-menu-DpEn6HwK.js';
16
- import { S as SearchFieldBlock } from '../../../search-field-block-B0twxGWI.js';
17
- import { N as Notice } from '../../../Notice-KC18b8Nd.js';
18
- import { a as Tabs, T as TabList } from '../../../tabs-root-B2sdkQ3A.js';
19
- import { T as Tab } from '../../../tabs-tab-u6LS5twu.js';
16
+ import { S as SearchFieldBlock } from '../../../search-field-block-fU3tStmB.js';
17
+ import { N as Notice } from '../../../Notice-WT8G4OA6.js';
18
+ import { a as Tabs, T as TabList } from '../../../tabs-root-UNPxoGhW.js';
19
+ import { T as Tab } from '../../../tabs-tab-DluwCnDF.js';
20
20
  import { Icon } from '../../../icons/Icon.es.js';
21
21
  import { ScorersIcon } from '../../../icons/ScorersIcon.es.js';
22
22
  import { useScrollToFirstHighlight } from '../../../hooks/use-scroll-to-first-highlight.es.js';
@@ -157,6 +157,7 @@ function TraceDataPanelView({
157
157
  setSelectedSpanId(newId);
158
158
  onSpanSelect?.(newId);
159
159
  };
160
+ const traceSummary = rootSpan && /* @__PURE__ */ jsx(TraceSummaryDescription, { rootSpan, usage, entityHref, LinkComponent });
160
161
  const traceActionsMenu = traceId && /* @__PURE__ */ jsxs(DropdownMenu, { children: [
161
162
  /* @__PURE__ */ jsx(
162
163
  DropdownMenu.Trigger,
@@ -200,7 +201,10 @@ function TraceDataPanelView({
200
201
  children: traceId && /* @__PURE__ */ jsxs(Fragment, { children: [
201
202
  headerSlot,
202
203
  /* @__PURE__ */ jsx(DataPanel.Header, { children: isOnTracePage ? /* @__PURE__ */ jsxs(Fragment, { children: [
203
- /* @__PURE__ */ jsx(DataPanel.Heading, { children: "Trace Timeline" }),
204
+ /* @__PURE__ */ jsxs(DataPanel.HeaderContent, { children: [
205
+ /* @__PURE__ */ jsx(DataPanel.Heading, { children: "Trace Timeline" }),
206
+ traceSummary
207
+ ] }),
204
208
  /* @__PURE__ */ jsx(DataPanel.HeaderActions, { children: traceActionsMenu })
205
209
  ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
206
210
  /* @__PURE__ */ jsx(DataPanel.CloseButton, { onClick: onClose }),
@@ -209,15 +213,7 @@ function TraceDataPanelView({
209
213
  "Trace",
210
214
  /* @__PURE__ */ jsx(TraceIdButton, { id: traceId })
211
215
  ] }),
212
- rootSpan && /* @__PURE__ */ jsx(
213
- TraceSummaryDescription,
214
- {
215
- rootSpan,
216
- usage,
217
- entityHref,
218
- LinkComponent
219
- }
220
- )
216
+ traceSummary
221
217
  ] }),
222
218
  /* @__PURE__ */ jsxs(DataPanel.HeaderActions, { children: [
223
219
  onEvaluateTrace && /* @__PURE__ */ jsxs(Button, { variant: "primary", size: "sm", onClick: onEvaluateTrace, disabled: !rootSpan, children: [
@@ -1 +1 @@
1
- {"version":3,"file":"trace-data-panel-view.es.js","sources":["../../../../src/domains/traces/components/trace-data-panel-view.tsx"],"sourcesContent":["import {\n ChartGanttIcon,\n CircleGaugeIcon,\n DownloadIcon,\n Link2Icon,\n ListTreeIcon,\n Loader2Icon,\n MessageSquareReplyIcon,\n MessageSquareTextIcon,\n MoreHorizontalIcon,\n SaveIcon,\n WrenchIcon,\n} from 'lucide-react';\nimport { useEffect, useId, useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { getAllSpanIds } from '../hooks/get-all-span-ids';\nimport { useDownloadTraceJson } from '../hooks/use-download-trace-json';\nimport { useTraceSearch } from '../hooks/use-trace-search';\nimport type { TraceUsageSummary } from '../trace-list-columns';\nimport type { SearchableSpan } from '../types';\nimport { formatHierarchicalSpans } from './format-hierarchical-spans';\nimport { TraceIdButton } from './trace-id-button';\nimport { TraceSpanTimeline } from './trace-span-timeline';\nimport { TraceSpanTree } from './trace-span-tree';\nimport { TraceSummaryDescription } from './trace-summary-description';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport type { DataPanelProps } from '@/ds/components/DataPanel';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu';\nimport { SearchFieldBlock } from '@/ds/components/FormFieldBlocks';\nimport { Notice } from '@/ds/components/Notice';\nimport { Tab, TabList, Tabs } from '@/ds/components/Tabs';\nimport { Icon } from '@/ds/icons/Icon';\nimport { ScorersIcon } from '@/ds/icons/ScorersIcon';\nimport type { LinkComponent } from '@/ds/types/link-component';\nimport { useScrollToFirstHighlight } from '@/hooks/use-scroll-to-first-highlight';\nimport { useTextHighlight } from '@/hooks/use-text-highlight';\nimport { cn } from '@/lib/utils';\n\nexport type TraceDataPanelPlacement = 'traces-list' | 'trace-page';\n\nexport type TraceSpanView = 'tree' | 'timeline';\n\n/** What the side column next to the span tree shows. */\nexport type TraceSideView = 'messages' | 'feedback' | 'scores';\n\nexport interface TraceDataPanelViewProps {\n /** Keep the panel mounted and pass `undefined` to close it, so the drawer animates out. */\n traceId?: string;\n /** Lightweight spans for the trace. Caller fetches via useTraceLightSpans. */\n spans: SearchableSpan[] | undefined;\n isLoading?: boolean;\n onClose: () => void;\n onSpanSelect?: (spanId: string | undefined) => void;\n onEvaluateTrace?: () => void;\n /** When set, an \"Add full trace to dataset\" 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 /** Drawer width; defaults to `wide` since the panel lays out several columns. */\n size?: DataPanelProps['size'];\n /** Elevation when opened next to other sibling panels. */\n depth?: DataPanelProps['depth'];\n /** Rendered inside the drawer above the trace header (e.g. inbox feedback context). */\n headerSlot?: ReactNode;\n /** Accessible drawer name; defaults to the trace id. */\n title?: string;\n placement: TraceDataPanelPlacement;\n /** @deprecated No longer used: the panel renders the span tree with the duration as text. */\n timelineChartWidth?: 'wide' | 'default';\n /** When both are provided, renders an \"Open trace page\" button. */\n LinkComponent?: LinkComponent;\n traceHref?: string;\n /** When provided, the entity name in the trace summary links to the entity's page. */\n entityHref?: string;\n /** Token and estimated-cost totals shown in the compact trace summary. */\n usage?: TraceUsageSummary;\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 * When provided, a \"Scores\" tab appears; the slot renders whatever trace-level\n * scoring UI the consumer wants.\n */\n scoresTabSlot?: (args: { traceId: string; rootSpanId: string | undefined }) => ReactNode;\n /** Optional count shown in the \"Scores\" tab label. */\n scoresTabBadge?: ReactNode;\n /**\n * When provided, a \"Feedback\" tab appears; the slot renders the trace-level\n * feedback UI. Trace feedback is not scoped to a span — the span panel owns that.\n */\n feedbackTabSlot?: (args: { traceId: string }) => ReactNode;\n /** Optional count rendered after the \"Feedback\" tab label, e.g. `Feedback (3)`. */\n feedbackTabBadge?: ReactNode;\n /** Span ids to feature in the timeline; every other span is faded. */\n featuredSpanIds?: string[];\n /**\n * The \"Messages\" view of the side column next to the span tree (typically the\n * trace as one reconstructed agent turn). Rendered without content padding.\n */\n messagesPanelSlot?: ReactNode;\n /** Controlled span view (tree or timeline); falls back to local state starting on the tree. */\n spanView?: TraceSpanView;\n onSpanViewChange?: (view: TraceSpanView) => void;\n /** Controlled side column view; falls back to the first available view. */\n sideView?: TraceSideView;\n onSideViewChange?: (view: TraceSideView) => void;\n /**\n * Rendered as a column to the right of the timeline inside the same card;\n * typically the span detail.\n */\n spanPanelSlot?: ReactNode;\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 size = 'wide',\n depth,\n headerSlot,\n title,\n placement,\n LinkComponent,\n traceHref,\n entityHref,\n usage,\n anchorSpanId,\n showUnavailableFeaturesMsg = true,\n scoresTabSlot,\n scoresTabBadge,\n feedbackTabSlot,\n feedbackTabBadge,\n featuredSpanIds,\n messagesPanelSlot,\n sideView: controlledSideView,\n onSideViewChange,\n spanView: controlledSpanView,\n onSpanViewChange,\n spanPanelSlot,\n}: TraceDataPanelViewProps) {\n const isOnTracePage = placement === 'trace-page';\n\n // The side column next to the span tree hosts Messages / Feedback / Scores;\n // which one is shown is purely a local viewing choice.\n const sideViews = useMemo(() => {\n const views: Array<{ value: TraceSideView; label: ReactNode }> = [];\n if (messagesPanelSlot) {\n views.push({\n value: 'messages',\n label: (\n <>\n <Icon size=\"xs\">\n <MessageSquareTextIcon />\n </Icon>\n Messages\n </>\n ),\n });\n }\n if (feedbackTabSlot) {\n views.push({\n value: 'feedback',\n label: (\n <>\n <Icon size=\"xs\">\n <MessageSquareReplyIcon />\n </Icon>\n Feedback{feedbackTabBadge != null && <> ({feedbackTabBadge})</>}\n </>\n ),\n });\n }\n if (scoresTabSlot) {\n views.push({\n value: 'scores',\n label: (\n <>\n <Icon size=\"xs\">\n <ScorersIcon />\n </Icon>\n Scores{scoresTabBadge != null && <> ({scoresTabBadge})</>}\n </>\n ),\n });\n }\n return views;\n }, [messagesPanelSlot, feedbackTabSlot, feedbackTabBadge, scoresTabSlot, scoresTabBadge]);\n const [uncontrolledSideView, setUncontrolledSideView] = useState<TraceSideView>();\n const chosenSideView = controlledSideView ?? uncontrolledSideView;\n const sideView = (sideViews.find(view => view.value === chosenSideView) ?? sideViews[0])?.value;\n const handleSideViewChange = (view: TraceSideView) => {\n setUncontrolledSideView(view);\n onSideViewChange?.(view);\n };\n\n const [uncontrolledSpanView, setUncontrolledSpanView] = useState<TraceSpanView>('tree');\n const spanView = controlledSpanView ?? uncontrolledSpanView;\n const setSpanView = (view: TraceSpanView) => {\n setUncontrolledSpanView(view);\n onSpanViewChange?.(view);\n };\n\n const { download: downloadTraceJson, isPending: isDownloadingTrace } = useDownloadTraceJson();\n\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 const searchFieldName = useId();\n const { query, setQuery, results, payloadOnlyMatchIds } = useTraceSearch(spans ?? []);\n\n const hierarchicalSpans = useMemo(\n () =>\n formatHierarchicalSpans(\n // Carried on the span rather than drilled as a prop: the tree is rebuilt here and\n // rendered several components deeper.\n results.map(span => ({ ...span, matchedInPayloadOnly: payloadOnlyMatchIds.has(span.spanId) })),\n anchorSpanId,\n ),\n [results, payloadOnlyMatchIds, anchorSpanId],\n );\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 const handleSpanClick = (id: string) => {\n const newId = selectedSpanId === id ? undefined : id;\n setSelectedSpanId(newId);\n onSpanSelect?.(newId);\n };\n\n const traceActionsMenu = traceId && (\n <DropdownMenu>\n <DropdownMenu.Trigger\n render={\n <Button size=\"sm\" variant=\"ghost\" tooltip=\"Open trace actions\" aria-label=\"Open trace actions\">\n <MoreHorizontalIcon />\n </Button>\n }\n />\n <DropdownMenu.Content align=\"end\">\n {!isOnTracePage && onSaveAsDatasetItem && (\n <DropdownMenu.Item onSelect={() => onSaveAsDatasetItem({ traceId, rootSpanId: rootSpan?.spanId })}>\n <SaveIcon />\n Add full trace to dataset\n </DropdownMenu.Item>\n )}\n {!isOnTracePage && onAddTraceMocksToItem && (\n <DropdownMenu.Item onSelect={() => onAddTraceMocksToItem({ traceId })}>\n <WrenchIcon />\n Add tool mocks to item\n </DropdownMenu.Item>\n )}\n {!isOnTracePage && LinkComponent && traceHref && (\n <DropdownMenu.Item render={<LinkComponent href={traceHref} />}>\n <Link2Icon />\n Open trace page\n </DropdownMenu.Item>\n )}\n <DropdownMenu.Item disabled={isDownloadingTrace} onSelect={() => downloadTraceJson(traceId)}>\n {isDownloadingTrace ? <Loader2Icon className=\"animate-spin\" /> : <DownloadIcon />}\n Download trace JSON\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu>\n );\n\n const sideColumn =\n traceId && sideView ? (\n <div data-trace-side-column className=\"flex h-full min-h-0 min-w-0 flex-col overflow-hidden\">\n {/* Same chrome as the trace column's Spans/Timeline header, so the two tab rows line up. */}\n <Tabs<TraceSideView> defaultTab={sideView} value={sideView} onValueChange={handleSideViewChange}>\n <DataPanel.Header className=\"border-b border-border\">\n <TabList variant=\"pill-ghost\" size=\"sm\">\n {sideViews.map(view => (\n <Tab key={view.value} value={view.value}>\n {view.label}\n </Tab>\n ))}\n </TabList>\n </DataPanel.Header>\n </Tabs>\n {/* The turn view brings its own padding; feedback and scores use the panel's. */}\n {sideView === 'messages' && <DataPanel.Content className=\"p-0\">{messagesPanelSlot}</DataPanel.Content>}\n {sideView === 'feedback' && <DataPanel.Content>{feedbackTabSlot?.({ traceId })}</DataPanel.Content>}\n {sideView === 'scores' && (\n <DataPanel.Content>{scoresTabSlot?.({ traceId, rootSpanId: rootSpan?.spanId })}</DataPanel.Content>\n )}\n </div>\n ) : null;\n\n return (\n <DataPanel\n open={!!traceId}\n onClose={onClose}\n title={title ?? (isOnTracePage ? 'Trace Timeline' : `Trace ${traceId ?? ''}`)}\n size={size}\n depth={depth}\n >\n {traceId && (\n <>\n {headerSlot}\n <DataPanel.Header>\n {isOnTracePage ? (\n <>\n <DataPanel.Heading>Trace Timeline</DataPanel.Heading>\n <DataPanel.HeaderActions>{traceActionsMenu}</DataPanel.HeaderActions>\n </>\n ) : (\n <>\n <DataPanel.CloseButton onClick={onClose} />\n <DataPanel.HeaderContent>\n <DataPanel.Heading>\n Trace\n <TraceIdButton id={traceId} />\n </DataPanel.Heading>\n {rootSpan && (\n <TraceSummaryDescription\n rootSpan={rootSpan}\n usage={usage}\n entityHref={entityHref}\n LinkComponent={LinkComponent}\n />\n )}\n </DataPanel.HeaderContent>\n <DataPanel.HeaderActions>\n {onEvaluateTrace && (\n <Button variant=\"primary\" size=\"sm\" onClick={onEvaluateTrace} disabled={!rootSpan}>\n <CircleGaugeIcon />\n Score trace\n </Button>\n )}\n {traceActionsMenu}\n {(onPrevious || onNext) && (\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Go to previous trace\"\n nextLabel=\"Go to next trace\"\n />\n )}\n </DataPanel.HeaderActions>\n </>\n )}\n </DataPanel.Header>\n\n <TracePanelColumns\n sideColumnSlot={sideColumn}\n spanPanelSlot={spanPanelSlot}\n highlightQuery={query}\n spanPanelKey={selectedSpanId}\n >\n {!isLoading && !spans?.length ? (\n <DataPanel.NoData>No spans found for this trace.</DataPanel.NoData>\n ) : (\n (() => {\n // Shared by the Spans and Timeline tabs: both views render the same\n // filtered `hierarchicalSpans`, so one query drives both.\n const isTimeline = spanView === 'timeline';\n const searchHeader = (\n <DataPanel.Header className=\"gap-2 border-b border-border\">\n <SearchFieldBlock\n name={searchFieldName}\n label=\"Search spans\"\n labelIsHidden\n placeholder=\"Search spans...\"\n value={query}\n onChange={e => setQuery(e.target.value)}\n onReset={() => setQuery('')}\n size=\"sm\"\n className=\"w-full\"\n />\n <ButtonsGroup size=\"sm\" className=\"shrink-0\">\n <Button\n variant={isTimeline ? 'default' : 'primary'}\n aria-pressed={!isTimeline}\n tooltip=\"Span tree\"\n onClick={() => setSpanView('tree')}\n >\n <ListTreeIcon />\n </Button>\n <Button\n variant={isTimeline ? 'primary' : 'default'}\n aria-pressed={isTimeline}\n tooltip=\"Timeline\"\n onClick={() => setSpanView('timeline')}\n >\n <ChartGanttIcon />\n </Button>\n </ButtonsGroup>\n </DataPanel.Header>\n );\n const noSearchResults = !isLoading && hierarchicalSpans.length === 0 && (\n <DataPanel.NoData>No spans match your search.</DataPanel.NoData>\n );\n const viewProps = {\n hierarchicalSpans,\n onSpanClick: handleSpanClick,\n selectedSpanId,\n expandedSpanIds,\n setExpandedSpanIds,\n featuredSpanIds,\n isLoading,\n };\n\n return (\n <>\n {searchHeader}\n <DataPanel.Content>\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 {/* Both views share selection + expansion state, and stay mounted with no\n results because they host the search field: unmounting would strand the\n user with a query they can no longer clear. */}\n {isTimeline ? <TraceSpanTimeline {...viewProps} /> : <TraceSpanTree {...viewProps} />}\n {noSearchResults}\n </DataPanel.Content>\n </>\n );\n })()\n )}\n </TracePanelColumns>\n </>\n )}\n </DataPanel>\n );\n}\n\n/**\n * Lays out the card body as three columns — `[side] [trace] [span]` — inside the\n * same card. The side column (messages / feedback / scores) is independent of the\n * Spans/Timeline tabs, so it sits beside them rather than inside a tab. The span\n * cell always exists and collapses to zero when hidden, so opening/closing it\n * animates via `grid-template-columns` rather than mounting/unmounting a DOM\n * column (which cannot be transitioned).\n * Search matches — span names in the timeline tree as well as values in the span\n * detail — are highlighted while a query is active.\n */\nfunction TracePanelColumns({\n sideColumnSlot,\n spanPanelSlot,\n highlightQuery,\n spanPanelKey,\n children,\n}: {\n /** Fixed-width column on the left; the trace and span tracks share the remaining space. */\n sideColumnSlot?: ReactNode;\n spanPanelSlot?: ReactNode;\n highlightQuery: string;\n /** Identity of the span shown in the panel; changing it re-triggers the match scroll. */\n spanPanelKey?: string;\n children: ReactNode;\n}) {\n // A single hook call on the common ancestor covers both the timeline tree and\n // the span detail, so span names and payload values highlight together.\n const { ref: highlightRef } = useTextHighlight<HTMLDivElement>(highlightQuery);\n\n // Scoped to the span-panel column only: a match deep in a large payload sits below\n // the fold, so the first painted match is brought into view when the panel opens.\n // The timeline column must never be scrolled by this.\n const { ref: scrollToMatchRef } = useScrollToFirstHighlight<HTMLDivElement>(highlightQuery, spanPanelKey);\n\n return (\n <div\n ref={highlightRef}\n data-trace-columns\n className={cn(\n 'grid min-h-0 flex-1 transition-[grid-template-columns] duration-300 ease-in-out',\n sideColumnSlot\n ? spanPanelSlot\n ? 'grid-cols-[18rem_1fr_1fr] lg:grid-cols-[24rem_1fr_1fr]'\n : 'grid-cols-[18rem_1fr_0fr] lg:grid-cols-[24rem_1fr_0fr]'\n : spanPanelSlot\n ? 'grid-cols-[0px_1fr_1fr]'\n : 'grid-cols-[0px_1fr_0fr]',\n )}\n >\n <div className={cn('flex min-h-0 min-w-0 flex-col overflow-hidden', sideColumnSlot && 'border-r border-border')}>\n {sideColumnSlot}\n </div>\n <div className=\"flex min-h-0 min-w-0 flex-col overflow-hidden\">{children}</div>\n {/* Searchable: the span detail is where a match hides inside a large payload. */}\n <div\n ref={scrollToMatchRef}\n data-highlight\n className={cn(\n 'flex min-h-0 min-w-0 flex-col overflow-hidden',\n spanPanelSlot && 'animate-in border-l border-border duration-300 fade-in-0',\n )}\n >\n {spanPanelSlot}\n </div>\n </div>\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 {\n ChartGanttIcon,\n CircleGaugeIcon,\n DownloadIcon,\n Link2Icon,\n ListTreeIcon,\n Loader2Icon,\n MessageSquareReplyIcon,\n MessageSquareTextIcon,\n MoreHorizontalIcon,\n SaveIcon,\n WrenchIcon,\n} from 'lucide-react';\nimport { useEffect, useId, useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { getAllSpanIds } from '../hooks/get-all-span-ids';\nimport { useDownloadTraceJson } from '../hooks/use-download-trace-json';\nimport { useTraceSearch } from '../hooks/use-trace-search';\nimport type { TraceUsageSummary } from '../trace-list-columns';\nimport type { SearchableSpan } from '../types';\nimport { formatHierarchicalSpans } from './format-hierarchical-spans';\nimport { TraceIdButton } from './trace-id-button';\nimport { TraceSpanTimeline } from './trace-span-timeline';\nimport { TraceSpanTree } from './trace-span-tree';\nimport { TraceSummaryDescription } from './trace-summary-description';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport type { DataPanelProps } from '@/ds/components/DataPanel';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu';\nimport { SearchFieldBlock } from '@/ds/components/FormFieldBlocks';\nimport { Notice } from '@/ds/components/Notice';\nimport { Tab, TabList, Tabs } from '@/ds/components/Tabs';\nimport { Icon } from '@/ds/icons/Icon';\nimport { ScorersIcon } from '@/ds/icons/ScorersIcon';\nimport type { LinkComponent } from '@/ds/types/link-component';\nimport { useScrollToFirstHighlight } from '@/hooks/use-scroll-to-first-highlight';\nimport { useTextHighlight } from '@/hooks/use-text-highlight';\nimport { cn } from '@/lib/utils';\n\nexport type TraceDataPanelPlacement = 'traces-list' | 'trace-page';\n\nexport type TraceSpanView = 'tree' | 'timeline';\n\n/** What the side column next to the span tree shows. */\nexport type TraceSideView = 'messages' | 'feedback' | 'scores';\n\nexport interface TraceDataPanelViewProps {\n /** Keep the panel mounted and pass `undefined` to close it, so the drawer animates out. */\n traceId?: string;\n /** Lightweight spans for the trace. Caller fetches via useTraceLightSpans. */\n spans: SearchableSpan[] | undefined;\n isLoading?: boolean;\n onClose: () => void;\n onSpanSelect?: (spanId: string | undefined) => void;\n onEvaluateTrace?: () => void;\n /** When set, an \"Add full trace to dataset\" 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 /** Drawer width; defaults to `wide` since the panel lays out several columns. */\n size?: DataPanelProps['size'];\n /** Elevation when opened next to other sibling panels. */\n depth?: DataPanelProps['depth'];\n /** Rendered inside the drawer above the trace header (e.g. inbox feedback context). */\n headerSlot?: ReactNode;\n /** Accessible drawer name; defaults to the trace id. */\n title?: string;\n placement: TraceDataPanelPlacement;\n /** @deprecated No longer used: the panel renders the span tree with the duration as text. */\n timelineChartWidth?: 'wide' | 'default';\n /** When both are provided, renders an \"Open trace page\" button. */\n LinkComponent?: LinkComponent;\n traceHref?: string;\n /** When provided, the entity name in the trace summary links to the entity's page. */\n entityHref?: string;\n /** Token and estimated-cost totals shown in the compact trace summary. */\n usage?: TraceUsageSummary;\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 * When provided, a \"Scores\" tab appears; the slot renders whatever trace-level\n * scoring UI the consumer wants.\n */\n scoresTabSlot?: (args: { traceId: string; rootSpanId: string | undefined }) => ReactNode;\n /** Optional count shown in the \"Scores\" tab label. */\n scoresTabBadge?: ReactNode;\n /**\n * When provided, a \"Feedback\" tab appears; the slot renders the trace-level\n * feedback UI. Trace feedback is not scoped to a span — the span panel owns that.\n */\n feedbackTabSlot?: (args: { traceId: string }) => ReactNode;\n /** Optional count rendered after the \"Feedback\" tab label, e.g. `Feedback (3)`. */\n feedbackTabBadge?: ReactNode;\n /** Span ids to feature in the timeline; every other span is faded. */\n featuredSpanIds?: string[];\n /**\n * The \"Messages\" view of the side column next to the span tree (typically the\n * trace as one reconstructed agent turn). Rendered without content padding.\n */\n messagesPanelSlot?: ReactNode;\n /** Controlled span view (tree or timeline); falls back to local state starting on the tree. */\n spanView?: TraceSpanView;\n onSpanViewChange?: (view: TraceSpanView) => void;\n /** Controlled side column view; falls back to the first available view. */\n sideView?: TraceSideView;\n onSideViewChange?: (view: TraceSideView) => void;\n /**\n * Rendered as a column to the right of the timeline inside the same card;\n * typically the span detail.\n */\n spanPanelSlot?: ReactNode;\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 size = 'wide',\n depth,\n headerSlot,\n title,\n placement,\n LinkComponent,\n traceHref,\n entityHref,\n usage,\n anchorSpanId,\n showUnavailableFeaturesMsg = true,\n scoresTabSlot,\n scoresTabBadge,\n feedbackTabSlot,\n feedbackTabBadge,\n featuredSpanIds,\n messagesPanelSlot,\n sideView: controlledSideView,\n onSideViewChange,\n spanView: controlledSpanView,\n onSpanViewChange,\n spanPanelSlot,\n}: TraceDataPanelViewProps) {\n const isOnTracePage = placement === 'trace-page';\n\n // The side column next to the span tree hosts Messages / Feedback / Scores;\n // which one is shown is purely a local viewing choice.\n const sideViews = useMemo(() => {\n const views: Array<{ value: TraceSideView; label: ReactNode }> = [];\n if (messagesPanelSlot) {\n views.push({\n value: 'messages',\n label: (\n <>\n <Icon size=\"xs\">\n <MessageSquareTextIcon />\n </Icon>\n Messages\n </>\n ),\n });\n }\n if (feedbackTabSlot) {\n views.push({\n value: 'feedback',\n label: (\n <>\n <Icon size=\"xs\">\n <MessageSquareReplyIcon />\n </Icon>\n Feedback{feedbackTabBadge != null && <> ({feedbackTabBadge})</>}\n </>\n ),\n });\n }\n if (scoresTabSlot) {\n views.push({\n value: 'scores',\n label: (\n <>\n <Icon size=\"xs\">\n <ScorersIcon />\n </Icon>\n Scores{scoresTabBadge != null && <> ({scoresTabBadge})</>}\n </>\n ),\n });\n }\n return views;\n }, [messagesPanelSlot, feedbackTabSlot, feedbackTabBadge, scoresTabSlot, scoresTabBadge]);\n const [uncontrolledSideView, setUncontrolledSideView] = useState<TraceSideView>();\n const chosenSideView = controlledSideView ?? uncontrolledSideView;\n const sideView = (sideViews.find(view => view.value === chosenSideView) ?? sideViews[0])?.value;\n const handleSideViewChange = (view: TraceSideView) => {\n setUncontrolledSideView(view);\n onSideViewChange?.(view);\n };\n\n const [uncontrolledSpanView, setUncontrolledSpanView] = useState<TraceSpanView>('tree');\n const spanView = controlledSpanView ?? uncontrolledSpanView;\n const setSpanView = (view: TraceSpanView) => {\n setUncontrolledSpanView(view);\n onSpanViewChange?.(view);\n };\n\n const { download: downloadTraceJson, isPending: isDownloadingTrace } = useDownloadTraceJson();\n\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 const searchFieldName = useId();\n const { query, setQuery, results, payloadOnlyMatchIds } = useTraceSearch(spans ?? []);\n\n const hierarchicalSpans = useMemo(\n () =>\n formatHierarchicalSpans(\n // Carried on the span rather than drilled as a prop: the tree is rebuilt here and\n // rendered several components deeper.\n results.map(span => ({ ...span, matchedInPayloadOnly: payloadOnlyMatchIds.has(span.spanId) })),\n anchorSpanId,\n ),\n [results, payloadOnlyMatchIds, anchorSpanId],\n );\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 const handleSpanClick = (id: string) => {\n const newId = selectedSpanId === id ? undefined : id;\n setSelectedSpanId(newId);\n onSpanSelect?.(newId);\n };\n\n const traceSummary = rootSpan && (\n <TraceSummaryDescription rootSpan={rootSpan} usage={usage} entityHref={entityHref} LinkComponent={LinkComponent} />\n );\n\n const traceActionsMenu = traceId && (\n <DropdownMenu>\n <DropdownMenu.Trigger\n render={\n <Button size=\"sm\" variant=\"ghost\" tooltip=\"Open trace actions\" aria-label=\"Open trace actions\">\n <MoreHorizontalIcon />\n </Button>\n }\n />\n <DropdownMenu.Content align=\"end\">\n {!isOnTracePage && onSaveAsDatasetItem && (\n <DropdownMenu.Item onSelect={() => onSaveAsDatasetItem({ traceId, rootSpanId: rootSpan?.spanId })}>\n <SaveIcon />\n Add full trace to dataset\n </DropdownMenu.Item>\n )}\n {!isOnTracePage && onAddTraceMocksToItem && (\n <DropdownMenu.Item onSelect={() => onAddTraceMocksToItem({ traceId })}>\n <WrenchIcon />\n Add tool mocks to item\n </DropdownMenu.Item>\n )}\n {!isOnTracePage && LinkComponent && traceHref && (\n <DropdownMenu.Item render={<LinkComponent href={traceHref} />}>\n <Link2Icon />\n Open trace page\n </DropdownMenu.Item>\n )}\n <DropdownMenu.Item disabled={isDownloadingTrace} onSelect={() => downloadTraceJson(traceId)}>\n {isDownloadingTrace ? <Loader2Icon className=\"animate-spin\" /> : <DownloadIcon />}\n Download trace JSON\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu>\n );\n\n const sideColumn =\n traceId && sideView ? (\n <div data-trace-side-column className=\"flex h-full min-h-0 min-w-0 flex-col overflow-hidden\">\n {/* Same chrome as the trace column's Spans/Timeline header, so the two tab rows line up. */}\n <Tabs<TraceSideView> defaultTab={sideView} value={sideView} onValueChange={handleSideViewChange}>\n <DataPanel.Header className=\"border-b border-border\">\n <TabList variant=\"pill-ghost\" size=\"sm\">\n {sideViews.map(view => (\n <Tab key={view.value} value={view.value}>\n {view.label}\n </Tab>\n ))}\n </TabList>\n </DataPanel.Header>\n </Tabs>\n {/* The turn view brings its own padding; feedback and scores use the panel's. */}\n {sideView === 'messages' && <DataPanel.Content className=\"p-0\">{messagesPanelSlot}</DataPanel.Content>}\n {sideView === 'feedback' && <DataPanel.Content>{feedbackTabSlot?.({ traceId })}</DataPanel.Content>}\n {sideView === 'scores' && (\n <DataPanel.Content>{scoresTabSlot?.({ traceId, rootSpanId: rootSpan?.spanId })}</DataPanel.Content>\n )}\n </div>\n ) : null;\n\n return (\n <DataPanel\n open={!!traceId}\n onClose={onClose}\n title={title ?? (isOnTracePage ? 'Trace Timeline' : `Trace ${traceId ?? ''}`)}\n size={size}\n depth={depth}\n >\n {traceId && (\n <>\n {headerSlot}\n <DataPanel.Header>\n {isOnTracePage ? (\n <>\n <DataPanel.HeaderContent>\n <DataPanel.Heading>Trace Timeline</DataPanel.Heading>\n {traceSummary}\n </DataPanel.HeaderContent>\n <DataPanel.HeaderActions>{traceActionsMenu}</DataPanel.HeaderActions>\n </>\n ) : (\n <>\n <DataPanel.CloseButton onClick={onClose} />\n <DataPanel.HeaderContent>\n <DataPanel.Heading>\n Trace\n <TraceIdButton id={traceId} />\n </DataPanel.Heading>\n {traceSummary}\n </DataPanel.HeaderContent>\n <DataPanel.HeaderActions>\n {onEvaluateTrace && (\n <Button variant=\"primary\" size=\"sm\" onClick={onEvaluateTrace} disabled={!rootSpan}>\n <CircleGaugeIcon />\n Score trace\n </Button>\n )}\n {traceActionsMenu}\n {(onPrevious || onNext) && (\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Go to previous trace\"\n nextLabel=\"Go to next trace\"\n />\n )}\n </DataPanel.HeaderActions>\n </>\n )}\n </DataPanel.Header>\n\n <TracePanelColumns\n sideColumnSlot={sideColumn}\n spanPanelSlot={spanPanelSlot}\n highlightQuery={query}\n spanPanelKey={selectedSpanId}\n >\n {!isLoading && !spans?.length ? (\n <DataPanel.NoData>No spans found for this trace.</DataPanel.NoData>\n ) : (\n (() => {\n // Shared by the Spans and Timeline tabs: both views render the same\n // filtered `hierarchicalSpans`, so one query drives both.\n const isTimeline = spanView === 'timeline';\n const searchHeader = (\n <DataPanel.Header className=\"gap-2 border-b border-border\">\n <SearchFieldBlock\n name={searchFieldName}\n label=\"Search spans\"\n labelIsHidden\n placeholder=\"Search spans...\"\n value={query}\n onChange={e => setQuery(e.target.value)}\n onReset={() => setQuery('')}\n size=\"sm\"\n className=\"w-full\"\n />\n <ButtonsGroup size=\"sm\" className=\"shrink-0\">\n <Button\n variant={isTimeline ? 'default' : 'primary'}\n aria-pressed={!isTimeline}\n tooltip=\"Span tree\"\n onClick={() => setSpanView('tree')}\n >\n <ListTreeIcon />\n </Button>\n <Button\n variant={isTimeline ? 'primary' : 'default'}\n aria-pressed={isTimeline}\n tooltip=\"Timeline\"\n onClick={() => setSpanView('timeline')}\n >\n <ChartGanttIcon />\n </Button>\n </ButtonsGroup>\n </DataPanel.Header>\n );\n const noSearchResults = !isLoading && hierarchicalSpans.length === 0 && (\n <DataPanel.NoData>No spans match your search.</DataPanel.NoData>\n );\n const viewProps = {\n hierarchicalSpans,\n onSpanClick: handleSpanClick,\n selectedSpanId,\n expandedSpanIds,\n setExpandedSpanIds,\n featuredSpanIds,\n isLoading,\n };\n\n return (\n <>\n {searchHeader}\n <DataPanel.Content>\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 {/* Both views share selection + expansion state, and stay mounted with no\n results because they host the search field: unmounting would strand the\n user with a query they can no longer clear. */}\n {isTimeline ? <TraceSpanTimeline {...viewProps} /> : <TraceSpanTree {...viewProps} />}\n {noSearchResults}\n </DataPanel.Content>\n </>\n );\n })()\n )}\n </TracePanelColumns>\n </>\n )}\n </DataPanel>\n );\n}\n\n/**\n * Lays out the card body as three columns — `[side] [trace] [span]` — inside the\n * same card. The side column (messages / feedback / scores) is independent of the\n * Spans/Timeline tabs, so it sits beside them rather than inside a tab. The span\n * cell always exists and collapses to zero when hidden, so opening/closing it\n * animates via `grid-template-columns` rather than mounting/unmounting a DOM\n * column (which cannot be transitioned).\n * Search matches — span names in the timeline tree as well as values in the span\n * detail — are highlighted while a query is active.\n */\nfunction TracePanelColumns({\n sideColumnSlot,\n spanPanelSlot,\n highlightQuery,\n spanPanelKey,\n children,\n}: {\n /** Fixed-width column on the left; the trace and span tracks share the remaining space. */\n sideColumnSlot?: ReactNode;\n spanPanelSlot?: ReactNode;\n highlightQuery: string;\n /** Identity of the span shown in the panel; changing it re-triggers the match scroll. */\n spanPanelKey?: string;\n children: ReactNode;\n}) {\n // A single hook call on the common ancestor covers both the timeline tree and\n // the span detail, so span names and payload values highlight together.\n const { ref: highlightRef } = useTextHighlight<HTMLDivElement>(highlightQuery);\n\n // Scoped to the span-panel column only: a match deep in a large payload sits below\n // the fold, so the first painted match is brought into view when the panel opens.\n // The timeline column must never be scrolled by this.\n const { ref: scrollToMatchRef } = useScrollToFirstHighlight<HTMLDivElement>(highlightQuery, spanPanelKey);\n\n return (\n <div\n ref={highlightRef}\n data-trace-columns\n className={cn(\n 'grid min-h-0 flex-1 transition-[grid-template-columns] duration-300 ease-in-out',\n sideColumnSlot\n ? spanPanelSlot\n ? 'grid-cols-[18rem_1fr_1fr] lg:grid-cols-[24rem_1fr_1fr]'\n : 'grid-cols-[18rem_1fr_0fr] lg:grid-cols-[24rem_1fr_0fr]'\n : spanPanelSlot\n ? 'grid-cols-[0px_1fr_1fr]'\n : 'grid-cols-[0px_1fr_0fr]',\n )}\n >\n <div className={cn('flex min-h-0 min-w-0 flex-col overflow-hidden', sideColumnSlot && 'border-r border-border')}>\n {sideColumnSlot}\n </div>\n <div className=\"flex min-h-0 min-w-0 flex-col overflow-hidden\">{children}</div>\n {/* Searchable: the span detail is where a match hides inside a large payload. */}\n <div\n ref={scrollToMatchRef}\n data-highlight\n className={cn(\n 'flex min-h-0 min-w-0 flex-col overflow-hidden',\n spanPanelSlot && 'animate-in border-l border-border duration-300 fade-in-0',\n )}\n >\n {spanPanelSlot}\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
5
  const jsxRuntime = require('react/jsx-runtime');
6
- const dataPanel = require('../../../data-panel-Bd_Xsz-W.cjs');
6
+ const dataPanel = require('../../../data-panel-CIu6JToM.cjs');
7
7
 
8
8
  function TraceIdButton({ id }) {
9
9
  return /* @__PURE__ */ jsxRuntime.jsx(dataPanel.DataPanel.CopyId, { id });
@@ -1,5 +1,5 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import { D as DataPanel } from '../../../data-panel-Y7wD0xlR.js';
2
+ import { D as DataPanel } from '../../../data-panel-CPZ2GuZN.js';
3
3
 
4
4
  function TraceIdButton({ id }) {
5
5
  return /* @__PURE__ */ jsx(DataPanel.CopyId, { id });
@@ -5,14 +5,20 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
5
5
  const jsxRuntime = require('react/jsx-runtime');
6
6
  const lucideReact = require('lucide-react');
7
7
  const domains_traces_utils_spanUtils = require('../utils/span-utils.cjs.js');
8
+ const domains_traces_components_traceStatusValue = require('./trace-status-value.cjs.js');
8
9
  const domains_metrics_components_metricsUtils = require('../../metrics/components/metrics-utils.cjs.js');
9
- const dataPanel = require('../../../data-panel-Bd_Xsz-W.cjs');
10
+ const dataPanel = require('../../../data-panel-CIu6JToM.cjs');
10
11
  const icons_AgentIcon = require('../../../icons/AgentIcon.cjs.js');
11
12
  const icons_WorkflowIcon = require('../../../icons/WorkflowIcon.cjs.js');
12
13
 
13
14
  function formatEntityType(entityType) {
14
15
  return entityType.split("_").map((word) => `${word.charAt(0).toUpperCase()}${word.slice(1)}`).join(" ");
15
16
  }
17
+ function computeTraceStatus(span) {
18
+ if (span.error != null) return "error";
19
+ if (span.endedAt == null) return "running";
20
+ return "success";
21
+ }
16
22
  function TraceSummaryDescription({ rootSpan, usage, entityHref, LinkComponent }) {
17
23
  const startedAt = rootSpan.startedAt ? new Date(rootSpan.startedAt) : null;
18
24
  const endedAt = rootSpan.endedAt ? new Date(rootSpan.endedAt) : null;
@@ -35,6 +41,7 @@ function TraceSummaryDescription({ rootSpan, usage, entityHref, LinkComponent })
35
41
  children: entityName
36
42
  }
37
43
  ) : /* @__PURE__ */ jsxRuntime.jsx(dataPanel.DataPanel.Meta, { icon: /* @__PURE__ */ jsxRuntime.jsx(EntityIcon, {}), tooltip: formattedEntityType, children: entityName })),
44
+ /* @__PURE__ */ jsxRuntime.jsx(dataPanel.DataPanel.Meta, { tooltip: "Trace status", children: /* @__PURE__ */ jsxRuntime.jsx(domains_traces_components_traceStatusValue.TraceStatusValue, { status: computeTraceStatus(rootSpan) }) }),
38
45
  startedAtTimestamp && exactStartedAtTimestamp && /* @__PURE__ */ jsxRuntime.jsx(dataPanel.DataPanel.Meta, { icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarClockIcon, {}), tooltip: `Started at ${exactStartedAtTimestamp}`, children: startedAtTimestamp }),
39
46
  duration && exactDuration && /* @__PURE__ */ jsxRuntime.jsx(dataPanel.DataPanel.Meta, { icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.TimerIcon, {}), tooltip: `Duration ${exactDuration}`, children: duration }),
40
47
  usage && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [