@mastra/playground-ui 68.0.0-alpha.2 → 68.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (479) hide show
  1. package/dist/{FilterBar-CQl04O6t.cjs → FilterBar-BSP2UTjc.cjs} +2 -2
  2. package/dist/{FilterBar-CQl04O6t.cjs.map → FilterBar-BSP2UTjc.cjs.map} +1 -1
  3. package/dist/{FilterBar-BgW2dqRQ.js → FilterBar-PSQ1OwqH.js} +2 -2
  4. package/dist/{FilterBar-BgW2dqRQ.js.map → FilterBar-PSQ1OwqH.js.map} +1 -1
  5. package/dist/KnowledgePageGraph.css +55 -0
  6. package/dist/{MarkdownRenderer-2GOXQJEv.js → MarkdownRenderer-CI30RqdB.js} +19 -6
  7. package/dist/MarkdownRenderer-CI30RqdB.js.map +1 -0
  8. package/dist/{MarkdownRenderer-CB8Z_CHc.cjs → MarkdownRenderer-y65WGBhC.cjs} +19 -6
  9. package/dist/MarkdownRenderer-y65WGBhC.cjs.map +1 -0
  10. package/dist/{MetricsCard-CEB-f2sv.cjs → MetricsCard-BEwiS7Pe.cjs} +8 -8
  11. package/dist/MetricsCard-BEwiS7Pe.cjs.map +1 -0
  12. package/dist/{MetricsCard-M8awJ2B_.js → MetricsCard-ua6C6b8a.js} +10 -10
  13. package/dist/MetricsCard-ua6C6b8a.js.map +1 -0
  14. package/dist/{MetricsLineChart-BhHoduO0.js → MetricsLineChart-4SwxBbQx.js} +14 -3
  15. package/dist/MetricsLineChart-4SwxBbQx.js.map +1 -0
  16. package/dist/{MetricsLineChart-CjBm4IXu.cjs → MetricsLineChart-tZxsauau.cjs} +13 -2
  17. package/dist/MetricsLineChart-tZxsauau.cjs.map +1 -0
  18. package/dist/{MetricsStackedBarChart-BdMlKv6G.cjs → MetricsStackedBarChart-CDLE76IB.cjs} +2 -2
  19. package/dist/{MetricsStackedBarChart-BdMlKv6G.cjs.map → MetricsStackedBarChart-CDLE76IB.cjs.map} +1 -1
  20. package/dist/{MetricsStackedBarChart-BRuA6MTE.js → MetricsStackedBarChart-D2QyS4-z.js} +2 -2
  21. package/dist/{MetricsStackedBarChart-BRuA6MTE.js.map → MetricsStackedBarChart-D2QyS4-z.js.map} +1 -1
  22. package/dist/{activity-rJ1NQl_2.js → activity-C8Ql81WM.js} +2 -2
  23. package/dist/{activity-rJ1NQl_2.js.map → activity-C8Ql81WM.js.map} +1 -1
  24. package/dist/{activity-DyB5H3gF.cjs → activity-CcQZeDYi.cjs} +2 -2
  25. package/dist/{activity-DyB5H3gF.cjs.map → activity-CcQZeDYi.cjs.map} +1 -1
  26. package/dist/components/DateTimeRangePicker.cjs.js +1 -1
  27. package/dist/components/DateTimeRangePicker.es.js +1 -1
  28. package/dist/components/FilterBar.cjs.js +2 -2
  29. package/dist/components/FilterBar.es.js +2 -2
  30. package/dist/components/MarkdownRenderer.cjs.js +1 -1
  31. package/dist/components/MarkdownRenderer.es.js +1 -1
  32. package/dist/components/MetricsCard.cjs.js +1 -1
  33. package/dist/components/MetricsCard.es.js +1 -1
  34. package/dist/components/MetricsLineChart.cjs.js +1 -1
  35. package/dist/components/MetricsLineChart.es.js +1 -1
  36. package/dist/components/MetricsStackedBarChart.cjs.js +1 -1
  37. package/dist/components/MetricsStackedBarChart.es.js +1 -1
  38. package/dist/components/SavedViews.cjs.js +1 -1
  39. package/dist/components/SavedViews.es.js +1 -1
  40. package/dist/components/ai/activity.cjs.js +1 -1
  41. package/dist/components/ai/activity.es.js +1 -1
  42. package/dist/components/ai/plan.cjs.js +1 -1
  43. package/dist/components/ai/plan.es.js +1 -1
  44. package/dist/components/ai/tool-approval.cjs.js +1 -1
  45. package/dist/components/ai/tool-approval.es.js +1 -1
  46. package/dist/components/ai/tool-call.cjs.js +2 -2
  47. package/dist/components/ai/tool-call.es.js +2 -2
  48. package/dist/{date-time-range-picker-CTt7Od0P.cjs → date-time-range-picker-CWGjoR3j.cjs} +40 -13
  49. package/dist/date-time-range-picker-CWGjoR3j.cjs.map +1 -0
  50. package/dist/{date-time-range-picker-DKh1K9Iy.js → date-time-range-picker-CdSiXwB4.js} +40 -13
  51. package/dist/date-time-range-picker-CdSiXwB4.js.map +1 -0
  52. package/dist/domains/chat/activity/activity-stretch-line.cjs.js +1 -1
  53. package/dist/domains/chat/activity/activity-stretch-line.es.js +1 -1
  54. package/dist/domains/chat/activity/components/activity-fold.cjs.js +1 -1
  55. package/dist/domains/chat/activity/components/activity-fold.es.js +1 -1
  56. package/dist/domains/chat/activity/components/activity-timed-trigger.cjs.js +1 -1
  57. package/dist/domains/chat/activity/components/activity-timed-trigger.es.js +1 -1
  58. package/dist/domains/chat/activity/components/calls-panel.cjs.js +1 -1
  59. package/dist/domains/chat/activity/components/calls-panel.es.js +1 -1
  60. package/dist/domains/chat/activity/components/stretch-content.cjs.js +1 -1
  61. package/dist/domains/chat/activity/components/stretch-content.es.js +1 -1
  62. package/dist/domains/chat/activity/components/stretch-thought.cjs.js +1 -1
  63. package/dist/domains/chat/activity/components/stretch-thought.es.js +1 -1
  64. package/dist/domains/chat/activity/model/activity-segments.cjs.js +1 -1
  65. package/dist/domains/chat/activity/model/activity-segments.es.js +1 -1
  66. package/dist/domains/chat/activity/model/activity-words.cjs.js +2 -2
  67. package/dist/domains/chat/activity/model/activity-words.es.js +2 -2
  68. package/dist/domains/chat/components/badge-wrapper.cjs.js +1 -1
  69. package/dist/domains/chat/components/badge-wrapper.es.js +1 -1
  70. package/dist/domains/chat/knowledge/knowledge-links.cjs.js +52 -6
  71. package/dist/domains/chat/knowledge/knowledge-links.cjs.js.map +1 -1
  72. package/dist/domains/chat/knowledge/knowledge-links.es.js +53 -9
  73. package/dist/domains/chat/knowledge/knowledge-links.es.js.map +1 -1
  74. package/dist/domains/chat/knowledge/pinned-knowledge-data.cjs.js +10 -3
  75. package/dist/domains/chat/knowledge/pinned-knowledge-data.cjs.js.map +1 -1
  76. package/dist/domains/chat/knowledge/pinned-knowledge-data.es.js +10 -3
  77. package/dist/domains/chat/knowledge/pinned-knowledge-data.es.js.map +1 -1
  78. package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js +8 -3
  79. package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js.map +1 -1
  80. package/dist/domains/chat/knowledge/pinned-knowledge.es.js +8 -3
  81. package/dist/domains/chat/knowledge/pinned-knowledge.es.js.map +1 -1
  82. package/dist/domains/chat/knowledge.cjs.js +2 -0
  83. package/dist/domains/chat/knowledge.es.js +2 -2
  84. package/dist/domains/chat/messages/message-row.cjs.js +3 -3
  85. package/dist/domains/chat/messages/message-row.es.js +3 -3
  86. package/dist/domains/chat/messages/notification-signal-notice.cjs.js +1 -1
  87. package/dist/domains/chat/messages/notification-signal-notice.es.js +1 -1
  88. package/dist/domains/chat/messages/reasoning-content.cjs.js +1 -1
  89. package/dist/domains/chat/messages/reasoning-content.es.js +1 -1
  90. package/dist/domains/chat/messages/renderers/message-text.cjs.js +35 -1
  91. package/dist/domains/chat/messages/renderers/message-text.cjs.js.map +1 -1
  92. package/dist/domains/chat/messages/renderers/message-text.es.js +36 -2
  93. package/dist/domains/chat/messages/renderers/message-text.es.js.map +1 -1
  94. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.cjs.js +1 -1
  95. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.es.js +1 -1
  96. package/dist/domains/chat/messages/signal-badge.cjs.js +1 -1
  97. package/dist/domains/chat/messages/signal-badge.es.js +1 -1
  98. package/dist/domains/chat/messages/skill-message.cjs.js +2 -2
  99. package/dist/domains/chat/messages/skill-message.es.js +2 -2
  100. package/dist/domains/chat/messages/system-reminder-badge.cjs.js +1 -1
  101. package/dist/domains/chat/messages/system-reminder-badge.es.js +1 -1
  102. package/dist/domains/chat/tools/badges/agent-badge-wrapper.cjs.js +1 -1
  103. package/dist/domains/chat/tools/badges/agent-badge-wrapper.es.js +1 -1
  104. package/dist/domains/chat/tools/badges/agent-badge.cjs.js +1 -1
  105. package/dist/domains/chat/tools/badges/agent-badge.es.js +1 -1
  106. package/dist/domains/chat/tools/badges/file-tree-badge.cjs.js +2 -2
  107. package/dist/domains/chat/tools/badges/file-tree-badge.es.js +2 -2
  108. package/dist/domains/chat/tools/badges/knowledge-body-range.cjs.js +80 -0
  109. package/dist/domains/chat/tools/badges/knowledge-body-range.cjs.js.map +1 -0
  110. package/dist/domains/chat/tools/badges/knowledge-body-range.d.ts +1 -0
  111. package/dist/domains/chat/tools/badges/knowledge-body-range.es.js +78 -0
  112. package/dist/domains/chat/tools/badges/knowledge-body-range.es.js.map +1 -0
  113. package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js +163 -13
  114. package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js.map +1 -1
  115. package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js +165 -15
  116. package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js.map +1 -1
  117. package/dist/domains/chat/tools/badges/mcp-input-request-badge.cjs.js +51 -0
  118. package/dist/domains/chat/tools/badges/mcp-input-request-badge.cjs.js.map +1 -0
  119. package/dist/domains/chat/tools/badges/mcp-input-request-badge.d.ts +1 -0
  120. package/dist/domains/chat/tools/badges/mcp-input-request-badge.es.js +49 -0
  121. package/dist/domains/chat/tools/badges/mcp-input-request-badge.es.js.map +1 -0
  122. package/dist/domains/chat/tools/badges/mcp-task-chip.cjs.js +7 -2
  123. package/dist/domains/chat/tools/badges/mcp-task-chip.cjs.js.map +1 -1
  124. package/dist/domains/chat/tools/badges/mcp-task-chip.es.js +7 -2
  125. package/dist/domains/chat/tools/badges/mcp-task-chip.es.js.map +1 -1
  126. package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +2 -2
  127. package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +2 -2
  128. package/dist/domains/chat/tools/badges/observation-marker-details.cjs.js +2 -2
  129. package/dist/domains/chat/tools/badges/observation-marker-details.es.js +2 -2
  130. package/dist/domains/chat/tools/badges/observation-renderer.cjs.js +1 -1
  131. package/dist/domains/chat/tools/badges/observation-renderer.es.js +1 -1
  132. package/dist/domains/chat/tools/badges/sandbox-execution-badge.cjs.js +2 -2
  133. package/dist/domains/chat/tools/badges/sandbox-execution-badge.es.js +2 -2
  134. package/dist/domains/chat/tools/badges/tool-approval-badge.cjs.js +1 -1
  135. package/dist/domains/chat/tools/badges/tool-approval-badge.es.js +1 -1
  136. package/dist/domains/chat/tools/badges/tool-badge.cjs.js +9 -4
  137. package/dist/domains/chat/tools/badges/tool-badge.cjs.js.map +1 -1
  138. package/dist/domains/chat/tools/badges/tool-badge.es.js +9 -4
  139. package/dist/domains/chat/tools/badges/tool-badge.es.js.map +1 -1
  140. package/dist/domains/chat/tools/badges/use-deferred-input-request.cjs.js +81 -0
  141. package/dist/domains/chat/tools/badges/use-deferred-input-request.cjs.js.map +1 -0
  142. package/dist/domains/chat/tools/badges/use-deferred-input-request.d.ts +1 -0
  143. package/dist/domains/chat/tools/badges/use-deferred-input-request.es.js +77 -0
  144. package/dist/domains/chat/tools/badges/use-deferred-input-request.es.js.map +1 -0
  145. package/dist/domains/chat/tools/badges/use-mcp-task-progress.cjs.js +11 -2
  146. package/dist/domains/chat/tools/badges/use-mcp-task-progress.cjs.js.map +1 -1
  147. package/dist/domains/chat/tools/badges/use-mcp-task-progress.es.js +11 -2
  148. package/dist/domains/chat/tools/badges/use-mcp-task-progress.es.js.map +1 -1
  149. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +1 -1
  150. package/dist/domains/chat/tools/badges/workflow-badge.es.js +1 -1
  151. package/dist/domains/chat/tools/connect-prompt-tool.cjs.js +79 -4
  152. package/dist/domains/chat/tools/connect-prompt-tool.cjs.js.map +1 -1
  153. package/dist/domains/chat/tools/connect-prompt-tool.es.js +79 -4
  154. package/dist/domains/chat/tools/connect-prompt-tool.es.js.map +1 -1
  155. package/dist/domains/chat/tools/mcp-input-request-tool.cjs.js +238 -0
  156. package/dist/domains/chat/tools/mcp-input-request-tool.cjs.js.map +1 -0
  157. package/dist/domains/chat/tools/mcp-input-request-tool.d.ts +1 -0
  158. package/dist/domains/chat/tools/mcp-input-request-tool.es.js +237 -0
  159. package/dist/domains/chat/tools/mcp-input-request-tool.es.js.map +1 -0
  160. package/dist/domains/chat/tools/mcp-input-request.cjs.js +40 -0
  161. package/dist/domains/chat/tools/mcp-input-request.cjs.js.map +1 -0
  162. package/dist/domains/chat/tools/mcp-input-request.d.ts +1 -0
  163. package/dist/domains/chat/tools/mcp-input-request.es.js +33 -0
  164. package/dist/domains/chat/tools/mcp-input-request.es.js.map +1 -0
  165. package/dist/domains/chat/tools/tool-card-kind.cjs.js +9 -4
  166. package/dist/domains/chat/tools/tool-card-kind.cjs.js.map +1 -1
  167. package/dist/domains/chat/tools/tool-card-kind.es.js +9 -5
  168. package/dist/domains/chat/tools/tool-card-kind.es.js.map +1 -1
  169. package/dist/domains/chat/tools/tool-card.cjs.js +1 -1
  170. package/dist/domains/chat/tools/tool-card.es.js +1 -1
  171. package/dist/domains/chat/tools/tool-groups.cjs.js +1 -1
  172. package/dist/domains/chat/tools/tool-groups.es.js +1 -1
  173. package/dist/domains/chat.cjs.js +5 -3
  174. package/dist/domains/chat.es.js +4 -4
  175. package/dist/domains/connect/types.cjs.js.map +1 -1
  176. package/dist/domains/connect/types.es.js.map +1 -1
  177. package/dist/domains/connect/use-user-connect.cjs.js +19 -2
  178. package/dist/domains/connect/use-user-connect.cjs.js.map +1 -1
  179. package/dist/domains/connect/use-user-connect.es.js +19 -2
  180. package/dist/domains/connect/use-user-connect.es.js.map +1 -1
  181. package/dist/domains/dashboards/components/dashboard-renderer.cjs.js +4 -3
  182. package/dist/domains/dashboards/components/dashboard-renderer.cjs.js.map +1 -1
  183. package/dist/domains/dashboards/components/dashboard-renderer.es.js +4 -3
  184. package/dist/domains/dashboards/components/dashboard-renderer.es.js.map +1 -1
  185. package/dist/domains/dashboards/components/widget-chrome.cjs.js +1 -1
  186. package/dist/domains/dashboards/components/widget-chrome.es.js +1 -1
  187. package/dist/domains/dashboards/components/widget-error.cjs.js +1 -1
  188. package/dist/domains/dashboards/components/widget-error.es.js +1 -1
  189. package/dist/domains/dashboards/hooks/use-widget-views.cjs.js +4 -3
  190. package/dist/domains/dashboards/hooks/use-widget-views.cjs.js.map +1 -1
  191. package/dist/domains/dashboards/hooks/use-widget-views.es.js +4 -3
  192. package/dist/domains/dashboards/hooks/use-widget-views.es.js.map +1 -1
  193. package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js +9 -6
  194. package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js.map +1 -1
  195. package/dist/domains/dashboards/kinds/scores/scores-widget.es.js +9 -6
  196. package/dist/domains/dashboards/kinds/scores/scores-widget.es.js.map +1 -1
  197. package/dist/domains/dashboards/kinds/table/table-tabs.cjs.js +2 -2
  198. package/dist/domains/dashboards/kinds/table/table-tabs.es.js +2 -2
  199. package/dist/domains/dashboards/kinds/table/table-widget.cjs.js +1 -1
  200. package/dist/domains/dashboards/kinds/table/table-widget.es.js +1 -1
  201. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js +6 -5
  202. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js.map +1 -1
  203. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js +6 -5
  204. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js.map +1 -1
  205. package/dist/domains/dashboards/lib/chrome.cjs.js +9 -2
  206. package/dist/domains/dashboards/lib/chrome.cjs.js.map +1 -1
  207. package/dist/domains/dashboards/lib/chrome.es.js +9 -2
  208. package/dist/domains/dashboards/lib/chrome.es.js.map +1 -1
  209. package/dist/domains/dashboards/widget-kind.cjs.js.map +1 -1
  210. package/dist/domains/dashboards/widget-kind.es.js.map +1 -1
  211. package/dist/domains/knowledge/components/KnowledgePageCard.cjs.js +48 -0
  212. package/dist/domains/knowledge/components/KnowledgePageCard.cjs.js.map +1 -0
  213. package/dist/domains/knowledge/components/KnowledgePageCard.d.ts +1 -0
  214. package/dist/domains/knowledge/components/KnowledgePageCard.es.js +47 -0
  215. package/dist/domains/knowledge/components/KnowledgePageCard.es.js.map +1 -0
  216. package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js +63 -5
  217. package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js.map +1 -1
  218. package/dist/domains/knowledge/components/KnowledgePageDetail.es.js +64 -6
  219. package/dist/domains/knowledge/components/KnowledgePageDetail.es.js.map +1 -1
  220. package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js +485 -47
  221. package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js.map +1 -1
  222. package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js +487 -50
  223. package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js.map +1 -1
  224. package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js +1051 -123
  225. package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js.map +1 -1
  226. package/dist/domains/knowledge/components/KnowledgePageGraph.es.js +1054 -126
  227. package/dist/domains/knowledge/components/KnowledgePageGraph.es.js.map +1 -1
  228. package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js +75 -3
  229. package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js.map +1 -1
  230. package/dist/domains/knowledge/components/KnowledgePageTree.es.js +76 -4
  231. package/dist/domains/knowledge/components/KnowledgePageTree.es.js.map +1 -1
  232. package/dist/domains/knowledge/lib/circleText.cjs.js +9 -0
  233. package/dist/domains/knowledge/lib/circleText.cjs.js.map +1 -0
  234. package/dist/domains/knowledge/lib/circleText.d.ts +1 -0
  235. package/dist/domains/knowledge/lib/circleText.es.js +8 -0
  236. package/dist/domains/knowledge/lib/circleText.es.js.map +1 -0
  237. package/dist/domains/knowledge/lib/fitViewport.cjs.js +82 -0
  238. package/dist/domains/knowledge/lib/fitViewport.cjs.js.map +1 -0
  239. package/dist/domains/knowledge/lib/fitViewport.d.ts +1 -0
  240. package/dist/domains/knowledge/lib/fitViewport.es.js +73 -0
  241. package/dist/domains/knowledge/lib/fitViewport.es.js.map +1 -0
  242. package/dist/domains/knowledge/lib/graphShape.cjs.js +524 -0
  243. package/dist/domains/knowledge/lib/graphShape.cjs.js.map +1 -0
  244. package/dist/domains/knowledge/lib/graphShape.d.ts +1 -0
  245. package/dist/domains/knowledge/lib/graphShape.es.js +499 -0
  246. package/dist/domains/knowledge/lib/graphShape.es.js.map +1 -0
  247. package/dist/domains/knowledge/lib/linkCountsText.cjs.js +11 -0
  248. package/dist/domains/knowledge/lib/linkCountsText.cjs.js.map +1 -0
  249. package/dist/domains/knowledge/lib/linkCountsText.d.ts +1 -0
  250. package/dist/domains/knowledge/lib/linkCountsText.es.js +10 -0
  251. package/dist/domains/knowledge/lib/linkCountsText.es.js.map +1 -0
  252. package/dist/domains/knowledge/lib/pageAddress.cjs.js +29 -0
  253. package/dist/domains/knowledge/lib/pageAddress.cjs.js.map +1 -0
  254. package/dist/domains/knowledge/lib/pageAddress.d.ts +1 -0
  255. package/dist/domains/knowledge/lib/pageAddress.es.js +27 -0
  256. package/dist/domains/knowledge/lib/pageAddress.es.js.map +1 -0
  257. package/dist/domains/knowledge/lib/pageGraph.cjs.js +11 -11
  258. package/dist/domains/knowledge/lib/pageGraph.cjs.js.map +1 -1
  259. package/dist/domains/knowledge/lib/pageGraph.es.js +11 -11
  260. package/dist/domains/knowledge/lib/pageGraph.es.js.map +1 -1
  261. package/dist/domains/knowledge/lib/pageRefs.cjs.js +69 -0
  262. package/dist/domains/knowledge/lib/pageRefs.cjs.js.map +1 -0
  263. package/dist/domains/knowledge/lib/pageRefs.d.ts +1 -0
  264. package/dist/domains/knowledge/lib/pageRefs.es.js +66 -0
  265. package/dist/domains/knowledge/lib/pageRefs.es.js.map +1 -0
  266. package/dist/domains/knowledge/lib/pageTree.cjs.js +5 -0
  267. package/dist/domains/knowledge/lib/pageTree.cjs.js.map +1 -1
  268. package/dist/domains/knowledge/lib/pageTree.es.js +5 -1
  269. package/dist/domains/knowledge/lib/pageTree.es.js.map +1 -1
  270. package/dist/domains/knowledge/lib/remarkKnowledgeLinks.cjs.js +82 -0
  271. package/dist/domains/knowledge/lib/remarkKnowledgeLinks.cjs.js.map +1 -0
  272. package/dist/domains/knowledge/lib/remarkKnowledgeLinks.d.ts +1 -0
  273. package/dist/domains/knowledge/lib/remarkKnowledgeLinks.es.js +78 -0
  274. package/dist/domains/knowledge/lib/remarkKnowledgeLinks.es.js.map +1 -0
  275. package/dist/domains/knowledge/lib/tooltipSide.cjs.js +77 -0
  276. package/dist/domains/knowledge/lib/tooltipSide.cjs.js.map +1 -0
  277. package/dist/domains/knowledge/lib/tooltipSide.d.ts +1 -0
  278. package/dist/domains/knowledge/lib/tooltipSide.es.js +75 -0
  279. package/dist/domains/knowledge/lib/tooltipSide.es.js.map +1 -0
  280. package/dist/domains/knowledge/lib/useLeavingNodes.cjs.js +65 -0
  281. package/dist/domains/knowledge/lib/useLeavingNodes.cjs.js.map +1 -0
  282. package/dist/domains/knowledge/lib/useLeavingNodes.d.ts +1 -0
  283. package/dist/domains/knowledge/lib/useLeavingNodes.es.js +62 -0
  284. package/dist/domains/knowledge/lib/useLeavingNodes.es.js.map +1 -0
  285. package/dist/domains/knowledge/lib/useStableWhile.cjs.js +15 -0
  286. package/dist/domains/knowledge/lib/useStableWhile.cjs.js.map +1 -0
  287. package/dist/domains/knowledge/lib/useStableWhile.d.ts +1 -0
  288. package/dist/domains/knowledge/lib/useStableWhile.es.js +14 -0
  289. package/dist/domains/knowledge/lib/useStableWhile.es.js.map +1 -0
  290. package/dist/domains/metrics/components/agent-runs-card.cjs.js +3 -3
  291. package/dist/domains/metrics/components/agent-runs-card.es.js +3 -3
  292. package/dist/domains/metrics/components/breakdown/breakdown-tab-body.cjs.js +1 -1
  293. package/dist/domains/metrics/components/breakdown/breakdown-tab-body.es.js +1 -1
  294. package/dist/domains/metrics/components/breakdown-card.cjs.js +1 -1
  295. package/dist/domains/metrics/components/breakdown-card.es.js +1 -1
  296. package/dist/domains/metrics/components/chart-area.cjs.js +1 -1
  297. package/dist/domains/metrics/components/chart-area.es.js +1 -1
  298. package/dist/domains/metrics/components/chart-card-error.cjs.js +1 -1
  299. package/dist/domains/metrics/components/chart-card-error.es.js +1 -1
  300. package/dist/domains/metrics/components/chart-card.cjs.js +1 -1
  301. package/dist/domains/metrics/components/chart-card.es.js +1 -1
  302. package/dist/domains/metrics/components/date-range-selector.cjs.js +1 -1
  303. package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
  304. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.cjs.js +3 -2
  305. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.cjs.js.map +1 -1
  306. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.es.js +3 -2
  307. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.es.js.map +1 -1
  308. package/dist/domains/metrics/components/failure-rate-card.cjs.js +3 -2
  309. package/dist/domains/metrics/components/failure-rate-card.cjs.js.map +1 -1
  310. package/dist/domains/metrics/components/failure-rate-card.es.js +3 -2
  311. package/dist/domains/metrics/components/failure-rate-card.es.js.map +1 -1
  312. package/dist/domains/metrics/components/latency-card.cjs.js +3 -2
  313. package/dist/domains/metrics/components/latency-card.cjs.js.map +1 -1
  314. package/dist/domains/metrics/components/latency-card.es.js +3 -2
  315. package/dist/domains/metrics/components/latency-card.es.js.map +1 -1
  316. package/dist/domains/metrics/components/metrics-time-range-chip.cjs.js +1 -1
  317. package/dist/domains/metrics/components/metrics-time-range-chip.es.js +1 -1
  318. package/dist/domains/metrics/components/scores-card.cjs.js +2 -1
  319. package/dist/domains/metrics/components/scores-card.cjs.js.map +1 -1
  320. package/dist/domains/metrics/components/scores-card.es.js +2 -1
  321. package/dist/domains/metrics/components/scores-card.es.js.map +1 -1
  322. package/dist/domains/metrics/components/token-usage-card.cjs.js +3 -3
  323. package/dist/domains/metrics/components/token-usage-card.es.js +3 -3
  324. package/dist/domains/metrics/components/trace-aggregate-card.cjs.js +1 -1
  325. package/dist/domains/metrics/components/trace-aggregate-card.es.js +1 -1
  326. package/dist/domains/observability/components/observability-histogram.cjs.js +1 -1
  327. package/dist/domains/observability/components/observability-histogram.es.js +1 -1
  328. package/dist/domains/scores/components/trace-scores-list.cjs.js +2 -2
  329. package/dist/domains/scores/components/trace-scores-list.es.js +2 -2
  330. package/dist/domains/skills/skill-simple-form.cjs.js +1 -1
  331. package/dist/domains/skills/skill-simple-form.es.js +1 -1
  332. package/dist/domains/spans/components/spans-filter-bar.cjs.js +2 -2
  333. package/dist/domains/spans/components/spans-filter-bar.es.js +2 -2
  334. package/dist/domains/spans/hooks/use-spans-filter-bar.cjs.js +1 -1
  335. package/dist/domains/spans/hooks/use-spans-filter-bar.es.js +1 -1
  336. package/dist/domains/threads/components/threads-filter-bar.cjs.js +2 -2
  337. package/dist/domains/threads/components/threads-filter-bar.es.js +2 -2
  338. package/dist/domains/threads/hooks/use-threads-filter-bar.cjs.js +1 -1
  339. package/dist/domains/threads/hooks/use-threads-filter-bar.es.js +1 -1
  340. package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +1 -1
  341. package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +1 -1
  342. package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +1 -1
  343. package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +1 -1
  344. package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +2 -2
  345. package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +2 -2
  346. package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +2 -2
  347. package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +2 -2
  348. package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +1 -1
  349. package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +1 -1
  350. package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +1 -1
  351. package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +1 -1
  352. package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +1 -1
  353. package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +1 -1
  354. package/dist/domains/traces/components/span-payload/span-processor-mutations.cjs.js +1 -1
  355. package/dist/domains/traces/components/span-payload/span-processor-mutations.es.js +1 -1
  356. package/dist/domains/traces/components/span-payload/span-tools-section.cjs.js +1 -1
  357. package/dist/domains/traces/components/span-payload/span-tools-section.es.js +1 -1
  358. package/dist/domains/traces/components/span-timeline-row.cjs.js +1 -1
  359. package/dist/domains/traces/components/span-timeline-row.es.js +1 -1
  360. package/dist/domains/traces/components/span-timing-hover-card.cjs.js +1 -1
  361. package/dist/domains/traces/components/span-timing-hover-card.es.js +1 -1
  362. package/dist/domains/traces/components/trace-data-panel-view.cjs.js +8 -2
  363. package/dist/domains/traces/components/trace-data-panel-view.cjs.js.map +1 -1
  364. package/dist/domains/traces/components/trace-data-panel-view.es.js +8 -2
  365. package/dist/domains/traces/components/trace-data-panel-view.es.js.map +1 -1
  366. package/dist/domains/traces/components/trace-error-cell.cjs.js +1 -1
  367. package/dist/domains/traces/components/trace-error-cell.es.js +1 -1
  368. package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.cjs.js +2 -2
  369. package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.es.js +2 -2
  370. package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.cjs.js +1 -1
  371. package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.es.js +1 -1
  372. package/dist/domains/workflows/runs/workflow-run-list.cjs.js +1 -1
  373. package/dist/domains/workflows/runs/workflow-run-list.es.js +1 -1
  374. package/dist/domains/workflows/workflow/input/workflow-processor-input.cjs.js +2 -2
  375. package/dist/domains/workflows/workflow/input/workflow-processor-input.es.js +2 -2
  376. package/dist/domains/workflows/workflow/use-workflow-trigger.cjs.js +3 -3
  377. package/dist/domains/workflows/workflow/use-workflow-trigger.es.js +3 -3
  378. package/dist/domains/workflows/workflow/workflow-input-data.cjs.js +1 -1
  379. package/dist/domains/workflows/workflow/workflow-input-data.es.js +1 -1
  380. package/dist/domains/workflows/workflow/workflow-suspended-steps.cjs.js +2 -2
  381. package/dist/domains/workflows/workflow/workflow-suspended-steps.es.js +2 -2
  382. package/dist/domains/workflows/workflow/workflow-time-travel-form.cjs.js +2 -2
  383. package/dist/domains/workflows/workflow/workflow-time-travel-form.es.js +2 -2
  384. package/dist/domains/workspace/components/workspace-add-skill-dialog.cjs.js +1 -1
  385. package/dist/domains/workspace/components/workspace-add-skill-dialog.es.js +1 -1
  386. package/dist/domains/workspace/components/workspace-markdown-preview.cjs.js +1 -1
  387. package/dist/domains/workspace/components/workspace-markdown-preview.es.js +1 -1
  388. package/dist/{filter-bar-time-range-mg9JeYue.js → filter-bar-time-range-qlV8p7hp.js} +2 -2
  389. package/dist/{filter-bar-time-range-mg9JeYue.js.map → filter-bar-time-range-qlV8p7hp.js.map} +1 -1
  390. package/dist/{filter-bar-time-range-BA-pXMlo.cjs → filter-bar-time-range-zdM024JD.cjs} +2 -2
  391. package/dist/{filter-bar-time-range-BA-pXMlo.cjs.map → filter-bar-time-range-zdM024JD.cjs.map} +1 -1
  392. package/dist/lib/form/dynamic-form.cjs.js +2 -2
  393. package/dist/lib/form/dynamic-form.es.js +2 -2
  394. package/dist/lib/form/json-draft.cjs.js +1 -1
  395. package/dist/lib/form/json-draft.es.js +1 -1
  396. package/dist/lib/form/zod-provider.cjs.js +1 -1
  397. package/dist/lib/form/zod-provider.es.js +1 -1
  398. package/dist/{span-payload-primitives-B3RdahsC.js → span-payload-primitives-CKKIAVPJ.js} +4 -4
  399. package/dist/{span-payload-primitives-B3RdahsC.js.map → span-payload-primitives-CKKIAVPJ.js.map} +1 -1
  400. package/dist/{span-payload-primitives-_2d-pAOD.cjs → span-payload-primitives-D4tHWN2W.cjs} +4 -4
  401. package/dist/{span-payload-primitives-_2d-pAOD.cjs.map → span-payload-primitives-D4tHWN2W.cjs.map} +1 -1
  402. package/dist/src/domains/chat/knowledge/knowledge-links.d.ts +32 -4
  403. package/dist/src/domains/chat/knowledge/pinned-knowledge-data.d.ts +2 -0
  404. package/dist/src/domains/chat/tools/badges/knowledge-body-range.d.ts +12 -0
  405. package/dist/src/domains/chat/tools/badges/knowledge-tool-badge.d.ts +5 -2
  406. package/dist/src/domains/chat/tools/badges/mcp-input-request-badge.d.ts +18 -0
  407. package/dist/src/domains/chat/tools/badges/tool-badge.d.ts +4 -1
  408. package/dist/src/domains/chat/tools/badges/use-deferred-input-request.d.ts +44 -0
  409. package/dist/src/domains/chat/tools/badges/use-mcp-task-progress.d.ts +6 -1
  410. package/dist/src/domains/chat/tools/connect-prompt-tool.d.ts +10 -1
  411. package/dist/src/domains/chat/tools/mcp-input-request-tool.d.ts +18 -0
  412. package/dist/src/domains/chat/tools/mcp-input-request.d.ts +40 -0
  413. package/dist/src/domains/chat/tools/tool-card-kind.d.ts +4 -2
  414. package/dist/src/domains/chat/tools/tool-card.d.ts +1 -1
  415. package/dist/src/domains/connect/types.d.ts +16 -0
  416. package/dist/src/domains/dashboards/components/dashboard-renderer.d.ts +4 -2
  417. package/dist/src/domains/dashboards/hooks/use-widget-views.d.ts +4 -3
  418. package/dist/src/domains/dashboards/index.d.ts +1 -1
  419. package/dist/src/domains/dashboards/kinds/scores/scores-widget.d.ts +1 -1
  420. package/dist/src/domains/dashboards/lib/chrome.d.ts +6 -4
  421. package/dist/src/domains/dashboards/widget-kind.d.ts +12 -0
  422. package/dist/src/domains/knowledge/components/KnowledgePageCard.d.ts +23 -0
  423. package/dist/src/domains/knowledge/components/KnowledgePageExplorer.d.ts +29 -0
  424. package/dist/src/domains/knowledge/components/KnowledgePageGraph.d.ts +27 -1
  425. package/dist/src/domains/knowledge/components/KnowledgePageTree.d.ts +2 -1
  426. package/dist/src/domains/knowledge/lib/circleText.d.ts +2 -0
  427. package/dist/src/domains/knowledge/lib/fitViewport.d.ts +67 -0
  428. package/dist/src/domains/knowledge/lib/graphShape.d.ts +131 -0
  429. package/dist/src/domains/knowledge/lib/linkCountsText.d.ts +5 -0
  430. package/dist/src/domains/knowledge/lib/pageAddress.d.ts +5 -0
  431. package/dist/src/domains/knowledge/lib/pageGraph.d.ts +4 -4
  432. package/dist/src/domains/knowledge/lib/pageRefs.d.ts +15 -0
  433. package/dist/src/domains/knowledge/lib/pageTree.d.ts +2 -0
  434. package/dist/src/domains/knowledge/lib/remarkKnowledgeLinks.d.ts +13 -0
  435. package/dist/src/domains/knowledge/lib/tooltipSide.d.ts +40 -0
  436. package/dist/src/domains/knowledge/lib/useLeavingNodes.d.ts +14 -0
  437. package/dist/src/domains/knowledge/lib/useStableWhile.d.ts +5 -0
  438. package/dist/src/domains/knowledge/pageTypes.d.ts +6 -1
  439. package/dist/src/ds/components/DateTimeRangePicker/date-time-range-picker.d.ts +12 -1
  440. package/dist/src/ds/components/MarkdownRenderer/markdown-renderer.d.ts +8 -1
  441. package/dist/src/ds/components/MetricsCard/metrics-card-headline.d.ts +1 -1
  442. package/dist/src/ds/components/MetricsLineChart/metrics-line-chart.d.ts +8 -0
  443. package/dist/src/ds/components/ai/tool-call/tool-phrases.d.ts +6 -0
  444. package/dist/style.css +73 -2
  445. package/dist/{tool-approval-1qiB4hhG.cjs → tool-approval-CJvPDL7D.cjs} +4 -4
  446. package/dist/{tool-approval-1qiB4hhG.cjs.map → tool-approval-CJvPDL7D.cjs.map} +1 -1
  447. package/dist/{tool-approval-B6MFcaKV.js → tool-approval-DyN11vFA.js} +4 -4
  448. package/dist/{tool-approval-B6MFcaKV.js.map → tool-approval-DyN11vFA.js.map} +1 -1
  449. package/dist/{tool-call-Bu66PkD-.cjs → tool-call-DBn14X-3.cjs} +9 -3
  450. package/dist/{tool-call-Bu66PkD-.cjs.map → tool-call-DBn14X-3.cjs.map} +1 -1
  451. package/dist/{tool-call-Ch9-jjXU.js → tool-call-Dsj43lvJ.js} +9 -3
  452. package/dist/{tool-call-Ch9-jjXU.js.map → tool-call-Dsj43lvJ.js.map} +1 -1
  453. package/dist/{tool-card-DrqPZfPQ.cjs → tool-card-BOLXeKIp.cjs} +167 -126
  454. package/dist/tool-card-BOLXeKIp.cjs.map +1 -0
  455. package/dist/{tool-card-sO6P2Qj4.js → tool-card-HZ5bm7ue.js} +168 -127
  456. package/dist/tool-card-HZ5bm7ue.js.map +1 -0
  457. package/dist/{tool-presentation-DvCsb_kz.js → tool-presentation-CvibOP1J.js} +6 -1
  458. package/dist/tool-presentation-CvibOP1J.js.map +1 -0
  459. package/dist/{tool-presentation-CQlDEwgS.cjs → tool-presentation-D6nzVruN.cjs} +6 -1
  460. package/dist/tool-presentation-D6nzVruN.cjs.map +1 -0
  461. package/package.json +11 -11
  462. package/dist/MarkdownRenderer-2GOXQJEv.js.map +0 -1
  463. package/dist/MarkdownRenderer-CB8Z_CHc.cjs.map +0 -1
  464. package/dist/MetricsCard-CEB-f2sv.cjs.map +0 -1
  465. package/dist/MetricsCard-M8awJ2B_.js.map +0 -1
  466. package/dist/MetricsLineChart-BhHoduO0.js.map +0 -1
  467. package/dist/MetricsLineChart-CjBm4IXu.cjs.map +0 -1
  468. package/dist/date-time-range-picker-CTt7Od0P.cjs.map +0 -1
  469. package/dist/date-time-range-picker-DKh1K9Iy.js.map +0 -1
  470. package/dist/domains/knowledge/lib/pageLayout.cjs.js +0 -49
  471. package/dist/domains/knowledge/lib/pageLayout.cjs.js.map +0 -1
  472. package/dist/domains/knowledge/lib/pageLayout.d.ts +0 -1
  473. package/dist/domains/knowledge/lib/pageLayout.es.js +0 -48
  474. package/dist/domains/knowledge/lib/pageLayout.es.js.map +0 -1
  475. package/dist/src/domains/knowledge/lib/pageLayout.d.ts +0 -24
  476. package/dist/tool-card-DrqPZfPQ.cjs.map +0 -1
  477. package/dist/tool-card-sO6P2Qj4.js.map +0 -1
  478. package/dist/tool-presentation-CQlDEwgS.cjs.map +0 -1
  479. package/dist/tool-presentation-DvCsb_kz.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"trace-data-panel-view.cjs.js","names":["useMemo","_Fragment","Icon","MessageSquareTextIcon","MessageSquareReplyIcon","ScorersIcon","useState","useDownloadTraceJson","useTraceSearch","formatHierarchicalSpans","getAllSpanIds","TraceSummaryDescription","Button","Link2Icon","Loader2Icon","DownloadIcon","CircleGaugeIcon","DataPanel","Skeleton","Tabs","TabList","Tab","TraceIcon","SaveIcon","TraceEntityMeta","TraceStatusMeta","SearchIcon","XIcon","ListTreeIcon","ChartGanttIcon","Notice","TraceSpanTimeline","TraceSpanTree","useTextHighlight","useScrollToFirstHighlight","useGroupRef","useRef","Group","Panel","PanelSeparator"],"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 SaveIcon,\n SearchIcon,\n XIcon,\n} from 'lucide-react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { Group, Panel, useGroupRef } from 'react-resizable-panels';\nimport type { Layout } from 'react-resizable-panels';\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 { LightSpanRecord } from '../types';\nimport { formatHierarchicalSpans } from './format-hierarchical-spans';\nimport { TraceSpanTimeline } from './trace-span-timeline';\nimport type { TraceStreamingTimings } from './trace-span-timeline';\nimport { TraceSpanTree } from './trace-span-tree';\nimport { TraceEntityMeta, TraceStatusMeta, TraceSummaryDescription } from './trace-summary-description';\nimport { Button } from '@/ds/components/Button';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport type { DataPanelProps } from '@/ds/components/DataPanel';\nimport { Notice } from '@/ds/components/Notice';\nimport { Skeleton } from '@/ds/components/Skeleton';\nimport { Tab, TabList, Tabs } from '@/ds/components/Tabs';\nimport { Icon } from '@/ds/icons/Icon';\nimport { ScorersIcon } from '@/ds/icons/ScorersIcon';\nimport { TraceIcon } from '@/ds/icons/TraceIcon';\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 { PanelSeparator } from '@/lib/resize/separator';\n\nexport type TraceDataPanelPlacement = 'traces-list' | 'trace-page';\n\nexport type TraceSpanView = 'tree' | 'timeline';\n\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: (LightSpanRecord & { signalLabel?: string })[] | 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 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 /** Integration-specific actions shown alongside the standard trace controls. */\n headerActionsSlot?: 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 * Time to first chunk and first token of the trace root, marked on the timeline. Left off when\n * `anchorSpanId` shows a branch, whose spans don't count from the root.\n */\n rootStreamingTimings?: Omit<TraceStreamingTimings, 'startedAt'>;\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 * Root entity type when the caller knows it before the spans load (e.g. from the listed row).\n * Sizes the columns from the start, so they don't shift once the trace arrives. `null` is a\n * trace known to have no entity type.\n */\n entityType?: string | null;\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 in the side column and a \"Scores\" readout in the\n * summary row opens the same slot in a popover.\n */\n scoresTabSlot?: (args: { traceId: string; rootSpanId: string | undefined }) => ReactNode;\n /** Optional count rendered after the \"Scores\" labels, e.g. `Scores (3)`. */\n scoresTabBadge?: ReactNode;\n /**\n * When provided, a \"Feedback\" tab appears in the side column and a \"Feedback\" readout in\n * the summary row opens the same slot in a popover. Trace feedback is not scoped to a\n * span — the span panel owns that.\n */\n feedbackTabSlot?: (args: { traceId: string }) => ReactNode;\n /** Optional count rendered after the \"Feedback\" labels, 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 /**\n * Actions rendered at the end of the side column's tab row (e.g. \"Open full thread\").\n * `compact` is true when the side column is narrow and controls collapse to icons.\n */\n sideHeaderActions?: (options: { compact: boolean }) => 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 initialSpanId,\n onPrevious,\n onNext,\n size = 'wide',\n depth,\n headerSlot,\n headerActionsSlot,\n title,\n placement,\n LinkComponent,\n traceHref,\n entityHref,\n usage,\n rootStreamingTimings,\n anchorSpanId,\n entityType,\n showUnavailableFeaturesMsg = true,\n scoresTabSlot,\n scoresTabBadge,\n feedbackTabSlot,\n feedbackTabBadge,\n featuredSpanIds,\n messagesPanelSlot,\n sideHeaderActions,\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; name: string; label: ReactNode }> = [];\n if (messagesPanelSlot) {\n views.push({\n value: 'messages',\n name: 'Messages',\n label: (\n <>\n <Icon size=\"xs\">\n <MessageSquareTextIcon />\n </Icon>\n <span className=\"@max-[501px]:sr-only\">Messages</span>\n </>\n ),\n });\n }\n if (feedbackTabSlot) {\n views.push({\n value: 'feedback',\n name: 'Feedback',\n label: (\n <>\n <Icon size=\"xs\">\n <MessageSquareReplyIcon />\n </Icon>\n <span className=\"@max-[501px]:sr-only\">\n Feedback{feedbackTabBadge != null && <> ({feedbackTabBadge})</>}\n </span>\n </>\n ),\n });\n }\n if (scoresTabSlot) {\n views.push({\n value: 'scores',\n name: 'Scores',\n label: (\n <>\n <Icon size=\"xs\">\n <ScorersIcon />\n </Icon>\n <span className=\"@max-[501px]:sr-only\">Scores{scoresTabBadge != null && <> ({scoresTabBadge})</>}</span>\n </>\n ),\n });\n }\n return views;\n }, [messagesPanelSlot, feedbackTabSlot, feedbackTabBadge, scoresTabSlot, scoresTabBadge]);\n const [uncontrolledSideView, setUncontrolledSideView] = useState<TraceSideView>();\n // Mirrors the side column's `@max-[501px]` container query: the layout collapses in CSS, but\n // tooltips render in a portal outside the container, so they need the width in JS.\n const [sideColumnElement, setSideColumnElement] = useState<HTMLDivElement | null>(null);\n const [compactSide, setCompactSide] = useState(false);\n useEffect(() => {\n if (!sideColumnElement || !('ResizeObserver' in globalThis)) return;\n const observer = new ResizeObserver(() => setCompactSide(sideColumnElement.clientWidth <= 500));\n observer.observe(sideColumnElement);\n return () => observer.disconnect();\n }, [sideColumnElement]);\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 { 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 rootError = getSpanError(rootSpan?.error);\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 traceActions = traceId && (\n <>\n {!isOnTracePage && LinkComponent && traceHref && (\n <Button size=\"icon-sm\" variant=\"ghost\" tooltip=\"Open trace page\" render={<LinkComponent href={traceHref} />}>\n <Link2Icon />\n </Button>\n )}\n <Button\n size=\"icon-sm\"\n variant=\"ghost\"\n tooltip=\"Download trace JSON\"\n disabled={isDownloadingTrace}\n onClick={() => downloadTraceJson(traceId)}\n >\n {isDownloadingTrace ? <Loader2Icon className=\"animate-spin\" /> : <DownloadIcon />}\n </Button>\n </>\n );\n\n const scoreAction = onEvaluateTrace && (\n <Button variant=\"primary\" size=\"sm\" onClick={onEvaluateTrace} disabled={!rootSpan}>\n <CircleGaugeIcon />\n Score trace\n </Button>\n );\n\n const sideColumn =\n traceId && sideView ? (\n <div\n ref={setSideColumnElement}\n data-trace-side-column\n className=\"@container flex h-full min-h-0 min-w-0 flex-col overflow-hidden\"\n >\n {/* Whether the Messages tab exists depends on the spans, so the tabs wait for them;\n otherwise the column flickers Feedback → Messages as the first tab changes. */}\n {isLoading ? (\n <DataPanel.Header className=\"border-b border-surface-rim\">\n <div aria-hidden className=\"flex h-control-sm items-center gap-2\">\n <Skeleton className=\"h-5 w-24 rounded-full\" />\n <Skeleton className=\"h-5 w-20 rounded-full\" />\n </div>\n </DataPanel.Header>\n ) : (\n <Tabs<TraceSideView> defaultTab={sideView} value={sideView} onValueChange={handleSideViewChange}>\n {/* `flex-nowrap` + a shrinkable tab column: the tab list's scroll wrapper is full-width,\n so in a wrapping row it would push the actions onto a second line. */}\n <DataPanel.Header className=\"flex-nowrap border-b border-surface-rim\">\n <div className=\"min-w-0 flex-1\">\n <TabList variant=\"pill-ghost\" size=\"sm\">\n {sideViews.map(view => (\n <Tab key={view.value} value={view.value} tooltip={compactSide ? view.name : undefined}>\n {view.label}\n </Tab>\n ))}\n </TabList>\n </div>\n {sideHeaderActions && (\n <div className=\"flex shrink-0 items-center whitespace-nowrap\">\n {sideHeaderActions({ compact: compactSide })}\n </div>\n )}\n </DataPanel.Header>\n </Tabs>\n )}\n {!isLoading && sideView === 'messages' && (\n <DataPanel.Content className=\"p-0\">{messagesPanelSlot}</DataPanel.Content>\n )}\n {!isLoading && sideView === 'feedback' && (\n <DataPanel.Content>{feedbackTabSlot?.({ traceId })}</DataPanel.Content>\n )}\n {!isLoading && 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 {isOnTracePage ? (\n <DataPanel.Header>\n <DataPanel.HeaderContent>\n <DataPanel.Heading>Trace Timeline</DataPanel.Heading>\n {traceSummary}\n </DataPanel.HeaderContent>\n <DataPanel.HeaderActions>\n {headerActionsSlot}\n {scoreAction}\n {traceActions}\n </DataPanel.HeaderActions>\n </DataPanel.Header>\n ) : (\n <>\n {/* Navigation row: trace stepping and the trace id on the left; trace actions, then close, on the right. */}\n <DataPanel.Header>\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.HeaderContent>\n <DataPanel.Heading>\n <span className=\"sr-only\">Trace</span>\n <DataPanel.CopyId id={traceId} maxLength={6} ellipsis={false} icon={<TraceIcon />} />\n </DataPanel.Heading>\n </DataPanel.HeaderContent>\n <DataPanel.HeaderActions>\n {headerActionsSlot}\n {scoreAction}\n {onSaveAsDatasetItem && (\n <Button\n size=\"sm\"\n tooltip=\"Add the full trace to a dataset\"\n onClick={() => onSaveAsDatasetItem({ traceId, rootSpanId: rootSpan?.spanId })}\n >\n <SaveIcon />\n Add to dataset\n </Button>\n )}\n {traceActions}\n <div aria-hidden=\"true\" className=\"mx-1 h-4 w-px shrink-0 bg-border-strong\" />\n <DataPanel.CloseButton icon=\"x\" onClick={onClose} label=\"Close trace\" tooltip=\"Close trace\" />\n </DataPanel.HeaderActions>\n </DataPanel.Header>\n {/* Summary row: what ran and how it ended on the left; timing, tokens and cost on the right. */}\n {!rootSpan && isLoading && (\n <DataPanel.Header>\n <div role=\"status\" aria-label=\"Loading trace summary\" className=\"flex w-full items-center gap-2\">\n <Skeleton className=\"h-3 w-32\" />\n <Skeleton className=\"h-5 w-16 rounded-full\" />\n <Skeleton className=\"ml-auto h-3 w-48\" />\n </div>\n </DataPanel.Header>\n )}\n {rootSpan && (\n <DataPanel.Header>\n <DataPanel.Metadata>\n <TraceEntityMeta rootSpan={rootSpan} entityHref={entityHref} LinkComponent={LinkComponent} />\n <TraceStatusMeta rootSpan={rootSpan} />\n </DataPanel.Metadata>\n <div className=\"ml-auto flex min-w-0\">\n <TraceSummaryDescription\n rootSpan={rootSpan}\n usage={usage}\n entityHref={entityHref}\n LinkComponent={LinkComponent}\n showEntity={false}\n showStatus={false}\n />\n </div>\n </DataPanel.Header>\n )}\n </>\n )}\n\n <TracePanelColumns\n layoutKey={rootSpan ? (rootSpan.entityType ?? 'unknown') : entityType === null ? 'unknown' : entityType}\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 // The bar itself is the search field: no pill inside the square panel, the\n // bottom rule is its only edge, and keyboard focus lights that rule like a\n // field's rim. The view switch stays as flat square icons.\n <DataPanel.Header className=\"gap-1 border-b border-surface-rim has-[input:focus-visible]:[--surface-rim:var(--field-rim-focus)]\">\n <SearchIcon aria-hidden className=\"ml-1 size-4 shrink-0 text-muted-foreground\" />\n <input\n type=\"search\"\n aria-label=\"Search spans\"\n placeholder=\"Search spans\"\n value={query}\n onChange={event => setQuery(event.target.value)}\n className=\"h-full min-w-0 flex-1 bg-transparent px-1.5 text-label text-foreground outline-hidden placeholder:text-muted-foreground [&::-webkit-search-cancel-button]:appearance-none\"\n />\n {query && (\n <Button\n size=\"icon-sm\"\n variant=\"ghost\"\n aria-label=\"Clear search\"\n className=\"rounded-md\"\n onClick={() => setQuery('')}\n >\n <XIcon />\n </Button>\n )}\n <div role=\"group\" aria-label=\"Span view\" className=\"flex shrink-0 items-center gap-0.5\">\n {(\n [\n ['tree', 'Span tree', <ListTreeIcon key=\"tree\" />],\n ['timeline', 'Timeline', <ChartGanttIcon key=\"timeline\" />],\n ] as const\n ).map(([view, label, icon]) => (\n <Button\n key={view}\n size=\"icon-sm\"\n variant={spanView === view ? 'subtle' : 'ghost'}\n aria-label={label}\n aria-pressed={spanView === view}\n tooltip={label}\n className=\"rounded-md\"\n onClick={() => setSpanView(view)}\n >\n {icon}\n </Button>\n ))}\n </div>\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 revealSpanId: featuredSpanIds?.at(-1),\n isLoading,\n };\n const streamingTimings =\n rootStreamingTimings && rootSpan && !anchorSpanId\n ? { ...rootStreamingTimings, startedAt: rootSpan.startedAt }\n : undefined;\n\n return (\n <>\n {searchHeader}\n <DataPanel.Content>\n {!isOnTracePage && !onEvaluateTrace && !onSaveAsDatasetItem && 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 {rootSpan && rootError && (\n <Notice\n variant=\"destructive\"\n title={rootError.name ?? 'Error'}\n action={\n <Notice.Button\n onClick={() => {\n setSelectedSpanId(rootSpan.spanId);\n onSpanSelect?.(rootSpan.spanId);\n }}\n >\n View details\n </Notice.Button>\n }\n className=\"mb-4\"\n >\n <Notice.Message className=\"line-clamp-3\">{rootError.message}</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 ? (\n <TraceSpanTimeline {...viewProps} streamingTimings={streamingTimings} />\n ) : (\n <TraceSpanTree {...viewProps} />\n )}\n {noSearchResults}\n </DataPanel.Content>\n </>\n );\n })()\n )}\n </TracePanelColumns>\n </>\n )}\n </DataPanel>\n );\n}\n\n/** The error a span recorded, when it has the `{ name?, message }` shape spans store. */\nfunction getSpanError(error: unknown): { name?: string; message: string } | undefined {\n if (typeof error !== 'object' || error === null || !('message' in error) || typeof error.message !== 'string') {\n return undefined;\n }\n const name = 'name' in error && typeof error.name === 'string' ? error.name : undefined;\n return { name, message: error.message };\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 side\n * and span columns are resizable (down to a minimum width); the trace column takes the rest.\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 */\n/** Column widths in pixels, persisted per trace entity type. */\ntype TraceColumnWidths = { side?: number; span?: number };\n\nconst pixelWidth = (value: unknown) => (typeof value === 'number' && value > 0 ? value : undefined);\n\n// localStorage access throws when storage is blocked (privacy modes, sandboxed iframes) and stored\n// values may be corrupted; fall back to the default widths instead of crashing the panel.\nfunction readColumnWidths(key: string): TraceColumnWidths {\n try {\n const stored: unknown = JSON.parse(localStorage.getItem(key) ?? 'null');\n if (!stored || typeof stored !== 'object') return {};\n return {\n side: pixelWidth((stored as TraceColumnWidths).side),\n span: pixelWidth((stored as TraceColumnWidths).span),\n };\n } catch {\n return {};\n }\n}\n\nfunction writeColumnWidths(key: string, widths: TraceColumnWidths) {\n try {\n localStorage.setItem(key, JSON.stringify(widths));\n } catch {\n // Persisting is best-effort.\n }\n}\n\nfunction TracePanelColumns({\n layoutKey,\n sideColumnSlot,\n spanPanelSlot,\n highlightQuery,\n spanPanelKey,\n children,\n}: {\n /**\n * Root entity type of the trace; column sizes are persisted per value in localStorage.\n * Undefined while the root span is unknown, in which case nothing is persisted.\n */\n layoutKey?: string;\n /** Resizable column on the left (messages / feedback / scores). */\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 // The side and span columns are sized in pixels: they keep their width when the drawer resizes\n // (it widens when a span opens) and when the span column comes and goes; only the trace column in\n // the middle absorbs the change. The library lays panels out in percentages, so the pixel widths\n // are owned here.\n const groupRef = useGroupRef();\n const columnsRef = useRef<HTMLDivElement>(null);\n const storageKey = layoutKey ? `mastra:trace-panel-widths:${layoutKey}` : undefined;\n const widths = useRef<{ key?: string; value: TraceColumnWidths }>({ value: {} });\n if (widths.current.key !== storageKey) {\n widths.current = { key: storageKey, value: storageKey ? readColumnWidths(storageKey) : {} };\n }\n // Only agent traces have messages worth reading side by side with the spans; for every other\n // entity the side column starts narrow so the span tree gets the room.\n const sideWidth = () => widths.current.value.side ?? (layoutKey === 'agent' ? 480 : 320);\n const spanWidth = () => widths.current.value.span ?? 480;\n\n const panelElements = () =>\n Array.from(columnsRef.current?.querySelectorAll<HTMLElement>(':scope > [data-panel]') ?? []);\n\n // Only a resize the user makes is remembered: layout changes from the drawer resizing or a\n // column mounting are derived from the stored widths and must not drift them.\n const userResizing = useRef(false);\n const markUserResize = (event: { target: EventTarget }) => {\n if (event.target instanceof Element && event.target.closest('[data-separator]')) userResizing.current = true;\n };\n const persistWidths = (layout: Layout) => {\n if (!userResizing.current) return;\n userResizing.current = false;\n const width = (id: string) =>\n id in layout\n ? pixelWidth(Math.round(panelElements().find(panel => panel.id === id)?.offsetWidth ?? 0))\n : undefined;\n widths.current.value = {\n side: width('trace-side') ?? widths.current.value.side,\n span: width('trace-span') ?? widths.current.value.span,\n };\n if (storageKey) writeColumnWidths(storageKey, widths.current.value);\n };\n\n // The library re-lays panels out on its own — when the drawer resizes, when a column mounts or\n // unmounts — so every layout it reports is brought back to the pixel widths, unless the user is\n // dragging a separator. The layout it settles on after clamping to min sizes is left alone.\n const settledLayout = useRef<Layout | undefined>(undefined);\n const holdPixelWidths = (layout: Layout) => {\n if (userResizing.current) return;\n const group = groupRef.current;\n const ids = Object.keys(layout);\n // The library sizes panels against their summed width, separators excluded.\n const total = panelElements()\n .filter(panel => ids.includes(panel.id))\n .reduce((sum, panel) => sum + panel.offsetWidth, 0);\n if (!group || total === 0 || !ids.includes('trace-main')) return;\n const side = ids.includes('trace-side') ? (sideWidth() / total) * 100 : 0;\n const span = ids.includes('trace-span') ? (spanWidth() / total) * 100 : 0;\n const target: Layout = { 'trace-main': 100 - side - span };\n if (side) target['trace-side'] = side;\n if (span) target['trace-span'] = span;\n const tolerance = (0.5 / total) * 100;\n const matches = (a: Layout, b?: Layout) =>\n !!b && ids.every(id => Math.abs((a[id] ?? 0) - (b[id] ?? Infinity)) < tolerance);\n if (matches(layout, target) || matches(layout, settledLayout.current)) return;\n queueMicrotask(() => {\n settledLayout.current = group.setLayout(target);\n });\n };\n\n return (\n <div\n ref={highlightRef}\n data-trace-columns\n className=\"flex min-h-0 flex-1\"\n onPointerDownCapture={markUserResize}\n onKeyDownCapture={markUserResize}\n >\n {/* Plain Group, not PanelGroup: its flex-grow transition would lag behind the drawer\n resizing and make the pixel-sized columns visibly stretch. */}\n <Group\n // Default sizes are only read on mount: remount once the entity type is known.\n key={layoutKey ?? 'unknown'}\n groupRef={groupRef}\n elementRef={columnsRef}\n orientation=\"horizontal\"\n className=\"min-h-0 flex-1\"\n onLayoutChange={holdPixelWidths}\n onLayoutChanged={persistWidths}\n >\n {sideColumnSlot && (\n <>\n <Panel id=\"trace-side\" minSize={280} defaultSize={sideWidth()} groupResizeBehavior=\"preserve-pixel-size\">\n <div className=\"flex h-full min-h-0 flex-col border-r border-surface-rim\">{sideColumnSlot}</div>\n </Panel>\n <PanelSeparator variant=\"pill\" />\n </>\n )}\n {/* 384px: the timeline grid's own minimum (two 12rem columns), so its end never clips. */}\n <Panel id=\"trace-main\" minSize={384} className=\"flex min-h-0 min-w-0 flex-col\">\n {children}\n </Panel>\n {spanPanelSlot && (\n <>\n <PanelSeparator variant=\"pill\" />\n <Panel\n id=\"trace-span\"\n minSize={384}\n maxSize=\"50%\"\n defaultSize={spanWidth()}\n groupResizeBehavior=\"preserve-pixel-size\"\n >\n <div\n ref={scrollToMatchRef}\n data-highlight\n className=\"flex h-full min-h-0 animate-in flex-col border-l border-surface-rim duration-300 fade-in-0\"\n >\n {spanPanelSlot}\n </div>\n </Panel>\n </>\n )}\n </Group>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"trace-data-panel-view.cjs.js","names":["useMemo","_Fragment","Icon","MessageSquareTextIcon","MessageSquareReplyIcon","ScorersIcon","useState","useDownloadTraceJson","useTraceSearch","formatHierarchicalSpans","getAllSpanIds","TraceSummaryDescription","Button","Link2Icon","Loader2Icon","DownloadIcon","CircleGaugeIcon","DataPanel","Skeleton","Tabs","TabList","Tab","TraceIcon","SaveIcon","TraceEntityMeta","TraceStatusMeta","SearchIcon","XIcon","ListTreeIcon","ChartGanttIcon","Notice","TraceSpanTimeline","TraceSpanTree","useTextHighlight","useScrollToFirstHighlight","useGroupRef","useRef","Group","Panel","PanelSeparator"],"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 SaveIcon,\n SearchIcon,\n XIcon,\n} from 'lucide-react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { Group, Panel, useGroupRef } from 'react-resizable-panels';\nimport type { Layout } from 'react-resizable-panels';\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 { LightSpanRecord } from '../types';\nimport { formatHierarchicalSpans } from './format-hierarchical-spans';\nimport { TraceSpanTimeline } from './trace-span-timeline';\nimport type { TraceStreamingTimings } from './trace-span-timeline';\nimport { TraceSpanTree } from './trace-span-tree';\nimport { TraceEntityMeta, TraceStatusMeta, TraceSummaryDescription } from './trace-summary-description';\nimport { Button } from '@/ds/components/Button';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport type { DataPanelProps } from '@/ds/components/DataPanel';\nimport { Notice } from '@/ds/components/Notice';\nimport { Skeleton } from '@/ds/components/Skeleton';\nimport { Tab, TabList, Tabs } from '@/ds/components/Tabs';\nimport { Icon } from '@/ds/icons/Icon';\nimport { ScorersIcon } from '@/ds/icons/ScorersIcon';\nimport { TraceIcon } from '@/ds/icons/TraceIcon';\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 { PanelSeparator } from '@/lib/resize/separator';\n\nexport type TraceDataPanelPlacement = 'traces-list' | 'trace-page';\n\nexport type TraceSpanView = 'tree' | 'timeline';\n\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: (LightSpanRecord & { signalLabel?: string })[] | 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 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 /** Integration-specific actions shown alongside the standard trace controls. */\n headerActionsSlot?: 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 * Time to first chunk and first token of the trace root, marked on the timeline. Left off when\n * `anchorSpanId` shows a branch, whose spans don't count from the root.\n */\n rootStreamingTimings?: Omit<TraceStreamingTimings, 'startedAt'>;\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 * Root entity type when the caller knows it before the spans load (e.g. from the listed row).\n * Sizes the columns from the start, so they don't shift once the trace arrives. `null` is a\n * trace known to have no entity type.\n */\n entityType?: string | null;\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 in the side column and a \"Scores\" readout in the\n * summary row opens the same slot in a popover.\n */\n scoresTabSlot?: (args: { traceId: string; rootSpanId: string | undefined }) => ReactNode;\n /** Optional count rendered after the \"Scores\" labels, e.g. `Scores (3)`. */\n scoresTabBadge?: ReactNode;\n /**\n * When provided, a \"Feedback\" tab appears in the side column and a \"Feedback\" readout in\n * the summary row opens the same slot in a popover. Trace feedback is not scoped to a\n * span — the span panel owns that.\n */\n feedbackTabSlot?: (args: { traceId: string }) => ReactNode;\n /** Optional count rendered after the \"Feedback\" labels, 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 /**\n * Actions rendered at the end of the side column's tab row (e.g. \"Open full thread\").\n * `compact` is true when the side column is narrow and controls collapse to icons.\n */\n sideHeaderActions?: (options: { compact: boolean }) => 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 initialSpanId,\n onPrevious,\n onNext,\n size = 'wide',\n depth,\n headerSlot,\n headerActionsSlot,\n title,\n placement,\n LinkComponent,\n traceHref,\n entityHref,\n usage,\n rootStreamingTimings,\n anchorSpanId,\n entityType,\n showUnavailableFeaturesMsg = true,\n scoresTabSlot,\n scoresTabBadge,\n feedbackTabSlot,\n feedbackTabBadge,\n featuredSpanIds,\n messagesPanelSlot,\n sideHeaderActions,\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; name: string; label: ReactNode }> = [];\n if (messagesPanelSlot) {\n views.push({\n value: 'messages',\n name: 'Messages',\n label: (\n <>\n <Icon size=\"xs\">\n <MessageSquareTextIcon />\n </Icon>\n <span className=\"@max-[501px]:sr-only\">Messages</span>\n </>\n ),\n });\n }\n if (feedbackTabSlot) {\n views.push({\n value: 'feedback',\n name: 'Feedback',\n label: (\n <>\n <Icon size=\"xs\">\n <MessageSquareReplyIcon />\n </Icon>\n <span className=\"@max-[501px]:sr-only\">\n Feedback{feedbackTabBadge != null && <> ({feedbackTabBadge})</>}\n </span>\n </>\n ),\n });\n }\n if (scoresTabSlot) {\n views.push({\n value: 'scores',\n name: 'Scores',\n label: (\n <>\n <Icon size=\"xs\">\n <ScorersIcon />\n </Icon>\n <span className=\"@max-[501px]:sr-only\">Scores{scoresTabBadge != null && <> ({scoresTabBadge})</>}</span>\n </>\n ),\n });\n }\n return views;\n }, [messagesPanelSlot, feedbackTabSlot, feedbackTabBadge, scoresTabSlot, scoresTabBadge]);\n const [uncontrolledSideView, setUncontrolledSideView] = useState<TraceSideView>();\n // Mirrors the side column's `@max-[501px]` container query: the layout collapses in CSS, but\n // tooltips render in a portal outside the container, so they need the width in JS.\n const [sideColumnElement, setSideColumnElement] = useState<HTMLDivElement | null>(null);\n const [compactSide, setCompactSide] = useState(false);\n useEffect(() => {\n if (!sideColumnElement || !('ResizeObserver' in globalThis)) return;\n const observer = new ResizeObserver(() => setCompactSide(sideColumnElement.clientWidth <= 500));\n observer.observe(sideColumnElement);\n return () => observer.disconnect();\n }, [sideColumnElement]);\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 { 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 rootError = getSpanError(rootSpan?.error);\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 traceActions = traceId && (\n <>\n {!isOnTracePage && LinkComponent && traceHref && (\n <Button size=\"icon-sm\" variant=\"ghost\" tooltip=\"Open trace page\" render={<LinkComponent href={traceHref} />}>\n <Link2Icon />\n </Button>\n )}\n <Button\n size=\"icon-sm\"\n variant=\"ghost\"\n tooltip=\"Download trace JSON\"\n disabled={isDownloadingTrace}\n onClick={() => downloadTraceJson(traceId)}\n >\n {isDownloadingTrace ? <Loader2Icon className=\"animate-spin\" /> : <DownloadIcon />}\n </Button>\n </>\n );\n\n const scoreAction = onEvaluateTrace && (\n <Button variant=\"primary\" size=\"sm\" onClick={onEvaluateTrace} disabled={!rootSpan}>\n <CircleGaugeIcon />\n Score trace\n </Button>\n );\n\n const sideColumn =\n traceId && sideView ? (\n <div\n ref={setSideColumnElement}\n data-trace-side-column\n className=\"@container flex h-full min-h-0 min-w-0 flex-col overflow-hidden\"\n >\n {/* Whether the Messages tab exists depends on the spans, so the tabs wait for them;\n otherwise the column flickers Feedback → Messages as the first tab changes. */}\n {isLoading ? (\n <DataPanel.Header className=\"border-b border-surface-rim\">\n <div aria-hidden className=\"flex h-control-sm items-center gap-2\">\n <Skeleton className=\"h-5 w-24 rounded-full\" />\n <Skeleton className=\"h-5 w-20 rounded-full\" />\n </div>\n </DataPanel.Header>\n ) : (\n <Tabs<TraceSideView> defaultTab={sideView} value={sideView} onValueChange={handleSideViewChange}>\n {/* `flex-nowrap` + a shrinkable tab column: the tab list's scroll wrapper is full-width,\n so in a wrapping row it would push the actions onto a second line. */}\n <DataPanel.Header className=\"flex-nowrap border-b border-surface-rim\">\n <div className=\"min-w-0 flex-1\">\n <TabList variant=\"pill-ghost\" size=\"sm\">\n {sideViews.map(view => (\n <Tab key={view.value} value={view.value} tooltip={compactSide ? view.name : undefined}>\n {view.label}\n </Tab>\n ))}\n </TabList>\n </div>\n {sideHeaderActions && (\n <div className=\"flex shrink-0 items-center whitespace-nowrap\">\n {sideHeaderActions({ compact: compactSide })}\n </div>\n )}\n </DataPanel.Header>\n </Tabs>\n )}\n {!isLoading && sideView === 'messages' && (\n <DataPanel.Content className=\"p-0\">{messagesPanelSlot}</DataPanel.Content>\n )}\n {!isLoading && sideView === 'feedback' && (\n <DataPanel.Content>{feedbackTabSlot?.({ traceId })}</DataPanel.Content>\n )}\n {!isLoading && 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 {isOnTracePage ? (\n <DataPanel.Header>\n <DataPanel.HeaderContent>\n <DataPanel.Heading>Trace Timeline</DataPanel.Heading>\n {traceSummary}\n </DataPanel.HeaderContent>\n <DataPanel.HeaderActions>\n {headerActionsSlot}\n {scoreAction}\n {traceActions}\n </DataPanel.HeaderActions>\n </DataPanel.Header>\n ) : (\n <>\n {/* Navigation row: trace stepping and the trace id on the left; trace actions, then close, on the right. */}\n <DataPanel.Header>\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.HeaderContent>\n <DataPanel.Heading>\n <span className=\"sr-only\">Trace</span>\n <DataPanel.CopyId id={traceId} maxLength={6} ellipsis={false} icon={<TraceIcon />} />\n </DataPanel.Heading>\n </DataPanel.HeaderContent>\n <DataPanel.HeaderActions>\n {headerActionsSlot}\n {scoreAction}\n {onSaveAsDatasetItem && (\n <Button\n size=\"sm\"\n tooltip=\"Add the full trace to a dataset\"\n onClick={() => onSaveAsDatasetItem({ traceId, rootSpanId: rootSpan?.spanId })}\n >\n <SaveIcon />\n Add to dataset\n </Button>\n )}\n {traceActions}\n <div aria-hidden=\"true\" className=\"mx-1 h-4 w-px shrink-0 bg-border-strong\" />\n <DataPanel.CloseButton icon=\"x\" onClick={onClose} label=\"Close trace\" tooltip=\"Close trace\" />\n </DataPanel.HeaderActions>\n </DataPanel.Header>\n {/* Summary row: what ran and how it ended on the left; timing, tokens and cost on the right. */}\n {!rootSpan && isLoading && (\n <DataPanel.Header>\n <div role=\"status\" aria-label=\"Loading trace summary\" className=\"flex w-full items-center gap-2\">\n <Skeleton className=\"h-3 w-32\" />\n <Skeleton className=\"h-5 w-16 rounded-full\" />\n <Skeleton className=\"ml-auto h-3 w-48\" />\n </div>\n </DataPanel.Header>\n )}\n {rootSpan && (\n <DataPanel.Header>\n <DataPanel.Metadata>\n <TraceEntityMeta rootSpan={rootSpan} entityHref={entityHref} LinkComponent={LinkComponent} />\n <TraceStatusMeta rootSpan={rootSpan} />\n </DataPanel.Metadata>\n <div className=\"ml-auto flex min-w-0\">\n <TraceSummaryDescription\n rootSpan={rootSpan}\n usage={usage}\n entityHref={entityHref}\n LinkComponent={LinkComponent}\n showEntity={false}\n showStatus={false}\n />\n </div>\n </DataPanel.Header>\n )}\n </>\n )}\n\n <TracePanelColumns\n layoutKey={rootSpan ? (rootSpan.entityType ?? 'unknown') : entityType === null ? 'unknown' : entityType}\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 // The bar itself is the search field: no pill inside the square panel, the\n // bottom rule is its only edge, and keyboard focus lights that rule like a\n // field's rim. The view switch stays as flat square icons.\n <DataPanel.Header className=\"gap-1 border-b border-surface-rim has-[input:focus-visible]:[--surface-rim:var(--field-rim-focus)]\">\n <SearchIcon aria-hidden className=\"ml-1 size-4 shrink-0 text-muted-foreground\" />\n <input\n type=\"search\"\n aria-label=\"Search spans\"\n placeholder=\"Search spans\"\n value={query}\n onChange={event => setQuery(event.target.value)}\n className=\"h-full min-w-0 flex-1 bg-transparent px-1.5 text-label text-foreground outline-hidden placeholder:text-muted-foreground [&::-webkit-search-cancel-button]:appearance-none\"\n />\n {query && (\n <Button\n size=\"icon-sm\"\n variant=\"ghost\"\n aria-label=\"Clear search\"\n className=\"rounded-md\"\n onClick={() => setQuery('')}\n >\n <XIcon />\n </Button>\n )}\n <div role=\"group\" aria-label=\"Span view\" className=\"flex shrink-0 items-center gap-0.5\">\n {(\n [\n ['tree', 'Span tree', <ListTreeIcon key=\"tree\" />],\n ['timeline', 'Timeline', <ChartGanttIcon key=\"timeline\" />],\n ] as const\n ).map(([view, label, icon]) => (\n <Button\n key={view}\n size=\"icon-sm\"\n variant={spanView === view ? 'subtle' : 'ghost'}\n aria-label={label}\n aria-pressed={spanView === view}\n tooltip={label}\n className=\"rounded-md\"\n onClick={() => setSpanView(view)}\n >\n {icon}\n </Button>\n ))}\n </div>\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 revealSpanId: featuredSpanIds?.at(-1),\n isLoading,\n };\n const streamingTimings =\n rootStreamingTimings && rootSpan && !anchorSpanId\n ? { ...rootStreamingTimings, startedAt: rootSpan.startedAt }\n : undefined;\n\n return (\n <>\n {searchHeader}\n <DataPanel.Content>\n {!isOnTracePage && !onEvaluateTrace && !onSaveAsDatasetItem && 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 {rootSpan && rootError && (\n <Notice\n variant=\"destructive\"\n title={rootError.name ?? 'Error'}\n action={\n <Notice.Button\n onClick={() => {\n setSelectedSpanId(rootSpan.spanId);\n onSpanSelect?.(rootSpan.spanId);\n }}\n >\n View details\n </Notice.Button>\n }\n className=\"mb-4\"\n >\n <Notice.Message className=\"line-clamp-3\">{rootError.message}</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 ? (\n <TraceSpanTimeline {...viewProps} streamingTimings={streamingTimings} />\n ) : (\n <TraceSpanTree {...viewProps} />\n )}\n {noSearchResults}\n </DataPanel.Content>\n </>\n );\n })()\n )}\n </TracePanelColumns>\n </>\n )}\n </DataPanel>\n );\n}\n\n/** The error a span recorded, when it has the `{ name?, message }` shape spans store. */\nfunction getSpanError(error: unknown): { name?: string; message: string } | undefined {\n if (typeof error !== 'object' || error === null || !('message' in error) || typeof error.message !== 'string') {\n return undefined;\n }\n const name = 'name' in error && typeof error.name === 'string' ? error.name : undefined;\n return { name, message: error.message };\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 side\n * and span columns are resizable (down to a minimum width); the trace column takes the rest.\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 */\n/** Column widths in pixels, persisted per trace entity type. */\ntype TraceColumnWidths = { side?: number; span?: number };\n\nconst pixelWidth = (value: unknown) => (typeof value === 'number' && value > 0 ? value : undefined);\n\n// localStorage access throws when storage is blocked (privacy modes, sandboxed iframes) and stored\n// values may be corrupted; fall back to the default widths instead of crashing the panel.\nfunction readColumnWidths(key: string): TraceColumnWidths {\n try {\n const stored: unknown = JSON.parse(localStorage.getItem(key) ?? 'null');\n if (!stored || typeof stored !== 'object') return {};\n return {\n side: pixelWidth((stored as TraceColumnWidths).side),\n span: pixelWidth((stored as TraceColumnWidths).span),\n };\n } catch {\n return {};\n }\n}\n\nfunction writeColumnWidths(key: string, widths: TraceColumnWidths) {\n try {\n localStorage.setItem(key, JSON.stringify(widths));\n } catch {\n // Persisting is best-effort.\n }\n}\n\nfunction TracePanelColumns({\n layoutKey,\n sideColumnSlot,\n spanPanelSlot,\n highlightQuery,\n spanPanelKey,\n children,\n}: {\n /**\n * Root entity type of the trace; column sizes are persisted per value in localStorage.\n * Undefined while the root span is unknown, in which case nothing is persisted.\n */\n layoutKey?: string;\n /** Resizable column on the left (messages / feedback / scores). */\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 // The side and span columns are sized in pixels: they keep their width when the drawer resizes\n // (it widens when a span opens) and when the span column comes and goes; only the trace column in\n // the middle absorbs the change. The library lays panels out in percentages, so the pixel widths\n // are owned here.\n const groupRef = useGroupRef();\n const columnsRef = useRef<HTMLDivElement>(null);\n const storageKey = layoutKey ? `mastra:trace-panel-widths:${layoutKey}` : undefined;\n const widths = useRef<{ key?: string; value: TraceColumnWidths }>({ value: {} });\n if (widths.current.key !== storageKey) {\n widths.current = { key: storageKey, value: storageKey ? readColumnWidths(storageKey) : {} };\n }\n // Only agent traces have messages worth reading side by side with the spans; for every other\n // entity the side column starts narrow so the span tree gets the room.\n const sideWidth = () => widths.current.value.side ?? (layoutKey === 'agent' ? 480 : 320);\n const spanWidth = () => widths.current.value.span ?? 480;\n\n const panelElements = () =>\n Array.from(columnsRef.current?.querySelectorAll<HTMLElement>(':scope > [data-panel]') ?? []);\n\n // Only a resize the user makes is remembered: layout changes from the drawer resizing or a\n // column mounting are derived from the stored widths and must not drift them.\n const userResizing = useRef(false);\n const markUserResize = (event: { target: EventTarget }) => {\n if (event.target instanceof Element && event.target.closest('[data-separator]')) userResizing.current = true;\n };\n const persistWidths = (layout: Layout) => {\n if (!userResizing.current) return;\n userResizing.current = false;\n const width = (id: string) =>\n id in layout\n ? pixelWidth(Math.round(panelElements().find(panel => panel.id === id)?.offsetWidth ?? 0))\n : undefined;\n widths.current.value = {\n side: width('trace-side') ?? widths.current.value.side,\n span: width('trace-span') ?? widths.current.value.span,\n };\n if (storageKey) writeColumnWidths(storageKey, widths.current.value);\n };\n\n // The library re-lays panels out on its own — when the drawer resizes, when a column mounts or\n // unmounts — so every layout it reports is brought back to the pixel widths, unless the user is\n // dragging a separator. The layout it settles on after clamping to min sizes is left alone,\n // including the one it reports from inside our own setLayout: when the columns can't fit, rounding\n // makes each clamped layout differ from the last, and answering it would re-lay out forever.\n const settledLayout = useRef<Layout | undefined>(undefined);\n const applyingLayout = useRef(false);\n const holdPixelWidths = (layout: Layout) => {\n if (userResizing.current || applyingLayout.current) return;\n const group = groupRef.current;\n const ids = Object.keys(layout);\n // The library sizes panels against their summed width, separators excluded.\n const total = panelElements()\n .filter(panel => ids.includes(panel.id))\n .reduce((sum, panel) => sum + panel.offsetWidth, 0);\n if (!group || total === 0 || !ids.includes('trace-main')) return;\n const side = ids.includes('trace-side') ? (sideWidth() / total) * 100 : 0;\n const span = ids.includes('trace-span') ? (spanWidth() / total) * 100 : 0;\n const target: Layout = { 'trace-main': 100 - side - span };\n if (side) target['trace-side'] = side;\n if (span) target['trace-span'] = span;\n const tolerance = (0.5 / total) * 100;\n const matches = (a: Layout, b?: Layout) =>\n !!b && ids.every(id => Math.abs((a[id] ?? 0) - (b[id] ?? Infinity)) < tolerance);\n if (matches(layout, target) || matches(layout, settledLayout.current)) return;\n queueMicrotask(() => {\n applyingLayout.current = true;\n try {\n settledLayout.current = group.setLayout(target);\n } finally {\n applyingLayout.current = false;\n }\n });\n };\n\n return (\n <div\n ref={highlightRef}\n data-trace-columns\n className=\"flex min-h-0 flex-1\"\n onPointerDownCapture={markUserResize}\n onKeyDownCapture={markUserResize}\n >\n {/* Plain Group, not PanelGroup: its flex-grow transition would lag behind the drawer\n resizing and make the pixel-sized columns visibly stretch. */}\n <Group\n // Default sizes are only read on mount: remount once the entity type is known.\n key={layoutKey ?? 'unknown'}\n groupRef={groupRef}\n elementRef={columnsRef}\n orientation=\"horizontal\"\n className=\"min-h-0 flex-1\"\n onLayoutChange={holdPixelWidths}\n onLayoutChanged={persistWidths}\n >\n {sideColumnSlot && (\n <>\n <Panel id=\"trace-side\" minSize={280} defaultSize={sideWidth()} groupResizeBehavior=\"preserve-pixel-size\">\n <div className=\"flex h-full min-h-0 flex-col border-r border-surface-rim\">{sideColumnSlot}</div>\n </Panel>\n <PanelSeparator variant=\"pill\" />\n </>\n )}\n {/* 384px: the timeline grid's own minimum (two 12rem columns), so its end never clips. */}\n <Panel id=\"trace-main\" minSize={384} className=\"flex min-h-0 min-w-0 flex-col\">\n {children}\n </Panel>\n {spanPanelSlot && (\n <>\n <PanelSeparator variant=\"pill\" />\n <Panel\n id=\"trace-span\"\n minSize={384}\n maxSize=\"50%\"\n defaultSize={spanWidth()}\n groupResizeBehavior=\"preserve-pixel-size\"\n >\n <div\n ref={scrollToMatchRef}\n data-highlight\n className=\"flex h-full min-h-0 animate-in flex-col border-l border-surface-rim duration-300 fade-in-0\"\n >\n {spanPanelSlot}\n </div>\n </Panel>\n </>\n )}\n </Group>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -448,8 +448,9 @@ function TracePanelColumns({ layoutKey, sideColumnSlot, spanPanelSlot, highlight
448
448
  if (storageKey) writeColumnWidths(storageKey, widths.current.value);
449
449
  };
450
450
  const settledLayout = useRef(void 0);
451
+ const applyingLayout = useRef(false);
451
452
  const holdPixelWidths = (layout) => {
452
- if (userResizing.current) return;
453
+ if (userResizing.current || applyingLayout.current) return;
453
454
  const group = groupRef.current;
454
455
  const ids = Object.keys(layout);
455
456
  const total = panelElements().filter((panel) => ids.includes(panel.id)).reduce((sum, panel) => sum + panel.offsetWidth, 0);
@@ -463,7 +464,12 @@ function TracePanelColumns({ layoutKey, sideColumnSlot, spanPanelSlot, highlight
463
464
  const matches = (a, b) => !!b && ids.every((id) => Math.abs((a[id] ?? 0) - (b[id] ?? Infinity)) < tolerance);
464
465
  if (matches(layout, target) || matches(layout, settledLayout.current)) return;
465
466
  queueMicrotask(() => {
466
- settledLayout.current = group.setLayout(target);
467
+ applyingLayout.current = true;
468
+ try {
469
+ settledLayout.current = group.setLayout(target);
470
+ } finally {
471
+ applyingLayout.current = false;
472
+ }
467
473
  });
468
474
  };
469
475
  return /* @__PURE__ */ jsx("div", {
@@ -1 +1 @@
1
- {"version":3,"file":"trace-data-panel-view.es.js","names":["_Fragment"],"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 SaveIcon,\n SearchIcon,\n XIcon,\n} from 'lucide-react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { Group, Panel, useGroupRef } from 'react-resizable-panels';\nimport type { Layout } from 'react-resizable-panels';\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 { LightSpanRecord } from '../types';\nimport { formatHierarchicalSpans } from './format-hierarchical-spans';\nimport { TraceSpanTimeline } from './trace-span-timeline';\nimport type { TraceStreamingTimings } from './trace-span-timeline';\nimport { TraceSpanTree } from './trace-span-tree';\nimport { TraceEntityMeta, TraceStatusMeta, TraceSummaryDescription } from './trace-summary-description';\nimport { Button } from '@/ds/components/Button';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport type { DataPanelProps } from '@/ds/components/DataPanel';\nimport { Notice } from '@/ds/components/Notice';\nimport { Skeleton } from '@/ds/components/Skeleton';\nimport { Tab, TabList, Tabs } from '@/ds/components/Tabs';\nimport { Icon } from '@/ds/icons/Icon';\nimport { ScorersIcon } from '@/ds/icons/ScorersIcon';\nimport { TraceIcon } from '@/ds/icons/TraceIcon';\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 { PanelSeparator } from '@/lib/resize/separator';\n\nexport type TraceDataPanelPlacement = 'traces-list' | 'trace-page';\n\nexport type TraceSpanView = 'tree' | 'timeline';\n\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: (LightSpanRecord & { signalLabel?: string })[] | 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 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 /** Integration-specific actions shown alongside the standard trace controls. */\n headerActionsSlot?: 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 * Time to first chunk and first token of the trace root, marked on the timeline. Left off when\n * `anchorSpanId` shows a branch, whose spans don't count from the root.\n */\n rootStreamingTimings?: Omit<TraceStreamingTimings, 'startedAt'>;\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 * Root entity type when the caller knows it before the spans load (e.g. from the listed row).\n * Sizes the columns from the start, so they don't shift once the trace arrives. `null` is a\n * trace known to have no entity type.\n */\n entityType?: string | null;\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 in the side column and a \"Scores\" readout in the\n * summary row opens the same slot in a popover.\n */\n scoresTabSlot?: (args: { traceId: string; rootSpanId: string | undefined }) => ReactNode;\n /** Optional count rendered after the \"Scores\" labels, e.g. `Scores (3)`. */\n scoresTabBadge?: ReactNode;\n /**\n * When provided, a \"Feedback\" tab appears in the side column and a \"Feedback\" readout in\n * the summary row opens the same slot in a popover. Trace feedback is not scoped to a\n * span — the span panel owns that.\n */\n feedbackTabSlot?: (args: { traceId: string }) => ReactNode;\n /** Optional count rendered after the \"Feedback\" labels, 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 /**\n * Actions rendered at the end of the side column's tab row (e.g. \"Open full thread\").\n * `compact` is true when the side column is narrow and controls collapse to icons.\n */\n sideHeaderActions?: (options: { compact: boolean }) => 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 initialSpanId,\n onPrevious,\n onNext,\n size = 'wide',\n depth,\n headerSlot,\n headerActionsSlot,\n title,\n placement,\n LinkComponent,\n traceHref,\n entityHref,\n usage,\n rootStreamingTimings,\n anchorSpanId,\n entityType,\n showUnavailableFeaturesMsg = true,\n scoresTabSlot,\n scoresTabBadge,\n feedbackTabSlot,\n feedbackTabBadge,\n featuredSpanIds,\n messagesPanelSlot,\n sideHeaderActions,\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; name: string; label: ReactNode }> = [];\n if (messagesPanelSlot) {\n views.push({\n value: 'messages',\n name: 'Messages',\n label: (\n <>\n <Icon size=\"xs\">\n <MessageSquareTextIcon />\n </Icon>\n <span className=\"@max-[501px]:sr-only\">Messages</span>\n </>\n ),\n });\n }\n if (feedbackTabSlot) {\n views.push({\n value: 'feedback',\n name: 'Feedback',\n label: (\n <>\n <Icon size=\"xs\">\n <MessageSquareReplyIcon />\n </Icon>\n <span className=\"@max-[501px]:sr-only\">\n Feedback{feedbackTabBadge != null && <> ({feedbackTabBadge})</>}\n </span>\n </>\n ),\n });\n }\n if (scoresTabSlot) {\n views.push({\n value: 'scores',\n name: 'Scores',\n label: (\n <>\n <Icon size=\"xs\">\n <ScorersIcon />\n </Icon>\n <span className=\"@max-[501px]:sr-only\">Scores{scoresTabBadge != null && <> ({scoresTabBadge})</>}</span>\n </>\n ),\n });\n }\n return views;\n }, [messagesPanelSlot, feedbackTabSlot, feedbackTabBadge, scoresTabSlot, scoresTabBadge]);\n const [uncontrolledSideView, setUncontrolledSideView] = useState<TraceSideView>();\n // Mirrors the side column's `@max-[501px]` container query: the layout collapses in CSS, but\n // tooltips render in a portal outside the container, so they need the width in JS.\n const [sideColumnElement, setSideColumnElement] = useState<HTMLDivElement | null>(null);\n const [compactSide, setCompactSide] = useState(false);\n useEffect(() => {\n if (!sideColumnElement || !('ResizeObserver' in globalThis)) return;\n const observer = new ResizeObserver(() => setCompactSide(sideColumnElement.clientWidth <= 500));\n observer.observe(sideColumnElement);\n return () => observer.disconnect();\n }, [sideColumnElement]);\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 { 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 rootError = getSpanError(rootSpan?.error);\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 traceActions = traceId && (\n <>\n {!isOnTracePage && LinkComponent && traceHref && (\n <Button size=\"icon-sm\" variant=\"ghost\" tooltip=\"Open trace page\" render={<LinkComponent href={traceHref} />}>\n <Link2Icon />\n </Button>\n )}\n <Button\n size=\"icon-sm\"\n variant=\"ghost\"\n tooltip=\"Download trace JSON\"\n disabled={isDownloadingTrace}\n onClick={() => downloadTraceJson(traceId)}\n >\n {isDownloadingTrace ? <Loader2Icon className=\"animate-spin\" /> : <DownloadIcon />}\n </Button>\n </>\n );\n\n const scoreAction = onEvaluateTrace && (\n <Button variant=\"primary\" size=\"sm\" onClick={onEvaluateTrace} disabled={!rootSpan}>\n <CircleGaugeIcon />\n Score trace\n </Button>\n );\n\n const sideColumn =\n traceId && sideView ? (\n <div\n ref={setSideColumnElement}\n data-trace-side-column\n className=\"@container flex h-full min-h-0 min-w-0 flex-col overflow-hidden\"\n >\n {/* Whether the Messages tab exists depends on the spans, so the tabs wait for them;\n otherwise the column flickers Feedback → Messages as the first tab changes. */}\n {isLoading ? (\n <DataPanel.Header className=\"border-b border-surface-rim\">\n <div aria-hidden className=\"flex h-control-sm items-center gap-2\">\n <Skeleton className=\"h-5 w-24 rounded-full\" />\n <Skeleton className=\"h-5 w-20 rounded-full\" />\n </div>\n </DataPanel.Header>\n ) : (\n <Tabs<TraceSideView> defaultTab={sideView} value={sideView} onValueChange={handleSideViewChange}>\n {/* `flex-nowrap` + a shrinkable tab column: the tab list's scroll wrapper is full-width,\n so in a wrapping row it would push the actions onto a second line. */}\n <DataPanel.Header className=\"flex-nowrap border-b border-surface-rim\">\n <div className=\"min-w-0 flex-1\">\n <TabList variant=\"pill-ghost\" size=\"sm\">\n {sideViews.map(view => (\n <Tab key={view.value} value={view.value} tooltip={compactSide ? view.name : undefined}>\n {view.label}\n </Tab>\n ))}\n </TabList>\n </div>\n {sideHeaderActions && (\n <div className=\"flex shrink-0 items-center whitespace-nowrap\">\n {sideHeaderActions({ compact: compactSide })}\n </div>\n )}\n </DataPanel.Header>\n </Tabs>\n )}\n {!isLoading && sideView === 'messages' && (\n <DataPanel.Content className=\"p-0\">{messagesPanelSlot}</DataPanel.Content>\n )}\n {!isLoading && sideView === 'feedback' && (\n <DataPanel.Content>{feedbackTabSlot?.({ traceId })}</DataPanel.Content>\n )}\n {!isLoading && 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 {isOnTracePage ? (\n <DataPanel.Header>\n <DataPanel.HeaderContent>\n <DataPanel.Heading>Trace Timeline</DataPanel.Heading>\n {traceSummary}\n </DataPanel.HeaderContent>\n <DataPanel.HeaderActions>\n {headerActionsSlot}\n {scoreAction}\n {traceActions}\n </DataPanel.HeaderActions>\n </DataPanel.Header>\n ) : (\n <>\n {/* Navigation row: trace stepping and the trace id on the left; trace actions, then close, on the right. */}\n <DataPanel.Header>\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.HeaderContent>\n <DataPanel.Heading>\n <span className=\"sr-only\">Trace</span>\n <DataPanel.CopyId id={traceId} maxLength={6} ellipsis={false} icon={<TraceIcon />} />\n </DataPanel.Heading>\n </DataPanel.HeaderContent>\n <DataPanel.HeaderActions>\n {headerActionsSlot}\n {scoreAction}\n {onSaveAsDatasetItem && (\n <Button\n size=\"sm\"\n tooltip=\"Add the full trace to a dataset\"\n onClick={() => onSaveAsDatasetItem({ traceId, rootSpanId: rootSpan?.spanId })}\n >\n <SaveIcon />\n Add to dataset\n </Button>\n )}\n {traceActions}\n <div aria-hidden=\"true\" className=\"mx-1 h-4 w-px shrink-0 bg-border-strong\" />\n <DataPanel.CloseButton icon=\"x\" onClick={onClose} label=\"Close trace\" tooltip=\"Close trace\" />\n </DataPanel.HeaderActions>\n </DataPanel.Header>\n {/* Summary row: what ran and how it ended on the left; timing, tokens and cost on the right. */}\n {!rootSpan && isLoading && (\n <DataPanel.Header>\n <div role=\"status\" aria-label=\"Loading trace summary\" className=\"flex w-full items-center gap-2\">\n <Skeleton className=\"h-3 w-32\" />\n <Skeleton className=\"h-5 w-16 rounded-full\" />\n <Skeleton className=\"ml-auto h-3 w-48\" />\n </div>\n </DataPanel.Header>\n )}\n {rootSpan && (\n <DataPanel.Header>\n <DataPanel.Metadata>\n <TraceEntityMeta rootSpan={rootSpan} entityHref={entityHref} LinkComponent={LinkComponent} />\n <TraceStatusMeta rootSpan={rootSpan} />\n </DataPanel.Metadata>\n <div className=\"ml-auto flex min-w-0\">\n <TraceSummaryDescription\n rootSpan={rootSpan}\n usage={usage}\n entityHref={entityHref}\n LinkComponent={LinkComponent}\n showEntity={false}\n showStatus={false}\n />\n </div>\n </DataPanel.Header>\n )}\n </>\n )}\n\n <TracePanelColumns\n layoutKey={rootSpan ? (rootSpan.entityType ?? 'unknown') : entityType === null ? 'unknown' : entityType}\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 // The bar itself is the search field: no pill inside the square panel, the\n // bottom rule is its only edge, and keyboard focus lights that rule like a\n // field's rim. The view switch stays as flat square icons.\n <DataPanel.Header className=\"gap-1 border-b border-surface-rim has-[input:focus-visible]:[--surface-rim:var(--field-rim-focus)]\">\n <SearchIcon aria-hidden className=\"ml-1 size-4 shrink-0 text-muted-foreground\" />\n <input\n type=\"search\"\n aria-label=\"Search spans\"\n placeholder=\"Search spans\"\n value={query}\n onChange={event => setQuery(event.target.value)}\n className=\"h-full min-w-0 flex-1 bg-transparent px-1.5 text-label text-foreground outline-hidden placeholder:text-muted-foreground [&::-webkit-search-cancel-button]:appearance-none\"\n />\n {query && (\n <Button\n size=\"icon-sm\"\n variant=\"ghost\"\n aria-label=\"Clear search\"\n className=\"rounded-md\"\n onClick={() => setQuery('')}\n >\n <XIcon />\n </Button>\n )}\n <div role=\"group\" aria-label=\"Span view\" className=\"flex shrink-0 items-center gap-0.5\">\n {(\n [\n ['tree', 'Span tree', <ListTreeIcon key=\"tree\" />],\n ['timeline', 'Timeline', <ChartGanttIcon key=\"timeline\" />],\n ] as const\n ).map(([view, label, icon]) => (\n <Button\n key={view}\n size=\"icon-sm\"\n variant={spanView === view ? 'subtle' : 'ghost'}\n aria-label={label}\n aria-pressed={spanView === view}\n tooltip={label}\n className=\"rounded-md\"\n onClick={() => setSpanView(view)}\n >\n {icon}\n </Button>\n ))}\n </div>\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 revealSpanId: featuredSpanIds?.at(-1),\n isLoading,\n };\n const streamingTimings =\n rootStreamingTimings && rootSpan && !anchorSpanId\n ? { ...rootStreamingTimings, startedAt: rootSpan.startedAt }\n : undefined;\n\n return (\n <>\n {searchHeader}\n <DataPanel.Content>\n {!isOnTracePage && !onEvaluateTrace && !onSaveAsDatasetItem && 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 {rootSpan && rootError && (\n <Notice\n variant=\"destructive\"\n title={rootError.name ?? 'Error'}\n action={\n <Notice.Button\n onClick={() => {\n setSelectedSpanId(rootSpan.spanId);\n onSpanSelect?.(rootSpan.spanId);\n }}\n >\n View details\n </Notice.Button>\n }\n className=\"mb-4\"\n >\n <Notice.Message className=\"line-clamp-3\">{rootError.message}</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 ? (\n <TraceSpanTimeline {...viewProps} streamingTimings={streamingTimings} />\n ) : (\n <TraceSpanTree {...viewProps} />\n )}\n {noSearchResults}\n </DataPanel.Content>\n </>\n );\n })()\n )}\n </TracePanelColumns>\n </>\n )}\n </DataPanel>\n );\n}\n\n/** The error a span recorded, when it has the `{ name?, message }` shape spans store. */\nfunction getSpanError(error: unknown): { name?: string; message: string } | undefined {\n if (typeof error !== 'object' || error === null || !('message' in error) || typeof error.message !== 'string') {\n return undefined;\n }\n const name = 'name' in error && typeof error.name === 'string' ? error.name : undefined;\n return { name, message: error.message };\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 side\n * and span columns are resizable (down to a minimum width); the trace column takes the rest.\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 */\n/** Column widths in pixels, persisted per trace entity type. */\ntype TraceColumnWidths = { side?: number; span?: number };\n\nconst pixelWidth = (value: unknown) => (typeof value === 'number' && value > 0 ? value : undefined);\n\n// localStorage access throws when storage is blocked (privacy modes, sandboxed iframes) and stored\n// values may be corrupted; fall back to the default widths instead of crashing the panel.\nfunction readColumnWidths(key: string): TraceColumnWidths {\n try {\n const stored: unknown = JSON.parse(localStorage.getItem(key) ?? 'null');\n if (!stored || typeof stored !== 'object') return {};\n return {\n side: pixelWidth((stored as TraceColumnWidths).side),\n span: pixelWidth((stored as TraceColumnWidths).span),\n };\n } catch {\n return {};\n }\n}\n\nfunction writeColumnWidths(key: string, widths: TraceColumnWidths) {\n try {\n localStorage.setItem(key, JSON.stringify(widths));\n } catch {\n // Persisting is best-effort.\n }\n}\n\nfunction TracePanelColumns({\n layoutKey,\n sideColumnSlot,\n spanPanelSlot,\n highlightQuery,\n spanPanelKey,\n children,\n}: {\n /**\n * Root entity type of the trace; column sizes are persisted per value in localStorage.\n * Undefined while the root span is unknown, in which case nothing is persisted.\n */\n layoutKey?: string;\n /** Resizable column on the left (messages / feedback / scores). */\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 // The side and span columns are sized in pixels: they keep their width when the drawer resizes\n // (it widens when a span opens) and when the span column comes and goes; only the trace column in\n // the middle absorbs the change. The library lays panels out in percentages, so the pixel widths\n // are owned here.\n const groupRef = useGroupRef();\n const columnsRef = useRef<HTMLDivElement>(null);\n const storageKey = layoutKey ? `mastra:trace-panel-widths:${layoutKey}` : undefined;\n const widths = useRef<{ key?: string; value: TraceColumnWidths }>({ value: {} });\n if (widths.current.key !== storageKey) {\n widths.current = { key: storageKey, value: storageKey ? readColumnWidths(storageKey) : {} };\n }\n // Only agent traces have messages worth reading side by side with the spans; for every other\n // entity the side column starts narrow so the span tree gets the room.\n const sideWidth = () => widths.current.value.side ?? (layoutKey === 'agent' ? 480 : 320);\n const spanWidth = () => widths.current.value.span ?? 480;\n\n const panelElements = () =>\n Array.from(columnsRef.current?.querySelectorAll<HTMLElement>(':scope > [data-panel]') ?? []);\n\n // Only a resize the user makes is remembered: layout changes from the drawer resizing or a\n // column mounting are derived from the stored widths and must not drift them.\n const userResizing = useRef(false);\n const markUserResize = (event: { target: EventTarget }) => {\n if (event.target instanceof Element && event.target.closest('[data-separator]')) userResizing.current = true;\n };\n const persistWidths = (layout: Layout) => {\n if (!userResizing.current) return;\n userResizing.current = false;\n const width = (id: string) =>\n id in layout\n ? pixelWidth(Math.round(panelElements().find(panel => panel.id === id)?.offsetWidth ?? 0))\n : undefined;\n widths.current.value = {\n side: width('trace-side') ?? widths.current.value.side,\n span: width('trace-span') ?? widths.current.value.span,\n };\n if (storageKey) writeColumnWidths(storageKey, widths.current.value);\n };\n\n // The library re-lays panels out on its own — when the drawer resizes, when a column mounts or\n // unmounts — so every layout it reports is brought back to the pixel widths, unless the user is\n // dragging a separator. The layout it settles on after clamping to min sizes is left alone.\n const settledLayout = useRef<Layout | undefined>(undefined);\n const holdPixelWidths = (layout: Layout) => {\n if (userResizing.current) return;\n const group = groupRef.current;\n const ids = Object.keys(layout);\n // The library sizes panels against their summed width, separators excluded.\n const total = panelElements()\n .filter(panel => ids.includes(panel.id))\n .reduce((sum, panel) => sum + panel.offsetWidth, 0);\n if (!group || total === 0 || !ids.includes('trace-main')) return;\n const side = ids.includes('trace-side') ? (sideWidth() / total) * 100 : 0;\n const span = ids.includes('trace-span') ? (spanWidth() / total) * 100 : 0;\n const target: Layout = { 'trace-main': 100 - side - span };\n if (side) target['trace-side'] = side;\n if (span) target['trace-span'] = span;\n const tolerance = (0.5 / total) * 100;\n const matches = (a: Layout, b?: Layout) =>\n !!b && ids.every(id => Math.abs((a[id] ?? 0) - (b[id] ?? Infinity)) < tolerance);\n if (matches(layout, target) || matches(layout, settledLayout.current)) return;\n queueMicrotask(() => {\n settledLayout.current = group.setLayout(target);\n });\n };\n\n return (\n <div\n ref={highlightRef}\n data-trace-columns\n className=\"flex min-h-0 flex-1\"\n onPointerDownCapture={markUserResize}\n onKeyDownCapture={markUserResize}\n >\n {/* Plain Group, not PanelGroup: its flex-grow transition would lag behind the drawer\n resizing and make the pixel-sized columns visibly stretch. */}\n <Group\n // Default sizes are only read on mount: remount once the entity type is known.\n key={layoutKey ?? 'unknown'}\n groupRef={groupRef}\n elementRef={columnsRef}\n orientation=\"horizontal\"\n className=\"min-h-0 flex-1\"\n onLayoutChange={holdPixelWidths}\n onLayoutChanged={persistWidths}\n >\n {sideColumnSlot && (\n <>\n <Panel id=\"trace-side\" minSize={280} defaultSize={sideWidth()} groupResizeBehavior=\"preserve-pixel-size\">\n <div className=\"flex h-full min-h-0 flex-col border-r border-surface-rim\">{sideColumnSlot}</div>\n </Panel>\n <PanelSeparator variant=\"pill\" />\n </>\n )}\n {/* 384px: the timeline grid's own minimum (two 12rem columns), so its end never clips. */}\n <Panel id=\"trace-main\" minSize={384} className=\"flex min-h-0 min-w-0 flex-col\">\n {children}\n </Panel>\n {spanPanelSlot && (\n <>\n <PanelSeparator variant=\"pill\" />\n <Panel\n id=\"trace-span\"\n minSize={384}\n maxSize=\"50%\"\n defaultSize={spanWidth()}\n groupResizeBehavior=\"preserve-pixel-size\"\n >\n <div\n ref={scrollToMatchRef}\n data-highlight\n className=\"flex h-full min-h-0 animate-in flex-col border-l border-surface-rim duration-300 fade-in-0\"\n >\n {spanPanelSlot}\n </div>\n </Panel>\n </>\n )}\n </Group>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"trace-data-panel-view.es.js","names":["_Fragment"],"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 SaveIcon,\n SearchIcon,\n XIcon,\n} from 'lucide-react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { Group, Panel, useGroupRef } from 'react-resizable-panels';\nimport type { Layout } from 'react-resizable-panels';\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 { LightSpanRecord } from '../types';\nimport { formatHierarchicalSpans } from './format-hierarchical-spans';\nimport { TraceSpanTimeline } from './trace-span-timeline';\nimport type { TraceStreamingTimings } from './trace-span-timeline';\nimport { TraceSpanTree } from './trace-span-tree';\nimport { TraceEntityMeta, TraceStatusMeta, TraceSummaryDescription } from './trace-summary-description';\nimport { Button } from '@/ds/components/Button';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport type { DataPanelProps } from '@/ds/components/DataPanel';\nimport { Notice } from '@/ds/components/Notice';\nimport { Skeleton } from '@/ds/components/Skeleton';\nimport { Tab, TabList, Tabs } from '@/ds/components/Tabs';\nimport { Icon } from '@/ds/icons/Icon';\nimport { ScorersIcon } from '@/ds/icons/ScorersIcon';\nimport { TraceIcon } from '@/ds/icons/TraceIcon';\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 { PanelSeparator } from '@/lib/resize/separator';\n\nexport type TraceDataPanelPlacement = 'traces-list' | 'trace-page';\n\nexport type TraceSpanView = 'tree' | 'timeline';\n\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: (LightSpanRecord & { signalLabel?: string })[] | 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 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 /** Integration-specific actions shown alongside the standard trace controls. */\n headerActionsSlot?: 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 * Time to first chunk and first token of the trace root, marked on the timeline. Left off when\n * `anchorSpanId` shows a branch, whose spans don't count from the root.\n */\n rootStreamingTimings?: Omit<TraceStreamingTimings, 'startedAt'>;\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 * Root entity type when the caller knows it before the spans load (e.g. from the listed row).\n * Sizes the columns from the start, so they don't shift once the trace arrives. `null` is a\n * trace known to have no entity type.\n */\n entityType?: string | null;\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 in the side column and a \"Scores\" readout in the\n * summary row opens the same slot in a popover.\n */\n scoresTabSlot?: (args: { traceId: string; rootSpanId: string | undefined }) => ReactNode;\n /** Optional count rendered after the \"Scores\" labels, e.g. `Scores (3)`. */\n scoresTabBadge?: ReactNode;\n /**\n * When provided, a \"Feedback\" tab appears in the side column and a \"Feedback\" readout in\n * the summary row opens the same slot in a popover. Trace feedback is not scoped to a\n * span — the span panel owns that.\n */\n feedbackTabSlot?: (args: { traceId: string }) => ReactNode;\n /** Optional count rendered after the \"Feedback\" labels, 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 /**\n * Actions rendered at the end of the side column's tab row (e.g. \"Open full thread\").\n * `compact` is true when the side column is narrow and controls collapse to icons.\n */\n sideHeaderActions?: (options: { compact: boolean }) => 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 initialSpanId,\n onPrevious,\n onNext,\n size = 'wide',\n depth,\n headerSlot,\n headerActionsSlot,\n title,\n placement,\n LinkComponent,\n traceHref,\n entityHref,\n usage,\n rootStreamingTimings,\n anchorSpanId,\n entityType,\n showUnavailableFeaturesMsg = true,\n scoresTabSlot,\n scoresTabBadge,\n feedbackTabSlot,\n feedbackTabBadge,\n featuredSpanIds,\n messagesPanelSlot,\n sideHeaderActions,\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; name: string; label: ReactNode }> = [];\n if (messagesPanelSlot) {\n views.push({\n value: 'messages',\n name: 'Messages',\n label: (\n <>\n <Icon size=\"xs\">\n <MessageSquareTextIcon />\n </Icon>\n <span className=\"@max-[501px]:sr-only\">Messages</span>\n </>\n ),\n });\n }\n if (feedbackTabSlot) {\n views.push({\n value: 'feedback',\n name: 'Feedback',\n label: (\n <>\n <Icon size=\"xs\">\n <MessageSquareReplyIcon />\n </Icon>\n <span className=\"@max-[501px]:sr-only\">\n Feedback{feedbackTabBadge != null && <> ({feedbackTabBadge})</>}\n </span>\n </>\n ),\n });\n }\n if (scoresTabSlot) {\n views.push({\n value: 'scores',\n name: 'Scores',\n label: (\n <>\n <Icon size=\"xs\">\n <ScorersIcon />\n </Icon>\n <span className=\"@max-[501px]:sr-only\">Scores{scoresTabBadge != null && <> ({scoresTabBadge})</>}</span>\n </>\n ),\n });\n }\n return views;\n }, [messagesPanelSlot, feedbackTabSlot, feedbackTabBadge, scoresTabSlot, scoresTabBadge]);\n const [uncontrolledSideView, setUncontrolledSideView] = useState<TraceSideView>();\n // Mirrors the side column's `@max-[501px]` container query: the layout collapses in CSS, but\n // tooltips render in a portal outside the container, so they need the width in JS.\n const [sideColumnElement, setSideColumnElement] = useState<HTMLDivElement | null>(null);\n const [compactSide, setCompactSide] = useState(false);\n useEffect(() => {\n if (!sideColumnElement || !('ResizeObserver' in globalThis)) return;\n const observer = new ResizeObserver(() => setCompactSide(sideColumnElement.clientWidth <= 500));\n observer.observe(sideColumnElement);\n return () => observer.disconnect();\n }, [sideColumnElement]);\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 { 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 rootError = getSpanError(rootSpan?.error);\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 traceActions = traceId && (\n <>\n {!isOnTracePage && LinkComponent && traceHref && (\n <Button size=\"icon-sm\" variant=\"ghost\" tooltip=\"Open trace page\" render={<LinkComponent href={traceHref} />}>\n <Link2Icon />\n </Button>\n )}\n <Button\n size=\"icon-sm\"\n variant=\"ghost\"\n tooltip=\"Download trace JSON\"\n disabled={isDownloadingTrace}\n onClick={() => downloadTraceJson(traceId)}\n >\n {isDownloadingTrace ? <Loader2Icon className=\"animate-spin\" /> : <DownloadIcon />}\n </Button>\n </>\n );\n\n const scoreAction = onEvaluateTrace && (\n <Button variant=\"primary\" size=\"sm\" onClick={onEvaluateTrace} disabled={!rootSpan}>\n <CircleGaugeIcon />\n Score trace\n </Button>\n );\n\n const sideColumn =\n traceId && sideView ? (\n <div\n ref={setSideColumnElement}\n data-trace-side-column\n className=\"@container flex h-full min-h-0 min-w-0 flex-col overflow-hidden\"\n >\n {/* Whether the Messages tab exists depends on the spans, so the tabs wait for them;\n otherwise the column flickers Feedback → Messages as the first tab changes. */}\n {isLoading ? (\n <DataPanel.Header className=\"border-b border-surface-rim\">\n <div aria-hidden className=\"flex h-control-sm items-center gap-2\">\n <Skeleton className=\"h-5 w-24 rounded-full\" />\n <Skeleton className=\"h-5 w-20 rounded-full\" />\n </div>\n </DataPanel.Header>\n ) : (\n <Tabs<TraceSideView> defaultTab={sideView} value={sideView} onValueChange={handleSideViewChange}>\n {/* `flex-nowrap` + a shrinkable tab column: the tab list's scroll wrapper is full-width,\n so in a wrapping row it would push the actions onto a second line. */}\n <DataPanel.Header className=\"flex-nowrap border-b border-surface-rim\">\n <div className=\"min-w-0 flex-1\">\n <TabList variant=\"pill-ghost\" size=\"sm\">\n {sideViews.map(view => (\n <Tab key={view.value} value={view.value} tooltip={compactSide ? view.name : undefined}>\n {view.label}\n </Tab>\n ))}\n </TabList>\n </div>\n {sideHeaderActions && (\n <div className=\"flex shrink-0 items-center whitespace-nowrap\">\n {sideHeaderActions({ compact: compactSide })}\n </div>\n )}\n </DataPanel.Header>\n </Tabs>\n )}\n {!isLoading && sideView === 'messages' && (\n <DataPanel.Content className=\"p-0\">{messagesPanelSlot}</DataPanel.Content>\n )}\n {!isLoading && sideView === 'feedback' && (\n <DataPanel.Content>{feedbackTabSlot?.({ traceId })}</DataPanel.Content>\n )}\n {!isLoading && 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 {isOnTracePage ? (\n <DataPanel.Header>\n <DataPanel.HeaderContent>\n <DataPanel.Heading>Trace Timeline</DataPanel.Heading>\n {traceSummary}\n </DataPanel.HeaderContent>\n <DataPanel.HeaderActions>\n {headerActionsSlot}\n {scoreAction}\n {traceActions}\n </DataPanel.HeaderActions>\n </DataPanel.Header>\n ) : (\n <>\n {/* Navigation row: trace stepping and the trace id on the left; trace actions, then close, on the right. */}\n <DataPanel.Header>\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.HeaderContent>\n <DataPanel.Heading>\n <span className=\"sr-only\">Trace</span>\n <DataPanel.CopyId id={traceId} maxLength={6} ellipsis={false} icon={<TraceIcon />} />\n </DataPanel.Heading>\n </DataPanel.HeaderContent>\n <DataPanel.HeaderActions>\n {headerActionsSlot}\n {scoreAction}\n {onSaveAsDatasetItem && (\n <Button\n size=\"sm\"\n tooltip=\"Add the full trace to a dataset\"\n onClick={() => onSaveAsDatasetItem({ traceId, rootSpanId: rootSpan?.spanId })}\n >\n <SaveIcon />\n Add to dataset\n </Button>\n )}\n {traceActions}\n <div aria-hidden=\"true\" className=\"mx-1 h-4 w-px shrink-0 bg-border-strong\" />\n <DataPanel.CloseButton icon=\"x\" onClick={onClose} label=\"Close trace\" tooltip=\"Close trace\" />\n </DataPanel.HeaderActions>\n </DataPanel.Header>\n {/* Summary row: what ran and how it ended on the left; timing, tokens and cost on the right. */}\n {!rootSpan && isLoading && (\n <DataPanel.Header>\n <div role=\"status\" aria-label=\"Loading trace summary\" className=\"flex w-full items-center gap-2\">\n <Skeleton className=\"h-3 w-32\" />\n <Skeleton className=\"h-5 w-16 rounded-full\" />\n <Skeleton className=\"ml-auto h-3 w-48\" />\n </div>\n </DataPanel.Header>\n )}\n {rootSpan && (\n <DataPanel.Header>\n <DataPanel.Metadata>\n <TraceEntityMeta rootSpan={rootSpan} entityHref={entityHref} LinkComponent={LinkComponent} />\n <TraceStatusMeta rootSpan={rootSpan} />\n </DataPanel.Metadata>\n <div className=\"ml-auto flex min-w-0\">\n <TraceSummaryDescription\n rootSpan={rootSpan}\n usage={usage}\n entityHref={entityHref}\n LinkComponent={LinkComponent}\n showEntity={false}\n showStatus={false}\n />\n </div>\n </DataPanel.Header>\n )}\n </>\n )}\n\n <TracePanelColumns\n layoutKey={rootSpan ? (rootSpan.entityType ?? 'unknown') : entityType === null ? 'unknown' : entityType}\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 // The bar itself is the search field: no pill inside the square panel, the\n // bottom rule is its only edge, and keyboard focus lights that rule like a\n // field's rim. The view switch stays as flat square icons.\n <DataPanel.Header className=\"gap-1 border-b border-surface-rim has-[input:focus-visible]:[--surface-rim:var(--field-rim-focus)]\">\n <SearchIcon aria-hidden className=\"ml-1 size-4 shrink-0 text-muted-foreground\" />\n <input\n type=\"search\"\n aria-label=\"Search spans\"\n placeholder=\"Search spans\"\n value={query}\n onChange={event => setQuery(event.target.value)}\n className=\"h-full min-w-0 flex-1 bg-transparent px-1.5 text-label text-foreground outline-hidden placeholder:text-muted-foreground [&::-webkit-search-cancel-button]:appearance-none\"\n />\n {query && (\n <Button\n size=\"icon-sm\"\n variant=\"ghost\"\n aria-label=\"Clear search\"\n className=\"rounded-md\"\n onClick={() => setQuery('')}\n >\n <XIcon />\n </Button>\n )}\n <div role=\"group\" aria-label=\"Span view\" className=\"flex shrink-0 items-center gap-0.5\">\n {(\n [\n ['tree', 'Span tree', <ListTreeIcon key=\"tree\" />],\n ['timeline', 'Timeline', <ChartGanttIcon key=\"timeline\" />],\n ] as const\n ).map(([view, label, icon]) => (\n <Button\n key={view}\n size=\"icon-sm\"\n variant={spanView === view ? 'subtle' : 'ghost'}\n aria-label={label}\n aria-pressed={spanView === view}\n tooltip={label}\n className=\"rounded-md\"\n onClick={() => setSpanView(view)}\n >\n {icon}\n </Button>\n ))}\n </div>\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 revealSpanId: featuredSpanIds?.at(-1),\n isLoading,\n };\n const streamingTimings =\n rootStreamingTimings && rootSpan && !anchorSpanId\n ? { ...rootStreamingTimings, startedAt: rootSpan.startedAt }\n : undefined;\n\n return (\n <>\n {searchHeader}\n <DataPanel.Content>\n {!isOnTracePage && !onEvaluateTrace && !onSaveAsDatasetItem && 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 {rootSpan && rootError && (\n <Notice\n variant=\"destructive\"\n title={rootError.name ?? 'Error'}\n action={\n <Notice.Button\n onClick={() => {\n setSelectedSpanId(rootSpan.spanId);\n onSpanSelect?.(rootSpan.spanId);\n }}\n >\n View details\n </Notice.Button>\n }\n className=\"mb-4\"\n >\n <Notice.Message className=\"line-clamp-3\">{rootError.message}</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 ? (\n <TraceSpanTimeline {...viewProps} streamingTimings={streamingTimings} />\n ) : (\n <TraceSpanTree {...viewProps} />\n )}\n {noSearchResults}\n </DataPanel.Content>\n </>\n );\n })()\n )}\n </TracePanelColumns>\n </>\n )}\n </DataPanel>\n );\n}\n\n/** The error a span recorded, when it has the `{ name?, message }` shape spans store. */\nfunction getSpanError(error: unknown): { name?: string; message: string } | undefined {\n if (typeof error !== 'object' || error === null || !('message' in error) || typeof error.message !== 'string') {\n return undefined;\n }\n const name = 'name' in error && typeof error.name === 'string' ? error.name : undefined;\n return { name, message: error.message };\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 side\n * and span columns are resizable (down to a minimum width); the trace column takes the rest.\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 */\n/** Column widths in pixels, persisted per trace entity type. */\ntype TraceColumnWidths = { side?: number; span?: number };\n\nconst pixelWidth = (value: unknown) => (typeof value === 'number' && value > 0 ? value : undefined);\n\n// localStorage access throws when storage is blocked (privacy modes, sandboxed iframes) and stored\n// values may be corrupted; fall back to the default widths instead of crashing the panel.\nfunction readColumnWidths(key: string): TraceColumnWidths {\n try {\n const stored: unknown = JSON.parse(localStorage.getItem(key) ?? 'null');\n if (!stored || typeof stored !== 'object') return {};\n return {\n side: pixelWidth((stored as TraceColumnWidths).side),\n span: pixelWidth((stored as TraceColumnWidths).span),\n };\n } catch {\n return {};\n }\n}\n\nfunction writeColumnWidths(key: string, widths: TraceColumnWidths) {\n try {\n localStorage.setItem(key, JSON.stringify(widths));\n } catch {\n // Persisting is best-effort.\n }\n}\n\nfunction TracePanelColumns({\n layoutKey,\n sideColumnSlot,\n spanPanelSlot,\n highlightQuery,\n spanPanelKey,\n children,\n}: {\n /**\n * Root entity type of the trace; column sizes are persisted per value in localStorage.\n * Undefined while the root span is unknown, in which case nothing is persisted.\n */\n layoutKey?: string;\n /** Resizable column on the left (messages / feedback / scores). */\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 // The side and span columns are sized in pixels: they keep their width when the drawer resizes\n // (it widens when a span opens) and when the span column comes and goes; only the trace column in\n // the middle absorbs the change. The library lays panels out in percentages, so the pixel widths\n // are owned here.\n const groupRef = useGroupRef();\n const columnsRef = useRef<HTMLDivElement>(null);\n const storageKey = layoutKey ? `mastra:trace-panel-widths:${layoutKey}` : undefined;\n const widths = useRef<{ key?: string; value: TraceColumnWidths }>({ value: {} });\n if (widths.current.key !== storageKey) {\n widths.current = { key: storageKey, value: storageKey ? readColumnWidths(storageKey) : {} };\n }\n // Only agent traces have messages worth reading side by side with the spans; for every other\n // entity the side column starts narrow so the span tree gets the room.\n const sideWidth = () => widths.current.value.side ?? (layoutKey === 'agent' ? 480 : 320);\n const spanWidth = () => widths.current.value.span ?? 480;\n\n const panelElements = () =>\n Array.from(columnsRef.current?.querySelectorAll<HTMLElement>(':scope > [data-panel]') ?? []);\n\n // Only a resize the user makes is remembered: layout changes from the drawer resizing or a\n // column mounting are derived from the stored widths and must not drift them.\n const userResizing = useRef(false);\n const markUserResize = (event: { target: EventTarget }) => {\n if (event.target instanceof Element && event.target.closest('[data-separator]')) userResizing.current = true;\n };\n const persistWidths = (layout: Layout) => {\n if (!userResizing.current) return;\n userResizing.current = false;\n const width = (id: string) =>\n id in layout\n ? pixelWidth(Math.round(panelElements().find(panel => panel.id === id)?.offsetWidth ?? 0))\n : undefined;\n widths.current.value = {\n side: width('trace-side') ?? widths.current.value.side,\n span: width('trace-span') ?? widths.current.value.span,\n };\n if (storageKey) writeColumnWidths(storageKey, widths.current.value);\n };\n\n // The library re-lays panels out on its own — when the drawer resizes, when a column mounts or\n // unmounts — so every layout it reports is brought back to the pixel widths, unless the user is\n // dragging a separator. The layout it settles on after clamping to min sizes is left alone,\n // including the one it reports from inside our own setLayout: when the columns can't fit, rounding\n // makes each clamped layout differ from the last, and answering it would re-lay out forever.\n const settledLayout = useRef<Layout | undefined>(undefined);\n const applyingLayout = useRef(false);\n const holdPixelWidths = (layout: Layout) => {\n if (userResizing.current || applyingLayout.current) return;\n const group = groupRef.current;\n const ids = Object.keys(layout);\n // The library sizes panels against their summed width, separators excluded.\n const total = panelElements()\n .filter(panel => ids.includes(panel.id))\n .reduce((sum, panel) => sum + panel.offsetWidth, 0);\n if (!group || total === 0 || !ids.includes('trace-main')) return;\n const side = ids.includes('trace-side') ? (sideWidth() / total) * 100 : 0;\n const span = ids.includes('trace-span') ? (spanWidth() / total) * 100 : 0;\n const target: Layout = { 'trace-main': 100 - side - span };\n if (side) target['trace-side'] = side;\n if (span) target['trace-span'] = span;\n const tolerance = (0.5 / total) * 100;\n const matches = (a: Layout, b?: Layout) =>\n !!b && ids.every(id => Math.abs((a[id] ?? 0) - (b[id] ?? Infinity)) < tolerance);\n if (matches(layout, target) || matches(layout, settledLayout.current)) return;\n queueMicrotask(() => {\n applyingLayout.current = true;\n try {\n settledLayout.current = group.setLayout(target);\n } finally {\n applyingLayout.current = false;\n }\n });\n };\n\n return (\n <div\n ref={highlightRef}\n data-trace-columns\n className=\"flex min-h-0 flex-1\"\n onPointerDownCapture={markUserResize}\n onKeyDownCapture={markUserResize}\n >\n {/* Plain Group, not PanelGroup: its flex-grow transition would lag behind the drawer\n resizing and make the pixel-sized columns visibly stretch. */}\n <Group\n // Default sizes are only read on mount: remount once the entity type is known.\n key={layoutKey ?? 'unknown'}\n groupRef={groupRef}\n elementRef={columnsRef}\n orientation=\"horizontal\"\n className=\"min-h-0 flex-1\"\n onLayoutChange={holdPixelWidths}\n onLayoutChanged={persistWidths}\n >\n {sideColumnSlot && (\n <>\n <Panel id=\"trace-side\" minSize={280} defaultSize={sideWidth()} groupResizeBehavior=\"preserve-pixel-size\">\n <div className=\"flex h-full min-h-0 flex-col border-r border-surface-rim\">{sideColumnSlot}</div>\n </Panel>\n <PanelSeparator variant=\"pill\" />\n </>\n )}\n {/* 384px: the timeline grid's own minimum (two 12rem columns), so its end never clips. */}\n <Panel id=\"trace-main\" minSize={384} className=\"flex min-h-0 min-w-0 flex-col\">\n {children}\n </Panel>\n {spanPanelSlot && (\n <>\n <PanelSeparator variant=\"pill\" />\n <Panel\n id=\"trace-span\"\n minSize={384}\n maxSize=\"50%\"\n defaultSize={spanWidth()}\n groupResizeBehavior=\"preserve-pixel-size\"\n >\n <div\n ref={scrollToMatchRef}\n data-highlight\n className=\"flex h-full min-h-0 animate-in flex-col border-l border-surface-rim duration-300 fade-in-0\"\n >\n {spanPanelSlot}\n </div>\n </Panel>\n </>\n )}\n </Group>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAkJA,SAAgB,mBAAmB,EACjC,SACA,OACA,WACA,SACA,cACA,iBACA,qBACA,eACA,YACA,QACA,OAAO,QACP,OACA,YACA,mBACA,OACA,WACA,eACA,WACA,YACA,OACA,sBACA,cACA,YACA,6BAA6B,MAC7B,eACA,gBACA,iBACA,kBACA,iBACA,mBACA,mBACA,UAAU,oBACV,kBACA,UAAU,oBACV,kBACA,iBAC0B;CAC1B,MAAM,gBAAgB,cAAc;CAIpC,MAAM,YAAY,cAAc;EAC9B,MAAM,QAAyE,CAAC;EAChF,IAAI,mBACF,MAAM,KAAK;GACT,OAAO;GACP,MAAM;GACN,OACE,qBAAAA,YAAA,EAAA,UAAA,CACE,oBAAC,MAAD;IAAM,MAAK;IACT,UAAA,oBAAC,uBAAD,CAAwB,CAAA;GACpB,CAAA,GACN,oBAAC,QAAD;IAAM,WAAU;IAAuB,UAAA;GAAc,CAAA,CACrD,EAAA,CAAA;EAEN,CAAC;EAEH,IAAI,iBACF,MAAM,KAAK;GACT,OAAO;GACP,MAAM;GACN,OACE,qBAAAA,YAAA,EAAA,UAAA,CACE,oBAAC,MAAD;IAAM,MAAK;IACT,UAAA,oBAAC,wBAAD,CAAyB,CAAA;GACrB,CAAA,GACN,qBAAC,QAAD;IAAM,WAAU;IAAhB,UAAA,CAAuC,YAC5B,oBAAoB,QAAQ,qBAAAA,YAAA,EAAA,UAAA;KAAE;KAAG;KAAiB;IAAG,EAAA,CAAA,CAC1D;GACN,CAAA,CAAA,EAAA,CAAA;EAEN,CAAC;EAEH,IAAI,eACF,MAAM,KAAK;GACT,OAAO;GACP,MAAM;GACN,OACE,qBAAAA,YAAA,EAAA,UAAA,CACE,oBAAC,MAAD;IAAM,MAAK;IACT,UAAA,oBAAC,aAAD,CAAc,CAAA;GACV,CAAA,GACN,qBAAC,QAAD;IAAM,WAAU;IAAhB,UAAA,CAAuC,UAAO,kBAAkB,QAAQ,qBAAAA,YAAA,EAAA,UAAA;KAAE;KAAG;KAAe;IAAG,EAAA,CAAA,CAAQ;GACvG,CAAA,CAAA,EAAA,CAAA;EAEN,CAAC;EAEH,OAAO;CACT,GAAG;EAAC;EAAmB;EAAiB;EAAkB;EAAe;CAAc,CAAC;CACxF,MAAM,CAAC,sBAAsB,2BAA2B,SAAwB;CAGhF,MAAM,CAAC,mBAAmB,wBAAwB,SAAgC,IAAI;CACtF,MAAM,CAAC,aAAa,kBAAkB,SAAS,KAAK;CACpD,gBAAgB;EACd,IAAI,CAAC,qBAAqB,EAAE,oBAAoB,aAAa;EAC7D,MAAM,WAAW,IAAI,qBAAqB,eAAe,kBAAkB,eAAe,GAAG,CAAC;EAC9F,SAAS,QAAQ,iBAAiB;EAClC,aAAa,SAAS,WAAW;CACnC,GAAG,CAAC,iBAAiB,CAAC;CACtB,MAAM,iBAAiB,sBAAsB;CAC7C,MAAM,YAAY,UAAU,MAAK,SAAQ,KAAK,UAAU,cAAc,KAAK,UAAU,GAAA,EAAK;CAC1F,MAAM,wBAAwB,SAAwB;EACpD,wBAAwB,IAAI;EAC5B,mBAAmB,IAAI;CACzB;CAEA,MAAM,CAAC,sBAAsB,2BAA2B,SAAwB,MAAM;CACtF,MAAM,WAAW,sBAAsB;CACvC,MAAM,eAAe,SAAwB;EAC3C,wBAAwB,IAAI;EAC5B,mBAAmB,IAAI;CACzB;CAEA,MAAM,EAAE,UAAU,mBAAmB,WAAW,uBAAuB,qBAAqB;CAE5F,MAAM,CAAC,gBAAgB,qBAAqB,SAA6B,iBAAiB,KAAA,CAAS;CAGnG,gBAAgB;EAEd,IAAI,CAAC,eAAe;GAClB,kBAAkB,KAAA,CAAS;GAC3B,eAAe,KAAA,CAAS;GACxB;EACF;EAIA,IAAI,aAAa,CAAC,OAAO;EAGzB,IADc,MAAM,MAAK,MAAK,EAAE,WAAW,aACvC,GAAO;GACT,kBAAkB,aAAa;GAC/B,eAAe,aAAa;EAC9B,OAAO;GACL,kBAAkB,KAAA,CAAS;GAC3B,eAAe,KAAA,CAAS;EAC1B;CAEF,GAAG;EAAC;EAAe;EAAO;CAAS,CAAC;CAEpC,MAAM,EAAE,OAAO,UAAU,SAAS,wBAAwB,eAAe,SAAS,CAAC,CAAC;CAEpF,MAAM,oBAAoB,cAEtB,wBAGE,QAAQ,KAAI,UAAS;EAAE,GAAG;EAAM,sBAAsB,oBAAoB,IAAI,KAAK,MAAM;CAAE,EAAE,GAC7F,YACF,GACF;EAAC;EAAS;EAAqB;CAAY,CAC7C;CAEA,MAAM,CAAC,iBAAiB,sBAAsB,SAAmB,CAAC,CAAC;CAEnE,gBAAgB;EACd,IAAI,kBAAkB,SAAS,GAC7B,mBAAmB,cAAc,iBAAiB,CAAC;CAEvD,GAAG,CAAC,iBAAiB,CAAC;CAEtB,MAAM,WAAW,cACR,eAAe,OAAO,MAAK,MAAK,EAAE,WAAW,YAAY,IAAI,OAAO,MAAK,MAAK,EAAE,gBAAgB,IAAI,GAC3G,CAAC,OAAO,YAAY,CACtB;CACA,MAAM,YAAY,aAAa,UAAU,KAAK;CAC9C,MAAM,mBAAmB,OAAe;EACtC,MAAM,QAAQ,mBAAmB,KAAK,KAAA,IAAY;EAClD,kBAAkB,KAAK;EACvB,eAAe,KAAK;CACtB;CAEA,MAAM,eAAe,YACnB,oBAAC,yBAAD;EAAmC;EAAiB;EAAmB;EAA2B;CAAgB,CAAA;CAGpH,MAAM,eAAe,WACnB,qBAAAA,YAAA,EAAA,UAAA,CACG,CAAC,iBAAiB,iBAAiB,aAClC,oBAAC,QAAD;EAAQ,MAAK;EAAU,SAAQ;EAAQ,SAAQ;EAAkB,QAAQ,oBAAC,eAAD,EAAe,MAAM,UAAY,CAAA;EACxG,UAAA,oBAAC,WAAD,CAAY,CAAA;CACN,CAAA,GAEV,oBAAC,QAAD;EACE,MAAK;EACL,SAAQ;EACR,SAAQ;EACR,UAAU;EACV,eAAe,kBAAkB,OAAO;EAEvC,UAAA,qBAAqB,oBAAC,aAAD,EAAa,WAAU,eAAgB,CAAA,IAAI,oBAAC,cAAD,CAAe,CAAA;CAC1E,CAAA,CACR,EAAA,CAAA;CAGJ,MAAM,cAAc,mBAClB,qBAAC,QAAD;EAAQ,SAAQ;EAAU,MAAK;EAAK,SAAS;EAAiB,UAAU,CAAC;EAAzE,UAAA,CACE,oBAAC,iBAAD,CAAkB,CAAA,GAAC,aAEb;;CAGV,MAAM,aACJ,WAAW,WACT,qBAAC,OAAD;EACE,KAAK;EACL,0BAAA;EACA,WAAU;EAHZ,UAAA;GAOG,YACC,oBAAC,UAAU,QAAX;IAAkB,WAAU;IAC1B,UAAA,qBAAC,OAAD;KAAK,eAAA;KAAY,WAAU;KAA3B,UAAA,CACE,oBAAC,UAAD,EAAU,WAAU,wBAAyB,CAAA,GAC7C,oBAAC,UAAD,EAAU,WAAU,wBAAyB,CAAA,CAC1C;;GACW,CAAA,IAElB,oBAAC,MAAD;IAAqB,YAAY;IAAU,OAAO;IAAU,eAAe;IAGzE,UAAA,qBAAC,UAAU,QAAX;KAAkB,WAAU;KAA5B,UAAA,CACE,oBAAC,OAAD;MAAK,WAAU;MACb,UAAA,oBAAC,SAAD;OAAS,SAAQ;OAAa,MAAK;OAChC,UAAA,UAAU,KAAI,SACb,oBAAC,KAAD;QAAsB,OAAO,KAAK;QAAO,SAAS,cAAc,KAAK,OAAO,KAAA;QACzE,UAAA,KAAK;OACH,GAFK,KAAK,KAEV,CACN;MACM,CAAA;KACN,CAAA,GACJ,qBACC,oBAAC,OAAD;MAAK,WAAU;MACZ,UAAA,kBAAkB,EAAE,SAAS,YAAY,CAAC;KACxC,CAAA,CAES;;GACd,CAAA;GAEP,CAAC,aAAa,aAAa,cAC1B,oBAAC,UAAU,SAAX;IAAmB,WAAU;IAAO,UAAA;GAAqC,CAAA;GAE1E,CAAC,aAAa,aAAa,cAC1B,oBAAC,UAAU,SAAX,EAAA,UAAoB,kBAAkB,EAAE,QAAQ,CAAC,EAAqB,CAAA;GAEvE,CAAC,aAAa,aAAa,YAC1B,oBAAC,UAAU,SAAX,EAAA,UAAoB,gBAAgB;IAAE;IAAS,YAAY,UAAU;GAAO,CAAC,EAAqB,CAAA;EAEjG;CACH,CAAA,IAAA;CAEN,OACE,oBAAC,WAAD;EACE,MAAM,CAAC,CAAC;EACC;EACT,OAAO,UAAU,gBAAgB,mBAAmB,SAAS,WAAW;EAClE;EACC;EAEN,UAAA,WACC,qBAAAA,YAAA,EAAA,UAAA;GACG;GACA,gBACC,qBAAC,UAAU,QAAX,EAAA,UAAA,CACE,qBAAC,UAAU,eAAX,EAAA,UAAA,CACE,oBAAC,UAAU,SAAX,EAAA,UAAmB,iBAAiC,CAAA,GACnD,YACsB,EAAA,CAAA,GACzB,qBAAC,UAAU,eAAX,EAAA,UAAA;IACG;IACA;IACA;GACsB,EAAA,CAAA,CACT,EAAA,CAAA,IAElB,qBAAAA,YAAA,EAAA,UAAA;IAEE,qBAAC,UAAU,QAAX,EAAA,UAAA;MACI,cAAc,WACd,oBAAC,UAAU,aAAX;MACc;MACJ;MACR,eAAc;MACd,WAAU;KACX,CAAA;KAEH,oBAAC,UAAU,eAAX,EAAA,UACE,qBAAC,UAAU,SAAX,EAAA,UAAA,CACE,oBAAC,QAAD;MAAM,WAAU;MAAU,UAAA;KAAW,CAAA,GACrC,oBAAC,UAAU,QAAX;MAAkB,IAAI;MAAS,WAAW;MAAG,UAAU;MAAO,MAAM,oBAAC,WAAD,CAAY,CAAA;KAAI,CAAA,CACnE,EAAA,CAAA,EACI,CAAA;KACzB,qBAAC,UAAU,eAAX,EAAA,UAAA;MACG;MACA;MACA,uBACC,qBAAC,QAAD;OACE,MAAK;OACL,SAAQ;OACR,eAAe,oBAAoB;QAAE;QAAS,YAAY,UAAU;OAAO,CAAC;OAH9E,UAAA,CAKE,oBAAC,UAAD,CAAW,CAAA,GAAC,gBAEN;;MAET;MACD,oBAAC,OAAD;OAAK,eAAY;OAAO,WAAU;MAA2C,CAAA;MAC7E,oBAAC,UAAU,aAAX;OAAuB,MAAK;OAAI,SAAS;OAAS,OAAM;OAAc,SAAQ;MAAe,CAAA;KACtE,EAAA,CAAA;IACT,EAAA,CAAA;IAEjB,CAAC,YAAY,aACZ,oBAAC,UAAU,QAAX,EAAA,UACE,qBAAC,OAAD;KAAK,MAAK;KAAS,cAAW;KAAwB,WAAU;KAAhE,UAAA;MACE,oBAAC,UAAD,EAAU,WAAU,WAAY,CAAA;MAChC,oBAAC,UAAD,EAAU,WAAU,wBAAyB,CAAA;MAC7C,oBAAC,UAAD,EAAU,WAAU,mBAAoB,CAAA;KACrC;IACW,CAAA,EAAA,CAAA;IAEnB,YACC,qBAAC,UAAU,QAAX,EAAA,UAAA,CACE,qBAAC,UAAU,UAAX,EAAA,UAAA,CACE,oBAAC,iBAAD;KAA2B;KAAsB;KAA2B;IAAgB,CAAA,GAC5F,oBAAC,iBAAD,EAA2B,SAAW,CAAA,CACpB,EAAA,CAAA,GACpB,oBAAC,OAAD;KAAK,WAAU;KACb,UAAA,oBAAC,yBAAD;MACY;MACH;MACK;MACG;MACf,YAAY;MACZ,YAAY;KACb,CAAA;IACE,CAAA,CACW,EAAA,CAAA;GAEpB,EAAA,CAAA;GAGJ,oBAAC,mBAAD;IACE,WAAW,WAAY,SAAS,cAAc,YAAa,eAAe,OAAO,YAAY;IAC7F,gBAAgB;IACD;IACf,gBAAgB;IAChB,cAAc;IAEb,UAAA,CAAC,aAAa,CAAC,OAAO,SACrB,oBAAC,UAAU,QAAX,EAAA,UAAkB,iCAAgD,CAAA,WAE3D;KAGL,MAAM,aAAa,aAAa;KAChC,MAAM,eAIJ,qBAAC,UAAU,QAAX;MAAkB,WAAU;MAA5B,UAAA;OACE,oBAAC,YAAD;QAAY,eAAA;QAAY,WAAU;OAA8C,CAAA;OAChF,oBAAC,SAAD;QACE,MAAK;QACL,cAAW;QACX,aAAY;QACZ,OAAO;QACP,WAAU,UAAS,SAAS,MAAM,OAAO,KAAK;QAC9C,WAAU;OACX,CAAA;OACA,SACC,oBAAC,QAAD;QACE,MAAK;QACL,SAAQ;QACR,cAAW;QACX,WAAU;QACV,eAAe,SAAS,EAAE;QAE1B,UAAA,oBAAC,OAAD,CAAQ,CAAA;OACF,CAAA;OAEV,oBAAC,OAAD;QAAK,MAAK;QAAQ,cAAW;QAAY,WAAU;QAE/C,UAAA,CACE;SAAC;SAAQ;SAAa,oBAAC,cAAD,CAA0B,GAAR,MAAQ;QAAC,GACjD;SAAC;SAAY;SAAY,oBAAC,gBAAD,CAAgC,GAAZ,UAAY;QAAC,CAC5D,CAAC,CACD,KAAK,CAAC,MAAM,OAAO,UACnB,oBAAC,QAAD;SAEE,MAAK;SACL,SAAS,aAAa,OAAO,WAAW;SACxC,cAAY;SACZ,gBAAc,aAAa;SAC3B,SAAS;SACT,WAAU;SACV,eAAe,YAAY,IAAI;SAE9B,UAAA;QACK,GAVD,IAUC,CACT;OACE,CAAA;MACW;;KAEpB,MAAM,kBAAkB,CAAC,aAAa,kBAAkB,WAAW,KACjE,oBAAC,UAAU,QAAX,EAAA,UAAkB,8BAA6C,CAAA;KAEjE,MAAM,YAAY;MAChB;MACA,aAAa;MACb;MACA;MACA;MACA;MACA,cAAc,iBAAiB,GAAG,EAAE;MACpC;KACF;KACA,MAAM,mBACJ,wBAAwB,YAAY,CAAC,eACjC;MAAE,GAAG;MAAsB,WAAW,SAAS;KAAU,IACzD,KAAA;KAEN,OACE,qBAAAA,YAAA,EAAA,UAAA,CACG,cACD,qBAAC,UAAU,SAAX,EAAA,UAAA;MACG,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,uBAAuB,8BAC7D,oBAAC,QAAD;OAAQ,SAAQ;OAAO,WAAU;OAC/B,UAAA,oBAAC,OAAO,SAAR,EAAA,UAAgB,wGAGA,CAAA;MACV,CAAA;MAGT,YAAY,aACX,oBAAC,QAAD;OACE,SAAQ;OACR,OAAO,UAAU,QAAQ;OACzB,QACE,oBAAC,OAAO,QAAR;QACE,eAAe;SACb,kBAAkB,SAAS,MAAM;SACjC,eAAe,SAAS,MAAM;QAChC;QACD,UAAA;OAEc,CAAA;OAEjB,WAAU;OAEV,UAAA,oBAAC,OAAO,SAAR;QAAgB,WAAU;QAAgB,UAAA,UAAU;OAAwB,CAAA;MACtE,CAAA;MAMT,aACC,oBAAC,mBAAD;OAAmB,GAAI;OAA6B;MAAmB,CAAA,IAEvE,oBAAC,eAAD,EAAe,GAAI,UAAY,CAAA;MAEhC;KACgB,EAAA,CAAA,CACnB,EAAA,CAAA;IAEN,EAAA,CAAG;GAEY,CAAA;EACnB,EAAA,CAAA;CAEK,CAAA;AAEf;;AAGA,SAAS,aAAa,OAAgE;CACpF,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,EAAE,aAAa,UAAU,OAAO,MAAM,YAAY,UACnG;CAGF,OAAO;EAAE,MADI,UAAU,SAAS,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO,KAAA;EAC/D,SAAS,MAAM;CAAQ;AACxC;AAaA,IAAM,cAAc,UAAoB,OAAO,UAAU,YAAY,QAAQ,IAAI,QAAQ,KAAA;AAIzF,SAAS,iBAAiB,KAAgC;CACxD,IAAI;EACF,MAAM,SAAkB,KAAK,MAAM,aAAa,QAAQ,GAAG,KAAK,MAAM;EACtE,IAAI,CAAC,UAAU,OAAO,WAAW,UAAU,OAAO,CAAC;EACnD,OAAO;GACL,MAAM,WAAY,OAA6B,IAAI;GACnD,MAAM,WAAY,OAA6B,IAAI;EACrD;CACF,QAAQ;EACN,OAAO,CAAC;CACV;AACF;AAEA,SAAS,kBAAkB,KAAa,QAA2B;CACjE,IAAI;EACF,aAAa,QAAQ,KAAK,KAAK,UAAU,MAAM,CAAC;CAClD,QAAQ,CAER;AACF;AAEA,SAAS,kBAAkB,EACzB,WACA,gBACA,eACA,gBACA,cACA,YAcC;CAGD,MAAM,EAAE,KAAK,iBAAiB,iBAAiC,cAAc;CAK7E,MAAM,EAAE,KAAK,qBAAqB,0BAA0C,gBAAgB,YAAY;CAMxG,MAAM,WAAW,YAAY;CAC7B,MAAM,aAAa,OAAuB,IAAI;CAC9C,MAAM,aAAa,YAAY,6BAA6B,cAAc,KAAA;CAC1E,MAAM,SAAS,OAAmD,EAAE,OAAO,CAAC,EAAE,CAAC;CAC/E,IAAI,OAAO,QAAQ,QAAQ,YACzB,OAAO,UAAU;EAAE,KAAK;EAAY,OAAO,aAAa,iBAAiB,UAAU,IAAI,CAAC;CAAE;CAI5F,MAAM,kBAAkB,OAAO,QAAQ,MAAM,SAAS,cAAc,UAAU,MAAM;CACpF,MAAM,kBAAkB,OAAO,QAAQ,MAAM,QAAQ;CAErD,MAAM,sBACJ,MAAM,KAAK,WAAW,SAAS,iBAA8B,uBAAuB,KAAK,CAAC,CAAC;CAI7F,MAAM,eAAe,OAAO,KAAK;CACjC,MAAM,kBAAkB,UAAmC;EACzD,IAAI,MAAM,kBAAkB,WAAW,MAAM,OAAO,QAAQ,kBAAkB,GAAG,aAAa,UAAU;CAC1G;CACA,MAAM,iBAAiB,WAAmB;EACxC,IAAI,CAAC,aAAa,SAAS;EAC3B,aAAa,UAAU;EACvB,MAAM,SAAS,OACb,MAAM,SACF,WAAW,KAAK,MAAM,cAAc,CAAC,CAAC,MAAK,UAAS,MAAM,OAAO,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC,IACvF,KAAA;EACN,OAAO,QAAQ,QAAQ;GACrB,MAAM,MAAM,YAAY,KAAK,OAAO,QAAQ,MAAM;GAClD,MAAM,MAAM,YAAY,KAAK,OAAO,QAAQ,MAAM;EACpD;EACA,IAAI,YAAY,kBAAkB,YAAY,OAAO,QAAQ,KAAK;CACpE;CAOA,MAAM,gBAAgB,OAA2B,KAAA,CAAS;CAC1D,MAAM,iBAAiB,OAAO,KAAK;CACnC,MAAM,mBAAmB,WAAmB;EAC1C,IAAI,aAAa,WAAW,eAAe,SAAS;EACpD,MAAM,QAAQ,SAAS;EACvB,MAAM,MAAM,OAAO,KAAK,MAAM;EAE9B,MAAM,QAAQ,cAAc,CAAC,CAC1B,QAAO,UAAS,IAAI,SAAS,MAAM,EAAE,CAAC,CAAC,CACvC,QAAQ,KAAK,UAAU,MAAM,MAAM,aAAa,CAAC;EACpD,IAAI,CAAC,SAAS,UAAU,KAAK,CAAC,IAAI,SAAS,YAAY,GAAG;EAC1D,MAAM,OAAO,IAAI,SAAS,YAAY,IAAK,UAAU,IAAI,QAAS,MAAM;EACxE,MAAM,OAAO,IAAI,SAAS,YAAY,IAAK,UAAU,IAAI,QAAS,MAAM;EACxE,MAAM,SAAiB,EAAE,cAAc,MAAM,OAAO,KAAK;EACzD,IAAI,MAAM,OAAO,gBAAgB;EACjC,IAAI,MAAM,OAAO,gBAAgB;EACjC,MAAM,YAAa,KAAM,QAAS;EAClC,MAAM,WAAW,GAAW,MAC1B,CAAC,CAAC,KAAK,IAAI,OAAM,OAAM,KAAK,KAAK,EAAE,OAAO,MAAM,EAAE,OAAO,SAAS,IAAI,SAAS;EACjF,IAAI,QAAQ,QAAQ,MAAM,KAAK,QAAQ,QAAQ,cAAc,OAAO,GAAG;EACvE,qBAAqB;GACnB,eAAe,UAAU;GACzB,IAAI;IACF,cAAc,UAAU,MAAM,UAAU,MAAM;GAChD,UAAU;IACR,eAAe,UAAU;GAC3B;EACF,CAAC;CACH;CAEA,OACE,oBAAC,OAAD;EACE,KAAK;EACL,sBAAA;EACA,WAAU;EACV,sBAAsB;EACtB,kBAAkB;EAIlB,UAAA,qBAAC,OAAD;GAGY;GACV,YAAY;GACZ,aAAY;GACZ,WAAU;GACV,gBAAgB;GAChB,iBAAiB;GARnB,UAAA;IAUG,kBACC,qBAAAA,YAAA,EAAA,UAAA,CACE,oBAAC,OAAD;KAAO,IAAG;KAAa,SAAS;KAAK,aAAa,UAAU;KAAG,qBAAoB;KACjF,UAAA,oBAAC,OAAD;MAAK,WAAU;MAA4D,UAAA;KAAoB,CAAA;IAC1F,CAAA,GACP,oBAAC,gBAAD,EAAgB,SAAQ,OAAQ,CAAA,CAChC,EAAA,CAAA;IAGJ,oBAAC,OAAD;KAAO,IAAG;KAAa,SAAS;KAAK,WAAU;KAC5C;IACI,CAAA;IACN,iBACC,qBAAAA,YAAA,EAAA,UAAA,CACE,oBAAC,gBAAD,EAAgB,SAAQ,OAAQ,CAAA,GAChC,oBAAC,OAAD;KACE,IAAG;KACH,SAAS;KACT,SAAQ;KACR,aAAa,UAAU;KACvB,qBAAoB;KAEpB,UAAA,oBAAC,OAAD;MACE,KAAK;MACL,kBAAA;MACA,WAAU;MAET,UAAA;KACE,CAAA;IACA,CAAA,CACP,EAAA,CAAA;GAEC;EAxCA,GAAA,aAAa,SAwCb;CACJ,CAAA;AAET"}
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_data_list = require("../../../data-list-C4Vmq5HA.cjs");
3
2
  const require_components_HoverCard = require("../../../components/HoverCard.cjs.js");
3
+ const require_data_list = require("../../../data-list-C4Vmq5HA.cjs");
4
4
  const require_domains_traces_components_trace_error_details = require("./trace-error-details.cjs.js");
5
5
  let react_jsx_runtime = require("react/jsx-runtime");
6
6
  // src/domains/traces/components/trace-error-cell.tsx
@@ -1,5 +1,5 @@
1
- import { t as DataList } from "../../../data-list-DHCOoLmj.js";
2
1
  import { HoverCard, HoverCardContent, HoverCardTrigger } from "../../../components/HoverCard.es.js";
2
+ import { t as DataList } from "../../../data-list-DHCOoLmj.js";
3
3
  import { TraceErrorDetails } from "./trace-error-details.es.js";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  // src/domains/traces/components/trace-error-cell.tsx
@@ -1,8 +1,8 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_trace_filters = require("../../../../trace-filters-a0N9bf52.cjs");
3
3
  const require_domains_traces_components_traces_explorer_traces_explorer_actions = require("./traces-explorer-actions.cjs.js");
4
- require("../../../../filter-bar-time-range-BA-pXMlo.cjs");
5
- const require_FilterBar = require("../../../../FilterBar-CQl04O6t.cjs");
4
+ require("../../../../filter-bar-time-range-zdM024JD.cjs");
5
+ const require_FilterBar = require("../../../../FilterBar-BSP2UTjc.cjs");
6
6
  const require_domains_traces_components_traces_explorer_traces_explorer_context = require("./traces-explorer-context.cjs.js");
7
7
  const require_domains_traces_components_traces_explorer_use_traces_filter_bar = require("./use-traces-filter-bar.cjs.js");
8
8
  let react_jsx_runtime = require("react/jsx-runtime");
@@ -1,7 +1,7 @@
1
1
  import { u as TRACE_FILTER_BAR_OPERATORS } from "../../../../trace-filters-CaWkw779.js";
2
2
  import { DEFAULT_TRACES_FILTERS } from "./traces-explorer-actions.es.js";
3
- import "../../../../filter-bar-time-range-mg9JeYue.js";
4
- import { n as FilterBar } from "../../../../FilterBar-BgW2dqRQ.js";
3
+ import "../../../../filter-bar-time-range-qlV8p7hp.js";
4
+ import { n as FilterBar } from "../../../../FilterBar-PSQ1OwqH.js";
5
5
  import { useTracesConfig, useTracesFilters, useTracesList } from "./traces-explorer-context.es.js";
6
6
  import { useTracesFilterBar, useTracesFilterBarFields } from "./use-traces-filter-bar.es.js";
7
7
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -2,7 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_trace_filters = require("../../../../trace-filters-a0N9bf52.cjs");
3
3
  const require_types = require("../../../../types-CP7wbYua.cjs");
4
4
  const require_domains_traces_components_traces_explorer_traces_explorer_actions = require("./traces-explorer-actions.cjs.js");
5
- const require_filter_bar_time_range = require("../../../../filter-bar-time-range-BA-pXMlo.cjs");
5
+ const require_filter_bar_time_range = require("../../../../filter-bar-time-range-zdM024JD.cjs");
6
6
  const require_domains_traces_components_traces_explorer_traces_explorer_context = require("./traces-explorer-context.cjs.js");
7
7
  const require_domains_traces_components_traces_explorer_use_traces_discovery = require("./use-traces-discovery.cjs.js");
8
8
  let react = require("react");
@@ -1,7 +1,7 @@
1
1
  import { I as createTraceFilterBarFields, L as filterBarExpressionToTraceFilters, rt as traceTokensToFilterBarItems, tt as traceFiltersToFilterBarExpression } from "../../../../trace-filters-CaWkw779.js";
2
2
  import { t as isFilterBarGroup } from "../../../../types-DiiL5mTO.js";
3
3
  import { getSelectedEntityOption } from "./traces-explorer-actions.es.js";
4
- import { r as FILTER_BAR_TIME_RANGE_ITEM, t as FILTER_BAR_TIME_RANGE_FIELD } from "../../../../filter-bar-time-range-mg9JeYue.js";
4
+ import { r as FILTER_BAR_TIME_RANGE_ITEM, t as FILTER_BAR_TIME_RANGE_FIELD } from "../../../../filter-bar-time-range-qlV8p7hp.js";
5
5
  import { useTracesConfig, useTracesFilters } from "./traces-explorer-context.es.js";
6
6
  import { useTracesDiscovery } from "./use-traces-discovery.es.js";
7
7
  import { useMemo } from "react";