@marimo-team/islands 0.25.2-dev9 → 0.25.2-dev90
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-BK6f6roX.js → ErrorBoundary-Cmnsp7X-.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-Ba_h3MSI.js → code-visibility-B5ZN4pNx.js} +6 -6
- package/dist/{coffeescript-BVe1OiD9.js → coffeescript-C-eFwH5N.js} +1 -1
- package/dist/{common-0rJUT4CU.js → common-C0fEcRVO.js} +11904 -11621
- 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-DvZ8ZYHw.js → data-grid-overlay-editor-Cq0iaJqU.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-Bd-kdxIT.js → feedback-button-DpYfzMWP.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-DrEBdhP5.js → glide-data-editor-DFtk9eMf.js} +11 -11
- package/dist/{glide-utils-CzzWU59p.js → glide-utils-BVJ4fkxX.js} +3 -3
- package/dist/{globals-BVhJcU-3.js → globals-XdDkDS89.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 +6866 -6746
- 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-DthBBC83.js → number-overlay-editor-xPAwGgFC.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-CX4Yqwsa.js → reveal-component-B_bLilty.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 +16 -16
- package/src/__tests__/mount.test.ts +6 -6
- 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__/spec.test.ts +26 -23
- 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 +30 -0
- package/src/components/ui/progress-stages.tsx +114 -0
- 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.min.css +145 -144
- 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 +1 -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__/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
|
@@ -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)
|
|
@@ -52,7 +52,7 @@ import { useRuntimeManager } from "@/core/runtime/config";
|
|
|
52
52
|
import { initialRunCompletedAtom } from "../../kernel/state";
|
|
53
53
|
import { connectionAtom, startupProgressAtom } from "../../network/connection";
|
|
54
54
|
import type { SessionId } from "../../kernel/session";
|
|
55
|
-
import { WebSocketClosedReason,
|
|
55
|
+
import { WebSocketClosedReason, ConnectionState } from "../types";
|
|
56
56
|
import type { IConnectionTransport } from "../transports/transport";
|
|
57
57
|
import { useMarimoKernelConnection } from "../useMarimoKernelConnection";
|
|
58
58
|
import { useConnectionTransport } from "../useWebSocket";
|
|
@@ -118,7 +118,7 @@ describe("useMarimoKernelConnection.reconnect()", () => {
|
|
|
118
118
|
isHealthy = vi.fn<() => Promise<boolean>>().mockResolvedValue(true);
|
|
119
119
|
store = createStore();
|
|
120
120
|
store.set(connectionAtom, {
|
|
121
|
-
state:
|
|
121
|
+
state: ConnectionState.CLOSED,
|
|
122
122
|
code: WebSocketClosedReason.KERNEL_DISCONNECTED,
|
|
123
123
|
reason: "kernel not found",
|
|
124
124
|
});
|
|
@@ -163,7 +163,7 @@ describe("useMarimoKernelConnection.reconnect()", () => {
|
|
|
163
163
|
expect(isHealthy).toHaveBeenCalledOnce();
|
|
164
164
|
expect(transport.reconnect).toHaveBeenCalledOnce();
|
|
165
165
|
expect(store.get(connectionAtom)).toEqual({
|
|
166
|
-
state:
|
|
166
|
+
state: ConnectionState.CONNECTING,
|
|
167
167
|
});
|
|
168
168
|
});
|
|
169
169
|
|
|
@@ -176,7 +176,7 @@ describe("useMarimoKernelConnection.reconnect()", () => {
|
|
|
176
176
|
expect(isHealthy).toHaveBeenCalledOnce();
|
|
177
177
|
expect(transport.reconnect).not.toHaveBeenCalled();
|
|
178
178
|
expect(store.get(connectionAtom)).toEqual({
|
|
179
|
-
state:
|
|
179
|
+
state: ConnectionState.CLOSED,
|
|
180
180
|
code: WebSocketClosedReason.KERNEL_DISCONNECTED,
|
|
181
181
|
reason: "kernel not found",
|
|
182
182
|
});
|
|
@@ -215,7 +215,7 @@ it.each(["kernel-ready", "reconnected"])(
|
|
|
215
215
|
"waits for %s before marking the session connected",
|
|
216
216
|
async (op) => {
|
|
217
217
|
const store = createStore();
|
|
218
|
-
store.set(connectionAtom, { state:
|
|
218
|
+
store.set(connectionAtom, { state: ConnectionState.CONNECTING });
|
|
219
219
|
vi.mocked(useConnectionTransport).mockClear();
|
|
220
220
|
vi.mocked(useConnectionTransport).mockReturnValue(
|
|
221
221
|
makeTransport(WebSocket.OPEN),
|
|
@@ -229,7 +229,7 @@ it.each(["kernel-ready", "reconnected"])(
|
|
|
229
229
|
await act(async () => {
|
|
230
230
|
await options.onOpen(new Event("open"));
|
|
231
231
|
});
|
|
232
|
-
expect(store.get(connectionAtom).state).toBe(
|
|
232
|
+
expect(store.get(connectionAtom).state).toBe(ConnectionState.CONNECTING);
|
|
233
233
|
|
|
234
234
|
act(() => {
|
|
235
235
|
options.onMessage(
|
|
@@ -257,7 +257,7 @@ it.each(["kernel-ready", "reconnected"])(
|
|
|
257
257
|
}),
|
|
258
258
|
);
|
|
259
259
|
});
|
|
260
|
-
expect(store.get(connectionAtom).state).toBe(
|
|
260
|
+
expect(store.get(connectionAtom).state).toBe(ConnectionState.OPEN);
|
|
261
261
|
},
|
|
262
262
|
);
|
|
263
263
|
|
|
@@ -267,7 +267,7 @@ describe("connection notice", () => {
|
|
|
267
267
|
|
|
268
268
|
function renderNotice() {
|
|
269
269
|
const store = createStore();
|
|
270
|
-
store.set(connectionAtom, { state:
|
|
270
|
+
store.set(connectionAtom, { state: ConnectionState.CONNECTING });
|
|
271
271
|
const transport = makeTransport(WebSocket.OPEN);
|
|
272
272
|
vi.mocked(useConnectionTransport).mockReturnValue(transport);
|
|
273
273
|
vi.mocked(useRuntimeManager).mockReturnValue(
|
|
@@ -322,14 +322,6 @@ describe("connection notice", () => {
|
|
|
322
322
|
);
|
|
323
323
|
act(() => vi.advanceTimersByTime(35_000));
|
|
324
324
|
expect(screen.getByText("Elapsed 35s")).toBeInTheDocument();
|
|
325
|
-
act(() =>
|
|
326
|
-
store.set(
|
|
327
|
-
notebookAtom,
|
|
328
|
-
MockNotebook.notebookState({
|
|
329
|
-
cellData: { [cellId("test")]: { code: "answer = 42" } },
|
|
330
|
-
}),
|
|
331
|
-
),
|
|
332
|
-
);
|
|
333
325
|
send({
|
|
334
326
|
op: "startup-progress",
|
|
335
327
|
phase: "starting-kernel",
|
|
@@ -338,6 +330,18 @@ describe("connection notice", () => {
|
|
|
338
330
|
});
|
|
339
331
|
expect(screen.getByRole("status")).toHaveTextContent("Starting kernel");
|
|
340
332
|
expect(screen.getByText("Elapsed 35s")).toBeInTheDocument();
|
|
333
|
+
act(() =>
|
|
334
|
+
store.set(
|
|
335
|
+
notebookAtom,
|
|
336
|
+
MockNotebook.notebookState({
|
|
337
|
+
cellData: { [cellId("test")]: { code: "answer = 42" } },
|
|
338
|
+
}),
|
|
339
|
+
),
|
|
340
|
+
);
|
|
341
|
+
expect(
|
|
342
|
+
screen.getByRole("button", { name: "Starting kernel… Open Packages" }),
|
|
343
|
+
).toBeVisible();
|
|
344
|
+
expect(screen.queryByText(/Elapsed/)).not.toBeInTheDocument();
|
|
341
345
|
send({ op: "reconnected" });
|
|
342
346
|
expect(
|
|
343
347
|
screen.queryByRole("region", { name: "Notebook startup" }),
|
|
@@ -345,7 +349,7 @@ describe("connection notice", () => {
|
|
|
345
349
|
act(() => options.onClose(new CloseEvent("close")));
|
|
346
350
|
act(() => vi.advanceTimersByTime(500));
|
|
347
351
|
expect(store.get(connectionAtom)).toEqual({
|
|
348
|
-
state:
|
|
352
|
+
state: ConnectionState.CONNECTING,
|
|
349
353
|
phase: "reconnecting",
|
|
350
354
|
});
|
|
351
355
|
expect(
|
|
@@ -388,7 +392,7 @@ describe("connection notice", () => {
|
|
|
388
392
|
logs: "Kernel startup output\n",
|
|
389
393
|
log_mode: "replace",
|
|
390
394
|
});
|
|
391
|
-
expect(store.get(connectionAtom)).toEqual({ state:
|
|
395
|
+
expect(store.get(connectionAtom)).toEqual({ state: ConnectionState.OPEN });
|
|
392
396
|
expect(store.get(startupProgressAtom)).toEqual({
|
|
393
397
|
phase: "starting-kernel",
|
|
394
398
|
logs: "Kernel startup output\n",
|
|
@@ -429,12 +433,9 @@ describe("connection notice", () => {
|
|
|
429
433
|
).not.toBeInTheDocument();
|
|
430
434
|
});
|
|
431
435
|
|
|
432
|
-
it.each([
|
|
433
|
-
["preparing-environment", "Sandbox setup failed"],
|
|
434
|
-
["starting-kernel", "Kernel failed to start"],
|
|
435
|
-
] as const)(
|
|
436
|
+
it.each(["preparing-environment", "starting-kernel"] as const)(
|
|
436
437
|
"keeps a %s failure available until the user retries",
|
|
437
|
-
async (phase
|
|
438
|
+
async (phase) => {
|
|
438
439
|
const { store, transport, options, send } = renderNotice();
|
|
439
440
|
send({ op: "startup-progress", phase, logs: "", log_mode: "replace" });
|
|
440
441
|
const error = "A full diagnostic\nwith <stderr> details";
|
|
@@ -445,9 +446,13 @@ describe("connection notice", () => {
|
|
|
445
446
|
new CloseEvent("close", { reason: "MARIMO_KERNEL_STARTUP_ERROR" }),
|
|
446
447
|
),
|
|
447
448
|
);
|
|
448
|
-
expect(screen.getByRole("status")).toHaveTextContent(
|
|
449
|
+
expect(screen.getByRole("status")).toHaveTextContent(
|
|
450
|
+
"Kernel failed to start",
|
|
451
|
+
);
|
|
449
452
|
act(() => vi.advanceTimersByTime(30_000));
|
|
450
|
-
expect(screen.getByRole("status")).toHaveTextContent(
|
|
453
|
+
expect(screen.getByRole("status")).toHaveTextContent(
|
|
454
|
+
"Kernel failed to start",
|
|
455
|
+
);
|
|
451
456
|
expect(screen.getByLabelText("Error details")).toHaveTextContent(error, {
|
|
452
457
|
normalizeWhitespace: false,
|
|
453
458
|
});
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
4
4
|
import { Logger } from "@/utils/Logger";
|
|
5
|
-
import { WebSocketClosedReason,
|
|
5
|
+
import { WebSocketClosedReason, ConnectionState } from "../types";
|
|
6
6
|
import { classifyCloseEvent } from "../useMarimoKernelConnection";
|
|
7
7
|
|
|
8
8
|
function classify(reason: string | undefined) {
|
|
@@ -14,7 +14,7 @@ describe("classifyCloseEvent", () => {
|
|
|
14
14
|
it("retries on empty/undefined reason", () => {
|
|
15
15
|
const decision = classify(undefined);
|
|
16
16
|
expect(decision.kind).toBe("retry");
|
|
17
|
-
expect(decision.status).toEqual({ state:
|
|
17
|
+
expect(decision.status).toEqual({ state: ConnectionState.CONNECTING });
|
|
18
18
|
});
|
|
19
19
|
|
|
20
20
|
it("treats unknown reason strings as transient and logs a warning", () => {
|
|
@@ -44,7 +44,7 @@ describe("classifyCloseEvent", () => {
|
|
|
44
44
|
const decision = classify(reason);
|
|
45
45
|
expect(decision.kind).toBe("terminal");
|
|
46
46
|
expect(decision.status).toMatchObject({
|
|
47
|
-
state:
|
|
47
|
+
state: ConnectionState.CLOSED,
|
|
48
48
|
code: WebSocketClosedReason.KERNEL_DISCONNECTED,
|
|
49
49
|
});
|
|
50
50
|
expect(decision).toMatchObject({
|
|
@@ -57,7 +57,7 @@ describe("classifyCloseEvent", () => {
|
|
|
57
57
|
const decision = classify("MARIMO_KERNEL_STARTUP_ERROR");
|
|
58
58
|
expect(decision.kind).toBe("terminal");
|
|
59
59
|
expect(decision.status).toMatchObject({
|
|
60
|
-
state:
|
|
60
|
+
state: ConnectionState.CLOSED,
|
|
61
61
|
code: WebSocketClosedReason.KERNEL_STARTUP_ERROR,
|
|
62
62
|
});
|
|
63
63
|
expect(decision).toMatchObject({
|
|
@@ -72,7 +72,7 @@ describe("classifyCloseEvent", () => {
|
|
|
72
72
|
const decision = classify("MARIMO_TRANSPORT_EXHAUSTED");
|
|
73
73
|
expect(decision.kind).toBe("gave-up");
|
|
74
74
|
expect(decision.status).toEqual({
|
|
75
|
-
state:
|
|
75
|
+
state: ConnectionState.CLOSED,
|
|
76
76
|
code: WebSocketClosedReason.KERNEL_DISCONNECTED,
|
|
77
77
|
reason: "kernel not found",
|
|
78
78
|
});
|