@mastra/playground-ui 55.0.0-alpha.5 → 55.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (493) hide show
  1. package/dist/{Button-BsHGVRjh.cjs → Button-BJOVwaxp.cjs} +13 -12
  2. package/dist/Button-BJOVwaxp.cjs.map +1 -0
  3. package/dist/{Button-DsTY88Xz.js → Button-BVGwYwHT.js} +14 -13
  4. package/dist/Button-BVGwYwHT.js.map +1 -0
  5. package/dist/{Notice-B5khVt-8.js → Notice-CMZ86f1g.js} +2 -2
  6. package/dist/{Notice-B5khVt-8.js.map → Notice-CMZ86f1g.js.map} +1 -1
  7. package/dist/{Notice-BUSAcuH-.cjs → Notice-D0Mvqvr0.cjs} +2 -2
  8. package/dist/{Notice-BUSAcuH-.cjs.map → Notice-D0Mvqvr0.cjs.map} +1 -1
  9. package/dist/{SessionExpired-C4w2ai5-.cjs → SessionExpired-CAOgb-6E.cjs} +2 -2
  10. package/dist/{SessionExpired-C4w2ai5-.cjs.map → SessionExpired-CAOgb-6E.cjs.map} +1 -1
  11. package/dist/{SessionExpired-oy5tS_51.js → SessionExpired-DSPFseGA.js} +2 -2
  12. package/dist/{SessionExpired-oy5tS_51.js.map → SessionExpired-DSPFseGA.js.map} +1 -1
  13. package/dist/{ask-user-DWUWXbS7.cjs → ask-user-DQGe7ZTv.cjs} +3 -3
  14. package/dist/{ask-user-DWUWXbS7.cjs.map → ask-user-DQGe7ZTv.cjs.map} +1 -1
  15. package/dist/{ask-user-D7MeXylO.js → ask-user-Dh9YowL4.js} +3 -3
  16. package/dist/{ask-user-D7MeXylO.js.map → ask-user-Dh9YowL4.js.map} +1 -1
  17. package/dist/{buttons-group-B5TBWfs6.js → buttons-group-CHyXDQBp.js} +5 -5
  18. package/dist/buttons-group-CHyXDQBp.js.map +1 -0
  19. package/dist/{buttons-group-PqYxKznc.cjs → buttons-group-jq7kUVlX.cjs} +5 -5
  20. package/dist/buttons-group-jq7kUVlX.cjs.map +1 -0
  21. package/dist/{checkbox-pvYvwDUy.js → checkbox-CC39oYEv.js} +5 -5
  22. package/dist/checkbox-CC39oYEv.js.map +1 -0
  23. package/dist/{checkbox-BNOCksit.cjs → checkbox-DWXCTy8y.cjs} +6 -6
  24. package/dist/checkbox-DWXCTy8y.cjs.map +1 -0
  25. package/dist/{code-block-CyHjdW02.js → code-block-BdzrmA-p.js} +5 -5
  26. package/dist/{code-block-CyHjdW02.js.map → code-block-BdzrmA-p.js.map} +1 -1
  27. package/dist/{code-block-I7b2Wt_Y.cjs → code-block-D1RequlX.cjs} +5 -5
  28. package/dist/{code-block-I7b2Wt_Y.cjs.map → code-block-D1RequlX.cjs.map} +1 -1
  29. package/dist/{code-editor-BeosH5J-.cjs → code-editor-CopnXVKT.cjs} +2 -2
  30. package/dist/{code-editor-BeosH5J-.cjs.map → code-editor-CopnXVKT.cjs.map} +1 -1
  31. package/dist/{code-editor-DPYAjQUV.js → code-editor-D7BftGSx.js} +2 -2
  32. package/dist/{code-editor-DPYAjQUV.js.map → code-editor-D7BftGSx.js.map} +1 -1
  33. package/dist/{combobox-Cg-7UwwL.cjs → combobox-DO__6QlF.cjs} +4 -5
  34. package/dist/combobox-DO__6QlF.cjs.map +1 -0
  35. package/dist/{combobox-8GoJaMs1.js → combobox-Ua6bvpM8.js} +3 -4
  36. package/dist/combobox-Ua6bvpM8.js.map +1 -0
  37. package/dist/{command-OXbUDxUu.js → command-CNKdcyyr.js} +4 -11
  38. package/dist/command-CNKdcyyr.js.map +1 -0
  39. package/dist/{command-C6cIgH_n.cjs → command-Cva4qgS9.cjs} +5 -12
  40. package/dist/command-Cva4qgS9.cjs.map +1 -0
  41. package/dist/components/AlertDialog.cjs.js +1 -1
  42. package/dist/components/AlertDialog.es.js +1 -1
  43. package/dist/components/Button.cjs.js +1 -1
  44. package/dist/components/Button.es.js +2 -2
  45. package/dist/components/ButtonsGroup.cjs.js +1 -1
  46. package/dist/components/ButtonsGroup.es.js +1 -1
  47. package/dist/components/Checkbox.cjs.js +1 -1
  48. package/dist/components/Checkbox.es.js +1 -1
  49. package/dist/components/ClampedText.cjs.js +1 -1
  50. package/dist/components/ClampedText.es.js +1 -1
  51. package/dist/components/CodeBlock.cjs.js +1 -1
  52. package/dist/components/CodeBlock.es.js +1 -1
  53. package/dist/components/CodeEditor.cjs.js +1 -1
  54. package/dist/components/CodeEditor.es.js +1 -1
  55. package/dist/components/Columns.cjs.js +1 -1
  56. package/dist/components/Columns.es.js +1 -1
  57. package/dist/components/Combobox.cjs.js +1 -1
  58. package/dist/components/Combobox.es.js +1 -1
  59. package/dist/components/Command.cjs.js +1 -1
  60. package/dist/components/Command.es.js +1 -1
  61. package/dist/components/CommandPalette.cjs.js +1 -1
  62. package/dist/components/CommandPalette.es.js +1 -1
  63. package/dist/components/Comment.cjs.js +2 -2
  64. package/dist/components/Comment.es.js +2 -2
  65. package/dist/components/CopyButton.cjs.js +1 -1
  66. package/dist/components/CopyButton.es.js +1 -1
  67. package/dist/components/DataCodeSection.cjs.js +1 -1
  68. package/dist/components/DataCodeSection.es.js +1 -1
  69. package/dist/components/DataDetailsPanel.cjs.js +3 -3
  70. package/dist/components/DataDetailsPanel.es.js +3 -3
  71. package/dist/components/DataFilter.cjs.js +2 -2
  72. package/dist/components/DataFilter.es.js +2 -2
  73. package/dist/components/DataList.cjs.js +4 -4
  74. package/dist/components/DataList.es.js +4 -4
  75. package/dist/components/DataPanel.cjs.js +1 -1
  76. package/dist/components/DataPanel.es.js +1 -1
  77. package/dist/components/DateRangeTimeline.cjs.js +1 -1
  78. package/dist/components/DateRangeTimeline.es.js +1 -1
  79. package/dist/components/DateTimePicker.cjs.js +3 -3
  80. package/dist/components/DateTimePicker.es.js +3 -3
  81. package/dist/components/DateTimeRangePicker.cjs.js +1 -1
  82. package/dist/components/DateTimeRangePicker.es.js +1 -1
  83. package/dist/components/Dialog.cjs.js +2 -2
  84. package/dist/components/Dialog.es.js +3 -3
  85. package/dist/components/Drawer.cjs.js +1 -1
  86. package/dist/components/Drawer.es.js +1 -1
  87. package/dist/components/DropdownMenu.cjs.js +1 -1
  88. package/dist/components/DropdownMenu.es.js +1 -1
  89. package/dist/components/EnvironmentVariablesEditor.cjs.js +4 -4
  90. package/dist/components/EnvironmentVariablesEditor.es.js +4 -4
  91. package/dist/components/ErrorBoundary.cjs.js +1 -1
  92. package/dist/components/ErrorBoundary.es.js +1 -1
  93. package/dist/components/FormFieldBlocks.cjs.js +3 -3
  94. package/dist/components/FormFieldBlocks.es.js +3 -3
  95. package/dist/components/Input.cjs.js +1 -1
  96. package/dist/components/Input.es.js +1 -1
  97. package/dist/components/InputGroup.cjs.js +1 -1
  98. package/dist/components/InputGroup.es.js +1 -1
  99. package/dist/components/IntegrationDialog.cjs.js +2 -2
  100. package/dist/components/IntegrationDialog.es.js +4 -4
  101. package/dist/components/IntegrationDialog.es.js.map +1 -1
  102. package/dist/components/JSONSchemaForm.cjs.js +4 -4
  103. package/dist/components/JSONSchemaForm.es.js +4 -4
  104. package/dist/components/ListSearch.cjs.js +1 -1
  105. package/dist/components/ListSearch.es.js +1 -1
  106. package/dist/components/LogsDataList.cjs.js +2 -4
  107. package/dist/components/LogsDataList.cjs.js.map +1 -1
  108. package/dist/components/LogsDataList.es.js +2 -4
  109. package/dist/components/LogsDataList.es.js.map +1 -1
  110. package/dist/components/MainSidebar.cjs.js +1 -1
  111. package/dist/components/MainSidebar.es.js +1 -1
  112. package/dist/components/MarkdownRenderer.cjs.js +1 -1
  113. package/dist/components/MarkdownRenderer.es.js +1 -1
  114. package/dist/components/Notice.cjs.js +1 -1
  115. package/dist/components/Notice.es.js +1 -1
  116. package/dist/components/PageHeader.cjs.js +1 -1
  117. package/dist/components/PageHeader.es.js +1 -1
  118. package/dist/components/PrevNextNav.cjs.js +2 -2
  119. package/dist/components/PrevNextNav.es.js +2 -2
  120. package/dist/components/PropertyFilter.cjs.js +3 -3
  121. package/dist/components/PropertyFilter.es.js +4 -4
  122. package/dist/components/RadioGroup.cjs.js +4 -4
  123. package/dist/components/RadioGroup.cjs.js.map +1 -1
  124. package/dist/components/RadioGroup.es.js +3 -3
  125. package/dist/components/RadioGroup.es.js.map +1 -1
  126. package/dist/components/RuleBuilder.cjs.js +3 -3
  127. package/dist/components/RuleBuilder.es.js +3 -3
  128. package/dist/components/Select.cjs.js +1 -1
  129. package/dist/components/Select.es.js +1 -1
  130. package/dist/components/SessionExpired.cjs.js +1 -1
  131. package/dist/components/SessionExpired.es.js +1 -1
  132. package/dist/components/SideDialog.cjs.js +4 -4
  133. package/dist/components/SideDialog.es.js +4 -4
  134. package/dist/components/Slider.cjs.js +1 -1
  135. package/dist/components/Slider.es.js +1 -1
  136. package/dist/components/Switch.cjs.js +1 -1
  137. package/dist/components/Switch.es.js +1 -1
  138. package/dist/components/Table.cjs.js +4 -3
  139. package/dist/components/Table.cjs.js.map +1 -1
  140. package/dist/components/Table.es.js +3 -2
  141. package/dist/components/Table.es.js.map +1 -1
  142. package/dist/components/Tabs.cjs.js +3 -3
  143. package/dist/components/Tabs.es.js +3 -3
  144. package/dist/components/Textarea.cjs.js +1 -1
  145. package/dist/components/Textarea.es.js +1 -1
  146. package/dist/components/ThreadList.cjs.js +1 -1
  147. package/dist/components/ThreadList.es.js +1 -1
  148. package/dist/components/Truncate.cjs.js +1 -1
  149. package/dist/components/Truncate.es.js +1 -1
  150. package/dist/components/Workflow.cjs.js +6 -6
  151. package/dist/components/Workflow.es.js +6 -6
  152. package/dist/components/ai/ask-user.cjs.js +1 -1
  153. package/dist/components/ai/ask-user.es.js +1 -1
  154. package/dist/components/ai/plan.cjs.js +2 -2
  155. package/dist/components/ai/plan.es.js +2 -2
  156. package/dist/components/ai/tool-call.cjs.js +16 -6
  157. package/dist/components/ai/tool-call.cjs.js.map +1 -1
  158. package/dist/components/ai/tool-call.es.js +17 -7
  159. package/dist/components/ai/tool-call.es.js.map +1 -1
  160. package/dist/{copy-button-BW1CfolI.js → copy-button-ChUCFd-x.js} +2 -2
  161. package/dist/{copy-button-BW1CfolI.js.map → copy-button-ChUCFd-x.js.map} +1 -1
  162. package/dist/{copy-button-CC4JTC90.cjs → copy-button-zLZfswrj.cjs} +2 -2
  163. package/dist/{copy-button-CC4JTC90.cjs.map → copy-button-zLZfswrj.cjs.map} +1 -1
  164. package/dist/{data-code-section-BWaPQ6JT.cjs → data-code-section-BLvh46xK.cjs} +6 -6
  165. package/dist/{data-code-section-BWaPQ6JT.cjs.map → data-code-section-BLvh46xK.cjs.map} +1 -1
  166. package/dist/{data-code-section-EmqjYVh1.js → data-code-section-DSelBhmP.js} +6 -6
  167. package/dist/{data-code-section-EmqjYVh1.js.map → data-code-section-DSelBhmP.js.map} +1 -1
  168. package/dist/{data-list-BSezaRoI.cjs → data-list-4_cVlINT.cjs} +3 -3
  169. package/dist/{data-list-BSezaRoI.cjs.map → data-list-4_cVlINT.cjs.map} +1 -1
  170. package/dist/{data-list-DJ7DgVuH.js → data-list-Bm70XKg_.js} +3 -3
  171. package/dist/{data-list-DJ7DgVuH.js.map → data-list-Bm70XKg_.js.map} +1 -1
  172. package/dist/{data-list-skeleton-BiletsX0.cjs → data-list-skeleton-B7flrjdA.cjs} +2 -2
  173. package/dist/{data-list-skeleton-BiletsX0.cjs.map → data-list-skeleton-B7flrjdA.cjs.map} +1 -1
  174. package/dist/{data-list-skeleton-QvifQhmC.js → data-list-skeleton-BJVs8rDE.js} +2 -2
  175. package/dist/{data-list-skeleton-QvifQhmC.js.map → data-list-skeleton-BJVs8rDE.js.map} +1 -1
  176. package/dist/{data-list-top-0BrqoQba.js → data-list-top-BeUxfGy2.js} +2 -2
  177. package/dist/{data-list-top-0BrqoQba.js.map → data-list-top-BeUxfGy2.js.map} +1 -1
  178. package/dist/{data-list-top-D8r8M8JA.cjs → data-list-top-D9zFnKEi.cjs} +2 -2
  179. package/dist/{data-list-top-D8r8M8JA.cjs.map → data-list-top-D9zFnKEi.cjs.map} +1 -1
  180. package/dist/{data-panel-C3FczohB.js → data-panel-5iuux0r_.js} +4 -4
  181. package/dist/{data-panel-C3FczohB.js.map → data-panel-5iuux0r_.js.map} +1 -1
  182. package/dist/{data-panel-KjzePv5_.cjs → data-panel-tSErqolu.cjs} +4 -4
  183. package/dist/{data-panel-KjzePv5_.cjs.map → data-panel-tSErqolu.cjs.map} +1 -1
  184. package/dist/{date-time-range-picker-DU4ynAjj.cjs → date-time-range-picker-C0J7p78l.cjs} +4 -4
  185. package/dist/{date-time-range-picker-DU4ynAjj.cjs.map → date-time-range-picker-C0J7p78l.cjs.map} +1 -1
  186. package/dist/{date-time-range-picker-CMzJwQ_s.js → date-time-range-picker-CcoU5-2_.js} +4 -4
  187. package/dist/{date-time-range-picker-CMzJwQ_s.js.map → date-time-range-picker-CcoU5-2_.js.map} +1 -1
  188. package/dist/{dialog-CUeeMxRo.cjs → dialog-B1DwyLJJ.cjs} +10 -26
  189. package/dist/dialog-B1DwyLJJ.cjs.map +1 -0
  190. package/dist/{dialog-KvPRmHPW.js → dialog-Dfrt_JCJ.js} +10 -26
  191. package/dist/dialog-Dfrt_JCJ.js.map +1 -0
  192. package/dist/domains/chat/attachments/attachment-preview-dialog.cjs.js +2 -2
  193. package/dist/domains/chat/attachments/attachment-preview-dialog.es.js +2 -2
  194. package/dist/domains/chat/components/badge-wrapper.cjs.js +1 -1
  195. package/dist/domains/chat/components/badge-wrapper.es.js +1 -1
  196. package/dist/domains/chat/components/network-choice-metadata-dialog.cjs.js +3 -3
  197. package/dist/domains/chat/components/network-choice-metadata-dialog.es.js +3 -3
  198. package/dist/domains/chat/context/chat-context.cjs.js.map +1 -1
  199. package/dist/domains/chat/context/chat-context.es.js.map +1 -1
  200. package/dist/domains/chat/messages/notification-signal-notice.cjs.js +1 -1
  201. package/dist/domains/chat/messages/notification-signal-notice.es.js +1 -1
  202. package/dist/domains/chat/messages/renderers/assistant-text-part-renderer.cjs.js +9 -1
  203. package/dist/domains/chat/messages/renderers/assistant-text-part-renderer.cjs.js.map +1 -1
  204. package/dist/domains/chat/messages/renderers/assistant-text-part-renderer.es.js +9 -1
  205. package/dist/domains/chat/messages/renderers/assistant-text-part-renderer.es.js.map +1 -1
  206. package/dist/domains/chat/messages/renderers/message-text.cjs.js +12 -4
  207. package/dist/domains/chat/messages/renderers/message-text.cjs.js.map +1 -1
  208. package/dist/domains/chat/messages/renderers/message-text.es.js +12 -4
  209. package/dist/domains/chat/messages/renderers/message-text.es.js.map +1 -1
  210. package/dist/domains/chat/messages/renderers/status-renderers.cjs.js +1 -1
  211. package/dist/domains/chat/messages/renderers/status-renderers.es.js +1 -1
  212. package/dist/domains/chat/messages/renderers/tool-part.cjs.js +1 -1
  213. package/dist/domains/chat/messages/renderers/tool-part.cjs.js.map +1 -1
  214. package/dist/domains/chat/messages/renderers/tool-part.es.js +1 -1
  215. package/dist/domains/chat/messages/renderers/tool-part.es.js.map +1 -1
  216. package/dist/domains/chat/messages/tripwire-notice.cjs.js +1 -1
  217. package/dist/domains/chat/messages/tripwire-notice.es.js +1 -1
  218. package/dist/domains/chat/tools/badges/ask-user-badge.cjs.js +1 -1
  219. package/dist/domains/chat/tools/badges/ask-user-badge.es.js +1 -1
  220. package/dist/domains/chat/tools/badges/code-mode-badge.cjs.js +2 -2
  221. package/dist/domains/chat/tools/badges/code-mode-badge.es.js +2 -2
  222. package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +1 -1
  223. package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +1 -1
  224. package/dist/domains/chat/tools/badges/observation-renderer.cjs.js +1 -1
  225. package/dist/domains/chat/tools/badges/observation-renderer.es.js +1 -1
  226. package/dist/domains/chat/tools/badges/tool-approval-buttons.cjs.js +1 -1
  227. package/dist/domains/chat/tools/badges/tool-approval-buttons.es.js +1 -1
  228. package/dist/domains/logs/components/log-details-view.cjs.js +3 -3
  229. package/dist/domains/logs/components/log-details-view.es.js +3 -3
  230. package/dist/domains/logs/components/logs-error-content.cjs.js +1 -1
  231. package/dist/domains/logs/components/logs-error-content.es.js +1 -1
  232. package/dist/domains/logs/components/logs-list-view.cjs.js +2 -2
  233. package/dist/domains/logs/components/logs-list-view.es.js +2 -2
  234. package/dist/domains/logs/components/logs-toolbar.cjs.js +1 -1
  235. package/dist/domains/logs/components/logs-toolbar.es.js +1 -1
  236. package/dist/domains/logs/components/no-logs-info.cjs.js +1 -1
  237. package/dist/domains/logs/components/no-logs-info.es.js +1 -1
  238. package/dist/domains/memory/components/flame-graph.cjs.js +1 -1
  239. package/dist/domains/memory/components/flame-graph.es.js +1 -1
  240. package/dist/domains/memory/components/memory-studio-panel.cjs.js +1 -1
  241. package/dist/domains/memory/components/memory-studio-panel.es.js +1 -1
  242. package/dist/domains/memory/components/observation-detail-view.cjs.js +1 -1
  243. package/dist/domains/memory/components/observation-detail-view.es.js +1 -1
  244. package/dist/domains/metrics/components/card-action-buttons.cjs.js +1 -1
  245. package/dist/domains/metrics/components/card-action-buttons.es.js +1 -1
  246. package/dist/domains/metrics/components/date-range-selector.cjs.js +1 -1
  247. package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
  248. package/dist/domains/metrics/components/latency-card-view.cjs.js +3 -3
  249. package/dist/domains/metrics/components/latency-card-view.es.js +3 -3
  250. package/dist/domains/metrics/components/memory-card-view.cjs.js +4 -4
  251. package/dist/domains/metrics/components/memory-card-view.es.js +4 -4
  252. package/dist/domains/metrics/components/model-usage-cost-card-view.cjs.js +1 -1
  253. package/dist/domains/metrics/components/model-usage-cost-card-view.es.js +1 -1
  254. package/dist/domains/metrics/components/scores-card-view.cjs.js +4 -4
  255. package/dist/domains/metrics/components/scores-card-view.es.js +4 -4
  256. package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js +3 -3
  257. package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js +3 -3
  258. package/dist/domains/metrics/components/token-usage-timeline-card-view.cjs.js +3 -3
  259. package/dist/domains/metrics/components/token-usage-timeline-card-view.es.js +3 -3
  260. package/dist/domains/metrics/components/traces-volume-card-view.cjs.js +3 -3
  261. package/dist/domains/metrics/components/traces-volume-card-view.es.js +3 -3
  262. package/dist/domains/traces/components/span-data-panel-view.cjs.js +6 -6
  263. package/dist/domains/traces/components/span-data-panel-view.es.js +6 -6
  264. package/dist/domains/traces/components/thread-trace/thread-trace-details.cjs.js +4 -4
  265. package/dist/domains/traces/components/thread-trace/thread-trace-details.es.js +4 -4
  266. package/dist/domains/traces/components/thread-trace/thread-trace-spans-tab.cjs.js +2 -2
  267. package/dist/domains/traces/components/thread-trace/thread-trace-spans-tab.es.js +2 -2
  268. package/dist/domains/traces/components/trace-columns-menu.cjs.js +4 -4
  269. package/dist/domains/traces/components/trace-columns-menu.es.js +4 -4
  270. package/dist/domains/traces/components/trace-data-panel-view.cjs.js +9 -9
  271. package/dist/domains/traces/components/trace-data-panel-view.es.js +9 -9
  272. package/dist/domains/traces/components/trace-id-button.cjs.js +1 -1
  273. package/dist/domains/traces/components/trace-id-button.es.js +1 -1
  274. package/dist/domains/traces/components/traces-error-content.cjs.js +1 -1
  275. package/dist/domains/traces/components/traces-error-content.es.js +1 -1
  276. package/dist/domains/traces/components/traces-list-mode-toggle.cjs.js +2 -2
  277. package/dist/domains/traces/components/traces-list-mode-toggle.es.js +2 -2
  278. package/dist/domains/traces/components/traces-list-view.cjs.js +3 -3
  279. package/dist/domains/traces/components/traces-list-view.es.js +3 -3
  280. package/dist/domains/traces/components/traces-toolbar.cjs.js +1 -1
  281. package/dist/domains/traces/components/traces-toolbar.es.js +1 -1
  282. package/dist/{drawer-BXOkhFYI.cjs → drawer-Bq7j_MiM.cjs} +2 -2
  283. package/dist/{drawer-BXOkhFYI.cjs.map → drawer-Bq7j_MiM.cjs.map} +1 -1
  284. package/dist/{drawer-DUhKiF6i.js → drawer-D1m2faHU.js} +2 -2
  285. package/dist/{drawer-DUhKiF6i.js.map → drawer-D1m2faHU.js.map} +1 -1
  286. package/dist/{dropdown-menu-Bj9vR0Md.cjs → dropdown-menu-Bfh5ROWe.cjs} +6 -5
  287. package/dist/dropdown-menu-Bfh5ROWe.cjs.map +1 -0
  288. package/dist/{dropdown-menu-GAD50kMK.js → dropdown-menu-C853KwJJ.js} +5 -4
  289. package/dist/dropdown-menu-C853KwJJ.js.map +1 -0
  290. package/dist/ee/signals/components/entity-index-list.cjs.js +1 -3
  291. package/dist/ee/signals/components/entity-index-list.cjs.js.map +1 -1
  292. package/dist/ee/signals/components/entity-index-list.es.js +1 -3
  293. package/dist/ee/signals/components/entity-index-list.es.js.map +1 -1
  294. package/dist/ee/signals/components/signals-empty-state.cjs.js +1 -1
  295. package/dist/ee/signals/components/signals-empty-state.es.js +1 -1
  296. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +6 -7
  297. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js.map +1 -1
  298. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +6 -7
  299. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js.map +1 -1
  300. package/dist/ee/signals/examples-pager.cjs.js +1 -1
  301. package/dist/ee/signals/examples-pager.es.js +1 -1
  302. package/dist/ee/signals/noise-detail-panel.cjs.js +1 -1
  303. package/dist/ee/signals/noise-detail-panel.es.js +1 -1
  304. package/dist/ee/signals/sankey-signals.cjs.js +1 -1
  305. package/dist/ee/signals/sankey-signals.es.js +1 -1
  306. package/dist/ee/signals/settings/signal-definition-form-dialog.cjs.js +4 -4
  307. package/dist/ee/signals/settings/signal-definition-form-dialog.es.js +4 -4
  308. package/dist/ee/signals/settings/trace-signal-settings.cjs.js +3 -3
  309. package/dist/ee/signals/settings/trace-signal-settings.es.js +3 -3
  310. package/dist/ee/signals/signals-error-state.cjs.js +1 -1
  311. package/dist/ee/signals/signals-error-state.es.js +1 -1
  312. package/dist/ee/signals/snapshot-timeline.cjs.js +1 -1
  313. package/dist/ee/signals/snapshot-timeline.es.js +1 -1
  314. package/dist/ee/signals/theme-detail-panel.cjs.js +1 -1
  315. package/dist/ee/signals/theme-detail-panel.es.js +1 -1
  316. package/dist/ee/signals/theme-filter-banner.cjs.js +1 -1
  317. package/dist/ee/signals/theme-filter-banner.es.js +1 -1
  318. package/dist/ee/signals/trace-insight-view.cjs.js +1 -1
  319. package/dist/ee/signals/trace-insight-view.es.js +1 -1
  320. package/dist/ee/signals/view-mode-tab.cjs.js +1 -1
  321. package/dist/ee/signals/view-mode-tab.es.js +1 -1
  322. package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +3 -3
  323. package/dist/ee/topics/components/topic-trace-summary-list.es.js +3 -3
  324. package/dist/hooks/use-local-storage-state.cjs.js +35 -0
  325. package/dist/hooks/use-local-storage-state.cjs.js.map +1 -0
  326. package/dist/hooks/use-local-storage-state.d.ts +2 -0
  327. package/dist/hooks/use-local-storage-state.es.js +31 -0
  328. package/dist/hooks/use-local-storage-state.es.js.map +1 -0
  329. package/dist/{input-BXl_-87K.cjs → input-D3SUXvgI.cjs} +9 -10
  330. package/dist/input-D3SUXvgI.cjs.map +1 -0
  331. package/dist/{input-KNga7Y7g.js → input-DinpgQXj.js} +8 -9
  332. package/dist/input-DinpgQXj.js.map +1 -0
  333. package/dist/{input-group-BW3PBfmX.cjs → input-group-CBuqhxnJ.cjs} +30 -11
  334. package/dist/input-group-CBuqhxnJ.cjs.map +1 -0
  335. package/dist/{input-group-CC3FsOEL.js → input-group-Dv1YsFDZ.js} +30 -11
  336. package/dist/input-group-Dv1YsFDZ.js.map +1 -0
  337. package/dist/layout/tabbed-container.cjs.js +6 -6
  338. package/dist/layout/tabbed-container.es.js +6 -6
  339. package/dist/{list-search-D_Q34jSU.cjs → list-search-BwcO9d9M.cjs} +2 -2
  340. package/dist/{list-search-D_Q34jSU.cjs.map → list-search-BwcO9d9M.cjs.map} +1 -1
  341. package/dist/{list-search-C9wdyGVJ.js → list-search-C8FBcDpo.js} +2 -2
  342. package/dist/{list-search-C9wdyGVJ.js.map → list-search-C8FBcDpo.js.map} +1 -1
  343. package/dist/{logs-data-list-CBCCnmWl.cjs → logs-data-list-B0hzHq0b.cjs} +2 -2
  344. package/dist/{logs-data-list-CBCCnmWl.cjs.map → logs-data-list-B0hzHq0b.cjs.map} +1 -1
  345. package/dist/{logs-data-list-BEC39Y_v.js → logs-data-list-CWu83qI7.js} +2 -2
  346. package/dist/{logs-data-list-BEC39Y_v.js.map → logs-data-list-CWu83qI7.js.map} +1 -1
  347. package/dist/{markdown-renderer-Wmdi_oR8.js → markdown-renderer-Dp1fJwUB.js} +175 -8
  348. package/dist/markdown-renderer-Dp1fJwUB.js.map +1 -0
  349. package/dist/{markdown-renderer-Ds3PaLdR.cjs → markdown-renderer-hBiN_N_-.cjs} +174 -7
  350. package/dist/markdown-renderer-hBiN_N_-.cjs.map +1 -0
  351. package/dist/new/layout/app-shell.cjs.js +53 -0
  352. package/dist/new/layout/app-shell.cjs.js.map +1 -0
  353. package/dist/new/layout/app-shell.d.ts +2 -0
  354. package/dist/new/layout/app-shell.es.js +49 -0
  355. package/dist/new/layout/app-shell.es.js.map +1 -0
  356. package/dist/new/layout/page-header.cjs.js +1 -1
  357. package/dist/new/layout/page-header.es.js +1 -1
  358. package/dist/{page-header-ComQfwIQ.js → page-header-CGRV1f_f.js} +11 -7
  359. package/dist/page-header-CGRV1f_f.js.map +1 -0
  360. package/dist/{page-header-hRxyKAlN.cjs → page-header-CTdBcOWK.cjs} +11 -7
  361. package/dist/page-header-CTdBcOWK.cjs.map +1 -0
  362. package/dist/primitives/control-size.cjs.js +1 -1
  363. package/dist/primitives/control-size.cjs.js.map +1 -1
  364. package/dist/primitives/control-size.es.js +1 -1
  365. package/dist/primitives/control-size.es.js.map +1 -1
  366. package/dist/primitives/form-element.cjs.js +8 -21
  367. package/dist/primitives/form-element.cjs.js.map +1 -1
  368. package/dist/primitives/form-element.es.js +8 -20
  369. package/dist/primitives/form-element.es.js.map +1 -1
  370. package/dist/primitives/menu-item.cjs.js +7 -10
  371. package/dist/primitives/menu-item.cjs.js.map +1 -1
  372. package/dist/primitives/menu-item.es.js +7 -10
  373. package/dist/primitives/menu-item.es.js.map +1 -1
  374. package/dist/primitives/trigger-button.cjs.js +1 -1
  375. package/dist/primitives/trigger-button.es.js +1 -1
  376. package/dist/{property-filter-applied-CTcWC5Hv.js → property-filter-applied-CF-InSu-.js} +5 -5
  377. package/dist/{property-filter-applied-CTcWC5Hv.js.map → property-filter-applied-CF-InSu-.js.map} +1 -1
  378. package/dist/{property-filter-applied-DCffRXYU.cjs → property-filter-applied-D35zWa7S.cjs} +5 -5
  379. package/dist/{property-filter-applied-DCffRXYU.cjs.map → property-filter-applied-D35zWa7S.cjs.map} +1 -1
  380. package/dist/resize/panel-drawer.cjs.js +1 -1
  381. package/dist/resize/panel-drawer.es.js +1 -1
  382. package/dist/{search-field-block-BH_zDJIt.js → search-field-block-DhgD7NhZ.js} +3 -3
  383. package/dist/{search-field-block-BH_zDJIt.js.map → search-field-block-DhgD7NhZ.js.map} +1 -1
  384. package/dist/{search-field-block-WP6PODTo.cjs → search-field-block-DnJYUEGi.cjs} +3 -3
  385. package/dist/{search-field-block-WP6PODTo.cjs.map → search-field-block-DnJYUEGi.cjs.map} +1 -1
  386. package/dist/{select-VqANzntV.js → select-3GcRJGtd.js} +5 -3
  387. package/dist/select-3GcRJGtd.js.map +1 -0
  388. package/dist/{select-Dhox-EJ2.cjs → select-4dVGVp0V.cjs} +6 -4
  389. package/dist/select-4dVGVp0V.cjs.map +1 -0
  390. package/dist/{select-field-block-C3OTHj2n.js → select-field-block-BEyjBDiB.js} +2 -2
  391. package/dist/{select-field-block-C3OTHj2n.js.map → select-field-block-BEyjBDiB.js.map} +1 -1
  392. package/dist/{select-field-block-DBv-cFoz.cjs → select-field-block-By8NfJoe.cjs} +2 -2
  393. package/dist/{select-field-block-DBv-cFoz.cjs.map → select-field-block-By8NfJoe.cjs.map} +1 -1
  394. package/dist/{slider-Cx_ZwlQU.js → slider-AfRJ3a4W.js} +2 -7
  395. package/dist/slider-AfRJ3a4W.js.map +1 -0
  396. package/dist/{slider-DyNnS3a7.cjs → slider-BXYQmaQy.cjs} +3 -8
  397. package/dist/slider-BXYQmaQy.cjs.map +1 -0
  398. package/dist/src/domains/chat/context/chat-context.d.ts +2 -0
  399. package/dist/src/domains/chat/messages/renderers/message-text.d.ts +2 -1
  400. package/dist/src/domains/chat/stories/messages.stories.d.ts +1 -1
  401. package/dist/src/ds/components/Button/Button.d.ts +1 -1
  402. package/dist/src/ds/components/Checkbox/checkbox.d.ts +10 -1
  403. package/dist/src/ds/components/Combobox/combobox.d.ts +3 -2
  404. package/dist/src/ds/components/DropdownMenu/dropdown-menu.d.ts +9 -1
  405. package/dist/src/ds/components/DropdownMenu/dropdown-menu.stories.d.ts +1 -0
  406. package/dist/src/ds/components/MarkdownRenderer/markdown-renderer.d.ts +3 -1
  407. package/dist/src/ds/components/MarkdownRenderer/markdown-table.d.ts +3 -0
  408. package/dist/src/ds/components/MarkdownRenderer/table-csv.d.ts +2 -0
  409. package/dist/src/ds/components/MarkdownRenderer/table-markdown.d.ts +5 -0
  410. package/dist/src/ds/components/Select/select.d.ts +24 -2
  411. package/dist/src/ds/components/Slider/slider.d.ts +1 -1
  412. package/dist/src/ds/components/Table/Table.d.ts +1 -1
  413. package/dist/src/ds/components/ai/tool-call/tool-call-group.d.ts +2 -0
  414. package/dist/src/ds/new/layout/app-shell/app-shell.d.ts +13 -0
  415. package/dist/src/ds/new/layout/app-shell/app-shell.stories.d.ts +22 -0
  416. package/dist/src/ds/new/layout/app-shell/index.d.ts +1 -0
  417. package/dist/src/ds/primitives/form-element.d.ts +5 -6
  418. package/dist/src/ds/primitives/menu-item.d.ts +1 -0
  419. package/dist/src/hooks/use-local-storage-state.d.ts +10 -0
  420. package/dist/style.css +144 -35
  421. package/dist/{switch-CRgSw0D1.js → switch-A-j7GDcX.js} +3 -4
  422. package/dist/switch-A-j7GDcX.js.map +1 -0
  423. package/dist/{switch-CsnP5CNn.cjs → switch-BROLIeGF.cjs} +3 -4
  424. package/dist/switch-BROLIeGF.cjs.map +1 -0
  425. package/dist/{tabs-content-Bf28p8Au.cjs → tabs-content-CV7YrtD1.cjs} +4 -4
  426. package/dist/tabs-content-CV7YrtD1.cjs.map +1 -0
  427. package/dist/{tabs-content-vrO_NM42.js → tabs-content-CW6RtAEV.js} +3 -3
  428. package/dist/tabs-content-CW6RtAEV.js.map +1 -0
  429. package/dist/{tabs-root-B4G-ywup.js → tabs-root-BAy8m6GO.js} +2 -2
  430. package/dist/{tabs-root-B4G-ywup.js.map → tabs-root-BAy8m6GO.js.map} +1 -1
  431. package/dist/{tabs-root-BAJYWOrk.cjs → tabs-root-Dw7gHsnZ.cjs} +2 -2
  432. package/dist/{tabs-root-BAJYWOrk.cjs.map → tabs-root-Dw7gHsnZ.cjs.map} +1 -1
  433. package/dist/{tabs-tab-Br-jck-B.cjs → tabs-tab-CP-kzlvB.cjs} +5 -6
  434. package/dist/tabs-tab-CP-kzlvB.cjs.map +1 -0
  435. package/dist/{tabs-tab-CvlCl9kD.js → tabs-tab-K5mQhs7r.js} +6 -7
  436. package/dist/tabs-tab-K5mQhs7r.js.map +1 -0
  437. package/dist/{text-field-block-BVhQGWYw.js → text-field-block-CUN9gL4j.js} +2 -2
  438. package/dist/{text-field-block-BVhQGWYw.js.map → text-field-block-CUN9gL4j.js.map} +1 -1
  439. package/dist/{text-field-block-DBEXulUE.cjs → text-field-block-WuwrSNEX.cjs} +2 -2
  440. package/dist/{text-field-block-DBEXulUE.cjs.map → text-field-block-WuwrSNEX.cjs.map} +1 -1
  441. package/dist/{textarea-BcaFNmji.js → textarea-BCVPeJzr.js} +7 -3
  442. package/dist/textarea-BCVPeJzr.js.map +1 -0
  443. package/dist/{textarea-C_saJE6T.cjs → textarea-D9XsLoN5.cjs} +8 -4
  444. package/dist/textarea-D9XsLoN5.cjs.map +1 -0
  445. package/dist/{time-picker-CMUki2R2.cjs → time-picker-BKpmCbXS.cjs} +2 -2
  446. package/dist/{time-picker-CMUki2R2.cjs.map → time-picker-BKpmCbXS.cjs.map} +1 -1
  447. package/dist/{time-picker-CfdcBPyS.js → time-picker-SgrQvt0V.js} +2 -2
  448. package/dist/{time-picker-CfdcBPyS.js.map → time-picker-SgrQvt0V.js.map} +1 -1
  449. package/dist/{tool-call-DfLe6Hu5.js → tool-call-BlKbOYRH.js} +2 -2
  450. package/dist/{tool-call-DfLe6Hu5.js.map → tool-call-BlKbOYRH.js.map} +1 -1
  451. package/dist/{tool-call-Pi3V0LP3.cjs → tool-call-DVh_yWov.cjs} +2 -2
  452. package/dist/{tool-call-Pi3V0LP3.cjs.map → tool-call-DVh_yWov.cjs.map} +1 -1
  453. package/dist/{traces-data-list-BPrExzSX.cjs → traces-data-list-0WfYCKdc.cjs} +3 -3
  454. package/dist/{traces-data-list-BPrExzSX.cjs.map → traces-data-list-0WfYCKdc.cjs.map} +1 -1
  455. package/dist/{traces-data-list-CfW_M5yW.js → traces-data-list-BOiAOwYM.js} +3 -3
  456. package/dist/{traces-data-list-CfW_M5yW.js.map → traces-data-list-BOiAOwYM.js.map} +1 -1
  457. package/package.json +18 -8
  458. package/theme.css +12 -0
  459. package/dist/Button-BsHGVRjh.cjs.map +0 -1
  460. package/dist/Button-DsTY88Xz.js.map +0 -1
  461. package/dist/buttons-group-B5TBWfs6.js.map +0 -1
  462. package/dist/buttons-group-PqYxKznc.cjs.map +0 -1
  463. package/dist/checkbox-BNOCksit.cjs.map +0 -1
  464. package/dist/checkbox-pvYvwDUy.js.map +0 -1
  465. package/dist/combobox-8GoJaMs1.js.map +0 -1
  466. package/dist/combobox-Cg-7UwwL.cjs.map +0 -1
  467. package/dist/command-C6cIgH_n.cjs.map +0 -1
  468. package/dist/command-OXbUDxUu.js.map +0 -1
  469. package/dist/dialog-CUeeMxRo.cjs.map +0 -1
  470. package/dist/dialog-KvPRmHPW.js.map +0 -1
  471. package/dist/dropdown-menu-Bj9vR0Md.cjs.map +0 -1
  472. package/dist/dropdown-menu-GAD50kMK.js.map +0 -1
  473. package/dist/focus.css +0 -176
  474. package/dist/input-BXl_-87K.cjs.map +0 -1
  475. package/dist/input-KNga7Y7g.js.map +0 -1
  476. package/dist/input-group-BW3PBfmX.cjs.map +0 -1
  477. package/dist/input-group-CC3FsOEL.js.map +0 -1
  478. package/dist/markdown-renderer-Ds3PaLdR.cjs.map +0 -1
  479. package/dist/markdown-renderer-Wmdi_oR8.js.map +0 -1
  480. package/dist/page-header-ComQfwIQ.js.map +0 -1
  481. package/dist/page-header-hRxyKAlN.cjs.map +0 -1
  482. package/dist/select-Dhox-EJ2.cjs.map +0 -1
  483. package/dist/select-VqANzntV.js.map +0 -1
  484. package/dist/slider-Cx_ZwlQU.js.map +0 -1
  485. package/dist/slider-DyNnS3a7.cjs.map +0 -1
  486. package/dist/switch-CRgSw0D1.js.map +0 -1
  487. package/dist/switch-CsnP5CNn.cjs.map +0 -1
  488. package/dist/tabs-content-Bf28p8Au.cjs.map +0 -1
  489. package/dist/tabs-content-vrO_NM42.js.map +0 -1
  490. package/dist/tabs-tab-Br-jck-B.cjs.map +0 -1
  491. package/dist/tabs-tab-CvlCl9kD.js.map +0 -1
  492. package/dist/textarea-BcaFNmji.js.map +0 -1
  493. package/dist/textarea-C_saJE6T.cjs.map +0 -1
@@ -1,11 +1,18 @@
1
- import { jsx } from 'react/jsx-runtime';
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { useState, useRef, useEffect, memo, useMemo } from 'react';
3
3
  import Markdown from 'react-markdown';
4
4
  import remarkGfm from 'remark-gfm';
5
5
  import remend from 'remend';
6
6
  import { ARRIVING_CLASS, ARRIVING_MS } from './tokens.es.js';
7
7
  import { a as useWatched } from './use-watched-CG9KoWl3.js';
8
- import { C as CodeBlock } from './code-block-CyHjdW02.js';
8
+ import { CheckIcon, CopyIcon, ChevronDownIcon, DownloadIcon } from 'lucide-react';
9
+ import { B as Button } from './Button-BVGwYwHT.js';
10
+ import { B as ButtonsGroup } from './buttons-group-CHyXDQBp.js';
11
+ import { D as DropdownMenu } from './dropdown-menu-C853KwJJ.js';
12
+ import { useCopyToClipboard } from './hooks/use-copy-to-clipboard.es.js';
13
+ import { gfmToMarkdown } from 'mdast-util-gfm';
14
+ import { toMarkdown } from 'mdast-util-to-markdown';
15
+ import { C as CodeBlock } from './code-block-BdzrmA-p.js';
9
16
  import { c as cn } from './cn-ByEbywDh.js';
10
17
 
11
18
  import './markdown-renderer.css';const UNBROKEN = /* @__PURE__ */ new Set(["pre", "code"]);
@@ -94,6 +101,147 @@ function splitBlocks(markdown) {
94
101
  });
95
102
  }
96
103
 
104
+ function spreadsheetCell(value) {
105
+ const numeric = /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i.test(value.trim());
106
+ const formula = /^[\s\uFEFF]*[=+\-@=+-@]/u.test(value);
107
+ const controlPrefix = /^[\t\r\n]/.test(value);
108
+ const safe = controlPrefix || formula && !numeric ? `'${value}` : value;
109
+ return `"${safe.replaceAll('"', '""')}"`;
110
+ }
111
+ function tableToCsv(rows) {
112
+ return rows.map((row) => row.map(spreadsheetCell).join(",")).join("\r\n");
113
+ }
114
+ function downloadTableCsv(csv) {
115
+ const blob = new Blob(["\uFEFF", csv], { type: "text/csv;charset=utf-8" });
116
+ const url = URL.createObjectURL(blob);
117
+ const anchor = document.createElement("a");
118
+ anchor.href = url;
119
+ anchor.download = "table.csv";
120
+ document.body.appendChild(anchor);
121
+ anchor.click();
122
+ anchor.remove();
123
+ URL.revokeObjectURL(url);
124
+ }
125
+
126
+ function MarkdownTable({ node, children }) {
127
+ const markdown = node?.properties.tableMarkdown;
128
+ const csv = node?.properties.tableCsv;
129
+ const { isCopied, copyToClipboard } = useCopyToClipboard({ copyMessage: "Copied table markdown" });
130
+ return /* @__PURE__ */ jsxs("div", { className: "my-3 w-fit max-w-full min-w-0", children: [
131
+ /* @__PURE__ */ jsx("div", { className: "flex justify-end", children: /* @__PURE__ */ jsxs(ButtonsGroup, { spacing: "close", "aria-label": "Table actions", children: [
132
+ /* @__PURE__ */ jsxs(
133
+ Button,
134
+ {
135
+ type: "button",
136
+ size: "xs",
137
+ variant: "ghost",
138
+ disabled: typeof markdown !== "string",
139
+ onClick: () => {
140
+ if (typeof markdown === "string") copyToClipboard(markdown);
141
+ },
142
+ "aria-label": "Copy table as markdown",
143
+ children: [
144
+ isCopied ? /* @__PURE__ */ jsx(CheckIcon, {}) : /* @__PURE__ */ jsx(CopyIcon, {}),
145
+ isCopied ? "Copied!" : "Copy table as markdown"
146
+ ]
147
+ }
148
+ ),
149
+ /* @__PURE__ */ jsxs(DropdownMenu, { children: [
150
+ /* @__PURE__ */ jsx(
151
+ DropdownMenu.Trigger,
152
+ {
153
+ disabled: typeof csv !== "string",
154
+ render: /* @__PURE__ */ jsx(Button, { type: "button", size: "icon-xs", variant: "ghost", "aria-label": "More table options", children: /* @__PURE__ */ jsx(ChevronDownIcon, {}) })
155
+ }
156
+ ),
157
+ /* @__PURE__ */ jsx(DropdownMenu.Content, { align: "end", size: "sm", className: "w-max min-w-0", children: /* @__PURE__ */ jsxs(
158
+ DropdownMenu.Item,
159
+ {
160
+ size: "sm",
161
+ onClick: () => {
162
+ if (typeof csv === "string") downloadTableCsv(csv);
163
+ },
164
+ children: [
165
+ /* @__PURE__ */ jsx(DownloadIcon, {}),
166
+ "Download CSV"
167
+ ]
168
+ }
169
+ ) })
170
+ ] })
171
+ ] }) }),
172
+ /* @__PURE__ */ jsx("div", { className: "max-w-full overflow-x-auto", children: /* @__PURE__ */ jsx("table", { className: "table min-w-full", children }) })
173
+ ] });
174
+ }
175
+
176
+ function cellText(node) {
177
+ if (node.type === "footnoteReference") return `[^${node.label ?? node.identifier}]`;
178
+ if ("value" in node) return node.value;
179
+ if (node.type === "image" || node.type === "imageReference") return node.alt ?? "";
180
+ return "children" in node ? node.children.map(cellText).join("") : "";
181
+ }
182
+ function walk(node, visit) {
183
+ visit(node);
184
+ if ("children" in node) node.children.forEach((child) => walk(child, visit));
185
+ }
186
+ const SERIALIZE_OPTIONS = { extensions: [gfmToMarkdown()] };
187
+ function remarkTableMarkdown() {
188
+ return (tree, file) => {
189
+ const source = String(file.value);
190
+ const definitions = /* @__PURE__ */ new Map();
191
+ const tables = [];
192
+ walk(tree, (node) => {
193
+ if (node.type === "definition" || node.type === "footnoteDefinition") {
194
+ const key = `${node.type}:${node.identifier}`;
195
+ if (!definitions.has(key)) definitions.set(key, node);
196
+ }
197
+ if (node.type === "table") tables.push(node);
198
+ });
199
+ const lines = source.split(/\r\n|\r|\n/);
200
+ for (const table of tables) {
201
+ const header = table.children[0];
202
+ if (!header?.position) continue;
203
+ const rows = table.children.map((row) => {
204
+ const start = row.position?.start.offset;
205
+ const end = row.position?.end.offset;
206
+ return start === void 0 || end === void 0 ? void 0 : source.slice(start, end);
207
+ });
208
+ if (!rows.every((row) => row !== void 0)) continue;
209
+ const delimiter = lines[header.position.start.line]?.replace(/^[\t >]*/, "");
210
+ if (delimiter === void 0) continue;
211
+ const markdown = [rows[0], delimiter, ...rows.slice(1)];
212
+ const used = /* @__PURE__ */ new Set();
213
+ const collectReference = (node) => {
214
+ if (node.type === "linkReference" || node.type === "imageReference") {
215
+ used.add(`definition:${node.identifier}`);
216
+ } else if (node.type === "footnoteReference") {
217
+ used.add(`footnoteDefinition:${node.identifier}`);
218
+ }
219
+ };
220
+ walk(table, collectReference);
221
+ for (const key of used) {
222
+ const definition = definitions.get(key);
223
+ if (!definition) continue;
224
+ markdown.push("", toMarkdown(definition, SERIALIZE_OPTIONS).trimEnd());
225
+ walk(definition, collectReference);
226
+ }
227
+ const cells = table.children.map(
228
+ (row) => Array.from({ length: header.children.length }, (_, index) => {
229
+ const cell = row.children[index];
230
+ return cell ? cellText(cell) : "";
231
+ })
232
+ );
233
+ table.data = {
234
+ ...table.data,
235
+ hProperties: {
236
+ ...table.data?.hProperties,
237
+ tableMarkdown: markdown.join("\n"),
238
+ tableCsv: tableToCsv(cells)
239
+ }
240
+ };
241
+ }
242
+ };
243
+ }
244
+
97
245
  function useSettledWords(words, streaming) {
98
246
  const watched = useWatched();
99
247
  const [settled, setSettled] = useState(() => watched && streaming ? 0 : words);
@@ -122,12 +270,13 @@ const MarkdownRenderer = memo(function MarkdownRenderer2({
122
270
  children,
123
271
  className,
124
272
  externalLinkTarget = "tab",
125
- streaming = false
273
+ streaming = false,
274
+ tableActions = false
126
275
  }) {
127
276
  const shown = decodeEscapedNewlines(children);
128
277
  const blocks = useMemo(() => splitBlocks(shown), [shown]);
129
278
  const last = blocks.length - 1;
130
- const components = externalLinkTarget === "window" ? WINDOW_COMPONENTS : COMPONENTS;
279
+ const components = (tableActions ? TABLE_COMPONENTS : DEFAULT_COMPONENTS)[externalLinkTarget];
131
280
  const spans = wordSpans(blocks);
132
281
  const settled = useSettledWords(spans.at(-1)?.end ?? 0, streaming);
133
282
  const settledWords = (span) => !span || settled >= span.end ? void 0 : Math.max(0, settled - span.start);
@@ -138,7 +287,9 @@ const MarkdownRenderer = memo(function MarkdownRenderer2({
138
287
  {
139
288
  content: index === last ? mended : block,
140
289
  settledWords: settledWords(spans[index]),
141
- components
290
+ components,
291
+ streaming,
292
+ tableActions
142
293
  },
143
294
  index
144
295
  )) });
@@ -146,13 +297,23 @@ const MarkdownRenderer = memo(function MarkdownRenderer2({
146
297
  const MarkdownBlock = memo(function MarkdownBlock2({
147
298
  components,
148
299
  content,
149
- settledWords
300
+ settledWords,
301
+ streaming,
302
+ tableActions
150
303
  }) {
151
304
  const rehypePlugins = useMemo(
152
305
  () => settledWords === void 0 ? SETTLED : [rehypeArriving(settledWords)],
153
306
  [settledWords]
154
307
  );
155
- return /* @__PURE__ */ jsx(Markdown, { remarkPlugins: REMARK_PLUGINS, rehypePlugins, components, children: content });
308
+ return /* @__PURE__ */ jsx(
309
+ Markdown,
310
+ {
311
+ remarkPlugins: tableActions && !streaming ? COPYABLE_REMARK_PLUGINS : REMARK_PLUGINS,
312
+ rehypePlugins,
313
+ components,
314
+ children: content
315
+ }
316
+ );
156
317
  });
157
318
  const SETTLED = [];
158
319
  function wordSpans(blocks) {
@@ -227,6 +388,7 @@ function markdownLink(externalLinkTarget) {
227
388
  };
228
389
  }
229
390
  const REMARK_PLUGINS = [remarkGfm];
391
+ const COPYABLE_REMARK_PLUGINS = [remarkGfm, remarkTableMarkdown];
230
392
  const REMEND_OPTIONS = { katex: false, linkMode: "text-only" };
231
393
  const COMPONENTS = {
232
394
  pre: MarkdownCodeBlock,
@@ -236,6 +398,11 @@ const WINDOW_COMPONENTS = {
236
398
  ...COMPONENTS,
237
399
  a: markdownLink("window")
238
400
  };
401
+ const DEFAULT_COMPONENTS = { tab: COMPONENTS, window: WINDOW_COMPONENTS };
402
+ const TABLE_COMPONENTS = {
403
+ tab: { ...COMPONENTS, table: MarkdownTable },
404
+ window: { ...WINDOW_COMPONENTS, table: MarkdownTable }
405
+ };
239
406
 
240
407
  export { MarkdownRenderer as M };
241
- //# sourceMappingURL=markdown-renderer-Wmdi_oR8.js.map
408
+ //# sourceMappingURL=markdown-renderer-Dp1fJwUB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-renderer-Dp1fJwUB.js","sources":["../src/ds/components/MarkdownRenderer/arriving.ts","../src/ds/components/MarkdownRenderer/blocks.ts","../src/ds/components/MarkdownRenderer/table-csv.ts","../src/ds/components/MarkdownRenderer/markdown-table.tsx","../src/ds/components/MarkdownRenderer/table-markdown.ts","../src/ds/components/MarkdownRenderer/use-settled.ts","../src/ds/components/MarkdownRenderer/markdown-renderer.tsx"],"sourcesContent":["import type { ExtraProps } from 'react-markdown';\n\nimport { ARRIVING_CLASS } from '@/ds/tokens';\n\nimport '@/ds/components/Arrival/arrival.css';\n\ntype MarkdownElement = NonNullable<ExtraProps['node']>;\ntype MarkdownChild = MarkdownElement['children'][number];\n\n/** Fades whole: a fence renders through `CodeBlock`, and inline code carries a background. */\nconst UNBROKEN = new Set(['pre', 'code']);\n\nconst wrap = (value: string, arriving: boolean): MarkdownChild => ({\n type: 'element',\n tagName: 'span',\n properties: arriving ? { className: [ARRIVING_CLASS] } : {},\n children: [{ type: 'text', value }],\n});\n\nfunction markArriving(node: MarkdownElement): void {\n const classes = node.properties.className;\n\n node.properties.className = Array.isArray(classes) ? [...classes, ARRIVING_CLASS] : [ARRIVING_CLASS];\n}\n\nfunction rebuild(nodes: MarkdownChild[], arriving: () => boolean): MarkdownChild[] {\n const out: MarkdownChild[] = [];\n\n for (const node of nodes) {\n if (node.type === 'text') {\n for (const piece of node.value.match(/\\S+|\\s+/g) ?? []) {\n if (/\\S/.test(piece)) out.push(wrap(piece, arriving()));\n else out.push({ type: 'text', value: piece });\n }\n\n continue;\n }\n\n out.push(node);\n\n if (node.type !== 'element') continue;\n\n if (!UNBROKEN.has(node.tagName)) node.children = rebuild(node.children, arriving);\n else if (arriving()) markArriving(node);\n }\n\n return out;\n}\n\n/**\n * Gives every word of a block an element of its own, and the entrance class to\n * those past the first `settled` — the words that were not on screen yet when\n * the reader joined this reply.\n *\n * Every word, not just the arriving ones: react-markdown parses afresh on each\n * landing and React matches the children it already mounted by position, so a\n * wrapper that came and went would land where a bare text node used to be and\n * remount half the paragraph, replaying entrances that had long finished.\n * Wrapping the lot keeps every position fixed — a new word only ever appends —\n * and a word never gains the class it did not mount with, so nothing replays.\n */\nexport function rehypeArriving(settled: number) {\n return function attach() {\n return (tree: { children: MarkdownChild[] }) => {\n let word = 0;\n\n tree.children = rebuild(tree.children, () => word++ >= settled);\n };\n };\n}\n","const FENCE_OPEN = /^ {0,3}(`{3,}|~{3,})/;\nconst FENCE_CLOSE = /^ {0,3}(`{3,}|~{3,})[ \\t]*$/;\nconst LIST_ITEM = /^ {0,3}(?:[-*+]|\\d{1,9}[.)])(?:[ \\t]|$)/;\nconst INDENTED = /^(?:\\t| {2,})/;\nconst DEFINITION = /^ {0,3}\\[[^\\]]+\\]:/;\n\nfunction fenceOpenedBy(line: string): string | undefined {\n return FENCE_OPEN.exec(line)?.[1];\n}\n\n// Both are runs of one character, so `startsWith` is \"same marker, at least as long\".\nfunction closesFence(line: string, marker: string): boolean {\n return FENCE_CLOSE.exec(line)?.[1]?.startsWith(marker) ?? false;\n}\n\nfunction startsBlock(line: string, inList: boolean): boolean {\n if (INDENTED.test(line)) return false;\n\n return !(inList && LIST_ITEM.test(line));\n}\n\n/**\n * Cuts markdown into top-level blocks so a growing reply re-parses its last\n * block instead of all of them. Rejoining the result returns the input, and\n * every block renders as it would have inside the whole.\n *\n * Each rule only ever merges: over-merging costs a re-parse, while cutting a\n * construct in two changes what it renders as. Link reference and footnote\n * definitions resolve across blank lines, which no line-level rule can see, so\n * reaching one outside a fence abandons the split for the whole text.\n */\nexport function splitBlocks(markdown: string): string[] {\n const lines = markdown.split('\\n');\n const starts = [0];\n let fence: string | undefined;\n let started = false;\n let broken = false;\n let inList = false;\n\n for (const [index, line] of lines.entries()) {\n if (fence) {\n if (closesFence(line, fence)) fence = undefined;\n continue;\n }\n\n if (line.trim() === '') {\n broken = started;\n continue;\n }\n\n if (DEFINITION.test(line)) return [markdown];\n\n if (broken && startsBlock(line, inList)) {\n starts.push(index);\n started = false;\n }\n\n if (!started) inList = LIST_ITEM.test(line);\n\n started = true;\n broken = false;\n fence = fenceOpenedBy(line);\n }\n\n return starts.map((start, position) => {\n const end = starts[position + 1];\n const block = lines.slice(start, end ?? lines.length).join('\\n');\n\n return end === undefined ? block : `${block}\\n`;\n });\n}\n","function spreadsheetCell(value: string): string {\n // Quoting alone does not stop spreadsheet apps from evaluating formulas.\n const numeric = /^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?$/i.test(value.trim());\n const formula = /^[\\s\\uFEFF]*[=+\\-@=+-@]/u.test(value);\n const controlPrefix = /^[\\t\\r\\n]/.test(value);\n const safe = controlPrefix || (formula && !numeric) ? `'${value}` : value;\n return `\"${safe.replaceAll('\"', '\"\"')}\"`;\n}\n\nexport function tableToCsv(rows: string[][]): string {\n return rows.map(row => row.map(spreadsheetCell).join(',')).join('\\r\\n');\n}\n\nexport function downloadTableCsv(csv: string): void {\n const blob = new Blob(['\\uFEFF', csv], { type: 'text/csv;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = 'table.csv';\n document.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n URL.revokeObjectURL(url);\n}\n","import { CheckIcon, ChevronDownIcon, CopyIcon, DownloadIcon } from 'lucide-react';\nimport type { ComponentProps } from 'react';\nimport type { ExtraProps } from 'react-markdown';\nimport { downloadTableCsv } from './table-csv';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu';\nimport { useCopyToClipboard } from '@/hooks/use-copy-to-clipboard';\n\nexport function MarkdownTable({ node, children }: ComponentProps<'table'> & ExtraProps) {\n const markdown = node?.properties.tableMarkdown;\n const csv = node?.properties.tableCsv;\n const { isCopied, copyToClipboard } = useCopyToClipboard({ copyMessage: 'Copied table markdown' });\n\n return (\n <div className=\"my-3 w-fit max-w-full min-w-0\">\n <div className=\"flex justify-end\">\n <ButtonsGroup spacing=\"close\" aria-label=\"Table actions\">\n <Button\n type=\"button\"\n size=\"xs\"\n variant=\"ghost\"\n disabled={typeof markdown !== 'string'}\n onClick={() => {\n if (typeof markdown === 'string') copyToClipboard(markdown);\n }}\n aria-label=\"Copy table as markdown\"\n >\n {isCopied ? <CheckIcon /> : <CopyIcon />}\n {isCopied ? 'Copied!' : 'Copy table as markdown'}\n </Button>\n <DropdownMenu>\n <DropdownMenu.Trigger\n disabled={typeof csv !== 'string'}\n render={\n <Button type=\"button\" size=\"icon-xs\" variant=\"ghost\" aria-label=\"More table options\">\n <ChevronDownIcon />\n </Button>\n }\n />\n <DropdownMenu.Content align=\"end\" size=\"sm\" className=\"w-max min-w-0\">\n <DropdownMenu.Item\n size=\"sm\"\n onClick={() => {\n if (typeof csv === 'string') downloadTableCsv(csv);\n }}\n >\n <DownloadIcon />\n Download CSV\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu>\n </ButtonsGroup>\n </div>\n <div className=\"max-w-full overflow-x-auto\">\n <table className=\"table min-w-full\">{children}</table>\n </div>\n </div>\n );\n}\n","import type { Definition, FootnoteDefinition, Nodes, Root, Table } from 'mdast';\nimport { gfmToMarkdown } from 'mdast-util-gfm';\nimport { toMarkdown } from 'mdast-util-to-markdown';\nimport { tableToCsv } from './table-csv';\n\nfunction cellText(node: Nodes): string {\n if (node.type === 'footnoteReference') return `[^${node.label ?? node.identifier}]`;\n if ('value' in node) return node.value;\n if (node.type === 'image' || node.type === 'imageReference') return node.alt ?? '';\n return 'children' in node ? node.children.map(cellText).join('') : '';\n}\n\nfunction walk(node: Nodes, visit: (node: Nodes) => void): void {\n visit(node);\n if ('children' in node) node.children.forEach(child => walk(child, visit));\n}\n\nconst SERIALIZE_OPTIONS = { extensions: [gfmToMarkdown()] };\n\n/** Capture table exports before rehype replaces text with animation spans. */\nexport function remarkTableMarkdown() {\n return (tree: Root, file: { value: unknown }) => {\n const source = String(file.value);\n const definitions = new Map<string, Definition | FootnoteDefinition>();\n const tables: Table[] = [];\n walk(tree, node => {\n if (node.type === 'definition' || node.type === 'footnoteDefinition') {\n const key = `${node.type}:${node.identifier}`;\n if (!definitions.has(key)) definitions.set(key, node);\n }\n if (node.type === 'table') tables.push(node);\n });\n\n const lines = source.split(/\\r\\n|\\r|\\n/);\n for (const table of tables) {\n const header = table.children[0];\n if (!header?.position) continue;\n const rows = table.children.map(row => {\n const start = row.position?.start.offset;\n const end = row.position?.end.offset;\n return start === undefined || end === undefined ? undefined : source.slice(start, end);\n });\n // Only offer exports when the parser supplied the original row locations.\n if (!rows.every(row => row !== undefined)) continue;\n // Row positions exclude list/blockquote prefixes. The delimiter has no AST node.\n const delimiter = lines[header.position.start.line]?.replace(/^[\\t >]*/, '');\n if (delimiter === undefined) continue;\n const markdown = [rows[0], delimiter, ...rows.slice(1)];\n const used = new Set<string>();\n const collectReference = (node: Nodes) => {\n if (node.type === 'linkReference' || node.type === 'imageReference') {\n used.add(`definition:${node.identifier}`);\n } else if (node.type === 'footnoteReference') {\n used.add(`footnoteDefinition:${node.identifier}`);\n }\n };\n walk(table, collectReference);\n // Visiting appended definitions also collects links/footnotes they depend on.\n // The set prevents duplicates and cycles, including self-referencing footnotes.\n for (const key of used) {\n const definition = definitions.get(key);\n if (!definition) continue;\n markdown.push('', toMarkdown(definition, SERIALIZE_OPTIONS).trimEnd());\n walk(definition, collectReference);\n }\n const cells = table.children.map(row =>\n Array.from({ length: header.children.length }, (_, index) => {\n const cell = row.children[index];\n return cell ? cellText(cell) : '';\n }),\n );\n table.data = {\n ...table.data,\n hProperties: {\n ...table.data?.hProperties,\n tableMarkdown: markdown.join('\\n'),\n tableCsv: tableToCsv(cells),\n },\n };\n }\n };\n}\n","import { useEffect, useRef, useState } from 'react';\n\nimport { useWatched } from '@/ds/components/Arrival';\nimport { ARRIVING_MS } from '@/ds/tokens';\n\ninterface Landing {\n words: number;\n at: number;\n}\n\n/**\n * How many of a reply's words have been on screen long enough that their entrance is over.\n *\n * The entrance plays on whatever mounts carrying the class, so it replays every time a\n * word's element is rebuilt — and markdown rebuilds a growing tail constantly: a `-`\n * turns a paragraph into a list item, a closing `**` splits it around a `<strong>`, the\n * stream ends and the mend comes off. Each of those swaps the element a settled word\n * lives in, which is what makes a word already read fade in again.\n *\n * Ageing them out is the whole answer: a word carries the class only while it is new,\n * so however often the tail is rebuilt, only what is genuinely arriving animates.\n *\n * What counts as new at mount is not this hook's call. A reply the reader was handed\n * is already there, and a block that mounts complete — a card's output, an expanded\n * body — enters with its container. Only a passage born streaming under the reader's\n * eyes is new from its first word: the reveal often lands several words in its first\n * commit, and they enter like every word after them.\n */\nexport function useSettledWords(words: number, streaming: boolean): number {\n const watched = useWatched();\n const [settled, setSettled] = useState(() => (watched && streaming ? 0 : words));\n const landings = useRef<Landing[]>([]);\n const recorded = useRef(settled);\n\n useEffect(() => {\n if (recorded.current !== words) {\n landings.current.push({ words, at: performance.now() });\n recorded.current = words;\n }\n\n const waiting = landings.current[0];\n if (!waiting) return;\n\n const timer = setTimeout(\n () => {\n landings.current.shift();\n setSettled(waiting.words);\n },\n Math.max(0, waiting.at + ARRIVING_MS - performance.now()),\n );\n\n return () => clearTimeout(timer);\n }, [settled, words]);\n\n // A shorter reply replacing the one on screen settles at once: nothing of it is new.\n return Math.min(settled, words);\n}\n","import { memo, useMemo } from 'react';\nimport type { MouseEvent, MouseEventHandler, ReactNode } from 'react';\nimport Markdown from 'react-markdown';\nimport type { Components, ExtraProps, Options } from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport remend from 'remend';\n\nimport { rehypeArriving } from './arriving';\nimport { splitBlocks } from './blocks';\nimport { MarkdownTable } from './markdown-table';\nimport { remarkTableMarkdown } from './table-markdown';\nimport { useSettledWords } from './use-settled';\nimport { CodeBlock } from '@/ds/components/CodeBlock';\nimport { cn } from '@/lib/utils';\n\nimport './markdown-renderer.css';\n\nexport type MarkdownExternalLinkTarget = 'tab' | 'window';\n\nexport interface MarkdownRendererProps {\n children: string;\n className?: string;\n externalLinkTarget?: MarkdownExternalLinkTarget;\n /** The text is a prefix of one still being written: close the markers the stream has not reached. */\n streaming?: boolean;\n /** Opt in to table copy/download controls; disabled while this text is streaming. */\n tableActions?: boolean;\n}\n\n/**\n * Renders a markdown string. Agent output can carry attacker-influenced text\n * (file contents, tool output, web pages): react-markdown escapes raw HTML and\n * drops dangerous link schemes, so nothing here reaches the DOM as markup.\n *\n * react-markdown re-parses on every render, and a streaming reply re-renders\n * its whole transcript on every delta. Memoizing spares the settled messages;\n * rendering block by block — streaming or not — spares every block of the live\n * one but the last, and lets a reply settle without remounting what is already\n * on screen.\n *\n * The text is drawn as given: pacing a stream is `useRevealedText`, and belongs to\n * whoever owns the whole of what is being laid down — a reply is prose, tool rows\n * and cards, and they have to arrive in the order they were written. Only what\n * lands after the reader joined plays an entrance, and only while it is still new:\n * a reply opened part-written is already there, and fading in what someone is\n * halfway through reading would be both a lie and a screenful of animations at\n * once.\n */\nexport const MarkdownRenderer = memo(function MarkdownRenderer({\n children,\n className,\n externalLinkTarget = 'tab',\n streaming = false,\n tableActions = false,\n}: MarkdownRendererProps) {\n const shown = decodeEscapedNewlines(children);\n const blocks = useMemo(() => splitBlocks(shown), [shown]);\n const last = blocks.length - 1;\n const components = (tableActions ? TABLE_COMPONENTS : DEFAULT_COMPONENTS)[externalLinkTarget];\n\n const spans = wordSpans(blocks);\n const settled = useSettledWords(spans.at(-1)?.end ?? 0, streaming);\n\n // A block whose words have all finished their entrance has nothing left to play,\n // which is what `undefined` says: leave it as plain text, no spans at all.\n const settledWords = (span: WordSpan | undefined): number | undefined =>\n !span || settled >= span.end ? undefined : Math.max(0, settled - span.start);\n\n const tail = blocks[last] ?? '';\n const mended = useMemo(() => (streaming ? remend(tail, REMEND_OPTIONS) : tail), [streaming, tail]);\n\n return (\n <div className={cn('mastra-markdown', className)}>\n {blocks.map((block, index) => (\n <MarkdownBlock\n key={index}\n content={index === last ? mended : block}\n settledWords={settledWords(spans[index])}\n components={components}\n streaming={streaming}\n tableActions={tableActions}\n />\n ))}\n </div>\n );\n});\n\n/** Keyed by position at the call site: a content key remounts on every character. */\nconst MarkdownBlock = memo(function MarkdownBlock({\n components,\n content,\n settledWords,\n streaming,\n tableActions,\n}: {\n components: Components;\n content: string;\n settledWords?: number;\n streaming: boolean;\n tableActions: boolean;\n}) {\n const rehypePlugins = useMemo(\n () => (settledWords === undefined ? SETTLED : [rehypeArriving(settledWords)]),\n [settledWords],\n );\n\n return (\n <Markdown\n remarkPlugins={tableActions && !streaming ? COPYABLE_REMARK_PLUGINS : REMARK_PLUGINS}\n rehypePlugins={rehypePlugins}\n components={components}\n >\n {content}\n </Markdown>\n );\n});\n\nconst SETTLED: Options['rehypePlugins'] = [];\n\ninterface WordSpan {\n start: number;\n end: number;\n}\n\n/**\n * Where each block's words fall in the reply's own count, so one settled count covers\n * them all. Counting the source counts its markers too, so the boundary only ever errs\n * towards leaving a word unanimated.\n */\nfunction wordSpans(blocks: string[]): WordSpan[] {\n let read = 0;\n\n return blocks.map(block => {\n const span = { start: read, end: read + countWords(block) };\n read = span.end;\n\n return span;\n });\n}\n\nfunction countWords(text: string): number {\n return text.match(/\\S+/g)?.length ?? 0;\n}\n\n// Agent networks emit their text with literal `\\n`. Only unescape when the text\n// has no real newline, otherwise a `\"a\\nb\"` inside a code fence gets shredded.\nfunction decodeEscapedNewlines(text: string): string {\n return text.includes('\\n') ? text : text.replace(/\\\\n/g, '\\n');\n}\n\ntype MarkdownNode = NonNullable<ExtraProps['node']>;\n\nfunction languageOf(node: MarkdownNode): string | undefined {\n const classNames = node.properties.className;\n if (!Array.isArray(classNames)) return undefined;\n\n const language = classNames.find(entry => typeof entry === 'string' && entry.startsWith('language-'));\n return typeof language === 'string' ? language.slice('language-'.length) : undefined;\n}\n\nfunction fencedCode(node: MarkdownNode | undefined): { code: string; language?: string } | undefined {\n const child = node?.children.find(entry => entry.type === 'element' && entry.tagName === 'code');\n if (child?.type !== 'element') return undefined;\n\n const code = child.children.map(entry => (entry.type === 'text' ? entry.value : '')).join('');\n return { code: code.replace(/\\n$/, ''), language: languageOf(child) };\n}\n\nfunction MarkdownCodeBlock({\n node,\n children,\n className,\n}: {\n node?: MarkdownNode;\n children?: ReactNode;\n className?: string;\n}) {\n const fenced = fencedCode(node);\n if (!fenced) return <pre className={className}>{children}</pre>;\n\n return (\n <CodeBlock\n code={fenced.code}\n lang={fenced.language}\n overflow=\"scroll\"\n className={cn('my-3 bg-surface1', className)}\n copyMessage=\"Copied code to clipboard\"\n />\n );\n}\n\nconst POPUP_WINDOW_FEATURES = 'popup=yes,width=720,height=800,resizable=yes,scrollbars=yes';\n\nfunction isPlainLeftClick(event: MouseEvent): boolean {\n return event.button === 0 && !event.metaKey && !event.ctrlKey && !event.shiftKey && !event.altKey;\n}\n\nfunction markdownLink(externalLinkTarget: MarkdownExternalLinkTarget): NonNullable<Components['a']> {\n return function MarkdownLink({ href, title, children }) {\n const isExternal = /^https?:\\/\\//i.test(href ?? '');\n\n const openInPopup: MouseEventHandler<HTMLAnchorElement> = event => {\n if (!isExternal || externalLinkTarget !== 'window' || !isPlainLeftClick(event)) return;\n\n const popup = window.open(href, '_blank', POPUP_WINDOW_FEATURES);\n if (!popup) return;\n\n popup.opener = null;\n event.preventDefault();\n };\n\n return (\n <a\n href={href}\n title={title}\n onClick={openInPopup}\n target={isExternal ? '_blank' : undefined}\n rel={isExternal ? 'noopener noreferrer' : undefined}\n >\n {children}\n </a>\n );\n };\n}\n\nconst REMARK_PLUGINS = [remarkGfm];\nconst COPYABLE_REMARK_PLUGINS = [remarkGfm, remarkTableMarkdown];\n\n// Links stay text until their URL lands: remend's placeholder href would render\n// a live anchor to nowhere. No math is rendered here, so pairing `$$` would only\n// turn one literal into another.\nconst REMEND_OPTIONS = { katex: false, linkMode: 'text-only' } as const;\n\n// Elements are listed one by one: react-markdown also passes its `node`, which\n// React would forward to the DOM as a stray attribute. Everything else is\n// styled from markdown-renderer.css.\nconst COMPONENTS: Components = {\n pre: MarkdownCodeBlock,\n a: markdownLink('tab'),\n};\n\nconst WINDOW_COMPONENTS: Components = {\n ...COMPONENTS,\n a: markdownLink('window'),\n};\n\nconst DEFAULT_COMPONENTS = { tab: COMPONENTS, window: WINDOW_COMPONENTS };\nconst TABLE_COMPONENTS = {\n tab: { ...COMPONENTS, table: MarkdownTable },\n window: { ...WINDOW_COMPONENTS, table: MarkdownTable },\n};\n"],"names":["MarkdownRenderer","MarkdownBlock"],"mappings":"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"}
@@ -7,7 +7,14 @@ const remarkGfm = require('remark-gfm');
7
7
  const remend = require('remend');
8
8
  const tokens = require('./tokens.cjs.js');
9
9
  const useWatched = require('./use-watched-BixmYWp0.cjs');
10
- const codeBlock = require('./code-block-I7b2Wt_Y.cjs');
10
+ const lucideReact = require('lucide-react');
11
+ const Button = require('./Button-BJOVwaxp.cjs');
12
+ const buttonsGroup = require('./buttons-group-jq7kUVlX.cjs');
13
+ const dropdownMenu = require('./dropdown-menu-Bfh5ROWe.cjs');
14
+ const hooks_useCopyToClipboard = require('./hooks/use-copy-to-clipboard.cjs.js');
15
+ const mdastUtilGfm = require('mdast-util-gfm');
16
+ const mdastUtilToMarkdown = require('mdast-util-to-markdown');
17
+ const codeBlock = require('./code-block-D1RequlX.cjs');
11
18
  const utils_cn = require('./cn-DnbTIGXa.cjs');
12
19
 
13
20
  const UNBROKEN = /* @__PURE__ */ new Set(["pre", "code"]);
@@ -96,6 +103,147 @@ function splitBlocks(markdown) {
96
103
  });
97
104
  }
98
105
 
106
+ function spreadsheetCell(value) {
107
+ const numeric = /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i.test(value.trim());
108
+ const formula = /^[\s\uFEFF]*[=+\-@=+-@]/u.test(value);
109
+ const controlPrefix = /^[\t\r\n]/.test(value);
110
+ const safe = controlPrefix || formula && !numeric ? `'${value}` : value;
111
+ return `"${safe.replaceAll('"', '""')}"`;
112
+ }
113
+ function tableToCsv(rows) {
114
+ return rows.map((row) => row.map(spreadsheetCell).join(",")).join("\r\n");
115
+ }
116
+ function downloadTableCsv(csv) {
117
+ const blob = new Blob(["\uFEFF", csv], { type: "text/csv;charset=utf-8" });
118
+ const url = URL.createObjectURL(blob);
119
+ const anchor = document.createElement("a");
120
+ anchor.href = url;
121
+ anchor.download = "table.csv";
122
+ document.body.appendChild(anchor);
123
+ anchor.click();
124
+ anchor.remove();
125
+ URL.revokeObjectURL(url);
126
+ }
127
+
128
+ function MarkdownTable({ node, children }) {
129
+ const markdown = node?.properties.tableMarkdown;
130
+ const csv = node?.properties.tableCsv;
131
+ const { isCopied, copyToClipboard } = hooks_useCopyToClipboard.useCopyToClipboard({ copyMessage: "Copied table markdown" });
132
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "my-3 w-fit max-w-full min-w-0", children: [
133
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-end", children: /* @__PURE__ */ jsxRuntime.jsxs(buttonsGroup.ButtonsGroup, { spacing: "close", "aria-label": "Table actions", children: [
134
+ /* @__PURE__ */ jsxRuntime.jsxs(
135
+ Button.Button,
136
+ {
137
+ type: "button",
138
+ size: "xs",
139
+ variant: "ghost",
140
+ disabled: typeof markdown !== "string",
141
+ onClick: () => {
142
+ if (typeof markdown === "string") copyToClipboard(markdown);
143
+ },
144
+ "aria-label": "Copy table as markdown",
145
+ children: [
146
+ isCopied ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CheckIcon, {}) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CopyIcon, {}),
147
+ isCopied ? "Copied!" : "Copy table as markdown"
148
+ ]
149
+ }
150
+ ),
151
+ /* @__PURE__ */ jsxRuntime.jsxs(dropdownMenu.DropdownMenu, { children: [
152
+ /* @__PURE__ */ jsxRuntime.jsx(
153
+ dropdownMenu.DropdownMenu.Trigger,
154
+ {
155
+ disabled: typeof csv !== "string",
156
+ render: /* @__PURE__ */ jsxRuntime.jsx(Button.Button, { type: "button", size: "icon-xs", variant: "ghost", "aria-label": "More table options", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, {}) })
157
+ }
158
+ ),
159
+ /* @__PURE__ */ jsxRuntime.jsx(dropdownMenu.DropdownMenu.Content, { align: "end", size: "sm", className: "w-max min-w-0", children: /* @__PURE__ */ jsxRuntime.jsxs(
160
+ dropdownMenu.DropdownMenu.Item,
161
+ {
162
+ size: "sm",
163
+ onClick: () => {
164
+ if (typeof csv === "string") downloadTableCsv(csv);
165
+ },
166
+ children: [
167
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.DownloadIcon, {}),
168
+ "Download CSV"
169
+ ]
170
+ }
171
+ ) })
172
+ ] })
173
+ ] }) }),
174
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-w-full overflow-x-auto", children: /* @__PURE__ */ jsxRuntime.jsx("table", { className: "table min-w-full", children }) })
175
+ ] });
176
+ }
177
+
178
+ function cellText(node) {
179
+ if (node.type === "footnoteReference") return `[^${node.label ?? node.identifier}]`;
180
+ if ("value" in node) return node.value;
181
+ if (node.type === "image" || node.type === "imageReference") return node.alt ?? "";
182
+ return "children" in node ? node.children.map(cellText).join("") : "";
183
+ }
184
+ function walk(node, visit) {
185
+ visit(node);
186
+ if ("children" in node) node.children.forEach((child) => walk(child, visit));
187
+ }
188
+ const SERIALIZE_OPTIONS = { extensions: [mdastUtilGfm.gfmToMarkdown()] };
189
+ function remarkTableMarkdown() {
190
+ return (tree, file) => {
191
+ const source = String(file.value);
192
+ const definitions = /* @__PURE__ */ new Map();
193
+ const tables = [];
194
+ walk(tree, (node) => {
195
+ if (node.type === "definition" || node.type === "footnoteDefinition") {
196
+ const key = `${node.type}:${node.identifier}`;
197
+ if (!definitions.has(key)) definitions.set(key, node);
198
+ }
199
+ if (node.type === "table") tables.push(node);
200
+ });
201
+ const lines = source.split(/\r\n|\r|\n/);
202
+ for (const table of tables) {
203
+ const header = table.children[0];
204
+ if (!header?.position) continue;
205
+ const rows = table.children.map((row) => {
206
+ const start = row.position?.start.offset;
207
+ const end = row.position?.end.offset;
208
+ return start === void 0 || end === void 0 ? void 0 : source.slice(start, end);
209
+ });
210
+ if (!rows.every((row) => row !== void 0)) continue;
211
+ const delimiter = lines[header.position.start.line]?.replace(/^[\t >]*/, "");
212
+ if (delimiter === void 0) continue;
213
+ const markdown = [rows[0], delimiter, ...rows.slice(1)];
214
+ const used = /* @__PURE__ */ new Set();
215
+ const collectReference = (node) => {
216
+ if (node.type === "linkReference" || node.type === "imageReference") {
217
+ used.add(`definition:${node.identifier}`);
218
+ } else if (node.type === "footnoteReference") {
219
+ used.add(`footnoteDefinition:${node.identifier}`);
220
+ }
221
+ };
222
+ walk(table, collectReference);
223
+ for (const key of used) {
224
+ const definition = definitions.get(key);
225
+ if (!definition) continue;
226
+ markdown.push("", mdastUtilToMarkdown.toMarkdown(definition, SERIALIZE_OPTIONS).trimEnd());
227
+ walk(definition, collectReference);
228
+ }
229
+ const cells = table.children.map(
230
+ (row) => Array.from({ length: header.children.length }, (_, index) => {
231
+ const cell = row.children[index];
232
+ return cell ? cellText(cell) : "";
233
+ })
234
+ );
235
+ table.data = {
236
+ ...table.data,
237
+ hProperties: {
238
+ ...table.data?.hProperties,
239
+ tableMarkdown: markdown.join("\n"),
240
+ tableCsv: tableToCsv(cells)
241
+ }
242
+ };
243
+ }
244
+ };
245
+ }
246
+
99
247
  function useSettledWords(words, streaming) {
100
248
  const watched = useWatched.useWatched();
101
249
  const [settled, setSettled] = React.useState(() => watched && streaming ? 0 : words);
@@ -124,12 +272,13 @@ const MarkdownRenderer = React.memo(function MarkdownRenderer2({
124
272
  children,
125
273
  className,
126
274
  externalLinkTarget = "tab",
127
- streaming = false
275
+ streaming = false,
276
+ tableActions = false
128
277
  }) {
129
278
  const shown = decodeEscapedNewlines(children);
130
279
  const blocks = React.useMemo(() => splitBlocks(shown), [shown]);
131
280
  const last = blocks.length - 1;
132
- const components = externalLinkTarget === "window" ? WINDOW_COMPONENTS : COMPONENTS;
281
+ const components = (tableActions ? TABLE_COMPONENTS : DEFAULT_COMPONENTS)[externalLinkTarget];
133
282
  const spans = wordSpans(blocks);
134
283
  const settled = useSettledWords(spans.at(-1)?.end ?? 0, streaming);
135
284
  const settledWords = (span) => !span || settled >= span.end ? void 0 : Math.max(0, settled - span.start);
@@ -140,7 +289,9 @@ const MarkdownRenderer = React.memo(function MarkdownRenderer2({
140
289
  {
141
290
  content: index === last ? mended : block,
142
291
  settledWords: settledWords(spans[index]),
143
- components
292
+ components,
293
+ streaming,
294
+ tableActions
144
295
  },
145
296
  index
146
297
  )) });
@@ -148,13 +299,23 @@ const MarkdownRenderer = React.memo(function MarkdownRenderer2({
148
299
  const MarkdownBlock = React.memo(function MarkdownBlock2({
149
300
  components,
150
301
  content,
151
- settledWords
302
+ settledWords,
303
+ streaming,
304
+ tableActions
152
305
  }) {
153
306
  const rehypePlugins = React.useMemo(
154
307
  () => settledWords === void 0 ? SETTLED : [rehypeArriving(settledWords)],
155
308
  [settledWords]
156
309
  );
157
- return /* @__PURE__ */ jsxRuntime.jsx(Markdown, { remarkPlugins: REMARK_PLUGINS, rehypePlugins, components, children: content });
310
+ return /* @__PURE__ */ jsxRuntime.jsx(
311
+ Markdown,
312
+ {
313
+ remarkPlugins: tableActions && !streaming ? COPYABLE_REMARK_PLUGINS : REMARK_PLUGINS,
314
+ rehypePlugins,
315
+ components,
316
+ children: content
317
+ }
318
+ );
158
319
  });
159
320
  const SETTLED = [];
160
321
  function wordSpans(blocks) {
@@ -229,6 +390,7 @@ function markdownLink(externalLinkTarget) {
229
390
  };
230
391
  }
231
392
  const REMARK_PLUGINS = [remarkGfm];
393
+ const COPYABLE_REMARK_PLUGINS = [remarkGfm, remarkTableMarkdown];
232
394
  const REMEND_OPTIONS = { katex: false, linkMode: "text-only" };
233
395
  const COMPONENTS = {
234
396
  pre: MarkdownCodeBlock,
@@ -238,6 +400,11 @@ const WINDOW_COMPONENTS = {
238
400
  ...COMPONENTS,
239
401
  a: markdownLink("window")
240
402
  };
403
+ const DEFAULT_COMPONENTS = { tab: COMPONENTS, window: WINDOW_COMPONENTS };
404
+ const TABLE_COMPONENTS = {
405
+ tab: { ...COMPONENTS, table: MarkdownTable },
406
+ window: { ...WINDOW_COMPONENTS, table: MarkdownTable }
407
+ };
241
408
 
242
409
  exports.MarkdownRenderer = MarkdownRenderer;
243
- //# sourceMappingURL=markdown-renderer-Ds3PaLdR.cjs.map
410
+ //# sourceMappingURL=markdown-renderer-hBiN_N_-.cjs.map