@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.
- package/dist/{ConnectedDataExplorerComponent-CqhQmp74.js → ConnectedDataExplorerComponent-BZmqc_F0.js} +11 -11
- package/dist/{ErrorBoundary-BN_cZouT.js → ErrorBoundary-DZ39uB77.js} +8 -8
- package/dist/{abnfDiagram-VCTEODGH-aLGD44M7.js → abnfDiagram-VCTEODGH-C_Lmaa2j.js} +3 -3
- package/dist/{any-language-editor-dqxlUDlT.js → any-language-editor-BFzqhOBR.js} +5 -5
- package/dist/{apl-BYaaig9_.js → apl-GEW9-ZP1.js} +1 -1
- package/dist/{architectureDiagram-5GKGNRK7-BGL5P81u.js → architectureDiagram-5GKGNRK7-BKMataHB.js} +5 -5
- package/dist/{asciiarmor-GKQFJXQG.js → asciiarmor-BWNxzkG7.js} +1 -1
- package/dist/{asn1-BsSb7HP5.js → asn1-Bcn2QutK.js} +1 -1
- package/dist/assets/__vite-browser-external-BqAtzd2P.js +1 -0
- package/dist/assets/{worker-D7hWi02M.js → worker-Bf8dt6S-.js} +5 -5
- package/dist/{asterisk-B3I8SNb5.js → asterisk-lE36-hJK.js} +1 -1
- package/dist/{blockDiagram-I7D4REHJ-CvBmppdy.js → blockDiagram-I7D4REHJ-BeHOjyDk.js} +9 -9
- package/dist/{brainfuck-DXjk3bQe.js → brainfuck-BQCYDheZ.js} +1 -1
- package/dist/{button-B0Xgl-Qn.js → button-BtsM2UqM.js} +300 -283
- package/dist/{c4Diagram-7LVT6UL2-EceL4_jH.js → c4Diagram-7LVT6UL2-Bao10t_O.js} +7 -7
- package/dist/{capabilities-D7Ad8-zw.js → capabilities-A5jrzjCJ.js} +1 -1
- package/dist/{cells-5ppES-Un.js → cells-DZi0ioak.js} +4330 -4313
- package/dist/{channel-z7HZXHwv.js → channel-BxCkvUgE.js} +1 -1
- package/dist/{chat-ui-Dv2V95k6.js → chat-ui-CwOWzoSO.js} +46 -46
- package/dist/{check-DGZ74tV2.js → check-CNP79M3A.js} +1 -1
- package/dist/{chunk-4HAMMTFA-BPTTOOC5.js → chunk-4HAMMTFA-CH7Gpamd.js} +5 -5
- package/dist/{chunk-75Z2AOVW-C4AOleKf.js → chunk-75Z2AOVW-AI7CvgKn.js} +1 -1
- package/dist/{chunk-DU6HZSFF-1TwWR6gh.js → chunk-DU6HZSFF-BSvuTkX4.js} +1 -1
- package/dist/{chunk-F27PBJKO-DMI1PBe4.js → chunk-F27PBJKO-CLshwT9T.js} +1 -1
- package/dist/{chunk-GMAD6QVW-vStrMz2P.js → chunk-GMAD6QVW-wnHcn-lH.js} +3 -3
- package/dist/{chunk-GVQU2GXP-2HwWgs4u.js → chunk-GVQU2GXP-7O2p8hut.js} +2 -2
- package/dist/{chunk-IMKFNOWR-Cm3RgLDj.js → chunk-IMKFNOWR-Bu0Vh_Yi.js} +6 -6
- package/dist/{chunk-L3NEJ4N5-RhC7i0I2.js → chunk-L3NEJ4N5-B9_Alrxb.js} +5 -5
- package/dist/{chunk-OSK3NFVY-CZV09N-U.js → chunk-OSK3NFVY-PeQPH2fD.js} +6 -6
- package/dist/{chunk-P2QGCYS3-0TAWai9C.js → chunk-P2QGCYS3-D9twiFuU.js} +1 -1
- package/dist/{chunk-POPQ4Y6H-Cc3_56GX.js → chunk-POPQ4Y6H-BUiNs18s.js} +1 -1
- package/dist/{chunk-PWAF6VOD-lNxB9k8z.js → chunk-PWAF6VOD-D8S9NPCy.js} +1 -1
- package/dist/{chunk-SHT3W25Y-DedDYSP5.js → chunk-SHT3W25Y-B2dyNZ31.js} +8 -8
- package/dist/{chunk-SVP7TREG-B2SFkCAL.js → chunk-SVP7TREG-D7UPvB10.js} +2 -2
- package/dist/{chunk-TICWLB2K-DB6hjNOL.js → chunk-TICWLB2K-BNaGoadd.js} +6 -6
- package/dist/classDiagram-ZZMXUADV-Bbo2n384.js +30 -0
- package/dist/classDiagram-v2-VYDZK3BY-xR8cGP0r.js +30 -0
- package/dist/{clike-E2lFbGVj.js → clike-CxK9W55Z.js} +1 -1
- package/dist/{clojure-Dn_K4RlK.js → clojure-Dzcvwpxk.js} +1 -1
- package/dist/{cmake-DpN2Top5.js → cmake-DYr-71zp.js} +1 -1
- package/dist/{cobol-Chf22-GM.js → cobol-DC3g37Kq.js} +1 -1
- package/dist/{code-visibility-BN3vHwPi.js → code-visibility-DQKgkPWC.js} +6 -6
- package/dist/{coffeescript-BVe1OiD9.js → coffeescript-C-eFwH5N.js} +1 -1
- package/dist/{common-0_BcyLKM.js → common-ChAbaAaQ.js} +11801 -11503
- package/dist/{commonlisp-DxoBG7fU.js → commonlisp-CyaNXrJR.js} +1 -1
- package/dist/{copy-icon-qmRg_VTX.js → copy-icon-BY7jgcaV.js} +3 -3
- package/dist/{crystal-DCM3yc4r.js → crystal-ih5ax5tQ.js} +1 -1
- package/dist/{css-DkZ9mMyI.js → css-CN_wP7_R.js} +1 -1
- package/dist/{cynefinDiagram-5FMLGOSQ-DzaZEqgD.js → cynefinDiagram-5FMLGOSQ-CCDn4Z9e.js} +3 -3
- package/dist/{cypher-Drw_8U5I.js → cypher-CqGRcmZo.js} +1 -1
- package/dist/{d-CsVGcKMF.js → d-Cj0sOW2z.js} +1 -1
- package/dist/{dagre-GXQ25YYZ-Cjf5GjU3.js → dagre-GXQ25YYZ-BJiUO_SV.js} +10 -10
- package/dist/{data-grid-overlay-editor-605LiK17.js → data-grid-overlay-editor-P5LaBOQE.js} +1 -1
- package/dist/{diagram-S7CK7UJ4-IhLt_khx.js → diagram-S7CK7UJ4-BZfxFNRR.js} +4 -4
- package/dist/{diagram-UQ7AKVKN-CQc6KLPB.js → diagram-UQ7AKVKN-1xcsiIMg.js} +3 -3
- package/dist/{diagram-VSXAHHWV-CR7BJygZ.js → diagram-VSXAHHWV-DPAWJ9Nw.js} +2 -2
- package/dist/{diagram-VX7I27RA-DHmW9N1T.js → diagram-VX7I27RA-DmRsnHYY.js} +5 -5
- package/dist/{diagram-Z3DM3KII-zVKsg-Ty.js → diagram-Z3DM3KII--b49ryKx.js} +3 -3
- package/dist/{dialog-CILKhbsG.js → dialog-CmExhUDI.js} +26 -26
- package/dist/{diff-CBikYCUF.js → diff-B_hUkiat.js} +1 -1
- package/dist/{dist-Df0wKI0F.js → dist-BK4Oj99o.js} +1 -1
- package/dist/{dist-BVGtK7Ht.js → dist-BLfKmR-l.js} +1 -1
- package/dist/{dist-B8D7McG3.js → dist-BMQf5zIS.js} +46 -46
- package/dist/{dist-C2KzV-vf.js → dist-BorMD-uX.js} +2 -2
- package/dist/{dist-Cs2FijYk.js → dist-BuaRHxOc.js} +2 -2
- package/dist/{dist-DPcEtqmG.js → dist-Bvs24R_E.js} +47 -47
- package/dist/{dist-lA1Cttkb.js → dist-C8fAKSH1.js} +41 -41
- package/dist/{dist-DszxuxS1.js → dist-CLdpGQVr.js} +2 -2
- package/dist/{dist-CO1AwwG_.js → dist-CN8zI-XC.js} +209 -209
- package/dist/{dist-D1PpnuZB.js → dist-CN_BeG2I.js} +1 -1
- package/dist/{dist-CPGxfVGX.js → dist-CSJ0MDRw.js} +1 -1
- package/dist/{dist-Cm3iAFMD.js → dist-CSbh1PNP.js} +3 -3
- package/dist/{dist-9x1ZRe-e.js → dist-Cg7gzw-a.js} +2 -2
- package/dist/{dist-B1vYLK28.js → dist-CkTTIdBe.js} +345 -345
- package/dist/{dist-BRxfaJgs.js → dist-CrSP_H1M.js} +296 -296
- package/dist/{dist-C2wDlYdD.js → dist-D-wwqlzJ.js} +2 -2
- package/dist/{dist-BtKIs9N-.js → dist-D6d86eNJ.js} +1 -1
- package/dist/{dist-DHOTQar0.js → dist-DBtSl3sf.js} +1 -1
- package/dist/{dist-KzZ7WELx.js → dist-DiDibOYr.js} +120 -120
- package/dist/{dist-Kxgjxakw.js → dist-DoE4XJBC.js} +1277 -1222
- package/dist/{dist-BHCHt1NI.js → dist-F8Ep36rk.js} +1 -1
- package/dist/{dist-C8xMLVYi.js → dist-OR1OnN-y.js} +44 -44
- package/dist/{dist-1HDa70oE.js → dist-PXYI_yuP.js} +3 -3
- package/dist/{dist-CMh_W4y4.js → dist-diIx5qJW.js} +2 -2
- package/dist/{dockerfile-DJnSntVB.js → dockerfile-D0VKN500.js} +2 -2
- package/dist/dropdown-menu-Cz4TdOJh.js +4678 -0
- package/dist/{dtd-BHa4v0Bn.js → dtd-B8FGSWWe.js} +1 -1
- package/dist/{dylan-BypL2Zz8.js → dylan-DbIBYIrw.js} +1 -1
- package/dist/{ebnf-5guncNu-.js → ebnf-D-YbYLdk.js} +1 -1
- package/dist/{ebnfDiagram-PWID7BFC-DDd5hCRC.js → ebnfDiagram-PWID7BFC-rSwVyh4y.js} +3 -3
- package/dist/{ecl-iRcVIKYZ.js → ecl-DBmkdWAd.js} +1 -1
- package/dist/{eiffel-BEqF9aU4.js → eiffel-CcWSDDzK.js} +1 -1
- package/dist/{elm-DYcfNE9c.js → elm-MC-b8a6C.js} +1 -1
- package/dist/{erDiagram-RLTQ6QDP-D10NP0eI.js → erDiagram-RLTQ6QDP-Bfd3iAoC.js} +12 -12
- package/dist/{erlang-BtAuIoF0.js → erlang-AdO1-xtV.js} +1 -1
- package/dist/error-banner-D30nA9nE.js +362 -0
- package/dist/{error-entries-B2Ux3Z2X.js → error-entries-BovkFYNy.js} +2 -2
- package/dist/{esm-BElI3qKH.js → esm-D2gTsXEV.js} +579 -579
- package/dist/{esm-h8f7-1CJ.js → esm-DAVrGVKP.js} +378 -372
- package/dist/{factor-3nzOwLuN.js → factor-Ys-13HOP.js} +2 -2
- package/dist/{fcl-C90TGnJJ.js → fcl-DnwditDr.js} +1 -1
- package/dist/{feedback-button-CLWf8TnU.js → feedback-button-BnxE7fZ8.js} +10 -10
- package/dist/flowDiagram-HODETNUW-D7IBKS12.js +16 -0
- package/dist/{formats-Q9gwlLyD.js → formats-DhhbdyAH.js} +3 -3
- package/dist/{forth-DEaRrLUi.js → forth-DiMuIXFe.js} +1 -1
- package/dist/{fortran-Bv6JRUjY.js → fortran-hkrF2eM4.js} +1 -1
- package/dist/{ganttDiagram-EL5Y4UJY-cRRaDt88.js → ganttDiagram-EL5Y4UJY-B4m_YsKa.js} +2 -2
- package/dist/{gas-JNerWj3-.js → gas-DlhqN9k8.js} +1 -1
- package/dist/{gherkin-CSrl-H70.js → gherkin-0SlhEZ3t.js} +1 -1
- package/dist/{gitGraphDiagram-WWUBYQGX-Pox5k9-Y.js → gitGraphDiagram-WWUBYQGX-QRBbvWXh.js} +2 -2
- package/dist/{glide-data-editor-B4MX_nQW.js → glide-data-editor-BXTJ6SnL.js} +11 -11
- package/dist/{glide-utils-CzzWU59p.js → glide-utils-BVJ4fkxX.js} +3 -3
- package/dist/{globals-BlPkNbZ-.js → globals-B75IJp1A.js} +3 -3
- package/dist/{groovy-X7euO_vE.js → groovy-YhcTMyvX.js} +1 -1
- package/dist/{haskell-C48Z70Az.js → haskell-CodLxrtT.js} +1 -1
- package/dist/{haxe-CAUWMmwR.js → haxe-CiRWNFkH.js} +1 -1
- package/dist/{html-to-image-BZBwkkDG.js → html-to-image-Cn1_16-x.js} +543 -565
- package/dist/{http-BrSBnhDH.js → http-Bh6HhdNR.js} +1 -1
- package/dist/{idl-BXuPleZv.js → idl-DZgBq75I.js} +1 -1
- package/dist/{infoDiagram-27XIBGKW-DrYu3UZC.js → infoDiagram-27XIBGKW-DVQFYvhg.js} +2 -2
- package/dist/{ishikawaDiagram-5VMMS53U-pmkGQJsA.js → ishikawaDiagram-5VMMS53U-viPND-nm.js} +3 -3
- package/dist/{javascript-B4EPWJf_.js → javascript-BfNytHiM.js} +1 -1
- package/dist/{journeyDiagram-3NMN7TZE-EPJDPlt0.js → journeyDiagram-3NMN7TZE-BeeJdJo3.js} +2 -2
- package/dist/{julia-ke9Kh8b7.js → julia--tLIAG7q.js} +1 -1
- package/dist/{kanban-definition-UXKFOSKX-wWGD9VLW.js → kanban-definition-UXKFOSKX-Dcl_ECO9.js} +9 -9
- package/dist/{label-MNhNNoN6.js → label-DQO1jFjf.js} +96 -93
- package/dist/{livescript-Ce4uqGAC.js → livescript-CVPfYnY_.js} +1 -1
- package/dist/{loader-C9OUkMrj.js → loader-Cm-ATtou.js} +1 -1
- package/dist/{lua-D6fti_Jk.js → lua-4Fa-T-qq.js} +1 -1
- package/dist/main.js +6939 -6820
- package/dist/{mathematica-DcEpZ3Vj.js → mathematica-CtYAy6GG.js} +1 -1
- package/dist/{mbox-DFBbOu0X.js → mbox-D0w9Ah1C.js} +1 -1
- package/dist/{mermaid-Dfvntf3s.js → mermaid-BfhcnSj-.js} +54 -54
- package/dist/{mindmap-definition-YA3MSWOX-C2f1VIBR.js → mindmap-definition-YA3MSWOX-BdxxhF-5.js} +11 -11
- package/dist/{mirc-CqeibO3N.js → mirc-De9aSAZM.js} +1 -1
- package/dist/{mllike-D54QZYTP.js → mllike-BbugeaY_.js} +1 -1
- package/dist/{modelica-DuML2-8V.js → modelica-BjJwWw1F.js} +1 -1
- package/dist/{mscgen-CJmKwp3b.js → mscgen-DwiRH5ma.js} +1 -1
- package/dist/{mumps-DaVgFtkd.js → mumps--plbDM9o.js} +1 -1
- package/dist/{nginx-BXN1rqI0.js → nginx-C4Df7REc.js} +1 -1
- package/dist/{nsis-CMfRqf0V.js → nsis-fiiOqLc3.js} +7 -7
- package/dist/{ntriples-BiOGlMDR.js → ntriples-jV77I4k8.js} +1 -1
- package/dist/{number-overlay-editor-Df-fuwOC.js → number-overlay-editor-DGR0D9_d.js} +1 -1
- package/dist/{octave-CgVnzxKk.js → octave-Cztd01tF.js} +1 -1
- package/dist/{oz-B2mky97X.js → oz-Bl8o3BDl.js} +1 -1
- package/dist/{pascal-BoZhBf6s.js → pascal-BO5JqysR.js} +1 -1
- package/dist/{pegDiagram-XKGWAZYB-D6v5dz4M.js → pegDiagram-XKGWAZYB-Du5p2s0w.js} +3 -3
- package/dist/{perl-DjzMqXtt.js → perl-Drlh9s6m.js} +1 -1
- package/dist/{pieDiagram-E7YTZNPT-BwFAhpYD.js → pieDiagram-E7YTZNPT-DJg-SOIq.js} +3 -3
- package/dist/{pig-B2mB-01d.js → pig-BWGR8wZw.js} +1 -1
- package/dist/{powershell-D0zT88Aj.js → powershell-DT99xlz_.js} +1 -1
- package/dist/{process-output-BSsWzfnY.js → process-output-CUG57KRp.js} +4 -4
- package/dist/{properties-3_5qCgOj.js → properties-Q-rkxld0.js} +1 -1
- package/dist/{protobuf-Dgoxfi1H.js → protobuf-DKyWZbs7.js} +1 -1
- package/dist/{pug-CNRdd8oG.js → pug-42ZJUbEC.js} +2 -2
- package/dist/{puppet-DzILxZfz.js → puppet-B4UozHhh.js} +1 -1
- package/dist/purify.es-DMv5zIkJ.js +866 -0
- package/dist/{python-AfVdMn_l.js → python-DREjAV__.js} +1 -1
- package/dist/{q-C6p-CGWh.js → q-Bi63IpBO.js} +1 -1
- package/dist/{quadrantDiagram-AXDQQJYC--kqzFC3w.js → quadrantDiagram-AXDQQJYC-keLfFx9f.js} +1 -1
- package/dist/{r-CzKF1D2X.js → r-DSwXWKMR.js} +1 -1
- package/dist/{railroadDiagram-O6MQD6OU-D6eOFr6Z.js → railroadDiagram-O6MQD6OU-C0ojm-6_.js} +3 -3
- package/dist/{requirementDiagram-BXWQKSXE-CHYsMgDR.js → requirementDiagram-BXWQKSXE-CNwNBmI3.js} +11 -11
- package/dist/{reveal-component-CymFYmw6.js → reveal-component-BvJjNn9X.js} +10 -10
- package/dist/{rpm-Bx7FkjTO.js → rpm-DPb1DeKM.js} +1 -1
- package/dist/{ruby-BMzgq2bf.js → ruby-U7fZA4DP.js} +2 -2
- package/dist/{sankeyDiagram-P5KCCOFB-BdzhT0BM.js → sankeyDiagram-P5KCCOFB-Bh4EsJox.js} +1 -1
- package/dist/{sas-ClGVnK3F.js → sas-CLk1JpTn.js} +1 -1
- package/dist/{scheme-C0MXqXep.js → scheme-CT-2k2Tl.js} +1 -1
- package/dist/select-Bs-nmvm6.js +1344 -0
- package/dist/{sequenceDiagram-WJ2MYXX4-BPAknhBp.js → sequenceDiagram-WJ2MYXX4-DQaW5qBG.js} +4 -4
- package/dist/{shell-CiQZv6oG.js → shell-BLO7fcsk.js} +1 -1
- package/dist/{sieve-BiIMePvV.js → sieve-nG3C7WNH.js} +1 -1
- package/dist/{simple-mode-8ETW2RS6.js → simple-mode-C683Q7or.js} +1 -1
- package/dist/{smalltalk-9-llftyG.js → smalltalk-BROcZybA.js} +1 -1
- package/dist/{solr-CxCKEuwq.js → solr-mVltHNc5.js} +1 -1
- package/dist/{sparql-BRmy7pzx.js → sparql-Cv1Ksr4v.js} +1 -1
- package/dist/{spec-D62vWpMT.js → spec-DVsoMvYT.js} +116 -135
- package/dist/{spreadsheet-UCNUIGsn.js → spreadsheet-BwTnp5K_.js} +1 -1
- package/dist/{sql-D0hSGZ-H.js → sql-CjLt0122.js} +1 -1
- package/dist/{stateDiagram-D77RDMKH-Cq249IQ4.js → stateDiagram-D77RDMKH-BDa515QC.js} +13 -13
- package/dist/stateDiagram-v2-MP3YSRHH-ChNddepZ.js +30 -0
- package/dist/{stex-UeT_Aofp.js → stex-Btf3omL8.js} +1 -1
- package/dist/style.css +1 -1
- package/dist/{stylus-Fi4waA2H.js → stylus-Dt4VvLXL.js} +1 -1
- package/dist/{swift-NqPyaBye.js → swift-DHsn_CVI.js} +1 -1
- package/dist/{swimlanes-42K2YHIH-Bh_S_HKD.js → swimlanes-42K2YHIH-M4IdGi8J.js} +10 -10
- package/dist/swimlanesDiagram-VR7AAH4N-FUSwmzEp.js +30 -0
- package/dist/{swiper-component-DkV7T44B.js → swiper-component-CpN-hewZ.js} +2 -2
- package/dist/{tcl-B4f0xfmM.js → tcl-CV0OLBOl.js} +1 -1
- package/dist/{textile-CnNbnPTe.js → textile-D320oKVM.js} +1 -1
- package/dist/{tiddlywiki-CSGSOg38.js → tiddlywiki-BVVNvfy4.js} +1 -1
- package/dist/{tiki-9F02WBA6.js → tiki-BF2aDPlB.js} +1 -1
- package/dist/{timeline-definition-24CTP7MA-ByNMgBE7.js → timeline-definition-24CTP7MA-DH-kvakg.js} +3 -3
- package/dist/{toDate-DWVp6uE1.js → toDate-vEi5kTfY.js} +4 -5
- package/dist/{toast-DcoJGS3-.js → toast-DfEpJedt.js} +157 -161
- package/dist/{toml-AesZ6RBt.js → toml-CaUN7UHo.js} +1 -1
- package/dist/{tooltip-Bi36DgYh.js → tooltip-CuNWg2ay.js} +543 -579
- package/dist/{troff-DlfvveK1.js → troff-DQUFcClZ.js} +1 -1
- package/dist/{ttcn--YVSkGs_.js → ttcn-CQL1duJS.js} +1 -1
- package/dist/{ttcn-cfg-Bb1Knl_J.js → ttcn-cfg-BMmEFJPu.js} +1 -1
- package/dist/{turtle-DC24v1bz.js → turtle-C3esgsRr.js} +1 -1
- package/dist/{use-restore-focus-ZgG5Br63.js → use-restore-focus-kmgwrL8q.js} +1833 -1625
- package/dist/{useAsyncData-BD7NLQ3_.js → useAsyncData-rkAlR_vh.js} +1 -1
- package/dist/{useDateFormatter-D8XWr8lL.js → useDateFormatter-C-tz65rD.js} +52 -31
- package/dist/{useDeepCompareMemoize-CawMGSRU.js → useDeepCompareMemoize-BlHFBj5_.js} +1 -1
- package/dist/{useIframeCapabilities-BUMBOpsM.js → useIframeCapabilities-C1Bt04Iz.js} +1 -1
- package/dist/{useLifecycle-3vGhRa1o.js → useLifecycle-B68iY077.js} +3 -3
- package/dist/{useTheme-BOw801nZ.js → useTheme-BwSgeAFb.js} +2 -2
- package/dist/{vb-Dpc8vhvF.js → vb-RK1eDXRl.js} +1 -1
- package/dist/{vbscript-B-Y1XnZe.js → vbscript-BCOeM0de.js} +1 -1
- package/dist/{vega-component-9siY74NS.js → vega-component-C-bPttRN.js} +9 -9
- package/dist/{velocity-DHMu9kc-.js → velocity-CZKOFbOI.js} +1 -1
- package/dist/{vennDiagram-4TSXK5OY-DY8CySdO.js → vennDiagram-4TSXK5OY-d5g7XeiI.js} +3 -3
- package/dist/{verilog-DhiEaoUl.js → verilog-DqQTzVn8.js} +1 -1
- package/dist/{vhdl-D4X23YKO.js → vhdl-vQr2bfmi.js} +1 -1
- package/dist/{wardleyDiagram-VM6X3IG4-DYC1AFni.js → wardleyDiagram-VM6X3IG4-BfX3bSzR.js} +3 -3
- package/dist/{webidl-SyzNxWpJ.js → webidl-DzX7N40e.js} +1 -1
- package/dist/{xquery-BC2R4Hk6.js → xquery-Cw_Q_hGR.js} +1 -1
- package/dist/{xychartDiagram-S5SC5T6Z-Df8LLnuY.js → xychartDiagram-S5SC5T6Z-C1QsLZg7.js} +5 -5
- package/dist/{yacas-DLNXPMmH.js → yacas-DiC4jJBE.js} +1 -1
- package/dist/{z80-CDXWHOO6.js → z80-CUOQDEJO.js} +1 -1
- package/package.json +18 -17
- package/src/__tests__/mount.test.ts +6 -6
- package/src/components/chat/__tests__/chat-history-popover.test.tsx +157 -0
- package/src/components/chat/chat-history-popover.tsx +98 -17
- package/src/components/chat/chat-panel.tsx +29 -0
- package/src/components/chat/tool-call/__tests__/tool-result.test.tsx +56 -0
- package/src/components/chat/tool-call/tool-result.tsx +3 -3
- package/src/components/data-table/TableTopBar.tsx +4 -0
- package/src/components/data-table/__tests__/export-actions.test.tsx +1111 -14
- package/src/components/data-table/__tests__/pagination.test.tsx +85 -1
- package/src/components/data-table/__tests__/schemas.test.ts +57 -0
- package/src/components/data-table/charts/__tests__/schemas.test.ts +25 -0
- package/src/components/data-table/charts/__tests__/slider-field.test.tsx +54 -0
- package/src/components/data-table/charts/__tests__/spec.test.ts +26 -23
- package/src/components/data-table/charts/components/form-fields.tsx +3 -1
- package/src/components/data-table/charts/constants.ts +11 -10
- package/src/components/data-table/charts/types.ts +1 -0
- package/src/components/data-table/data-table.tsx +3 -0
- package/src/components/data-table/export-actions.tsx +365 -81
- package/src/components/data-table/pagination.tsx +16 -2
- package/src/components/data-table/schemas.ts +90 -14
- package/src/components/editor/actions/__tests__/pair-with-agent-commands.test.ts +32 -46
- package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +29 -40
- package/src/components/editor/actions/pair-with-agent-commands.ts +3 -4
- package/src/components/editor/actions/pair-with-agent-modal.tsx +4 -7
- package/src/components/editor/actions/useRestartKernel.tsx +2 -2
- package/src/components/editor/alerts/__tests__/connection-notice.test.tsx +224 -17
- package/src/components/editor/alerts/connection-details.tsx +61 -0
- package/src/components/editor/alerts/connection-notice.tsx +46 -53
- package/src/components/editor/alerts/startup-progress.tsx +73 -129
- package/src/components/editor/app-container.tsx +2 -2
- package/src/components/editor/boundary/__tests__/ErrorBoundary.test.tsx +2 -2
- package/src/components/editor/cell/CreateCellButton.tsx +2 -2
- package/src/components/editor/cell/DeleteButton.tsx +2 -2
- package/src/components/editor/cell/RunButton.tsx +3 -3
- package/src/components/editor/cell/StopButton.tsx +2 -2
- package/src/components/editor/chrome/components/__tests__/feedback-button.test.tsx +4 -4
- package/src/components/editor/chrome/components/feedback-button.tsx +3 -3
- package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +8 -8
- package/src/components/editor/chrome/panels/__tests__/{sandbox-details.test.tsx → runtime-details.test.tsx} +94 -22
- package/src/components/editor/chrome/panels/__tests__/sandbox-recovery.test.tsx +4 -4
- package/src/components/editor/chrome/panels/packages-panel.tsx +8 -29
- package/src/components/editor/chrome/panels/{sandbox-details-state.ts → runtime-details-state.ts} +1 -1
- package/src/components/editor/chrome/panels/{sandbox-panel.tsx → runtime-panel.tsx} +38 -66
- package/src/components/editor/chrome/panels/runtime-status-toggle.tsx +56 -0
- package/src/components/editor/chrome/panels/sandbox-controller.tsx +2 -2
- package/src/components/editor/chrome/wrapper/app-chrome.tsx +3 -3
- package/src/components/editor/chrome/wrapper/footer-items/machine-stats.tsx +2 -2
- package/src/components/editor/controls/Controls.tsx +3 -3
- package/src/components/editor/controls/__tests__/notebook-menu-dropdown.test.tsx +2 -2
- package/src/components/editor/header/__tests__/status.test.tsx +4 -4
- package/src/components/editor/header/app-header.tsx +2 -2
- package/src/components/editor/header/status.tsx +3 -3
- package/src/components/editor/navigation/__tests__/navigation.test.ts +8 -8
- package/src/components/ui/__tests__/slider.test.tsx +37 -0
- package/src/components/ui/progress-stages.tsx +114 -0
- package/src/components/ui/slider.tsx +2 -0
- package/src/core/ai/__tests__/state.test.ts +120 -0
- package/src/core/ai/state.ts +36 -10
- package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +106 -5
- package/src/core/codemirror/lsp/notebook-lsp.ts +16 -2
- package/src/core/codemirror/readonly/__tests__/extension.test.ts +6 -6
- package/src/core/codemirror/readonly/extension.ts +2 -2
- package/src/core/config/pair.ts +0 -1
- package/src/core/datasets/__tests__/data-source-discovery.test.ts +2 -2
- package/src/core/edit-app.tsx +5 -1
- package/src/core/export/hooks.ts +2 -2
- package/src/core/islands/bootstrap.ts +1 -0
- package/src/core/kernel/session.ts +9 -0
- package/src/core/network/__tests__/connection.test.ts +3 -3
- package/src/core/network/connection-notice.ts +5 -5
- package/src/core/network/connection.ts +9 -9
- package/src/core/network/requests-lazy.ts +2 -2
- package/src/core/packages/__tests__/useSandboxController.test.tsx +2 -2
- package/src/core/packages/useSandboxController.ts +6 -6
- package/src/core/runtime/__tests__/adapter.test.ts +6 -6
- package/src/core/runtime/adapter.ts +7 -7
- package/src/core/runtime/config.ts +2 -2
- package/src/core/saving/filename.ts +2 -2
- package/src/core/saving/save-component.tsx +5 -5
- package/src/core/saving/useAutoSave.ts +2 -2
- package/src/core/wasm/__tests__/bootstrap.test.ts +33 -1
- package/src/core/wasm/worker/bootstrap.ts +22 -3
- package/src/core/websocket/__tests__/useMarimoKernelConnection.hook.test.tsx +30 -25
- package/src/core/websocket/__tests__/useMarimoKernelConnection.test.ts +5 -5
- package/src/core/websocket/connection-utils.ts +21 -21
- package/src/core/websocket/types.ts +8 -9
- package/src/core/websocket/useMarimoKernelConnection.tsx +33 -22
- package/src/css/katex-css.test.ts +166 -0
- package/src/css/katex.min.css +169 -168
- package/src/mount.tsx +2 -2
- package/src/plugins/core/__test__/registerReactComponent.test.ts +55 -0
- package/src/plugins/core/registerReactComponent.tsx +3 -1
- package/src/plugins/impl/CheckboxPlugin.tsx +1 -1
- package/src/plugins/impl/DataTablePlugin.tsx +23 -2
- package/src/plugins/impl/DatePickerPlugin.tsx +5 -3
- package/src/plugins/impl/DateRangePlugin.tsx +5 -3
- package/src/plugins/impl/DateTimePickerPlugin.tsx +5 -3
- package/src/plugins/impl/DropdownPlugin.tsx +1 -1
- package/src/plugins/impl/MultiselectPlugin.tsx +1 -1
- package/src/plugins/impl/NumberPlugin.tsx +1 -1
- package/src/plugins/impl/RadioPlugin.tsx +5 -1
- package/src/plugins/impl/RangeSliderPlugin.tsx +1 -1
- package/src/plugins/impl/SearchableSelect.tsx +1 -1
- package/src/plugins/impl/SliderPlugin.tsx +5 -1
- package/src/plugins/impl/SwitchPlugin.tsx +6 -1
- package/src/plugins/impl/TextAreaPlugin.tsx +23 -4
- package/src/plugins/impl/TextInputPlugin.tsx +10 -2
- package/src/plugins/impl/__test__/slider-labels.test.tsx +136 -0
- package/src/plugins/impl/__test__/text-labels.test.tsx +141 -0
- package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +65 -8
- package/src/plugins/impl/__tests__/widget-labels.test.tsx +122 -0
- package/src/plugins/impl/chat/ChatPlugin.tsx +1 -1
- package/src/plugins/impl/common/labeled.tsx +9 -3
- package/src/plugins/impl/data-frames/DataFramePlugin.tsx +15 -3
- package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +0 -22
- package/src/stories/cell.stories.tsx +2 -2
- package/src/stories/dataframe.stories.tsx +7 -0
- package/src/stories/layout/vertical/one-column.stories.tsx +5 -5
- package/src/stories/progress-stages.stories.tsx +62 -0
- package/src/stories/runtime-existing.stories.tsx +44 -0
- package/src/stories/runtime-maintenance.stories.tsx +40 -0
- package/src/stories/runtime-pixi.stories.tsx +28 -0
- package/src/stories/{sandbox.stories.tsx → runtime-story.tsx} +191 -152
- package/src/stories/runtime-uv.stories.tsx +56 -0
- package/dist/assets/__vite-browser-external-C9iR87Zl.js +0 -1
- package/dist/classDiagram-ZZMXUADV-BwYhrSEX.js +0 -30
- package/dist/classDiagram-v2-VYDZK3BY-HecM04TM.js +0 -30
- package/dist/dropdown-menu-BaqM0t4N.js +0 -4502
- package/dist/error-banner-DzAmP0AQ.js +0 -391
- package/dist/flowDiagram-HODETNUW-DgcjSdPV.js +0 -16
- package/dist/purify.es-DgKyQviY.js +0 -805
- package/dist/select-BcObMjGz.js +0 -970
- package/dist/stateDiagram-v2-MP3YSRHH-Dk5QgdXF.js +0 -30
- package/dist/swimlanesDiagram-VR7AAH4N-CbztusY8.js +0 -30
- 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 {
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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:
|
|
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 {
|
|
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 ===
|
|
114
|
+
if (connection.state === ConnectionState.CONNECTING) {
|
|
115
115
|
attachListeners();
|
|
116
116
|
} else {
|
|
117
117
|
detachListeners();
|
package/src/core/config/pair.ts
CHANGED
|
@@ -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 {
|
|
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:
|
|
33
|
+
store.set(connectionAtom, { state: ConnectionState.OPEN });
|
|
34
34
|
});
|
|
35
35
|
|
|
36
36
|
afterEach(() => {
|
package/src/core/edit-app.tsx
CHANGED
|
@@ -197,7 +197,11 @@ export const EditApp: React.FC<AppProps> = ({
|
|
|
197
197
|
)}
|
|
198
198
|
</div>
|
|
199
199
|
|
|
200
|
-
<ConnectionNotice
|
|
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. */}
|
package/src/core/export/hooks.ts
CHANGED
|
@@ -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 {
|
|
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 ===
|
|
31
|
+
const isConnected = state === ConnectionState.OPEN;
|
|
32
32
|
const markdownDisabled = !markdownEnabled || !isConnected;
|
|
33
33
|
const htmlDisabled = !htmlEnabled || !isConnected;
|
|
34
34
|
const ipynbDisabled = !ipynbEnabled || !isConnected;
|
|
@@ -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 {
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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 ===
|
|
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 ===
|
|
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 ===
|
|
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,
|
|
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:
|
|
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 ===
|
|
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 ===
|
|
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 ===
|
|
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 ===
|
|
68
|
-
connection.state ===
|
|
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 ===
|
|
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 ===
|
|
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 {
|
|
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:
|
|
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 {
|
|
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:
|
|
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 {
|
|
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 ===
|
|
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 ===
|
|
95
|
-
value.state ===
|
|
94
|
+
value.state === ConnectionState.OPEN ||
|
|
95
|
+
value.state === ConnectionState.CLOSED,
|
|
96
96
|
);
|
|
97
|
-
if (status.state ===
|
|
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 ===
|
|
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 {
|
|
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:
|
|
53
|
+
[{ state: ConnectionState.OPEN }, { kind: "ready" }],
|
|
54
54
|
[
|
|
55
|
-
{ state:
|
|
55
|
+
{ state: ConnectionState.CONNECTING },
|
|
56
56
|
{ kind: "connecting", progress: { label: "Connecting…" } },
|
|
57
57
|
],
|
|
58
58
|
[
|
|
59
|
-
{ state:
|
|
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:
|
|
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:
|
|
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 {
|
|
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
|
|
79
|
+
case ConnectionState.OPEN:
|
|
80
80
|
return { kind: "ready" };
|
|
81
|
-
case
|
|
81
|
+
case ConnectionState.CONNECTING:
|
|
82
82
|
return { kind: "connecting", progress: { label: "Connecting…" } };
|
|
83
|
-
case
|
|
83
|
+
case ConnectionState.NOT_STARTED:
|
|
84
84
|
return { kind: "connecting", progress: { label: "Not connected" } };
|
|
85
|
-
case
|
|
86
|
-
case
|
|
85
|
+
case ConnectionState.CLOSING:
|
|
86
|
+
case ConnectionState.CLOSED:
|
|
87
87
|
return {
|
|
88
88
|
kind: "failed",
|
|
89
89
|
error: {
|
|
90
90
|
message:
|
|
91
|
-
conn.state ===
|
|
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 {
|
|
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:
|
|
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 {
|
|
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 !==
|
|
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 {
|
|
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 ===
|
|
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 !==
|
|
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 ===
|
|
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 !==
|
|
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,
|
|
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 ===
|
|
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 = [
|
|
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)
|