@marimo-team/islands 0.25.2-dev10 → 0.25.2-dev101

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 (358) hide show
  1. package/dist/{ConnectedDataExplorerComponent-CqhQmp74.js → ConnectedDataExplorerComponent-BZmqc_F0.js} +11 -11
  2. package/dist/{ErrorBoundary-BN_cZouT.js → ErrorBoundary-DZ39uB77.js} +8 -8
  3. package/dist/{abnfDiagram-VCTEODGH-aLGD44M7.js → abnfDiagram-VCTEODGH-C_Lmaa2j.js} +3 -3
  4. package/dist/{any-language-editor-dqxlUDlT.js → any-language-editor-BFzqhOBR.js} +5 -5
  5. package/dist/{apl-BYaaig9_.js → apl-GEW9-ZP1.js} +1 -1
  6. package/dist/{architectureDiagram-5GKGNRK7-BGL5P81u.js → architectureDiagram-5GKGNRK7-BKMataHB.js} +5 -5
  7. package/dist/{asciiarmor-GKQFJXQG.js → asciiarmor-BWNxzkG7.js} +1 -1
  8. package/dist/{asn1-BsSb7HP5.js → asn1-Bcn2QutK.js} +1 -1
  9. package/dist/assets/__vite-browser-external-BqAtzd2P.js +1 -0
  10. package/dist/assets/{worker-D7hWi02M.js → worker-Bf8dt6S-.js} +5 -5
  11. package/dist/{asterisk-B3I8SNb5.js → asterisk-lE36-hJK.js} +1 -1
  12. package/dist/{blockDiagram-I7D4REHJ-CvBmppdy.js → blockDiagram-I7D4REHJ-BeHOjyDk.js} +9 -9
  13. package/dist/{brainfuck-DXjk3bQe.js → brainfuck-BQCYDheZ.js} +1 -1
  14. package/dist/{button-B0Xgl-Qn.js → button-BtsM2UqM.js} +300 -283
  15. package/dist/{c4Diagram-7LVT6UL2-EceL4_jH.js → c4Diagram-7LVT6UL2-Bao10t_O.js} +7 -7
  16. package/dist/{capabilities-D7Ad8-zw.js → capabilities-A5jrzjCJ.js} +1 -1
  17. package/dist/{cells-5ppES-Un.js → cells-DZi0ioak.js} +4330 -4313
  18. package/dist/{channel-z7HZXHwv.js → channel-BxCkvUgE.js} +1 -1
  19. package/dist/{chat-ui-Dv2V95k6.js → chat-ui-CwOWzoSO.js} +46 -46
  20. package/dist/{check-DGZ74tV2.js → check-CNP79M3A.js} +1 -1
  21. package/dist/{chunk-4HAMMTFA-BPTTOOC5.js → chunk-4HAMMTFA-CH7Gpamd.js} +5 -5
  22. package/dist/{chunk-75Z2AOVW-C4AOleKf.js → chunk-75Z2AOVW-AI7CvgKn.js} +1 -1
  23. package/dist/{chunk-DU6HZSFF-1TwWR6gh.js → chunk-DU6HZSFF-BSvuTkX4.js} +1 -1
  24. package/dist/{chunk-F27PBJKO-DMI1PBe4.js → chunk-F27PBJKO-CLshwT9T.js} +1 -1
  25. package/dist/{chunk-GMAD6QVW-vStrMz2P.js → chunk-GMAD6QVW-wnHcn-lH.js} +3 -3
  26. package/dist/{chunk-GVQU2GXP-2HwWgs4u.js → chunk-GVQU2GXP-7O2p8hut.js} +2 -2
  27. package/dist/{chunk-IMKFNOWR-Cm3RgLDj.js → chunk-IMKFNOWR-Bu0Vh_Yi.js} +6 -6
  28. package/dist/{chunk-L3NEJ4N5-RhC7i0I2.js → chunk-L3NEJ4N5-B9_Alrxb.js} +5 -5
  29. package/dist/{chunk-OSK3NFVY-CZV09N-U.js → chunk-OSK3NFVY-PeQPH2fD.js} +6 -6
  30. package/dist/{chunk-P2QGCYS3-0TAWai9C.js → chunk-P2QGCYS3-D9twiFuU.js} +1 -1
  31. package/dist/{chunk-POPQ4Y6H-Cc3_56GX.js → chunk-POPQ4Y6H-BUiNs18s.js} +1 -1
  32. package/dist/{chunk-PWAF6VOD-lNxB9k8z.js → chunk-PWAF6VOD-D8S9NPCy.js} +1 -1
  33. package/dist/{chunk-SHT3W25Y-DedDYSP5.js → chunk-SHT3W25Y-B2dyNZ31.js} +8 -8
  34. package/dist/{chunk-SVP7TREG-B2SFkCAL.js → chunk-SVP7TREG-D7UPvB10.js} +2 -2
  35. package/dist/{chunk-TICWLB2K-DB6hjNOL.js → chunk-TICWLB2K-BNaGoadd.js} +6 -6
  36. package/dist/classDiagram-ZZMXUADV-Bbo2n384.js +30 -0
  37. package/dist/classDiagram-v2-VYDZK3BY-xR8cGP0r.js +30 -0
  38. package/dist/{clike-E2lFbGVj.js → clike-CxK9W55Z.js} +1 -1
  39. package/dist/{clojure-Dn_K4RlK.js → clojure-Dzcvwpxk.js} +1 -1
  40. package/dist/{cmake-DpN2Top5.js → cmake-DYr-71zp.js} +1 -1
  41. package/dist/{cobol-Chf22-GM.js → cobol-DC3g37Kq.js} +1 -1
  42. package/dist/{code-visibility-BN3vHwPi.js → code-visibility-DQKgkPWC.js} +6 -6
  43. package/dist/{coffeescript-BVe1OiD9.js → coffeescript-C-eFwH5N.js} +1 -1
  44. package/dist/{common-0_BcyLKM.js → common-ChAbaAaQ.js} +11801 -11503
  45. package/dist/{commonlisp-DxoBG7fU.js → commonlisp-CyaNXrJR.js} +1 -1
  46. package/dist/{copy-icon-qmRg_VTX.js → copy-icon-BY7jgcaV.js} +3 -3
  47. package/dist/{crystal-DCM3yc4r.js → crystal-ih5ax5tQ.js} +1 -1
  48. package/dist/{css-DkZ9mMyI.js → css-CN_wP7_R.js} +1 -1
  49. package/dist/{cynefinDiagram-5FMLGOSQ-DzaZEqgD.js → cynefinDiagram-5FMLGOSQ-CCDn4Z9e.js} +3 -3
  50. package/dist/{cypher-Drw_8U5I.js → cypher-CqGRcmZo.js} +1 -1
  51. package/dist/{d-CsVGcKMF.js → d-Cj0sOW2z.js} +1 -1
  52. package/dist/{dagre-GXQ25YYZ-Cjf5GjU3.js → dagre-GXQ25YYZ-BJiUO_SV.js} +10 -10
  53. package/dist/{data-grid-overlay-editor-605LiK17.js → data-grid-overlay-editor-P5LaBOQE.js} +1 -1
  54. package/dist/{diagram-S7CK7UJ4-IhLt_khx.js → diagram-S7CK7UJ4-BZfxFNRR.js} +4 -4
  55. package/dist/{diagram-UQ7AKVKN-CQc6KLPB.js → diagram-UQ7AKVKN-1xcsiIMg.js} +3 -3
  56. package/dist/{diagram-VSXAHHWV-CR7BJygZ.js → diagram-VSXAHHWV-DPAWJ9Nw.js} +2 -2
  57. package/dist/{diagram-VX7I27RA-DHmW9N1T.js → diagram-VX7I27RA-DmRsnHYY.js} +5 -5
  58. package/dist/{diagram-Z3DM3KII-zVKsg-Ty.js → diagram-Z3DM3KII--b49ryKx.js} +3 -3
  59. package/dist/{dialog-CILKhbsG.js → dialog-CmExhUDI.js} +26 -26
  60. package/dist/{diff-CBikYCUF.js → diff-B_hUkiat.js} +1 -1
  61. package/dist/{dist-Df0wKI0F.js → dist-BK4Oj99o.js} +1 -1
  62. package/dist/{dist-BVGtK7Ht.js → dist-BLfKmR-l.js} +1 -1
  63. package/dist/{dist-B8D7McG3.js → dist-BMQf5zIS.js} +46 -46
  64. package/dist/{dist-C2KzV-vf.js → dist-BorMD-uX.js} +2 -2
  65. package/dist/{dist-Cs2FijYk.js → dist-BuaRHxOc.js} +2 -2
  66. package/dist/{dist-DPcEtqmG.js → dist-Bvs24R_E.js} +47 -47
  67. package/dist/{dist-lA1Cttkb.js → dist-C8fAKSH1.js} +41 -41
  68. package/dist/{dist-DszxuxS1.js → dist-CLdpGQVr.js} +2 -2
  69. package/dist/{dist-CO1AwwG_.js → dist-CN8zI-XC.js} +209 -209
  70. package/dist/{dist-D1PpnuZB.js → dist-CN_BeG2I.js} +1 -1
  71. package/dist/{dist-CPGxfVGX.js → dist-CSJ0MDRw.js} +1 -1
  72. package/dist/{dist-Cm3iAFMD.js → dist-CSbh1PNP.js} +3 -3
  73. package/dist/{dist-9x1ZRe-e.js → dist-Cg7gzw-a.js} +2 -2
  74. package/dist/{dist-B1vYLK28.js → dist-CkTTIdBe.js} +345 -345
  75. package/dist/{dist-BRxfaJgs.js → dist-CrSP_H1M.js} +296 -296
  76. package/dist/{dist-C2wDlYdD.js → dist-D-wwqlzJ.js} +2 -2
  77. package/dist/{dist-BtKIs9N-.js → dist-D6d86eNJ.js} +1 -1
  78. package/dist/{dist-DHOTQar0.js → dist-DBtSl3sf.js} +1 -1
  79. package/dist/{dist-KzZ7WELx.js → dist-DiDibOYr.js} +120 -120
  80. package/dist/{dist-Kxgjxakw.js → dist-DoE4XJBC.js} +1277 -1222
  81. package/dist/{dist-BHCHt1NI.js → dist-F8Ep36rk.js} +1 -1
  82. package/dist/{dist-C8xMLVYi.js → dist-OR1OnN-y.js} +44 -44
  83. package/dist/{dist-1HDa70oE.js → dist-PXYI_yuP.js} +3 -3
  84. package/dist/{dist-CMh_W4y4.js → dist-diIx5qJW.js} +2 -2
  85. package/dist/{dockerfile-DJnSntVB.js → dockerfile-D0VKN500.js} +2 -2
  86. package/dist/dropdown-menu-Cz4TdOJh.js +4678 -0
  87. package/dist/{dtd-BHa4v0Bn.js → dtd-B8FGSWWe.js} +1 -1
  88. package/dist/{dylan-BypL2Zz8.js → dylan-DbIBYIrw.js} +1 -1
  89. package/dist/{ebnf-5guncNu-.js → ebnf-D-YbYLdk.js} +1 -1
  90. package/dist/{ebnfDiagram-PWID7BFC-DDd5hCRC.js → ebnfDiagram-PWID7BFC-rSwVyh4y.js} +3 -3
  91. package/dist/{ecl-iRcVIKYZ.js → ecl-DBmkdWAd.js} +1 -1
  92. package/dist/{eiffel-BEqF9aU4.js → eiffel-CcWSDDzK.js} +1 -1
  93. package/dist/{elm-DYcfNE9c.js → elm-MC-b8a6C.js} +1 -1
  94. package/dist/{erDiagram-RLTQ6QDP-D10NP0eI.js → erDiagram-RLTQ6QDP-Bfd3iAoC.js} +12 -12
  95. package/dist/{erlang-BtAuIoF0.js → erlang-AdO1-xtV.js} +1 -1
  96. package/dist/error-banner-D30nA9nE.js +362 -0
  97. package/dist/{error-entries-B2Ux3Z2X.js → error-entries-BovkFYNy.js} +2 -2
  98. package/dist/{esm-BElI3qKH.js → esm-D2gTsXEV.js} +579 -579
  99. package/dist/{esm-h8f7-1CJ.js → esm-DAVrGVKP.js} +378 -372
  100. package/dist/{factor-3nzOwLuN.js → factor-Ys-13HOP.js} +2 -2
  101. package/dist/{fcl-C90TGnJJ.js → fcl-DnwditDr.js} +1 -1
  102. package/dist/{feedback-button-CLWf8TnU.js → feedback-button-BnxE7fZ8.js} +10 -10
  103. package/dist/flowDiagram-HODETNUW-D7IBKS12.js +16 -0
  104. package/dist/{formats-Q9gwlLyD.js → formats-DhhbdyAH.js} +3 -3
  105. package/dist/{forth-DEaRrLUi.js → forth-DiMuIXFe.js} +1 -1
  106. package/dist/{fortran-Bv6JRUjY.js → fortran-hkrF2eM4.js} +1 -1
  107. package/dist/{ganttDiagram-EL5Y4UJY-cRRaDt88.js → ganttDiagram-EL5Y4UJY-B4m_YsKa.js} +2 -2
  108. package/dist/{gas-JNerWj3-.js → gas-DlhqN9k8.js} +1 -1
  109. package/dist/{gherkin-CSrl-H70.js → gherkin-0SlhEZ3t.js} +1 -1
  110. package/dist/{gitGraphDiagram-WWUBYQGX-Pox5k9-Y.js → gitGraphDiagram-WWUBYQGX-QRBbvWXh.js} +2 -2
  111. package/dist/{glide-data-editor-B4MX_nQW.js → glide-data-editor-BXTJ6SnL.js} +11 -11
  112. package/dist/{glide-utils-CzzWU59p.js → glide-utils-BVJ4fkxX.js} +3 -3
  113. package/dist/{globals-BlPkNbZ-.js → globals-B75IJp1A.js} +3 -3
  114. package/dist/{groovy-X7euO_vE.js → groovy-YhcTMyvX.js} +1 -1
  115. package/dist/{haskell-C48Z70Az.js → haskell-CodLxrtT.js} +1 -1
  116. package/dist/{haxe-CAUWMmwR.js → haxe-CiRWNFkH.js} +1 -1
  117. package/dist/{html-to-image-BZBwkkDG.js → html-to-image-Cn1_16-x.js} +543 -565
  118. package/dist/{http-BrSBnhDH.js → http-Bh6HhdNR.js} +1 -1
  119. package/dist/{idl-BXuPleZv.js → idl-DZgBq75I.js} +1 -1
  120. package/dist/{infoDiagram-27XIBGKW-DrYu3UZC.js → infoDiagram-27XIBGKW-DVQFYvhg.js} +2 -2
  121. package/dist/{ishikawaDiagram-5VMMS53U-pmkGQJsA.js → ishikawaDiagram-5VMMS53U-viPND-nm.js} +3 -3
  122. package/dist/{javascript-B4EPWJf_.js → javascript-BfNytHiM.js} +1 -1
  123. package/dist/{journeyDiagram-3NMN7TZE-EPJDPlt0.js → journeyDiagram-3NMN7TZE-BeeJdJo3.js} +2 -2
  124. package/dist/{julia-ke9Kh8b7.js → julia--tLIAG7q.js} +1 -1
  125. package/dist/{kanban-definition-UXKFOSKX-wWGD9VLW.js → kanban-definition-UXKFOSKX-Dcl_ECO9.js} +9 -9
  126. package/dist/{label-MNhNNoN6.js → label-DQO1jFjf.js} +96 -93
  127. package/dist/{livescript-Ce4uqGAC.js → livescript-CVPfYnY_.js} +1 -1
  128. package/dist/{loader-C9OUkMrj.js → loader-Cm-ATtou.js} +1 -1
  129. package/dist/{lua-D6fti_Jk.js → lua-4Fa-T-qq.js} +1 -1
  130. package/dist/main.js +6939 -6820
  131. package/dist/{mathematica-DcEpZ3Vj.js → mathematica-CtYAy6GG.js} +1 -1
  132. package/dist/{mbox-DFBbOu0X.js → mbox-D0w9Ah1C.js} +1 -1
  133. package/dist/{mermaid-Dfvntf3s.js → mermaid-BfhcnSj-.js} +54 -54
  134. package/dist/{mindmap-definition-YA3MSWOX-C2f1VIBR.js → mindmap-definition-YA3MSWOX-BdxxhF-5.js} +11 -11
  135. package/dist/{mirc-CqeibO3N.js → mirc-De9aSAZM.js} +1 -1
  136. package/dist/{mllike-D54QZYTP.js → mllike-BbugeaY_.js} +1 -1
  137. package/dist/{modelica-DuML2-8V.js → modelica-BjJwWw1F.js} +1 -1
  138. package/dist/{mscgen-CJmKwp3b.js → mscgen-DwiRH5ma.js} +1 -1
  139. package/dist/{mumps-DaVgFtkd.js → mumps--plbDM9o.js} +1 -1
  140. package/dist/{nginx-BXN1rqI0.js → nginx-C4Df7REc.js} +1 -1
  141. package/dist/{nsis-CMfRqf0V.js → nsis-fiiOqLc3.js} +7 -7
  142. package/dist/{ntriples-BiOGlMDR.js → ntriples-jV77I4k8.js} +1 -1
  143. package/dist/{number-overlay-editor-Df-fuwOC.js → number-overlay-editor-DGR0D9_d.js} +1 -1
  144. package/dist/{octave-CgVnzxKk.js → octave-Cztd01tF.js} +1 -1
  145. package/dist/{oz-B2mky97X.js → oz-Bl8o3BDl.js} +1 -1
  146. package/dist/{pascal-BoZhBf6s.js → pascal-BO5JqysR.js} +1 -1
  147. package/dist/{pegDiagram-XKGWAZYB-D6v5dz4M.js → pegDiagram-XKGWAZYB-Du5p2s0w.js} +3 -3
  148. package/dist/{perl-DjzMqXtt.js → perl-Drlh9s6m.js} +1 -1
  149. package/dist/{pieDiagram-E7YTZNPT-BwFAhpYD.js → pieDiagram-E7YTZNPT-DJg-SOIq.js} +3 -3
  150. package/dist/{pig-B2mB-01d.js → pig-BWGR8wZw.js} +1 -1
  151. package/dist/{powershell-D0zT88Aj.js → powershell-DT99xlz_.js} +1 -1
  152. package/dist/{process-output-BSsWzfnY.js → process-output-CUG57KRp.js} +4 -4
  153. package/dist/{properties-3_5qCgOj.js → properties-Q-rkxld0.js} +1 -1
  154. package/dist/{protobuf-Dgoxfi1H.js → protobuf-DKyWZbs7.js} +1 -1
  155. package/dist/{pug-CNRdd8oG.js → pug-42ZJUbEC.js} +2 -2
  156. package/dist/{puppet-DzILxZfz.js → puppet-B4UozHhh.js} +1 -1
  157. package/dist/purify.es-DMv5zIkJ.js +866 -0
  158. package/dist/{python-AfVdMn_l.js → python-DREjAV__.js} +1 -1
  159. package/dist/{q-C6p-CGWh.js → q-Bi63IpBO.js} +1 -1
  160. package/dist/{quadrantDiagram-AXDQQJYC--kqzFC3w.js → quadrantDiagram-AXDQQJYC-keLfFx9f.js} +1 -1
  161. package/dist/{r-CzKF1D2X.js → r-DSwXWKMR.js} +1 -1
  162. package/dist/{railroadDiagram-O6MQD6OU-D6eOFr6Z.js → railroadDiagram-O6MQD6OU-C0ojm-6_.js} +3 -3
  163. package/dist/{requirementDiagram-BXWQKSXE-CHYsMgDR.js → requirementDiagram-BXWQKSXE-CNwNBmI3.js} +11 -11
  164. package/dist/{reveal-component-CymFYmw6.js → reveal-component-BvJjNn9X.js} +10 -10
  165. package/dist/{rpm-Bx7FkjTO.js → rpm-DPb1DeKM.js} +1 -1
  166. package/dist/{ruby-BMzgq2bf.js → ruby-U7fZA4DP.js} +2 -2
  167. package/dist/{sankeyDiagram-P5KCCOFB-BdzhT0BM.js → sankeyDiagram-P5KCCOFB-Bh4EsJox.js} +1 -1
  168. package/dist/{sas-ClGVnK3F.js → sas-CLk1JpTn.js} +1 -1
  169. package/dist/{scheme-C0MXqXep.js → scheme-CT-2k2Tl.js} +1 -1
  170. package/dist/select-Bs-nmvm6.js +1344 -0
  171. package/dist/{sequenceDiagram-WJ2MYXX4-BPAknhBp.js → sequenceDiagram-WJ2MYXX4-DQaW5qBG.js} +4 -4
  172. package/dist/{shell-CiQZv6oG.js → shell-BLO7fcsk.js} +1 -1
  173. package/dist/{sieve-BiIMePvV.js → sieve-nG3C7WNH.js} +1 -1
  174. package/dist/{simple-mode-8ETW2RS6.js → simple-mode-C683Q7or.js} +1 -1
  175. package/dist/{smalltalk-9-llftyG.js → smalltalk-BROcZybA.js} +1 -1
  176. package/dist/{solr-CxCKEuwq.js → solr-mVltHNc5.js} +1 -1
  177. package/dist/{sparql-BRmy7pzx.js → sparql-Cv1Ksr4v.js} +1 -1
  178. package/dist/{spec-D62vWpMT.js → spec-DVsoMvYT.js} +116 -135
  179. package/dist/{spreadsheet-UCNUIGsn.js → spreadsheet-BwTnp5K_.js} +1 -1
  180. package/dist/{sql-D0hSGZ-H.js → sql-CjLt0122.js} +1 -1
  181. package/dist/{stateDiagram-D77RDMKH-Cq249IQ4.js → stateDiagram-D77RDMKH-BDa515QC.js} +13 -13
  182. package/dist/stateDiagram-v2-MP3YSRHH-ChNddepZ.js +30 -0
  183. package/dist/{stex-UeT_Aofp.js → stex-Btf3omL8.js} +1 -1
  184. package/dist/style.css +1 -1
  185. package/dist/{stylus-Fi4waA2H.js → stylus-Dt4VvLXL.js} +1 -1
  186. package/dist/{swift-NqPyaBye.js → swift-DHsn_CVI.js} +1 -1
  187. package/dist/{swimlanes-42K2YHIH-Bh_S_HKD.js → swimlanes-42K2YHIH-M4IdGi8J.js} +10 -10
  188. package/dist/swimlanesDiagram-VR7AAH4N-FUSwmzEp.js +30 -0
  189. package/dist/{swiper-component-DkV7T44B.js → swiper-component-CpN-hewZ.js} +2 -2
  190. package/dist/{tcl-B4f0xfmM.js → tcl-CV0OLBOl.js} +1 -1
  191. package/dist/{textile-CnNbnPTe.js → textile-D320oKVM.js} +1 -1
  192. package/dist/{tiddlywiki-CSGSOg38.js → tiddlywiki-BVVNvfy4.js} +1 -1
  193. package/dist/{tiki-9F02WBA6.js → tiki-BF2aDPlB.js} +1 -1
  194. package/dist/{timeline-definition-24CTP7MA-ByNMgBE7.js → timeline-definition-24CTP7MA-DH-kvakg.js} +3 -3
  195. package/dist/{toDate-DWVp6uE1.js → toDate-vEi5kTfY.js} +4 -5
  196. package/dist/{toast-DcoJGS3-.js → toast-DfEpJedt.js} +157 -161
  197. package/dist/{toml-AesZ6RBt.js → toml-CaUN7UHo.js} +1 -1
  198. package/dist/{tooltip-Bi36DgYh.js → tooltip-CuNWg2ay.js} +543 -579
  199. package/dist/{troff-DlfvveK1.js → troff-DQUFcClZ.js} +1 -1
  200. package/dist/{ttcn--YVSkGs_.js → ttcn-CQL1duJS.js} +1 -1
  201. package/dist/{ttcn-cfg-Bb1Knl_J.js → ttcn-cfg-BMmEFJPu.js} +1 -1
  202. package/dist/{turtle-DC24v1bz.js → turtle-C3esgsRr.js} +1 -1
  203. package/dist/{use-restore-focus-ZgG5Br63.js → use-restore-focus-kmgwrL8q.js} +1833 -1625
  204. package/dist/{useAsyncData-BD7NLQ3_.js → useAsyncData-rkAlR_vh.js} +1 -1
  205. package/dist/{useDateFormatter-D8XWr8lL.js → useDateFormatter-C-tz65rD.js} +52 -31
  206. package/dist/{useDeepCompareMemoize-CawMGSRU.js → useDeepCompareMemoize-BlHFBj5_.js} +1 -1
  207. package/dist/{useIframeCapabilities-BUMBOpsM.js → useIframeCapabilities-C1Bt04Iz.js} +1 -1
  208. package/dist/{useLifecycle-3vGhRa1o.js → useLifecycle-B68iY077.js} +3 -3
  209. package/dist/{useTheme-BOw801nZ.js → useTheme-BwSgeAFb.js} +2 -2
  210. package/dist/{vb-Dpc8vhvF.js → vb-RK1eDXRl.js} +1 -1
  211. package/dist/{vbscript-B-Y1XnZe.js → vbscript-BCOeM0de.js} +1 -1
  212. package/dist/{vega-component-9siY74NS.js → vega-component-C-bPttRN.js} +9 -9
  213. package/dist/{velocity-DHMu9kc-.js → velocity-CZKOFbOI.js} +1 -1
  214. package/dist/{vennDiagram-4TSXK5OY-DY8CySdO.js → vennDiagram-4TSXK5OY-d5g7XeiI.js} +3 -3
  215. package/dist/{verilog-DhiEaoUl.js → verilog-DqQTzVn8.js} +1 -1
  216. package/dist/{vhdl-D4X23YKO.js → vhdl-vQr2bfmi.js} +1 -1
  217. package/dist/{wardleyDiagram-VM6X3IG4-DYC1AFni.js → wardleyDiagram-VM6X3IG4-BfX3bSzR.js} +3 -3
  218. package/dist/{webidl-SyzNxWpJ.js → webidl-DzX7N40e.js} +1 -1
  219. package/dist/{xquery-BC2R4Hk6.js → xquery-Cw_Q_hGR.js} +1 -1
  220. package/dist/{xychartDiagram-S5SC5T6Z-Df8LLnuY.js → xychartDiagram-S5SC5T6Z-C1QsLZg7.js} +5 -5
  221. package/dist/{yacas-DLNXPMmH.js → yacas-DiC4jJBE.js} +1 -1
  222. package/dist/{z80-CDXWHOO6.js → z80-CUOQDEJO.js} +1 -1
  223. package/package.json +18 -17
  224. package/src/__tests__/mount.test.ts +6 -6
  225. package/src/components/chat/__tests__/chat-history-popover.test.tsx +157 -0
  226. package/src/components/chat/chat-history-popover.tsx +98 -17
  227. package/src/components/chat/chat-panel.tsx +29 -0
  228. package/src/components/chat/tool-call/__tests__/tool-result.test.tsx +56 -0
  229. package/src/components/chat/tool-call/tool-result.tsx +3 -3
  230. package/src/components/data-table/TableTopBar.tsx +4 -0
  231. package/src/components/data-table/__tests__/export-actions.test.tsx +1111 -14
  232. package/src/components/data-table/__tests__/pagination.test.tsx +85 -1
  233. package/src/components/data-table/__tests__/schemas.test.ts +57 -0
  234. package/src/components/data-table/charts/__tests__/schemas.test.ts +25 -0
  235. package/src/components/data-table/charts/__tests__/slider-field.test.tsx +54 -0
  236. package/src/components/data-table/charts/__tests__/spec.test.ts +26 -23
  237. package/src/components/data-table/charts/components/form-fields.tsx +3 -1
  238. package/src/components/data-table/charts/constants.ts +11 -10
  239. package/src/components/data-table/charts/types.ts +1 -0
  240. package/src/components/data-table/data-table.tsx +3 -0
  241. package/src/components/data-table/export-actions.tsx +365 -81
  242. package/src/components/data-table/pagination.tsx +16 -2
  243. package/src/components/data-table/schemas.ts +90 -14
  244. package/src/components/editor/actions/__tests__/pair-with-agent-commands.test.ts +32 -46
  245. package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +29 -40
  246. package/src/components/editor/actions/pair-with-agent-commands.ts +3 -4
  247. package/src/components/editor/actions/pair-with-agent-modal.tsx +4 -7
  248. package/src/components/editor/actions/useRestartKernel.tsx +2 -2
  249. package/src/components/editor/alerts/__tests__/connection-notice.test.tsx +224 -17
  250. package/src/components/editor/alerts/connection-details.tsx +61 -0
  251. package/src/components/editor/alerts/connection-notice.tsx +46 -53
  252. package/src/components/editor/alerts/startup-progress.tsx +73 -129
  253. package/src/components/editor/app-container.tsx +2 -2
  254. package/src/components/editor/boundary/__tests__/ErrorBoundary.test.tsx +2 -2
  255. package/src/components/editor/cell/CreateCellButton.tsx +2 -2
  256. package/src/components/editor/cell/DeleteButton.tsx +2 -2
  257. package/src/components/editor/cell/RunButton.tsx +3 -3
  258. package/src/components/editor/cell/StopButton.tsx +2 -2
  259. package/src/components/editor/chrome/components/__tests__/feedback-button.test.tsx +4 -4
  260. package/src/components/editor/chrome/components/feedback-button.tsx +3 -3
  261. package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +8 -8
  262. package/src/components/editor/chrome/panels/__tests__/{sandbox-details.test.tsx → runtime-details.test.tsx} +94 -22
  263. package/src/components/editor/chrome/panels/__tests__/sandbox-recovery.test.tsx +4 -4
  264. package/src/components/editor/chrome/panels/packages-panel.tsx +8 -29
  265. package/src/components/editor/chrome/panels/{sandbox-details-state.ts → runtime-details-state.ts} +1 -1
  266. package/src/components/editor/chrome/panels/{sandbox-panel.tsx → runtime-panel.tsx} +38 -66
  267. package/src/components/editor/chrome/panels/runtime-status-toggle.tsx +56 -0
  268. package/src/components/editor/chrome/panels/sandbox-controller.tsx +2 -2
  269. package/src/components/editor/chrome/wrapper/app-chrome.tsx +3 -3
  270. package/src/components/editor/chrome/wrapper/footer-items/machine-stats.tsx +2 -2
  271. package/src/components/editor/controls/Controls.tsx +3 -3
  272. package/src/components/editor/controls/__tests__/notebook-menu-dropdown.test.tsx +2 -2
  273. package/src/components/editor/header/__tests__/status.test.tsx +4 -4
  274. package/src/components/editor/header/app-header.tsx +2 -2
  275. package/src/components/editor/header/status.tsx +3 -3
  276. package/src/components/editor/navigation/__tests__/navigation.test.ts +8 -8
  277. package/src/components/ui/__tests__/slider.test.tsx +37 -0
  278. package/src/components/ui/progress-stages.tsx +114 -0
  279. package/src/components/ui/slider.tsx +2 -0
  280. package/src/core/ai/__tests__/state.test.ts +120 -0
  281. package/src/core/ai/state.ts +36 -10
  282. package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +106 -5
  283. package/src/core/codemirror/lsp/notebook-lsp.ts +16 -2
  284. package/src/core/codemirror/readonly/__tests__/extension.test.ts +6 -6
  285. package/src/core/codemirror/readonly/extension.ts +2 -2
  286. package/src/core/config/pair.ts +0 -1
  287. package/src/core/datasets/__tests__/data-source-discovery.test.ts +2 -2
  288. package/src/core/edit-app.tsx +5 -1
  289. package/src/core/export/hooks.ts +2 -2
  290. package/src/core/islands/bootstrap.ts +1 -0
  291. package/src/core/kernel/session.ts +9 -0
  292. package/src/core/network/__tests__/connection.test.ts +3 -3
  293. package/src/core/network/connection-notice.ts +5 -5
  294. package/src/core/network/connection.ts +9 -9
  295. package/src/core/network/requests-lazy.ts +2 -2
  296. package/src/core/packages/__tests__/useSandboxController.test.tsx +2 -2
  297. package/src/core/packages/useSandboxController.ts +6 -6
  298. package/src/core/runtime/__tests__/adapter.test.ts +6 -6
  299. package/src/core/runtime/adapter.ts +7 -7
  300. package/src/core/runtime/config.ts +2 -2
  301. package/src/core/saving/filename.ts +2 -2
  302. package/src/core/saving/save-component.tsx +5 -5
  303. package/src/core/saving/useAutoSave.ts +2 -2
  304. package/src/core/wasm/__tests__/bootstrap.test.ts +33 -1
  305. package/src/core/wasm/worker/bootstrap.ts +22 -3
  306. package/src/core/websocket/__tests__/useMarimoKernelConnection.hook.test.tsx +30 -25
  307. package/src/core/websocket/__tests__/useMarimoKernelConnection.test.ts +5 -5
  308. package/src/core/websocket/connection-utils.ts +21 -21
  309. package/src/core/websocket/types.ts +8 -9
  310. package/src/core/websocket/useMarimoKernelConnection.tsx +33 -22
  311. package/src/css/katex-css.test.ts +166 -0
  312. package/src/css/katex.min.css +169 -168
  313. package/src/mount.tsx +2 -2
  314. package/src/plugins/core/__test__/registerReactComponent.test.ts +55 -0
  315. package/src/plugins/core/registerReactComponent.tsx +3 -1
  316. package/src/plugins/impl/CheckboxPlugin.tsx +1 -1
  317. package/src/plugins/impl/DataTablePlugin.tsx +23 -2
  318. package/src/plugins/impl/DatePickerPlugin.tsx +5 -3
  319. package/src/plugins/impl/DateRangePlugin.tsx +5 -3
  320. package/src/plugins/impl/DateTimePickerPlugin.tsx +5 -3
  321. package/src/plugins/impl/DropdownPlugin.tsx +1 -1
  322. package/src/plugins/impl/MultiselectPlugin.tsx +1 -1
  323. package/src/plugins/impl/NumberPlugin.tsx +1 -1
  324. package/src/plugins/impl/RadioPlugin.tsx +5 -1
  325. package/src/plugins/impl/RangeSliderPlugin.tsx +1 -1
  326. package/src/plugins/impl/SearchableSelect.tsx +1 -1
  327. package/src/plugins/impl/SliderPlugin.tsx +5 -1
  328. package/src/plugins/impl/SwitchPlugin.tsx +6 -1
  329. package/src/plugins/impl/TextAreaPlugin.tsx +23 -4
  330. package/src/plugins/impl/TextInputPlugin.tsx +10 -2
  331. package/src/plugins/impl/__test__/slider-labels.test.tsx +136 -0
  332. package/src/plugins/impl/__test__/text-labels.test.tsx +141 -0
  333. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +65 -8
  334. package/src/plugins/impl/__tests__/widget-labels.test.tsx +122 -0
  335. package/src/plugins/impl/chat/ChatPlugin.tsx +1 -1
  336. package/src/plugins/impl/common/labeled.tsx +9 -3
  337. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +15 -3
  338. package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +0 -22
  339. package/src/stories/cell.stories.tsx +2 -2
  340. package/src/stories/dataframe.stories.tsx +7 -0
  341. package/src/stories/layout/vertical/one-column.stories.tsx +5 -5
  342. package/src/stories/progress-stages.stories.tsx +62 -0
  343. package/src/stories/runtime-existing.stories.tsx +44 -0
  344. package/src/stories/runtime-maintenance.stories.tsx +40 -0
  345. package/src/stories/runtime-pixi.stories.tsx +28 -0
  346. package/src/stories/{sandbox.stories.tsx → runtime-story.tsx} +191 -152
  347. package/src/stories/runtime-uv.stories.tsx +56 -0
  348. package/dist/assets/__vite-browser-external-C9iR87Zl.js +0 -1
  349. package/dist/classDiagram-ZZMXUADV-BwYhrSEX.js +0 -30
  350. package/dist/classDiagram-v2-VYDZK3BY-HecM04TM.js +0 -30
  351. package/dist/dropdown-menu-BaqM0t4N.js +0 -4502
  352. package/dist/error-banner-DzAmP0AQ.js +0 -391
  353. package/dist/flowDiagram-HODETNUW-DgcjSdPV.js +0 -16
  354. package/dist/purify.es-DgKyQviY.js +0 -805
  355. package/dist/select-BcObMjGz.js +0 -970
  356. package/dist/stateDiagram-v2-MP3YSRHH-Dk5QgdXF.js +0 -30
  357. package/dist/swimlanesDiagram-VR7AAH4N-CbztusY8.js +0 -30
  358. package/src/components/editor/chrome/panels/sandbox-toggle.tsx +0 -52
@@ -4,12 +4,12 @@ import { EditorState } from "@codemirror/state";
4
4
  import { EditorView } from "@codemirror/view";
5
5
  import { createStore } from "jotai";
6
6
  import { describe, expect, it } from "vitest";
7
- import { WebSocketState } from "@/core/websocket/types";
7
+ import { ConnectionState } from "@/core/websocket/types";
8
8
  import { connectionAtom } from "../../../network/connection";
9
9
  import { dynamicReadonly, isEditorReadonly } from "../extension";
10
10
 
11
11
  function makeStoreWithConnection(
12
- state: typeof WebSocketState.CONNECTING | typeof WebSocketState.OPEN,
12
+ state: typeof ConnectionState.CONNECTING | typeof ConnectionState.OPEN,
13
13
  ) {
14
14
  const store = createStore();
15
15
  store.set(connectionAtom, { state });
@@ -18,7 +18,7 @@ function makeStoreWithConnection(
18
18
 
19
19
  describe("dynamicReadonly", () => {
20
20
  it("should be readonly when connection is not OPEN", () => {
21
- const store = makeStoreWithConnection(WebSocketState.CONNECTING);
21
+ const store = makeStoreWithConnection(ConnectionState.CONNECTING);
22
22
  const state = EditorState.create({
23
23
  doc: "test",
24
24
  extensions: [dynamicReadonly(store)],
@@ -27,7 +27,7 @@ describe("dynamicReadonly", () => {
27
27
  });
28
28
 
29
29
  it("should be editable when connection is OPEN", async () => {
30
- const store = makeStoreWithConnection(WebSocketState.OPEN);
30
+ const store = makeStoreWithConnection(ConnectionState.OPEN);
31
31
  const state = EditorState.create({
32
32
  doc: "test",
33
33
  extensions: [dynamicReadonly(store)],
@@ -37,7 +37,7 @@ describe("dynamicReadonly", () => {
37
37
  });
38
38
 
39
39
  it("should toggle readonly when connection state changes", () => {
40
- const store = makeStoreWithConnection(WebSocketState.CONNECTING);
40
+ const store = makeStoreWithConnection(ConnectionState.CONNECTING);
41
41
  const state = EditorState.create({
42
42
  doc: "test",
43
43
  extensions: [dynamicReadonly(store)],
@@ -45,7 +45,7 @@ describe("dynamicReadonly", () => {
45
45
  const view = new EditorView({ state });
46
46
  expect(isEditorReadonly(state)).toBe(true);
47
47
  // Simulate connection opening
48
- store.set(connectionAtom, { state: WebSocketState.OPEN });
48
+ store.set(connectionAtom, { state: ConnectionState.OPEN });
49
49
  // The extension uses a plugin to update the state, so we need to create a view to trigger it
50
50
  view.requestMeasure();
51
51
  // The state should now be editable
@@ -7,7 +7,7 @@ import {
7
7
  isAppConnecting,
8
8
  } from "@/core/websocket/connection-utils";
9
9
  import { connectionAtom } from "../../network/connection";
10
- import { WebSocketState } from "../../websocket/types";
10
+ import { ConnectionState } from "../../websocket/types";
11
11
 
12
12
  /**
13
13
  * State effect for updating readonly status based on connection
@@ -111,7 +111,7 @@ export function dynamicReadonly(store: ReturnType<typeof createStore>) {
111
111
  // Subscribe to connectionAtom and manage listeners
112
112
  const unsubscribe = store.sub(connectionAtom, () => {
113
113
  const connection = store.get(connectionAtom);
114
- if (connection.state === WebSocketState.CONNECTING) {
114
+ if (connection.state === ConnectionState.CONNECTING) {
115
115
  attachListeners();
116
116
  } else {
117
117
  detachListeners();
@@ -7,7 +7,6 @@ export const pairPreviewSchema = z.object({
7
7
  command: z.string(),
8
8
  templates: z.object({
9
9
  prompt: z.string(),
10
- file: z.string(),
11
10
  session: z.string(),
12
11
  token_file: z.string(),
13
12
  token: z.string(),
@@ -2,7 +2,7 @@
2
2
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
3
  import { connectionAtom } from "@/core/network/connection";
4
4
  import { store } from "@/core/state/jotai";
5
- import { WebSocketState } from "@/core/websocket/types";
5
+ import { ConnectionState } from "@/core/websocket/types";
6
6
  import {
7
7
  fetchDataSourceDiscovery,
8
8
  invalidateDataSourceDiscovery,
@@ -30,7 +30,7 @@ describe("fetchDataSourceDiscovery", () => {
30
30
  beforeEach(() => {
31
31
  // Discovery waits for the session's websocket connection to be open
32
32
  // before requesting, so it doesn't race a still-connecting session.
33
- store.set(connectionAtom, { state: WebSocketState.OPEN });
33
+ store.set(connectionAtom, { state: ConnectionState.OPEN });
34
34
  });
35
35
 
36
36
  afterEach(() => {
@@ -197,7 +197,11 @@ export const EditApp: React.FC<AppProps> = ({
197
197
  )}
198
198
  </div>
199
199
 
200
- <ConnectionNotice appConfig={appConfig} onRetry={reconnect} />
200
+ <ConnectionNotice
201
+ appConfig={appConfig}
202
+ onRetry={reconnect}
203
+ canOpenPackages={!hideControls}
204
+ />
201
205
 
202
206
  {/* Don't render until we have a single cell. NotStartedConnectionAlert
203
207
  still covers the "no remote runtime started" prompt. */}
@@ -16,7 +16,7 @@ import { connectionAtom } from "../network/connection";
16
16
  import { useRequestClient } from "../network/requests";
17
17
  import type { UpdateCellOutputsRequest } from "../network/types";
18
18
  import { VirtualFileTracker } from "../static/virtual-file-tracker";
19
- import { WebSocketState } from "../websocket/types";
19
+ import { ConnectionState } from "../websocket/types";
20
20
 
21
21
  const DELAY = 5000; // 5 seconds;
22
22
 
@@ -28,7 +28,7 @@ export function useAutoExport() {
28
28
  const htmlEnabled = appConfig.auto_download.includes("html");
29
29
  const ipynbEnabled = appConfig.auto_download.includes("ipynb");
30
30
 
31
- const isConnected = state === WebSocketState.OPEN;
31
+ const isConnected = state === ConnectionState.OPEN;
32
32
  const markdownDisabled = !markdownEnabled || !isConnected;
33
33
  const htmlDisabled = !htmlEnabled || !isConnected;
34
34
  const ipynbDisabled = !ipynbEnabled || !isConnected;
@@ -283,6 +283,7 @@ function handleMessage(
283
283
  return;
284
284
 
285
285
  case "consumer-capabilities":
286
+ case "execution":
286
287
  return;
287
288
  default:
288
289
  logNever(msg);
@@ -1,5 +1,6 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
  import { init } from "@paralleldrive/cuid2";
3
+ import { atom } from "jotai";
3
4
  import { Logger } from "@/utils/Logger";
4
5
  import type { TypedString } from "@/utils/typed";
5
6
  import { updateQueryParams } from "@/utils/urls";
@@ -9,6 +10,14 @@ import { store } from "../state/jotai";
9
10
 
10
11
  export type SessionId = TypedString<"SessionId">;
11
12
 
13
+ /**
14
+ * Server-owned identity of the notebook Session. It survives browser reloads
15
+ * and reconnects and ends with the Session.
16
+ */
17
+ export type StableSessionId = TypedString<"StableSessionId">;
18
+
19
+ export const stableSessionIdAtom = atom<StableSessionId | null>(null);
20
+
12
21
  const createId = init({ length: 6 });
13
22
 
14
23
  export function generateSessionId(): SessionId {
@@ -3,7 +3,7 @@
3
3
  import { afterEach, describe, expect, it } from "vitest";
4
4
  import { initialModeAtom } from "@/core/mode";
5
5
  import { store } from "@/core/state/jotai";
6
- import { WebSocketState } from "../../websocket/types";
6
+ import { ConnectionState } from "../../websocket/types";
7
7
  import { connectionAtom, waitForConnectionOpenIfNotebook } from "../connection";
8
8
 
9
9
  const NEVER = Symbol("never");
@@ -20,7 +20,7 @@ function settledOrNever(promise: Promise<unknown>) {
20
20
 
21
21
  describe("waitForConnectionOpenIfNotebook", () => {
22
22
  afterEach(() => {
23
- store.set(connectionAtom, { state: WebSocketState.NOT_STARTED });
23
+ store.set(connectionAtom, { state: ConnectionState.NOT_STARTED });
24
24
  store.set(initialModeAtom, undefined);
25
25
  });
26
26
 
@@ -39,7 +39,7 @@ describe("waitForConnectionOpenIfNotebook", () => {
39
39
  const promise = waitForConnectionOpenIfNotebook();
40
40
  await expect(settledOrNever(promise)).resolves.toBe(NEVER);
41
41
 
42
- store.set(connectionAtom, { state: WebSocketState.OPEN });
42
+ store.set(connectionAtom, { state: ConnectionState.OPEN });
43
43
  await expect(settledOrNever(promise)).resolves.not.toBe(NEVER);
44
44
  });
45
45
  });
@@ -5,7 +5,7 @@ import { sandboxAtom, sandboxSyncAtom } from "@/core/packages/sandbox-state";
5
5
  import {
6
6
  type ConnectionPhase,
7
7
  WebSocketClosedReason,
8
- WebSocketState,
8
+ ConnectionState,
9
9
  } from "@/core/websocket/types";
10
10
  import { connectionAtom } from "./connection";
11
11
 
@@ -37,7 +37,7 @@ export const connectionNoticeAtom = atom<ConnectionNotice | null>((get) => {
37
37
  if (
38
38
  sandbox &&
39
39
  (syncing || syncError !== null) &&
40
- connection.state === WebSocketState.OPEN
40
+ connection.state === ConnectionState.OPEN
41
41
  ) {
42
42
  return {
43
43
  kind: "sync",
@@ -56,7 +56,7 @@ export const connectionNoticeAtom = atom<ConnectionNotice | null>((get) => {
56
56
  error: syncError,
57
57
  };
58
58
  }
59
- if (connection.state === WebSocketState.CONNECTING) {
59
+ if (connection.state === ConnectionState.CONNECTING) {
60
60
  const messages = {
61
61
  "preparing-environment": {
62
62
  title: "Preparing environment…",
@@ -88,11 +88,11 @@ export const connectionNoticeAtom = atom<ConnectionNotice | null>((get) => {
88
88
  error: null,
89
89
  };
90
90
  }
91
- if (connection.state === WebSocketState.CLOSED) {
91
+ if (connection.state === ConnectionState.CLOSED) {
92
92
  const startupFailed =
93
93
  connection.code === WebSocketClosedReason.KERNEL_STARTUP_ERROR;
94
94
  const environmentFailed =
95
- startupFailed && connection.phase === "preparing-environment";
95
+ sandbox && startupFailed && connection.phase === "preparing-environment";
96
96
  return {
97
97
  kind: startupFailed ? "startup" : "connection",
98
98
  phase: connection.phase,
@@ -4,14 +4,14 @@ import { atomWithReducer } from "jotai/utils";
4
4
  import type { NotificationMessageData } from "../kernel/messages";
5
5
  import { isNotebookPage } from "../mode";
6
6
  import { waitFor } from "../state/jotai";
7
- import { type ConnectionStatus, WebSocketState } from "../websocket/types";
7
+ import { type ConnectionStatus, ConnectionState } from "../websocket/types";
8
8
 
9
9
  /**
10
10
  * Atom for storing the connection status.
11
11
  * Initialized to NOT_STARTED.
12
12
  */
13
13
  export const connectionAtom = atom<ConnectionStatus>({
14
- state: WebSocketState.NOT_STARTED,
14
+ state: ConnectionState.NOT_STARTED,
15
15
  });
16
16
 
17
17
  type StartupProgress = NotificationMessageData<"startup-progress">;
@@ -33,7 +33,7 @@ export const startupProgressAtom = atomWithReducer<
33
33
 
34
34
  export function waitForConnectionOpen() {
35
35
  return waitFor(connectionAtom, (value) => {
36
- return value.state === WebSocketState.OPEN;
36
+ return value.state === ConnectionState.OPEN;
37
37
  });
38
38
  }
39
39
 
@@ -53,28 +53,28 @@ export function waitForConnectionOpenIfNotebook() {
53
53
 
54
54
  export const isConnectingAtom = atom((get) => {
55
55
  const connection = get(connectionAtom);
56
- return connection.state === WebSocketState.CONNECTING;
56
+ return connection.state === ConnectionState.CONNECTING;
57
57
  });
58
58
 
59
59
  export const isConnectedAtom = atom((get) => {
60
60
  const connection = get(connectionAtom);
61
- return connection.state === WebSocketState.OPEN;
61
+ return connection.state === ConnectionState.OPEN;
62
62
  });
63
63
 
64
64
  export const canInteractWithAppAtom = atom((get) => {
65
65
  const connection = get(connectionAtom);
66
66
  return (
67
- connection.state === WebSocketState.OPEN ||
68
- connection.state === WebSocketState.NOT_STARTED
67
+ connection.state === ConnectionState.OPEN ||
68
+ connection.state === ConnectionState.NOT_STARTED
69
69
  );
70
70
  });
71
71
 
72
72
  export const isClosedAtom = atom((get) => {
73
73
  const connection = get(connectionAtom);
74
- return connection.state === WebSocketState.CLOSED;
74
+ return connection.state === ConnectionState.CLOSED;
75
75
  });
76
76
 
77
77
  export const isNotStartedAtom = atom((get) => {
78
78
  const connection = get(connectionAtom);
79
- return connection.state === WebSocketState.NOT_STARTED;
79
+ return connection.state === ConnectionState.NOT_STARTED;
80
80
  });
@@ -7,7 +7,7 @@ import { memoizeLastValue } from "@/utils/once";
7
7
  import { waitForKernelToBeInstantiated } from "../kernel/state";
8
8
  import type { RuntimeManager } from "../runtime/runtime";
9
9
  import { store } from "../state/jotai";
10
- import { WebSocketState } from "../websocket/types";
10
+ import { ConnectionState } from "../websocket/types";
11
11
  import { connectionAtom, waitForConnectionOpen } from "./connection";
12
12
  import type { EditRequests, RunRequests } from "./types";
13
13
 
@@ -159,7 +159,7 @@ export function createLazyRequests(
159
159
  ): AllRequests {
160
160
  // Memoize the init call, just once per runtime manager
161
161
  const initOnce = memoizeLastValue(async (runtimeManager: RuntimeManager) => {
162
- store.set(connectionAtom, { state: WebSocketState.CONNECTING });
162
+ store.set(connectionAtom, { state: ConnectionState.CONNECTING });
163
163
  await runtimeManager.init();
164
164
  });
165
165
 
@@ -17,7 +17,7 @@ import type {
17
17
  } from "@/core/network/types";
18
18
  import { filenameAtom } from "@/core/saving/file-state";
19
19
  import { store } from "@/core/state/jotai";
20
- import { WebSocketState } from "@/core/websocket/types";
20
+ import { ConnectionState } from "@/core/websocket/types";
21
21
  import { HTTPError } from "@/utils/errors";
22
22
  import { packageDataVersionAtom } from "../package-data";
23
23
  import {
@@ -52,7 +52,7 @@ beforeEach(() => {
52
52
  store.set(sandboxAtom, null);
53
53
  store.set(sandboxSyncAtom, { kind: "succeeded" });
54
54
  store.set(sandboxActionsAtom, null);
55
- store.set(connectionAtom, { state: WebSocketState.OPEN });
55
+ store.set(connectionAtom, { state: ConnectionState.OPEN });
56
56
  store.set(kernelStartupErrorAtom, null);
57
57
  store.set(filenameAtom, "notebook.py");
58
58
  store.set(packageDataVersionAtom, 0);
@@ -8,7 +8,7 @@ import { useRequestClient } from "@/core/network/requests";
8
8
  import { useFilename } from "@/core/saving/filename";
9
9
  import { waitFor } from "@/core/state/jotai";
10
10
  import { isWasm } from "@/core/wasm/utils";
11
- import { WebSocketState } from "@/core/websocket/types";
11
+ import { ConnectionState } from "@/core/websocket/types";
12
12
  import { HTTPError, prettyError } from "@/utils/errors";
13
13
  import { invalidatePackageData } from "./package-data";
14
14
  import {
@@ -67,7 +67,7 @@ export function useSandboxController(onReconnect: () => Promise<void>) {
67
67
  if (
68
68
  inFlight.current ||
69
69
  operation.kind === "running" ||
70
- connection.state === WebSocketState.CONNECTING
70
+ connection.state === ConnectionState.CONNECTING
71
71
  ) {
72
72
  return false;
73
73
  }
@@ -91,10 +91,10 @@ export function useSandboxController(onReconnect: () => Promise<void>) {
91
91
  const status = await waitFor(
92
92
  connectionAtom,
93
93
  (value) =>
94
- value.state === WebSocketState.OPEN ||
95
- value.state === WebSocketState.CLOSED,
94
+ value.state === ConnectionState.OPEN ||
95
+ value.state === ConnectionState.CLOSED,
96
96
  );
97
- if (status.state === WebSocketState.CLOSED) {
97
+ if (status.state === ConnectionState.CLOSED) {
98
98
  setOperation({ kind: "idle" });
99
99
  return false;
100
100
  }
@@ -177,7 +177,7 @@ export function useSandboxController(onReconnect: () => Promise<void>) {
177
177
  saving ||
178
178
  loading ||
179
179
  operation.kind === "running" ||
180
- connection.state === WebSocketState.CONNECTING;
180
+ connection.state === ConnectionState.CONNECTING;
181
181
  const diagnostic =
182
182
  error ??
183
183
  (operation.kind === "failed"
@@ -6,7 +6,7 @@ import { islandsInitializedAtom } from "../../islands/state";
6
6
  import { kernelStateAtom } from "../../kernel/state";
7
7
  import { connectionAtom } from "../../network/connection";
8
8
  import { wasmInitStateAtom } from "../../wasm/state";
9
- import { WebSocketState } from "../../websocket/types";
9
+ import { ConnectionState } from "../../websocket/types";
10
10
  import {
11
11
  canRunCellsAtom,
12
12
  islandsAdapter,
@@ -50,13 +50,13 @@ describe("wasmAdapter", () => {
50
50
 
51
51
  describe("remoteAdapter", () => {
52
52
  it.each([
53
- [{ state: WebSocketState.OPEN }, { kind: "ready" }],
53
+ [{ state: ConnectionState.OPEN }, { kind: "ready" }],
54
54
  [
55
- { state: WebSocketState.CONNECTING },
55
+ { state: ConnectionState.CONNECTING },
56
56
  { kind: "connecting", progress: { label: "Connecting…" } },
57
57
  ],
58
58
  [
59
- { state: WebSocketState.NOT_STARTED },
59
+ { state: ConnectionState.NOT_STARTED },
60
60
  { kind: "connecting", progress: { label: "Not connected" } },
61
61
  ],
62
62
  ] as const)("maps %j to %j", (conn, expected) => {
@@ -68,7 +68,7 @@ describe("remoteAdapter", () => {
68
68
  it("surfaces the close reason when closed", () => {
69
69
  const store = createStore();
70
70
  store.set(connectionAtom, {
71
- state: WebSocketState.CLOSED,
71
+ state: ConnectionState.CLOSED,
72
72
  code: "KERNEL_DISCONNECTED",
73
73
  reason: "Kernel went away",
74
74
  });
@@ -125,7 +125,7 @@ describe("canRunCellsAtom", () => {
125
125
  it("is false on a remote adapter until kernel acks", () => {
126
126
  const store = createStore();
127
127
  // Default adapter in test env is remote.
128
- store.set(connectionAtom, { state: WebSocketState.OPEN });
128
+ store.set(connectionAtom, { state: ConnectionState.OPEN });
129
129
  expect(store.get(canRunCellsAtom)).toBe(false);
130
130
 
131
131
  store.set(kernelStateAtom, { isInstantiated: true, error: null });
@@ -8,7 +8,7 @@ import { connectionAtom } from "../network/connection";
8
8
  import { isStaticNotebook } from "../static/static-state";
9
9
  import { wasmInitStateAtom } from "../wasm/state";
10
10
  import { isWasm } from "../wasm/utils";
11
- import { WebSocketState } from "../websocket/types";
11
+ import { ConnectionState } from "../websocket/types";
12
12
 
13
13
  export type RuntimeKind = "wasm" | "remote" | "static" | "islands";
14
14
 
@@ -76,19 +76,19 @@ export const wasmAdapter: RuntimeAdapter = {
76
76
  const remoteStateAtom = atom<AdapterState>((get) => {
77
77
  const conn = get(connectionAtom);
78
78
  switch (conn.state) {
79
- case WebSocketState.OPEN:
79
+ case ConnectionState.OPEN:
80
80
  return { kind: "ready" };
81
- case WebSocketState.CONNECTING:
81
+ case ConnectionState.CONNECTING:
82
82
  return { kind: "connecting", progress: { label: "Connecting…" } };
83
- case WebSocketState.NOT_STARTED:
83
+ case ConnectionState.NOT_STARTED:
84
84
  return { kind: "connecting", progress: { label: "Not connected" } };
85
- case WebSocketState.CLOSING:
86
- case WebSocketState.CLOSED:
85
+ case ConnectionState.CLOSING:
86
+ case ConnectionState.CLOSED:
87
87
  return {
88
88
  kind: "failed",
89
89
  error: {
90
90
  message:
91
- conn.state === WebSocketState.CLOSED
91
+ conn.state === ConnectionState.CLOSED
92
92
  ? conn.reason
93
93
  : "Disconnecting",
94
94
  errorKind: "runtime",
@@ -5,7 +5,7 @@ import { Logger } from "@/utils/Logger";
5
5
  import { connectionAtom } from "../network/connection";
6
6
  import { store } from "../state/jotai";
7
7
  import { isAppNotStarted } from "../websocket/connection-utils";
8
- import { WebSocketState } from "../websocket/types";
8
+ import { ConnectionState } from "../websocket/types";
9
9
  import { RuntimeManager } from "./runtime";
10
10
  import type { RuntimeConfig } from "./types";
11
11
 
@@ -36,7 +36,7 @@ export function useConnectToRuntime(): () => Promise<void> {
36
36
  const [connection, setConnection] = useAtom(connectionAtom);
37
37
  return useEvent(async () => {
38
38
  if (isAppNotStarted(connection.state)) {
39
- setConnection({ state: WebSocketState.CONNECTING });
39
+ setConnection({ state: ConnectionState.CONNECTING });
40
40
  await runtimeManager.init();
41
41
  } else {
42
42
  Logger.log("Runtime already started or starting...");
@@ -9,7 +9,7 @@ import { getAppConfig } from "../config/config";
9
9
  import { KnownQueryParams } from "../constants";
10
10
  import { connectionAtom } from "../network/connection";
11
11
  import { useRequestClient } from "../network/requests";
12
- import { WebSocketState } from "../websocket/types";
12
+ import { ConnectionState } from "../websocket/types";
13
13
  import { filenameAtom } from "./file-state";
14
14
 
15
15
  export function useFilename() {
@@ -24,7 +24,7 @@ export function useUpdateFilename() {
24
24
 
25
25
  const handleFilenameChange = useEvent(async (name: string) => {
26
26
  const appConfig = getAppConfig();
27
- if (connection.state !== WebSocketState.OPEN) {
27
+ if (connection.state !== ConnectionState.OPEN) {
28
28
  openAlert("Failed to save notebook: not connected to a kernel.");
29
29
  return null;
30
30
  }
@@ -31,7 +31,7 @@ import { layoutStateAtom } from "../layout/state";
31
31
  import { kioskModeAtom } from "../mode";
32
32
  import { connectionAtom } from "../network/connection";
33
33
  import { useRequestClient } from "../network/requests";
34
- import { WebSocketState } from "../websocket/types";
34
+ import { ConnectionState } from "../websocket/types";
35
35
  import { filenameAtom } from "./file-state";
36
36
  import { useFilename, useUpdateFilename } from "./filename";
37
37
  import { lastSavedNotebookAtom, needsSaveAtom } from "./state";
@@ -55,7 +55,7 @@ export function enqueueNotebookSave<T>(save: () => Promise<T>): Promise<T> {
55
55
  export const SaveComponent = ({ kioskMode }: SaveNotebookProps) => {
56
56
  const filename = useFilename();
57
57
  const needsSave = useAtomValue(needsSaveAtom);
58
- const closed = useAtomValue(connectionAtom).state === WebSocketState.CLOSED;
58
+ const closed = useAtomValue(connectionAtom).state === ConnectionState.CLOSED;
59
59
  const { saveOrNameNotebook, saveIfNotebookIsPersistent } = useSaveNotebook();
60
60
  useAutoSaveNotebook({ onSave: saveIfNotebookIsPersistent, kioskMode });
61
61
 
@@ -120,7 +120,7 @@ export function useSaveNotebook() {
120
120
  }
121
121
 
122
122
  // Don't save if we are not connected to a kernel
123
- if (connection.state !== WebSocketState.OPEN) {
123
+ if (connection.state !== ConnectionState.OPEN) {
124
124
  openAlert("Failed to save notebook: not connected to a kernel.");
125
125
  return;
126
126
  }
@@ -168,7 +168,7 @@ export function useSaveNotebook() {
168
168
  const connection = store.get(connectionAtom);
169
169
  if (
170
170
  isNamedPersistentFile(filename) &&
171
- connection.state === WebSocketState.OPEN
171
+ connection.state === ConnectionState.OPEN
172
172
  ) {
173
173
  saveNotebook(filename, userInitiated);
174
174
  }
@@ -191,7 +191,7 @@ export function useSaveNotebook() {
191
191
  // Filename does not exist and we are connected to a kernel
192
192
  if (
193
193
  !isNamedPersistentFile(filename) &&
194
- connection.state !== WebSocketState.CLOSED
194
+ connection.state !== ConnectionState.CLOSED
195
195
  ) {
196
196
  openModal(<SaveDialog onClose={closeModal} onSave={handleSaveDialog} />);
197
197
  }
@@ -2,7 +2,7 @@
2
2
  import { useEffect, useRef } from "react";
3
3
  import type { UserConfig } from "../config/config-schema";
4
4
  import type { CellConfig } from "../network/types";
5
- import { type ConnectionStatus, WebSocketState } from "../websocket/types";
5
+ import { type ConnectionStatus, ConnectionState } from "../websocket/types";
6
6
 
7
7
  export function useAutoSave(opts: {
8
8
  codes: string[];
@@ -43,7 +43,7 @@ export function useAutoSave(opts: {
43
43
  clearTimeout(autosaveTimeoutId.current);
44
44
  }
45
45
 
46
- if (needsSave && connStatus.state === WebSocketState.OPEN) {
46
+ if (needsSave && connStatus.state === ConnectionState.OPEN) {
47
47
  autosaveTimeoutId.current = setTimeout(onSave, config.autosave_delay);
48
48
  }
49
49
  }
@@ -3,7 +3,7 @@
3
3
  import { loadPyodide } from "pyodide";
4
4
  import type { PyodideInterface } from "pyodide";
5
5
  import { beforeEach, describe, expect, it, vi } from "vitest";
6
- import { DefaultWasmController } from "../worker/bootstrap";
6
+ import { DefaultWasmController, requirementName } from "../worker/bootstrap";
7
7
 
8
8
  vi.mock("pyodide", () => ({ loadPyodide: vi.fn() }));
9
9
  vi.mock("../worker/getMarimoWheel", () => ({
@@ -61,3 +61,35 @@ describe("WASM runtime sources", () => {
61
61
  expect(controller.requirePyodide).toBe(pyodide);
62
62
  });
63
63
  });
64
+
65
+ describe("requirementName", () => {
66
+ it("returns the distribution name for a bare requirement", () => {
67
+ expect(requirementName("pandas")).toBe("pandas");
68
+ });
69
+
70
+ it.each([
71
+ ["pandas==2.1.0", "pandas"],
72
+ ["pandas>=2", "pandas"],
73
+ ["pandas<=2", "pandas"],
74
+ ["pandas~=2.1", "pandas"],
75
+ ["pandas!=2.0", "pandas"],
76
+ ["nltools===0.6.0.dev2", "nltools"],
77
+ ])("cuts the specifier off %s", (requirement, expected) => {
78
+ expect(requirementName(requirement)).toBe(expected);
79
+ });
80
+
81
+ it("cuts extras and markers", () => {
82
+ expect(requirementName("rich[jupyter]>=13")).toBe("rich");
83
+ expect(requirementName('cowsay==6.1; sys_platform == "emscripten"')).toBe(
84
+ "cowsay",
85
+ );
86
+ });
87
+
88
+ it("cuts a URL requirement at the name", () => {
89
+ expect(requirementName("pkg @ https://example.com/pkg.whl")).toBe("pkg");
90
+ });
91
+
92
+ it("tolerates surrounding whitespace", () => {
93
+ expect(requirementName(" pandas >= 2 ")).toBe("pandas");
94
+ });
95
+ });
@@ -30,6 +30,17 @@ type SessionResources = [
30
30
  // 3.b Install from micropip
31
31
  // 4. Initialize the notebook
32
32
 
33
+ /**
34
+ * The distribution name of a PEP 508 requirement: "pandas>=2" -> "pandas".
35
+ *
36
+ * Extras, markers and URL forms are all cut at their first delimiter, which is
37
+ * enough for the "already installed" lookups this is used for.
38
+ */
39
+ export function requirementName(requirement: string): string {
40
+ // Trim first: a leading space would otherwise split into an empty name.
41
+ return requirement.trim().split(/[[<>=!~;@\s]/)[0];
42
+ }
43
+
33
44
  export class DefaultWasmController implements WasmController {
34
45
  protected pyodide: PyodideInterface | null = null;
35
46
  private packageLoadQueue = Promise.resolve();
@@ -314,18 +325,26 @@ export class DefaultWasmController implements WasmController {
314
325
  });
315
326
  loadSpan.end();
316
327
 
317
- // Load from micropip
328
+ // Load from micropip.
329
+ //
330
+ // `imports` are PEP 508 requirements and may carry a version specifier
331
+ // ("pandas>=2", "nltools==0.6.0.dev2"). micropip wants them whole, but the
332
+ // "do we already have this?" checks below are keyed by name, so compare on
333
+ // the name and install the requirement.
318
334
  loadSpan = t.startSpan("micropip.install");
319
335
  const missingPackages = imports.filter(
320
- (pkg) => !pyodide.loadedPackages[pkg],
336
+ (pkg) => !pyodide.loadedPackages[requirementName(pkg)],
321
337
  );
322
338
  if (missingPackages.length > 0) {
339
+ const byName = missingPackages.map(
340
+ (pkg) => [requirementName(pkg), pkg] as const,
341
+ );
323
342
  await pyodide
324
343
  .runPythonAsync(`
325
344
  import micropip
326
345
  import sys
327
346
  # Filter out builtins
328
- missing = [p for p in ${JSON.stringify(missingPackages)} if p not in sys.modules]
347
+ missing = [req for name, req in ${JSON.stringify(byName)} if name not in sys.modules]
329
348
  if len(missing) > 0:
330
349
  print("Loading from micropip:", missing)
331
350
  await micropip.install(missing)