@mastra/playground-ui 69.0.0-alpha.0 → 69.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (671) hide show
  1. package/dist/{FilterBar-Kmn6gMgO.js → FilterBar-CFacnMNl.js} +2 -2
  2. package/dist/{FilterBar-Kmn6gMgO.js.map → FilterBar-CFacnMNl.js.map} +1 -1
  3. package/dist/{FilterBar-jBz6yaNu.cjs → FilterBar-CR8nbvoe.cjs} +2 -2
  4. package/dist/{FilterBar-jBz6yaNu.cjs.map → FilterBar-CR8nbvoe.cjs.map} +1 -1
  5. package/dist/KnowledgePageGraph.css +1 -3
  6. package/dist/{MarkdownRenderer-CY8LGt-l.js → MarkdownRenderer-BSGb65Ze.js} +2 -2
  7. package/dist/{MarkdownRenderer-CY8LGt-l.js.map → MarkdownRenderer-BSGb65Ze.js.map} +1 -1
  8. package/dist/{MarkdownRenderer-CUYpmuPh.cjs → MarkdownRenderer-CDwlvw0Y.cjs} +2 -2
  9. package/dist/{MarkdownRenderer-CUYpmuPh.cjs.map → MarkdownRenderer-CDwlvw0Y.cjs.map} +1 -1
  10. package/dist/{MetricsCard-DojbLiEx.cjs → MetricsCard-CSJ4TsNq.cjs} +3 -3
  11. package/dist/MetricsCard-CSJ4TsNq.cjs.map +1 -0
  12. package/dist/{MetricsCard-kAqSCPPe.js → MetricsCard-D6bQfynP.js} +3 -3
  13. package/dist/MetricsCard-D6bQfynP.js.map +1 -0
  14. package/dist/{Tree-od43gLMO.js → Tree-D1_VJClB.js} +3 -2
  15. package/dist/Tree-D1_VJClB.js.map +1 -0
  16. package/dist/{Tree-Caz4FTCU.cjs → Tree-kgLG4IbP.cjs} +3 -2
  17. package/dist/Tree-kgLG4IbP.cjs.map +1 -0
  18. package/dist/{Workflow-mIbUYdv0.js → Workflow-CXRv3YXx.js} +2 -2
  19. package/dist/{Workflow-mIbUYdv0.js.map → Workflow-CXRv3YXx.js.map} +1 -1
  20. package/dist/{Workflow-XR5L-3cJ.cjs → Workflow-DIfTVqZs.cjs} +2 -2
  21. package/dist/{Workflow-XR5L-3cJ.cjs.map → Workflow-DIfTVqZs.cjs.map} +1 -1
  22. package/dist/{activity-ClFChYfl.js → activity-BH_eegMA.js} +2 -2
  23. package/dist/{activity-ClFChYfl.js.map → activity-BH_eegMA.js.map} +1 -1
  24. package/dist/{activity-BprmG6yH.cjs → activity-Ciolopq8.cjs} +2 -2
  25. package/dist/{activity-BprmG6yH.cjs.map → activity-Ciolopq8.cjs.map} +1 -1
  26. package/dist/components/Breadcrumb.cjs.js.map +1 -1
  27. package/dist/components/Breadcrumb.es.js.map +1 -1
  28. package/dist/components/CodeBlock.cjs.js +1 -1
  29. package/dist/components/CodeBlock.es.js +1 -1
  30. package/dist/components/DataList.cjs.js +1 -1
  31. package/dist/components/DataList.es.js +1 -1
  32. package/dist/components/DateTimeRangePicker.cjs.js +1 -1
  33. package/dist/components/DateTimeRangePicker.es.js +1 -1
  34. package/dist/components/DropdownMenu.cjs.js +1 -1
  35. package/dist/components/DropdownMenu.es.js +1 -1
  36. package/dist/components/FilterBar.cjs.js +2 -2
  37. package/dist/components/FilterBar.es.js +2 -2
  38. package/dist/components/MarkdownRenderer.cjs.js +1 -1
  39. package/dist/components/MarkdownRenderer.es.js +1 -1
  40. package/dist/components/MetricsCard.cjs.js +1 -1
  41. package/dist/components/MetricsCard.es.js +1 -1
  42. package/dist/components/PropertyFilter.cjs.js +1 -1
  43. package/dist/components/PropertyFilter.es.js +1 -1
  44. package/dist/components/SavedViews.cjs.js +1 -1
  45. package/dist/components/SavedViews.es.js +1 -1
  46. package/dist/components/Sidebar.cjs.js +1 -1
  47. package/dist/components/Sidebar.es.js +1 -1
  48. package/dist/components/Tabs.cjs.js +2 -2
  49. package/dist/components/Tabs.es.js +2 -2
  50. package/dist/components/ThreadRail.cjs.js +2 -0
  51. package/dist/components/ThreadRail.cjs.js.map +1 -1
  52. package/dist/components/ThreadRail.es.js +2 -0
  53. package/dist/components/ThreadRail.es.js.map +1 -1
  54. package/dist/components/Tree.cjs.js +1 -1
  55. package/dist/components/Tree.es.js +1 -1
  56. package/dist/components/Workflow.cjs.js +1 -1
  57. package/dist/components/Workflow.es.js +1 -1
  58. package/dist/components/ai/activity.cjs.js +1 -1
  59. package/dist/components/ai/activity.es.js +1 -1
  60. package/dist/components/ai/plan.cjs.js +1 -1
  61. package/dist/components/ai/plan.es.js +1 -1
  62. package/dist/components/ai/tool-approval.cjs.js +1 -1
  63. package/dist/components/ai/tool-approval.es.js +1 -1
  64. package/dist/components/ai/tool-call.cjs.js +1 -1
  65. package/dist/components/ai/tool-call.es.js +1 -1
  66. package/dist/{date-time-range-picker-Bq-8IPtS.cjs → date-time-range-picker-2a-wUBTk.cjs} +2 -2
  67. package/dist/{date-time-range-picker-Bq-8IPtS.cjs.map → date-time-range-picker-2a-wUBTk.cjs.map} +1 -1
  68. package/dist/{date-time-range-picker-DdNgKD87.js → date-time-range-picker-BUjjjvo8.js} +2 -2
  69. package/dist/{date-time-range-picker-DdNgKD87.js.map → date-time-range-picker-BUjjjvo8.js.map} +1 -1
  70. package/dist/domains/chat/activity/activity-stretch-line.cjs.js +1 -1
  71. package/dist/domains/chat/activity/activity-stretch-line.es.js +1 -1
  72. package/dist/domains/chat/activity/components/activity-fold.cjs.js +1 -1
  73. package/dist/domains/chat/activity/components/activity-fold.es.js +1 -1
  74. package/dist/domains/chat/activity/components/calls-panel.cjs.js +1 -1
  75. package/dist/domains/chat/activity/components/calls-panel.es.js +1 -1
  76. package/dist/domains/chat/activity/components/stretch-content.cjs.js +1 -1
  77. package/dist/domains/chat/activity/components/stretch-content.es.js +1 -1
  78. package/dist/domains/chat/activity/components/stretch-thought.cjs.js +1 -1
  79. package/dist/domains/chat/activity/components/stretch-thought.es.js +1 -1
  80. package/dist/domains/chat/activity/model/activity-segments.cjs.js +1 -1
  81. package/dist/domains/chat/activity/model/activity-segments.es.js +1 -1
  82. package/dist/domains/chat/activity/model/activity-words.cjs.js +1 -1
  83. package/dist/domains/chat/activity/model/activity-words.es.js +1 -1
  84. package/dist/domains/chat/attachments/split-message-attachments.cjs.js +4 -1
  85. package/dist/domains/chat/attachments/split-message-attachments.cjs.js.map +1 -1
  86. package/dist/domains/chat/attachments/split-message-attachments.es.js +4 -1
  87. package/dist/domains/chat/attachments/split-message-attachments.es.js.map +1 -1
  88. package/dist/domains/chat/components/badge-wrapper.cjs.js +1 -1
  89. package/dist/domains/chat/components/badge-wrapper.es.js +1 -1
  90. package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js +1 -1
  91. package/dist/domains/chat/knowledge/pinned-knowledge.es.js +1 -1
  92. package/dist/domains/chat/messages/message-row.cjs.js +2 -2
  93. package/dist/domains/chat/messages/message-row.es.js +2 -2
  94. package/dist/domains/chat/messages/notification-signal-notice.cjs.js +1 -1
  95. package/dist/domains/chat/messages/notification-signal-notice.es.js +1 -1
  96. package/dist/domains/chat/messages/reasoning-content.cjs.js +1 -1
  97. package/dist/domains/chat/messages/reasoning-content.es.js +1 -1
  98. package/dist/domains/chat/messages/renderers/message-text.cjs.js +1 -1
  99. package/dist/domains/chat/messages/renderers/message-text.es.js +1 -1
  100. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.cjs.js +1 -1
  101. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.es.js +1 -1
  102. package/dist/domains/chat/messages/signal-badge.cjs.js +1 -1
  103. package/dist/domains/chat/messages/signal-badge.es.js +1 -1
  104. package/dist/domains/chat/messages/skill-message.cjs.js +2 -2
  105. package/dist/domains/chat/messages/skill-message.es.js +2 -2
  106. package/dist/domains/chat/messages/system-reminder-badge.cjs.js +1 -1
  107. package/dist/domains/chat/messages/system-reminder-badge.es.js +1 -1
  108. package/dist/domains/chat/messages/tripwire-notice.cjs.js +5 -10
  109. package/dist/domains/chat/messages/tripwire-notice.cjs.js.map +1 -1
  110. package/dist/domains/chat/messages/tripwire-notice.es.js +5 -10
  111. package/dist/domains/chat/messages/tripwire-notice.es.js.map +1 -1
  112. package/dist/domains/chat/tools/badges/agent-badge-wrapper.cjs.js +1 -1
  113. package/dist/domains/chat/tools/badges/agent-badge-wrapper.es.js +1 -1
  114. package/dist/domains/chat/tools/badges/agent-badge.cjs.js +1 -1
  115. package/dist/domains/chat/tools/badges/agent-badge.es.js +1 -1
  116. package/dist/domains/chat/tools/badges/file-tree-badge.cjs.js +1 -1
  117. package/dist/domains/chat/tools/badges/file-tree-badge.es.js +1 -1
  118. package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js +2 -2
  119. package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js +2 -2
  120. package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +2 -2
  121. package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +2 -2
  122. package/dist/domains/chat/tools/badges/observation-marker-details.cjs.js +2 -2
  123. package/dist/domains/chat/tools/badges/observation-marker-details.es.js +2 -2
  124. package/dist/domains/chat/tools/badges/observation-renderer.cjs.js +1 -1
  125. package/dist/domains/chat/tools/badges/observation-renderer.es.js +1 -1
  126. package/dist/domains/chat/tools/badges/sandbox-execution-badge.cjs.js +1 -1
  127. package/dist/domains/chat/tools/badges/sandbox-execution-badge.es.js +1 -1
  128. package/dist/domains/chat/tools/badges/tool-approval-badge.cjs.js +1 -1
  129. package/dist/domains/chat/tools/badges/tool-approval-badge.es.js +1 -1
  130. package/dist/domains/chat/tools/badges/tool-badge.cjs.js +1 -1
  131. package/dist/domains/chat/tools/badges/tool-badge.es.js +1 -1
  132. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +1 -1
  133. package/dist/domains/chat/tools/badges/workflow-badge.es.js +1 -1
  134. package/dist/domains/chat/tools/tool-card.cjs.js +1 -1
  135. package/dist/domains/chat/tools/tool-card.es.js +1 -1
  136. package/dist/domains/chat/tools/tool-groups.cjs.js +1 -1
  137. package/dist/domains/chat/tools/tool-groups.es.js +1 -1
  138. package/dist/domains/dashboards/components/connected-widget.cjs.js +55 -0
  139. package/dist/domains/dashboards/components/connected-widget.cjs.js.map +1 -0
  140. package/dist/domains/dashboards/components/connected-widget.d.ts +1 -0
  141. package/dist/domains/dashboards/components/connected-widget.es.js +54 -0
  142. package/dist/domains/dashboards/components/connected-widget.es.js.map +1 -0
  143. package/dist/domains/dashboards/components/dashboard-renderer.cjs.js +13 -8
  144. package/dist/domains/dashboards/components/dashboard-renderer.cjs.js.map +1 -1
  145. package/dist/domains/dashboards/components/dashboard-renderer.es.js +13 -8
  146. package/dist/domains/dashboards/components/dashboard-renderer.es.js.map +1 -1
  147. package/dist/domains/dashboards/components/stateless-widget.cjs.js +30 -0
  148. package/dist/domains/dashboards/components/stateless-widget.cjs.js.map +1 -0
  149. package/dist/domains/dashboards/components/stateless-widget.d.ts +1 -0
  150. package/dist/domains/dashboards/components/stateless-widget.es.js +29 -0
  151. package/dist/domains/dashboards/components/stateless-widget.es.js.map +1 -0
  152. package/dist/domains/dashboards/components/view-gate.cjs.js +18 -40
  153. package/dist/domains/dashboards/components/view-gate.cjs.js.map +1 -1
  154. package/dist/domains/dashboards/components/view-gate.es.js +18 -40
  155. package/dist/domains/dashboards/components/view-gate.es.js.map +1 -1
  156. package/dist/domains/dashboards/components/widget-chrome.cjs.js +1 -1
  157. package/dist/domains/dashboards/components/widget-chrome.es.js +1 -1
  158. package/dist/domains/dashboards/components/widget-controls.cjs.js +106 -0
  159. package/dist/domains/dashboards/components/widget-controls.cjs.js.map +1 -1
  160. package/dist/domains/dashboards/components/widget-controls.es.js +107 -3
  161. package/dist/domains/dashboards/components/widget-controls.es.js.map +1 -1
  162. package/dist/domains/dashboards/components/widget-error.cjs.js +1 -1
  163. package/dist/domains/dashboards/components/widget-error.es.js +1 -1
  164. package/dist/domains/dashboards/hooks/use-dashboard-environment.cjs.js +55 -0
  165. package/dist/domains/dashboards/hooks/use-dashboard-environment.cjs.js.map +1 -0
  166. package/dist/domains/dashboards/hooks/use-dashboard-environment.d.ts +1 -0
  167. package/dist/domains/dashboards/hooks/use-dashboard-environment.es.js +53 -0
  168. package/dist/domains/dashboards/hooks/use-dashboard-environment.es.js.map +1 -0
  169. package/dist/domains/dashboards/hooks/use-dashboard-requests.cjs.js +24 -0
  170. package/dist/domains/dashboards/hooks/use-dashboard-requests.cjs.js.map +1 -1
  171. package/dist/domains/dashboards/hooks/use-dashboard-requests.es.js +23 -1
  172. package/dist/domains/dashboards/hooks/use-dashboard-requests.es.js.map +1 -1
  173. package/dist/domains/dashboards/hooks/use-widget-views.cjs.js +10 -6
  174. package/dist/domains/dashboards/hooks/use-widget-views.cjs.js.map +1 -1
  175. package/dist/domains/dashboards/hooks/use-widget-views.es.js +10 -7
  176. package/dist/domains/dashboards/hooks/use-widget-views.es.js.map +1 -1
  177. package/dist/domains/dashboards/kinds/kpis/kpis-plan.cjs.js +11 -0
  178. package/dist/domains/dashboards/kinds/kpis/kpis-plan.cjs.js.map +1 -0
  179. package/dist/domains/dashboards/kinds/kpis/kpis-plan.d.ts +1 -0
  180. package/dist/domains/dashboards/kinds/kpis/kpis-plan.es.js +9 -0
  181. package/dist/domains/dashboards/kinds/kpis/kpis-plan.es.js.map +1 -0
  182. package/dist/domains/dashboards/kinds/kpis/kpis-widget.cjs.js +18 -19
  183. package/dist/domains/dashboards/kinds/kpis/kpis-widget.cjs.js.map +1 -1
  184. package/dist/domains/dashboards/kinds/kpis/kpis-widget.es.js +18 -19
  185. package/dist/domains/dashboards/kinds/kpis/kpis-widget.es.js.map +1 -1
  186. package/dist/domains/dashboards/kinds/kpis.cjs.js +3 -0
  187. package/dist/domains/dashboards/kinds/kpis.cjs.js.map +1 -1
  188. package/dist/domains/dashboards/kinds/kpis.es.js +3 -0
  189. package/dist/domains/dashboards/kinds/kpis.es.js.map +1 -1
  190. package/dist/domains/dashboards/kinds/scores/scores-plan.cjs.js +27 -0
  191. package/dist/domains/dashboards/kinds/scores/scores-plan.cjs.js.map +1 -0
  192. package/dist/domains/dashboards/kinds/scores/scores-plan.d.ts +1 -0
  193. package/dist/domains/dashboards/kinds/scores/scores-plan.es.js +24 -0
  194. package/dist/domains/dashboards/kinds/scores/scores-plan.es.js.map +1 -0
  195. package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js +25 -32
  196. package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js.map +1 -1
  197. package/dist/domains/dashboards/kinds/scores/scores-widget.es.js +26 -33
  198. package/dist/domains/dashboards/kinds/scores/scores-widget.es.js.map +1 -1
  199. package/dist/domains/dashboards/kinds/scores.cjs.js +4 -0
  200. package/dist/domains/dashboards/kinds/scores.cjs.js.map +1 -1
  201. package/dist/domains/dashboards/kinds/scores.es.js +4 -0
  202. package/dist/domains/dashboards/kinds/scores.es.js.map +1 -1
  203. package/dist/domains/dashboards/kinds/table/table-cells.cjs.js +2 -6
  204. package/dist/domains/dashboards/kinds/table/table-cells.cjs.js.map +1 -1
  205. package/dist/domains/dashboards/kinds/table/table-cells.es.js +2 -6
  206. package/dist/domains/dashboards/kinds/table/table-cells.es.js.map +1 -1
  207. package/dist/domains/dashboards/kinds/table/table-columns.cjs.js +5 -3
  208. package/dist/domains/dashboards/kinds/table/table-columns.cjs.js.map +1 -1
  209. package/dist/domains/dashboards/kinds/table/table-columns.es.js +5 -3
  210. package/dist/domains/dashboards/kinds/table/table-columns.es.js.map +1 -1
  211. package/dist/domains/dashboards/kinds/table/table-plan.cjs.js +47 -0
  212. package/dist/domains/dashboards/kinds/table/table-plan.cjs.js.map +1 -0
  213. package/dist/domains/dashboards/kinds/table/table-plan.d.ts +1 -0
  214. package/dist/domains/dashboards/kinds/table/table-plan.es.js +44 -0
  215. package/dist/domains/dashboards/kinds/table/table-plan.es.js.map +1 -0
  216. package/dist/domains/dashboards/kinds/table/table-tabs.cjs.js +20 -26
  217. package/dist/domains/dashboards/kinds/table/table-tabs.cjs.js.map +1 -1
  218. package/dist/domains/dashboards/kinds/table/table-tabs.es.js +22 -28
  219. package/dist/domains/dashboards/kinds/table/table-tabs.es.js.map +1 -1
  220. package/dist/domains/dashboards/kinds/table/table-view.cjs.js +13 -13
  221. package/dist/domains/dashboards/kinds/table/table-view.cjs.js.map +1 -1
  222. package/dist/domains/dashboards/kinds/table/table-view.es.js +14 -14
  223. package/dist/domains/dashboards/kinds/table/table-view.es.js.map +1 -1
  224. package/dist/domains/dashboards/kinds/table/table-widget.cjs.js +13 -17
  225. package/dist/domains/dashboards/kinds/table/table-widget.cjs.js.map +1 -1
  226. package/dist/domains/dashboards/kinds/table/table-widget.es.js +13 -17
  227. package/dist/domains/dashboards/kinds/table/table-widget.es.js.map +1 -1
  228. package/dist/domains/dashboards/kinds/table.cjs.js +4 -0
  229. package/dist/domains/dashboards/kinds/table.cjs.js.map +1 -1
  230. package/dist/domains/dashboards/kinds/table.es.js +4 -0
  231. package/dist/domains/dashboards/kinds/table.es.js.map +1 -1
  232. package/dist/domains/dashboards/kinds/timeseries/timeseries-plan.cjs.js +18 -0
  233. package/dist/domains/dashboards/kinds/timeseries/timeseries-plan.cjs.js.map +1 -0
  234. package/dist/domains/dashboards/kinds/timeseries/timeseries-plan.d.ts +1 -0
  235. package/dist/domains/dashboards/kinds/timeseries/timeseries-plan.es.js +16 -0
  236. package/dist/domains/dashboards/kinds/timeseries/timeseries-plan.es.js.map +1 -0
  237. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js +22 -22
  238. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js.map +1 -1
  239. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js +25 -25
  240. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js.map +1 -1
  241. package/dist/domains/dashboards/kinds/timeseries.cjs.js +3 -0
  242. package/dist/domains/dashboards/kinds/timeseries.cjs.js.map +1 -1
  243. package/dist/domains/dashboards/kinds/timeseries.es.js +3 -0
  244. package/dist/domains/dashboards/kinds/timeseries.es.js.map +1 -1
  245. package/dist/domains/dashboards/lib/alert-actions.cjs.js +123 -0
  246. package/dist/domains/dashboards/lib/alert-actions.cjs.js.map +1 -0
  247. package/dist/domains/dashboards/lib/alert-actions.d.ts +1 -0
  248. package/dist/domains/dashboards/lib/alert-actions.es.js +118 -0
  249. package/dist/domains/dashboards/lib/alert-actions.es.js.map +1 -0
  250. package/dist/domains/dashboards/lib/gate.cjs.js +62 -0
  251. package/dist/domains/dashboards/lib/gate.cjs.js.map +1 -0
  252. package/dist/domains/dashboards/lib/gate.d.ts +1 -0
  253. package/dist/domains/dashboards/lib/gate.es.js +60 -0
  254. package/dist/domains/dashboards/lib/gate.es.js.map +1 -0
  255. package/dist/domains/dashboards/lib/plan-widget.cjs.js +41 -0
  256. package/dist/domains/dashboards/lib/plan-widget.cjs.js.map +1 -0
  257. package/dist/domains/dashboards/lib/plan-widget.d.ts +1 -0
  258. package/dist/domains/dashboards/lib/plan-widget.es.js +38 -0
  259. package/dist/domains/dashboards/lib/plan-widget.es.js.map +1 -0
  260. package/dist/domains/dashboards/lib/requests.cjs.js +47 -0
  261. package/dist/domains/dashboards/lib/requests.cjs.js.map +1 -1
  262. package/dist/domains/dashboards/lib/requests.es.js +46 -1
  263. package/dist/domains/dashboards/lib/requests.es.js.map +1 -1
  264. package/dist/domains/dashboards/lib/scores.cjs.js +32 -0
  265. package/dist/domains/dashboards/lib/scores.cjs.js.map +1 -1
  266. package/dist/domains/dashboards/lib/scores.es.js +31 -1
  267. package/dist/domains/dashboards/lib/scores.es.js.map +1 -1
  268. package/dist/domains/dashboards/lib/timeseries.cjs.js +17 -0
  269. package/dist/domains/dashboards/lib/timeseries.cjs.js.map +1 -1
  270. package/dist/domains/dashboards/lib/timeseries.es.js +17 -1
  271. package/dist/domains/dashboards/lib/timeseries.es.js.map +1 -1
  272. package/dist/domains/dashboards/lib/values.cjs.js.map +1 -1
  273. package/dist/domains/dashboards/lib/values.es.js.map +1 -1
  274. package/dist/domains/dashboards/widget-kind.cjs.js.map +1 -1
  275. package/dist/domains/dashboards/widget-kind.es.js.map +1 -1
  276. package/dist/domains/dashboards.cjs.js +19 -2
  277. package/dist/domains/dashboards.es.js +9 -5
  278. package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js +186 -212
  279. package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js.map +1 -1
  280. package/dist/domains/knowledge/components/KnowledgePageDetail.es.js +188 -215
  281. package/dist/domains/knowledge/components/KnowledgePageDetail.es.js.map +1 -1
  282. package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js +620 -268
  283. package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js.map +1 -1
  284. package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js +622 -270
  285. package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js.map +1 -1
  286. package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js +544 -454
  287. package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js.map +1 -1
  288. package/dist/domains/knowledge/components/KnowledgePageGraph.es.js +548 -458
  289. package/dist/domains/knowledge/components/KnowledgePageGraph.es.js.map +1 -1
  290. package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js +21 -12
  291. package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js.map +1 -1
  292. package/dist/domains/knowledge/components/KnowledgePageTree.es.js +22 -13
  293. package/dist/domains/knowledge/components/KnowledgePageTree.es.js.map +1 -1
  294. package/dist/domains/knowledge/components/KnowledgeSourceIcon.cjs.js +16 -0
  295. package/dist/domains/knowledge/components/KnowledgeSourceIcon.cjs.js.map +1 -0
  296. package/dist/domains/knowledge/components/KnowledgeSourceIcon.d.ts +1 -0
  297. package/dist/domains/knowledge/components/KnowledgeSourceIcon.es.js +15 -0
  298. package/dist/domains/knowledge/components/KnowledgeSourceIcon.es.js.map +1 -0
  299. package/dist/domains/knowledge/components/KnowledgeTooltip.cjs.js +10 -0
  300. package/dist/domains/knowledge/components/KnowledgeTooltip.cjs.js.map +1 -0
  301. package/dist/domains/knowledge/components/KnowledgeTooltip.d.ts +1 -0
  302. package/dist/domains/knowledge/components/KnowledgeTooltip.es.js +9 -0
  303. package/dist/domains/knowledge/components/KnowledgeTooltip.es.js.map +1 -0
  304. package/dist/domains/knowledge/lib/fitViewport.cjs.js +22 -8
  305. package/dist/domains/knowledge/lib/fitViewport.cjs.js.map +1 -1
  306. package/dist/domains/knowledge/lib/fitViewport.es.js +22 -9
  307. package/dist/domains/knowledge/lib/fitViewport.es.js.map +1 -1
  308. package/dist/domains/knowledge/lib/pageAddress.cjs.js +51 -0
  309. package/dist/domains/knowledge/lib/pageAddress.cjs.js.map +1 -1
  310. package/dist/domains/knowledge/lib/pageAddress.es.js +50 -1
  311. package/dist/domains/knowledge/lib/pageAddress.es.js.map +1 -1
  312. package/dist/domains/knowledge/lib/pageRefs.cjs.js +43 -2
  313. package/dist/domains/knowledge/lib/pageRefs.cjs.js.map +1 -1
  314. package/dist/domains/knowledge/lib/pageRefs.es.js +43 -3
  315. package/dist/domains/knowledge/lib/pageRefs.es.js.map +1 -1
  316. package/dist/domains/knowledge/lib/pagesByRefContext.cjs.js +10 -0
  317. package/dist/domains/knowledge/lib/pagesByRefContext.cjs.js.map +1 -0
  318. package/dist/domains/knowledge/lib/pagesByRefContext.d.ts +1 -0
  319. package/dist/domains/knowledge/lib/pagesByRefContext.es.js +10 -0
  320. package/dist/domains/knowledge/lib/pagesByRefContext.es.js.map +1 -0
  321. package/dist/domains/logs/components/logs-saved-views.cjs.js +1 -1
  322. package/dist/domains/logs/components/logs-saved-views.es.js +1 -1
  323. package/dist/domains/logs/components/logs-toolbar.cjs.js +1 -1
  324. package/dist/domains/logs/components/logs-toolbar.es.js +1 -1
  325. package/dist/domains/mcps/components/mcp-app-tool-result.cjs.js +28 -3
  326. package/dist/domains/mcps/components/mcp-app-tool-result.cjs.js.map +1 -1
  327. package/dist/domains/mcps/components/mcp-app-tool-result.es.js +27 -2
  328. package/dist/domains/mcps/components/mcp-app-tool-result.es.js.map +1 -1
  329. package/dist/domains/mcps/components/mcp-app-viewer.cjs.js +163 -2
  330. package/dist/domains/mcps/components/mcp-app-viewer.cjs.js.map +1 -0
  331. package/dist/domains/mcps/components/mcp-app-viewer.es.js +163 -1
  332. package/dist/domains/mcps/components/mcp-app-viewer.es.js.map +1 -0
  333. package/dist/domains/mcps/context/mcp-app-host-context-value.cjs.js +11 -0
  334. package/dist/domains/mcps/context/mcp-app-host-context-value.cjs.js.map +1 -0
  335. package/dist/domains/mcps/context/mcp-app-host-context-value.d.ts +1 -0
  336. package/dist/domains/mcps/context/mcp-app-host-context-value.es.js +9 -0
  337. package/dist/domains/mcps/context/mcp-app-host-context-value.es.js.map +1 -0
  338. package/dist/domains/mcps/context/mcp-app-host-context.cjs.js +14 -0
  339. package/dist/domains/mcps/context/mcp-app-host-context.cjs.js.map +1 -0
  340. package/dist/domains/mcps/context/mcp-app-host-context.d.ts +1 -0
  341. package/dist/domains/mcps/context/mcp-app-host-context.es.js +13 -0
  342. package/dist/domains/mcps/context/mcp-app-host-context.es.js.map +1 -0
  343. package/dist/domains/mcps/hooks/use-mcp-app-tool-call.cjs.js +2 -1
  344. package/dist/domains/mcps/hooks/use-mcp-app-tool-call.cjs.js.map +1 -1
  345. package/dist/domains/mcps/hooks/use-mcp-app-tool-call.es.js +2 -1
  346. package/dist/domains/mcps/hooks/use-mcp-app-tool-call.es.js.map +1 -1
  347. package/dist/domains/mcps.cjs.js +5 -0
  348. package/dist/domains/mcps.d.ts +1 -0
  349. package/dist/domains/mcps.es.js +3 -0
  350. package/dist/domains/metrics/components/agent-runs-card.cjs.js +1 -1
  351. package/dist/domains/metrics/components/agent-runs-card.es.js +1 -1
  352. package/dist/domains/metrics/components/breakdown/breakdown-tab-body.cjs.js +1 -1
  353. package/dist/domains/metrics/components/breakdown/breakdown-tab-body.es.js +1 -1
  354. package/dist/domains/metrics/components/breakdown-card.cjs.js +1 -1
  355. package/dist/domains/metrics/components/breakdown-card.es.js +1 -1
  356. package/dist/domains/metrics/components/chart-area.cjs.js +1 -1
  357. package/dist/domains/metrics/components/chart-area.es.js +1 -1
  358. package/dist/domains/metrics/components/chart-card-error.cjs.js +1 -1
  359. package/dist/domains/metrics/components/chart-card-error.es.js +1 -1
  360. package/dist/domains/metrics/components/chart-card.cjs.js +1 -1
  361. package/dist/domains/metrics/components/chart-card.es.js +1 -1
  362. package/dist/domains/metrics/components/date-range-selector.cjs.js +1 -1
  363. package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
  364. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.cjs.js +1 -1
  365. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.es.js +1 -1
  366. package/dist/domains/metrics/components/failure-rate-card.cjs.js +1 -1
  367. package/dist/domains/metrics/components/failure-rate-card.es.js +1 -1
  368. package/dist/domains/metrics/components/latency-card.cjs.js +1 -1
  369. package/dist/domains/metrics/components/latency-card.es.js +1 -1
  370. package/dist/domains/metrics/components/metrics-time-range-chip.cjs.js +1 -1
  371. package/dist/domains/metrics/components/metrics-time-range-chip.es.js +1 -1
  372. package/dist/domains/metrics/components/token-usage-card.cjs.js +1 -1
  373. package/dist/domains/metrics/components/token-usage-card.es.js +1 -1
  374. package/dist/domains/metrics/components/trace-aggregate-card.cjs.js +1 -1
  375. package/dist/domains/metrics/components/trace-aggregate-card.es.js +1 -1
  376. package/dist/domains/metrics.cjs.js +3 -3
  377. package/dist/domains/metrics.es.js +3 -3
  378. package/dist/domains/observability/saved-views/observability-saved-views.cjs.js +1 -1
  379. package/dist/domains/observability/saved-views/observability-saved-views.es.js +1 -1
  380. package/dist/domains/observability/saved-views.cjs.js +1 -1
  381. package/dist/domains/observability/saved-views.es.js +1 -1
  382. package/dist/domains/observability.cjs.js +1 -1
  383. package/dist/domains/observability.es.js +1 -1
  384. package/dist/domains/scores/components/trace-scores-list.cjs.js +1 -1
  385. package/dist/domains/scores/components/trace-scores-list.es.js +1 -1
  386. package/dist/domains/skills/skill-simple-form.cjs.js +1 -1
  387. package/dist/domains/skills/skill-simple-form.es.js +1 -1
  388. package/dist/domains/spans/components/spans-explorer-body.cjs.js +1 -1
  389. package/dist/domains/spans/components/spans-explorer-body.es.js +1 -1
  390. package/dist/domains/spans/components/spans-filter-bar.cjs.js +2 -2
  391. package/dist/domains/spans/components/spans-filter-bar.es.js +2 -2
  392. package/dist/domains/spans/hooks/use-spans-filter-bar.cjs.js +1 -1
  393. package/dist/domains/spans/hooks/use-spans-filter-bar.es.js +1 -1
  394. package/dist/domains/threads/components/threads-explorer-body.cjs.js +1 -1
  395. package/dist/domains/threads/components/threads-explorer-body.es.js +1 -1
  396. package/dist/domains/threads/components/threads-filter-bar.cjs.js +2 -2
  397. package/dist/domains/threads/components/threads-filter-bar.es.js +2 -2
  398. package/dist/domains/threads/hooks/use-threads-filter-bar.cjs.js +1 -1
  399. package/dist/domains/threads/hooks/use-threads-filter-bar.es.js +1 -1
  400. package/dist/domains/traces/components/feedback-options.cjs.js +0 -0
  401. package/dist/domains/traces/components/feedback-options.d.ts +1 -0
  402. package/dist/domains/traces/components/feedback-options.es.js +0 -0
  403. package/dist/domains/traces/components/feedback-thread.cjs.js +8 -2
  404. package/dist/domains/traces/components/feedback-thread.cjs.js.map +1 -1
  405. package/dist/domains/traces/components/feedback-thread.es.js +8 -2
  406. package/dist/domains/traces/components/feedback-thread.es.js.map +1 -1
  407. package/dist/domains/traces/components/span-data-panel-view.cjs.js +1 -1
  408. package/dist/domains/traces/components/span-data-panel-view.es.js +1 -1
  409. package/dist/domains/traces/components/span-feedback-tab.cjs.js +8 -5
  410. package/dist/domains/traces/components/span-feedback-tab.cjs.js.map +1 -1
  411. package/dist/domains/traces/components/span-feedback-tab.es.js +8 -5
  412. package/dist/domains/traces/components/span-feedback-tab.es.js.map +1 -1
  413. package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +1 -1
  414. package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +1 -1
  415. package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +1 -1
  416. package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +1 -1
  417. package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +2 -2
  418. package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +2 -2
  419. package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +2 -2
  420. package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +2 -2
  421. package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +1 -1
  422. package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +1 -1
  423. package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +1 -1
  424. package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +1 -1
  425. package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +1 -1
  426. package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +1 -1
  427. package/dist/domains/traces/components/span-payload/span-processor-mutations.cjs.js +1 -1
  428. package/dist/domains/traces/components/span-payload/span-processor-mutations.es.js +1 -1
  429. package/dist/domains/traces/components/span-payload/span-tools-section.cjs.js +1 -1
  430. package/dist/domains/traces/components/span-payload/span-tools-section.es.js +1 -1
  431. package/dist/domains/traces/components/thread-trace/thread-trace-messages.cjs.js +2 -2
  432. package/dist/domains/traces/components/thread-trace/thread-trace-messages.es.js +2 -2
  433. package/dist/domains/traces/components/thread-trace/thread-trace-row.cjs.js +1 -1
  434. package/dist/domains/traces/components/thread-trace/thread-trace-row.es.js +1 -1
  435. package/dist/domains/traces/components/thread-view-by-trace.cjs.js +5 -3
  436. package/dist/domains/traces/components/thread-view-by-trace.cjs.js.map +1 -1
  437. package/dist/domains/traces/components/thread-view-by-trace.es.js +5 -3
  438. package/dist/domains/traces/components/thread-view-by-trace.es.js.map +1 -1
  439. package/dist/domains/traces/components/trace-columns-menu.cjs.js +1 -1
  440. package/dist/domains/traces/components/trace-columns-menu.es.js +1 -1
  441. package/dist/domains/traces/components/trace-data-panel-view.cjs.js +1 -1
  442. package/dist/domains/traces/components/trace-data-panel-view.es.js +1 -1
  443. package/dist/domains/traces/components/trace-feedback-tab.cjs.js +9 -4
  444. package/dist/domains/traces/components/trace-feedback-tab.cjs.js.map +1 -1
  445. package/dist/domains/traces/components/trace-feedback-tab.es.js +9 -4
  446. package/dist/domains/traces/components/trace-feedback-tab.es.js.map +1 -1
  447. package/dist/domains/traces/components/trace-span-panel.cjs.js +2 -1
  448. package/dist/domains/traces/components/trace-span-panel.cjs.js.map +1 -1
  449. package/dist/domains/traces/components/trace-span-panel.es.js +2 -1
  450. package/dist/domains/traces/components/trace-span-panel.es.js.map +1 -1
  451. package/dist/domains/traces/components/trace-thread-panel.cjs.js +2 -1
  452. package/dist/domains/traces/components/trace-thread-panel.cjs.js.map +1 -1
  453. package/dist/domains/traces/components/trace-thread-panel.es.js +2 -1
  454. package/dist/domains/traces/components/trace-thread-panel.es.js.map +1 -1
  455. package/dist/domains/traces/components/traces-explorer/traces-explorer-context.cjs.js.map +1 -1
  456. package/dist/domains/traces/components/traces-explorer/traces-explorer-context.es.js.map +1 -1
  457. package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.cjs.js +2 -2
  458. package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.es.js +2 -2
  459. package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.cjs.js +8 -3
  460. package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.cjs.js.map +1 -1
  461. package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.es.js +8 -3
  462. package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.es.js.map +1 -1
  463. package/dist/domains/traces/components/traces-explorer/traces-explorer-root.cjs.js +14 -1
  464. package/dist/domains/traces/components/traces-explorer/traces-explorer-root.cjs.js.map +1 -1
  465. package/dist/domains/traces/components/traces-explorer/traces-explorer-root.es.js +14 -1
  466. package/dist/domains/traces/components/traces-explorer/traces-explorer-root.es.js.map +1 -1
  467. package/dist/domains/traces/components/traces-explorer/traces-explorer-saved-views.cjs.js +1 -1
  468. package/dist/domains/traces/components/traces-explorer/traces-explorer-saved-views.es.js +1 -1
  469. package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.cjs.js +1 -1
  470. package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.es.js +1 -1
  471. package/dist/domains/traces/components/traces-explorer.cjs.js.map +1 -1
  472. package/dist/domains/traces/components/traces-explorer.es.js.map +1 -1
  473. package/dist/domains/traces/components/traces-list-mode-toggle.cjs.js +1 -1
  474. package/dist/domains/traces/components/traces-list-mode-toggle.es.js +1 -1
  475. package/dist/domains/traces/components/traces-list-view.cjs.js +1 -1
  476. package/dist/domains/traces/components/traces-list-view.es.js +1 -1
  477. package/dist/domains/traces/components/traces-spans-switch.cjs.js +1 -1
  478. package/dist/domains/traces/components/traces-spans-switch.es.js +1 -1
  479. package/dist/domains/workflows/components/workflow-layout.cjs.js +1 -1
  480. package/dist/domains/workflows/components/workflow-layout.es.js +1 -1
  481. package/dist/domains/workflows/components/workflow-step-detail.cjs.js +2 -2
  482. package/dist/domains/workflows/components/workflow-step-detail.es.js +2 -2
  483. package/dist/domains/workflows/workflow/data/workflow-data-button.cjs.js +1 -1
  484. package/dist/domains/workflows/workflow/data/workflow-data-button.es.js +1 -1
  485. package/dist/domains/workflows/workflow/use-workflow-graph-runtime.cjs.js +1 -1
  486. package/dist/domains/workflows/workflow/use-workflow-graph-runtime.es.js +1 -1
  487. package/dist/domains/workflows/workflow/utils.cjs.js +1 -1
  488. package/dist/domains/workflows/workflow/utils.es.js +1 -1
  489. package/dist/domains/workflows/workflow/workflow-body-graph.cjs.js +1 -1
  490. package/dist/domains/workflows/workflow/workflow-body-graph.es.js +1 -1
  491. package/dist/domains/workflows/workflow/workflow-data-edge.cjs.js +1 -1
  492. package/dist/domains/workflows/workflow/workflow-data-edge.es.js +1 -1
  493. package/dist/domains/workflows/workflow/workflow-debug-step-controls.cjs.js +1 -1
  494. package/dist/domains/workflows/workflow/workflow-debug-step-controls.es.js +1 -1
  495. package/dist/domains/workflows/workflow/workflow-graph-inner.cjs.js +2 -2
  496. package/dist/domains/workflows/workflow/workflow-graph-inner.es.js +2 -2
  497. package/dist/domains/workflows/workflow/workflow-graph-layout.cjs.js +1 -1
  498. package/dist/domains/workflows/workflow/workflow-graph-layout.es.js +1 -1
  499. package/dist/domains/workflows/workflow/workflow-graph-node.cjs.js +1 -1
  500. package/dist/domains/workflows/workflow/workflow-graph-node.es.js +1 -1
  501. package/dist/domains/workflows/workflow/workflow-graph.cjs.js +1 -1
  502. package/dist/domains/workflows/workflow/workflow-graph.es.js +1 -1
  503. package/dist/domains/workflows/workflow/workflow-map-config-dialog.cjs.js +1 -1
  504. package/dist/domains/workflows/workflow/workflow-map-config-dialog.es.js +1 -1
  505. package/dist/domains/workflows/workflow/workflow-nested-graph.cjs.js +1 -1
  506. package/dist/domains/workflows/workflow/workflow-nested-graph.es.js +1 -1
  507. package/dist/domains/workflows/workflow/workflow-run-data.cjs.js +2 -2
  508. package/dist/domains/workflows/workflow/workflow-run-data.es.js +2 -2
  509. package/dist/domains/workflows/workflow/workflow-step-action-bar.cjs.js +1 -1
  510. package/dist/domains/workflows/workflow/workflow-step-action-bar.es.js +1 -1
  511. package/dist/domains/workflows/workflow/workflow-step-node-utils.cjs.js +1 -1
  512. package/dist/domains/workflows/workflow/workflow-step-node-utils.es.js +1 -1
  513. package/dist/domains/workspace/components/workspace-add-skill-dialog.cjs.js +1 -1
  514. package/dist/domains/workspace/components/workspace-add-skill-dialog.es.js +1 -1
  515. package/dist/domains/workspace/components/workspace-markdown-preview.cjs.js +1 -1
  516. package/dist/domains/workspace/components/workspace-markdown-preview.es.js +1 -1
  517. package/dist/domains/workspace/components/workspace-tree.cjs.js +1 -1
  518. package/dist/domains/workspace/components/workspace-tree.es.js +1 -1
  519. package/dist/{dropdown-menu-Dx-jCOIv.cjs → dropdown-menu-D3D8USIY.cjs} +9 -1
  520. package/dist/dropdown-menu-D3D8USIY.cjs.map +1 -0
  521. package/dist/{dropdown-menu-DKoWI8kD.js → dropdown-menu-jsf9D-J_.js} +9 -1
  522. package/dist/dropdown-menu-jsf9D-J_.js.map +1 -0
  523. package/dist/ee/signals/sankey-signals.cjs.js +1 -1
  524. package/dist/ee/signals/sankey-signals.es.js +1 -1
  525. package/dist/ee/signals/view-mode-tab.cjs.js +1 -1
  526. package/dist/ee/signals/view-mode-tab.es.js +1 -1
  527. package/dist/{filter-bar-time-range-DlVNjw43.cjs → filter-bar-time-range-CEgdThCy.cjs} +2 -2
  528. package/dist/{filter-bar-time-range-DlVNjw43.cjs.map → filter-bar-time-range-CEgdThCy.cjs.map} +1 -1
  529. package/dist/{filter-bar-time-range-D9SnzR2J.js → filter-bar-time-range-CHSMbpPd.js} +2 -2
  530. package/dist/{filter-bar-time-range-D9SnzR2J.js.map → filter-bar-time-range-CHSMbpPd.js.map} +1 -1
  531. package/dist/icons/ConfluenceIcon.cjs.js +18 -0
  532. package/dist/icons/ConfluenceIcon.cjs.js.map +1 -0
  533. package/dist/icons/ConfluenceIcon.d.ts +1 -0
  534. package/dist/icons/ConfluenceIcon.es.js +15 -0
  535. package/dist/icons/ConfluenceIcon.es.js.map +1 -0
  536. package/dist/icons/NotionIcon.cjs.js +18 -0
  537. package/dist/icons/NotionIcon.cjs.js.map +1 -0
  538. package/dist/icons/NotionIcon.d.ts +1 -0
  539. package/dist/icons/NotionIcon.es.js +15 -0
  540. package/dist/icons/NotionIcon.es.js.map +1 -0
  541. package/dist/icons/ZendeskIcon.cjs.js +18 -0
  542. package/dist/icons/ZendeskIcon.cjs.js.map +1 -0
  543. package/dist/icons/ZendeskIcon.d.ts +1 -0
  544. package/dist/icons/ZendeskIcon.es.js +15 -0
  545. package/dist/icons/ZendeskIcon.es.js.map +1 -0
  546. package/dist/layout/tabbed-container.cjs.js +1 -1
  547. package/dist/layout/tabbed-container.es.js +1 -1
  548. package/dist/{observability-saved-views-DgABvgat.cjs → observability-saved-views-UM8HBJ6J.cjs} +2 -2
  549. package/dist/{observability-saved-views-DgABvgat.cjs.map → observability-saved-views-UM8HBJ6J.cjs.map} +1 -1
  550. package/dist/{observability-saved-views-Ch53fh5_.js → observability-saved-views-lLWk1w0g.js} +2 -2
  551. package/dist/{observability-saved-views-Ch53fh5_.js.map → observability-saved-views-lLWk1w0g.js.map} +1 -1
  552. package/dist/{property-filter-applied-DoxQHG09.js → property-filter-applied-BBVmWRsC.js} +2 -2
  553. package/dist/{property-filter-applied-DoxQHG09.js.map → property-filter-applied-BBVmWRsC.js.map} +1 -1
  554. package/dist/{property-filter-applied-DuyL4S_K.cjs → property-filter-applied-iYDdM1hb.cjs} +2 -2
  555. package/dist/{property-filter-applied-DuyL4S_K.cjs.map → property-filter-applied-iYDdM1hb.cjs.map} +1 -1
  556. package/dist/{span-payload-primitives-D2NWznGy.cjs → span-payload-primitives-CL3hlirm.cjs} +3 -3
  557. package/dist/{span-payload-primitives-D2NWznGy.cjs.map → span-payload-primitives-CL3hlirm.cjs.map} +1 -1
  558. package/dist/{span-payload-primitives-BKkRpVVO.js → span-payload-primitives-KxqoXspn.js} +3 -3
  559. package/dist/{span-payload-primitives-BKkRpVVO.js.map → span-payload-primitives-KxqoXspn.js.map} +1 -1
  560. package/dist/src/domains/dashboards/components/connected-widget.d.ts +9 -0
  561. package/dist/src/domains/dashboards/components/dashboard-renderer.d.ts +9 -2
  562. package/dist/src/domains/dashboards/components/stateless-widget.d.ts +40 -0
  563. package/dist/src/domains/dashboards/components/view-gate.d.ts +2 -10
  564. package/dist/src/domains/dashboards/components/widget-controls.d.ts +25 -1
  565. package/dist/src/domains/dashboards/hooks/use-dashboard-environment.d.ts +8 -0
  566. package/dist/src/domains/dashboards/hooks/use-dashboard-requests.d.ts +11 -1
  567. package/dist/src/domains/dashboards/hooks/use-widget-views.d.ts +8 -2
  568. package/dist/src/domains/dashboards/index.d.ts +14 -6
  569. package/dist/src/domains/dashboards/kinds/kpis/kpis-plan.d.ts +355 -0
  570. package/dist/src/domains/dashboards/kinds/kpis/kpis-widget.d.ts +1 -1
  571. package/dist/src/domains/dashboards/kinds/scores/scores-plan.d.ts +358 -0
  572. package/dist/src/domains/dashboards/kinds/scores/scores-widget.d.ts +1 -1
  573. package/dist/src/domains/dashboards/kinds/table/table-cells.d.ts +6 -2
  574. package/dist/src/domains/dashboards/kinds/table/table-columns.d.ts +2 -1
  575. package/dist/src/domains/dashboards/kinds/table/table-plan.d.ts +18 -0
  576. package/dist/src/domains/dashboards/kinds/table/table-tabs.d.ts +1 -1
  577. package/dist/src/domains/dashboards/kinds/table/table-view.d.ts +1 -0
  578. package/dist/src/domains/dashboards/kinds/timeseries/timeseries-plan.d.ts +355 -0
  579. package/dist/src/domains/dashboards/lib/alert-actions.d.ts +36 -0
  580. package/dist/src/domains/dashboards/lib/gate.d.ts +65 -0
  581. package/dist/src/domains/dashboards/lib/plan-widget.d.ts +390 -0
  582. package/dist/src/domains/dashboards/lib/requests.d.ts +22 -0
  583. package/dist/src/domains/dashboards/lib/scores.d.ts +11 -1
  584. package/dist/src/domains/dashboards/lib/timeseries.d.ts +6 -1
  585. package/dist/src/domains/dashboards/lib/values.d.ts +5 -0
  586. package/dist/src/domains/dashboards/widget-kind.d.ts +105 -2
  587. package/dist/src/domains/knowledge/components/KnowledgePageDetail.d.ts +7 -1
  588. package/dist/src/domains/knowledge/components/KnowledgePageExplorer.d.ts +4 -1
  589. package/dist/src/domains/knowledge/components/KnowledgePageGraph.d.ts +3 -0
  590. package/dist/src/domains/knowledge/components/KnowledgeSourceIcon.d.ts +5 -0
  591. package/dist/src/domains/knowledge/components/KnowledgeTooltip.d.ts +5 -0
  592. package/dist/src/domains/knowledge/lib/fitViewport.d.ts +9 -2
  593. package/dist/src/domains/knowledge/lib/pageAddress.d.ts +10 -0
  594. package/dist/src/domains/knowledge/lib/pageRefs.d.ts +12 -1
  595. package/dist/src/domains/knowledge/lib/pagesByRefContext.d.ts +6 -0
  596. package/dist/src/domains/mcps/components/mcp-app-tool-result.d.ts +3 -1
  597. package/dist/src/domains/mcps/components/mcp-app-viewer.d.ts +6 -1
  598. package/dist/src/domains/mcps/context/mcp-app-host-context-value.d.ts +23 -0
  599. package/dist/src/domains/mcps/context/mcp-app-host-context.d.ts +7 -0
  600. package/dist/src/domains/mcps/index.d.ts +3 -0
  601. package/dist/src/domains/traces/components/feedback-options.d.ts +8 -0
  602. package/dist/src/domains/traces/components/feedback-thread.d.ts +2 -1
  603. package/dist/src/domains/traces/components/span-feedback-tab.d.ts +4 -2
  604. package/dist/src/domains/traces/components/thread-view-by-trace.d.ts +4 -1
  605. package/dist/src/domains/traces/components/trace-feedback-tab.d.ts +4 -2
  606. package/dist/src/domains/traces/components/trace-span-panel.d.ts +3 -1
  607. package/dist/src/domains/traces/components/trace-thread-panel.d.ts +3 -1
  608. package/dist/src/domains/traces/components/traces-explorer/index.d.ts +1 -0
  609. package/dist/src/domains/traces/components/traces-explorer/traces-explorer-context.d.ts +2 -0
  610. package/dist/src/domains/traces/components/traces-explorer/traces-explorer-root.d.ts +4 -1
  611. package/dist/src/ds/components/Breadcrumb/Breadcrumb.d.ts +2 -0
  612. package/dist/src/ds/components/DropdownMenu/dropdown-menu.d.ts +3 -0
  613. package/dist/src/ds/components/Tree/tree-label.d.ts +1 -1
  614. package/dist/src/ds/icons/ConfluenceIcon.d.ts +2 -0
  615. package/dist/src/ds/icons/NotionIcon.d.ts +2 -0
  616. package/dist/src/ds/icons/ZendeskIcon.d.ts +2 -0
  617. package/dist/src/ds/icons/index.d.ts +3 -0
  618. package/dist/src/utils/mcp-app-context.d.ts +6 -0
  619. package/dist/style.css +79 -35
  620. package/dist/{tabbed-container-DOkHshha.js → tabbed-container-9yvqEQON.js} +3 -3
  621. package/dist/{tabbed-container-DOkHshha.js.map → tabbed-container-9yvqEQON.js.map} +1 -1
  622. package/dist/{tabbed-container-Bhfi-DWr.cjs → tabbed-container-Bmk5dgJ4.cjs} +3 -3
  623. package/dist/{tabbed-container-Bhfi-DWr.cjs.map → tabbed-container-Bmk5dgJ4.cjs.map} +1 -1
  624. package/dist/{tabs-content-DwU_eA-a.js → tabs-content-BGkPZ5EQ.js} +2 -2
  625. package/dist/{tabs-content-DwU_eA-a.js.map → tabs-content-BGkPZ5EQ.js.map} +1 -1
  626. package/dist/{tabs-content-BACwMrMG.cjs → tabs-content-D_ic2ZqI.cjs} +2 -2
  627. package/dist/{tabs-content-BACwMrMG.cjs.map → tabs-content-D_ic2ZqI.cjs.map} +1 -1
  628. package/dist/{tabs-tab-BHs639jL.js → tabs-tab-CJVS0WED.js} +2 -2
  629. package/dist/{tabs-tab-BHs639jL.js.map → tabs-tab-CJVS0WED.js.map} +1 -1
  630. package/dist/{tabs-tab-CANh2eAD.cjs → tabs-tab-Dj2huH5T.cjs} +2 -2
  631. package/dist/{tabs-tab-CANh2eAD.cjs.map → tabs-tab-Dj2huH5T.cjs.map} +1 -1
  632. package/dist/{tool-approval-CguPaikn.cjs → tool-approval-C4WNL8VD.cjs} +3 -3
  633. package/dist/{tool-approval-CguPaikn.cjs.map → tool-approval-C4WNL8VD.cjs.map} +1 -1
  634. package/dist/{tool-approval-Cjz0yAzw.js → tool-approval-ZfL3-Vvi.js} +3 -3
  635. package/dist/{tool-approval-Cjz0yAzw.js.map → tool-approval-ZfL3-Vvi.js.map} +1 -1
  636. package/dist/{tool-call-ChJKYCfu.js → tool-call-BLzYTI-x.js} +2 -2
  637. package/dist/{tool-call-ChJKYCfu.js.map → tool-call-BLzYTI-x.js.map} +1 -1
  638. package/dist/{tool-call-BqDI9mrY.cjs → tool-call-C4TBpJ6Y.cjs} +2 -2
  639. package/dist/{tool-call-BqDI9mrY.cjs.map → tool-call-C4TBpJ6Y.cjs.map} +1 -1
  640. package/dist/{tool-card-GSiCfxMz.js → tool-card-BjOV2sXi.js} +3 -2
  641. package/dist/{tool-card-GSiCfxMz.js.map → tool-card-BjOV2sXi.js.map} +1 -1
  642. package/dist/{tool-card-Dg4VOYV6.cjs → tool-card-CO_3C_Bn.cjs} +3 -2
  643. package/dist/{tool-card-Dg4VOYV6.cjs.map → tool-card-CO_3C_Bn.cjs.map} +1 -1
  644. package/dist/{mcp-app-viewer-BV7FI498.js → types-BwdKiX24.js} +2 -144
  645. package/dist/types-BwdKiX24.js.map +1 -0
  646. package/dist/{mcp-app-viewer-M3-pqAlo.cjs → types-KjLUPShK.cjs} +8 -144
  647. package/dist/types-KjLUPShK.cjs.map +1 -0
  648. package/dist/{use-workflow-graph-runtime-B3VUuhUE.js → use-workflow-graph-runtime-B_dKpjUe.js} +2 -2
  649. package/dist/{use-workflow-graph-runtime-B3VUuhUE.js.map → use-workflow-graph-runtime-B_dKpjUe.js.map} +1 -1
  650. package/dist/{use-workflow-graph-runtime-BfCL6nd4.cjs → use-workflow-graph-runtime-D_PpEIQ5.cjs} +2 -2
  651. package/dist/{use-workflow-graph-runtime-BfCL6nd4.cjs.map → use-workflow-graph-runtime-D_PpEIQ5.cjs.map} +1 -1
  652. package/dist/utils/mcp-app-context.cjs.js +17 -0
  653. package/dist/utils/mcp-app-context.cjs.js.map +1 -0
  654. package/dist/utils/mcp-app-context.d.ts +1 -0
  655. package/dist/utils/mcp-app-context.es.js +15 -0
  656. package/dist/utils/mcp-app-context.es.js.map +1 -0
  657. package/package.json +6 -6
  658. package/dist/MetricsCard-DojbLiEx.cjs.map +0 -1
  659. package/dist/MetricsCard-kAqSCPPe.js.map +0 -1
  660. package/dist/Tree-Caz4FTCU.cjs.map +0 -1
  661. package/dist/Tree-od43gLMO.js.map +0 -1
  662. package/dist/domains/dashboards/hooks/use-scorers.cjs.js +0 -41
  663. package/dist/domains/dashboards/hooks/use-scorers.cjs.js.map +0 -1
  664. package/dist/domains/dashboards/hooks/use-scorers.d.ts +0 -1
  665. package/dist/domains/dashboards/hooks/use-scorers.es.js +0 -40
  666. package/dist/domains/dashboards/hooks/use-scorers.es.js.map +0 -1
  667. package/dist/dropdown-menu-DKoWI8kD.js.map +0 -1
  668. package/dist/dropdown-menu-Dx-jCOIv.cjs.map +0 -1
  669. package/dist/mcp-app-viewer-BV7FI498.js.map +0 -1
  670. package/dist/mcp-app-viewer-M3-pqAlo.cjs.map +0 -1
  671. package/dist/src/domains/dashboards/hooks/use-scorers.d.ts +0 -66
@@ -6,7 +6,7 @@ import { iconSizeClasses } from "../icons/icon-size-classes.es.js";
6
6
  import { t as cn } from "../utils-DQx8TpNT.js";
7
7
  import { o as buttonVariants, t as Button } from "../Button-Bi7aXd_G.js";
8
8
  import { t as ContextMenu } from "../context-menu-6_Kcs8kj.js";
9
- import { t as DropdownMenu } from "../dropdown-menu-DKoWI8kD.js";
9
+ import { t as DropdownMenu } from "../dropdown-menu-jsf9D-J_.js";
10
10
  import { HoverCard, HoverCardContent, HoverCardTrigger } from "./HoverCard.es.js";
11
11
  import { Icon } from "../icons/Icon.es.js";
12
12
  import { controlHeight } from "../primitives/control-size.es.js";
@@ -18,7 +18,7 @@ const require_primitives_resize_handle_indicator = require("../primitives/resize
18
18
  const require_Dialog = require("../Dialog-Duy3M1ny.cjs");
19
19
  const require_select = require("../select-CeukeSn_.cjs");
20
20
  const require_context_menu = require("../context-menu-DwB7u7fB.cjs");
21
- const require_dropdown_menu = require("../dropdown-menu-Dx-jCOIv.cjs");
21
+ const require_dropdown_menu = require("../dropdown-menu-D3D8USIY.cjs");
22
22
  const require_hooks_use_local_storage_state = require("../hooks/use-local-storage-state.cjs.js");
23
23
  let react = require("react");
24
24
  react = require_rolldown_runtime.__toESM(react, 1);
@@ -17,7 +17,7 @@ import { ResizeHandleIndicator } from "../primitives/resize-handle-indicator.es.
17
17
  import { a as DialogContent, c as DialogHeader, d as DialogTitle, n as DialogBody, o as DialogDescription, t as Dialog } from "../Dialog-OBPu3rl2.js";
18
18
  import { i as SelectItem, n as SelectContent, o as SelectTrigger, s as SelectValue, t as Select } from "../select-dNX9If-s.js";
19
19
  import { t as ContextMenu } from "../context-menu-6_Kcs8kj.js";
20
- import { t as DropdownMenu } from "../dropdown-menu-DKoWI8kD.js";
20
+ import { t as DropdownMenu } from "../dropdown-menu-jsf9D-J_.js";
21
21
  import { useLocalStorageState } from "../hooks/use-local-storage-state.es.js";
22
22
  import React, { Fragment, forwardRef, useCallback, useEffect, useId, useRef, useState } from "react";
23
23
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_tabs_tab = require("../tabs-tab-CANh2eAD.cjs");
3
- const require_tabs_content = require("../tabs-content-BACwMrMG.cjs");
2
+ const require_tabs_tab = require("../tabs-tab-Dj2huH5T.cjs");
3
+ const require_tabs_content = require("../tabs-content-D_ic2ZqI.cjs");
4
4
  exports.Tab = require_tabs_tab.Tab;
5
5
  exports.TabContent = require_tabs_content.TabContent;
6
6
  exports.TabList = require_tabs_tab.TabList;
@@ -1,3 +1,3 @@
1
- import { n as Tabs, r as TabList, t as Tab } from "../tabs-tab-BHs639jL.js";
2
- import { t as TabContent } from "../tabs-content-DwU_eA-a.js";
1
+ import { n as Tabs, r as TabList, t as Tab } from "../tabs-tab-CJVS0WED.js";
2
+ import { t as TabContent } from "../tabs-content-BGkPZ5EQ.js";
3
3
  export { Tab, TabContent, TabList, Tabs };
@@ -7,6 +7,7 @@ const require_primitives_raised_surface = require("../primitives/raised-surface.
7
7
  const require_primitives_transitions = require("../primitives/transitions.cjs.js");
8
8
  const require_hooks_use_measured_auto_height = require("../hooks/use-measured-auto-height.cjs.js");
9
9
  const require_utils = require("../utils-uDc1ofX1.cjs");
10
+ const require_utils_mcp_app_context = require("../utils/mcp-app-context.cjs.js");
10
11
  let react = require("react");
11
12
  react = require_rolldown_runtime.__toESM(react, 1);
12
13
  let react_jsx_runtime = require("react/jsx-runtime");
@@ -311,6 +312,7 @@ var normalizeSummary = (value, fallback) => {
311
312
  };
312
313
  var getTextFromParts = (message) => message.content.parts.flatMap((part) => {
313
314
  if (!isRecord(part) || part.type !== "text" || typeof part.text !== "string") return [];
315
+ if (require_utils_mcp_app_context.isMcpAppContextText(part.text)) return [];
314
316
  return [part.text];
315
317
  }).join("\n");
316
318
  var getStringField = (part, keys) => {
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadRail.cjs.js","names":["React","useOptionalMessageScroller","useOptionalMessageScrollerVisibility","cn","ScrollArea","ScrollAreaViewport","focusRing","useMeasuredAutoHeight","overlaySurfaceStyle","Txt","FileText"],"sources":["../../src/ds/components/ThreadRail/thread-rail.tsx","../../src/ds/components/ThreadRail/thread-rail-turns.ts","../../src/ds/components/ThreadRail/turn-groups.ts"],"sourcesContent":["import { FileText } from 'lucide-react';\nimport * as React from 'react';\n\nimport type { ThreadRailTurn } from './thread-rail-turns';\n\nimport { useOptionalMessageScroller, useOptionalMessageScrollerVisibility } from '@/ds/components/MessageScroller';\nimport { ScrollArea, ScrollAreaViewport } from '@/ds/components/ScrollArea';\nimport { Txt } from '@/ds/components/Txt';\nimport { overlaySurfaceStyle } from '@/ds/primitives/raised-surface';\nimport { focusRing } from '@/ds/primitives/transitions';\nimport { useMeasuredAutoHeight } from '@/hooks/use-measured-auto-height';\nimport { cn } from '@/lib/utils';\n\ntype ThreadRailPreviewPhase = 'hidden' | 'entering' | 'visible' | 'exiting';\n\ntype ThreadRailPreviewState = {\n currentTurn: ThreadRailTurn | undefined;\n previousTurn: ThreadRailTurn | undefined;\n index: number | null;\n phase: ThreadRailPreviewPhase;\n top: number;\n transitionKey: number;\n};\n\nconst PREVIEW_TRANSITION_DURATION_MS = 360;\nconst PREVIEW_CLEANUP_DELAY_MS = PREVIEW_TRANSITION_DURATION_MS + 80;\n\nconst DEFAULT_PREVIEW_STATE: ThreadRailPreviewState = {\n currentTurn: undefined,\n previousTurn: undefined,\n index: null,\n phase: 'hidden',\n top: 0,\n transitionKey: 0,\n};\n\nexport interface ThreadRailProps {\n turns: ThreadRailTurn[];\n currentAnchorId?: string;\n visibleMessageIds?: string[];\n label?: string;\n className?: string;\n maxHeight?: string;\n scrollAreaClassName?: string;\n onSelect?: (turn: ThreadRailTurn) => void;\n}\n\nexport function ThreadRail({\n turns,\n currentAnchorId,\n visibleMessageIds,\n label = 'Conversation timeline',\n className,\n maxHeight = 'calc(100dvh - 12rem)',\n scrollAreaClassName,\n onSelect,\n}: ThreadRailProps) {\n const railRef = React.useRef<HTMLElement>(null);\n const previewId = React.useId();\n const [previewState, setPreviewState] = React.useState<ThreadRailPreviewState>(DEFAULT_PREVIEW_STATE);\n const messageScroller = useOptionalMessageScroller();\n const scrollerVisibility = useOptionalMessageScrollerVisibility();\n\n const fallbackMessageId = turns.at(-1)?.messageId;\n const activeMessageId = currentAnchorId ?? scrollerVisibility?.currentAnchorId ?? fallbackMessageId;\n const resolvedVisibleMessageIds =\n visibleMessageIds ?? scrollerVisibility?.visibleMessageIds ?? (activeMessageId ? [activeMessageId] : []);\n const visibleMessageIdSet = new Set(resolvedVisibleMessageIds);\n const previewHoverActive = previewState.phase === 'entering' || previewState.phase === 'visible';\n const hoveredIndex = previewHoverActive ? previewState.index : null;\n const selectTurn = React.useCallback(\n (turn: ThreadRailTurn) => {\n if (onSelect) {\n onSelect(turn);\n return;\n }\n\n messageScroller?.scrollToMessage(turn.messageId, { behavior: 'smooth', align: 'start' });\n },\n [messageScroller, onSelect],\n );\n\n const showPreview = React.useCallback(\n (index: number, element: HTMLElement) => {\n const railTop = railRef.current?.getBoundingClientRect().top ?? 0;\n const itemRect = element.getBoundingClientRect();\n const nextTurn = turns[index];\n if (!nextTurn) return;\n\n setPreviewState(current => {\n const nextTop = itemRect.top + itemRect.height / 2 - railTop;\n if (current.index === index && current.phase !== 'hidden' && current.phase !== 'exiting') {\n return { ...current, top: nextTop };\n }\n\n const previousTurn =\n current.currentTurn && current.currentTurn.key !== nextTurn.key && current.phase !== 'hidden'\n ? current.currentTurn\n : undefined;\n\n return {\n currentTurn: nextTurn,\n previousTurn,\n index,\n phase: 'entering',\n top: nextTop,\n transitionKey: current.transitionKey + 1,\n };\n });\n },\n [turns],\n );\n\n const hidePreview = () => {\n setPreviewState(current => {\n if (!current.currentTurn || current.phase === 'hidden' || current.phase === 'exiting') {\n return { ...current, index: null };\n }\n\n return {\n ...current,\n index: null,\n previousTurn: undefined,\n phase: 'exiting',\n transitionKey: current.transitionKey + 1,\n };\n });\n };\n\n React.useEffect(() => {\n if (previewState.phase !== 'entering') return;\n\n const requestFrame = window.requestAnimationFrame ?? window.setTimeout;\n const cancelFrame = window.cancelAnimationFrame ?? window.clearTimeout;\n let settleFrame: number | undefined;\n const startFrame = requestFrame(() => {\n settleFrame = requestFrame(() => {\n setPreviewState(current =>\n current.transitionKey === previewState.transitionKey && current.phase === 'entering'\n ? { ...current, phase: 'visible' }\n : current,\n );\n });\n });\n\n return () => {\n cancelFrame(startFrame);\n if (settleFrame !== undefined) cancelFrame(settleFrame);\n };\n }, [previewState.phase, previewState.transitionKey]);\n\n React.useEffect(() => {\n if (previewState.phase !== 'visible' || !previewState.previousTurn) return;\n\n const timeout = window.setTimeout(() => {\n setPreviewState(current =>\n current.transitionKey === previewState.transitionKey ? { ...current, previousTurn: undefined } : current,\n );\n }, PREVIEW_CLEANUP_DELAY_MS);\n\n return () => window.clearTimeout(timeout);\n }, [previewState.phase, previewState.previousTurn, previewState.transitionKey]);\n\n React.useEffect(() => {\n if (previewState.phase !== 'exiting') return;\n\n const timeout = window.setTimeout(() => {\n setPreviewState(current =>\n current.transitionKey === previewState.transitionKey ? DEFAULT_PREVIEW_STATE : current,\n );\n }, PREVIEW_CLEANUP_DELAY_MS);\n\n return () => window.clearTimeout(timeout);\n }, [previewState.phase, previewState.transitionKey]);\n\n if (turns.length === 0) return null;\n\n return (\n <nav\n ref={railRef}\n aria-label={label}\n data-testid=\"thread-rail\"\n className={cn('relative w-8 py-2', className)}\n onMouseLeave={hidePreview}\n onBlur={event => {\n const nextFocus = event.relatedTarget;\n if (!(nextFocus instanceof Node) || !event.currentTarget.contains(nextFocus)) hidePreview();\n }}\n >\n <ScrollArea\n data-testid=\"thread-rail-scroll-area\"\n maxHeight={maxHeight}\n className={cn('w-8', scrollAreaClassName)}\n >\n <ScrollAreaViewport className=\"pr-3\">\n <div className=\"flex w-4 flex-col items-start gap-2 py-2\">\n {turns.map((turn, index) => {\n const distance = hoveredIndex === null ? null : Math.abs(index - hoveredIndex);\n const active = turn.messageId === activeMessageId;\n const inView = visibleMessageIdSet.has(turn.messageId);\n const previewActive = hoveredIndex === index;\n\n return (\n <ThreadRailItem\n key={turn.key}\n turn={turn}\n index={index}\n distance={distance}\n active={active}\n inView={inView}\n previewId={previewActive ? previewId : undefined}\n onHoverChange={showPreview}\n onSelect={selectTurn}\n />\n );\n })}\n </div>\n </ScrollAreaViewport>\n </ScrollArea>\n\n {previewState.currentTurn && (\n <ThreadRailPreview\n id={previewId}\n currentTurn={previewState.currentTurn}\n previousTurn={previewState.previousTurn}\n phase={previewState.phase}\n top={previewState.top}\n />\n )}\n </nav>\n );\n}\n\ninterface ThreadRailItemProps {\n turn: ThreadRailTurn;\n index: number;\n distance: number | null;\n active: boolean;\n inView: boolean;\n previewId?: string;\n onHoverChange: (index: number, element: HTMLElement) => void;\n onSelect: (turn: ThreadRailTurn) => void;\n}\n\n/** Width of a rail tick: widest at the hovered item, tapering to neighbours. */\nconst getRailItemWidth = (distance: number | null): string => {\n if (distance === 0) return 'w-4';\n if (distance === 1) return 'w-3';\n return 'w-2';\n};\n\n/** Background tone of a rail tick, prioritising hovered/active, then in-view, then proximity. */\nconst getRailItemTone = ({\n distance,\n active,\n inView,\n}: Pick<ThreadRailItemProps, 'distance' | 'active' | 'inView'>): string => {\n if (distance === 0 || active) return 'bg-foreground';\n if (inView) return 'bg-foreground/85';\n if (distance === 1) return 'bg-foreground/70';\n return 'bg-foreground/40';\n};\n\nconst ThreadRailItem = React.memo(function ThreadRailItem({\n turn,\n index,\n distance,\n active,\n inView,\n previewId,\n onHoverChange,\n onSelect,\n}: ThreadRailItemProps) {\n const size = getRailItemWidth(distance);\n const tone = getRailItemTone({ distance, active, inView });\n\n return (\n <div\n data-in-view={inView ? 'true' : undefined}\n data-active={active ? 'true' : undefined}\n className=\"group/thread-rail-item relative flex items-center\"\n >\n <button\n type=\"button\"\n aria-label={`Jump to ${turn.prompt}`}\n aria-current={active ? 'location' : undefined}\n aria-describedby={previewId}\n data-in-view={inView ? 'true' : undefined}\n data-active={active ? 'true' : undefined}\n onClick={() => onSelect(turn)}\n onMouseEnter={event => onHoverChange(index, event.currentTarget)}\n onFocus={event => onHoverChange(index, event.currentTarget)}\n className={cn(\n 'relative block h-px cursor-pointer rounded-full transition-[width,background-color] duration-normal ease-out',\n \"before:absolute before:inset-x-0 before:-inset-y-1 before:content-['']\",\n focusRing,\n size,\n tone,\n )}\n />\n </div>\n );\n});\n\nfunction ThreadRailPreview({\n id,\n currentTurn,\n previousTurn,\n phase,\n top,\n}: {\n id: string;\n currentTurn: ThreadRailTurn;\n previousTurn: ThreadRailTurn | undefined;\n phase: ThreadRailPreviewPhase;\n top: number;\n}) {\n const {\n ref: previewSizerRef,\n heightStyle: previewHeightStyle,\n measure: measurePreviewHeight,\n } = useMeasuredAutoHeight();\n const containerVisible = phase === 'visible' || (phase === 'entering' && Boolean(previousTurn));\n // Entering and exiting share the same off-screen resting style.\n const hiddenLayerClassName = 'scale-95 opacity-0 blur-xs';\n const visibleLayerClassName = 'scale-100 opacity-100 blur-none';\n const layerClassName =\n 'absolute inset-x-0 top-0 h-full origin-left transition-[opacity,filter,scale] duration-150 ease-in-out will-change-[opacity,filter,scale] motion-reduce:scale-100 motion-reduce:blur-none motion-reduce:transition-none';\n\n React.useLayoutEffect(() => {\n measurePreviewHeight();\n }, [currentTurn.key, phase, measurePreviewHeight]);\n\n return (\n <div\n id={id}\n data-testid=\"thread-rail-preview\"\n data-visible={containerVisible ? 'true' : undefined}\n className={cn(\n 'pointer-events-none absolute top-0 left-full z-30 ml-3 w-72 overflow-hidden rounded-xl text-left transition-[height,translate,opacity] duration-360 ease-out-custom will-change-[height,translate,opacity] motion-reduce:transition-none',\n overlaySurfaceStyle,\n containerVisible ? 'opacity-100' : 'opacity-0',\n )}\n style={{ ...previewHeightStyle, translate: `0 calc(${top}px - 50%)` }}\n >\n <div ref={previewSizerRef} data-testid=\"thread-rail-preview-sizer\" aria-hidden className=\"invisible\">\n <ThreadRailPreviewContent turn={currentTurn} className=\"p-3.5\" />\n </div>\n <div data-testid=\"thread-rail-preview-viewport\" className=\"absolute inset-0\">\n <div className=\"relative h-full\">\n {previousTurn && (\n <div\n key={previousTurn.key}\n data-testid=\"thread-rail-preview-previous\"\n aria-hidden\n className={cn(layerClassName, phase === 'entering' ? visibleLayerClassName : hiddenLayerClassName)}\n >\n <ThreadRailPreviewContent turn={previousTurn} className=\"p-3.5\" />\n </div>\n )}\n <div\n key={currentTurn.key}\n data-testid=\"thread-rail-preview-current\"\n className={cn(layerClassName, phase === 'visible' ? visibleLayerClassName : hiddenLayerClassName)}\n >\n <ThreadRailPreviewContent turn={currentTurn} className=\"p-3.5\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ThreadRailPreviewContent({\n turn,\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement> & { turn: ThreadRailTurn }) {\n return (\n <div className={className} {...props}>\n <div className=\"truncate text-subheading text-foreground\">{turn.prompt}</div>\n {turn.reply && (\n <Txt variant=\"caption\" tone=\"muted\" className=\"mt-1.5 line-clamp-3\">\n {turn.reply}\n </Txt>\n )}\n {(turn.files.length > 0 || turn.hiddenFileCount > 0) && (\n <div className=\"mt-3 flex flex-wrap items-center gap-2 border-t border-border pt-2.5\">\n {turn.files.map(file => (\n <Txt\n as=\"span\"\n variant=\"caption\"\n tone=\"muted\"\n key={file}\n className=\"inline-flex max-w-44 items-center gap-1.5 truncate\"\n >\n <FileText className=\"size-3.5 shrink-0 opacity-70\" aria-hidden />\n {file}\n </Txt>\n ))}\n {turn.hiddenFileCount > 0 && (\n <Txt as=\"span\" variant=\"column\" tone=\"muted\">\n +{turn.hiddenFileCount}\n </Txt>\n )}\n </div>\n )}\n </div>\n );\n}\n","import type { MastraDBMessage } from '@mastra/core/agent/message-list';\nimport type { MastraDBMessageMetadata } from '@mastra/react';\n\nconst SUMMARY_MAX_LENGTH = 120;\nconst FILE_PREVIEW_LIMIT = 2;\n// Inlined, not imported: the value export sits behind a barrel this browser bundle must not pull.\nconst CLIENT_MESSAGE_ID_KEY = 'clientMessageId' satisfies keyof MastraDBMessageMetadata;\n\nexport interface ThreadRailTurn {\n key: string;\n messageId: string;\n prompt: string;\n reply?: string;\n files: string[];\n hiddenFileCount: number;\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nexport const getClientMessageKey = (message: MastraDBMessage): string => {\n const metadata = message.content.metadata;\n const clientMessageId = isRecord(metadata) ? metadata[CLIENT_MESSAGE_ID_KEY] : undefined;\n return typeof clientMessageId === 'string' && clientMessageId.length > 0 ? clientMessageId : message.id;\n};\n\nconst normalizeSummary = (value: string, fallback: string): string => {\n const normalized = value.replace(/\\s+/g, ' ').trim();\n if (normalized.length === 0) return fallback;\n if (normalized.length <= SUMMARY_MAX_LENGTH) return normalized;\n return `${normalized.slice(0, SUMMARY_MAX_LENGTH - 3).trimEnd()}...`;\n};\n\nconst getTextFromParts = (message: MastraDBMessage): string =>\n message.content.parts\n .flatMap(part => {\n if (!isRecord(part) || part.type !== 'text' || typeof part.text !== 'string') return [];\n return [part.text];\n })\n .join('\\n');\n\nconst getStringField = (part: Record<string, unknown>, keys: string[]): string | undefined => {\n for (const key of keys) {\n const value = part[key];\n if (typeof value === 'string' && value.trim().length > 0) return value;\n }\n return undefined;\n};\n\nconst getPathLabel = (value: string): string | undefined => {\n if (value.startsWith('data:')) return undefined;\n\n try {\n const url = new URL(value);\n const candidate = url.pathname.split('/').filter(Boolean).pop();\n return candidate || url.hostname || undefined;\n } catch {\n const candidate = value.split(/[?#]/)[0]?.split('/').filter(Boolean).pop();\n return candidate && !candidate.startsWith('data:') ? candidate : undefined;\n }\n};\n\nconst getFallbackFileLabel = (part: Record<string, unknown>): string => {\n const mediaType = getStringField(part, ['mimeType', 'mediaType']) ?? '';\n if (part.type === 'image' || mediaType.startsWith('image/')) return 'Image';\n if (mediaType === 'application/pdf') return 'PDF';\n if (mediaType.startsWith('video/')) return 'Video';\n if (mediaType.startsWith('audio/')) return 'Audio';\n return 'File';\n};\n\nconst getFileLabelFromPart = (part: MastraDBMessage['content']['parts'][number]): string | undefined => {\n if (!isRecord(part)) return undefined;\n\n const type = getStringField(part, ['type']);\n if (type !== 'file' && type !== 'image') return undefined;\n\n const explicitLabel = getStringField(part, ['filename', 'name']);\n if (explicitLabel) return explicitLabel;\n\n const source = getStringField(part, ['url', 'image', 'data']);\n const pathLabel = source ? getPathLabel(source) : undefined;\n return pathLabel ?? getFallbackFileLabel(part);\n};\n\nconst getFileLabels = (message: MastraDBMessage): string[] =>\n message.content.parts.map(getFileLabelFromPart).filter((label): label is string => Boolean(label));\n\nconst getSignalType = (message: MastraDBMessage): string | undefined => {\n const signal = message.content.metadata?.signal;\n const metadataType = isRecord(signal) ? signal.type : undefined;\n return typeof metadataType === 'string' ? metadataType : message.type;\n};\n\n/** What opens a turn: a rail stop, and the row the scroller parks at the top. */\nexport const startsUserTurn = (message: MastraDBMessage): boolean => {\n if (message.role === 'user') return true;\n if (message.role !== 'signal') return false;\n\n const signalType = getSignalType(message);\n return signalType === 'user' || signalType === 'user-message';\n};\n\nconst getNextAssistantReply = (messages: MastraDBMessage[], startIndex: number): string | undefined => {\n for (let index = startIndex + 1; index < messages.length; index += 1) {\n const message = messages[index];\n if (!message) continue;\n if (startsUserTurn(message)) return undefined;\n if (message.role !== 'assistant') continue;\n\n const reply = normalizeSummary(getTextFromParts(message), '');\n if (reply) return reply;\n }\n\n return undefined;\n};\n\nexport const buildThreadRailTurns = (messages: MastraDBMessage[]): ThreadRailTurn[] =>\n messages.flatMap((message, index) => {\n if (!startsUserTurn(message)) return [];\n\n const files = getFileLabels(message);\n const visibleFiles = files.slice(0, FILE_PREVIEW_LIMIT);\n\n return [\n {\n key: getClientMessageKey(message),\n messageId: message.id,\n prompt: normalizeSummary(getTextFromParts(message), files.length > 0 ? 'Attached file' : 'User message'),\n reply: getNextAssistantReply(messages, index),\n files: visibleFiles,\n hiddenFileCount: files.length - visibleFiles.length,\n },\n ];\n });\n","/** A user's turn and everything the run produced under it. */\nexport interface TurnGroup<T> {\n key: string;\n entries: T[];\n /** Opened by a user message, so it reserves room and anchors the scroll. */\n opensTurn: boolean;\n}\n\nexport interface TurnRules<T> {\n key: (entry: T) => string;\n opensTurn: (entry: T) => boolean;\n /** A marker that belongs above the turn it introduces but arrives after the previous one, so it moves down. */\n introduces?: (entry: T) => boolean;\n}\n\nconst introducesNothing = () => false;\n\n/**\n * Cuts a timeline where the reader's attention moves: a user message starts a turn,\n * and everything the run answers with belongs to it. Entries before the first opener\n * form a turn of their own that opens nothing.\n */\nexport function groupTurns<T>(entries: T[], { key, opensTurn, introduces = introducesNothing }: TurnRules<T>) {\n const groups: TurnGroup<T>[] = [];\n\n for (const entry of entries) {\n const opens = opensTurn(entry);\n const previous = groups.at(-1);\n if (!opens && previous) {\n previous.entries.push(entry);\n continue;\n }\n const last = previous?.entries.at(-1);\n const introduction = previous && last !== undefined && introduces(last) ? previous.entries.splice(-1) : [];\n if (previous?.entries.length === 0) groups.pop();\n groups.push({ key: key(entry), entries: [...introduction, entry], opensTurn: opens });\n }\n\n return groups;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ThreadRail.cjs.js","names":["React","useOptionalMessageScroller","useOptionalMessageScrollerVisibility","cn","ScrollArea","ScrollAreaViewport","focusRing","useMeasuredAutoHeight","overlaySurfaceStyle","Txt","FileText","isMcpAppContextText"],"sources":["../../src/ds/components/ThreadRail/thread-rail.tsx","../../src/ds/components/ThreadRail/thread-rail-turns.ts","../../src/ds/components/ThreadRail/turn-groups.ts"],"sourcesContent":["import { FileText } from 'lucide-react';\nimport * as React from 'react';\n\nimport type { ThreadRailTurn } from './thread-rail-turns';\n\nimport { useOptionalMessageScroller, useOptionalMessageScrollerVisibility } from '@/ds/components/MessageScroller';\nimport { ScrollArea, ScrollAreaViewport } from '@/ds/components/ScrollArea';\nimport { Txt } from '@/ds/components/Txt';\nimport { overlaySurfaceStyle } from '@/ds/primitives/raised-surface';\nimport { focusRing } from '@/ds/primitives/transitions';\nimport { useMeasuredAutoHeight } from '@/hooks/use-measured-auto-height';\nimport { cn } from '@/lib/utils';\n\ntype ThreadRailPreviewPhase = 'hidden' | 'entering' | 'visible' | 'exiting';\n\ntype ThreadRailPreviewState = {\n currentTurn: ThreadRailTurn | undefined;\n previousTurn: ThreadRailTurn | undefined;\n index: number | null;\n phase: ThreadRailPreviewPhase;\n top: number;\n transitionKey: number;\n};\n\nconst PREVIEW_TRANSITION_DURATION_MS = 360;\nconst PREVIEW_CLEANUP_DELAY_MS = PREVIEW_TRANSITION_DURATION_MS + 80;\n\nconst DEFAULT_PREVIEW_STATE: ThreadRailPreviewState = {\n currentTurn: undefined,\n previousTurn: undefined,\n index: null,\n phase: 'hidden',\n top: 0,\n transitionKey: 0,\n};\n\nexport interface ThreadRailProps {\n turns: ThreadRailTurn[];\n currentAnchorId?: string;\n visibleMessageIds?: string[];\n label?: string;\n className?: string;\n maxHeight?: string;\n scrollAreaClassName?: string;\n onSelect?: (turn: ThreadRailTurn) => void;\n}\n\nexport function ThreadRail({\n turns,\n currentAnchorId,\n visibleMessageIds,\n label = 'Conversation timeline',\n className,\n maxHeight = 'calc(100dvh - 12rem)',\n scrollAreaClassName,\n onSelect,\n}: ThreadRailProps) {\n const railRef = React.useRef<HTMLElement>(null);\n const previewId = React.useId();\n const [previewState, setPreviewState] = React.useState<ThreadRailPreviewState>(DEFAULT_PREVIEW_STATE);\n const messageScroller = useOptionalMessageScroller();\n const scrollerVisibility = useOptionalMessageScrollerVisibility();\n\n const fallbackMessageId = turns.at(-1)?.messageId;\n const activeMessageId = currentAnchorId ?? scrollerVisibility?.currentAnchorId ?? fallbackMessageId;\n const resolvedVisibleMessageIds =\n visibleMessageIds ?? scrollerVisibility?.visibleMessageIds ?? (activeMessageId ? [activeMessageId] : []);\n const visibleMessageIdSet = new Set(resolvedVisibleMessageIds);\n const previewHoverActive = previewState.phase === 'entering' || previewState.phase === 'visible';\n const hoveredIndex = previewHoverActive ? previewState.index : null;\n const selectTurn = React.useCallback(\n (turn: ThreadRailTurn) => {\n if (onSelect) {\n onSelect(turn);\n return;\n }\n\n messageScroller?.scrollToMessage(turn.messageId, { behavior: 'smooth', align: 'start' });\n },\n [messageScroller, onSelect],\n );\n\n const showPreview = React.useCallback(\n (index: number, element: HTMLElement) => {\n const railTop = railRef.current?.getBoundingClientRect().top ?? 0;\n const itemRect = element.getBoundingClientRect();\n const nextTurn = turns[index];\n if (!nextTurn) return;\n\n setPreviewState(current => {\n const nextTop = itemRect.top + itemRect.height / 2 - railTop;\n if (current.index === index && current.phase !== 'hidden' && current.phase !== 'exiting') {\n return { ...current, top: nextTop };\n }\n\n const previousTurn =\n current.currentTurn && current.currentTurn.key !== nextTurn.key && current.phase !== 'hidden'\n ? current.currentTurn\n : undefined;\n\n return {\n currentTurn: nextTurn,\n previousTurn,\n index,\n phase: 'entering',\n top: nextTop,\n transitionKey: current.transitionKey + 1,\n };\n });\n },\n [turns],\n );\n\n const hidePreview = () => {\n setPreviewState(current => {\n if (!current.currentTurn || current.phase === 'hidden' || current.phase === 'exiting') {\n return { ...current, index: null };\n }\n\n return {\n ...current,\n index: null,\n previousTurn: undefined,\n phase: 'exiting',\n transitionKey: current.transitionKey + 1,\n };\n });\n };\n\n React.useEffect(() => {\n if (previewState.phase !== 'entering') return;\n\n const requestFrame = window.requestAnimationFrame ?? window.setTimeout;\n const cancelFrame = window.cancelAnimationFrame ?? window.clearTimeout;\n let settleFrame: number | undefined;\n const startFrame = requestFrame(() => {\n settleFrame = requestFrame(() => {\n setPreviewState(current =>\n current.transitionKey === previewState.transitionKey && current.phase === 'entering'\n ? { ...current, phase: 'visible' }\n : current,\n );\n });\n });\n\n return () => {\n cancelFrame(startFrame);\n if (settleFrame !== undefined) cancelFrame(settleFrame);\n };\n }, [previewState.phase, previewState.transitionKey]);\n\n React.useEffect(() => {\n if (previewState.phase !== 'visible' || !previewState.previousTurn) return;\n\n const timeout = window.setTimeout(() => {\n setPreviewState(current =>\n current.transitionKey === previewState.transitionKey ? { ...current, previousTurn: undefined } : current,\n );\n }, PREVIEW_CLEANUP_DELAY_MS);\n\n return () => window.clearTimeout(timeout);\n }, [previewState.phase, previewState.previousTurn, previewState.transitionKey]);\n\n React.useEffect(() => {\n if (previewState.phase !== 'exiting') return;\n\n const timeout = window.setTimeout(() => {\n setPreviewState(current =>\n current.transitionKey === previewState.transitionKey ? DEFAULT_PREVIEW_STATE : current,\n );\n }, PREVIEW_CLEANUP_DELAY_MS);\n\n return () => window.clearTimeout(timeout);\n }, [previewState.phase, previewState.transitionKey]);\n\n if (turns.length === 0) return null;\n\n return (\n <nav\n ref={railRef}\n aria-label={label}\n data-testid=\"thread-rail\"\n className={cn('relative w-8 py-2', className)}\n onMouseLeave={hidePreview}\n onBlur={event => {\n const nextFocus = event.relatedTarget;\n if (!(nextFocus instanceof Node) || !event.currentTarget.contains(nextFocus)) hidePreview();\n }}\n >\n <ScrollArea\n data-testid=\"thread-rail-scroll-area\"\n maxHeight={maxHeight}\n className={cn('w-8', scrollAreaClassName)}\n >\n <ScrollAreaViewport className=\"pr-3\">\n <div className=\"flex w-4 flex-col items-start gap-2 py-2\">\n {turns.map((turn, index) => {\n const distance = hoveredIndex === null ? null : Math.abs(index - hoveredIndex);\n const active = turn.messageId === activeMessageId;\n const inView = visibleMessageIdSet.has(turn.messageId);\n const previewActive = hoveredIndex === index;\n\n return (\n <ThreadRailItem\n key={turn.key}\n turn={turn}\n index={index}\n distance={distance}\n active={active}\n inView={inView}\n previewId={previewActive ? previewId : undefined}\n onHoverChange={showPreview}\n onSelect={selectTurn}\n />\n );\n })}\n </div>\n </ScrollAreaViewport>\n </ScrollArea>\n\n {previewState.currentTurn && (\n <ThreadRailPreview\n id={previewId}\n currentTurn={previewState.currentTurn}\n previousTurn={previewState.previousTurn}\n phase={previewState.phase}\n top={previewState.top}\n />\n )}\n </nav>\n );\n}\n\ninterface ThreadRailItemProps {\n turn: ThreadRailTurn;\n index: number;\n distance: number | null;\n active: boolean;\n inView: boolean;\n previewId?: string;\n onHoverChange: (index: number, element: HTMLElement) => void;\n onSelect: (turn: ThreadRailTurn) => void;\n}\n\n/** Width of a rail tick: widest at the hovered item, tapering to neighbours. */\nconst getRailItemWidth = (distance: number | null): string => {\n if (distance === 0) return 'w-4';\n if (distance === 1) return 'w-3';\n return 'w-2';\n};\n\n/** Background tone of a rail tick, prioritising hovered/active, then in-view, then proximity. */\nconst getRailItemTone = ({\n distance,\n active,\n inView,\n}: Pick<ThreadRailItemProps, 'distance' | 'active' | 'inView'>): string => {\n if (distance === 0 || active) return 'bg-foreground';\n if (inView) return 'bg-foreground/85';\n if (distance === 1) return 'bg-foreground/70';\n return 'bg-foreground/40';\n};\n\nconst ThreadRailItem = React.memo(function ThreadRailItem({\n turn,\n index,\n distance,\n active,\n inView,\n previewId,\n onHoverChange,\n onSelect,\n}: ThreadRailItemProps) {\n const size = getRailItemWidth(distance);\n const tone = getRailItemTone({ distance, active, inView });\n\n return (\n <div\n data-in-view={inView ? 'true' : undefined}\n data-active={active ? 'true' : undefined}\n className=\"group/thread-rail-item relative flex items-center\"\n >\n <button\n type=\"button\"\n aria-label={`Jump to ${turn.prompt}`}\n aria-current={active ? 'location' : undefined}\n aria-describedby={previewId}\n data-in-view={inView ? 'true' : undefined}\n data-active={active ? 'true' : undefined}\n onClick={() => onSelect(turn)}\n onMouseEnter={event => onHoverChange(index, event.currentTarget)}\n onFocus={event => onHoverChange(index, event.currentTarget)}\n className={cn(\n 'relative block h-px cursor-pointer rounded-full transition-[width,background-color] duration-normal ease-out',\n \"before:absolute before:inset-x-0 before:-inset-y-1 before:content-['']\",\n focusRing,\n size,\n tone,\n )}\n />\n </div>\n );\n});\n\nfunction ThreadRailPreview({\n id,\n currentTurn,\n previousTurn,\n phase,\n top,\n}: {\n id: string;\n currentTurn: ThreadRailTurn;\n previousTurn: ThreadRailTurn | undefined;\n phase: ThreadRailPreviewPhase;\n top: number;\n}) {\n const {\n ref: previewSizerRef,\n heightStyle: previewHeightStyle,\n measure: measurePreviewHeight,\n } = useMeasuredAutoHeight();\n const containerVisible = phase === 'visible' || (phase === 'entering' && Boolean(previousTurn));\n // Entering and exiting share the same off-screen resting style.\n const hiddenLayerClassName = 'scale-95 opacity-0 blur-xs';\n const visibleLayerClassName = 'scale-100 opacity-100 blur-none';\n const layerClassName =\n 'absolute inset-x-0 top-0 h-full origin-left transition-[opacity,filter,scale] duration-150 ease-in-out will-change-[opacity,filter,scale] motion-reduce:scale-100 motion-reduce:blur-none motion-reduce:transition-none';\n\n React.useLayoutEffect(() => {\n measurePreviewHeight();\n }, [currentTurn.key, phase, measurePreviewHeight]);\n\n return (\n <div\n id={id}\n data-testid=\"thread-rail-preview\"\n data-visible={containerVisible ? 'true' : undefined}\n className={cn(\n 'pointer-events-none absolute top-0 left-full z-30 ml-3 w-72 overflow-hidden rounded-xl text-left transition-[height,translate,opacity] duration-360 ease-out-custom will-change-[height,translate,opacity] motion-reduce:transition-none',\n overlaySurfaceStyle,\n containerVisible ? 'opacity-100' : 'opacity-0',\n )}\n style={{ ...previewHeightStyle, translate: `0 calc(${top}px - 50%)` }}\n >\n <div ref={previewSizerRef} data-testid=\"thread-rail-preview-sizer\" aria-hidden className=\"invisible\">\n <ThreadRailPreviewContent turn={currentTurn} className=\"p-3.5\" />\n </div>\n <div data-testid=\"thread-rail-preview-viewport\" className=\"absolute inset-0\">\n <div className=\"relative h-full\">\n {previousTurn && (\n <div\n key={previousTurn.key}\n data-testid=\"thread-rail-preview-previous\"\n aria-hidden\n className={cn(layerClassName, phase === 'entering' ? visibleLayerClassName : hiddenLayerClassName)}\n >\n <ThreadRailPreviewContent turn={previousTurn} className=\"p-3.5\" />\n </div>\n )}\n <div\n key={currentTurn.key}\n data-testid=\"thread-rail-preview-current\"\n className={cn(layerClassName, phase === 'visible' ? visibleLayerClassName : hiddenLayerClassName)}\n >\n <ThreadRailPreviewContent turn={currentTurn} className=\"p-3.5\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ThreadRailPreviewContent({\n turn,\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement> & { turn: ThreadRailTurn }) {\n return (\n <div className={className} {...props}>\n <div className=\"truncate text-subheading text-foreground\">{turn.prompt}</div>\n {turn.reply && (\n <Txt variant=\"caption\" tone=\"muted\" className=\"mt-1.5 line-clamp-3\">\n {turn.reply}\n </Txt>\n )}\n {(turn.files.length > 0 || turn.hiddenFileCount > 0) && (\n <div className=\"mt-3 flex flex-wrap items-center gap-2 border-t border-border pt-2.5\">\n {turn.files.map(file => (\n <Txt\n as=\"span\"\n variant=\"caption\"\n tone=\"muted\"\n key={file}\n className=\"inline-flex max-w-44 items-center gap-1.5 truncate\"\n >\n <FileText className=\"size-3.5 shrink-0 opacity-70\" aria-hidden />\n {file}\n </Txt>\n ))}\n {turn.hiddenFileCount > 0 && (\n <Txt as=\"span\" variant=\"column\" tone=\"muted\">\n +{turn.hiddenFileCount}\n </Txt>\n )}\n </div>\n )}\n </div>\n );\n}\n","import type { MastraDBMessage } from '@mastra/core/agent/message-list';\nimport type { MastraDBMessageMetadata } from '@mastra/react';\n\nimport { isMcpAppContextText } from '@/utils/mcp-app-context';\n\nconst SUMMARY_MAX_LENGTH = 120;\nconst FILE_PREVIEW_LIMIT = 2;\n// Inlined, not imported: the value export sits behind a barrel this browser bundle must not pull.\nconst CLIENT_MESSAGE_ID_KEY = 'clientMessageId' satisfies keyof MastraDBMessageMetadata;\n\nexport interface ThreadRailTurn {\n key: string;\n messageId: string;\n prompt: string;\n reply?: string;\n files: string[];\n hiddenFileCount: number;\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nexport const getClientMessageKey = (message: MastraDBMessage): string => {\n const metadata = message.content.metadata;\n const clientMessageId = isRecord(metadata) ? metadata[CLIENT_MESSAGE_ID_KEY] : undefined;\n return typeof clientMessageId === 'string' && clientMessageId.length > 0 ? clientMessageId : message.id;\n};\n\nconst normalizeSummary = (value: string, fallback: string): string => {\n const normalized = value.replace(/\\s+/g, ' ').trim();\n if (normalized.length === 0) return fallback;\n if (normalized.length <= SUMMARY_MAX_LENGTH) return normalized;\n return `${normalized.slice(0, SUMMARY_MAX_LENGTH - 3).trimEnd()}...`;\n};\n\nconst getTextFromParts = (message: MastraDBMessage): string =>\n message.content.parts\n .flatMap(part => {\n if (!isRecord(part) || part.type !== 'text' || typeof part.text !== 'string') return [];\n if (isMcpAppContextText(part.text)) return [];\n return [part.text];\n })\n .join('\\n');\n\nconst getStringField = (part: Record<string, unknown>, keys: string[]): string | undefined => {\n for (const key of keys) {\n const value = part[key];\n if (typeof value === 'string' && value.trim().length > 0) return value;\n }\n return undefined;\n};\n\nconst getPathLabel = (value: string): string | undefined => {\n if (value.startsWith('data:')) return undefined;\n\n try {\n const url = new URL(value);\n const candidate = url.pathname.split('/').filter(Boolean).pop();\n return candidate || url.hostname || undefined;\n } catch {\n const candidate = value.split(/[?#]/)[0]?.split('/').filter(Boolean).pop();\n return candidate && !candidate.startsWith('data:') ? candidate : undefined;\n }\n};\n\nconst getFallbackFileLabel = (part: Record<string, unknown>): string => {\n const mediaType = getStringField(part, ['mimeType', 'mediaType']) ?? '';\n if (part.type === 'image' || mediaType.startsWith('image/')) return 'Image';\n if (mediaType === 'application/pdf') return 'PDF';\n if (mediaType.startsWith('video/')) return 'Video';\n if (mediaType.startsWith('audio/')) return 'Audio';\n return 'File';\n};\n\nconst getFileLabelFromPart = (part: MastraDBMessage['content']['parts'][number]): string | undefined => {\n if (!isRecord(part)) return undefined;\n\n const type = getStringField(part, ['type']);\n if (type !== 'file' && type !== 'image') return undefined;\n\n const explicitLabel = getStringField(part, ['filename', 'name']);\n if (explicitLabel) return explicitLabel;\n\n const source = getStringField(part, ['url', 'image', 'data']);\n const pathLabel = source ? getPathLabel(source) : undefined;\n return pathLabel ?? getFallbackFileLabel(part);\n};\n\nconst getFileLabels = (message: MastraDBMessage): string[] =>\n message.content.parts.map(getFileLabelFromPart).filter((label): label is string => Boolean(label));\n\nconst getSignalType = (message: MastraDBMessage): string | undefined => {\n const signal = message.content.metadata?.signal;\n const metadataType = isRecord(signal) ? signal.type : undefined;\n return typeof metadataType === 'string' ? metadataType : message.type;\n};\n\n/** What opens a turn: a rail stop, and the row the scroller parks at the top. */\nexport const startsUserTurn = (message: MastraDBMessage): boolean => {\n if (message.role === 'user') return true;\n if (message.role !== 'signal') return false;\n\n const signalType = getSignalType(message);\n return signalType === 'user' || signalType === 'user-message';\n};\n\nconst getNextAssistantReply = (messages: MastraDBMessage[], startIndex: number): string | undefined => {\n for (let index = startIndex + 1; index < messages.length; index += 1) {\n const message = messages[index];\n if (!message) continue;\n if (startsUserTurn(message)) return undefined;\n if (message.role !== 'assistant') continue;\n\n const reply = normalizeSummary(getTextFromParts(message), '');\n if (reply) return reply;\n }\n\n return undefined;\n};\n\nexport const buildThreadRailTurns = (messages: MastraDBMessage[]): ThreadRailTurn[] =>\n messages.flatMap((message, index) => {\n if (!startsUserTurn(message)) return [];\n\n const files = getFileLabels(message);\n const visibleFiles = files.slice(0, FILE_PREVIEW_LIMIT);\n\n return [\n {\n key: getClientMessageKey(message),\n messageId: message.id,\n prompt: normalizeSummary(getTextFromParts(message), files.length > 0 ? 'Attached file' : 'User message'),\n reply: getNextAssistantReply(messages, index),\n files: visibleFiles,\n hiddenFileCount: files.length - visibleFiles.length,\n },\n ];\n });\n","/** A user's turn and everything the run produced under it. */\nexport interface TurnGroup<T> {\n key: string;\n entries: T[];\n /** Opened by a user message, so it reserves room and anchors the scroll. */\n opensTurn: boolean;\n}\n\nexport interface TurnRules<T> {\n key: (entry: T) => string;\n opensTurn: (entry: T) => boolean;\n /** A marker that belongs above the turn it introduces but arrives after the previous one, so it moves down. */\n introduces?: (entry: T) => boolean;\n}\n\nconst introducesNothing = () => false;\n\n/**\n * Cuts a timeline where the reader's attention moves: a user message starts a turn,\n * and everything the run answers with belongs to it. Entries before the first opener\n * form a turn of their own that opens nothing.\n */\nexport function groupTurns<T>(entries: T[], { key, opensTurn, introduces = introducesNothing }: TurnRules<T>) {\n const groups: TurnGroup<T>[] = [];\n\n for (const entry of entries) {\n const opens = opensTurn(entry);\n const previous = groups.at(-1);\n if (!opens && previous) {\n previous.entries.push(entry);\n continue;\n }\n const last = previous?.entries.at(-1);\n const introduction = previous && last !== undefined && introduces(last) ? previous.entries.splice(-1) : [];\n if (previous?.entries.length === 0) groups.pop();\n groups.push({ key: key(entry), entries: [...introduction, entry], opensTurn: opens });\n }\n\n return groups;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAyBA,IAAM,2BAA2B;AAEjC,IAAM,wBAAgD;CACpD,aAAa,KAAA;CACb,cAAc,KAAA;CACd,OAAO;CACP,OAAO;CACP,KAAK;CACL,eAAe;AACjB;AAaA,SAAgB,WAAW,EACzB,OACA,iBACA,mBACA,QAAQ,yBACR,WACA,YAAY,wBACZ,qBACA,YACkB;CAClB,MAAM,UAAUA,MAAM,OAAoB,IAAI;CAC9C,MAAM,YAAYA,MAAM,MAAM;CAC9B,MAAM,CAAC,cAAc,mBAAmBA,MAAM,SAAiC,qBAAqB;CACpG,MAAM,kBAAkBC,wBAAAA,2BAA2B;CACnD,MAAM,qBAAqBC,wBAAAA,qCAAqC;CAEhE,MAAM,oBAAoB,MAAM,GAAG,EAAE,CAAC,EAAE;CACxC,MAAM,kBAAkB,mBAAmB,oBAAoB,mBAAmB;CAClF,MAAM,4BACJ,qBAAqB,oBAAoB,sBAAsB,kBAAkB,CAAC,eAAe,IAAI,CAAC;CACxG,MAAM,sBAAsB,IAAI,IAAI,yBAAyB;CAE7D,MAAM,eADqB,aAAa,UAAU,cAAc,aAAa,UAAU,YAC7C,aAAa,QAAQ;CAC/D,MAAM,aAAaF,MAAM,aACtB,SAAyB;EACxB,IAAI,UAAU;GACZ,SAAS,IAAI;GACb;EACF;EAEA,iBAAiB,gBAAgB,KAAK,WAAW;GAAE,UAAU;GAAU,OAAO;EAAQ,CAAC;CACzF,GACA,CAAC,iBAAiB,QAAQ,CAC5B;CAEA,MAAM,cAAcA,MAAM,aACvB,OAAe,YAAyB;EACvC,MAAM,UAAU,QAAQ,SAAS,sBAAsB,CAAC,CAAC,OAAO;EAChE,MAAM,WAAW,QAAQ,sBAAsB;EAC/C,MAAM,WAAW,MAAM;EACvB,IAAI,CAAC,UAAU;EAEf,iBAAgB,YAAW;GACzB,MAAM,UAAU,SAAS,MAAM,SAAS,SAAS,IAAI;GACrD,IAAI,QAAQ,UAAU,SAAS,QAAQ,UAAU,YAAY,QAAQ,UAAU,WAC7E,OAAO;IAAE,GAAG;IAAS,KAAK;GAAQ;GAGpC,MAAM,eACJ,QAAQ,eAAe,QAAQ,YAAY,QAAQ,SAAS,OAAO,QAAQ,UAAU,WACjF,QAAQ,cACR,KAAA;GAEN,OAAO;IACL,aAAa;IACb;IACA;IACA,OAAO;IACP,KAAK;IACL,eAAe,QAAQ,gBAAgB;GACzC;EACF,CAAC;CACH,GACA,CAAC,KAAK,CACR;CAEA,MAAM,oBAAoB;EACxB,iBAAgB,YAAW;GACzB,IAAI,CAAC,QAAQ,eAAe,QAAQ,UAAU,YAAY,QAAQ,UAAU,WAC1E,OAAO;IAAE,GAAG;IAAS,OAAO;GAAK;GAGnC,OAAO;IACL,GAAG;IACH,OAAO;IACP,cAAc,KAAA;IACd,OAAO;IACP,eAAe,QAAQ,gBAAgB;GACzC;EACF,CAAC;CACH;CAEA,MAAM,gBAAgB;EACpB,IAAI,aAAa,UAAU,YAAY;EAEvC,MAAM,eAAe,OAAO,yBAAyB,OAAO;EAC5D,MAAM,cAAc,OAAO,wBAAwB,OAAO;EAC1D,IAAI;EACJ,MAAM,aAAa,mBAAmB;GACpC,cAAc,mBAAmB;IAC/B,iBAAgB,YACd,QAAQ,kBAAkB,aAAa,iBAAiB,QAAQ,UAAU,aACtE;KAAE,GAAG;KAAS,OAAO;IAAU,IAC/B,OACN;GACF,CAAC;EACH,CAAC;EAED,aAAa;GACX,YAAY,UAAU;GACtB,IAAI,gBAAgB,KAAA,GAAW,YAAY,WAAW;EACxD;CACF,GAAG,CAAC,aAAa,OAAO,aAAa,aAAa,CAAC;CAEnD,MAAM,gBAAgB;EACpB,IAAI,aAAa,UAAU,aAAa,CAAC,aAAa,cAAc;EAEpE,MAAM,UAAU,OAAO,iBAAiB;GACtC,iBAAgB,YACd,QAAQ,kBAAkB,aAAa,gBAAgB;IAAE,GAAG;IAAS,cAAc,KAAA;GAAU,IAAI,OACnG;EACF,GAAG,wBAAwB;EAE3B,aAAa,OAAO,aAAa,OAAO;CAC1C,GAAG;EAAC,aAAa;EAAO,aAAa;EAAc,aAAa;CAAa,CAAC;CAE9E,MAAM,gBAAgB;EACpB,IAAI,aAAa,UAAU,WAAW;EAEtC,MAAM,UAAU,OAAO,iBAAiB;GACtC,iBAAgB,YACd,QAAQ,kBAAkB,aAAa,gBAAgB,wBAAwB,OACjF;EACF,GAAG,wBAAwB;EAE3B,aAAa,OAAO,aAAa,OAAO;CAC1C,GAAG,CAAC,aAAa,OAAO,aAAa,aAAa,CAAC;CAEnD,IAAI,MAAM,WAAW,GAAG,OAAO;CAE/B,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EACE,KAAK;EACL,cAAY;EACZ,eAAY;EACZ,WAAWG,cAAAA,GAAG,qBAAqB,SAAS;EAC5C,cAAc;EACd,SAAQ,UAAS;GACf,MAAM,YAAY,MAAM;GACxB,IAAI,EAAE,qBAAqB,SAAS,CAAC,MAAM,cAAc,SAAS,SAAS,GAAG,YAAY;EAC5F;EATF,UAAA,CAWE,iBAAA,GAAA,kBAAA,IAAA,CAACC,oBAAAA,YAAD;GACE,eAAY;GACD;GACX,WAAWD,cAAAA,GAAG,OAAO,mBAAmB;GAExC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACE,oBAAAA,oBAAD;IAAoB,WAAU;IAC5B,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,WAAU;KACZ,UAAA,MAAM,KAAK,MAAM,UAAU;MAC1B,MAAM,WAAW,iBAAiB,OAAO,OAAO,KAAK,IAAI,QAAQ,YAAY;MAC7E,MAAM,SAAS,KAAK,cAAc;MAClC,MAAM,SAAS,oBAAoB,IAAI,KAAK,SAAS;MAGrD,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD;OAEQ;OACC;OACG;OACF;OACA;OACR,WAVkB,iBAAiB,QAUR,YAAY,KAAA;OACvC,eAAe;OACf,UAAU;MACX,GATM,KAAK,GASX;KAEL,CAAC;IACE,CAAA;GACa,CAAA;EACV,CAAA,GAEX,aAAa,eACZ,iBAAA,GAAA,kBAAA,IAAA,CAAC,mBAAD;GACE,IAAI;GACJ,aAAa,aAAa;GAC1B,cAAc,aAAa;GAC3B,OAAO,aAAa;GACpB,KAAK,aAAa;EACnB,CAAA,CAEA;;AAET;;AAcA,IAAM,oBAAoB,aAAoC;CAC5D,IAAI,aAAa,GAAG,OAAO;CAC3B,IAAI,aAAa,GAAG,OAAO;CAC3B,OAAO;AACT;;AAGA,IAAM,mBAAmB,EACvB,UACA,QACA,aACyE;CACzE,IAAI,aAAa,KAAK,QAAQ,OAAO;CACrC,IAAI,QAAQ,OAAO;CACnB,IAAI,aAAa,GAAG,OAAO;CAC3B,OAAO;AACT;AAEA,IAAM,iBAAiBL,MAAM,KAAK,SAAS,eAAe,EACxD,MACA,OACA,UACA,QACA,QACA,WACA,eACA,YACsB;CACtB,MAAM,OAAO,iBAAiB,QAAQ;CACtC,MAAM,OAAO,gBAAgB;EAAE;EAAU;EAAQ;CAAO,CAAC;CAEzD,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EACE,gBAAc,SAAS,SAAS,KAAA;EAChC,eAAa,SAAS,SAAS,KAAA;EAC/B,WAAU;EAEV,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;GACE,MAAK;GACL,cAAY,WAAW,KAAK;GAC5B,gBAAc,SAAS,aAAa,KAAA;GACpC,oBAAkB;GAClB,gBAAc,SAAS,SAAS,KAAA;GAChC,eAAa,SAAS,SAAS,KAAA;GAC/B,eAAe,SAAS,IAAI;GAC5B,eAAc,UAAS,cAAc,OAAO,MAAM,aAAa;GAC/D,UAAS,UAAS,cAAc,OAAO,MAAM,aAAa;GAC1D,WAAWG,cAAAA,GACT,gHACA,0EACAG,+BAAAA,WACA,MACA,IACF;EACD,CAAA;CACE,CAAA;AAET,CAAC;AAED,SAAS,kBAAkB,EACzB,IACA,aACA,cACA,OACA,OAOC;CACD,MAAM,EACJ,KAAK,iBACL,aAAa,oBACb,SAAS,yBACPC,uCAAAA,sBAAsB;CAC1B,MAAM,mBAAmB,UAAU,aAAc,UAAU,cAAc,QAAQ,YAAY;CAE7F,MAAM,uBAAuB;CAC7B,MAAM,wBAAwB;CAC9B,MAAM,iBACJ;CAEF,MAAM,sBAAsB;EAC1B,qBAAqB;CACvB,GAAG;EAAC,YAAY;EAAK;EAAO;CAAoB,CAAC;CAEjD,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EACM;EACJ,eAAY;EACZ,gBAAc,mBAAmB,SAAS,KAAA;EAC1C,WAAWJ,cAAAA,GACT,4OACAK,kCAAAA,qBACA,mBAAmB,gBAAgB,WACrC;EACA,OAAO;GAAE,GAAG;GAAoB,WAAW,UAAU,IAAI;EAAW;EATtE,UAAA,CAWE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;GAAK,KAAK;GAAiB,eAAY;GAA4B,eAAA;GAAY,WAAU;GACvF,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,0BAAD;IAA0B,MAAM;IAAa,WAAU;GAAS,CAAA;EAC7D,CAAA,GACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;GAAK,eAAY;GAA+B,WAAU;GACxD,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACG,gBACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAEE,eAAY;KACZ,eAAA;KACA,WAAWL,cAAAA,GAAG,gBAAgB,UAAU,aAAa,wBAAwB,oBAAoB;KAEjG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,0BAAD;MAA0B,MAAM;MAAc,WAAU;KAAS,CAAA;IAC9D,GANE,aAAa,GAMf,GAEP,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAEE,eAAY;KACZ,WAAWA,cAAAA,GAAG,gBAAgB,UAAU,YAAY,wBAAwB,oBAAoB;KAEhG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,0BAAD;MAA0B,MAAM;MAAa,WAAU;KAAS,CAAA;IAC7D,GALE,YAAY,GAKd,CACF;;EACF,CAAA,CACF;;AAET;AAEA,SAAS,yBAAyB,EAChC,MACA,WACA,GAAG,SAC+D;CAClE,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EAAgB;EAAW,GAAI;EAA/B,UAAA;GACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,WAAU;IAA4C,UAAA,KAAK;GAAY,CAAA;GAC3E,KAAK,SACJ,iBAAA,GAAA,kBAAA,IAAA,CAACM,YAAAA,KAAD;IAAK,SAAQ;IAAU,MAAK;IAAQ,WAAU;IAC3C,UAAA,KAAK;GACH,CAAA;IAEL,KAAK,MAAM,SAAS,KAAK,KAAK,kBAAkB,MAChD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACG,KAAK,MAAM,KAAI,SACd,iBAAA,GAAA,kBAAA,KAAA,CAACA,YAAAA,KAAD;KACE,IAAG;KACH,SAAQ;KACR,MAAK;KAEL,WAAU;KALZ,UAAA,CAOE,iBAAA,GAAA,kBAAA,IAAA,CAACC,aAAAA,UAAD;MAAU,WAAU;MAA+B,eAAA;KAAa,CAAA,GAC/D,IACE;IALE,GAAA,IAKF,CACN,GACA,KAAK,kBAAkB,KACtB,iBAAA,GAAA,kBAAA,KAAA,CAACD,YAAAA,KAAD;KAAK,IAAG;KAAO,SAAQ;KAAS,MAAK;KAArC,UAAA,CAA6C,KACzC,KAAK,eACJ;IAEJ,CAAA,CAAA;;EAEJ;;AAET;;ACpZA,IAAM,qBAAqB;AAC3B,IAAM,qBAAqB;AAE3B,IAAM,wBAAwB;AAW9B,IAAM,YAAY,UAChB,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAErE,IAAa,uBAAuB,YAAqC;CACvE,MAAM,WAAW,QAAQ,QAAQ;CACjC,MAAM,kBAAkB,SAAS,QAAQ,IAAI,SAAS,yBAAyB,KAAA;CAC/E,OAAO,OAAO,oBAAoB,YAAY,gBAAgB,SAAS,IAAI,kBAAkB,QAAQ;AACvG;AAEA,IAAM,oBAAoB,OAAe,aAA6B;CACpE,MAAM,aAAa,MAAM,QAAQ,QAAQ,GAAG,CAAC,CAAC,KAAK;CACnD,IAAI,WAAW,WAAW,GAAG,OAAO;CACpC,IAAI,WAAW,UAAU,oBAAoB,OAAO;CACpD,OAAO,GAAG,WAAW,MAAM,GAAG,GAAsB,CAAC,CAAC,QAAQ,EAAE;AAClE;AAEA,IAAM,oBAAoB,YACxB,QAAQ,QAAQ,MACb,SAAQ,SAAQ;CACf,IAAI,CAAC,SAAS,IAAI,KAAK,KAAK,SAAS,UAAU,OAAO,KAAK,SAAS,UAAU,OAAO,CAAC;CACtF,IAAIE,8BAAAA,oBAAoB,KAAK,IAAI,GAAG,OAAO,CAAC;CAC5C,OAAO,CAAC,KAAK,IAAI;AACnB,CAAC,CAAC,CACD,KAAK,IAAI;AAEd,IAAM,kBAAkB,MAA+B,SAAuC;CAC5F,KAAK,MAAM,OAAO,MAAM;EACtB,MAAM,QAAQ,KAAK;EACnB,IAAI,OAAO,UAAU,YAAY,MAAM,KAAK,CAAC,CAAC,SAAS,GAAG,OAAO;CACnE;AAEF;AAEA,IAAM,gBAAgB,UAAsC;CAC1D,IAAI,MAAM,WAAW,OAAO,GAAG,OAAO,KAAA;CAEtC,IAAI;EACF,MAAM,MAAM,IAAI,IAAI,KAAK;EAEzB,OADkB,IAAI,SAAS,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,IACnD,KAAa,IAAI,YAAY,KAAA;CACtC,QAAQ;EACN,MAAM,YAAY,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,IAAI;EACzE,OAAO,aAAa,CAAC,UAAU,WAAW,OAAO,IAAI,YAAY,KAAA;CACnE;AACF;AAEA,IAAM,wBAAwB,SAA0C;CACtE,MAAM,YAAY,eAAe,MAAM,CAAC,YAAY,WAAW,CAAC,KAAK;CACrE,IAAI,KAAK,SAAS,WAAW,UAAU,WAAW,QAAQ,GAAG,OAAO;CACpE,IAAI,cAAc,mBAAmB,OAAO;CAC5C,IAAI,UAAU,WAAW,QAAQ,GAAG,OAAO;CAC3C,IAAI,UAAU,WAAW,QAAQ,GAAG,OAAO;CAC3C,OAAO;AACT;AAEA,IAAM,wBAAwB,SAA0E;CACtG,IAAI,CAAC,SAAS,IAAI,GAAG,OAAO,KAAA;CAE5B,MAAM,OAAO,eAAe,MAAM,CAAC,MAAM,CAAC;CAC1C,IAAI,SAAS,UAAU,SAAS,SAAS,OAAO,KAAA;CAEhD,MAAM,gBAAgB,eAAe,MAAM,CAAC,YAAY,MAAM,CAAC;CAC/D,IAAI,eAAe,OAAO;CAE1B,MAAM,SAAS,eAAe,MAAM;EAAC;EAAO;EAAS;CAAM,CAAC;CAE5D,QADkB,SAAS,aAAa,MAAM,IAAI,KAAA,MAC9B,qBAAqB,IAAI;AAC/C;AAEA,IAAM,iBAAiB,YACrB,QAAQ,QAAQ,MAAM,IAAI,oBAAoB,CAAC,CAAC,QAAQ,UAA2B,QAAQ,KAAK,CAAC;AAEnG,IAAM,iBAAiB,YAAiD;CACtE,MAAM,SAAS,QAAQ,QAAQ,UAAU;CACzC,MAAM,eAAe,SAAS,MAAM,IAAI,OAAO,OAAO,KAAA;CACtD,OAAO,OAAO,iBAAiB,WAAW,eAAe,QAAQ;AACnE;;AAGA,IAAa,kBAAkB,YAAsC;CACnE,IAAI,QAAQ,SAAS,QAAQ,OAAO;CACpC,IAAI,QAAQ,SAAS,UAAU,OAAO;CAEtC,MAAM,aAAa,cAAc,OAAO;CACxC,OAAO,eAAe,UAAU,eAAe;AACjD;AAEA,IAAM,yBAAyB,UAA6B,eAA2C;CACrG,KAAK,IAAI,QAAQ,aAAa,GAAG,QAAQ,SAAS,QAAQ,SAAS,GAAG;EACpE,MAAM,UAAU,SAAS;EACzB,IAAI,CAAC,SAAS;EACd,IAAI,eAAe,OAAO,GAAG,OAAO,KAAA;EACpC,IAAI,QAAQ,SAAS,aAAa;EAElC,MAAM,QAAQ,iBAAiB,iBAAiB,OAAO,GAAG,EAAE;EAC5D,IAAI,OAAO,OAAO;CACpB;AAGF;AAEA,IAAa,wBAAwB,aACnC,SAAS,SAAS,SAAS,UAAU;CACnC,IAAI,CAAC,eAAe,OAAO,GAAG,OAAO,CAAC;CAEtC,MAAM,QAAQ,cAAc,OAAO;CACnC,MAAM,eAAe,MAAM,MAAM,GAAG,kBAAkB;CAEtD,OAAO,CACL;EACE,KAAK,oBAAoB,OAAO;EAChC,WAAW,QAAQ;EACnB,QAAQ,iBAAiB,iBAAiB,OAAO,GAAG,MAAM,SAAS,IAAI,kBAAkB,cAAc;EACvG,OAAO,sBAAsB,UAAU,KAAK;EAC5C,OAAO;EACP,iBAAiB,MAAM,SAAS,aAAa;CAC/C,CACF;AACF,CAAC;;AC1HH,IAAM,0BAA0B;;;;;;AAOhC,SAAgB,WAAc,SAAc,EAAE,KAAK,WAAW,aAAa,qBAAmC;CAC5G,MAAM,SAAyB,CAAC;CAEhC,KAAK,MAAM,SAAS,SAAS;EAC3B,MAAM,QAAQ,UAAU,KAAK;EAC7B,MAAM,WAAW,OAAO,GAAG,EAAE;EAC7B,IAAI,CAAC,SAAS,UAAU;GACtB,SAAS,QAAQ,KAAK,KAAK;GAC3B;EACF;EACA,MAAM,OAAO,UAAU,QAAQ,GAAG,EAAE;EACpC,MAAM,eAAe,YAAY,SAAS,KAAA,KAAa,WAAW,IAAI,IAAI,SAAS,QAAQ,OAAO,EAAE,IAAI,CAAC;EACzG,IAAI,UAAU,QAAQ,WAAW,GAAG,OAAO,IAAI;EAC/C,OAAO,KAAK;GAAE,KAAK,IAAI,KAAK;GAAG,SAAS,CAAC,GAAG,cAAc,KAAK;GAAG,WAAW;EAAM,CAAC;CACtF;CAEA,OAAO;AACT"}
@@ -5,6 +5,7 @@ import { overlaySurfaceStyle } from "../primitives/raised-surface.es.js";
5
5
  import { focusRing } from "../primitives/transitions.es.js";
6
6
  import { useMeasuredAutoHeight } from "../hooks/use-measured-auto-height.es.js";
7
7
  import { t as cn } from "../utils-DQx8TpNT.js";
8
+ import { isMcpAppContextText } from "../utils/mcp-app-context.es.js";
8
9
  import * as React$1 from "react";
9
10
  import { jsx, jsxs } from "react/jsx-runtime";
10
11
  import { FileText } from "lucide-react";
@@ -308,6 +309,7 @@ var normalizeSummary = (value, fallback) => {
308
309
  };
309
310
  var getTextFromParts = (message) => message.content.parts.flatMap((part) => {
310
311
  if (!isRecord(part) || part.type !== "text" || typeof part.text !== "string") return [];
312
+ if (isMcpAppContextText(part.text)) return [];
311
313
  return [part.text];
312
314
  }).join("\n");
313
315
  var getStringField = (part, keys) => {
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadRail.es.js","names":["React"],"sources":["../../src/ds/components/ThreadRail/thread-rail.tsx","../../src/ds/components/ThreadRail/thread-rail-turns.ts","../../src/ds/components/ThreadRail/turn-groups.ts"],"sourcesContent":["import { FileText } from 'lucide-react';\nimport * as React from 'react';\n\nimport type { ThreadRailTurn } from './thread-rail-turns';\n\nimport { useOptionalMessageScroller, useOptionalMessageScrollerVisibility } from '@/ds/components/MessageScroller';\nimport { ScrollArea, ScrollAreaViewport } from '@/ds/components/ScrollArea';\nimport { Txt } from '@/ds/components/Txt';\nimport { overlaySurfaceStyle } from '@/ds/primitives/raised-surface';\nimport { focusRing } from '@/ds/primitives/transitions';\nimport { useMeasuredAutoHeight } from '@/hooks/use-measured-auto-height';\nimport { cn } from '@/lib/utils';\n\ntype ThreadRailPreviewPhase = 'hidden' | 'entering' | 'visible' | 'exiting';\n\ntype ThreadRailPreviewState = {\n currentTurn: ThreadRailTurn | undefined;\n previousTurn: ThreadRailTurn | undefined;\n index: number | null;\n phase: ThreadRailPreviewPhase;\n top: number;\n transitionKey: number;\n};\n\nconst PREVIEW_TRANSITION_DURATION_MS = 360;\nconst PREVIEW_CLEANUP_DELAY_MS = PREVIEW_TRANSITION_DURATION_MS + 80;\n\nconst DEFAULT_PREVIEW_STATE: ThreadRailPreviewState = {\n currentTurn: undefined,\n previousTurn: undefined,\n index: null,\n phase: 'hidden',\n top: 0,\n transitionKey: 0,\n};\n\nexport interface ThreadRailProps {\n turns: ThreadRailTurn[];\n currentAnchorId?: string;\n visibleMessageIds?: string[];\n label?: string;\n className?: string;\n maxHeight?: string;\n scrollAreaClassName?: string;\n onSelect?: (turn: ThreadRailTurn) => void;\n}\n\nexport function ThreadRail({\n turns,\n currentAnchorId,\n visibleMessageIds,\n label = 'Conversation timeline',\n className,\n maxHeight = 'calc(100dvh - 12rem)',\n scrollAreaClassName,\n onSelect,\n}: ThreadRailProps) {\n const railRef = React.useRef<HTMLElement>(null);\n const previewId = React.useId();\n const [previewState, setPreviewState] = React.useState<ThreadRailPreviewState>(DEFAULT_PREVIEW_STATE);\n const messageScroller = useOptionalMessageScroller();\n const scrollerVisibility = useOptionalMessageScrollerVisibility();\n\n const fallbackMessageId = turns.at(-1)?.messageId;\n const activeMessageId = currentAnchorId ?? scrollerVisibility?.currentAnchorId ?? fallbackMessageId;\n const resolvedVisibleMessageIds =\n visibleMessageIds ?? scrollerVisibility?.visibleMessageIds ?? (activeMessageId ? [activeMessageId] : []);\n const visibleMessageIdSet = new Set(resolvedVisibleMessageIds);\n const previewHoverActive = previewState.phase === 'entering' || previewState.phase === 'visible';\n const hoveredIndex = previewHoverActive ? previewState.index : null;\n const selectTurn = React.useCallback(\n (turn: ThreadRailTurn) => {\n if (onSelect) {\n onSelect(turn);\n return;\n }\n\n messageScroller?.scrollToMessage(turn.messageId, { behavior: 'smooth', align: 'start' });\n },\n [messageScroller, onSelect],\n );\n\n const showPreview = React.useCallback(\n (index: number, element: HTMLElement) => {\n const railTop = railRef.current?.getBoundingClientRect().top ?? 0;\n const itemRect = element.getBoundingClientRect();\n const nextTurn = turns[index];\n if (!nextTurn) return;\n\n setPreviewState(current => {\n const nextTop = itemRect.top + itemRect.height / 2 - railTop;\n if (current.index === index && current.phase !== 'hidden' && current.phase !== 'exiting') {\n return { ...current, top: nextTop };\n }\n\n const previousTurn =\n current.currentTurn && current.currentTurn.key !== nextTurn.key && current.phase !== 'hidden'\n ? current.currentTurn\n : undefined;\n\n return {\n currentTurn: nextTurn,\n previousTurn,\n index,\n phase: 'entering',\n top: nextTop,\n transitionKey: current.transitionKey + 1,\n };\n });\n },\n [turns],\n );\n\n const hidePreview = () => {\n setPreviewState(current => {\n if (!current.currentTurn || current.phase === 'hidden' || current.phase === 'exiting') {\n return { ...current, index: null };\n }\n\n return {\n ...current,\n index: null,\n previousTurn: undefined,\n phase: 'exiting',\n transitionKey: current.transitionKey + 1,\n };\n });\n };\n\n React.useEffect(() => {\n if (previewState.phase !== 'entering') return;\n\n const requestFrame = window.requestAnimationFrame ?? window.setTimeout;\n const cancelFrame = window.cancelAnimationFrame ?? window.clearTimeout;\n let settleFrame: number | undefined;\n const startFrame = requestFrame(() => {\n settleFrame = requestFrame(() => {\n setPreviewState(current =>\n current.transitionKey === previewState.transitionKey && current.phase === 'entering'\n ? { ...current, phase: 'visible' }\n : current,\n );\n });\n });\n\n return () => {\n cancelFrame(startFrame);\n if (settleFrame !== undefined) cancelFrame(settleFrame);\n };\n }, [previewState.phase, previewState.transitionKey]);\n\n React.useEffect(() => {\n if (previewState.phase !== 'visible' || !previewState.previousTurn) return;\n\n const timeout = window.setTimeout(() => {\n setPreviewState(current =>\n current.transitionKey === previewState.transitionKey ? { ...current, previousTurn: undefined } : current,\n );\n }, PREVIEW_CLEANUP_DELAY_MS);\n\n return () => window.clearTimeout(timeout);\n }, [previewState.phase, previewState.previousTurn, previewState.transitionKey]);\n\n React.useEffect(() => {\n if (previewState.phase !== 'exiting') return;\n\n const timeout = window.setTimeout(() => {\n setPreviewState(current =>\n current.transitionKey === previewState.transitionKey ? DEFAULT_PREVIEW_STATE : current,\n );\n }, PREVIEW_CLEANUP_DELAY_MS);\n\n return () => window.clearTimeout(timeout);\n }, [previewState.phase, previewState.transitionKey]);\n\n if (turns.length === 0) return null;\n\n return (\n <nav\n ref={railRef}\n aria-label={label}\n data-testid=\"thread-rail\"\n className={cn('relative w-8 py-2', className)}\n onMouseLeave={hidePreview}\n onBlur={event => {\n const nextFocus = event.relatedTarget;\n if (!(nextFocus instanceof Node) || !event.currentTarget.contains(nextFocus)) hidePreview();\n }}\n >\n <ScrollArea\n data-testid=\"thread-rail-scroll-area\"\n maxHeight={maxHeight}\n className={cn('w-8', scrollAreaClassName)}\n >\n <ScrollAreaViewport className=\"pr-3\">\n <div className=\"flex w-4 flex-col items-start gap-2 py-2\">\n {turns.map((turn, index) => {\n const distance = hoveredIndex === null ? null : Math.abs(index - hoveredIndex);\n const active = turn.messageId === activeMessageId;\n const inView = visibleMessageIdSet.has(turn.messageId);\n const previewActive = hoveredIndex === index;\n\n return (\n <ThreadRailItem\n key={turn.key}\n turn={turn}\n index={index}\n distance={distance}\n active={active}\n inView={inView}\n previewId={previewActive ? previewId : undefined}\n onHoverChange={showPreview}\n onSelect={selectTurn}\n />\n );\n })}\n </div>\n </ScrollAreaViewport>\n </ScrollArea>\n\n {previewState.currentTurn && (\n <ThreadRailPreview\n id={previewId}\n currentTurn={previewState.currentTurn}\n previousTurn={previewState.previousTurn}\n phase={previewState.phase}\n top={previewState.top}\n />\n )}\n </nav>\n );\n}\n\ninterface ThreadRailItemProps {\n turn: ThreadRailTurn;\n index: number;\n distance: number | null;\n active: boolean;\n inView: boolean;\n previewId?: string;\n onHoverChange: (index: number, element: HTMLElement) => void;\n onSelect: (turn: ThreadRailTurn) => void;\n}\n\n/** Width of a rail tick: widest at the hovered item, tapering to neighbours. */\nconst getRailItemWidth = (distance: number | null): string => {\n if (distance === 0) return 'w-4';\n if (distance === 1) return 'w-3';\n return 'w-2';\n};\n\n/** Background tone of a rail tick, prioritising hovered/active, then in-view, then proximity. */\nconst getRailItemTone = ({\n distance,\n active,\n inView,\n}: Pick<ThreadRailItemProps, 'distance' | 'active' | 'inView'>): string => {\n if (distance === 0 || active) return 'bg-foreground';\n if (inView) return 'bg-foreground/85';\n if (distance === 1) return 'bg-foreground/70';\n return 'bg-foreground/40';\n};\n\nconst ThreadRailItem = React.memo(function ThreadRailItem({\n turn,\n index,\n distance,\n active,\n inView,\n previewId,\n onHoverChange,\n onSelect,\n}: ThreadRailItemProps) {\n const size = getRailItemWidth(distance);\n const tone = getRailItemTone({ distance, active, inView });\n\n return (\n <div\n data-in-view={inView ? 'true' : undefined}\n data-active={active ? 'true' : undefined}\n className=\"group/thread-rail-item relative flex items-center\"\n >\n <button\n type=\"button\"\n aria-label={`Jump to ${turn.prompt}`}\n aria-current={active ? 'location' : undefined}\n aria-describedby={previewId}\n data-in-view={inView ? 'true' : undefined}\n data-active={active ? 'true' : undefined}\n onClick={() => onSelect(turn)}\n onMouseEnter={event => onHoverChange(index, event.currentTarget)}\n onFocus={event => onHoverChange(index, event.currentTarget)}\n className={cn(\n 'relative block h-px cursor-pointer rounded-full transition-[width,background-color] duration-normal ease-out',\n \"before:absolute before:inset-x-0 before:-inset-y-1 before:content-['']\",\n focusRing,\n size,\n tone,\n )}\n />\n </div>\n );\n});\n\nfunction ThreadRailPreview({\n id,\n currentTurn,\n previousTurn,\n phase,\n top,\n}: {\n id: string;\n currentTurn: ThreadRailTurn;\n previousTurn: ThreadRailTurn | undefined;\n phase: ThreadRailPreviewPhase;\n top: number;\n}) {\n const {\n ref: previewSizerRef,\n heightStyle: previewHeightStyle,\n measure: measurePreviewHeight,\n } = useMeasuredAutoHeight();\n const containerVisible = phase === 'visible' || (phase === 'entering' && Boolean(previousTurn));\n // Entering and exiting share the same off-screen resting style.\n const hiddenLayerClassName = 'scale-95 opacity-0 blur-xs';\n const visibleLayerClassName = 'scale-100 opacity-100 blur-none';\n const layerClassName =\n 'absolute inset-x-0 top-0 h-full origin-left transition-[opacity,filter,scale] duration-150 ease-in-out will-change-[opacity,filter,scale] motion-reduce:scale-100 motion-reduce:blur-none motion-reduce:transition-none';\n\n React.useLayoutEffect(() => {\n measurePreviewHeight();\n }, [currentTurn.key, phase, measurePreviewHeight]);\n\n return (\n <div\n id={id}\n data-testid=\"thread-rail-preview\"\n data-visible={containerVisible ? 'true' : undefined}\n className={cn(\n 'pointer-events-none absolute top-0 left-full z-30 ml-3 w-72 overflow-hidden rounded-xl text-left transition-[height,translate,opacity] duration-360 ease-out-custom will-change-[height,translate,opacity] motion-reduce:transition-none',\n overlaySurfaceStyle,\n containerVisible ? 'opacity-100' : 'opacity-0',\n )}\n style={{ ...previewHeightStyle, translate: `0 calc(${top}px - 50%)` }}\n >\n <div ref={previewSizerRef} data-testid=\"thread-rail-preview-sizer\" aria-hidden className=\"invisible\">\n <ThreadRailPreviewContent turn={currentTurn} className=\"p-3.5\" />\n </div>\n <div data-testid=\"thread-rail-preview-viewport\" className=\"absolute inset-0\">\n <div className=\"relative h-full\">\n {previousTurn && (\n <div\n key={previousTurn.key}\n data-testid=\"thread-rail-preview-previous\"\n aria-hidden\n className={cn(layerClassName, phase === 'entering' ? visibleLayerClassName : hiddenLayerClassName)}\n >\n <ThreadRailPreviewContent turn={previousTurn} className=\"p-3.5\" />\n </div>\n )}\n <div\n key={currentTurn.key}\n data-testid=\"thread-rail-preview-current\"\n className={cn(layerClassName, phase === 'visible' ? visibleLayerClassName : hiddenLayerClassName)}\n >\n <ThreadRailPreviewContent turn={currentTurn} className=\"p-3.5\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ThreadRailPreviewContent({\n turn,\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement> & { turn: ThreadRailTurn }) {\n return (\n <div className={className} {...props}>\n <div className=\"truncate text-subheading text-foreground\">{turn.prompt}</div>\n {turn.reply && (\n <Txt variant=\"caption\" tone=\"muted\" className=\"mt-1.5 line-clamp-3\">\n {turn.reply}\n </Txt>\n )}\n {(turn.files.length > 0 || turn.hiddenFileCount > 0) && (\n <div className=\"mt-3 flex flex-wrap items-center gap-2 border-t border-border pt-2.5\">\n {turn.files.map(file => (\n <Txt\n as=\"span\"\n variant=\"caption\"\n tone=\"muted\"\n key={file}\n className=\"inline-flex max-w-44 items-center gap-1.5 truncate\"\n >\n <FileText className=\"size-3.5 shrink-0 opacity-70\" aria-hidden />\n {file}\n </Txt>\n ))}\n {turn.hiddenFileCount > 0 && (\n <Txt as=\"span\" variant=\"column\" tone=\"muted\">\n +{turn.hiddenFileCount}\n </Txt>\n )}\n </div>\n )}\n </div>\n );\n}\n","import type { MastraDBMessage } from '@mastra/core/agent/message-list';\nimport type { MastraDBMessageMetadata } from '@mastra/react';\n\nconst SUMMARY_MAX_LENGTH = 120;\nconst FILE_PREVIEW_LIMIT = 2;\n// Inlined, not imported: the value export sits behind a barrel this browser bundle must not pull.\nconst CLIENT_MESSAGE_ID_KEY = 'clientMessageId' satisfies keyof MastraDBMessageMetadata;\n\nexport interface ThreadRailTurn {\n key: string;\n messageId: string;\n prompt: string;\n reply?: string;\n files: string[];\n hiddenFileCount: number;\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nexport const getClientMessageKey = (message: MastraDBMessage): string => {\n const metadata = message.content.metadata;\n const clientMessageId = isRecord(metadata) ? metadata[CLIENT_MESSAGE_ID_KEY] : undefined;\n return typeof clientMessageId === 'string' && clientMessageId.length > 0 ? clientMessageId : message.id;\n};\n\nconst normalizeSummary = (value: string, fallback: string): string => {\n const normalized = value.replace(/\\s+/g, ' ').trim();\n if (normalized.length === 0) return fallback;\n if (normalized.length <= SUMMARY_MAX_LENGTH) return normalized;\n return `${normalized.slice(0, SUMMARY_MAX_LENGTH - 3).trimEnd()}...`;\n};\n\nconst getTextFromParts = (message: MastraDBMessage): string =>\n message.content.parts\n .flatMap(part => {\n if (!isRecord(part) || part.type !== 'text' || typeof part.text !== 'string') return [];\n return [part.text];\n })\n .join('\\n');\n\nconst getStringField = (part: Record<string, unknown>, keys: string[]): string | undefined => {\n for (const key of keys) {\n const value = part[key];\n if (typeof value === 'string' && value.trim().length > 0) return value;\n }\n return undefined;\n};\n\nconst getPathLabel = (value: string): string | undefined => {\n if (value.startsWith('data:')) return undefined;\n\n try {\n const url = new URL(value);\n const candidate = url.pathname.split('/').filter(Boolean).pop();\n return candidate || url.hostname || undefined;\n } catch {\n const candidate = value.split(/[?#]/)[0]?.split('/').filter(Boolean).pop();\n return candidate && !candidate.startsWith('data:') ? candidate : undefined;\n }\n};\n\nconst getFallbackFileLabel = (part: Record<string, unknown>): string => {\n const mediaType = getStringField(part, ['mimeType', 'mediaType']) ?? '';\n if (part.type === 'image' || mediaType.startsWith('image/')) return 'Image';\n if (mediaType === 'application/pdf') return 'PDF';\n if (mediaType.startsWith('video/')) return 'Video';\n if (mediaType.startsWith('audio/')) return 'Audio';\n return 'File';\n};\n\nconst getFileLabelFromPart = (part: MastraDBMessage['content']['parts'][number]): string | undefined => {\n if (!isRecord(part)) return undefined;\n\n const type = getStringField(part, ['type']);\n if (type !== 'file' && type !== 'image') return undefined;\n\n const explicitLabel = getStringField(part, ['filename', 'name']);\n if (explicitLabel) return explicitLabel;\n\n const source = getStringField(part, ['url', 'image', 'data']);\n const pathLabel = source ? getPathLabel(source) : undefined;\n return pathLabel ?? getFallbackFileLabel(part);\n};\n\nconst getFileLabels = (message: MastraDBMessage): string[] =>\n message.content.parts.map(getFileLabelFromPart).filter((label): label is string => Boolean(label));\n\nconst getSignalType = (message: MastraDBMessage): string | undefined => {\n const signal = message.content.metadata?.signal;\n const metadataType = isRecord(signal) ? signal.type : undefined;\n return typeof metadataType === 'string' ? metadataType : message.type;\n};\n\n/** What opens a turn: a rail stop, and the row the scroller parks at the top. */\nexport const startsUserTurn = (message: MastraDBMessage): boolean => {\n if (message.role === 'user') return true;\n if (message.role !== 'signal') return false;\n\n const signalType = getSignalType(message);\n return signalType === 'user' || signalType === 'user-message';\n};\n\nconst getNextAssistantReply = (messages: MastraDBMessage[], startIndex: number): string | undefined => {\n for (let index = startIndex + 1; index < messages.length; index += 1) {\n const message = messages[index];\n if (!message) continue;\n if (startsUserTurn(message)) return undefined;\n if (message.role !== 'assistant') continue;\n\n const reply = normalizeSummary(getTextFromParts(message), '');\n if (reply) return reply;\n }\n\n return undefined;\n};\n\nexport const buildThreadRailTurns = (messages: MastraDBMessage[]): ThreadRailTurn[] =>\n messages.flatMap((message, index) => {\n if (!startsUserTurn(message)) return [];\n\n const files = getFileLabels(message);\n const visibleFiles = files.slice(0, FILE_PREVIEW_LIMIT);\n\n return [\n {\n key: getClientMessageKey(message),\n messageId: message.id,\n prompt: normalizeSummary(getTextFromParts(message), files.length > 0 ? 'Attached file' : 'User message'),\n reply: getNextAssistantReply(messages, index),\n files: visibleFiles,\n hiddenFileCount: files.length - visibleFiles.length,\n },\n ];\n });\n","/** A user's turn and everything the run produced under it. */\nexport interface TurnGroup<T> {\n key: string;\n entries: T[];\n /** Opened by a user message, so it reserves room and anchors the scroll. */\n opensTurn: boolean;\n}\n\nexport interface TurnRules<T> {\n key: (entry: T) => string;\n opensTurn: (entry: T) => boolean;\n /** A marker that belongs above the turn it introduces but arrives after the previous one, so it moves down. */\n introduces?: (entry: T) => boolean;\n}\n\nconst introducesNothing = () => false;\n\n/**\n * Cuts a timeline where the reader's attention moves: a user message starts a turn,\n * and everything the run answers with belongs to it. Entries before the first opener\n * form a turn of their own that opens nothing.\n */\nexport function groupTurns<T>(entries: T[], { key, opensTurn, introduces = introducesNothing }: TurnRules<T>) {\n const groups: TurnGroup<T>[] = [];\n\n for (const entry of entries) {\n const opens = opensTurn(entry);\n const previous = groups.at(-1);\n if (!opens && previous) {\n previous.entries.push(entry);\n continue;\n }\n const last = previous?.entries.at(-1);\n const introduction = previous && last !== undefined && introduces(last) ? previous.entries.splice(-1) : [];\n if (previous?.entries.length === 0) groups.pop();\n groups.push({ key: key(entry), entries: [...introduction, entry], opensTurn: opens });\n }\n\n return groups;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ThreadRail.es.js","names":["React"],"sources":["../../src/ds/components/ThreadRail/thread-rail.tsx","../../src/ds/components/ThreadRail/thread-rail-turns.ts","../../src/ds/components/ThreadRail/turn-groups.ts"],"sourcesContent":["import { FileText } from 'lucide-react';\nimport * as React from 'react';\n\nimport type { ThreadRailTurn } from './thread-rail-turns';\n\nimport { useOptionalMessageScroller, useOptionalMessageScrollerVisibility } from '@/ds/components/MessageScroller';\nimport { ScrollArea, ScrollAreaViewport } from '@/ds/components/ScrollArea';\nimport { Txt } from '@/ds/components/Txt';\nimport { overlaySurfaceStyle } from '@/ds/primitives/raised-surface';\nimport { focusRing } from '@/ds/primitives/transitions';\nimport { useMeasuredAutoHeight } from '@/hooks/use-measured-auto-height';\nimport { cn } from '@/lib/utils';\n\ntype ThreadRailPreviewPhase = 'hidden' | 'entering' | 'visible' | 'exiting';\n\ntype ThreadRailPreviewState = {\n currentTurn: ThreadRailTurn | undefined;\n previousTurn: ThreadRailTurn | undefined;\n index: number | null;\n phase: ThreadRailPreviewPhase;\n top: number;\n transitionKey: number;\n};\n\nconst PREVIEW_TRANSITION_DURATION_MS = 360;\nconst PREVIEW_CLEANUP_DELAY_MS = PREVIEW_TRANSITION_DURATION_MS + 80;\n\nconst DEFAULT_PREVIEW_STATE: ThreadRailPreviewState = {\n currentTurn: undefined,\n previousTurn: undefined,\n index: null,\n phase: 'hidden',\n top: 0,\n transitionKey: 0,\n};\n\nexport interface ThreadRailProps {\n turns: ThreadRailTurn[];\n currentAnchorId?: string;\n visibleMessageIds?: string[];\n label?: string;\n className?: string;\n maxHeight?: string;\n scrollAreaClassName?: string;\n onSelect?: (turn: ThreadRailTurn) => void;\n}\n\nexport function ThreadRail({\n turns,\n currentAnchorId,\n visibleMessageIds,\n label = 'Conversation timeline',\n className,\n maxHeight = 'calc(100dvh - 12rem)',\n scrollAreaClassName,\n onSelect,\n}: ThreadRailProps) {\n const railRef = React.useRef<HTMLElement>(null);\n const previewId = React.useId();\n const [previewState, setPreviewState] = React.useState<ThreadRailPreviewState>(DEFAULT_PREVIEW_STATE);\n const messageScroller = useOptionalMessageScroller();\n const scrollerVisibility = useOptionalMessageScrollerVisibility();\n\n const fallbackMessageId = turns.at(-1)?.messageId;\n const activeMessageId = currentAnchorId ?? scrollerVisibility?.currentAnchorId ?? fallbackMessageId;\n const resolvedVisibleMessageIds =\n visibleMessageIds ?? scrollerVisibility?.visibleMessageIds ?? (activeMessageId ? [activeMessageId] : []);\n const visibleMessageIdSet = new Set(resolvedVisibleMessageIds);\n const previewHoverActive = previewState.phase === 'entering' || previewState.phase === 'visible';\n const hoveredIndex = previewHoverActive ? previewState.index : null;\n const selectTurn = React.useCallback(\n (turn: ThreadRailTurn) => {\n if (onSelect) {\n onSelect(turn);\n return;\n }\n\n messageScroller?.scrollToMessage(turn.messageId, { behavior: 'smooth', align: 'start' });\n },\n [messageScroller, onSelect],\n );\n\n const showPreview = React.useCallback(\n (index: number, element: HTMLElement) => {\n const railTop = railRef.current?.getBoundingClientRect().top ?? 0;\n const itemRect = element.getBoundingClientRect();\n const nextTurn = turns[index];\n if (!nextTurn) return;\n\n setPreviewState(current => {\n const nextTop = itemRect.top + itemRect.height / 2 - railTop;\n if (current.index === index && current.phase !== 'hidden' && current.phase !== 'exiting') {\n return { ...current, top: nextTop };\n }\n\n const previousTurn =\n current.currentTurn && current.currentTurn.key !== nextTurn.key && current.phase !== 'hidden'\n ? current.currentTurn\n : undefined;\n\n return {\n currentTurn: nextTurn,\n previousTurn,\n index,\n phase: 'entering',\n top: nextTop,\n transitionKey: current.transitionKey + 1,\n };\n });\n },\n [turns],\n );\n\n const hidePreview = () => {\n setPreviewState(current => {\n if (!current.currentTurn || current.phase === 'hidden' || current.phase === 'exiting') {\n return { ...current, index: null };\n }\n\n return {\n ...current,\n index: null,\n previousTurn: undefined,\n phase: 'exiting',\n transitionKey: current.transitionKey + 1,\n };\n });\n };\n\n React.useEffect(() => {\n if (previewState.phase !== 'entering') return;\n\n const requestFrame = window.requestAnimationFrame ?? window.setTimeout;\n const cancelFrame = window.cancelAnimationFrame ?? window.clearTimeout;\n let settleFrame: number | undefined;\n const startFrame = requestFrame(() => {\n settleFrame = requestFrame(() => {\n setPreviewState(current =>\n current.transitionKey === previewState.transitionKey && current.phase === 'entering'\n ? { ...current, phase: 'visible' }\n : current,\n );\n });\n });\n\n return () => {\n cancelFrame(startFrame);\n if (settleFrame !== undefined) cancelFrame(settleFrame);\n };\n }, [previewState.phase, previewState.transitionKey]);\n\n React.useEffect(() => {\n if (previewState.phase !== 'visible' || !previewState.previousTurn) return;\n\n const timeout = window.setTimeout(() => {\n setPreviewState(current =>\n current.transitionKey === previewState.transitionKey ? { ...current, previousTurn: undefined } : current,\n );\n }, PREVIEW_CLEANUP_DELAY_MS);\n\n return () => window.clearTimeout(timeout);\n }, [previewState.phase, previewState.previousTurn, previewState.transitionKey]);\n\n React.useEffect(() => {\n if (previewState.phase !== 'exiting') return;\n\n const timeout = window.setTimeout(() => {\n setPreviewState(current =>\n current.transitionKey === previewState.transitionKey ? DEFAULT_PREVIEW_STATE : current,\n );\n }, PREVIEW_CLEANUP_DELAY_MS);\n\n return () => window.clearTimeout(timeout);\n }, [previewState.phase, previewState.transitionKey]);\n\n if (turns.length === 0) return null;\n\n return (\n <nav\n ref={railRef}\n aria-label={label}\n data-testid=\"thread-rail\"\n className={cn('relative w-8 py-2', className)}\n onMouseLeave={hidePreview}\n onBlur={event => {\n const nextFocus = event.relatedTarget;\n if (!(nextFocus instanceof Node) || !event.currentTarget.contains(nextFocus)) hidePreview();\n }}\n >\n <ScrollArea\n data-testid=\"thread-rail-scroll-area\"\n maxHeight={maxHeight}\n className={cn('w-8', scrollAreaClassName)}\n >\n <ScrollAreaViewport className=\"pr-3\">\n <div className=\"flex w-4 flex-col items-start gap-2 py-2\">\n {turns.map((turn, index) => {\n const distance = hoveredIndex === null ? null : Math.abs(index - hoveredIndex);\n const active = turn.messageId === activeMessageId;\n const inView = visibleMessageIdSet.has(turn.messageId);\n const previewActive = hoveredIndex === index;\n\n return (\n <ThreadRailItem\n key={turn.key}\n turn={turn}\n index={index}\n distance={distance}\n active={active}\n inView={inView}\n previewId={previewActive ? previewId : undefined}\n onHoverChange={showPreview}\n onSelect={selectTurn}\n />\n );\n })}\n </div>\n </ScrollAreaViewport>\n </ScrollArea>\n\n {previewState.currentTurn && (\n <ThreadRailPreview\n id={previewId}\n currentTurn={previewState.currentTurn}\n previousTurn={previewState.previousTurn}\n phase={previewState.phase}\n top={previewState.top}\n />\n )}\n </nav>\n );\n}\n\ninterface ThreadRailItemProps {\n turn: ThreadRailTurn;\n index: number;\n distance: number | null;\n active: boolean;\n inView: boolean;\n previewId?: string;\n onHoverChange: (index: number, element: HTMLElement) => void;\n onSelect: (turn: ThreadRailTurn) => void;\n}\n\n/** Width of a rail tick: widest at the hovered item, tapering to neighbours. */\nconst getRailItemWidth = (distance: number | null): string => {\n if (distance === 0) return 'w-4';\n if (distance === 1) return 'w-3';\n return 'w-2';\n};\n\n/** Background tone of a rail tick, prioritising hovered/active, then in-view, then proximity. */\nconst getRailItemTone = ({\n distance,\n active,\n inView,\n}: Pick<ThreadRailItemProps, 'distance' | 'active' | 'inView'>): string => {\n if (distance === 0 || active) return 'bg-foreground';\n if (inView) return 'bg-foreground/85';\n if (distance === 1) return 'bg-foreground/70';\n return 'bg-foreground/40';\n};\n\nconst ThreadRailItem = React.memo(function ThreadRailItem({\n turn,\n index,\n distance,\n active,\n inView,\n previewId,\n onHoverChange,\n onSelect,\n}: ThreadRailItemProps) {\n const size = getRailItemWidth(distance);\n const tone = getRailItemTone({ distance, active, inView });\n\n return (\n <div\n data-in-view={inView ? 'true' : undefined}\n data-active={active ? 'true' : undefined}\n className=\"group/thread-rail-item relative flex items-center\"\n >\n <button\n type=\"button\"\n aria-label={`Jump to ${turn.prompt}`}\n aria-current={active ? 'location' : undefined}\n aria-describedby={previewId}\n data-in-view={inView ? 'true' : undefined}\n data-active={active ? 'true' : undefined}\n onClick={() => onSelect(turn)}\n onMouseEnter={event => onHoverChange(index, event.currentTarget)}\n onFocus={event => onHoverChange(index, event.currentTarget)}\n className={cn(\n 'relative block h-px cursor-pointer rounded-full transition-[width,background-color] duration-normal ease-out',\n \"before:absolute before:inset-x-0 before:-inset-y-1 before:content-['']\",\n focusRing,\n size,\n tone,\n )}\n />\n </div>\n );\n});\n\nfunction ThreadRailPreview({\n id,\n currentTurn,\n previousTurn,\n phase,\n top,\n}: {\n id: string;\n currentTurn: ThreadRailTurn;\n previousTurn: ThreadRailTurn | undefined;\n phase: ThreadRailPreviewPhase;\n top: number;\n}) {\n const {\n ref: previewSizerRef,\n heightStyle: previewHeightStyle,\n measure: measurePreviewHeight,\n } = useMeasuredAutoHeight();\n const containerVisible = phase === 'visible' || (phase === 'entering' && Boolean(previousTurn));\n // Entering and exiting share the same off-screen resting style.\n const hiddenLayerClassName = 'scale-95 opacity-0 blur-xs';\n const visibleLayerClassName = 'scale-100 opacity-100 blur-none';\n const layerClassName =\n 'absolute inset-x-0 top-0 h-full origin-left transition-[opacity,filter,scale] duration-150 ease-in-out will-change-[opacity,filter,scale] motion-reduce:scale-100 motion-reduce:blur-none motion-reduce:transition-none';\n\n React.useLayoutEffect(() => {\n measurePreviewHeight();\n }, [currentTurn.key, phase, measurePreviewHeight]);\n\n return (\n <div\n id={id}\n data-testid=\"thread-rail-preview\"\n data-visible={containerVisible ? 'true' : undefined}\n className={cn(\n 'pointer-events-none absolute top-0 left-full z-30 ml-3 w-72 overflow-hidden rounded-xl text-left transition-[height,translate,opacity] duration-360 ease-out-custom will-change-[height,translate,opacity] motion-reduce:transition-none',\n overlaySurfaceStyle,\n containerVisible ? 'opacity-100' : 'opacity-0',\n )}\n style={{ ...previewHeightStyle, translate: `0 calc(${top}px - 50%)` }}\n >\n <div ref={previewSizerRef} data-testid=\"thread-rail-preview-sizer\" aria-hidden className=\"invisible\">\n <ThreadRailPreviewContent turn={currentTurn} className=\"p-3.5\" />\n </div>\n <div data-testid=\"thread-rail-preview-viewport\" className=\"absolute inset-0\">\n <div className=\"relative h-full\">\n {previousTurn && (\n <div\n key={previousTurn.key}\n data-testid=\"thread-rail-preview-previous\"\n aria-hidden\n className={cn(layerClassName, phase === 'entering' ? visibleLayerClassName : hiddenLayerClassName)}\n >\n <ThreadRailPreviewContent turn={previousTurn} className=\"p-3.5\" />\n </div>\n )}\n <div\n key={currentTurn.key}\n data-testid=\"thread-rail-preview-current\"\n className={cn(layerClassName, phase === 'visible' ? visibleLayerClassName : hiddenLayerClassName)}\n >\n <ThreadRailPreviewContent turn={currentTurn} className=\"p-3.5\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ThreadRailPreviewContent({\n turn,\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement> & { turn: ThreadRailTurn }) {\n return (\n <div className={className} {...props}>\n <div className=\"truncate text-subheading text-foreground\">{turn.prompt}</div>\n {turn.reply && (\n <Txt variant=\"caption\" tone=\"muted\" className=\"mt-1.5 line-clamp-3\">\n {turn.reply}\n </Txt>\n )}\n {(turn.files.length > 0 || turn.hiddenFileCount > 0) && (\n <div className=\"mt-3 flex flex-wrap items-center gap-2 border-t border-border pt-2.5\">\n {turn.files.map(file => (\n <Txt\n as=\"span\"\n variant=\"caption\"\n tone=\"muted\"\n key={file}\n className=\"inline-flex max-w-44 items-center gap-1.5 truncate\"\n >\n <FileText className=\"size-3.5 shrink-0 opacity-70\" aria-hidden />\n {file}\n </Txt>\n ))}\n {turn.hiddenFileCount > 0 && (\n <Txt as=\"span\" variant=\"column\" tone=\"muted\">\n +{turn.hiddenFileCount}\n </Txt>\n )}\n </div>\n )}\n </div>\n );\n}\n","import type { MastraDBMessage } from '@mastra/core/agent/message-list';\nimport type { MastraDBMessageMetadata } from '@mastra/react';\n\nimport { isMcpAppContextText } from '@/utils/mcp-app-context';\n\nconst SUMMARY_MAX_LENGTH = 120;\nconst FILE_PREVIEW_LIMIT = 2;\n// Inlined, not imported: the value export sits behind a barrel this browser bundle must not pull.\nconst CLIENT_MESSAGE_ID_KEY = 'clientMessageId' satisfies keyof MastraDBMessageMetadata;\n\nexport interface ThreadRailTurn {\n key: string;\n messageId: string;\n prompt: string;\n reply?: string;\n files: string[];\n hiddenFileCount: number;\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nexport const getClientMessageKey = (message: MastraDBMessage): string => {\n const metadata = message.content.metadata;\n const clientMessageId = isRecord(metadata) ? metadata[CLIENT_MESSAGE_ID_KEY] : undefined;\n return typeof clientMessageId === 'string' && clientMessageId.length > 0 ? clientMessageId : message.id;\n};\n\nconst normalizeSummary = (value: string, fallback: string): string => {\n const normalized = value.replace(/\\s+/g, ' ').trim();\n if (normalized.length === 0) return fallback;\n if (normalized.length <= SUMMARY_MAX_LENGTH) return normalized;\n return `${normalized.slice(0, SUMMARY_MAX_LENGTH - 3).trimEnd()}...`;\n};\n\nconst getTextFromParts = (message: MastraDBMessage): string =>\n message.content.parts\n .flatMap(part => {\n if (!isRecord(part) || part.type !== 'text' || typeof part.text !== 'string') return [];\n if (isMcpAppContextText(part.text)) return [];\n return [part.text];\n })\n .join('\\n');\n\nconst getStringField = (part: Record<string, unknown>, keys: string[]): string | undefined => {\n for (const key of keys) {\n const value = part[key];\n if (typeof value === 'string' && value.trim().length > 0) return value;\n }\n return undefined;\n};\n\nconst getPathLabel = (value: string): string | undefined => {\n if (value.startsWith('data:')) return undefined;\n\n try {\n const url = new URL(value);\n const candidate = url.pathname.split('/').filter(Boolean).pop();\n return candidate || url.hostname || undefined;\n } catch {\n const candidate = value.split(/[?#]/)[0]?.split('/').filter(Boolean).pop();\n return candidate && !candidate.startsWith('data:') ? candidate : undefined;\n }\n};\n\nconst getFallbackFileLabel = (part: Record<string, unknown>): string => {\n const mediaType = getStringField(part, ['mimeType', 'mediaType']) ?? '';\n if (part.type === 'image' || mediaType.startsWith('image/')) return 'Image';\n if (mediaType === 'application/pdf') return 'PDF';\n if (mediaType.startsWith('video/')) return 'Video';\n if (mediaType.startsWith('audio/')) return 'Audio';\n return 'File';\n};\n\nconst getFileLabelFromPart = (part: MastraDBMessage['content']['parts'][number]): string | undefined => {\n if (!isRecord(part)) return undefined;\n\n const type = getStringField(part, ['type']);\n if (type !== 'file' && type !== 'image') return undefined;\n\n const explicitLabel = getStringField(part, ['filename', 'name']);\n if (explicitLabel) return explicitLabel;\n\n const source = getStringField(part, ['url', 'image', 'data']);\n const pathLabel = source ? getPathLabel(source) : undefined;\n return pathLabel ?? getFallbackFileLabel(part);\n};\n\nconst getFileLabels = (message: MastraDBMessage): string[] =>\n message.content.parts.map(getFileLabelFromPart).filter((label): label is string => Boolean(label));\n\nconst getSignalType = (message: MastraDBMessage): string | undefined => {\n const signal = message.content.metadata?.signal;\n const metadataType = isRecord(signal) ? signal.type : undefined;\n return typeof metadataType === 'string' ? metadataType : message.type;\n};\n\n/** What opens a turn: a rail stop, and the row the scroller parks at the top. */\nexport const startsUserTurn = (message: MastraDBMessage): boolean => {\n if (message.role === 'user') return true;\n if (message.role !== 'signal') return false;\n\n const signalType = getSignalType(message);\n return signalType === 'user' || signalType === 'user-message';\n};\n\nconst getNextAssistantReply = (messages: MastraDBMessage[], startIndex: number): string | undefined => {\n for (let index = startIndex + 1; index < messages.length; index += 1) {\n const message = messages[index];\n if (!message) continue;\n if (startsUserTurn(message)) return undefined;\n if (message.role !== 'assistant') continue;\n\n const reply = normalizeSummary(getTextFromParts(message), '');\n if (reply) return reply;\n }\n\n return undefined;\n};\n\nexport const buildThreadRailTurns = (messages: MastraDBMessage[]): ThreadRailTurn[] =>\n messages.flatMap((message, index) => {\n if (!startsUserTurn(message)) return [];\n\n const files = getFileLabels(message);\n const visibleFiles = files.slice(0, FILE_PREVIEW_LIMIT);\n\n return [\n {\n key: getClientMessageKey(message),\n messageId: message.id,\n prompt: normalizeSummary(getTextFromParts(message), files.length > 0 ? 'Attached file' : 'User message'),\n reply: getNextAssistantReply(messages, index),\n files: visibleFiles,\n hiddenFileCount: files.length - visibleFiles.length,\n },\n ];\n });\n","/** A user's turn and everything the run produced under it. */\nexport interface TurnGroup<T> {\n key: string;\n entries: T[];\n /** Opened by a user message, so it reserves room and anchors the scroll. */\n opensTurn: boolean;\n}\n\nexport interface TurnRules<T> {\n key: (entry: T) => string;\n opensTurn: (entry: T) => boolean;\n /** A marker that belongs above the turn it introduces but arrives after the previous one, so it moves down. */\n introduces?: (entry: T) => boolean;\n}\n\nconst introducesNothing = () => false;\n\n/**\n * Cuts a timeline where the reader's attention moves: a user message starts a turn,\n * and everything the run answers with belongs to it. Entries before the first opener\n * form a turn of their own that opens nothing.\n */\nexport function groupTurns<T>(entries: T[], { key, opensTurn, introduces = introducesNothing }: TurnRules<T>) {\n const groups: TurnGroup<T>[] = [];\n\n for (const entry of entries) {\n const opens = opensTurn(entry);\n const previous = groups.at(-1);\n if (!opens && previous) {\n previous.entries.push(entry);\n continue;\n }\n const last = previous?.entries.at(-1);\n const introduction = previous && last !== undefined && introduces(last) ? previous.entries.splice(-1) : [];\n if (previous?.entries.length === 0) groups.pop();\n groups.push({ key: key(entry), entries: [...introduction, entry], opensTurn: opens });\n }\n\n return groups;\n}\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_Tree = require("../Tree-Caz4FTCU.cjs");
2
+ const require_Tree = require("../Tree-kgLG4IbP.cjs");
3
3
  exports.Tree = require_Tree.Tree;
@@ -1 +1 @@
1
- export { t as Tree } from "../Tree-od43gLMO.js";
1
+ export { t as Tree } from "../Tree-D1_VJClB.js";
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_Workflow = require("../Workflow-XR5L-3cJ.cjs");
2
+ const require_Workflow = require("../Workflow-DIfTVqZs.cjs");
3
3
  exports.BADGE_COLORS = require_Workflow.BADGE_COLORS;
4
4
  exports.BADGE_ICONS = require_Workflow.BADGE_ICONS;
5
5
  exports.WORKFLOW_BOUNDARY_NODE_TYPE = require_Workflow.WORKFLOW_BOUNDARY_NODE_TYPE;
@@ -1 +1 @@
1
- export { _ as BADGE_COLORS, v as BADGE_ICONS, u as WORKFLOW_BOUNDARY_NODE_TYPE, d as WORKFLOW_DATA_EDGE_TYPE, l as WorkflowBoundaryNode, w as WorkflowCanvasInsetContext, g as WorkflowClock, p as WorkflowCodeContent, r as WorkflowConditionCard, h as WorkflowConditionCardView, c as WorkflowDataEdgeView, a as WorkflowDebugControls, f as WorkflowEdgeDataButton, s as WorkflowGraphCanvas, i as WorkflowGraphPlaceholder, o as WorkflowNodeFrame, t as WorkflowStepAction, n as WorkflowStepActions, m as WorkflowStepCardView, C as WorkflowTypeBadge, y as getConditionIconAndColor, b as getConditionIndicator, x as getNodeBadgeInfo, S as getNodeIndicators, T as workflowFitOptions } from "../Workflow-mIbUYdv0.js";
1
+ export { _ as BADGE_COLORS, v as BADGE_ICONS, u as WORKFLOW_BOUNDARY_NODE_TYPE, d as WORKFLOW_DATA_EDGE_TYPE, l as WorkflowBoundaryNode, w as WorkflowCanvasInsetContext, g as WorkflowClock, p as WorkflowCodeContent, r as WorkflowConditionCard, h as WorkflowConditionCardView, c as WorkflowDataEdgeView, a as WorkflowDebugControls, f as WorkflowEdgeDataButton, s as WorkflowGraphCanvas, i as WorkflowGraphPlaceholder, o as WorkflowNodeFrame, t as WorkflowStepAction, n as WorkflowStepActions, m as WorkflowStepCardView, C as WorkflowTypeBadge, y as getConditionIconAndColor, b as getConditionIndicator, x as getNodeBadgeInfo, S as getNodeIndicators, T as workflowFitOptions } from "../Workflow-CXRv3YXx.js";
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_activity = require("../../activity-BprmG6yH.cjs");
2
+ const require_activity = require("../../activity-Ciolopq8.cjs");
3
3
  exports.Activity = require_activity.Activity;
4
4
  exports.ActivityContent = require_activity.ActivityContent;
5
5
  exports.ActivityDetail = require_activity.ActivityDetail;
@@ -1 +1 @@
1
- export { s as Activity, c as ActivityContent, l as ActivityDetail, u as ActivityDisclosure, d as ActivityHeader, f as ActivityHeadline, p as ActivityIcon, m as ActivityItem, h as ActivityLabel, g as ActivityLeading, _ as ActivitySpacer, v as ActivitySummary, y as ActivityTrailing, b as ActivityTrigger, x as ActivityWorkingDirectory, o as NotificationActivity, n as ReasoningActivity, a as ReasoningText, t as SignalActivity, r as hasReasoningText, i as hasVisibleReasoning, S as useRelativePaths } from "../../activity-ClFChYfl.js";
1
+ export { s as Activity, c as ActivityContent, l as ActivityDetail, u as ActivityDisclosure, d as ActivityHeader, f as ActivityHeadline, p as ActivityIcon, m as ActivityItem, h as ActivityLabel, g as ActivityLeading, _ as ActivitySpacer, v as ActivitySummary, y as ActivityTrailing, b as ActivityTrigger, x as ActivityWorkingDirectory, o as NotificationActivity, n as ReasoningActivity, a as ReasoningText, t as SignalActivity, r as hasReasoningText, i as hasVisibleReasoning, S as useRelativePaths } from "../../activity-BH_eegMA.js";
@@ -2,7 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_Badge = require("../../Badge-DqaMg7Gy.cjs");
3
3
  const require_Button = require("../../Button-BfICfyxD.cjs");
4
4
  const require_components_CollapsibleBox = require("../CollapsibleBox.cjs.js");
5
- const require_MarkdownRenderer = require("../../MarkdownRenderer-CUYpmuPh.cjs");
5
+ const require_MarkdownRenderer = require("../../MarkdownRenderer-CDwlvw0Y.cjs");
6
6
  const require_Txt = require("../../Txt-_00wWxTd.cjs");
7
7
  const require_icons_Icon = require("../../icons/Icon.cjs.js");
8
8
  const require_hooks_use_copy_to_clipboard = require("../../hooks/use-copy-to-clipboard.cjs.js");
@@ -1,7 +1,7 @@
1
1
  import { t as Badge } from "../../Badge-C7NnqmMx.js";
2
2
  import { t as Button } from "../../Button-Bi7aXd_G.js";
3
3
  import { CollapsibleBox, useCollapsibleBox } from "../CollapsibleBox.es.js";
4
- import { t as MarkdownRenderer } from "../../MarkdownRenderer-CY8LGt-l.js";
4
+ import { t as MarkdownRenderer } from "../../MarkdownRenderer-BSGb65Ze.js";
5
5
  import { t as Txt } from "../../Txt-5efBsb2p.js";
6
6
  import { Icon } from "../../icons/Icon.es.js";
7
7
  import { useCopyToClipboard } from "../../hooks/use-copy-to-clipboard.es.js";
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_tool_approval = require("../../tool-approval-CguPaikn.cjs");
2
+ const require_tool_approval = require("../../tool-approval-C4WNL8VD.cjs");
3
3
  exports.ToolApproval = require_tool_approval.ToolApproval;
4
4
  exports.ToolApprovalActions = require_tool_approval.ToolApprovalActions;
5
5
  exports.ToolApprovalStatus = require_tool_approval.ToolApprovalStatus;
@@ -1 +1 @@
1
- export { t as ToolApproval, n as ToolApprovalActions, r as ToolApprovalStatus } from "../../tool-approval-Cjz0yAzw.js";
1
+ export { t as ToolApproval, n as ToolApprovalActions, r as ToolApprovalStatus } from "../../tool-approval-ZfL3-Vvi.js";
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_tool_call = require("../../tool-call-BqDI9mrY.cjs");
2
+ const require_tool_call = require("../../tool-call-C4TBpJ6Y.cjs");
3
3
  const require_tool_presentation = require("../../tool-presentation-DPp9h-n2.cjs");
4
4
  exports.TOOL_GROUP_MIN = require_tool_call.TOOL_GROUP_MIN;
5
5
  exports.ToolCallArguments = require_tool_call.ToolCallArguments;
@@ -1,3 +1,3 @@
1
- import { a as ToolCallBody, c as ToolCallOutput, d as ToolCallCommand, f as ToolCallMono, g as stripSerializedAnsi, h as stripAnsi, i as ToolCallExitStatus, l as ToolCallArguments, m as groupConsecutive, n as toolPhrases, o as toolCallHasBody, p as TOOL_GROUP_MIN, r as ToolCallGroup, s as toolCallResultText, t as ToolCallTime, u as ToolCallEdit } from "../../tool-call-ChJKYCfu.js";
1
+ import { a as ToolCallBody, c as ToolCallOutput, d as ToolCallCommand, f as ToolCallMono, g as stripSerializedAnsi, h as stripAnsi, i as ToolCallExitStatus, l as ToolCallArguments, m as groupConsecutive, n as toolPhrases, o as toolCallHasBody, p as TOOL_GROUP_MIN, r as ToolCallGroup, s as toolCallResultText, t as ToolCallTime, u as ToolCallEdit } from "../../tool-call-BLzYTI-x.js";
2
2
  import { a as stringifyToolValue, i as presentTool, n as hasToolArguments, o as toolEdit, r as isTaskTool, s as visibleToolArgumentsText, t as exitedWithFailure } from "../../tool-presentation-C2bYQ7gB.js";
3
3
  export { TOOL_GROUP_MIN, ToolCallArguments, ToolCallBody, ToolCallCommand, ToolCallEdit, ToolCallExitStatus, ToolCallGroup, ToolCallMono, ToolCallOutput, ToolCallTime, exitedWithFailure, groupConsecutive, hasToolArguments, isTaskTool, presentTool, stringifyToolValue, stripAnsi, stripSerializedAnsi, toolCallHasBody, toolCallResultText, toolEdit, toolPhrases, visibleToolArgumentsText };
@@ -4,7 +4,7 @@ const require_components_Field = require("./components/Field.cjs.js");
4
4
  const require_input = require("./input-BpnUsQSt.cjs");
5
5
  const require_Txt = require("./Txt-_00wWxTd.cjs");
6
6
  const require_buttons_group = require("./buttons-group-DM6_Kohs.cjs");
7
- const require_dropdown_menu = require("./dropdown-menu-Dx-jCOIv.cjs");
7
+ const require_dropdown_menu = require("./dropdown-menu-D3D8USIY.cjs");
8
8
  const require_popover = require("./popover-D9AfJmla.cjs");
9
9
  const require_utils = require("./utils-uDc1ofX1.cjs");
10
10
  let react = require("react");
@@ -374,4 +374,4 @@ Object.defineProperty(exports, "DateTimeRangePicker", {
374
374
  }
375
375
  });
376
376
 
377
- //# sourceMappingURL=date-time-range-picker-Bq-8IPtS.cjs.map
377
+ //# sourceMappingURL=date-time-range-picker-2a-wUBTk.cjs.map