@marimo-team/islands 0.25.2-dev4 → 0.25.2-dev40
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-CglAbSke.js} +11 -11
- package/dist/{ErrorBoundary-CHS5luyo.js → ErrorBoundary-DsSFkMNZ.js} +8 -8
- package/dist/{abnfDiagram-VCTEODGH-AFhOQTt8.js → abnfDiagram-VCTEODGH-Bd5MYz7g.js} +3 -3
- package/dist/{any-language-editor-CycIVIeP.js → any-language-editor-DJ2MRREE.js} +5 -5
- package/dist/{apl-BYaaig9_.js → apl-GEW9-ZP1.js} +1 -1
- package/dist/{architectureDiagram-5GKGNRK7-BngksAAQ.js → architectureDiagram-5GKGNRK7-12FmGgo8.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-B0Xgl-Qn.js} +12 -0
- package/dist/{c4Diagram-7LVT6UL2-EceL4_jH.js → c4Diagram-7LVT6UL2-Bao10t_O.js} +7 -7
- package/dist/{capabilities-B3ce_GNu.js → capabilities-D7Ad8-zw.js} +1 -1
- package/dist/{cells-Cv93oav_.js → cells-HZp46rAW.js} +278 -278
- package/dist/{channel-z7HZXHwv.js → channel-BxCkvUgE.js} +1 -1
- package/dist/{chat-ui-fVyVOhYN.js → chat-ui-BSm4FFA7.js} +46 -46
- package/dist/{check-B7cIK6gb.js → check-DGZ74tV2.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-BlsbbLiS.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-DoIB7Bub.js} +8 -8
- package/dist/{chunk-SVP7TREG-uIyyySp6.js → chunk-SVP7TREG-B0dScloT.js} +2 -2
- package/dist/{chunk-TICWLB2K-DdXM3eg6.js → chunk-TICWLB2K-C-lzn2th.js} +6 -6
- package/dist/classDiagram-ZZMXUADV-C5vpBHoS.js +30 -0
- package/dist/classDiagram-v2-VYDZK3BY-BS2Wadt0.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-DOzR4Dbu.js → code-visibility-CF8pyEd4.js} +6 -6
- package/dist/{coffeescript-BVe1OiD9.js → coffeescript-C-eFwH5N.js} +1 -1
- package/dist/{common-BH1qMx9b.js → common-CuGATPZ-.js} +31 -24
- package/dist/{commonlisp-DxoBG7fU.js → commonlisp-CyaNXrJR.js} +1 -1
- package/dist/{copy-icon-CLdENY__.js → copy-icon-qmRg_VTX.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-fxnL4mfp.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-D5NkGE9i.js} +10 -10
- package/dist/{data-grid-overlay-editor-C23bOAVI.js → data-grid-overlay-editor-Mbr-fS3b.js} +1 -1
- package/dist/{diagram-S7CK7UJ4-V5-Z-EDY.js → diagram-S7CK7UJ4-CATbk1XK.js} +4 -4
- package/dist/{diagram-UQ7AKVKN-qw8AjDal.js → diagram-UQ7AKVKN-Cjha5vrC.js} +3 -3
- package/dist/{diagram-VSXAHHWV-CR7BJygZ.js → diagram-VSXAHHWV-DPAWJ9Nw.js} +2 -2
- package/dist/{diagram-VX7I27RA-DfuqFb1E.js → diagram-VX7I27RA-BHfAjgGw.js} +5 -5
- package/dist/{diagram-Z3DM3KII-DpWwlYZB.js → diagram-Z3DM3KII-eAoDps6E.js} +3 -3
- package/dist/{dialog-CgNq6y9-.js → dialog-CILKhbsG.js} +3 -3
- 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-CZy06LAq.js → dropdown-menu-BaqM0t4N.js} +7 -7
- 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-D8RYnIZC.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-BfmoNNce.js} +12 -12
- package/dist/{erlang-BtAuIoF0.js → erlang-AdO1-xtV.js} +1 -1
- package/dist/{error-banner-B94dcDmP.js → error-banner-DzAmP0AQ.js} +2 -2
- package/dist/{error-entries-DLl0XqoW.js → error-entries-BmuhCp3w.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-B6DzYbxQ.js → feedback-button-D3il03Hy.js} +10 -10
- package/dist/flowDiagram-HODETNUW-Du_I0oTA.js +16 -0
- package/dist/{formats-Cl_67ghI.js → formats-pPD5eNN7.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-H0BN7EiD.js → glide-data-editor-DPBV7xdX.js} +11 -11
- package/dist/{glide-utils-B3rUT5PI.js → glide-utils-CzzWU59p.js} +3 -3
- package/dist/{globals-C9VJ-IPA.js → globals-CxhiGjJ0.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-BF9hL2Aa.js} +12 -12
- 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-CHsocw1z.js} +2 -2
- package/dist/{ishikawaDiagram-5VMMS53U-BllIlHE5.js → ishikawaDiagram-5VMMS53U-DZdZJdsT.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-B1rrJRmN.js} +9 -9
- package/dist/{label-BslhXqL6.js → label-MNhNNoN6.js} +2 -2
- package/dist/{livescript-Ce4uqGAC.js → livescript-CVPfYnY_.js} +1 -1
- package/dist/{loader-DEZSzvma.js → loader-C9OUkMrj.js} +1 -1
- package/dist/{lua-D6fti_Jk.js → lua-4Fa-T-qq.js} +1 -1
- package/dist/main.js +184 -157
- 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-CEceCleL.js} +54 -54
- package/dist/{mindmap-definition-YA3MSWOX-Cth76xgH.js → mindmap-definition-YA3MSWOX-C6-S9h9O.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-MgsEqPLj.js → number-overlay-editor-V4Mh8AtO.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-BL-R6P57.js} +3 -3
- package/dist/{perl-DjzMqXtt.js → perl-Drlh9s6m.js} +1 -1
- package/dist/{pieDiagram-E7YTZNPT-Bh3eDa9s.js → pieDiagram-E7YTZNPT-DuAOxSRy.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-BCZh7Wj_.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-f-sfFoX9.js} +3 -3
- package/dist/{requirementDiagram-BXWQKSXE-DCwsThh0.js → requirementDiagram-BXWQKSXE-BICupkaf.js} +11 -11
- package/dist/{reveal-component-BNJLyBZU.js → reveal-component-D-j1l0o6.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-C6plhmZr.js → select-BcObMjGz.js} +4 -4
- package/dist/{sequenceDiagram-WJ2MYXX4-CbXB1_PU.js → sequenceDiagram-WJ2MYXX4-DBFRnNGU.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-BSchR9UD.js} +16 -14
- 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-CUP7QQW8.js} +13 -13
- package/dist/stateDiagram-v2-MP3YSRHH-B5mAItmH.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-BtIMdg7b.js} +10 -10
- package/dist/swimlanesDiagram-VR7AAH4N-CGnrrHpw.js +30 -0
- package/dist/{swiper-component-IOUowglM.js → swiper-component-DkV7T44B.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-UwihiSH2.js} +3 -3
- package/dist/{toDate-C67bxMWn.js → toDate-G79A_pyJ.js} +4 -5
- package/dist/{toast-DvY70eFX.js → toast-DcoJGS3-.js} +4 -4
- package/dist/{toml-AesZ6RBt.js → toml-CaUN7UHo.js} +1 -1
- package/dist/{tooltip-qB8NlSqV.js → tooltip-Bi36DgYh.js} +2 -2
- 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-ZgG5Br63.js} +1 -1
- package/dist/{useAsyncData-BD6AStMt.js → useAsyncData-BD7NLQ3_.js} +1 -1
- package/dist/{useDateFormatter-BXQGu86d.js → useDateFormatter-D8XWr8lL.js} +2 -2
- package/dist/{useDeepCompareMemoize-D_HNdyvI.js → useDeepCompareMemoize-CawMGSRU.js} +1 -1
- package/dist/{useIframeCapabilities-CVtNkI3Y.js → useIframeCapabilities-BUMBOpsM.js} +1 -1
- package/dist/{useLifecycle-DPgiiwwU.js → useLifecycle-3vGhRa1o.js} +3 -3
- package/dist/{useTheme-DzXmYZ5V.js → useTheme-BOw801nZ.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-DyMT9lIi.js} +9 -9
- package/dist/{velocity-DHMu9kc-.js → velocity-CZKOFbOI.js} +1 -1
- package/dist/{vennDiagram-4TSXK5OY-BPHjZo0R.js → vennDiagram-4TSXK5OY-D5LNVIRI.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-BwKf-b0_.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-Cg_vyuW2.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 +12 -12
- 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/__tests__/pagination.test.tsx +85 -1
- package/src/components/data-table/charts/__tests__/schemas.test.ts +25 -0
- package/src/components/data-table/charts/__tests__/spec.test.ts +26 -23
- package/src/components/data-table/charts/constants.ts +11 -10
- package/src/components/data-table/charts/types.ts +1 -0
- package/src/components/data-table/pagination.tsx +16 -2
- 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/useSetOutputsExpanded.ts +67 -0
- package/src/core/config/pair.ts +0 -1
- package/src/core/edit-app.tsx +16 -0
- package/src/core/hotkeys/hotkeys.ts +12 -0
- package/src/core/kernel/session.ts +9 -0
- package/src/core/wasm/__tests__/bootstrap.test.ts +33 -1
- package/src/core/wasm/worker/bootstrap.ts +22 -3
- package/src/core/websocket/useMarimoKernelConnection.tsx +10 -1
- package/src/css/katex.min.css +145 -144
- package/src/plugins/impl/CheckboxPlugin.tsx +1 -1
- 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 +1 -1
- package/src/plugins/impl/SwitchPlugin.tsx +6 -1
- 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/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/flowDiagram-HODETNUW-DL52nMkt.js +0 -16
- package/dist/purify.es-DgKyQviY.js +0 -805
- package/dist/stateDiagram-v2-MP3YSRHH-D9YMnUGx.js +0 -30
- package/dist/swimlanesDiagram-VR7AAH4N-Ctgy-yGP.js +0 -30
|
@@ -21,9 +21,9 @@ function isUninformative(value: unknown): boolean {
|
|
|
21
21
|
const SuccessResultSchema = z.looseObject({
|
|
22
22
|
status: z.string().default("success"),
|
|
23
23
|
auth_required: z.boolean().default(false),
|
|
24
|
-
action_url: z.any(),
|
|
25
|
-
next_steps: z.any(),
|
|
26
|
-
meta: z.any(),
|
|
24
|
+
action_url: z.any().optional(),
|
|
25
|
+
next_steps: z.any().optional(),
|
|
26
|
+
meta: z.any().optional(),
|
|
27
27
|
message: z.string().nullish(),
|
|
28
28
|
});
|
|
29
29
|
|
|
@@ -1,7 +1,91 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
|
+
import { getCoreRowModel, useReactTable } from "@tanstack/react-table";
|
|
4
|
+
import { fireEvent, render, screen } from "@testing-library/react";
|
|
3
5
|
import { expect, test } from "vitest";
|
|
4
|
-
import {
|
|
6
|
+
import { TooltipProvider } from "@/components/ui/tooltip";
|
|
7
|
+
import { DataTablePagination, matchingPageRanges } from "../pagination";
|
|
8
|
+
|
|
9
|
+
function PaginationHarness({
|
|
10
|
+
totalPages = 3,
|
|
11
|
+
loading = false,
|
|
12
|
+
}: {
|
|
13
|
+
totalPages?: number;
|
|
14
|
+
loading?: boolean;
|
|
15
|
+
}) {
|
|
16
|
+
const table = useReactTable({
|
|
17
|
+
locale: "en-US",
|
|
18
|
+
data: [],
|
|
19
|
+
columns: [],
|
|
20
|
+
getCoreRowModel: getCoreRowModel(),
|
|
21
|
+
manualPagination: true,
|
|
22
|
+
pageCount: totalPages,
|
|
23
|
+
});
|
|
24
|
+
return (
|
|
25
|
+
<TooltipProvider>
|
|
26
|
+
<DataTablePagination table={table} tableLoading={loading} />
|
|
27
|
+
</TooltipProvider>
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
test("named navigation controls preserve page updates and boundaries", () => {
|
|
32
|
+
render(<PaginationHarness />);
|
|
33
|
+
expect(screen.getByRole("button", { name: "First page" })).toBeDisabled();
|
|
34
|
+
expect(screen.getByRole("button", { name: "Previous page" })).toBeDisabled();
|
|
35
|
+
fireEvent.click(screen.getByRole("button", { name: "Next page" }));
|
|
36
|
+
expect(
|
|
37
|
+
screen.getByRole("button", { name: "Choose page, current page 2 of 3" }),
|
|
38
|
+
).toBeEnabled();
|
|
39
|
+
fireEvent.click(screen.getByRole("button", { name: "Last page" }));
|
|
40
|
+
expect(screen.getByRole("button", { name: "Next page" })).toBeDisabled();
|
|
41
|
+
expect(screen.getByRole("button", { name: "Last page" })).toBeDisabled();
|
|
42
|
+
fireEvent.click(screen.getByRole("button", { name: "Previous page" }));
|
|
43
|
+
fireEvent.click(screen.getByRole("button", { name: "First page" }));
|
|
44
|
+
expect(
|
|
45
|
+
screen.getByRole("button", { name: "Choose page, current page 1 of 3" }),
|
|
46
|
+
).toBeEnabled();
|
|
47
|
+
expect(screen.getByRole("button", { name: "First page" })).toBeDisabled();
|
|
48
|
+
expect(screen.getByRole("button", { name: "Previous page" })).toBeDisabled();
|
|
49
|
+
expect(screen.getByRole("button", { name: "Next page" })).toBeEnabled();
|
|
50
|
+
expect(screen.getByRole("button", { name: "Last page" })).toBeEnabled();
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test("loading prevents navigation and a single page disables controls", () => {
|
|
54
|
+
const { rerender } = render(<PaginationHarness loading={true} />);
|
|
55
|
+
fireEvent.click(screen.getByRole("button", { name: "Next page" }));
|
|
56
|
+
fireEvent.click(screen.getByRole("button", { name: "Last page" }));
|
|
57
|
+
expect(
|
|
58
|
+
screen.getByRole("button", { name: "Choose page, current page 1 of 3" }),
|
|
59
|
+
).toBeEnabled();
|
|
60
|
+
rerender(<PaginationHarness />);
|
|
61
|
+
fireEvent.click(screen.getByRole("button", { name: "Next page" }));
|
|
62
|
+
expect(
|
|
63
|
+
screen.getByRole("button", { name: "Choose page, current page 2 of 3" }),
|
|
64
|
+
).toBeEnabled();
|
|
65
|
+
rerender(<PaginationHarness key="single-page" totalPages={1} />);
|
|
66
|
+
for (const name of [
|
|
67
|
+
"First page",
|
|
68
|
+
"Previous page",
|
|
69
|
+
"Next page",
|
|
70
|
+
"Last page",
|
|
71
|
+
"Choose page, current page 1 of 1",
|
|
72
|
+
]) {
|
|
73
|
+
expect(screen.getByRole("button", { name })).toBeDisabled();
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
test("page picker exposes named dialog and search", () => {
|
|
78
|
+
render(<PaginationHarness />);
|
|
79
|
+
fireEvent.click(
|
|
80
|
+
screen.getByRole("button", { name: "Choose page, current page 1 of 3" }),
|
|
81
|
+
);
|
|
82
|
+
expect(
|
|
83
|
+
screen.getByRole("dialog", { name: "Choose page" }),
|
|
84
|
+
).toBeInTheDocument();
|
|
85
|
+
expect(
|
|
86
|
+
screen.getByRole("combobox", { name: "Search pages" }),
|
|
87
|
+
).toBeInTheDocument();
|
|
88
|
+
});
|
|
5
89
|
|
|
6
90
|
test("empty prefix returns no ranges", () => {
|
|
7
91
|
expect(matchingPageRanges("", 500)).toEqual([]);
|
|
@@ -4,6 +4,31 @@ import { describe, expect, it } from "vitest";
|
|
|
4
4
|
import { ChartSchema } from "../schemas";
|
|
5
5
|
|
|
6
6
|
describe("ChartSchema", () => {
|
|
7
|
+
it.each(["hours", "yearmonthdatehours"] as const)(
|
|
8
|
+
"preserves the %s time unit in saved chart configurations",
|
|
9
|
+
(timeUnit) => {
|
|
10
|
+
const column = {
|
|
11
|
+
field: "timestamp",
|
|
12
|
+
selectedDataType: "temporal",
|
|
13
|
+
sort: "ascending",
|
|
14
|
+
timeUnit,
|
|
15
|
+
};
|
|
16
|
+
const config = {
|
|
17
|
+
general: {
|
|
18
|
+
xColumn: { ...column, aggregate: "none" },
|
|
19
|
+
yColumn: { ...column, aggregate: "none" },
|
|
20
|
+
facet: {
|
|
21
|
+
row: { ...column, linkYAxis: true, binned: true, maxbins: 6 },
|
|
22
|
+
column: { ...column, linkXAxis: true, binned: true, maxbins: 6 },
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
tooltips: { auto: true, fields: [] },
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
expect(ChartSchema.parse(config)).toEqual(config);
|
|
29
|
+
},
|
|
30
|
+
);
|
|
31
|
+
|
|
7
32
|
it("keeps a known axis column type", () => {
|
|
8
33
|
const result = ChartSchema.parse({
|
|
9
34
|
general: { xColumn: { field: "count", type: "integer" } },
|
|
@@ -69,30 +69,33 @@ describe("getAxisEncoding", () => {
|
|
|
69
69
|
});
|
|
70
70
|
});
|
|
71
71
|
|
|
72
|
-
it("
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
72
|
+
it.each(["yearmonth", "hours", "yearmonthdatehours"] as const)(
|
|
73
|
+
"should preserve the %s time unit in temporal axis encodings",
|
|
74
|
+
(timeUnit) => {
|
|
75
|
+
const result = getAxisEncoding(
|
|
76
|
+
{
|
|
77
|
+
field: "date",
|
|
78
|
+
selectedDataType: "temporal",
|
|
79
|
+
aggregate: NONE_VALUE,
|
|
80
|
+
timeUnit,
|
|
81
|
+
},
|
|
82
|
+
undefined,
|
|
83
|
+
"Date",
|
|
84
|
+
undefined,
|
|
85
|
+
ChartType.LINE,
|
|
86
|
+
);
|
|
85
87
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
88
|
+
expect(result).toEqual({
|
|
89
|
+
field: "date",
|
|
90
|
+
type: "temporal",
|
|
91
|
+
bin: undefined,
|
|
92
|
+
title: "Date",
|
|
93
|
+
stack: undefined,
|
|
94
|
+
aggregate: undefined,
|
|
95
|
+
timeUnit,
|
|
96
|
+
});
|
|
97
|
+
},
|
|
98
|
+
);
|
|
96
99
|
|
|
97
100
|
it("should return correct encoding for categorical field", () => {
|
|
98
101
|
const result = getAxisEncoding(
|
|
@@ -147,17 +147,18 @@ export const TIME_UNIT_DESCRIPTIONS: Record<
|
|
|
147
147
|
[title: string, description: string]
|
|
148
148
|
> = {
|
|
149
149
|
year: ["Year", "2025"],
|
|
150
|
-
quarter: ["Quarter", "Q1
|
|
151
|
-
month: ["Month", "Jan
|
|
152
|
-
week: ["Week", "
|
|
153
|
-
day: ["Day
|
|
154
|
-
hours: ["Hour", "
|
|
155
|
-
minutes: ["Minute", "
|
|
156
|
-
seconds: ["Second", "
|
|
157
|
-
milliseconds: ["Millisecond", "
|
|
158
|
-
date: ["
|
|
159
|
-
dayofyear: ["Day of
|
|
150
|
+
quarter: ["Quarter of year", "Q1"],
|
|
151
|
+
month: ["Month of year", "Jan"],
|
|
152
|
+
week: ["Week of year", "Week 1"],
|
|
153
|
+
day: ["Day of week", "Sunday"],
|
|
154
|
+
hours: ["Hour of day", "12:00"],
|
|
155
|
+
minutes: ["Minute of hour", "34"],
|
|
156
|
+
seconds: ["Second of minute", "56"],
|
|
157
|
+
milliseconds: ["Millisecond of second", "789"],
|
|
158
|
+
date: ["Day of month", "1"],
|
|
159
|
+
dayofyear: ["Day of year", "Day 1"],
|
|
160
160
|
yearmonth: ["Year Month", "Jan 2025"],
|
|
161
161
|
yearmonthdate: ["Year Month Date", "Jan 01, 2025"],
|
|
162
|
+
yearmonthdatehours: ["Year Month Date Hours", "Jan 01, 2025 12:00"],
|
|
162
163
|
monthdate: ["Month Date", "Jan 01"],
|
|
163
164
|
};
|
|
@@ -117,6 +117,7 @@ export const DataTablePagination = <TData,>({
|
|
|
117
117
|
size="xs"
|
|
118
118
|
variant="text"
|
|
119
119
|
data-testid="first-page-button"
|
|
120
|
+
aria-label="First page"
|
|
120
121
|
className="hidden h-6 w-5 p-0 lg:flex"
|
|
121
122
|
onClick={() => handlePageChange(() => table.setPageIndex(0))}
|
|
122
123
|
onMouseDown={Events.preventFocus}
|
|
@@ -130,6 +131,7 @@ export const DataTablePagination = <TData,>({
|
|
|
130
131
|
size="xs"
|
|
131
132
|
variant="text"
|
|
132
133
|
data-testid="previous-page-button"
|
|
134
|
+
aria-label="Previous page"
|
|
133
135
|
className="h-6 w-5 p-0"
|
|
134
136
|
onClick={() => handlePageChange(() => table.previousPage())}
|
|
135
137
|
onMouseDown={Events.preventFocus}
|
|
@@ -156,6 +158,7 @@ export const DataTablePagination = <TData,>({
|
|
|
156
158
|
size="xs"
|
|
157
159
|
variant="text"
|
|
158
160
|
data-testid="next-page-button"
|
|
161
|
+
aria-label="Next page"
|
|
159
162
|
className="h-6 w-5 p-0"
|
|
160
163
|
onClick={() => handlePageChange(() => table.nextPage())}
|
|
161
164
|
onMouseDown={Events.preventFocus}
|
|
@@ -169,6 +172,7 @@ export const DataTablePagination = <TData,>({
|
|
|
169
172
|
size="xs"
|
|
170
173
|
variant="text"
|
|
171
174
|
data-testid="last-page-button"
|
|
175
|
+
aria-label="Last page"
|
|
172
176
|
className="hidden h-6 w-5 p-0 lg:flex"
|
|
173
177
|
onClick={() =>
|
|
174
178
|
handlePageChange(() =>
|
|
@@ -306,14 +310,24 @@ export const PageSelector = ({
|
|
|
306
310
|
: "opacity-50 cursor-default",
|
|
307
311
|
)}
|
|
308
312
|
data-testid="page-select"
|
|
313
|
+
aria-label={`Choose page, current page ${currentPage} of ${totalPages}`}
|
|
309
314
|
disabled={totalPages <= 1}
|
|
310
315
|
>
|
|
311
316
|
{currentPage}
|
|
312
317
|
<ChevronDown className="h-3 w-3 opacity-50 mb-px" />
|
|
313
318
|
</button>
|
|
314
319
|
</PopoverTrigger>
|
|
315
|
-
<PopoverContent
|
|
316
|
-
|
|
320
|
+
<PopoverContent
|
|
321
|
+
className="w-36 p-0"
|
|
322
|
+
align="center"
|
|
323
|
+
sideOffset={6}
|
|
324
|
+
aria-label="Choose page"
|
|
325
|
+
>
|
|
326
|
+
<Command
|
|
327
|
+
label="Search pages"
|
|
328
|
+
shouldFilter={false}
|
|
329
|
+
value={String(currentPage)}
|
|
330
|
+
>
|
|
317
331
|
<CommandInput
|
|
318
332
|
placeholder={`Page (1–${totalPages})`}
|
|
319
333
|
rootClassName="px-2 h-8"
|
|
@@ -154,63 +154,54 @@ describe("getTerminalCommand", () => {
|
|
|
154
154
|
).toBe(
|
|
155
155
|
String.raw`${cli} "$(MARIMO_PAIR_NEXT=1 uvx marimo@latest pair prompt \
|
|
156
156
|
--url http://localhost:8000 \
|
|
157
|
-
--file notebooks/example.py \
|
|
158
157
|
--session s_ab12cd \
|
|
159
158
|
--with-token)"`,
|
|
160
159
|
);
|
|
161
160
|
},
|
|
162
161
|
);
|
|
163
162
|
|
|
164
|
-
it("includes the url and
|
|
163
|
+
it("includes the url and agent flag for each agent", () => {
|
|
165
164
|
expect(getTerminalCommand("claude", CONNECTION, false)).toBe(
|
|
166
|
-
`claude "$(uv run marimo pair prompt --url http://localhost:8000 --
|
|
165
|
+
`claude "$(uv run marimo pair prompt --url http://localhost:8000 --claude)"`,
|
|
167
166
|
);
|
|
168
167
|
expect(getTerminalCommand("codex", CONNECTION, false)).toBe(
|
|
169
|
-
`codex "$(uv run marimo pair prompt --url http://localhost:8000 --
|
|
168
|
+
`codex "$(uv run marimo pair prompt --url http://localhost:8000 --codex)"`,
|
|
170
169
|
);
|
|
171
170
|
expect(getTerminalCommand("opencode", CONNECTION, false)).toBe(
|
|
172
|
-
`opencode --prompt "$(uv run marimo pair prompt --url http://localhost:8000 --
|
|
171
|
+
`opencode --prompt "$(uv run marimo pair prompt --url http://localhost:8000 --opencode)"`,
|
|
173
172
|
);
|
|
174
173
|
});
|
|
175
174
|
|
|
176
|
-
it("
|
|
177
|
-
const command = getTerminalCommand(
|
|
178
|
-
"claude",
|
|
179
|
-
CONNECTION_WITHOUT_FILE,
|
|
180
|
-
false,
|
|
181
|
-
);
|
|
175
|
+
it("never passes a file to marimo pair prompt", () => {
|
|
176
|
+
const command = getTerminalCommand("claude", CONNECTION, false);
|
|
182
177
|
expect(command).not.toContain("--file");
|
|
183
|
-
expect(command).not.toContain("
|
|
178
|
+
expect(command).not.toContain("notebooks/example.py");
|
|
184
179
|
});
|
|
185
180
|
|
|
186
|
-
it("
|
|
187
|
-
|
|
188
|
-
"
|
|
189
|
-
{ url: "http://host:8000?auth=a&b", file: "notebook.py" },
|
|
190
|
-
false,
|
|
181
|
+
it("omits the session outside the preview", () => {
|
|
182
|
+
expect(getTerminalCommand("claude", CONNECTION, false)).not.toContain(
|
|
183
|
+
"--session",
|
|
191
184
|
);
|
|
192
|
-
expect(command).toContain("--url 'http://host:8000?auth=a&b'");
|
|
193
185
|
});
|
|
194
186
|
|
|
195
|
-
it
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
])("shell-escapes file path %s", (file, expected) => {
|
|
187
|
+
it("omits the session when it is unknown", () => {
|
|
188
|
+
expect(
|
|
189
|
+
getTerminalCommand(
|
|
190
|
+
"claude",
|
|
191
|
+
CONNECTION_WITHOUT_FILE,
|
|
192
|
+
false,
|
|
193
|
+
PAIR_PREVIEW,
|
|
194
|
+
),
|
|
195
|
+
).not.toContain("--session");
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
it("shell-escapes a url containing metacharacters", () => {
|
|
208
199
|
const command = getTerminalCommand(
|
|
209
200
|
"claude",
|
|
210
|
-
{ url:
|
|
201
|
+
{ url: "http://host:8000?auth=a&b" },
|
|
211
202
|
false,
|
|
212
203
|
);
|
|
213
|
-
expect(command).toContain(
|
|
204
|
+
expect(command).toContain("--url 'http://host:8000?auth=a&b'");
|
|
214
205
|
});
|
|
215
206
|
|
|
216
207
|
it("adds --with-token before the agent flag when requested", () => {
|
|
@@ -230,23 +221,22 @@ describe("getRawPrompt", () => {
|
|
|
230
221
|
expect(
|
|
231
222
|
getRawPrompt(
|
|
232
223
|
{
|
|
233
|
-
url: "http://host/{
|
|
234
|
-
|
|
235
|
-
session: "{command}",
|
|
224
|
+
url: "http://host/{session}",
|
|
225
|
+
session: "{command}/it's",
|
|
236
226
|
},
|
|
237
|
-
"tok'en {
|
|
227
|
+
"tok'en {session} $&",
|
|
238
228
|
{
|
|
239
229
|
...PAIR_PREVIEW,
|
|
240
230
|
command: "custom marimo",
|
|
241
231
|
templates: {
|
|
242
232
|
...PAIR_PREVIEW.templates,
|
|
243
|
-
prompt: "{command}\n{url}\n{
|
|
233
|
+
prompt: "{command}\n{url}\n{session}{authentication}",
|
|
244
234
|
},
|
|
245
235
|
},
|
|
246
236
|
),
|
|
247
237
|
).toBe(
|
|
248
|
-
"custom marimo\nhttp://host/{
|
|
249
|
-
`\n\nFor authenticated Pair commands, set \`export MARIMO_TOKEN='tok'"'"'en {
|
|
238
|
+
"custom marimo\nhttp://host/{session}\nSession: {command}/it's\n" +
|
|
239
|
+
`\n\nFor authenticated Pair commands, set \`export MARIMO_TOKEN='tok'"'"'en {session} $&'\` in the shell that runs marimo.`,
|
|
250
240
|
);
|
|
251
241
|
});
|
|
252
242
|
|
|
@@ -256,10 +246,7 @@ describe("getRawPrompt", () => {
|
|
|
256
246
|
{ ...CONNECTION_WITHOUT_FILE, session: "s_ab12cd" },
|
|
257
247
|
"Session: s_ab12cd\n",
|
|
258
248
|
],
|
|
259
|
-
[
|
|
260
|
-
{ ...CONNECTION_WITHOUT_FILE, file: "notebook.py" },
|
|
261
|
-
"File: notebook.py\n",
|
|
262
|
-
],
|
|
249
|
+
[{ ...CONNECTION_WITHOUT_FILE, file: "notebook.py" }, ""],
|
|
263
250
|
])("omits absent preview fields for %j", (connection, fields) => {
|
|
264
251
|
expect(getRawPrompt(connection, null, PAIR_PREVIEW)).toBe(
|
|
265
252
|
"Pair with me on this running marimo notebook.\n\n" +
|
|
@@ -270,13 +257,12 @@ describe("getRawPrompt", () => {
|
|
|
270
257
|
);
|
|
271
258
|
});
|
|
272
259
|
|
|
273
|
-
it("renders the shared preview template with
|
|
260
|
+
it("renders the shared preview template with the session and no file", () => {
|
|
274
261
|
expect(
|
|
275
262
|
getRawPrompt({ ...CONNECTION, session: "s_ab12cd" }, null, PAIR_PREVIEW),
|
|
276
263
|
).toBe(
|
|
277
264
|
"Pair with me on this running marimo notebook.\n\n" +
|
|
278
265
|
"URL: http://localhost:8000\n" +
|
|
279
|
-
"File: notebooks/example.py\n" +
|
|
280
266
|
"Session: s_ab12cd\n\n" +
|
|
281
267
|
"Run `uvx marimo@latest pair --help` first.\n" +
|
|
282
268
|
"Use `uvx marimo@latest` for all marimo commands.\n\n" +
|
|
@@ -15,7 +15,10 @@ import { PAIR_PREVIEW } from "@/__tests__/fixtures/pair-preview";
|
|
|
15
15
|
import { Dialog } from "@/components/ui/dialog";
|
|
16
16
|
import { TooltipProvider } from "@/components/ui/tooltip";
|
|
17
17
|
import { pairPreviewAtom } from "@/core/config/pair";
|
|
18
|
-
import {
|
|
18
|
+
import {
|
|
19
|
+
type StableSessionId,
|
|
20
|
+
stableSessionIdAtom,
|
|
21
|
+
} from "@/core/kernel/session";
|
|
19
22
|
import { filenameAtom } from "@/core/saving/file-state";
|
|
20
23
|
import {
|
|
21
24
|
DEFAULT_RUNTIME_CONFIG,
|
|
@@ -39,10 +42,13 @@ function wrapper({ children }: { children: React.ReactNode }) {
|
|
|
39
42
|
);
|
|
40
43
|
}
|
|
41
44
|
|
|
45
|
+
const STABLE_ID = "sess-stable-1" as StableSessionId;
|
|
46
|
+
|
|
42
47
|
describe("PairWithAgentModal", () => {
|
|
43
48
|
beforeEach(() => {
|
|
44
49
|
vi.clearAllMocks();
|
|
45
50
|
store.set(pairPreviewAtom, PAIR_PREVIEW);
|
|
51
|
+
store.set(stableSessionIdAtom, STABLE_ID);
|
|
46
52
|
store.set(filenameAtom, "/project/my notebook.py");
|
|
47
53
|
store.set(runtimeConfigAtom, {
|
|
48
54
|
...DEFAULT_RUNTIME_CONFIG,
|
|
@@ -57,12 +63,13 @@ describe("PairWithAgentModal", () => {
|
|
|
57
63
|
|
|
58
64
|
afterEach(() => {
|
|
59
65
|
store.set(pairPreviewAtom, undefined);
|
|
66
|
+
store.set(stableSessionIdAtom, null);
|
|
60
67
|
store.set(filenameAtom, null);
|
|
61
68
|
vi.unstubAllGlobals();
|
|
62
69
|
});
|
|
63
70
|
|
|
64
71
|
it.each(["Claude", "Codex", "OpenCode", "Prompt"])(
|
|
65
|
-
"omits skill installation and
|
|
72
|
+
"omits skill installation and targets the stable session in %s preview",
|
|
66
73
|
async (tab) => {
|
|
67
74
|
await act(async () => {
|
|
68
75
|
render(<PairWithAgentModal onClose={vi.fn()} />, { wrapper });
|
|
@@ -74,59 +81,41 @@ describe("PairWithAgentModal", () => {
|
|
|
74
81
|
|
|
75
82
|
const panel = screen.getByRole("tabpanel");
|
|
76
83
|
expect(within(panel).queryAllByText(/skill/i)).toEqual([]);
|
|
77
|
-
expect(panel).toHaveTextContent(
|
|
78
|
-
expect(panel).toHaveTextContent(
|
|
79
|
-
|
|
80
|
-
);
|
|
81
|
-
expect(panel).not.toHaveTextContent("/project/my notebook.py");
|
|
84
|
+
expect(panel).toHaveTextContent(STABLE_ID);
|
|
85
|
+
expect(panel).not.toHaveTextContent("--file");
|
|
86
|
+
expect(panel).not.toHaveTextContent("File:");
|
|
87
|
+
expect(panel).not.toHaveTextContent("notebook.py");
|
|
82
88
|
expect(panel).toHaveTextContent(
|
|
83
89
|
tab === "Prompt" ? "1. Copy this prompt" : "1. Run in your terminal",
|
|
84
90
|
);
|
|
85
|
-
},
|
|
86
|
-
);
|
|
87
|
-
|
|
88
|
-
it.each(["Claude", "Codex", "OpenCode", "Prompt"])(
|
|
89
|
-
"includes the known notebook file in %s preview when the URL has no file",
|
|
90
|
-
async (tab) => {
|
|
91
|
-
window.history.replaceState({}, "", "/");
|
|
92
|
-
await act(async () => {
|
|
93
|
-
render(<PairWithAgentModal onClose={vi.fn()} />, { wrapper });
|
|
94
|
-
});
|
|
95
|
-
fireEvent.mouseDown(screen.getByRole("tab", { name: tab }), {
|
|
96
|
-
button: 0,
|
|
97
|
-
ctrlKey: false,
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
const panel = screen.getByRole("tabpanel");
|
|
101
|
-
const fileHint =
|
|
102
|
-
tab === "Prompt"
|
|
103
|
-
? "File: /project/my notebook.py"
|
|
104
|
-
: "--file '/project/my notebook.py'";
|
|
105
|
-
expect(panel).toHaveTextContent(fileHint);
|
|
106
91
|
fireEvent.click(
|
|
107
92
|
within(panel).getByRole("button", {
|
|
108
93
|
name: tab === "Prompt" ? "Copy prompt" : "Copy command",
|
|
109
94
|
}),
|
|
110
95
|
);
|
|
111
96
|
await waitFor(() => expect(copyToClipboard).toHaveBeenCalledOnce());
|
|
112
|
-
|
|
97
|
+
const copied = vi.mocked(copyToClipboard).mock.calls[0][0];
|
|
98
|
+
expect(copied).toContain(STABLE_ID);
|
|
99
|
+
expect(copied).not.toContain("notebook.py");
|
|
113
100
|
},
|
|
114
101
|
);
|
|
115
102
|
|
|
116
|
-
it.each([
|
|
117
|
-
"omits the
|
|
118
|
-
async (
|
|
119
|
-
|
|
120
|
-
store.set(filenameAtom, filename);
|
|
103
|
+
it.each(["Claude", "Prompt"])(
|
|
104
|
+
"omits the session in %s preview before kernel-ready arrives",
|
|
105
|
+
async (tab) => {
|
|
106
|
+
store.set(stableSessionIdAtom, null);
|
|
121
107
|
await act(async () => {
|
|
122
108
|
render(<PairWithAgentModal onClose={vi.fn()} />, { wrapper });
|
|
123
109
|
});
|
|
124
|
-
|
|
125
|
-
fireEvent.mouseDown(screen.getByRole("tab", { name: "Prompt" }), {
|
|
110
|
+
fireEvent.mouseDown(screen.getByRole("tab", { name: tab }), {
|
|
126
111
|
button: 0,
|
|
127
112
|
ctrlKey: false,
|
|
128
113
|
});
|
|
129
|
-
|
|
114
|
+
|
|
115
|
+
const panel = screen.getByRole("tabpanel");
|
|
116
|
+
expect(panel).not.toHaveTextContent("--session");
|
|
117
|
+
expect(panel).not.toHaveTextContent("Session:");
|
|
118
|
+
expect(panel).toHaveTextContent("http://localhost:8000");
|
|
130
119
|
},
|
|
131
120
|
);
|
|
132
121
|
|
|
@@ -147,7 +136,8 @@ describe("PairWithAgentModal", () => {
|
|
|
147
136
|
expect(
|
|
148
137
|
within(panel).getByText("npx skills add marimo-team/marimo-pair"),
|
|
149
138
|
).toBeVisible();
|
|
150
|
-
expect(panel).not.toHaveTextContent(
|
|
139
|
+
expect(panel).not.toHaveTextContent(STABLE_ID);
|
|
140
|
+
expect(panel).not.toHaveTextContent("--file");
|
|
151
141
|
expect(panel).not.toHaveTextContent("MARIMO_PAIR_NEXT");
|
|
152
142
|
expect(panel).not.toHaveTextContent("/project/my notebook.py");
|
|
153
143
|
expect(panel).toHaveTextContent(
|
|
@@ -205,8 +195,7 @@ describe("PairWithAgentModal", () => {
|
|
|
205
195
|
expect(copyToClipboard).toHaveBeenCalledWith(
|
|
206
196
|
String.raw`claude "$(MARIMO_PAIR_NEXT=1 uvx marimo@latest pair prompt \
|
|
207
197
|
--url http://localhost:8000/ \
|
|
208
|
-
--
|
|
209
|
-
--session ${getSessionId()} \
|
|
198
|
+
--session ${STABLE_ID} \
|
|
210
199
|
--with-token)"`,
|
|
211
200
|
),
|
|
212
201
|
);
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { describe, expect, it } from "vitest";
|
|
4
|
+
import { MockNotebook } from "@/__mocks__/notebook";
|
|
5
|
+
import type { OutputMessage } from "@/core/kernel/messages";
|
|
6
|
+
import { outputExpansionConfigs } from "../useSetOutputsExpanded";
|
|
7
|
+
|
|
8
|
+
const output: OutputMessage = {
|
|
9
|
+
channel: "output",
|
|
10
|
+
mimetype: "text/plain",
|
|
11
|
+
data: "hello",
|
|
12
|
+
timestamp: 0,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
describe("outputExpansionConfigs", () => {
|
|
16
|
+
const [withOutput, withoutOutput, expanded, expandedWithoutOutput] =
|
|
17
|
+
MockNotebook.cellIds();
|
|
18
|
+
const notebook = MockNotebook.notebookState({
|
|
19
|
+
cellData: {
|
|
20
|
+
[withOutput]: {},
|
|
21
|
+
[withoutOutput]: {},
|
|
22
|
+
[expanded]: { config: { expand_output: true } },
|
|
23
|
+
[expandedWithoutOutput]: { config: { expand_output: true } },
|
|
24
|
+
},
|
|
25
|
+
cellRuntime: {
|
|
26
|
+
[withOutput]: { output },
|
|
27
|
+
[expanded]: { output },
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("expands clamped cells with output and skips cells without output", () => {
|
|
32
|
+
expect(outputExpansionConfigs(notebook, true)).toEqual({
|
|
33
|
+
[withOutput]: { expand_output: true },
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it("clamps expanded cells with output and skips cells without output", () => {
|
|
38
|
+
expect(outputExpansionConfigs(notebook, false)).toEqual({
|
|
39
|
+
[expanded]: { expand_output: false },
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
});
|
|
@@ -38,8 +38,9 @@ function getFileFlag(file: string | undefined): string {
|
|
|
38
38
|
/** Identifies the specific running notebook to pair on. */
|
|
39
39
|
export interface ConnectionInfo {
|
|
40
40
|
url: string;
|
|
41
|
-
/** The server's file key
|
|
41
|
+
/** The server's file key, when known. */
|
|
42
42
|
file?: string;
|
|
43
|
+
/** The stable session ID, when known. */
|
|
43
44
|
session?: string;
|
|
44
45
|
}
|
|
45
46
|
|
|
@@ -49,7 +50,7 @@ export interface ConnectionInfo {
|
|
|
49
50
|
*/
|
|
50
51
|
export function getTerminalCommand(
|
|
51
52
|
agent: Exclude<AgentTab, "prompt">,
|
|
52
|
-
{ url,
|
|
53
|
+
{ url, session }: ConnectionInfo,
|
|
53
54
|
withToken: boolean,
|
|
54
55
|
preview?: PairPreviewConfig,
|
|
55
56
|
): string {
|
|
@@ -58,7 +59,6 @@ export function getTerminalCommand(
|
|
|
58
59
|
const base = [
|
|
59
60
|
`${prefix}${command} pair prompt`,
|
|
60
61
|
`--url ${shellQuote(url)}`,
|
|
61
|
-
file ? `--file ${shellQuote(file)}` : "",
|
|
62
62
|
preview && session ? `--session ${shellQuote(session)}` : "",
|
|
63
63
|
withToken ? "--with-token" : "",
|
|
64
64
|
preview ? "" : `--${agent}`,
|
|
@@ -92,7 +92,6 @@ export function getRawPrompt(
|
|
|
92
92
|
return formatPrompt(templates.prompt, {
|
|
93
93
|
command,
|
|
94
94
|
url,
|
|
95
|
-
file: file ? formatPrompt(templates.file, { file }) : "",
|
|
96
95
|
session: session ? formatPrompt(templates.session, { session }) : "",
|
|
97
96
|
authentication: token
|
|
98
97
|
? formatPrompt(templates.token, { token: shellQuote(token) })
|