@marimo-team/islands 0.25.2-dev0 → 0.25.2-dev100
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-C2d9ysUI.js → ConnectedDataExplorerComponent-BZmqc_F0.js} +11 -11
- package/dist/{ErrorBoundary-2usl042r.js → ErrorBoundary-Dcb6Zg4M.js} +8 -8
- package/dist/{abnfDiagram-VCTEODGH-AFhOQTt8.js → abnfDiagram-VCTEODGH-C_Lmaa2j.js} +3 -3
- package/dist/{any-language-editor-CycIVIeP.js → any-language-editor-BFzqhOBR.js} +5 -5
- package/dist/{apl-BYaaig9_.js → apl-GEW9-ZP1.js} +1 -1
- package/dist/{architectureDiagram-5GKGNRK7-BngksAAQ.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-DdXAm8iz.js → button-BtsM2UqM.js} +312 -283
- package/dist/{c4Diagram-7LVT6UL2-EceL4_jH.js → c4Diagram-7LVT6UL2-Bao10t_O.js} +7 -7
- package/dist/{capabilities-B3ce_GNu.js → capabilities-A5jrzjCJ.js} +1 -1
- package/dist/{cells-Cv93oav_.js → cells-DZi0ioak.js} +4330 -4313
- package/dist/{channel-z7HZXHwv.js → channel-BxCkvUgE.js} +1 -1
- package/dist/{chat-ui-fVyVOhYN.js → chat-ui-CwOWzoSO.js} +46 -46
- package/dist/{check-B7cIK6gb.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-UOVZuZVn.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-CrEPyWy1.js → chunk-SHT3W25Y-B2dyNZ31.js} +8 -8
- package/dist/{chunk-SVP7TREG-uIyyySp6.js → chunk-SVP7TREG-D7UPvB10.js} +2 -2
- package/dist/{chunk-TICWLB2K-DdXM3eg6.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-rUDTB2Ce.js → code-visibility-DTB0i3UU.js} +6 -6
- package/dist/{coffeescript-BVe1OiD9.js → coffeescript-C-eFwH5N.js} +1 -1
- package/dist/{common-BVErJKjc.js → common-CaVEr6tY.js} +11801 -11503
- package/dist/{commonlisp-DxoBG7fU.js → commonlisp-CyaNXrJR.js} +1 -1
- package/dist/{copy-icon-CLdENY__.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-zknaAsGy.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-BhMOoMGJ.js → dagre-GXQ25YYZ-BJiUO_SV.js} +10 -10
- package/dist/{data-grid-overlay-editor-7ANmo9c-.js → data-grid-overlay-editor-BzTuqI2T.js} +1 -1
- package/dist/{diagram-S7CK7UJ4-V5-Z-EDY.js → diagram-S7CK7UJ4-BZfxFNRR.js} +4 -4
- package/dist/{diagram-UQ7AKVKN-qw8AjDal.js → diagram-UQ7AKVKN-1xcsiIMg.js} +3 -3
- package/dist/{diagram-VSXAHHWV-CR7BJygZ.js → diagram-VSXAHHWV-DPAWJ9Nw.js} +2 -2
- package/dist/{diagram-VX7I27RA-DfuqFb1E.js → diagram-VX7I27RA-DmRsnHYY.js} +5 -5
- package/dist/{diagram-Z3DM3KII-DpWwlYZB.js → diagram-Z3DM3KII--b49ryKx.js} +3 -3
- package/dist/{dialog-CgNq6y9-.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-C20OnNMZ.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-DBXLWO9v.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-DLl0XqoW.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-K1inEVfd.js → feedback-button-CHGz2EXX.js} +10 -10
- package/dist/flowDiagram-HODETNUW-D7IBKS12.js +16 -0
- package/dist/{formats-Cl_67ghI.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-D2fDO5aG.js → glide-data-editor-WxMsJlmb.js} +11 -11
- package/dist/{glide-utils-B3rUT5PI.js → glide-utils-BVJ4fkxX.js} +3 -3
- package/dist/{globals-NylFP0CX.js → globals-BROokniw.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-CmkwfNkf.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-ntpxMfrq.js → infoDiagram-27XIBGKW-DVQFYvhg.js} +2 -2
- package/dist/{ishikawaDiagram-5VMMS53U-BllIlHE5.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-GYtNMjtS.js → kanban-definition-UXKFOSKX-Dcl_ECO9.js} +9 -9
- package/dist/{label-BslhXqL6.js → label-DQO1jFjf.js} +96 -93
- package/dist/{livescript-Ce4uqGAC.js → livescript-CVPfYnY_.js} +1 -1
- package/dist/{loader-DEZSzvma.js → loader-Cm-ATtou.js} +1 -1
- package/dist/{lua-D6fti_Jk.js → lua-4Fa-T-qq.js} +1 -1
- package/dist/main.js +6966 -6827
- package/dist/{mathematica-DcEpZ3Vj.js → mathematica-CtYAy6GG.js} +1 -1
- package/dist/{mbox-DFBbOu0X.js → mbox-D0w9Ah1C.js} +1 -1
- package/dist/{mermaid-Dnzoxjt1.js → mermaid-BfhcnSj-.js} +54 -54
- package/dist/{mindmap-definition-YA3MSWOX-Cth76xgH.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-B4XyCoMu.js → number-overlay-editor-DCj0MZgn.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-Cu4uOXii.js → pegDiagram-XKGWAZYB-Du5p2s0w.js} +3 -3
- package/dist/{perl-DjzMqXtt.js → perl-Drlh9s6m.js} +1 -1
- package/dist/{pieDiagram-E7YTZNPT-Bh3eDa9s.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-CYN5E-iO.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-DG-M6Rnc.js → railroadDiagram-O6MQD6OU-C0ojm-6_.js} +3 -3
- package/dist/{requirementDiagram-BXWQKSXE-DCwsThh0.js → requirementDiagram-BXWQKSXE-CNwNBmI3.js} +11 -11
- package/dist/{reveal-component-Dtm5GH3p.js → reveal-component-CSY54dq4.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-CbXB1_PU.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-DQBRQSba.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-A-Zf3Sb2.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-B_pMf0J4.js → swimlanes-42K2YHIH-M4IdGi8J.js} +10 -10
- package/dist/swimlanesDiagram-VR7AAH4N-FUSwmzEp.js +30 -0
- package/dist/{swiper-component-IOUowglM.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-DTXFjTTM.js → timeline-definition-24CTP7MA-DH-kvakg.js} +3 -3
- package/dist/{toDate-C67bxMWn.js → toDate-vEi5kTfY.js} +4 -5
- package/dist/{toast-DvY70eFX.js → toast-DfEpJedt.js} +157 -161
- package/dist/{toml-AesZ6RBt.js → toml-CaUN7UHo.js} +1 -1
- package/dist/{tooltip-qB8NlSqV.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-D5D9xEjZ.js → use-restore-focus-kmgwrL8q.js} +1833 -1625
- package/dist/{useAsyncData-BD6AStMt.js → useAsyncData-rkAlR_vh.js} +1 -1
- package/dist/{useDateFormatter-BXQGu86d.js → useDateFormatter-C-tz65rD.js} +52 -31
- package/dist/{useDeepCompareMemoize-D_HNdyvI.js → useDeepCompareMemoize-BlHFBj5_.js} +1 -1
- package/dist/{useIframeCapabilities-CVtNkI3Y.js → useIframeCapabilities-C1Bt04Iz.js} +1 -1
- package/dist/{useLifecycle-DPgiiwwU.js → useLifecycle-B68iY077.js} +3 -3
- package/dist/{useTheme-DzXmYZ5V.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-tFOzgarw.js → vega-component-C-bPttRN.js} +9 -9
- package/dist/{velocity-DHMu9kc-.js → velocity-CZKOFbOI.js} +1 -1
- package/dist/{vennDiagram-4TSXK5OY-BPHjZo0R.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-6fTLYBuD.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-BYjwjrzE.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 +24 -23
- 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/range-focus/__tests__/atoms.test.ts +11 -11
- 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/__tests__/useSetOutputsExpanded.test.ts +42 -0
- 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/useNotebookActions.tsx +20 -0
- package/src/components/editor/actions/useRestartKernel.tsx +2 -2
- package/src/components/editor/actions/useSetOutputsExpanded.ts +67 -0
- 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/tracing/tracing.test.tsx +30 -30
- 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 +21 -1
- package/src/core/export/hooks.ts +2 -2
- package/src/core/hotkeys/hotkeys.ts +12 -0
- 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/FileBrowserPlugin.tsx +45 -15
- 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__/FileBrowserPlugin.test.tsx +85 -2
- 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-BiATbBE4.js +0 -30
- package/dist/classDiagram-v2-VYDZK3BY-JnH97GYw.js +0 -30
- package/dist/dropdown-menu-CZy06LAq.js +0 -4502
- package/dist/error-banner-B94dcDmP.js +0 -391
- package/dist/flowDiagram-HODETNUW-DL52nMkt.js +0 -16
- package/dist/purify.es-DgKyQviY.js +0 -805
- package/dist/select-C6plhmZr.js +0 -970
- package/dist/stateDiagram-v2-MP3YSRHH-D9YMnUGx.js +0 -30
- package/dist/swimlanesDiagram-VR7AAH4N-Ctgy-yGP.js +0 -30
- package/src/components/editor/chrome/panels/sandbox-toggle.tsx +0 -52
|
@@ -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
|
});
|
|
@@ -1,66 +1,66 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
-
import {
|
|
2
|
+
import { ConnectionState } from "./types";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Check if the app is in a closed/disconnected state
|
|
6
6
|
*/
|
|
7
|
-
export function isAppClosed(state:
|
|
8
|
-
return state ===
|
|
7
|
+
export function isAppClosed(state: ConnectionState): boolean {
|
|
8
|
+
return state === ConnectionState.CLOSED;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Check if the app is in a connecting state
|
|
13
13
|
*/
|
|
14
|
-
export function isAppConnecting(state:
|
|
15
|
-
return state ===
|
|
14
|
+
export function isAppConnecting(state: ConnectionState): boolean {
|
|
15
|
+
return state === ConnectionState.CONNECTING;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
/**
|
|
19
19
|
* Check if the app is in an open/connected state
|
|
20
20
|
*/
|
|
21
|
-
export function isAppConnected(state:
|
|
22
|
-
return state ===
|
|
21
|
+
export function isAppConnected(state: ConnectionState): boolean {
|
|
22
|
+
return state === ConnectionState.OPEN;
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
26
|
* Check if the app is in a closing state
|
|
27
27
|
*/
|
|
28
|
-
export function isAppClosing(state:
|
|
29
|
-
return state ===
|
|
28
|
+
export function isAppClosing(state: ConnectionState): boolean {
|
|
29
|
+
return state === ConnectionState.CLOSING;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
/**
|
|
33
33
|
* Check if the app is in a not started state
|
|
34
34
|
*/
|
|
35
|
-
export function isAppNotStarted(state:
|
|
36
|
-
return state ===
|
|
35
|
+
export function isAppNotStarted(state: ConnectionState): boolean {
|
|
36
|
+
return state === ConnectionState.NOT_STARTED;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
/**
|
|
40
40
|
* Check if the app is in a state where user interactions should be disabled
|
|
41
41
|
*/
|
|
42
|
-
export function isAppInteractionDisabled(state:
|
|
42
|
+
export function isAppInteractionDisabled(state: ConnectionState): boolean {
|
|
43
43
|
return (
|
|
44
|
-
state ===
|
|
45
|
-
state ===
|
|
46
|
-
state ===
|
|
44
|
+
state === ConnectionState.CLOSED ||
|
|
45
|
+
state === ConnectionState.CLOSING ||
|
|
46
|
+
state === ConnectionState.CONNECTING
|
|
47
47
|
);
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
/**
|
|
51
51
|
* Get a human-readable tooltip message for the connection state
|
|
52
52
|
*/
|
|
53
|
-
export function getConnectionTooltip(state:
|
|
53
|
+
export function getConnectionTooltip(state: ConnectionState): string {
|
|
54
54
|
switch (state) {
|
|
55
|
-
case
|
|
55
|
+
case ConnectionState.CLOSED:
|
|
56
56
|
return "App disconnected";
|
|
57
|
-
case
|
|
57
|
+
case ConnectionState.CONNECTING:
|
|
58
58
|
return "Connecting to a runtime ...";
|
|
59
|
-
case
|
|
59
|
+
case ConnectionState.CLOSING:
|
|
60
60
|
return "App disconnecting...";
|
|
61
|
-
case
|
|
61
|
+
case ConnectionState.OPEN:
|
|
62
62
|
return "";
|
|
63
|
-
case
|
|
63
|
+
case ConnectionState.NOT_STARTED:
|
|
64
64
|
return "Click to connect to a runtime";
|
|
65
65
|
default:
|
|
66
66
|
return "";
|
|
@@ -6,8 +6,7 @@ export type ConnectionPhase =
|
|
|
6
6
|
| NotificationMessageData<"startup-progress">["phase"]
|
|
7
7
|
| "reconnecting";
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
export const WebSocketState = {
|
|
9
|
+
export const ConnectionState = {
|
|
11
10
|
NOT_STARTED: "NOT_STARTED",
|
|
12
11
|
CONNECTING: "CONNECTING",
|
|
13
12
|
OPEN: "OPEN",
|
|
@@ -15,8 +14,8 @@ export const WebSocketState = {
|
|
|
15
14
|
CLOSED: "CLOSED",
|
|
16
15
|
} as const;
|
|
17
16
|
|
|
18
|
-
export type
|
|
19
|
-
(typeof
|
|
17
|
+
export type ConnectionState =
|
|
18
|
+
(typeof ConnectionState)[keyof typeof ConnectionState];
|
|
20
19
|
|
|
21
20
|
export const WebSocketClosedReason = {
|
|
22
21
|
KERNEL_DISCONNECTED: "KERNEL_DISCONNECTED",
|
|
@@ -28,7 +27,7 @@ export type WebSocketClosedReason =
|
|
|
28
27
|
|
|
29
28
|
export type ConnectionStatus =
|
|
30
29
|
| {
|
|
31
|
-
state: typeof
|
|
30
|
+
state: typeof ConnectionState.CLOSED;
|
|
32
31
|
code: WebSocketClosedReason;
|
|
33
32
|
/**
|
|
34
33
|
* Human-readable reason for closing the connection.
|
|
@@ -37,12 +36,12 @@ export type ConnectionStatus =
|
|
|
37
36
|
phase?: ConnectionPhase;
|
|
38
37
|
}
|
|
39
38
|
| {
|
|
40
|
-
state: typeof
|
|
39
|
+
state: typeof ConnectionState.CONNECTING;
|
|
41
40
|
phase?: ConnectionPhase;
|
|
42
41
|
}
|
|
43
42
|
| {
|
|
44
43
|
state:
|
|
45
|
-
| typeof
|
|
46
|
-
| typeof
|
|
47
|
-
| typeof
|
|
44
|
+
| typeof ConnectionState.OPEN
|
|
45
|
+
| typeof ConnectionState.CLOSING
|
|
46
|
+
| typeof ConnectionState.NOT_STARTED;
|
|
48
47
|
};
|