@marimo-team/islands 0.25.2-dev12 → 0.25.2-dev121

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 (393) hide show
  1. package/dist/{ConnectedDataExplorerComponent-CqhQmp74.js → ConnectedDataExplorerComponent-CNSxdKyJ.js} +15 -15
  2. package/dist/{ErrorBoundary-YddQ6YHW.js → ErrorBoundary-Bo3Tg7Jh.js} +12 -12
  3. package/dist/{ImageComparisonComponent-Cpfz30OZ.js → ImageComparisonComponent-uU8FSKZE.js} +3 -3
  4. package/dist/{Plot-CTyjbQDT.js → Plot-DdYOe1UK.js} +2 -2
  5. package/dist/{abnfDiagram-VCTEODGH-aLGD44M7.js → abnfDiagram-VCTEODGH-DQDjNXt3.js} +3 -3
  6. package/dist/{any-language-editor-dqxlUDlT.js → any-language-editor-B9REGlD9.js} +8 -8
  7. package/dist/{apl-BYaaig9_.js → apl-GEW9-ZP1.js} +1 -1
  8. package/dist/{architectureDiagram-5GKGNRK7-BGL5P81u.js → architectureDiagram-5GKGNRK7-Nmls7Wxn.js} +5 -5
  9. package/dist/{asciiarmor-GKQFJXQG.js → asciiarmor-BWNxzkG7.js} +1 -1
  10. package/dist/{asn1-BsSb7HP5.js → asn1-Bcn2QutK.js} +1 -1
  11. package/dist/assets/__vite-browser-external-BXYkiFsk.js +1 -0
  12. package/dist/assets/worker-HPY9fbhz.js +114 -0
  13. package/dist/{asterisk-B3I8SNb5.js → asterisk-lE36-hJK.js} +1 -1
  14. package/dist/{blockDiagram-I7D4REHJ-CvBmppdy.js → blockDiagram-I7D4REHJ-Cg25UrxT.js} +9 -9
  15. package/dist/{brainfuck-DXjk3bQe.js → brainfuck-BQCYDheZ.js} +1 -1
  16. package/dist/{button-B0Xgl-Qn.js → button-CvjkwdSk.js} +304 -287
  17. package/dist/{c4Diagram-7LVT6UL2-EceL4_jH.js → c4Diagram-7LVT6UL2-BxFgrnNV.js} +7 -7
  18. package/dist/{capabilities-D7Ad8-zw.js → capabilities-CQ5IjhzL.js} +1 -1
  19. package/dist/{cells-5ppES-Un.js → cells-CuYwqnV8.js} +5950 -4893
  20. package/dist/{channel-z7HZXHwv.js → channel-CPObtJXj.js} +1 -1
  21. package/dist/{chat-ui-Dv2V95k6.js → chat-ui-C6oDg4Zu.js} +1595 -1402
  22. package/dist/{check-DGZ74tV2.js → check-EDwSwP89.js} +1 -1
  23. package/dist/{chunk-4HAMMTFA-BPTTOOC5.js → chunk-4HAMMTFA-D4eFPyFh.js} +5 -5
  24. package/dist/{chunk-75Z2AOVW-C4AOleKf.js → chunk-75Z2AOVW-D7gxIs2Q.js} +1 -1
  25. package/dist/{chunk-DU6HZSFF-1TwWR6gh.js → chunk-DU6HZSFF-BwiyaNpg.js} +2 -2
  26. package/dist/{chunk-F27PBJKO-DMI1PBe4.js → chunk-F27PBJKO-ufseIn5y.js} +1 -1
  27. package/dist/{chunk-GMAD6QVW-vStrMz2P.js → chunk-GMAD6QVW-BhaJx0X3.js} +3 -3
  28. package/dist/{chunk-GVQU2GXP-2HwWgs4u.js → chunk-GVQU2GXP-Cwbt-lF0.js} +2 -2
  29. package/dist/{chunk-IMKFNOWR-Cm3RgLDj.js → chunk-IMKFNOWR-CoIFEo-1.js} +6 -6
  30. package/dist/{chunk-L3NEJ4N5-RhC7i0I2.js → chunk-L3NEJ4N5-n-zgIVSy.js} +5 -5
  31. package/dist/{chunk-OSK3NFVY-CZV09N-U.js → chunk-OSK3NFVY-DXa-Cxbn.js} +6 -6
  32. package/dist/{chunk-P2QGCYS3-0TAWai9C.js → chunk-P2QGCYS3-B_Zd3-X0.js} +1 -1
  33. package/dist/{chunk-POPQ4Y6H-Cc3_56GX.js → chunk-POPQ4Y6H-hYOXbYH_.js} +1 -1
  34. package/dist/{chunk-PWAF6VOD-lNxB9k8z.js → chunk-PWAF6VOD-CQw5qATZ.js} +1 -1
  35. package/dist/{chunk-SHT3W25Y-DedDYSP5.js → chunk-SHT3W25Y-lHiGx3ZC.js} +8 -8
  36. package/dist/{chunk-SVP7TREG-B2SFkCAL.js → chunk-SVP7TREG-BvsHIrY_.js} +2 -2
  37. package/dist/{chunk-TICWLB2K-DB6hjNOL.js → chunk-TICWLB2K-BC8YIm_n.js} +6 -6
  38. package/dist/{chunk-YOKDWASO-DrWbKnxA.js → chunk-YOKDWASO-DPZk8vhS.js} +6 -6
  39. package/dist/classDiagram-ZZMXUADV-Bt98lkkv.js +30 -0
  40. package/dist/classDiagram-v2-VYDZK3BY-D9bfbcC3.js +30 -0
  41. package/dist/{clike-E2lFbGVj.js → clike-CxK9W55Z.js} +1 -1
  42. package/dist/{clojure-Dn_K4RlK.js → clojure-Dzcvwpxk.js} +1 -1
  43. package/dist/{cmake-DpN2Top5.js → cmake-DYr-71zp.js} +1 -1
  44. package/dist/{cobol-Chf22-GM.js → cobol-DC3g37Kq.js} +1 -1
  45. package/dist/{code-visibility-C0zE3g0U.js → code-visibility-WFM7uHBf.js} +7 -7
  46. package/dist/{coffeescript-BVe1OiD9.js → coffeescript-C-eFwH5N.js} +1 -1
  47. package/dist/{common-BkjS959w.js → common-BLHW2E-1.js} +9639 -9291
  48. package/dist/{commonlisp-DxoBG7fU.js → commonlisp-CyaNXrJR.js} +1 -1
  49. package/dist/{compiler-runtime-Cj8ZWiNS.js → compiler-runtime-CldRdSsv.js} +2 -2
  50. package/dist/{copy-icon-qmRg_VTX.js → copy-icon-Ft7t9bqz.js} +6 -6
  51. package/dist/{crystal-DCM3yc4r.js → crystal-ih5ax5tQ.js} +1 -1
  52. package/dist/{css-DkZ9mMyI.js → css-CN_wP7_R.js} +1 -1
  53. package/dist/{cynefinDiagram-5FMLGOSQ-DzaZEqgD.js → cynefinDiagram-5FMLGOSQ-CgWra7wt.js} +3 -3
  54. package/dist/{cypher-Drw_8U5I.js → cypher-CqGRcmZo.js} +1 -1
  55. package/dist/{d-CsVGcKMF.js → d-Cj0sOW2z.js} +1 -1
  56. package/dist/{dagre-GXQ25YYZ-Cjf5GjU3.js → dagre-GXQ25YYZ-CFZ8-35c.js} +10 -10
  57. package/dist/{data-grid-overlay-editor-CqoIqvNa.js → data-grid-overlay-editor-Dt75J_Qe.js} +7 -7
  58. package/dist/{data-grid-types-BucVmDDp.js → data-grid-types-BH_r7g7l.js} +1 -1
  59. package/dist/{diagram-S7CK7UJ4-IhLt_khx.js → diagram-S7CK7UJ4-lCNQrW7d.js} +4 -4
  60. package/dist/{diagram-UQ7AKVKN-CQc6KLPB.js → diagram-UQ7AKVKN-CQPQ6pP_.js} +3 -3
  61. package/dist/{diagram-VSXAHHWV-CR7BJygZ.js → diagram-VSXAHHWV-BJWcVVJY.js} +2 -2
  62. package/dist/{diagram-VX7I27RA-DHmW9N1T.js → diagram-VX7I27RA-Cf3b0llz.js} +5 -5
  63. package/dist/{diagram-Z3DM3KII-zVKsg-Ty.js → diagram-Z3DM3KII-Bt4QLrpn.js} +3 -3
  64. package/dist/{dialog-CILKhbsG.js → dialog-CEBFZNyc.js} +29 -29
  65. package/dist/{diff-CBikYCUF.js → diff-B_hUkiat.js} +1 -1
  66. package/dist/{dist-Df0wKI0F.js → dist-BK4Oj99o.js} +1 -1
  67. package/dist/{dist-BVGtK7Ht.js → dist-BLfKmR-l.js} +1 -1
  68. package/dist/{dist-B8D7McG3.js → dist-BMQf5zIS.js} +46 -46
  69. package/dist/{dist-C2KzV-vf.js → dist-BorMD-uX.js} +2 -2
  70. package/dist/{dist-Cs2FijYk.js → dist-BuaRHxOc.js} +2 -2
  71. package/dist/{dist-DPcEtqmG.js → dist-Bvs24R_E.js} +47 -47
  72. package/dist/{dist-lA1Cttkb.js → dist-C8fAKSH1.js} +41 -41
  73. package/dist/{dist-DszxuxS1.js → dist-CLdpGQVr.js} +2 -2
  74. package/dist/{dist-CO1AwwG_.js → dist-CN8zI-XC.js} +209 -209
  75. package/dist/{dist-D1PpnuZB.js → dist-CN_BeG2I.js} +1 -1
  76. package/dist/{dist-CPGxfVGX.js → dist-CSJ0MDRw.js} +1 -1
  77. package/dist/{dist-Cm3iAFMD.js → dist-CSbh1PNP.js} +3 -3
  78. package/dist/{dist-9x1ZRe-e.js → dist-Cg7gzw-a.js} +2 -2
  79. package/dist/{dist-B1vYLK28.js → dist-CkTTIdBe.js} +345 -345
  80. package/dist/{dist-BRxfaJgs.js → dist-CrSP_H1M.js} +296 -296
  81. package/dist/{dist-C2wDlYdD.js → dist-D-wwqlzJ.js} +2 -2
  82. package/dist/{dist-BtKIs9N-.js → dist-D6d86eNJ.js} +1 -1
  83. package/dist/{dist-DHOTQar0.js → dist-DBtSl3sf.js} +1 -1
  84. package/dist/{dist-KzZ7WELx.js → dist-DiDibOYr.js} +120 -120
  85. package/dist/{dist-Kxgjxakw.js → dist-DoE4XJBC.js} +1277 -1222
  86. package/dist/{dist-CcyKTBTF.js → dist-DpBpA_n1.js} +2 -2
  87. package/dist/{dist-BHCHt1NI.js → dist-F8Ep36rk.js} +1 -1
  88. package/dist/{dist-C8xMLVYi.js → dist-OR1OnN-y.js} +44 -44
  89. package/dist/{dist-1HDa70oE.js → dist-PXYI_yuP.js} +3 -3
  90. package/dist/{dist-CMh_W4y4.js → dist-diIx5qJW.js} +2 -2
  91. package/dist/{dockerfile-DJnSntVB.js → dockerfile-D0VKN500.js} +2 -2
  92. package/dist/dropdown-menu-CP_qCYHC.js +4678 -0
  93. package/dist/{dtd-BHa4v0Bn.js → dtd-B8FGSWWe.js} +1 -1
  94. package/dist/{dylan-BypL2Zz8.js → dylan-DbIBYIrw.js} +1 -1
  95. package/dist/{ebnf-5guncNu-.js → ebnf-D-YbYLdk.js} +1 -1
  96. package/dist/{ebnfDiagram-PWID7BFC-DDd5hCRC.js → ebnfDiagram-PWID7BFC-D3NAyPFY.js} +3 -3
  97. package/dist/{ecl-iRcVIKYZ.js → ecl-DBmkdWAd.js} +1 -1
  98. package/dist/{eiffel-BEqF9aU4.js → eiffel-CcWSDDzK.js} +1 -1
  99. package/dist/{elm-DYcfNE9c.js → elm-MC-b8a6C.js} +1 -1
  100. package/dist/{erDiagram-RLTQ6QDP-D10NP0eI.js → erDiagram-RLTQ6QDP-Tlu09_Nm.js} +12 -12
  101. package/dist/{erlang-BtAuIoF0.js → erlang-AdO1-xtV.js} +1 -1
  102. package/dist/error-banner-Da600cwz.js +362 -0
  103. package/dist/{error-entries-B2Ux3Z2X.js → error-entries-zfHL6H60.js} +2 -2
  104. package/dist/{esm-h8f7-1CJ.js → esm-AMFssoNp.js} +380 -374
  105. package/dist/{esm-BElI3qKH.js → esm-D2gTsXEV.js} +579 -579
  106. package/dist/{factor-3nzOwLuN.js → factor-Ys-13HOP.js} +2 -2
  107. package/dist/{fcl-C90TGnJJ.js → fcl-DnwditDr.js} +1 -1
  108. package/dist/{feedback-button-BU771zKS.js → feedback-button-pfhtTNjh.js} +13 -13
  109. package/dist/flowDiagram-HODETNUW-CAYbpJmV.js +16 -0
  110. package/dist/{formats-Q9gwlLyD.js → formats-DLtvJPnj.js} +6 -6
  111. package/dist/{forth-DEaRrLUi.js → forth-DiMuIXFe.js} +1 -1
  112. package/dist/{fortran-Bv6JRUjY.js → fortran-hkrF2eM4.js} +1 -1
  113. package/dist/{ganttDiagram-EL5Y4UJY-cRRaDt88.js → ganttDiagram-EL5Y4UJY-BQT16JSc.js} +2 -2
  114. package/dist/{gas-JNerWj3-.js → gas-DlhqN9k8.js} +1 -1
  115. package/dist/{gherkin-CSrl-H70.js → gherkin-0SlhEZ3t.js} +1 -1
  116. package/dist/{gitGraphDiagram-WWUBYQGX-Pox5k9-Y.js → gitGraphDiagram-WWUBYQGX-D5nSIzdE.js} +2 -2
  117. package/dist/{glide-data-editor-D9TpbHEU.js → glide-data-editor-B3x7mDpj.js} +60 -60
  118. package/dist/{glide-utils-CzzWU59p.js → glide-utils-DJyqh0EM.js} +4 -4
  119. package/dist/{globals-nXV4QUKg.js → globals-6B7ecxsC.js} +3 -3
  120. package/dist/{groovy-X7euO_vE.js → groovy-YhcTMyvX.js} +1 -1
  121. package/dist/{haskell-C48Z70Az.js → haskell-CodLxrtT.js} +1 -1
  122. package/dist/{haxe-CAUWMmwR.js → haxe-CiRWNFkH.js} +1 -1
  123. package/dist/{highlighted-body-KPVGNVTW-Ad3MKZ18.js → highlighted-body-KPVGNVTW-zwjq21tf.js} +4 -4
  124. package/dist/{html-to-image-BZBwkkDG.js → html-to-image-BJJsbNZ1.js} +547 -569
  125. package/dist/{http-BrSBnhDH.js → http-Bh6HhdNR.js} +1 -1
  126. package/dist/{idl-BXuPleZv.js → idl-DZgBq75I.js} +1 -1
  127. package/dist/{infoDiagram-27XIBGKW-DrYu3UZC.js → infoDiagram-27XIBGKW-XrDxhr0x.js} +2 -2
  128. package/dist/{ishikawaDiagram-5VMMS53U-pmkGQJsA.js → ishikawaDiagram-5VMMS53U-CD1muzov.js} +3 -3
  129. package/dist/{javascript-B4EPWJf_.js → javascript-BfNytHiM.js} +1 -1
  130. package/dist/{journeyDiagram-3NMN7TZE-EPJDPlt0.js → journeyDiagram-3NMN7TZE-BaLqn-dZ.js} +2 -2
  131. package/dist/{jsx-runtime-DgDPJV9S.js → jsx-runtime-3BD1kT0s.js} +1 -1
  132. package/dist/{julia-ke9Kh8b7.js → julia--tLIAG7q.js} +1 -1
  133. package/dist/{kanban-definition-UXKFOSKX-wWGD9VLW.js → kanban-definition-UXKFOSKX-Dg9W142_.js} +9 -9
  134. package/dist/{katex-BNCmKUol.js → katex-BIdZGsyO.js} +141 -116
  135. package/dist/label-BDKF3Afc.js +281 -0
  136. package/dist/{livescript-Ce4uqGAC.js → livescript-CVPfYnY_.js} +1 -1
  137. package/dist/{loader-C9OUkMrj.js → loader-BQOfjTIJ.js} +1 -1
  138. package/dist/{lua-D6fti_Jk.js → lua-4Fa-T-qq.js} +1 -1
  139. package/dist/main.js +7036 -6893
  140. package/dist/{mathematica-DcEpZ3Vj.js → mathematica-CtYAy6GG.js} +1 -1
  141. package/dist/{mbox-DFBbOu0X.js → mbox-D0w9Ah1C.js} +1 -1
  142. package/dist/{mermaid-Dfvntf3s.js → mermaid-CiAXjLpA.js} +57 -57
  143. package/dist/mermaid-HWGCJPDP-ByCsZnYF.js +2 -0
  144. package/dist/{mhchem-BEc7A1or.js → mhchem-CdWPJK6g.js} +1 -1
  145. package/dist/{mindmap-definition-YA3MSWOX-C2f1VIBR.js → mindmap-definition-YA3MSWOX-DgCidgYJ.js} +11 -11
  146. package/dist/{mirc-CqeibO3N.js → mirc-De9aSAZM.js} +1 -1
  147. package/dist/{mllike-D54QZYTP.js → mllike-BbugeaY_.js} +1 -1
  148. package/dist/{modelica-DuML2-8V.js → modelica-BjJwWw1F.js} +1 -1
  149. package/dist/{mscgen-CJmKwp3b.js → mscgen-DwiRH5ma.js} +1 -1
  150. package/dist/{mumps-DaVgFtkd.js → mumps--plbDM9o.js} +1 -1
  151. package/dist/{nginx-BXN1rqI0.js → nginx-C4Df7REc.js} +1 -1
  152. package/dist/{nsis-CMfRqf0V.js → nsis-fiiOqLc3.js} +7 -7
  153. package/dist/{ntriples-BiOGlMDR.js → ntriples-jV77I4k8.js} +1 -1
  154. package/dist/{number-overlay-editor-BH4Uo_sZ.js → number-overlay-editor-CyJwIeU1.js} +5 -5
  155. package/dist/{octave-CgVnzxKk.js → octave-Cztd01tF.js} +1 -1
  156. package/dist/{oz-B2mky97X.js → oz-Bl8o3BDl.js} +1 -1
  157. package/dist/{pascal-BoZhBf6s.js → pascal-BO5JqysR.js} +1 -1
  158. package/dist/{pegDiagram-XKGWAZYB-D6v5dz4M.js → pegDiagram-XKGWAZYB-coOYYKB6.js} +3 -3
  159. package/dist/{perl-DjzMqXtt.js → perl-Drlh9s6m.js} +1 -1
  160. package/dist/{pieDiagram-E7YTZNPT-BwFAhpYD.js → pieDiagram-E7YTZNPT-BnXTc3bj.js} +3 -3
  161. package/dist/{pig-B2mB-01d.js → pig-BWGR8wZw.js} +1 -1
  162. package/dist/{powershell-D0zT88Aj.js → powershell-DT99xlz_.js} +1 -1
  163. package/dist/{process-output-BSsWzfnY.js → process-output-C1GGFU6Q.js} +4 -4
  164. package/dist/{properties-3_5qCgOj.js → properties-Q-rkxld0.js} +1 -1
  165. package/dist/{protobuf-Dgoxfi1H.js → protobuf-DKyWZbs7.js} +1 -1
  166. package/dist/{pug-CNRdd8oG.js → pug-42ZJUbEC.js} +2 -2
  167. package/dist/{puppet-DzILxZfz.js → puppet-B4UozHhh.js} +1 -1
  168. package/dist/purify.es-DMv5zIkJ.js +866 -0
  169. package/dist/{python-AfVdMn_l.js → python-DREjAV__.js} +1 -1
  170. package/dist/{q-C6p-CGWh.js → q-Bi63IpBO.js} +1 -1
  171. package/dist/{quadrantDiagram-AXDQQJYC--kqzFC3w.js → quadrantDiagram-AXDQQJYC-Ccw0xMjN.js} +1 -1
  172. package/dist/{r-CzKF1D2X.js → r-DSwXWKMR.js} +1 -1
  173. package/dist/{railroadDiagram-O6MQD6OU-D6eOFr6Z.js → railroadDiagram-O6MQD6OU-B28-u83n.js} +3 -3
  174. package/dist/{react-dom-BUgJ-ab_.js → react-dom-DUmH0GXv.js} +29 -21
  175. package/dist/{react-ofJbxM4x.js → react-sHtZdjeP.js} +103 -94
  176. package/dist/{react-vega-ewj7q_U5.js → react-vega-BED0DjiB.js} +3 -3
  177. package/dist/{requirementDiagram-BXWQKSXE-CHYsMgDR.js → requirementDiagram-BXWQKSXE-CdYCTMu0.js} +11 -11
  178. package/dist/{reveal-component-_A40NW1c.js → reveal-component-CPohnNHB.js} +906 -878
  179. package/dist/{rpm-Bx7FkjTO.js → rpm-DPb1DeKM.js} +1 -1
  180. package/dist/{ruby-BMzgq2bf.js → ruby-U7fZA4DP.js} +2 -2
  181. package/dist/{sankeyDiagram-P5KCCOFB-BdzhT0BM.js → sankeyDiagram-P5KCCOFB-ELvOcnZH.js} +1 -1
  182. package/dist/{sas-ClGVnK3F.js → sas-CLk1JpTn.js} +1 -1
  183. package/dist/{scheme-C0MXqXep.js → scheme-CT-2k2Tl.js} +1 -1
  184. package/dist/select-BButFi-d.js +1344 -0
  185. package/dist/{sequenceDiagram-WJ2MYXX4-BPAknhBp.js → sequenceDiagram-WJ2MYXX4-CM3aRAe_.js} +4 -4
  186. package/dist/{shell-CiQZv6oG.js → shell-BLO7fcsk.js} +1 -1
  187. package/dist/{sieve-BiIMePvV.js → sieve-nG3C7WNH.js} +1 -1
  188. package/dist/{simple-mode-8ETW2RS6.js → simple-mode-C683Q7or.js} +1 -1
  189. package/dist/{smalltalk-9-llftyG.js → smalltalk-BROcZybA.js} +1 -1
  190. package/dist/{solr-CxCKEuwq.js → solr-mVltHNc5.js} +1 -1
  191. package/dist/{sparql-BRmy7pzx.js → sparql-Cv1Ksr4v.js} +1 -1
  192. package/dist/{spec-D62vWpMT.js → spec-BwarBpUJ.js} +116 -135
  193. package/dist/{spreadsheet-UCNUIGsn.js → spreadsheet-BwTnp5K_.js} +1 -1
  194. package/dist/{sql-D0hSGZ-H.js → sql-CjLt0122.js} +1 -1
  195. package/dist/{stateDiagram-D77RDMKH-Cq249IQ4.js → stateDiagram-D77RDMKH-DOZUMVj8.js} +13 -13
  196. package/dist/stateDiagram-v2-MP3YSRHH-CISYxma6.js +30 -0
  197. package/dist/{stex-UeT_Aofp.js → stex-Btf3omL8.js} +1 -1
  198. package/dist/style.css +1 -1
  199. package/dist/{stylus-Fi4waA2H.js → stylus-Dt4VvLXL.js} +1 -1
  200. package/dist/{swift-NqPyaBye.js → swift-DHsn_CVI.js} +1 -1
  201. package/dist/{swimlanes-42K2YHIH-Bh_S_HKD.js → swimlanes-42K2YHIH-BkSppxp8.js} +10 -10
  202. package/dist/swimlanesDiagram-VR7AAH4N-c8G5pGxC.js +30 -0
  203. package/dist/{swiper-component-DkV7T44B.js → swiper-component-DKntyn8p.js} +5 -5
  204. package/dist/{tcl-B4f0xfmM.js → tcl-CV0OLBOl.js} +1 -1
  205. package/dist/{textile-CnNbnPTe.js → textile-D320oKVM.js} +1 -1
  206. package/dist/{tiddlywiki-CSGSOg38.js → tiddlywiki-BVVNvfy4.js} +1 -1
  207. package/dist/{tiki-9F02WBA6.js → tiki-BF2aDPlB.js} +1 -1
  208. package/dist/{timeline-definition-24CTP7MA-ByNMgBE7.js → timeline-definition-24CTP7MA-CaMQayqK.js} +3 -3
  209. package/dist/{toDate-DWVp6uE1.js → toDate-Dwcg_x_5.js} +5 -6
  210. package/dist/{toast-DcoJGS3-.js → toast-B9UMEi8u.js} +161 -165
  211. package/dist/{toml-AesZ6RBt.js → toml-CaUN7UHo.js} +1 -1
  212. package/dist/{tooltip-Bi36DgYh.js → tooltip-BO1REbqs.js} +548 -584
  213. package/dist/{troff-DlfvveK1.js → troff-DQUFcClZ.js} +1 -1
  214. package/dist/{ttcn--YVSkGs_.js → ttcn-CQL1duJS.js} +1 -1
  215. package/dist/{ttcn-cfg-Bb1Knl_J.js → ttcn-cfg-BMmEFJPu.js} +1 -1
  216. package/dist/{turtle-DC24v1bz.js → turtle-C3esgsRr.js} +1 -1
  217. package/dist/{use-restore-focus-ZgG5Br63.js → use-restore-focus-BEM7sFWl.js} +2430 -2007
  218. package/dist/{use-vega-container-remeasure-4DwJbPWu.js → use-vega-container-remeasure-Bz4PZMtt.js} +2 -2
  219. package/dist/{useAsyncData-BD7NLQ3_.js → useAsyncData-Deh5kszT.js} +3 -3
  220. package/dist/{useDateFormatter-D8XWr8lL.js → useDateFormatter-D8XruNGG.js} +53 -32
  221. package/dist/{useDeepCompareMemoize-CawMGSRU.js → useDeepCompareMemoize-DXwzRINI.js} +2 -2
  222. package/dist/{useIframeCapabilities-BUMBOpsM.js → useIframeCapabilities-DBETvvPl.js} +2 -2
  223. package/dist/{useLifecycle-3vGhRa1o.js → useLifecycle-j7D9uD1o.js} +6 -6
  224. package/dist/{useTheme-BOw801nZ.js → useTheme-CRnjkku0.js} +7 -7
  225. package/dist/{vb-Dpc8vhvF.js → vb-RK1eDXRl.js} +1 -1
  226. package/dist/{vbscript-B-Y1XnZe.js → vbscript-BCOeM0de.js} +1 -1
  227. package/dist/{vega-component-9siY74NS.js → vega-component-DLBAQLSf.js} +14 -14
  228. package/dist/{vega-embed-container-sSR5hAsy.js → vega-embed-container-BNHE18G9.js} +5 -5
  229. package/dist/{velocity-DHMu9kc-.js → velocity-CZKOFbOI.js} +1 -1
  230. package/dist/{vennDiagram-4TSXK5OY-DY8CySdO.js → vennDiagram-4TSXK5OY-CF8pfaK3.js} +3 -3
  231. package/dist/{verilog-DhiEaoUl.js → verilog-DqQTzVn8.js} +1 -1
  232. package/dist/{vhdl-D4X23YKO.js → vhdl-vQr2bfmi.js} +1 -1
  233. package/dist/{wardleyDiagram-VM6X3IG4-DYC1AFni.js → wardleyDiagram-VM6X3IG4-dGPu39d-.js} +3 -3
  234. package/dist/{webidl-SyzNxWpJ.js → webidl-DzX7N40e.js} +1 -1
  235. package/dist/{xquery-BC2R4Hk6.js → xquery-Cw_Q_hGR.js} +1 -1
  236. package/dist/{xychartDiagram-S5SC5T6Z-Df8LLnuY.js → xychartDiagram-S5SC5T6Z-CP6-9q56.js} +5 -5
  237. package/dist/{yacas-DLNXPMmH.js → yacas-DiC4jJBE.js} +1 -1
  238. package/dist/{z80-CDXWHOO6.js → z80-CUOQDEJO.js} +1 -1
  239. package/package.json +38 -37
  240. package/src/__tests__/mount.test.ts +6 -6
  241. package/src/components/chat/__tests__/chat-history-popover.test.tsx +157 -0
  242. package/src/components/chat/chat-history-popover.tsx +98 -17
  243. package/src/components/chat/chat-panel.tsx +29 -0
  244. package/src/components/chat/tool-call/__tests__/tool-result.test.tsx +56 -0
  245. package/src/components/chat/tool-call/tool-result.tsx +3 -3
  246. package/src/components/data-table/TableTopBar.tsx +4 -0
  247. package/src/components/data-table/__tests__/export-actions.test.tsx +1111 -14
  248. package/src/components/data-table/__tests__/pagination.test.tsx +85 -1
  249. package/src/components/data-table/__tests__/schemas.test.ts +57 -0
  250. package/src/components/data-table/charts/__tests__/schemas.test.ts +25 -0
  251. package/src/components/data-table/charts/__tests__/slider-field.test.tsx +54 -0
  252. package/src/components/data-table/charts/__tests__/spec.test.ts +26 -23
  253. package/src/components/data-table/charts/components/form-fields.tsx +3 -1
  254. package/src/components/data-table/charts/constants.ts +11 -10
  255. package/src/components/data-table/charts/types.ts +1 -0
  256. package/src/components/data-table/data-table.tsx +3 -0
  257. package/src/components/data-table/export-actions.tsx +365 -81
  258. package/src/components/data-table/pagination.tsx +16 -2
  259. package/src/components/data-table/schemas.ts +90 -14
  260. package/src/components/editor/actions/__tests__/pair-with-agent-commands.test.ts +32 -46
  261. package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +29 -40
  262. package/src/components/editor/actions/pair-with-agent-commands.ts +3 -4
  263. package/src/components/editor/actions/pair-with-agent-modal.tsx +4 -7
  264. package/src/components/editor/actions/useRestartKernel.tsx +2 -2
  265. package/src/components/editor/alerts/__tests__/connection-notice.test.tsx +224 -17
  266. package/src/components/editor/alerts/connection-details.tsx +61 -0
  267. package/src/components/editor/alerts/connection-notice.tsx +46 -53
  268. package/src/components/editor/alerts/startup-progress.tsx +73 -129
  269. package/src/components/editor/app-container.tsx +2 -2
  270. package/src/components/editor/boundary/__tests__/ErrorBoundary.test.tsx +2 -2
  271. package/src/components/editor/cell/CreateCellButton.tsx +2 -2
  272. package/src/components/editor/cell/DeleteButton.tsx +2 -2
  273. package/src/components/editor/cell/RunButton.tsx +3 -3
  274. package/src/components/editor/cell/StopButton.tsx +2 -2
  275. package/src/components/editor/chrome/components/__tests__/feedback-button.test.tsx +4 -4
  276. package/src/components/editor/chrome/components/feedback-button.tsx +3 -3
  277. package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +8 -8
  278. package/src/components/editor/chrome/panels/__tests__/{sandbox-details.test.tsx → runtime-details.test.tsx} +94 -22
  279. package/src/components/editor/chrome/panels/__tests__/sandbox-recovery.test.tsx +4 -4
  280. package/src/components/editor/chrome/panels/packages-panel.tsx +8 -29
  281. package/src/components/editor/chrome/panels/{sandbox-details-state.ts → runtime-details-state.ts} +1 -1
  282. package/src/components/editor/chrome/panels/{sandbox-panel.tsx → runtime-panel.tsx} +38 -66
  283. package/src/components/editor/chrome/panels/runtime-status-toggle.tsx +56 -0
  284. package/src/components/editor/chrome/panels/sandbox-controller.tsx +2 -2
  285. package/src/components/editor/chrome/wrapper/app-chrome.tsx +3 -3
  286. package/src/components/editor/chrome/wrapper/footer-items/machine-stats.tsx +2 -2
  287. package/src/components/editor/controls/Controls.tsx +3 -3
  288. package/src/components/editor/controls/__tests__/notebook-menu-dropdown.test.tsx +2 -2
  289. package/src/components/editor/header/__tests__/status.test.tsx +4 -4
  290. package/src/components/editor/header/app-header.tsx +2 -2
  291. package/src/components/editor/header/status.tsx +3 -3
  292. package/src/components/editor/navigation/__tests__/navigation.test.ts +8 -8
  293. package/src/components/editor/output/console/ConsoleOutput.tsx +5 -3
  294. package/src/components/editor/output/console/__tests__/ConsoleOutput.test.tsx +18 -0
  295. package/src/components/ui/__tests__/slider.test.tsx +37 -0
  296. package/src/components/ui/progress-stages.tsx +114 -0
  297. package/src/components/ui/slider.tsx +2 -0
  298. package/src/core/ai/__tests__/state.test.ts +120 -0
  299. package/src/core/ai/state.ts +36 -10
  300. package/src/core/cells/__tests__/document-roundtrip.test.ts +16 -0
  301. package/src/core/codemirror/copilot/__tests__/completion-integration.test.ts +447 -0
  302. package/src/core/codemirror/copilot/__tests__/inline-completion.test.ts +395 -0
  303. package/src/core/codemirror/copilot/__tests__/language-server.test.ts +511 -2
  304. package/src/core/codemirror/copilot/__tests__/rpc-cancellation.test.ts +201 -0
  305. package/src/core/codemirror/copilot/extension.ts +22 -11
  306. package/src/core/codemirror/copilot/language-server.ts +109 -60
  307. package/src/core/codemirror/language/embedded/__tests__/embedded-python.test.ts +138 -26
  308. package/src/core/codemirror/language/embedded/embedded-python.ts +47 -13
  309. package/src/core/codemirror/language/embedded/latex.ts +20 -13
  310. package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +106 -5
  311. package/src/core/codemirror/lsp/notebook-lsp.ts +16 -2
  312. package/src/core/codemirror/readonly/__tests__/extension.test.ts +6 -6
  313. package/src/core/codemirror/readonly/extension.ts +2 -2
  314. package/src/core/config/pair.ts +0 -1
  315. package/src/core/datasets/__tests__/data-source-discovery.test.ts +2 -2
  316. package/src/core/edit-app.tsx +5 -1
  317. package/src/core/export/hooks.ts +2 -2
  318. package/src/core/islands/bootstrap.ts +1 -0
  319. package/src/core/kernel/session.ts +9 -0
  320. package/src/core/network/__tests__/api.test.ts +114 -1
  321. package/src/core/network/__tests__/connection.test.ts +3 -3
  322. package/src/core/network/api.ts +3 -2
  323. package/src/core/network/connection-notice.ts +5 -5
  324. package/src/core/network/connection.ts +9 -9
  325. package/src/core/network/requests-lazy.ts +2 -2
  326. package/src/core/packages/__tests__/useSandboxController.test.tsx +2 -2
  327. package/src/core/packages/useSandboxController.ts +6 -6
  328. package/src/core/runtime/__tests__/adapter.test.ts +6 -6
  329. package/src/core/runtime/adapter.ts +7 -7
  330. package/src/core/runtime/config.ts +2 -2
  331. package/src/core/saving/filename.ts +2 -2
  332. package/src/core/saving/save-component.tsx +5 -5
  333. package/src/core/saving/useAutoSave.ts +2 -2
  334. package/src/core/wasm/__tests__/bootstrap.test.ts +33 -1
  335. package/src/core/wasm/worker/bootstrap.ts +22 -3
  336. package/src/core/websocket/__tests__/useMarimoKernelConnection.hook.test.tsx +30 -25
  337. package/src/core/websocket/__tests__/useMarimoKernelConnection.test.ts +5 -5
  338. package/src/core/websocket/connection-utils.ts +21 -21
  339. package/src/core/websocket/types.ts +8 -9
  340. package/src/core/websocket/useMarimoKernelConnection.tsx +33 -22
  341. package/src/css/katex-css.test.ts +166 -0
  342. package/src/css/katex.min.css +175 -169
  343. package/src/hooks/__tests__/useEventListener.test.tsx +45 -1
  344. package/src/hooks/useEventListener.ts +6 -1
  345. package/src/mount.tsx +2 -2
  346. package/src/plugins/core/__test__/registerReactComponent.test.ts +55 -0
  347. package/src/plugins/core/registerReactComponent.tsx +3 -1
  348. package/src/plugins/impl/CheckboxPlugin.tsx +1 -1
  349. package/src/plugins/impl/DataTablePlugin.tsx +23 -2
  350. package/src/plugins/impl/DatePickerPlugin.tsx +5 -3
  351. package/src/plugins/impl/DateRangePlugin.tsx +5 -3
  352. package/src/plugins/impl/DateTimePickerPlugin.tsx +5 -3
  353. package/src/plugins/impl/DropdownPlugin.tsx +1 -1
  354. package/src/plugins/impl/MultiselectPlugin.tsx +1 -1
  355. package/src/plugins/impl/NumberPlugin.tsx +1 -1
  356. package/src/plugins/impl/RadioPlugin.tsx +5 -1
  357. package/src/plugins/impl/RangeSliderPlugin.tsx +1 -1
  358. package/src/plugins/impl/SearchableSelect.tsx +1 -1
  359. package/src/plugins/impl/SliderPlugin.tsx +5 -1
  360. package/src/plugins/impl/SwitchPlugin.tsx +6 -1
  361. package/src/plugins/impl/TextAreaPlugin.tsx +23 -4
  362. package/src/plugins/impl/TextInputPlugin.tsx +10 -2
  363. package/src/plugins/impl/__test__/slider-labels.test.tsx +136 -0
  364. package/src/plugins/impl/__test__/text-labels.test.tsx +141 -0
  365. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +65 -8
  366. package/src/plugins/impl/__tests__/widget-labels.test.tsx +122 -0
  367. package/src/plugins/impl/chat/ChatPlugin.tsx +1 -1
  368. package/src/plugins/impl/common/labeled.tsx +9 -3
  369. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +15 -3
  370. package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +0 -22
  371. package/src/stories/cell.stories.tsx +2 -2
  372. package/src/stories/dataframe.stories.tsx +7 -0
  373. package/src/stories/layout/vertical/one-column.stories.tsx +5 -5
  374. package/src/stories/progress-stages.stories.tsx +62 -0
  375. package/src/stories/runtime-existing.stories.tsx +44 -0
  376. package/src/stories/runtime-maintenance.stories.tsx +40 -0
  377. package/src/stories/runtime-pixi.stories.tsx +28 -0
  378. package/src/stories/{sandbox.stories.tsx → runtime-story.tsx} +191 -152
  379. package/src/stories/runtime-uv.stories.tsx +56 -0
  380. package/dist/assets/__vite-browser-external-C9iR87Zl.js +0 -1
  381. package/dist/assets/worker-D7hWi02M.js +0 -109
  382. package/dist/classDiagram-ZZMXUADV-BwYhrSEX.js +0 -30
  383. package/dist/classDiagram-v2-VYDZK3BY-HecM04TM.js +0 -30
  384. package/dist/dropdown-menu-BaqM0t4N.js +0 -4502
  385. package/dist/error-banner-DzAmP0AQ.js +0 -391
  386. package/dist/flowDiagram-HODETNUW-DgcjSdPV.js +0 -16
  387. package/dist/label-MNhNNoN6.js +0 -278
  388. package/dist/mermaid-HWGCJPDP-DYCzSILp.js +0 -2
  389. package/dist/purify.es-DgKyQviY.js +0 -805
  390. package/dist/select-BcObMjGz.js +0 -970
  391. package/dist/stateDiagram-v2-MP3YSRHH-Dk5QgdXF.js +0 -30
  392. package/dist/swimlanesDiagram-VR7AAH4N-CbztusY8.js +0 -30
  393. package/src/components/editor/chrome/panels/sandbox-toggle.tsx +0 -52
@@ -7,7 +7,7 @@ import { kioskModeAtom } from "@/core/mode";
7
7
  import { connectionAtom } from "@/core/network/connection";
8
8
  import { store } from "@/core/state/jotai";
9
9
  import { isStaticNotebook } from "@/core/static/static-state";
10
- import { WebSocketState } from "@/core/websocket/types";
10
+ import { ConnectionState } from "@/core/websocket/types";
11
11
  import { pairPreviewAtom } from "@/core/config/pair";
12
12
  import { PAIR_PREVIEW } from "./fixtures/pair-preview";
13
13
  import { mount, visibleForTesting } from "../mount";
@@ -59,7 +59,7 @@ describe("mount", () => {
59
59
  store.set(layoutStateAtom, initialLayoutState());
60
60
  store.set(kioskModeAtom, false);
61
61
  // Reset connection atom to initial state
62
- store.set(connectionAtom, { state: WebSocketState.NOT_STARTED });
62
+ store.set(connectionAtom, { state: ConnectionState.NOT_STARTED });
63
63
  });
64
64
 
65
65
  afterEach(() => {
@@ -111,7 +111,7 @@ describe("mount", () => {
111
111
  );
112
112
 
113
113
  const connection = store.get(connectionAtom);
114
- expect(connection.state).toBe(WebSocketState.CONNECTING);
114
+ expect(connection.state).toBe(ConnectionState.CONNECTING);
115
115
  });
116
116
 
117
117
  it("should keep connection as NOT_STARTED when runtimeConfig has lazy=true", () => {
@@ -124,7 +124,7 @@ describe("mount", () => {
124
124
  );
125
125
 
126
126
  const connection = store.get(connectionAtom);
127
- expect(connection.state).toBe(WebSocketState.NOT_STARTED);
127
+ expect(connection.state).toBe(ConnectionState.NOT_STARTED);
128
128
  });
129
129
 
130
130
  it("should keep connection as NOT_STARTED when no runtimeConfig is provided", () => {
@@ -137,7 +137,7 @@ describe("mount", () => {
137
137
  );
138
138
 
139
139
  const connection = store.get(connectionAtom);
140
- expect(connection.state).toBe(WebSocketState.NOT_STARTED);
140
+ expect(connection.state).toBe(ConnectionState.NOT_STARTED);
141
141
  });
142
142
 
143
143
  it("should keep connection as NOT_STARTED for static notebooks even with lazy=false", () => {
@@ -155,7 +155,7 @@ describe("mount", () => {
155
155
  );
156
156
 
157
157
  const connection = store.get(connectionAtom);
158
- expect(connection.state).toBe(WebSocketState.NOT_STARTED);
158
+ expect(connection.state).toBe(ConnectionState.NOT_STARTED);
159
159
  });
160
160
  });
161
161
 
@@ -0,0 +1,157 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { act, fireEvent, render, screen } from "@testing-library/react";
4
+ import { createStore, Provider } from "jotai";
5
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
6
+ import { ModalProvider } from "@/components/modal/ImperativeModal";
7
+ import { TooltipProvider } from "@/components/ui/tooltip";
8
+ import { type Chat, type ChatId, chatStateAtom } from "@/core/ai/state";
9
+ import { ChatHistoryPopover } from "../chat-history-popover";
10
+
11
+ const activeId = "active" as ChatId;
12
+ const olderId = "older" as ChatId;
13
+
14
+ function chat(id: ChatId): Chat {
15
+ return {
16
+ id,
17
+ title: `${id} conversation`,
18
+ messages: [
19
+ {
20
+ id: `${id}-message`,
21
+ role: "user",
22
+ parts: [{ type: "text", text: "Hello" }],
23
+ },
24
+ ],
25
+ createdAt: Date.now(),
26
+ updatedAt: Date.now(),
27
+ };
28
+ }
29
+
30
+ function setup(isLoading = false) {
31
+ const store = createStore();
32
+ const setActiveChat = vi.fn();
33
+ const onDeleteChats = vi.fn();
34
+
35
+ render(
36
+ <Provider store={store}>
37
+ <ModalProvider>
38
+ <TooltipProvider>
39
+ <ChatHistoryPopover
40
+ activeChatId={activeId}
41
+ setActiveChat={setActiveChat}
42
+ onDeleteChats={onDeleteChats}
43
+ isLoading={isLoading}
44
+ />
45
+ </TooltipProvider>
46
+ </ModalProvider>
47
+ </Provider>,
48
+ );
49
+ act(() =>
50
+ store.set(chatStateAtom, {
51
+ chats: new Map([
52
+ [activeId, chat(activeId)],
53
+ [olderId, chat(olderId)],
54
+ ]),
55
+ activeChatId: activeId,
56
+ }),
57
+ );
58
+
59
+ fireEvent.click(screen.getByRole("button", { name: "Previous chats" }));
60
+ return { store, setActiveChat, onDeleteChats };
61
+ }
62
+
63
+ describe("chat history management", () => {
64
+ beforeEach(() => window.localStorage.clear());
65
+ afterEach(() => vi.restoreAllMocks());
66
+
67
+ it("deletes individual chats immediately without selecting them or closing history", () => {
68
+ const { setActiveChat, onDeleteChats } = setup();
69
+ fireEvent.click(
70
+ screen.getByRole("button", { name: "Delete chat: older conversation" }),
71
+ );
72
+ expect(screen.queryByRole("alertdialog")).not.toBeInTheDocument();
73
+ expect(screen.getByPlaceholderText("Search chat history...")).toBeVisible();
74
+ expect(onDeleteChats).toHaveBeenCalledExactlyOnceWith(olderId);
75
+ expect(setActiveChat).not.toHaveBeenCalled();
76
+ });
77
+
78
+ it("deletes all chats only after confirmation", () => {
79
+ const { onDeleteChats } = setup();
80
+ fireEvent.change(screen.getByPlaceholderText("Search chat history..."), {
81
+ target: { value: "older" },
82
+ });
83
+ fireEvent.click(screen.getByRole("button", { name: "Delete all chats" }));
84
+ expect(screen.getByRole("alertdialog")).toHaveTextContent("all notebooks");
85
+ expect(onDeleteChats).not.toHaveBeenCalled();
86
+ fireEvent.click(screen.getByRole("button", { name: "Delete all chats" }));
87
+ expect(onDeleteChats).toHaveBeenCalledExactlyOnceWith(null);
88
+ });
89
+
90
+ it("keeps focus in history after deleting the focused chat", () => {
91
+ const { store, onDeleteChats } = setup();
92
+ onDeleteChats.mockImplementation(() => {
93
+ store.set(chatStateAtom, (prev) => {
94
+ const chats = new Map(prev.chats);
95
+ chats.delete(olderId);
96
+ return { ...prev, chats };
97
+ });
98
+ });
99
+ const searchInput = screen.getByPlaceholderText("Search chat history...");
100
+ fireEvent.change(searchInput, { target: { value: "older" } });
101
+ const deleteButton = screen.getByRole("button", {
102
+ name: "Delete chat: older conversation",
103
+ });
104
+ act(() => deleteButton.focus());
105
+ expect(deleteButton).toHaveFocus();
106
+
107
+ fireEvent.click(deleteButton);
108
+
109
+ expect(deleteButton).not.toBeInTheDocument();
110
+ expect(searchInput).toHaveFocus();
111
+ expect(screen.getByText("No chats found")).toBeVisible();
112
+ });
113
+
114
+ it("prevents deleting a streaming chat while allowing cleanup of other chats", () => {
115
+ setup(true);
116
+ expect(
117
+ screen.getByRole("button", { name: "Delete chat: active conversation" }),
118
+ ).toBeDisabled();
119
+ expect(
120
+ screen.getByRole("button", { name: "Delete all chats" }),
121
+ ).toBeDisabled();
122
+ expect(
123
+ screen.getByRole("button", { name: "Delete chat: older conversation" }),
124
+ ).toBeEnabled();
125
+ });
126
+
127
+ it("warns above 50 chats and clears the warning after cleanup", () => {
128
+ const { store } = setup();
129
+ const chats = new Map<ChatId, Chat>(
130
+ Array.from({ length: 51 }, (_, index) => {
131
+ const id = `chat-${index}` as ChatId;
132
+ return [id, chat(id)];
133
+ }),
134
+ );
135
+ act(() => store.set(chatStateAtom, { chats, activeChatId: null }));
136
+ const warning = screen.getByText(
137
+ /Delete old chats to free up browser storage/,
138
+ );
139
+ expect(warning).toBeVisible();
140
+ expect(warning).toHaveTextContent(
141
+ "You have over 50 chats. Delete old chats to free up browser storage.",
142
+ );
143
+
144
+ act(() =>
145
+ store.set(chatStateAtom, (prev) => ({
146
+ ...prev,
147
+ chats: new Map([...prev.chats].slice(1)),
148
+ })),
149
+ );
150
+ expect(
151
+ screen.queryByText(/Delete old chats to free up browser storage/),
152
+ ).not.toBeInTheDocument();
153
+ expect(
154
+ screen.getByText("Chats are shared across notebooks."),
155
+ ).toBeVisible();
156
+ });
157
+ });
@@ -1,9 +1,16 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
3
  import { useAtomValue } from "jotai";
4
- import { BotMessageSquareIcon, ClockIcon, SearchIcon } from "lucide-react";
5
- import { useMemo, useState } from "react";
4
+ import {
5
+ BotMessageSquareIcon,
6
+ ClockIcon,
7
+ SearchIcon,
8
+ Trash2Icon,
9
+ } from "lucide-react";
10
+ import { useMemo, useRef, useState } from "react";
6
11
  import { useLocale } from "react-aria";
12
+ import { useImperativeModal } from "@/components/modal/ImperativeModal";
13
+ import { AlertDialogDestructiveAction } from "@/components/ui/alert-dialog";
7
14
  import { Button } from "@/components/ui/button";
8
15
  import { Input } from "@/components/ui/input";
9
16
  import {
@@ -19,18 +26,48 @@ import { timeAgo } from "@/utils/dates";
19
26
  import { PanelEmptyState } from "../editor/chrome/panels/empty-state";
20
27
  import { groupChatsByDate } from "./chat-history-utils";
21
28
 
29
+ const CHAT_HISTORY_WARNING_THRESHOLD = 50;
30
+
22
31
  interface ChatHistoryPopoverProps {
23
32
  activeChatId: ChatId | undefined;
24
33
  setActiveChat: (id: ChatId | null) => void;
34
+ onDeleteChats: (id: ChatId | null) => void;
35
+ isLoading: boolean;
25
36
  }
26
37
 
27
38
  export const ChatHistoryPopover: React.FC<ChatHistoryPopoverProps> = ({
28
39
  activeChatId,
29
40
  setActiveChat,
41
+ onDeleteChats,
42
+ isLoading,
30
43
  }) => {
31
44
  const chatState = useAtomValue(chatStateAtom);
32
45
  const { locale } = useLocale();
33
46
  const [searchQuery, setSearchQuery] = useState("");
47
+ const searchInputRef = useRef<HTMLInputElement>(null);
48
+ const [open, setOpen] = useState(false);
49
+ const { openConfirm, closeModal } = useImperativeModal();
50
+
51
+ const confirmDeleteAllChats = () => {
52
+ // Close the popover before opening a modal so focus moves to the dialog.
53
+ setOpen(false);
54
+ openConfirm({
55
+ title: "Delete all chats?",
56
+ description:
57
+ "This will permanently delete all chat history for all notebooks on this site in this browser. This cannot be undone.",
58
+ variant: "destructive",
59
+ confirmAction: (
60
+ <AlertDialogDestructiveAction
61
+ onClick={() => {
62
+ onDeleteChats(null);
63
+ closeModal();
64
+ }}
65
+ >
66
+ Delete all chats
67
+ </AlertDialogDestructiveAction>
68
+ ),
69
+ });
70
+ };
34
71
 
35
72
  const chats = useMemo(() => {
36
73
  return [...chatState.chats.values()].toSorted(
@@ -52,10 +89,10 @@ export const ChatHistoryPopover: React.FC<ChatHistoryPopoverProps> = ({
52
89
  }, [filteredChats]);
53
90
 
54
91
  return (
55
- <Popover>
92
+ <Popover open={open} onOpenChange={setOpen}>
56
93
  <Tooltip content="Previous chats">
57
94
  <PopoverTrigger asChild={true}>
58
- <Button variant="text" size="icon">
95
+ <Button variant="text" size="icon" aria-label="Previous chats">
59
96
  <ClockIcon className="h-4 w-4" />
60
97
  </Button>
61
98
  </PopoverTrigger>
@@ -63,6 +100,7 @@ export const ChatHistoryPopover: React.FC<ChatHistoryPopoverProps> = ({
63
100
  <PopoverContent className="w-[480px] p-0" align="start" side="right">
64
101
  <div className="pt-3 px-3 w-full">
65
102
  <Input
103
+ ref={searchInputRef}
66
104
  placeholder="Search chat history..."
67
105
  value={searchQuery}
68
106
  onChange={(e) => setSearchQuery(e.target.value)}
@@ -92,25 +130,46 @@ export const ChatHistoryPopover: React.FC<ChatHistoryPopoverProps> = ({
92
130
  </div>
93
131
  <div>
94
132
  {group.chats.map((chat) => (
95
- <button
133
+ <div
96
134
  key={chat.id}
97
135
  className={cn(
98
- "w-full p-1 rounded-md cursor-pointer text-left flex items-center justify-between",
136
+ "w-full rounded-md flex items-center justify-between",
99
137
  chat.id === activeChatId && "bg-accent",
100
138
  chat.id !== activeChatId && "hover:bg-muted/20",
101
139
  )}
102
- onClick={() => {
103
- setActiveChat(chat.id);
104
- }}
105
- type="button"
106
140
  >
107
- <div className="flex-1 min-w-0">
108
- <div className="text-sm truncate">{chat.title}</div>
109
- </div>
110
- <div className="text-xs text-muted-foreground/60 ml-2 shrink-0">
111
- {timeAgo(chat.updatedAt, locale)}
112
- </div>
113
- </button>
141
+ <button
142
+ className="flex flex-1 min-w-0 items-center justify-between p-1 text-left cursor-pointer"
143
+ onClick={() => setActiveChat(chat.id)}
144
+ type="button"
145
+ >
146
+ <span className="text-sm truncate">{chat.title}</span>
147
+ <span className="text-xs text-muted-foreground/60 ml-2 shrink-0">
148
+ {timeAgo(chat.updatedAt, locale)}
149
+ </span>
150
+ </button>
151
+ <Tooltip
152
+ content={
153
+ isLoading && chat.id === activeChatId
154
+ ? "Stop the response before deleting this chat"
155
+ : "Delete chat"
156
+ }
157
+ >
158
+ <Button
159
+ variant="text"
160
+ size="icon"
161
+ className="text-muted-foreground/90 hover:text-destructive transition-colors ml-px"
162
+ aria-label={`Delete chat: ${chat.title}`}
163
+ disabled={isLoading && chat.id === activeChatId}
164
+ onClick={() => {
165
+ searchInputRef.current?.focus();
166
+ onDeleteChats(chat.id);
167
+ }}
168
+ >
169
+ <Trash2Icon className="h-3.5 w-3.5" />
170
+ </Button>
171
+ </Tooltip>
172
+ </div>
114
173
  ))}
115
174
  </div>
116
175
  {/* If last group, don't show a divider */}
@@ -119,6 +178,28 @@ export const ChatHistoryPopover: React.FC<ChatHistoryPopoverProps> = ({
119
178
  ))}
120
179
  </div>
121
180
  </ScrollArea>
181
+ {chats.length > 0 && (
182
+ <div className="border-t p-2 flex items-center justify-between gap-2">
183
+ {chats.length > CHAT_HISTORY_WARNING_THRESHOLD ? (
184
+ <p className="text-xs text-muted-foreground">
185
+ You have over <b>{CHAT_HISTORY_WARNING_THRESHOLD}</b> chats.
186
+ Delete old chats to free up browser storage.
187
+ </p>
188
+ ) : (
189
+ <p className="text-xs text-muted-foreground">
190
+ Chats are shared across notebooks.
191
+ </p>
192
+ )}
193
+ <Button
194
+ variant="linkDestructive"
195
+ size="xs"
196
+ disabled={isLoading}
197
+ onClick={confirmDeleteAllChats}
198
+ >
199
+ Delete all chats
200
+ </Button>
201
+ </div>
202
+ )}
122
203
  </PopoverContent>
123
204
  </Popover>
124
205
  );
@@ -150,12 +150,16 @@ interface ChatHeaderProps {
150
150
  onNewChat: () => void;
151
151
  activeChatId: ChatId | undefined;
152
152
  setActiveChat: (id: ChatId | null) => void;
153
+ onDeleteChats: (id: ChatId | null) => void;
154
+ isLoading: boolean;
153
155
  }
154
156
 
155
157
  const ChatHeader: React.FC<ChatHeaderProps> = ({
156
158
  onNewChat,
157
159
  activeChatId,
158
160
  setActiveChat,
161
+ onDeleteChats,
162
+ isLoading,
159
163
  }) => {
160
164
  const { handleClick } = useOpenSettingsToTab();
161
165
 
@@ -184,6 +188,8 @@ const ChatHeader: React.FC<ChatHeaderProps> = ({
184
188
  <ChatHistoryPopover
185
189
  activeChatId={activeChatId}
186
190
  setActiveChat={setActiveChat}
191
+ onDeleteChats={onDeleteChats}
192
+ isLoading={isLoading}
187
193
  />
188
194
  </div>
189
195
  </div>
@@ -838,6 +844,27 @@ const ChatPanelBody = () => {
838
844
  clearFiles();
839
845
  });
840
846
 
847
+ const handleDeleteChats = useEvent((id: ChatId | null) => {
848
+ if (id === null || id === activeChatId) {
849
+ handleNewChat();
850
+ }
851
+ setChatState((prev) => {
852
+ const chats = new Map(prev.chats);
853
+ if (id === null) {
854
+ chats.clear();
855
+ } else {
856
+ chats.delete(id);
857
+ }
858
+ return {
859
+ chats,
860
+ activeChatId:
861
+ prev.activeChatId && chats.has(prev.activeChatId)
862
+ ? prev.activeChatId
863
+ : null,
864
+ };
865
+ });
866
+ });
867
+
841
868
  const handlePairWithAgent = useEvent(() => {
842
869
  openModal(<PairWithAgentModal onClose={closeModal} />);
843
870
  });
@@ -997,6 +1024,8 @@ const ChatPanelBody = () => {
997
1024
  onNewChat={handleNewChat}
998
1025
  activeChatId={activeChat?.id}
999
1026
  setActiveChat={setActiveChat}
1027
+ onDeleteChats={handleDeleteChats}
1028
+ isLoading={isLoading}
1000
1029
  />
1001
1030
  </TooltipProvider>
1002
1031
 
@@ -0,0 +1,56 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { cleanup, render, screen } from "@testing-library/react";
4
+ import { afterEach, describe, expect, it } from "vitest";
5
+ import { ResultRenderer } from "../tool-result";
6
+
7
+ afterEach(cleanup);
8
+
9
+ describe("ResultRenderer", () => {
10
+ it.each([
11
+ { status: "success", message: "No output was returned." },
12
+ { status: "success", next_steps: ["Run the edited cells."] },
13
+ {
14
+ status: "success",
15
+ action_url: null,
16
+ next_steps: null,
17
+ meta: null,
18
+ message: "Finished",
19
+ },
20
+ {
21
+ status: "success",
22
+ action_url: "/notebook",
23
+ next_steps: ["Review the output."],
24
+ meta: { source: "notebook" },
25
+ cellsToOutput: { cell: { cellOutput: "Hello", consoleOutput: "" } },
26
+ },
27
+ ])("renders structured results with optional fields: %j", (result) => {
28
+ render(<ResultRenderer result={result} />);
29
+
30
+ expect(screen.getByRole("heading", { name: "Tool Result" })).toBeVisible();
31
+ expect(screen.getByText("success")).toBeVisible();
32
+ });
33
+
34
+ it("displays messages and tool-specific output without metadata", () => {
35
+ render(
36
+ <ResultRenderer
37
+ result={{
38
+ status: "success",
39
+ message: "Cells finished running.",
40
+ cellsToOutput: { cell: { cellOutput: "Hello", consoleOutput: "" } },
41
+ }}
42
+ />,
43
+ );
44
+
45
+ expect(screen.getByText("Cells finished running.")).toBeVisible();
46
+ expect(screen.getByText("cellsToOutput")).toBeVisible();
47
+ expect(screen.getByText(/"cellOutput": "Hello"/)).toBeVisible();
48
+ });
49
+
50
+ it("preserves the fallback for unstructured results", () => {
51
+ render(<ResultRenderer result="Plain text result" />);
52
+
53
+ expect(screen.queryByRole("heading", { name: "Tool Result" })).toBeNull();
54
+ expect(screen.getByText("Plain text result")).toBeVisible();
55
+ });
56
+ });
@@ -21,9 +21,9 @@ function isUninformative(value: unknown): boolean {
21
21
  const SuccessResultSchema = z.looseObject({
22
22
  status: z.string().default("success"),
23
23
  auth_required: z.boolean().default(false),
24
- action_url: z.any(),
25
- next_steps: z.any(),
26
- meta: z.any(),
24
+ action_url: z.any().optional(),
25
+ next_steps: z.any().optional(),
26
+ meta: z.any().optional(),
27
27
  message: z.string().nullish(),
28
28
  });
29
29
 
@@ -54,6 +54,8 @@ export const TableTopBar = <TData,>({
54
54
  togglePanel,
55
55
  isAnyPanelOpen,
56
56
  downloadAs,
57
+ getExportMetadata,
58
+ metadataSource,
57
59
  sizeBytes,
58
60
  sizeBytesIsLoading,
59
61
  }: TableTopBarProps<TData>) => {
@@ -132,6 +134,8 @@ export const TableTopBar = <TData,>({
132
134
  {downloadAs && (
133
135
  <ExportActions
134
136
  downloadAs={downloadAs}
137
+ getExportMetadata={getExportMetadata}
138
+ metadataSource={metadataSource}
135
139
  sizeBytes={sizeBytes}
136
140
  sizeBytesIsLoading={sizeBytesIsLoading}
137
141
  />