@marimo-team/islands 0.16.5 → 0.17.1
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/{fullscreen-D1yTiBlu.js → Combination-De9yoNY5.js} +855 -795
- package/dist/{ConnectedDataExplorerComponent-D96i9G-X.js → ConnectedDataExplorerComponent-DuvpJOKp.js} +102 -123
- package/dist/{ImageComparisonComponent-D4Tv9QzJ.js → ImageComparisonComponent--etUl2pp.js} +2 -2
- package/dist/{_baseIsEqual-oN7pRNcM.js → _baseIsEqual-BFlyFUxC.js} +20 -20
- package/dist/{_basePickBy-CYvzhRjy.js → _basePickBy-gCCvtjgp.js} +3 -3
- package/dist/{_baseProperty-DGUdIBuu.js → _baseProperty-BuqBC0Ie.js} +5 -5
- package/dist/{_baseUniq-B5gfSl8S.js → _baseUniq-CKN9mEDq.js} +5 -5
- package/dist/any-language-editor-Du2Q_6IK.js +156 -0
- package/dist/apl-CUm2DGqh.js +4 -0
- package/dist/{arc-B1iVbHTB.js → arc-C_O2hc-b.js} +2 -2
- package/dist/architecture-O4VJ6CD3-PFw3eFBY.js +21 -0
- package/dist/{architectureDiagram-W76B3OCA-DkEhipkW.js → architectureDiagram-W76B3OCA-CrK99pJi.js} +41 -40
- package/dist/asciiarmor-lqJ78U01.js +4 -0
- package/dist/asn1-CjwpSTlW.js +4 -0
- package/dist/assets/__vite-browser-external-DHoMWs4M.js +1 -0
- package/dist/assets/worker-B6tH8gPO.js +54 -0
- package/dist/{blockDiagram-QIGZ2CNN-DZOqLMYa.js → blockDiagram-QIGZ2CNN-BJOEyO6w.js} +101 -111
- package/dist/brainfuck-ClvDI1dq.js +4 -0
- package/dist/{button-CEcjneWG.js → button-ADXOb_gX.js} +37 -40
- package/dist/{c4Diagram-FPNF74CW-DVaR7c9q.js → c4Diagram-FPNF74CW-7Pz_X9wF.js} +31 -54
- package/dist/{channel-Uh0KpgGW.js → channel-X-wRUxX6.js} +1 -1
- package/dist/{check-BK9zDfQk.js → check-COlaG7Ss.js} +1 -1
- package/dist/{chunk-3AY6CYHV-Dk2R2-S1.js → chunk-3AY6CYHV-BQH2fFpA.js} +37 -37
- package/dist/{chunk-4BX2VUAB-CqO6zUIz.js → chunk-4BX2VUAB-D-QtDCKM.js} +1 -1
- package/dist/{chunk-4KMFLZZN-CloTfTwP.js → chunk-4KMFLZZN-BirZvvJS.js} +220 -329
- package/dist/{chunk-55IACEB6-I0rmqTua.js → chunk-55IACEB6-DjtPYZKs.js} +1 -1
- package/dist/{chunk-6OXUPJBA-BuROSTmo.js → chunk-6OXUPJBA-CTnnqlzw.js} +7 -7
- package/dist/{chunk-7GE3RBXV-B1-tsIPP.js → chunk-7GE3RBXV-CT47hCrL.js} +1 -1
- package/dist/{chunk-ABZYJK2D-CLlso8tj.js → chunk-ABZYJK2D-B6ZsU6SR.js} +484 -1043
- package/dist/{chunk-BN7GFLIU-Db2-FjLn.js → chunk-BN7GFLIU-DYWEsrG4.js} +1 -1
- package/dist/{chunk-CVBHYZKI-BONeiloK.js → chunk-CVBHYZKI-BuzDGXz0.js} +3 -3
- package/dist/{chunk-CXMOBAN2-U9GJSP1d.js → chunk-CXMOBAN2-Bas2S5w1.js} +46 -54
- package/dist/chunk-EXTU4WIE-DXwNSukz.js +10 -0
- package/dist/{chunk-FMBD7UC4-DyV3BR_I.js → chunk-FMBD7UC4-CYKEpuPr.js} +1 -1
- package/dist/{chunk-JA3XYJ7Z-C9A1076P.js → chunk-JA3XYJ7Z-DcxfkcDC.js} +21 -25
- package/dist/{chunk-JEIROHC2-BGnFkSVq.js → chunk-JEIROHC2-C01ZIcIG.js} +1 -1
- package/dist/{chunk-K7UQS3LO-033LOsjK.js → chunk-K7UQS3LO-CmbT97MV.js} +7 -7
- package/dist/{chunk-KMC2YHZD-DT4Sq4Ld.js → chunk-KMC2YHZD-D64m-1E1.js} +1 -1
- package/dist/{chunk-QN33PNHL-gs44MZla.js → chunk-QN33PNHL-DjB0j8Dr.js} +2 -2
- package/dist/{chunk-QYVHNE3D-B8BO1AnT.js → chunk-QYVHNE3D-VA4W4oxG.js} +3 -4
- package/dist/{chunk-QZHKN3VN-CeN_GkU6.js → chunk-QZHKN3VN-KT0fl3Em.js} +1 -1
- package/dist/chunk-S3R3BYOJ-C5zmcMvn.js +380 -0
- package/dist/{chunk-T44TD3VJ-BwzD6YE0.js → chunk-T44TD3VJ-BMOgu-Hk.js} +1 -1
- package/dist/{chunk-TVAH2DTR-Bi6jpQJQ.js → chunk-TVAH2DTR-eKm8SKnH.js} +7 -8
- package/dist/{chunk-TZMSLE5B-D8klz2H_.js → chunk-TZMSLE5B-CQxFRiI2.js} +5 -6
- package/dist/{chunk-WFRQ32O7-CzSwSlN0.js → chunk-WFRQ32O7-Dg51o277.js} +1 -1
- package/dist/{chunk-WFWHJNB7-DN_cavM6.js → chunk-WFWHJNB7-DVLO98ge.js} +1 -1
- package/dist/{chunk-XRWGC2XP-Bb5eGNM2.js → chunk-XRWGC2XP-UNFKdWQh.js} +1 -1
- package/dist/{chunk-ZPAFE4SF-S5UYNb0V.js → chunk-ZPAFE4SF-DbCSwfLK.js} +22 -22
- package/dist/classDiagram-KNZD7YFC-HUFFxNdk.js +40 -0
- package/dist/classDiagram-v2-RKCZMP56-Dw7Acmuf.js +40 -0
- package/dist/{click-outside-container-DE4e7p1p.js → click-outside-container-2BH589Bq.js} +9 -14
- package/dist/{clike-Cg_DBrJ0.js → clike-Bc2PZzZQ.js} +1 -1
- package/dist/{clike-CxAz4p9E.js → clike-CytFO-kN.js} +1 -1
- package/dist/clojure-8GefCgPe.js +4 -0
- package/dist/{clone-Dk4FkKH0.js → clone-CCgVUJ6x.js} +1 -1
- package/dist/cmake-yAhT9H0F.js +4 -0
- package/dist/cobol-BmltueOY.js +4 -0
- package/dist/coffeescript-C7KEQBcH.js +4 -0
- package/dist/commonlisp-CNbiJRU-.js +4 -0
- package/dist/{constants-Cjd_3kwd.js → constants-BaCMVd12.js} +3 -3
- package/dist/{copy-C5RFg7ok.js → copy-GNcK40wy.js} +6 -2
- package/dist/{cose-bilkent-S5V4N54A-B3iOTGu5.js → cose-bilkent-S5V4N54A-BnvuJG6Y.js} +20 -20
- package/dist/crystal-OdjZZ8bc.js +4 -0
- package/dist/css-DhTxMmL_.js +5 -0
- package/dist/cypher-CgN8E3YI.js +4 -0
- package/dist/{cytoscape.esm-DTDV0Nbj.js → cytoscape.esm-BFEMljQI.js} +586 -661
- package/dist/d-g41sJcBC.js +4 -0
- package/dist/{dagre-5GWH7T2D-KM4Z11yT.js → dagre-5GWH7T2D-rn7tZYaQ.js} +41 -45
- package/dist/{dagre-B0u1urxE.js → dagre-Bghq6VKO.js} +58 -77
- package/dist/data-grid-overlay-editor-B4_Caieu.js +133 -0
- package/dist/{diagram-N5W7TBWH-CtO7az4G.js → diagram-N5W7TBWH-lbF94o-g.js} +46 -61
- package/dist/diagram-QEK2KX5R-CKBhSzsO.js +246 -0
- package/dist/{diagram-S2PKOQOG-CiXElLNQ.js → diagram-S2PKOQOG-161_1f53.js} +35 -34
- package/dist/diff-ViRYYhhg.js +4 -0
- package/dist/{dist-C3WYsf4K.js → dist-28HYzERB.js} +4 -10
- package/dist/{dist-CChOkSUg.js → dist-4dtbqf8A.js} +3 -3
- package/dist/{dist-CUnh_3Ii.js → dist-71jYYbWP.js} +2 -2
- package/dist/{dist-elblfNXO.js → dist-B8Pbw5ln.js} +2 -2
- package/dist/{dist-DPF5TTUg.js → dist-BAqp4Vtl.js} +126 -115
- package/dist/{dist-BEvIw5Nh.js → dist-BBhmkni2.js} +1 -1
- package/dist/{dist-C7ASiFxI.js → dist-BNRdMfJH.js} +273 -263
- package/dist/dist-BSyYM1Gi.js +15 -0
- package/dist/{dist-DzOpMdwb.js → dist-BYHiiJB-.js} +4 -4
- package/dist/{dist-DKFaZRVk.js → dist-B_wjJqqS.js} +2 -2
- package/dist/{dist-CutXTm8t.js → dist-BaPjLM6s.js} +1 -1
- package/dist/dist-BfJO8Bm9.js +12 -0
- package/dist/{dist-CGIZPq3J.js → dist-BqdQPWpQ.js} +2 -2
- package/dist/{dist--I6Htnlv.js → dist-C2IEc8og.js} +5 -5
- package/dist/{dist-CLvpViod.js → dist-C9-uHBqC.js} +2 -3
- package/dist/{dist-DBhzmFyH.js → dist-CJb8EiFO.js} +3 -3
- package/dist/dist-CLuF3AtO.js +6 -0
- package/dist/{dist-Dzk1C8l5.js → dist-CNAkUyxv.js} +11 -14
- package/dist/{dist-DNnYAdRE.js → dist-CNvMOZu9.js} +2 -2
- package/dist/{dist-CxD5E6Sh.js → dist-CPNnKuPh.js} +24 -22
- package/dist/{dist-C3QUag__.js → dist-CTIyD_KU.js} +3 -3
- package/dist/dist-CU04U4NL.js +10 -0
- package/dist/{dist-CZfRM7pE.js → dist-CWh5ZwcC.js} +2 -2
- package/dist/{dist-DW9er3Zq.js → dist-CWqB4bg8.js} +44 -23
- package/dist/{dist-CbRkrKrP.js → dist-CtOeHDJp.js} +5 -5
- package/dist/{dist-DL_ci7Yc.js → dist-Cw0F6l-7.js} +1 -1
- package/dist/{dist-BZBitvuL.js → dist-CwZcC4om.js} +1 -1
- package/dist/dist-DNUT6b47.js +6 -0
- package/dist/{dist-BBlFk9ki.js → dist-Da046MhT.js} +1 -1
- package/dist/{dist-Cib4sGDA.js → dist-DaTVdKJa.js} +2 -2
- package/dist/dist-DbAb2sY7.js +6 -0
- package/dist/dist-DiDFQ2Rk.js +6 -0
- package/dist/{dist-BQmQQqFH.js → dist-DlK420ke.js} +1 -1
- package/dist/{dist-o7fhJC7U.js → dist-Drf3cyIW.js} +3 -3
- package/dist/{dist-CdE2C2In.js → dist-DxESp2-T.js} +15 -20
- package/dist/{dist-JCAky9ND.js → dist-DzJem5xc.js} +17 -22
- package/dist/{dist-C5zMs_n5.js → dist-O0zVziwn.js} +3 -3
- package/dist/dist-SNAyAOJ-.js +6 -0
- package/dist/{dist-Bar1QnNM.js → dist-_4cudra1.js} +3 -3
- package/dist/dist-cbW5xJNV.js +6 -0
- package/dist/dist-h8eGLSbK.js +10 -0
- package/dist/{dist-BqgkUnEN.js → dist-xLN9qCAp.js} +3 -3
- package/dist/{dockerfile-Dum_1b-5.js → dockerfile-Cmlcqk35.js} +1 -1
- package/dist/dtd-RplB6hDg.js +4 -0
- package/dist/dylan-BX8KJufP.js +4 -0
- package/dist/ecl-CWtLaNMH.js +4 -0
- package/dist/eiffel-C-mlZPMn.js +4 -0
- package/dist/elm-CWp06vcb.js +4 -0
- package/dist/{erDiagram-AWTI2OKA-ZTIl9iQO.js → erDiagram-AWTI2OKA-BU7Qig7n.js} +32 -31
- package/dist/erlang-pfp22AZM.js +4 -0
- package/dist/error-banner-BAWlXn49.js +1012 -0
- package/dist/{esm-d0g2RsOH.js → esm-AtKNNGYO.js} +7 -9
- package/dist/esm-B2pocBPL.js +26 -0
- package/dist/{esm-DxFkg7a6.js → esm-Oo8OvZ6m.js} +1529 -1493
- package/dist/{esm-1_Mp6VD2.js → esm-YVnxJqkD.js} +340 -411
- package/dist/{factor-CdgiDGiu.js → factor-BZnBK3CG.js} +1 -1
- package/dist/factor-CEn53jua.js +5 -0
- package/dist/{flowDiagram-PVAE7QVJ-DsbofOzu.js → flowDiagram-PVAE7QVJ-JKJebWeY.js} +41 -40
- package/dist/{formats-ChrNdVdJ.js → formats-DOEuF6TR.js} +15 -19
- package/dist/forth-CL8vu_y8.js +4 -0
- package/dist/fortran-DsmXkYtE.js +4 -0
- package/dist/{ganttDiagram-OWAHRB6G-FnCH1Yj3.js → ganttDiagram-OWAHRB6G-BvWRfg05.js} +17 -16
- package/dist/gas-mYt9Rtlx.js +4 -0
- package/dist/gherkin-DHNCKBNj.js +4 -0
- package/dist/gitGraph-ZV4HHKMB-Cpd6k0O8.js +21 -0
- package/dist/{gitGraphDiagram-NY62KEGX-B0wvMNqU.js → gitGraphDiagram-NY62KEGX-VEJJBf5L.js} +38 -40
- package/dist/{glide-data-editor-D_kEsT07.js → glide-data-editor-Bne10icG.js} +1703 -1771
- package/dist/{graphlib-BGmr7CYF.js → graphlib-DRS8CrjA.js} +5 -5
- package/dist/groovy-DzRtOS5a.js +4 -0
- package/dist/haskell-Bl9iT_Mp.js +4 -0
- package/dist/haxe-DqA0ED6k.js +5 -0
- package/dist/{hotkeys-yFrUwyJK.js → hotkeys-DVxFjl2s.js} +16 -7
- package/dist/idl-WU2hil4i.js +4 -0
- package/dist/info-63CPKGFF-CG-xzUJo.js +21 -0
- package/dist/infoDiagram-STP46IZ2-zoRBGoup.js +45 -0
- package/dist/invariant-D3JoRb4I.js +6 -0
- package/dist/{isArrayLikeObject-DiDsNamC.js → isArrayLikeObject-DU5MCuQM.js} +3 -5
- package/dist/{isEmpty-BBG-u1GM.js → isEmpty-Do_v2sls.js} +2 -2
- package/dist/{isSymbol-BxF-_8BA.js → isSymbol-CtkA8Y0a.js} +1 -1
- package/dist/{javascript-Dfq1qI35.js → javascript-DGukg1sB.js} +2 -2
- package/dist/javascript-QY2BGJeV.js +5 -0
- package/dist/jinja2-Czleq7Sk.js +4 -0
- package/dist/{journeyDiagram-BIP6EPQ6-B3PotfAW.js → journeyDiagram-BIP6EPQ6-CsgEQgxh.js} +28 -28
- package/dist/julia-Dru3Qi0y.js +4 -0
- package/dist/{kanban-definition-6OIFK2YF-BTrQZ3LN.js → kanban-definition-6OIFK2YF-Bi8Ete2P.js} +42 -41
- package/dist/{katex-dN__NFdn.js → katex-C-g3rKKt.js} +1 -1
- package/dist/{katex-BE4xflfm.js → katex-DgfMWJY9.js} +149 -173
- package/dist/{label-BinTsX-u.js → label-BiVIU_wb.js} +252 -253
- package/dist/{line-C6-zz71o.js → line-B7-GoF1m.js} +3 -3
- package/dist/{linear-DyTdUIqX.js → linear-DeGGALuc.js} +4 -4
- package/dist/livescript-Dxqi_HLT.js +4 -0
- package/dist/{loader-Dijti3y4.js → loader-BBqwtZWj.js} +19 -26
- package/dist/lua-ByH1cUQZ.js +4 -0
- package/dist/main.js +17025 -17039
- package/dist/{marked.esm-3RjvXPoO.js → marked.esm-DkVwEwtO.js} +5 -5
- package/dist/mathematica-CWJIFuES.js +4 -0
- package/dist/mbox-qhPIGaUI.js +4 -0
- package/dist/{memoize-Dq87l1O_.js → memoize-D7eDkf3R.js} +1 -1
- package/dist/{merge-BPDCIm8P.js → merge-C_6cGM6o.js} +1 -1
- package/dist/{mermaid-MWiyXDcI.js → mermaid-BmtvsZ2m.js} +323 -339
- package/dist/{mermaid-parser.core-CSFx6MQ7.js → mermaid-parser.core-geyG_6o0.js} +8 -8
- package/dist/{mhchem-DZ68WS0G.js → mhchem-OhAaJ0fA.js} +1 -1
- package/dist/{min-BzhKOmZo.js → min-Dwa_NbP6.js} +7 -7
- package/dist/{mindmap-definition-Q6HEUPPD-9hhnrO1k.js → mindmap-definition-Q6HEUPPD-B-wmX1oG.js} +29 -28
- package/dist/mirc-yYcXhXBY.js +4 -0
- package/dist/mllike-BfT_Nl9x.js +6 -0
- package/dist/modelica-lVDtz1Rm.js +4 -0
- package/dist/mscgen-DvwdD1QJ.js +6 -0
- package/dist/mumps-BiY3GwKd.js +4 -0
- package/dist/{node-sql-parser-13oju30e.js → node-sql-parser-CoPWN4hn.js} +14343 -14351
- package/dist/{now-DVBcRCoE.js → now-DumxsrcX.js} +1 -1
- package/dist/{nsis-BW6_XagK.js → nsis-D4bLR_Y1.js} +1 -1
- package/dist/nsis-Dk18Sq_4.js +5 -0
- package/dist/ntriples-Cj-8VqKF.js +4 -0
- package/dist/{number-overlay-editor-D1YdiOrm.js → number-overlay-editor-D6r-48ka.js} +18 -24
- package/dist/octave-BgFAaYjU.js +4 -0
- package/dist/once-3OSMKEsL.js +74 -0
- package/dist/{ordinal-BXk5xAj2.js → ordinal-DpEbSVPc.js} +1 -1
- package/dist/oz-IsEG1I1m.js +4 -0
- package/dist/packet-HUATNLJX-Cafuo3IG.js +21 -0
- package/dist/pascal-BVf7FtIE.js +4 -0
- package/dist/perl-BM0-y4mZ.js +4 -0
- package/dist/pie-WTHONI2E-BE0pHBwB.js +21 -0
- package/dist/{pieDiagram-ADFJNKIX-CSBC0ZgF.js → pieDiagram-ADFJNKIX-C3GvPNUL.js} +40 -39
- package/dist/pig-CLBjzQmc.js +4 -0
- package/dist/powershell-B_qvE33J.js +4 -0
- package/dist/powershell-Dr7WZMDU.js +236 -0
- package/dist/{precisionRound-DbP73hkf.js → precisionRound-7YYJq2rW.js} +1 -1
- package/dist/properties-CUTpsH2y.js +4 -0
- package/dist/protobuf-DqCP8a-0.js +4 -0
- package/dist/pug-BvexKkw4.js +5 -0
- package/dist/{pug-Bmups_z0.js → pug-Dv3gE36O.js} +1 -1
- package/dist/puppet-CoIi0R3f.js +4 -0
- package/dist/purify.es-CrfFzTyi.js +536 -0
- package/dist/python-C-11-YMh.js +5 -0
- package/dist/{q-BzWcnVri.js → q-BzRpKgfd.js} +3 -2
- package/dist/q-CCVgEip7.js +4 -0
- package/dist/{quadrantDiagram-LMRXKWRM-h7nHf8xG.js → quadrantDiagram-LMRXKWRM-DPXwGNVa.js} +11 -10
- package/dist/r-CIdR0Sfs.js +4 -0
- package/dist/radar-NJJJXTRR-0adgjw0u.js +21 -0
- package/dist/{range-CgK0-PEw.js → range-CIbLpsrs.js} +3 -3
- package/dist/{react-plotly-BZakcxdv.js → react-plotly-DYyvxcRD.js} +4365 -4706
- package/dist/{requirementDiagram-4UW4RH46-BGEurQYq.js → requirementDiagram-4UW4RH46-Cs3Hqnm0.js} +24 -23
- package/dist/rpm-Dwvm039g.js +5 -0
- package/dist/ruby-DpTnO5gb.js +4 -0
- package/dist/{sankeyDiagram-GR3RE2ED-CxeJ_jfl.js → sankeyDiagram-GR3RE2ED-Be1d_Xf7.js} +7 -6
- package/dist/sas-CK9boxgv.js +4 -0
- package/dist/scheme-Y1aYL-Qq.js +4 -0
- package/dist/{sequenceDiagram-C3RYC4MD-CbFxwyr_.js → sequenceDiagram-C3RYC4MD-lbtovKTa.js} +24 -33
- package/dist/shell-D3eXGsHd.js +4 -0
- package/dist/sieve-BdwSFdWJ.js +4 -0
- package/dist/{simple-mode-Cgyya8F-.js → simple-mode-BMmwP_vI.js} +1 -1
- package/dist/{slides-component-BEyG25AH.js → slides-component-BoeQU7-s.js} +1012 -1033
- package/dist/smalltalk-BTYJquCm.js +4 -0
- package/dist/sparql-CYF0g4Cc.js +4 -0
- package/dist/{src-BNNJRxz3.js → src-BTqT1mA1.js} +6 -6
- package/dist/{stateDiagram-KXAO66HF-A61bMf29.js → stateDiagram-KXAO66HF-BmbR-Rol.js} +48 -49
- package/dist/stateDiagram-v2-UMBNRL4Z-DdJ7qVWc.js +39 -0
- package/dist/{step-IHYrujTc.js → step-2RJrMSSG.js} +1 -1
- package/dist/stex-CyWhoWHt.js +5 -0
- package/dist/style.css +1 -1
- package/dist/stylus-BBiKaI2h.js +4 -0
- package/dist/swift-COb15qFR.js +4 -0
- package/dist/tcl-Jik1LXu9.js +4 -0
- package/dist/textile-BFHPD3wr.js +4 -0
- package/dist/{time-D3tzCqJ6.js → time-BB30r1tK.js} +4 -4
- package/dist/{timeline-definition-XQNQX7LJ-BwdsB7CR.js → timeline-definition-XQNQX7LJ-1mv5caPW.js} +17 -17
- package/dist/{timer-D3Zlu9ow.js → timer-CcUhugb0.js} +2 -2
- package/dist/{toNumber-efKT08hh.js → toNumber-D3Ystr3y.js} +2 -2
- package/dist/{toString-BvCd3yJc.js → toString-CbuxCRDG.js} +2 -2
- package/dist/{toml-CIUkU1CP.js → toml-BqNUJWRI.js} +6 -2
- package/dist/toml-Brp9fBXs.js +4 -0
- package/dist/treemap-75Q7IDZK-CyBT8_Wh.js +21 -0
- package/dist/troff-CcZRW4vg.js +4 -0
- package/dist/ttcn-Bz_6ifRd.js +4 -0
- package/dist/ttcn-cfg-v-yi2rKc.js +4 -0
- package/dist/turtle-CDOsZYhB.js +4 -0
- package/dist/{types-1X1uZB4y.js → types-BPohCsA7.js} +198 -278
- package/dist/{useAsyncData-C4IqQK0g.js → useAsyncData-DHBqeb9a.js} +3 -2
- package/dist/{useDateFormatter-BCsBqetx.js → useDateFormatter-BkbjKw83.js} +9 -9
- package/dist/useIframeCapabilities-BEvvwlwt.js +46 -0
- package/dist/{useTheme-C2pgJzDH.js → useTheme-CnMbo-iq.js} +32 -29
- package/dist/vb-CL7fRwRw.js +4 -0
- package/dist/vbscript-CR2xfxpw.js +4 -0
- package/dist/{vega-component-Cv4J8CHz.js → vega-component-BfFcXZxw.js} +40 -39
- package/dist/{vega-loader.browser.module-Bi3ttvdj.js → vega-loader.browser.module-CFMtdrNw.js} +4 -5
- package/dist/velocity-CfuZoxPt.js +4 -0
- package/dist/verilog-CySTkzw_.js +4 -0
- package/dist/vhdl-Dvcd8KHW.js +4 -0
- package/dist/webidl-tbJt7sKk.js +4 -0
- package/dist/xquery-DJQVztyc.js +4 -0
- package/dist/{xychartDiagram-6GGTOJPD-BJRRi5HC.js → xychartDiagram-6GGTOJPD-njc-naaw.js} +24 -24
- package/dist/yacas-BbgBReEH.js +4 -0
- package/dist/z80-DPyb8VGz.js +4 -0
- package/dist/{zod-UPQf9SGn.js → zod-mAEs2ITo.js} +71 -81
- package/package.json +21 -17
- package/src/__mocks__/requests.ts +2 -0
- package/src/components/app-config/ai-config.tsx +1 -3
- package/src/components/app-config/common.tsx +14 -0
- package/src/components/app-config/data-form.tsx +282 -0
- package/src/components/app-config/user-config-form.tsx +36 -219
- package/src/components/chat/acp/__tests__/state.test.ts +75 -2
- package/src/components/chat/acp/agent-panel.tsx +143 -89
- package/src/components/chat/acp/blocks.tsx +77 -34
- package/src/components/chat/acp/state.ts +5 -1
- package/src/components/chat/acp/thread.tsx +12 -1
- package/src/components/chat/chat-panel.tsx +38 -5
- package/src/components/chat/chat-utils.ts +16 -5
- package/src/components/chat/markdown-renderer.css +1 -0
- package/src/components/chat/tool-call-accordion.tsx +7 -1
- package/src/components/data-table/__tests__/header-items.test.tsx +117 -0
- package/src/components/data-table/charts/__tests__/storage.test.ts +12 -6
- package/src/components/data-table/charts/charts.tsx +8 -2
- package/src/components/data-table/charts/storage.ts +1 -1
- package/src/components/data-table/column-header.tsx +4 -2
- package/src/components/data-table/column-wrapping/feature.ts +2 -0
- package/src/components/data-table/columns.tsx +12 -3
- package/src/components/data-table/data-table.tsx +7 -2
- package/src/components/data-table/header-items.tsx +63 -10
- package/src/components/data-table/renderers.tsx +3 -2
- package/src/components/dependency-graph/custom-node.tsx +11 -11
- package/src/components/dependency-graph/elements.ts +9 -4
- package/src/components/dependency-graph/panels.tsx +6 -4
- package/src/components/editor/Output.tsx +34 -25
- package/src/components/editor/actions/useCellActionButton.tsx +20 -4
- package/src/components/editor/ai/add-cell-with-ai.tsx +17 -3
- package/src/components/editor/ai/ai-completion-editor.tsx +203 -26
- package/src/components/editor/ai/completion-handlers.tsx +126 -23
- package/src/components/editor/cell/StagedAICell.tsx +81 -12
- package/src/components/editor/cell/code/cell-editor.tsx +6 -2
- package/src/components/editor/cell/useRunCells.ts +62 -30
- package/src/components/editor/chrome/panels/cache-panel.tsx +216 -0
- package/src/components/editor/chrome/panels/empty-state.tsx +3 -1
- package/src/components/editor/chrome/panels/packages-panel.tsx +1 -1
- package/src/components/editor/chrome/state.ts +1 -1
- package/src/components/editor/chrome/types.ts +66 -22
- package/src/components/editor/chrome/wrapper/app-chrome.tsx +4 -0
- package/src/components/editor/chrome/wrapper/minimap.tsx +2 -0
- package/src/components/editor/chrome/wrapper/pending-ai-cells.tsx +108 -0
- package/src/components/editor/chrome/wrapper/sidebar.tsx +1 -1
- package/src/components/editor/code/readonly-diff.tsx +49 -0
- package/src/components/editor/columns/storage.ts +1 -1
- package/src/components/editor/errors/auto-fix.tsx +138 -32
- package/src/components/editor/errors/fix-mode.ts +20 -0
- package/src/components/editor/inputs/Inputs.styles.ts +1 -1
- package/src/components/editor/navigation/__tests__/clipboard.test.ts +0 -5
- package/src/components/editor/navigation/clipboard.ts +2 -1
- package/src/components/editor/notebook-cell.tsx +20 -7
- package/src/components/editor/output/CalloutOutput.tsx +1 -1
- package/src/components/editor/output/ConsoleOutput.tsx +27 -33
- package/src/components/editor/output/HtmlOutput.tsx +3 -2
- package/src/components/editor/output/JsonOutput.tsx +15 -1
- package/src/components/editor/output/MarimoTracebackOutput.tsx +69 -52
- package/src/components/editor/output/__tests__/HtmlOutput.test.tsx +134 -0
- package/src/components/editor/output/__tests__/json-output.test.ts +43 -0
- package/src/components/editor/output/__tests__/traceback.test.tsx +8 -1
- package/src/components/editor/output/useWrapText.ts +6 -1
- package/src/components/editor/package-alert.tsx +37 -32
- package/src/components/editor/renderers/vertical-layout/vertical-layout-wrapper.tsx +5 -2
- package/src/components/forms/__tests__/form-utils.test.ts +4 -2
- package/src/components/home/state.ts +3 -2
- package/src/components/icons/copy-icon.tsx +11 -5
- package/src/components/scratchpad/scratchpad-history.ts +6 -1
- package/src/components/shortcuts/renderShortcut.tsx +3 -1
- package/src/components/slides/slides-component.tsx +25 -21
- package/src/components/ui/button.tsx +2 -0
- package/src/components/ui/confirmation-button.tsx +85 -0
- package/src/components/ui/context-menu.tsx +14 -4
- package/src/components/ui/dropdown-menu.tsx +14 -4
- package/src/components/ui/fullscreen.tsx +115 -1
- package/src/components/ui/popover.tsx +11 -3
- package/src/components/ui/range-slider.tsx +1 -1
- package/src/components/ui/select.tsx +7 -3
- package/src/components/ui/slider.tsx +1 -1
- package/src/components/ui/switch.tsx +2 -0
- package/src/components/ui/tooltip.tsx +10 -3
- package/src/core/ai/__tests__/staged-cells.test.ts +189 -64
- package/src/core/ai/config.ts +6 -2
- package/src/core/ai/context/providers/__tests__/__snapshots__/cell-output.test.ts.snap +17 -0
- package/src/core/ai/context/providers/__tests__/cell-output.test.ts +194 -10
- package/src/core/ai/context/providers/__tests__/datasource.test.ts +9 -1
- package/src/core/ai/context/providers/cell-output.ts +170 -112
- package/src/core/ai/context/providers/datasource.ts +25 -1
- package/src/core/ai/context/providers/tables.ts +2 -2
- package/src/core/ai/staged-cells.ts +32 -16
- package/src/core/ai/state.ts +8 -4
- package/src/core/ai/tools/__tests__/edit-notebook-tool.test.ts +556 -0
- package/src/core/ai/tools/__tests__/registry.test.ts +41 -8
- package/src/core/ai/tools/__tests__/run-cells-tool.test.ts +450 -0
- package/src/core/ai/tools/__tests__/utils.test.ts +87 -0
- package/src/core/ai/tools/base.ts +109 -6
- package/src/core/ai/tools/edit-notebook-tool.ts +239 -0
- package/src/core/ai/tools/registry.ts +48 -15
- package/src/core/ai/tools/run-cells-tool.ts +233 -0
- package/src/core/ai/tools/sample-tool.ts +53 -15
- package/src/core/ai/tools/utils.ts +23 -0
- package/src/core/cache/requests.ts +5 -0
- package/src/core/cells/__tests__/cells.test.ts +19 -1
- package/src/core/cells/__tests__/session.test.ts +20 -3
- package/src/core/cells/cells.ts +13 -8
- package/src/core/cells/session.ts +1 -1
- package/src/core/codemirror/__tests__/__snapshots__/setup.test.ts.snap +2 -0
- package/src/core/codemirror/__tests__/replace-editor-content.test.ts +336 -0
- package/src/core/codemirror/ai/resources.ts +13 -2
- package/src/core/codemirror/copilot/state.ts +4 -2
- package/src/core/codemirror/find-replace/navigate.ts +2 -2
- package/src/core/codemirror/format.ts +2 -9
- package/src/core/codemirror/language/__tests__/extension.test.ts +10 -2
- package/src/core/codemirror/language/__tests__/sql.test.ts +24 -6
- package/src/core/codemirror/language/languages/markdown.ts +16 -153
- package/src/core/codemirror/language/languages/python.ts +13 -10
- package/src/core/codemirror/language/languages/sql/sql-mode.ts +6 -1
- package/src/core/codemirror/language/languages/sql/sql.ts +43 -306
- package/src/core/codemirror/language/panel/markdown.tsx +2 -1
- package/src/core/codemirror/language/panel/panel.tsx +2 -7
- package/src/core/codemirror/language/utils.ts +3 -8
- package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +21 -14
- package/src/core/codemirror/lsp/federated-lsp.ts +20 -9
- package/src/core/codemirror/lsp/notebook-lsp.ts +35 -29
- package/src/core/codemirror/lsp/transports.ts +7 -13
- package/src/core/codemirror/lsp/types.ts +0 -13
- package/src/core/codemirror/replace-editor-content.ts +87 -0
- package/src/core/config/__tests__/config-schema.test.ts +3 -0
- package/src/core/config/config-schema.ts +12 -1
- package/src/core/config/feature-flag.tsx +2 -4
- package/src/core/errors/__tests__/errors.test.ts +1 -0
- package/src/core/errors/errors.ts +20 -6
- package/src/core/hotkeys/hotkeys.ts +12 -0
- package/src/core/islands/bridge.ts +2 -0
- package/src/core/islands/main.ts +4 -0
- package/src/core/kernel/messages.ts +1 -0
- package/src/core/lsp/__tests__/transport.test.ts +233 -0
- package/src/core/lsp/transport.ts +139 -0
- package/src/core/network/requests-network.ts +14 -0
- package/src/core/network/requests-static.ts +2 -0
- package/src/core/network/requests-toasting.ts +2 -0
- package/src/core/network/types.ts +5 -0
- package/src/core/rtc/state.ts +6 -1
- package/src/core/saving/save-component.tsx +43 -36
- package/src/core/vscode/is-in-vscode.ts +9 -0
- package/src/core/wasm/bridge.ts +2 -0
- package/src/core/wasm/store.ts +1 -1
- package/src/core/websocket/useMarimoWebSocket.tsx +8 -0
- package/src/css/app/Cell.css +31 -0
- package/src/css/app/codemirror-completions.css +1 -1
- package/src/css/globals.css +5 -0
- package/src/custom.d.ts +2 -0
- package/src/hooks/useIframeCapabilities.ts +14 -0
- package/src/hooks/useLocalStorage.ts +1 -1
- package/src/plugins/core/RenderHTML.tsx +65 -5
- package/src/plugins/core/__test__/RenderHTML.test.ts +25 -23
- package/src/plugins/core/__test__/renderHTML-sanitization.test.tsx +131 -0
- package/src/plugins/core/__test__/sanitize.test.ts +465 -0
- package/src/plugins/core/registerReactComponent.tsx +19 -2
- package/src/plugins/core/sanitize.ts +76 -0
- package/src/plugins/impl/DataTablePlugin.tsx +20 -19
- package/src/plugins/impl/FileBrowserPlugin.tsx +1 -3
- package/src/plugins/impl/FileUploadPlugin.tsx +1 -3
- package/src/plugins/impl/__tests__/DateTimePickerPlugin.test.tsx +40 -1
- package/src/plugins/impl/__tests__/DropdownPlugin.test.tsx +6 -0
- package/src/plugins/impl/__tests__/MultiSelectPlugin.test.ts +8 -1
- package/src/plugins/impl/__tests__/NumberPlugin.test.tsx +3 -0
- package/src/plugins/impl/chat/ChatPlugin.tsx +1 -1
- package/src/plugins/impl/chat/chat-ui.tsx +17 -2
- package/src/plugins/impl/chat/types.ts +1 -1
- package/src/plugins/impl/data-frames/DataFramePlugin.tsx +7 -2
- package/src/plugins/impl/plotly/__tests__/parse-from-template.test.ts +17 -0
- package/src/plugins/impl/plotly/parse-from-template.ts +2 -1
- package/src/utils/__tests__/arrays.test.ts +42 -0
- package/src/utils/__tests__/capabilities.test.ts +453 -0
- package/src/utils/__tests__/formatting.test.ts +107 -0
- package/src/utils/__tests__/json-parser.test.ts +13 -0
- package/src/utils/__tests__/local-storage.test.ts +1 -1
- package/src/utils/__tests__/storage.test.ts +21 -21
- package/src/utils/arrays.ts +25 -0
- package/src/utils/capabilities.ts +114 -0
- package/src/utils/copy.ts +6 -0
- package/src/utils/formatting.ts +51 -0
- package/src/utils/json/json-parser.ts +28 -3
- package/src/utils/numbers.ts +2 -2
- package/src/utils/{storage.ts → storage/jotai.ts} +16 -4
- package/src/utils/storage/storage.ts +57 -0
- package/src/utils/{localStorage.ts → storage/typed.ts} +22 -12
- package/dist/any-language-editor-CVFQlioK.js +0 -156
- package/dist/apl-ChlaBfxB.js +0 -4
- package/dist/architecture-O4VJ6CD3-BVeaxUcM.js +0 -21
- package/dist/asciiarmor-CcJmm3l_.js +0 -4
- package/dist/asn1-ThRYxoBE.js +0 -4
- package/dist/assets/__vite-browser-external-Dv_SHu1h.js +0 -1
- package/dist/assets/worker-DVOR9oZG.js +0 -54
- package/dist/brainfuck-CEM0JgDn.js +0 -4
- package/dist/chunk-EXTU4WIE-DECT9AAK.js +0 -14
- package/dist/chunk-S3R3BYOJ-DMQ1yeyq.js +0 -386
- package/dist/classDiagram-KNZD7YFC-BG53O6Jt.js +0 -39
- package/dist/classDiagram-v2-RKCZMP56-BmKILsGU.js +0 -39
- package/dist/clojure-B7RHyE9t.js +0 -4
- package/dist/cmake-TeTMP4I5.js +0 -4
- package/dist/cobol-DI-mxUER.js +0 -4
- package/dist/coffeescript-DHUFLqWp.js +0 -4
- package/dist/commonlisp-SLiUrh1m.js +0 -4
- package/dist/crystal-B4fY1ZfJ.js +0 -4
- package/dist/css-Bdoq3TzK.js +0 -5
- package/dist/cypher-CBU182fp.js +0 -4
- package/dist/d-D8myDZeH.js +0 -4
- package/dist/data-grid-overlay-editor-qNmJk2x0.js +0 -135
- package/dist/diagram-QEK2KX5R-fu8Noi3H.js +0 -245
- package/dist/diff-DJF_UB7H.js +0 -4
- package/dist/dist-52-_pKoy.js +0 -6
- package/dist/dist-6DOMStFn.js +0 -6
- package/dist/dist-B334aW7p.js +0 -10
- package/dist/dist-BOI9lUz-.js +0 -12
- package/dist/dist-C06uhBzF.js +0 -6
- package/dist/dist-CGkpguCB.js +0 -6
- package/dist/dist-CrApzUED.js +0 -6
- package/dist/dist-Dp2GLdCl.js +0 -14
- package/dist/dist-WHFsbMDr.js +0 -6
- package/dist/dist-hyKcTPG9.js +0 -10
- package/dist/dtd-DY8q65lC.js +0 -4
- package/dist/dylan-CBLcjWCi.js +0 -4
- package/dist/ecl-BSXPNfOw.js +0 -4
- package/dist/eiffel-BJf0PQX-.js +0 -4
- package/dist/elm-DWQwPCZS.js +0 -4
- package/dist/erlang-BWBaGZ5e.js +0 -4
- package/dist/error-banner-OQIGTqFR.js +0 -1012
- package/dist/esm-BO9n_s6u.js +0 -26
- package/dist/factor-DT1-MBPl.js +0 -5
- package/dist/forth-D9GDt3FB.js +0 -4
- package/dist/fortran-DHkRhDWw.js +0 -4
- package/dist/gas-7lQEOM0H.js +0 -4
- package/dist/gherkin-BLLyroYi.js +0 -4
- package/dist/gitGraph-ZV4HHKMB-z2v_cInC.js +0 -21
- package/dist/groovy-C-wabwj0.js +0 -4
- package/dist/haskell-DaxVQ_d1.js +0 -4
- package/dist/haxe-C2yLoC7h.js +0 -5
- package/dist/idl-DQBP8i7k.js +0 -4
- package/dist/info-63CPKGFF-GS4w6pCB.js +0 -21
- package/dist/infoDiagram-STP46IZ2-DE9YYPFg.js +0 -44
- package/dist/javascript-DRwFV9r5.js +0 -5
- package/dist/jinja2-CNoIpVmN.js +0 -4
- package/dist/julia-DXDf-GhP.js +0 -4
- package/dist/livescript-S2uhJQx7.js +0 -4
- package/dist/lua-Bvgs0y2G.js +0 -4
- package/dist/mathematica-D2zqfwIg.js +0 -4
- package/dist/mbox-SBcPaDuZ.js +0 -4
- package/dist/mirc-hkQc7sVF.js +0 -4
- package/dist/mllike-DRWPBlr9.js +0 -6
- package/dist/modelica-CO2ROGlP.js +0 -4
- package/dist/mscgen-BpX61bO6.js +0 -6
- package/dist/mumps-BCnFeIn6.js +0 -4
- package/dist/nsis-BaTOxlD1.js +0 -5
- package/dist/ntriples-zEo5BWjr.js +0 -4
- package/dist/octave-BE0RnCM9.js +0 -4
- package/dist/oz-C4_2Ttul.js +0 -4
- package/dist/packet-HUATNLJX-CjHqJIqk.js +0 -21
- package/dist/pascal-Q3jJucpw.js +0 -4
- package/dist/perl-DkXZIWHF.js +0 -4
- package/dist/pie-WTHONI2E-D67gLWtR.js +0 -21
- package/dist/pig-DCgEHdsu.js +0 -4
- package/dist/powershell-3rK_nRRJ.js +0 -236
- package/dist/powershell-Eo2-7MoM.js +0 -4
- package/dist/properties-C0IOX8WR.js +0 -4
- package/dist/protobuf--lGQUSRO.js +0 -4
- package/dist/pug-Cf8AQHMJ.js +0 -5
- package/dist/puppet-D7Z3dTJn.js +0 -4
- package/dist/python-FHIx_i8Y.js +0 -5
- package/dist/q-B7UA1feM.js +0 -4
- package/dist/r-Cc9R2A7N.js +0 -4
- package/dist/radar-NJJJXTRR-C-AZP_Te.js +0 -21
- package/dist/rpm-vhJNlrQ6.js +0 -5
- package/dist/ruby-CVluPY0M.js +0 -4
- package/dist/sas-A8DL8oy3.js +0 -4
- package/dist/scheme-6xHHcSXC.js +0 -4
- package/dist/shell-DHN-e5rf.js +0 -4
- package/dist/sieve-BuQwLY02.js +0 -4
- package/dist/smalltalk-BA4HPg2H.js +0 -4
- package/dist/sparql-Bf4yCuy3.js +0 -4
- package/dist/stateDiagram-v2-UMBNRL4Z-C_0FUzzk.js +0 -38
- package/dist/stex-D-I1cYeE.js +0 -5
- package/dist/stylus-BMeped2l.js +0 -4
- package/dist/swift-lwEdlZoC.js +0 -4
- package/dist/tcl-B03ipeqv.js +0 -4
- package/dist/textile-Cy55fYGC.js +0 -4
- package/dist/toml-BLgrVtfu.js +0 -4
- package/dist/treemap-75Q7IDZK-DTvwfpWt.js +0 -21
- package/dist/troff-g6EjN2O2.js +0 -4
- package/dist/ttcn-Dzvba8jK.js +0 -4
- package/dist/ttcn-cfg-CadG0p1K.js +0 -4
- package/dist/turtle-DkXAMWo9.js +0 -4
- package/dist/vb-C5dCiel8.js +0 -4
- package/dist/vbscript-I4bDEQln.js +0 -4
- package/dist/velocity-mt0fDwFH.js +0 -4
- package/dist/verilog-Dxq3KJkc.js +0 -4
- package/dist/vhdl-Km0QUlV-.js +0 -4
- package/dist/webidl-B3lJ2MRL.js +0 -4
- package/dist/xquery-CcIxNPEe.js +0 -4
- package/dist/yacas-oMa-f-tN.js +0 -4
- package/dist/z80-D03Nvn6l.js +0 -4
- package/src/core/codemirror/language/__tests__/ast.test.ts +0 -124
- package/src/core/codemirror/language/utils/ast.ts +0 -84
- package/src/core/codemirror/language/utils/quotes.ts +0 -18
- /package/dist/{_arrayReduce-CVwxyrBP.js → _arrayReduce-Cd9xQjbl.js} +0 -0
- /package/dist/{_baseSlice-OgpvpOOJ.js → _baseSlice-CE9WsQZm.js} +0 -0
- /package/dist/{_hasUnicode-BgIggCqE.js → _hasUnicode-DkEebvtD.js} +0 -0
- /package/dist/{apl-DZqo8Elt.js → apl-aGhy11IM.js} +0 -0
- /package/dist/{array-aAxy08hN.js → array-DYSXIreg.js} +0 -0
- /package/dist/{asciiarmor-DTzHAIeX.js → asciiarmor-DJKJ3Gkn.js} +0 -0
- /package/dist/{asn1-DrAXKsZH.js → asn1-C6f5IeNs.js} +0 -0
- /package/dist/{asterisk-oF4U3h48.js → asterisk-DB1poX9_.js} +0 -0
- /package/dist/{brainfuck-BYgLey30.js → brainfuck-Ch9vjun0.js} +0 -0
- /package/dist/{chunk-57QY23SG-0TxCfmy_.js → chunk-57QY23SG-BpXU7ph4.js} +0 -0
- /package/dist/{clojure-Bs2M3OUY.js → clojure-B_lpr3zt.js} +0 -0
- /package/dist/{cmake-DpI8vxJN.js → cmake-DaocNF4I.js} +0 -0
- /package/dist/{cobol-BQyrWo72.js → cobol-suTPtt7c.js} +0 -0
- /package/dist/{coffeescript-9ke9UHmw.js → coffeescript-CPLIvtqJ.js} +0 -0
- /package/dist/{colors-Cr_mZ2aH.js → colors-BXlG8Lmz.js} +0 -0
- /package/dist/{common-keywords-BzgeAvH1.js → common-keywords-Bhll7O3b.js} +0 -0
- /package/dist/{commonlisp-DghUdrUH.js → commonlisp-BqM3qFK7.js} +0 -0
- /package/dist/{crystal-DEf_SInh.js → crystal-AsSFu4ke.js} +0 -0
- /package/dist/{css-BzTU9lNO.js → css-Df7Sdeyh.js} +0 -0
- /package/dist/{cypher-a2v0c11S.js → cypher-CaVKL6Gu.js} +0 -0
- /package/dist/{d-SAswny-M.js → d-DCGWK7NQ.js} +0 -0
- /package/dist/{defaultLocale-BAgEOGks.js → defaultLocale-CYgZlqDF.js} +0 -0
- /package/dist/{defaultLocale-471SYAPk.js → defaultLocale-Cto8YOmX.js} +0 -0
- /package/dist/{diff-OJ-xLXcG.js → diff-CsxOM4Tr.js} +0 -0
- /package/dist/{dist-CK8Gj3GX.js → dist-C76MUPD3.js} +0 -0
- /package/dist/{dtd-BsUf-rer.js → dtd-Dwr0Jmks.js} +0 -0
- /package/dist/{duckdb-keywords-B0NOra5o.js → duckdb-keywords-7wAWf848.js} +0 -0
- /package/dist/{dylan-C0ZYngjn.js → dylan-A7-ZBSey.js} +0 -0
- /package/dist/{ebnf-DF1xx0b_.js → ebnf-9_SaGDUz.js} +0 -0
- /package/dist/{ecl-Bsuvoouq.js → ecl-BzJVIQDc.js} +0 -0
- /package/dist/{eiffel-DgfSpLi-.js → eiffel-CO9eC_Op.js} +0 -0
- /package/dist/{elm-GNxDj-5E.js → elm-CVAWj8SB.js} +0 -0
- /package/dist/{emotion-is-prop-valid.esm-BHMWayAG.js → emotion-is-prop-valid.esm-C3Yi5GQt.js} +0 -0
- /package/dist/{erlang-Ds3uY1kL.js → erlang-DWbZP546.js} +0 -0
- /package/dist/{fcl-CqBgSioc.js → fcl-CM9t2iay.js} +0 -0
- /package/dist/{forth-JCaLysGk.js → forth-BTYqUuu3.js} +0 -0
- /package/dist/{fortran-Dc2AoKAl.js → fortran-DgAjHcCq.js} +0 -0
- /package/dist/{gas-Q4Uz82YW.js → gas-BjDSWPZd.js} +0 -0
- /package/dist/{gherkin-Dpxe49sQ.js → gherkin-ClRqqpKv.js} +0 -0
- /package/dist/{groovy-D8mTRCu6.js → groovy-BzNjnc8x.js} +0 -0
- /package/dist/{haskell-2_8cC4wY.js → haskell-DLdk34Jq.js} +0 -0
- /package/dist/{haxe-Bl9zkZlz.js → haxe-l6gaY_IS.js} +0 -0
- /package/dist/{http-DKCqY6yS.js → http-6Qg7z_h2.js} +0 -0
- /package/dist/{idl-Dn-HNfGW.js → idl-hlWT4D26.js} +0 -0
- /package/dist/{init-D6eDd7H0.js → init-tZ42Torz.js} +0 -0
- /package/dist/{jinja2-JjFiAGKk.js → jinja2-DI5k_Er3.js} +0 -0
- /package/dist/{julia-R5wne8eu.js → julia-BvDZDiIT.js} +0 -0
- /package/dist/{livescript-DSwokrYj.js → livescript-2YMQfkfI.js} +0 -0
- /package/dist/{lua-CgXfrp2-.js → lua-DIUrQRfA.js} +0 -0
- /package/dist/{main-Czi9-LVy.js → main-BMTpe7M0.js} +0 -0
- /package/dist/{math-C7wLpe9K.js → math-qsHyz2Eo.js} +0 -0
- /package/dist/{mathematica-BVli92MR.js → mathematica-Dqmg_BwL.js} +0 -0
- /package/dist/{mbox-CMFlocdS.js → mbox-Cng-P-F1.js} +0 -0
- /package/dist/{mirc-BkW04Zpc.js → mirc-CNDqOVhQ.js} +0 -0
- /package/dist/{mllike-DEjvHvNV.js → mllike-C1n2UDyX.js} +0 -0
- /package/dist/{modelica-CxDn-oje.js → modelica-QqQC2pFj.js} +0 -0
- /package/dist/{mscgen-D78wmE-w.js → mscgen-C3fl8uhp.js} +0 -0
- /package/dist/{mumps-Bi0IvPOV.js → mumps-BeCUbMej.js} +0 -0
- /package/dist/{nginx-DErPZFhX.js → nginx-ejv7DsBz.js} +0 -0
- /package/dist/{ntriples-Btyp6wRL.js → ntriples-CUgUpcma.js} +0 -0
- /package/dist/{octave-CZA6-2F8.js → octave-BD652tGl.js} +0 -0
- /package/dist/{oz-Bm6LSNfE.js → oz-DrRsFa0K.js} +0 -0
- /package/dist/{pascal-B4J6a9BH.js → pascal-hpcx9sVn.js} +0 -0
- /package/dist/{path-VDkDgx1I.js → path-Bbv2tLY1.js} +0 -0
- /package/dist/{perl-CzVqxS08.js → perl-DW8XHeFc.js} +0 -0
- /package/dist/{pig-Clh03cnn.js → pig-Cv7Nxbfo.js} +0 -0
- /package/dist/{prop-types-0wNc-99T.js → prop-types-Bd16OEUP.js} +0 -0
- /package/dist/{properties-D7ch1Wyb.js → properties-D-qJDXAM.js} +0 -0
- /package/dist/{protobuf-DrkdrMPK.js → protobuf-B48QZbd3.js} +0 -0
- /package/dist/{puppet-BtZG8zdO.js → puppet-15JDyiY2.js} +0 -0
- /package/dist/{python-B6FKOVIv.js → python-DWkQA94h.js} +0 -0
- /package/dist/{r-Dnvo5-96.js → r-dcNRe_Q8.js} +0 -0
- /package/dist/{range-PcytnUSJ.js → range-CQvYp_qE.js} +0 -0
- /package/dist/{rpm-B1DrgfnX.js → rpm-Djl3Dsf1.js} +0 -0
- /package/dist/{ruby-CelfUg17.js → ruby-Dd2CZTip.js} +0 -0
- /package/dist/{sas-DfSQFMWG.js → sas-DYF5_Iqu.js} +0 -0
- /package/dist/{scheme-BplhaWuO.js → scheme-YtWcji1H.js} +0 -0
- /package/dist/{shell-DqU5OS2c.js → shell-C3uC3Y0Z.js} +0 -0
- /package/dist/{sieve-BE4_IyGa.js → sieve-DHB17sQG.js} +0 -0
- /package/dist/{smalltalk-B_WPL8Nx.js → smalltalk-Y5v1Np3H.js} +0 -0
- /package/dist/{solr-DlJFg7H5.js → solr-DvRJLlRD.js} +0 -0
- /package/dist/{sparql-7XIlcOgW.js → sparql-BEt3GJwM.js} +0 -0
- /package/dist/{spreadsheet-BdZSVwVp.js → spreadsheet-Dp4B9_rc.js} +0 -0
- /package/dist/{sql-CCrq7lfJ.js → sql-DBsUs8nQ.js} +0 -0
- /package/dist/{stex-BiFc8QAu.js → stex-C6-x52ei.js} +0 -0
- /package/dist/{stylus-DlSH9xpH.js → stylus-DroA8via.js} +0 -0
- /package/dist/{swift-e3tMTZgJ.js → swift-DR0x1ESK.js} +0 -0
- /package/dist/{tcl-DfZMC20G.js → tcl-BeuTFc_c.js} +0 -0
- /package/dist/{textile-DaSeca5U.js → textile-C0ikhHN3.js} +0 -0
- /package/dist/{tiddlywiki-dfoiz8pS.js → tiddlywiki-C_2Nvsgu.js} +0 -0
- /package/dist/{tiki-yJbQzhma.js → tiki-CKQlhmQQ.js} +0 -0
- /package/dist/{treemap-BpgMKHv-.js → treemap-BYLUKIzA.js} +0 -0
- /package/dist/{troff-FN_FrCXR.js → troff-DkK0f2ZH.js} +0 -0
- /package/dist/{tslib.es6-DofFyd9S.js → tslib.es6-3ZL768sZ.js} +0 -0
- /package/dist/{ttcn-7_i4HlyB.js → ttcn-Bf8vrg-_.js} +0 -0
- /package/dist/{ttcn-cfg-B46AlBUV.js → ttcn-cfg-DjCKzd95.js} +0 -0
- /package/dist/{turtle-QQfeFveR.js → turtle-SSc84S9m.js} +0 -0
- /package/dist/{vb-DToPVnLa.js → vb-CQ6DC3cL.js} +0 -0
- /package/dist/{vbscript-CtsNaTz4.js → vbscript-Dw0gFssg.js} +0 -0
- /package/dist/{velocity-CAoNe6ns.js → velocity-BvJQyBmj.js} +0 -0
- /package/dist/{verilog-DrDOMiJq.js → verilog-CKGAvQjj.js} +0 -0
- /package/dist/{vhdl-DnO0OEPh.js → vhdl-B40_x6fM.js} +0 -0
- /package/dist/{webidl-Or6d1ZfA.js → webidl-Bi9hczCv.js} +0 -0
- /package/dist/{xquery-CEp_Mcpr.js → xquery-DwWUXvP3.js} +0 -0
- /package/dist/{yacas-DgnYrSlp.js → yacas-ClUs0mmH.js} +0 -0
- /package/dist/{z80-DlG_kyeB.js → z80-DPC4UGzR.js} +0 -0
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
|
|
4
|
+
import { WebSocketTransport } from "@open-rpc/client-js";
|
|
5
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
6
|
+
import { Mocks } from "@/__mocks__/common";
|
|
7
|
+
import { ReconnectingWebSocketTransport } from "../transport";
|
|
8
|
+
|
|
9
|
+
// Mock the Logger
|
|
10
|
+
vi.mock("@/utils/Logger", () => ({
|
|
11
|
+
Logger: Mocks.logger(),
|
|
12
|
+
}));
|
|
13
|
+
|
|
14
|
+
// Mock the WebSocketTransport
|
|
15
|
+
vi.mock("@open-rpc/client-js", () => {
|
|
16
|
+
const mockWebSocketTransport = vi.fn();
|
|
17
|
+
mockWebSocketTransport.prototype.connect = vi.fn();
|
|
18
|
+
mockWebSocketTransport.prototype.close = vi.fn();
|
|
19
|
+
mockWebSocketTransport.prototype.sendData = vi.fn();
|
|
20
|
+
|
|
21
|
+
return {
|
|
22
|
+
WebSocketTransport: mockWebSocketTransport,
|
|
23
|
+
};
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
describe("ReconnectingWebSocketTransport", () => {
|
|
27
|
+
const mockWsUrl = "ws://localhost:8080/lsp";
|
|
28
|
+
let mockConnection: any;
|
|
29
|
+
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
vi.clearAllMocks();
|
|
32
|
+
|
|
33
|
+
// Create a mock WebSocket connection with readyState
|
|
34
|
+
mockConnection = {
|
|
35
|
+
readyState: WebSocket.OPEN,
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
// Mock the WebSocketTransport constructor to set the connection
|
|
39
|
+
(WebSocketTransport as any).mockImplementation(function (this: any) {
|
|
40
|
+
this.connection = mockConnection;
|
|
41
|
+
this.connect = vi.fn().mockResolvedValue(undefined);
|
|
42
|
+
this.close = vi.fn();
|
|
43
|
+
this.sendData = vi.fn().mockResolvedValue({ result: "success" });
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it("should create a transport with the provided URL function", () => {
|
|
48
|
+
const getWsUrl = vi.fn(() => mockWsUrl);
|
|
49
|
+
const transport = new ReconnectingWebSocketTransport({ getWsUrl });
|
|
50
|
+
|
|
51
|
+
expect(transport).toBeDefined();
|
|
52
|
+
expect(getWsUrl).not.toHaveBeenCalled(); // URL function not called until connect
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it("should connect successfully", async () => {
|
|
56
|
+
const getWsUrl = vi.fn(() => mockWsUrl);
|
|
57
|
+
const transport = new ReconnectingWebSocketTransport({ getWsUrl });
|
|
58
|
+
|
|
59
|
+
await transport.connect();
|
|
60
|
+
|
|
61
|
+
expect(getWsUrl).toHaveBeenCalledTimes(1);
|
|
62
|
+
expect(WebSocketTransport).toHaveBeenCalledWith(mockWsUrl);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it("should wait for connection before connecting", async () => {
|
|
66
|
+
const getWsUrl = vi.fn(() => mockWsUrl);
|
|
67
|
+
const waitForConnection = vi.fn().mockResolvedValue(undefined);
|
|
68
|
+
const transport = new ReconnectingWebSocketTransport({
|
|
69
|
+
getWsUrl,
|
|
70
|
+
waitForConnection,
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
await transport.connect();
|
|
74
|
+
|
|
75
|
+
expect(waitForConnection).toHaveBeenCalledTimes(1);
|
|
76
|
+
expect(getWsUrl).toHaveBeenCalledTimes(1);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it("should reuse the same connection promise if already connecting", async () => {
|
|
80
|
+
const getWsUrl = vi.fn(() => mockWsUrl);
|
|
81
|
+
const waitForConnection = vi
|
|
82
|
+
.fn()
|
|
83
|
+
.mockImplementation(
|
|
84
|
+
() => new Promise((resolve) => setTimeout(resolve, 100)),
|
|
85
|
+
);
|
|
86
|
+
const transport = new ReconnectingWebSocketTransport({
|
|
87
|
+
getWsUrl,
|
|
88
|
+
waitForConnection,
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
// Start two connections concurrently
|
|
92
|
+
const promise1 = transport.connect();
|
|
93
|
+
const promise2 = transport.connect();
|
|
94
|
+
|
|
95
|
+
await Promise.all([promise1, promise2]);
|
|
96
|
+
|
|
97
|
+
// Should only create one delegate
|
|
98
|
+
expect(WebSocketTransport).toHaveBeenCalledTimes(1);
|
|
99
|
+
expect(waitForConnection).toHaveBeenCalledTimes(1);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
it("should send data successfully when connected", async () => {
|
|
103
|
+
const getWsUrl = vi.fn(() => mockWsUrl);
|
|
104
|
+
const transport = new ReconnectingWebSocketTransport({ getWsUrl });
|
|
105
|
+
|
|
106
|
+
await transport.connect();
|
|
107
|
+
|
|
108
|
+
const data: any = { method: "test", params: [] };
|
|
109
|
+
const result = await transport.sendData(data, 5000);
|
|
110
|
+
|
|
111
|
+
expect(result).toEqual({ result: "success" });
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it("should reconnect when WebSocket is in CLOSED state", async () => {
|
|
115
|
+
const getWsUrl = vi.fn(() => mockWsUrl);
|
|
116
|
+
const transport = new ReconnectingWebSocketTransport({ getWsUrl });
|
|
117
|
+
|
|
118
|
+
// First connection
|
|
119
|
+
await transport.connect();
|
|
120
|
+
expect(WebSocketTransport).toHaveBeenCalledTimes(1);
|
|
121
|
+
|
|
122
|
+
// Simulate WebSocket closing
|
|
123
|
+
mockConnection.readyState = WebSocket.CLOSED;
|
|
124
|
+
|
|
125
|
+
// Send data should trigger reconnection
|
|
126
|
+
const data: any = { method: "test", params: [] };
|
|
127
|
+
await transport.sendData(data, 5000);
|
|
128
|
+
|
|
129
|
+
// Should have created a new WebSocketTransport
|
|
130
|
+
expect(WebSocketTransport).toHaveBeenCalledTimes(2);
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it("should reconnect when WebSocket is in CLOSING state", async () => {
|
|
134
|
+
const getWsUrl = vi.fn(() => mockWsUrl);
|
|
135
|
+
const transport = new ReconnectingWebSocketTransport({ getWsUrl });
|
|
136
|
+
|
|
137
|
+
// First connection
|
|
138
|
+
await transport.connect();
|
|
139
|
+
expect(WebSocketTransport).toHaveBeenCalledTimes(1);
|
|
140
|
+
|
|
141
|
+
// Simulate WebSocket closing
|
|
142
|
+
mockConnection.readyState = WebSocket.CLOSING;
|
|
143
|
+
|
|
144
|
+
// Send data should trigger reconnection
|
|
145
|
+
const data: any = { method: "test", params: [] };
|
|
146
|
+
await transport.sendData(data, 5000);
|
|
147
|
+
|
|
148
|
+
// Should have created a new WebSocketTransport
|
|
149
|
+
expect(WebSocketTransport).toHaveBeenCalledTimes(2);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
it("should close the transport and prevent reconnection", async () => {
|
|
153
|
+
const getWsUrl = vi.fn(() => mockWsUrl);
|
|
154
|
+
const transport = new ReconnectingWebSocketTransport({ getWsUrl });
|
|
155
|
+
|
|
156
|
+
await transport.connect();
|
|
157
|
+
transport.close();
|
|
158
|
+
|
|
159
|
+
// Attempting to connect again should throw
|
|
160
|
+
await expect(transport.connect()).rejects.toThrow("Transport is closed");
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
it("should close old delegate when creating a new one", async () => {
|
|
164
|
+
const getWsUrl = vi.fn(() => mockWsUrl);
|
|
165
|
+
const transport = new ReconnectingWebSocketTransport({ getWsUrl });
|
|
166
|
+
|
|
167
|
+
// First connection
|
|
168
|
+
await transport.connect();
|
|
169
|
+
const firstDelegate = (transport as any).delegate;
|
|
170
|
+
expect(firstDelegate).toBeDefined();
|
|
171
|
+
|
|
172
|
+
// Simulate connection closed
|
|
173
|
+
mockConnection.readyState = WebSocket.CLOSED;
|
|
174
|
+
|
|
175
|
+
// Reconnect by sending data
|
|
176
|
+
const data: any = { method: "test", params: [] };
|
|
177
|
+
await transport.sendData(data, 5000);
|
|
178
|
+
|
|
179
|
+
// Old delegate should have been closed
|
|
180
|
+
expect(firstDelegate.close).toHaveBeenCalled();
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
it("should handle connection failures gracefully", async () => {
|
|
184
|
+
const getWsUrl = vi.fn(() => mockWsUrl);
|
|
185
|
+
const connectionError = new Error("Connection failed");
|
|
186
|
+
|
|
187
|
+
// Mock connect to fail
|
|
188
|
+
(WebSocketTransport as any).mockImplementationOnce(function (this: any) {
|
|
189
|
+
this.connection = mockConnection;
|
|
190
|
+
this.connect = vi.fn().mockRejectedValue(connectionError);
|
|
191
|
+
this.close = vi.fn();
|
|
192
|
+
this.sendData = vi.fn();
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
const transport = new ReconnectingWebSocketTransport({ getWsUrl });
|
|
196
|
+
|
|
197
|
+
await expect(transport.connect()).rejects.toThrow("Connection failed");
|
|
198
|
+
|
|
199
|
+
// Delegate should be cleared after failure
|
|
200
|
+
expect((transport as any).delegate).toBeUndefined();
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
it("should handle waitForConnection failures", async () => {
|
|
204
|
+
const getWsUrl = vi.fn(() => mockWsUrl);
|
|
205
|
+
const waitError = new Error("Wait failed");
|
|
206
|
+
const waitForConnection = vi.fn().mockRejectedValue(waitError);
|
|
207
|
+
|
|
208
|
+
const transport = new ReconnectingWebSocketTransport({
|
|
209
|
+
getWsUrl,
|
|
210
|
+
waitForConnection,
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
await expect(transport.connect()).rejects.toThrow("Wait failed");
|
|
214
|
+
|
|
215
|
+
// Should not have created a delegate
|
|
216
|
+
expect(WebSocketTransport).not.toHaveBeenCalled();
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
it("should automatically reconnect on sendData after connection loss", async () => {
|
|
220
|
+
const getWsUrl = vi.fn(() => mockWsUrl);
|
|
221
|
+
const transport = new ReconnectingWebSocketTransport({ getWsUrl });
|
|
222
|
+
|
|
223
|
+
// Don't connect initially
|
|
224
|
+
// Simulate WebSocket in closed state (no delegate exists)
|
|
225
|
+
expect((transport as any).delegate).toBeUndefined();
|
|
226
|
+
|
|
227
|
+
// Send data should trigger automatic connection
|
|
228
|
+
const data: any = { method: "test", params: [] };
|
|
229
|
+
await transport.sendData(data, 5000);
|
|
230
|
+
|
|
231
|
+
expect(WebSocketTransport).toHaveBeenCalledTimes(1);
|
|
232
|
+
});
|
|
233
|
+
});
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
|
+
import { WebSocketTransport } from "@open-rpc/client-js";
|
|
3
|
+
import type { JSONRPCRequestData } from "@open-rpc/client-js/build/Request";
|
|
4
|
+
import { Transport } from "@open-rpc/client-js/build/transports/Transport";
|
|
5
|
+
import { Logger } from "@/utils/Logger";
|
|
6
|
+
|
|
7
|
+
export interface ReconnectingWebSocketTransportOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Function that returns the WebSocket URL to connect to.
|
|
10
|
+
*/
|
|
11
|
+
getWsUrl: () => string;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Optional function to wait for before attempting to connect.
|
|
15
|
+
* This is useful for ensuring dependencies (like the runtime) are ready.
|
|
16
|
+
*/
|
|
17
|
+
waitForConnection?: () => Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* A WebSocket transport that automatically reconnects when the connection is lost.
|
|
22
|
+
* This handles cases like computer sleep/wake or network interruptions.
|
|
23
|
+
*/
|
|
24
|
+
export class ReconnectingWebSocketTransport extends Transport {
|
|
25
|
+
private delegate: WebSocketTransport | undefined;
|
|
26
|
+
private readonly options: ReconnectingWebSocketTransportOptions;
|
|
27
|
+
private connectionPromise: Promise<void> | undefined;
|
|
28
|
+
private isClosed = false;
|
|
29
|
+
|
|
30
|
+
constructor(options: ReconnectingWebSocketTransportOptions) {
|
|
31
|
+
super();
|
|
32
|
+
this.options = options;
|
|
33
|
+
this.delegate = undefined;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Create a new WebSocket delegate, replacing any existing one.
|
|
38
|
+
*/
|
|
39
|
+
private createDelegate(): WebSocketTransport {
|
|
40
|
+
// Close the old delegate if it exists
|
|
41
|
+
if (this.delegate) {
|
|
42
|
+
try {
|
|
43
|
+
this.delegate.close();
|
|
44
|
+
} catch (error) {
|
|
45
|
+
Logger.warn("Error closing old WebSocket delegate", error);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Create a new delegate
|
|
50
|
+
this.delegate = new WebSocketTransport(this.options.getWsUrl());
|
|
51
|
+
return this.delegate;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Check if the current delegate's WebSocket is in a closed or closing state.
|
|
56
|
+
*/
|
|
57
|
+
private isDelegateClosedOrClosing(): boolean {
|
|
58
|
+
if (!this.delegate) {
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Access the internal connection to check its readyState
|
|
63
|
+
const ws = this.delegate.connection;
|
|
64
|
+
if (!ws) {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// WebSocket.CLOSING = 2, WebSocket.CLOSED = 3
|
|
69
|
+
return (
|
|
70
|
+
ws.readyState === WebSocket.CLOSING || ws.readyState === WebSocket.CLOSED
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
override async connect() {
|
|
75
|
+
// Don't reconnect if explicitly closed
|
|
76
|
+
if (this.isClosed) {
|
|
77
|
+
throw new Error("Transport is closed");
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// If already connecting, wait for that connection
|
|
81
|
+
if (this.connectionPromise) {
|
|
82
|
+
return this.connectionPromise;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
this.connectionPromise = (async () => {
|
|
86
|
+
try {
|
|
87
|
+
// Wait for dependencies to be ready (e.g., runtime connection)
|
|
88
|
+
if (this.options.waitForConnection) {
|
|
89
|
+
await this.options.waitForConnection();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Create a new delegate if needed
|
|
93
|
+
let delegate = this.delegate;
|
|
94
|
+
if (!delegate || this.isDelegateClosedOrClosing()) {
|
|
95
|
+
delegate = this.createDelegate();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Connect the delegate
|
|
99
|
+
await delegate.connect();
|
|
100
|
+
Logger.log("WebSocket transport connected successfully");
|
|
101
|
+
} catch (error) {
|
|
102
|
+
Logger.error("WebSocket transport connection failed", error);
|
|
103
|
+
// Clear the delegate on failure so we create a new one on retry
|
|
104
|
+
this.delegate = undefined;
|
|
105
|
+
throw error;
|
|
106
|
+
} finally {
|
|
107
|
+
this.connectionPromise = undefined;
|
|
108
|
+
}
|
|
109
|
+
})();
|
|
110
|
+
|
|
111
|
+
return this.connectionPromise;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
override close() {
|
|
115
|
+
this.isClosed = true;
|
|
116
|
+
this.delegate?.close();
|
|
117
|
+
this.delegate = undefined;
|
|
118
|
+
this.connectionPromise = undefined;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
override async sendData(
|
|
122
|
+
data: JSONRPCRequestData,
|
|
123
|
+
timeout: number | null | undefined,
|
|
124
|
+
) {
|
|
125
|
+
// If the delegate is closed or closing, try to reconnect
|
|
126
|
+
if (this.isDelegateClosedOrClosing()) {
|
|
127
|
+
Logger.warn("WebSocket is closed or closing, attempting to reconnect");
|
|
128
|
+
try {
|
|
129
|
+
await this.connect();
|
|
130
|
+
} catch (error) {
|
|
131
|
+
Logger.error("Failed to reconnect WebSocket", error);
|
|
132
|
+
throw error;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Send the data using the delegate
|
|
137
|
+
return this.delegate?.sendData(data, timeout);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
@@ -409,5 +409,19 @@ export function createNetworkRequests(): EditRequests & RunRequests {
|
|
|
409
409
|
})
|
|
410
410
|
.then(handleResponse);
|
|
411
411
|
},
|
|
412
|
+
clearCache: async () => {
|
|
413
|
+
return getClient()
|
|
414
|
+
.POST("/api/cache/clear", {
|
|
415
|
+
body: {},
|
|
416
|
+
})
|
|
417
|
+
.then(handleResponseReturnNull);
|
|
418
|
+
},
|
|
419
|
+
getCacheInfo: async () => {
|
|
420
|
+
return getClient()
|
|
421
|
+
.POST("/api/cache/info", {
|
|
422
|
+
body: {},
|
|
423
|
+
})
|
|
424
|
+
.then(handleResponseReturnNull);
|
|
425
|
+
},
|
|
412
426
|
};
|
|
413
427
|
}
|
|
@@ -86,5 +86,7 @@ export function createStaticRequests(): EditRequests & RunRequests {
|
|
|
86
86
|
listSecretKeys: throwNotInEditMode,
|
|
87
87
|
writeSecret: throwNotInEditMode,
|
|
88
88
|
invokeAiTool: throwNotInEditMode,
|
|
89
|
+
clearCache: throwNotInEditMode,
|
|
90
|
+
getCacheInfo: throwNotInEditMode,
|
|
89
91
|
};
|
|
90
92
|
}
|
|
@@ -64,6 +64,8 @@ export function createErrorToastingRequests(
|
|
|
64
64
|
listSecretKeys: "Failed to fetch secrets",
|
|
65
65
|
writeSecret: "Failed to write secret",
|
|
66
66
|
invokeAiTool: "Failed to invoke AI tool",
|
|
67
|
+
clearCache: "Failed to clear cache",
|
|
68
|
+
getCacheInfo: "", // No toast
|
|
67
69
|
};
|
|
68
70
|
|
|
69
71
|
const handlers = {} as EditRequests & RunRequests;
|
|
@@ -99,6 +99,8 @@ export type OpenTutorialRequest = schemas["OpenTutorialRequest"];
|
|
|
99
99
|
export type TutorialId = OpenTutorialRequest["tutorialId"];
|
|
100
100
|
export type InvokeAiToolRequest = schemas["InvokeAiToolRequest"];
|
|
101
101
|
export type InvokeAiToolResponse = schemas["InvokeAiToolResponse"];
|
|
102
|
+
export type ClearCacheRequest = schemas["ClearCacheRequest"];
|
|
103
|
+
export type GetCacheInfoRequest = schemas["GetCacheInfoRequest"];
|
|
102
104
|
|
|
103
105
|
/**
|
|
104
106
|
* Requests sent to the BE during run/edit mode.
|
|
@@ -188,6 +190,9 @@ export interface EditRequests {
|
|
|
188
190
|
writeSecret: (request: CreateSecretRequest) => Promise<null>;
|
|
189
191
|
// AI Tool requests
|
|
190
192
|
invokeAiTool: (request: InvokeAiToolRequest) => Promise<InvokeAiToolResponse>;
|
|
193
|
+
// Cache requests
|
|
194
|
+
clearCache: () => Promise<null>;
|
|
195
|
+
getCacheInfo: () => Promise<null>;
|
|
191
196
|
}
|
|
192
197
|
|
|
193
198
|
export type RequestKey = keyof (EditRequests & RunRequests);
|
package/src/core/rtc/state.ts
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
2
|
import { atomWithStorage } from "jotai/utils";
|
|
3
3
|
import { once } from "lodash-es";
|
|
4
|
+
import { jotaiJsonStorage } from "@/utils/storage/jotai";
|
|
4
5
|
import { getFeatureFlag } from "../config/feature-flag";
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* The username for the current user when using real-time collaboration.
|
|
8
9
|
* This is stored in localStorage.
|
|
9
10
|
*/
|
|
10
|
-
export const usernameAtom = atomWithStorage<string>(
|
|
11
|
+
export const usernameAtom = atomWithStorage<string>(
|
|
12
|
+
"marimo:rtc:username",
|
|
13
|
+
"",
|
|
14
|
+
jotaiJsonStorage,
|
|
15
|
+
);
|
|
11
16
|
|
|
12
17
|
/**
|
|
13
18
|
* Whether RTC is enabled.
|
|
@@ -96,54 +96,61 @@ export function useSaveNotebook() {
|
|
|
96
96
|
const store = useStore();
|
|
97
97
|
|
|
98
98
|
// Save the notebook with the given filename
|
|
99
|
-
const saveNotebook = useEvent(
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
const cellNames = cells.map((cell) => cell.name);
|
|
105
|
-
const configs = getCellConfigs(notebook);
|
|
106
|
-
const connection = store.get(connectionAtom);
|
|
107
|
-
const autoSaveConfig = store.get(autoSaveConfigAtom);
|
|
108
|
-
const layout = store.get(layoutStateAtom);
|
|
109
|
-
const kioskMode = store.get(kioskModeAtom);
|
|
99
|
+
const saveNotebook = useEvent(
|
|
100
|
+
async (filename: string, userInitiated: boolean) => {
|
|
101
|
+
const connection = store.get(connectionAtom);
|
|
102
|
+
const autoSaveConfig = store.get(autoSaveConfigAtom);
|
|
103
|
+
const kioskMode = store.get(kioskModeAtom);
|
|
110
104
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
105
|
+
if (kioskMode) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
114
108
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
109
|
+
// Don't save if we are not connected to a kernel
|
|
110
|
+
if (connection.state !== WebSocketState.OPEN) {
|
|
111
|
+
openAlert("Failed to save notebook: not connected to a kernel.");
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
119
114
|
|
|
120
|
-
|
|
121
|
-
if (connection.state !== WebSocketState.OPEN) {
|
|
122
|
-
openAlert("Failed to save notebook: not connected to a kernel.");
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
115
|
+
Logger.log("saving to ", filename);
|
|
125
116
|
|
|
126
|
-
Logger.log("saving to ", filename);
|
|
127
|
-
sendSave({
|
|
128
|
-
cellIds: cellIds,
|
|
129
|
-
codes,
|
|
130
|
-
names: cellNames,
|
|
131
|
-
filename,
|
|
132
|
-
configs,
|
|
133
|
-
layout: getSerializedLayout(),
|
|
134
|
-
persist: true,
|
|
135
|
-
}).then(() => {
|
|
136
117
|
if (userInitiated && autoSaveConfig.format_on_save) {
|
|
137
|
-
|
|
118
|
+
Logger.log("formatting notebook (onSave)");
|
|
119
|
+
await formatAll();
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Grab the latest notebook state, after formatting
|
|
123
|
+
const notebook = getNotebook();
|
|
124
|
+
const cells = notebookCells(notebook);
|
|
125
|
+
const cellIds = cells.map((cell) => cell.id);
|
|
126
|
+
const codes = cells.map((cell) => cell.code);
|
|
127
|
+
const cellNames = cells.map((cell) => cell.name);
|
|
128
|
+
const configs = getCellConfigs(notebook);
|
|
129
|
+
const layout = store.get(layoutStateAtom);
|
|
130
|
+
|
|
131
|
+
// Don't save if there are no cells
|
|
132
|
+
if (codes.length === 0) {
|
|
133
|
+
return;
|
|
138
134
|
}
|
|
135
|
+
|
|
136
|
+
await sendSave({
|
|
137
|
+
cellIds: cellIds,
|
|
138
|
+
codes,
|
|
139
|
+
names: cellNames,
|
|
140
|
+
filename,
|
|
141
|
+
configs,
|
|
142
|
+
layout: getSerializedLayout(),
|
|
143
|
+
persist: true,
|
|
144
|
+
});
|
|
145
|
+
|
|
139
146
|
setLastSavedNotebook({
|
|
140
147
|
names: cellNames,
|
|
141
148
|
codes,
|
|
142
149
|
configs,
|
|
143
150
|
layout,
|
|
144
151
|
});
|
|
145
|
-
}
|
|
146
|
-
|
|
152
|
+
},
|
|
153
|
+
);
|
|
147
154
|
|
|
148
155
|
// Save the notebook with the current filename, only if the filename exists
|
|
149
156
|
const saveIfNotebookIsPersistent = useEvent((userInitiated = false) => {
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Whether the current environment is in the VSCode extension
|
|
5
|
+
*/
|
|
6
|
+
export function isInVscodeExtension(): boolean {
|
|
7
|
+
// We check if the document has a data-vscode-theme-kind attribute
|
|
8
|
+
return document.querySelector("[data-vscode-theme-kind]") !== null;
|
|
9
|
+
}
|
package/src/core/wasm/bridge.ts
CHANGED
|
@@ -551,6 +551,8 @@ export class PyodideBridge implements RunRequests, EditRequests {
|
|
|
551
551
|
};
|
|
552
552
|
|
|
553
553
|
invokeAiTool = throwNotImplemented;
|
|
554
|
+
clearCache = throwNotImplemented;
|
|
555
|
+
getCacheInfo = throwNotImplemented;
|
|
554
556
|
|
|
555
557
|
private async putControlRequest(operation: object) {
|
|
556
558
|
await this.rpc.proxy.request.bridge({
|
package/src/core/wasm/store.ts
CHANGED
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
compressToEncodedURIComponent,
|
|
5
5
|
decompressFromEncodedURIComponent,
|
|
6
6
|
} from "lz-string";
|
|
7
|
-
import { TypedLocalStorage } from "@/utils/
|
|
7
|
+
import { TypedLocalStorage } from "@/utils/storage/typed";
|
|
8
8
|
import { PyodideRouter } from "./router";
|
|
9
9
|
|
|
10
10
|
export interface FileStore {
|
|
@@ -24,6 +24,7 @@ import { jsonParseWithSpecialChar } from "@/utils/json/json-parser";
|
|
|
24
24
|
import { Logger } from "@/utils/Logger";
|
|
25
25
|
import { reloadSafe } from "@/utils/reload-safe";
|
|
26
26
|
import { useAlertActions } from "../alerts/state";
|
|
27
|
+
import { cacheInfoAtom } from "../cache/requests";
|
|
27
28
|
import type { CellId, UIElementId } from "../cells/ids";
|
|
28
29
|
import { useRunsActions } from "../cells/runs";
|
|
29
30
|
import { focusAndScrollCellOutputIntoView } from "../cells/scrollCellIntoView";
|
|
@@ -87,6 +88,7 @@ export function useMarimoWebSocket(opts: {
|
|
|
87
88
|
const setKioskMode = useSetAtom(kioskModeAtom);
|
|
88
89
|
const setCapabilities = useSetAtom(capabilitiesAtom);
|
|
89
90
|
const runtimeManager = useRuntimeManager();
|
|
91
|
+
const setCacheInfo = useSetAtom(cacheInfoAtom);
|
|
90
92
|
|
|
91
93
|
const handleMessage = (e: MessageEvent<JsonString<OperationMessage>>) => {
|
|
92
94
|
const msg = jsonParseWithSpecialChar(e.data);
|
|
@@ -248,6 +250,12 @@ export function useMarimoWebSocket(opts: {
|
|
|
248
250
|
case "secret-keys-result":
|
|
249
251
|
SECRETS_REGISTRY.resolve(msg.data.request_id as RequestId, msg.data);
|
|
250
252
|
return;
|
|
253
|
+
case "cache-info-fetched":
|
|
254
|
+
setCacheInfo(msg.data);
|
|
255
|
+
return;
|
|
256
|
+
case "cache-cleared":
|
|
257
|
+
// Cache cleared, could refresh cache info if needed
|
|
258
|
+
return;
|
|
251
259
|
case "data-source-connections":
|
|
252
260
|
addDataSourceConnection({
|
|
253
261
|
connections: msg.data.connections.map((conn) => ({
|
package/src/css/app/Cell.css
CHANGED
|
@@ -34,6 +34,37 @@
|
|
|
34
34
|
z-index: 1;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
/* Styling for cells marked for deletion by AI */
|
|
38
|
+
&:has(.mo-ai-deleted-cell) {
|
|
39
|
+
opacity: 0.7;
|
|
40
|
+
position: relative;
|
|
41
|
+
|
|
42
|
+
.output-area,
|
|
43
|
+
.cm-gutters,
|
|
44
|
+
.cm {
|
|
45
|
+
background-color: var(--red-2);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/* Add a red glow to indicate deletion */
|
|
49
|
+
&::before {
|
|
50
|
+
content: "";
|
|
51
|
+
position: absolute;
|
|
52
|
+
inset: 0;
|
|
53
|
+
border-radius: 10px;
|
|
54
|
+
pointer-events: none;
|
|
55
|
+
opacity: 0.6;
|
|
56
|
+
box-shadow: 0px 0px 10px 0px var(--red-9);
|
|
57
|
+
z-index: 1;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/* Add strikethrough effect to the code */
|
|
61
|
+
.cm-content {
|
|
62
|
+
text-decoration: line-through;
|
|
63
|
+
text-decoration-color: var(--red-9);
|
|
64
|
+
text-decoration-thickness: 1px;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
37
68
|
&:focus-within {
|
|
38
69
|
z-index: 20;
|
|
39
70
|
}
|
package/src/css/globals.css
CHANGED