@marimo-team/islands 0.25.2-dev0 → 0.25.2-dev100

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (366) hide show
  1. package/dist/{ConnectedDataExplorerComponent-C2d9ysUI.js → ConnectedDataExplorerComponent-BZmqc_F0.js} +11 -11
  2. package/dist/{ErrorBoundary-2usl042r.js → ErrorBoundary-Dcb6Zg4M.js} +8 -8
  3. package/dist/{abnfDiagram-VCTEODGH-AFhOQTt8.js → abnfDiagram-VCTEODGH-C_Lmaa2j.js} +3 -3
  4. package/dist/{any-language-editor-CycIVIeP.js → any-language-editor-BFzqhOBR.js} +5 -5
  5. package/dist/{apl-BYaaig9_.js → apl-GEW9-ZP1.js} +1 -1
  6. package/dist/{architectureDiagram-5GKGNRK7-BngksAAQ.js → architectureDiagram-5GKGNRK7-BKMataHB.js} +5 -5
  7. package/dist/{asciiarmor-GKQFJXQG.js → asciiarmor-BWNxzkG7.js} +1 -1
  8. package/dist/{asn1-BsSb7HP5.js → asn1-Bcn2QutK.js} +1 -1
  9. package/dist/assets/__vite-browser-external-BqAtzd2P.js +1 -0
  10. package/dist/assets/{worker-D7hWi02M.js → worker-Bf8dt6S-.js} +5 -5
  11. package/dist/{asterisk-B3I8SNb5.js → asterisk-lE36-hJK.js} +1 -1
  12. package/dist/{blockDiagram-I7D4REHJ-CvBmppdy.js → blockDiagram-I7D4REHJ-BeHOjyDk.js} +9 -9
  13. package/dist/{brainfuck-DXjk3bQe.js → brainfuck-BQCYDheZ.js} +1 -1
  14. package/dist/{button-DdXAm8iz.js → button-BtsM2UqM.js} +312 -283
  15. package/dist/{c4Diagram-7LVT6UL2-EceL4_jH.js → c4Diagram-7LVT6UL2-Bao10t_O.js} +7 -7
  16. package/dist/{capabilities-B3ce_GNu.js → capabilities-A5jrzjCJ.js} +1 -1
  17. package/dist/{cells-Cv93oav_.js → cells-DZi0ioak.js} +4330 -4313
  18. package/dist/{channel-z7HZXHwv.js → channel-BxCkvUgE.js} +1 -1
  19. package/dist/{chat-ui-fVyVOhYN.js → chat-ui-CwOWzoSO.js} +46 -46
  20. package/dist/{check-B7cIK6gb.js → check-CNP79M3A.js} +1 -1
  21. package/dist/{chunk-4HAMMTFA-BPTTOOC5.js → chunk-4HAMMTFA-CH7Gpamd.js} +5 -5
  22. package/dist/{chunk-75Z2AOVW-C4AOleKf.js → chunk-75Z2AOVW-AI7CvgKn.js} +1 -1
  23. package/dist/{chunk-DU6HZSFF-1TwWR6gh.js → chunk-DU6HZSFF-BSvuTkX4.js} +1 -1
  24. package/dist/{chunk-F27PBJKO-DMI1PBe4.js → chunk-F27PBJKO-CLshwT9T.js} +1 -1
  25. package/dist/{chunk-GMAD6QVW-vStrMz2P.js → chunk-GMAD6QVW-wnHcn-lH.js} +3 -3
  26. package/dist/{chunk-GVQU2GXP-2HwWgs4u.js → chunk-GVQU2GXP-7O2p8hut.js} +2 -2
  27. package/dist/{chunk-IMKFNOWR-UOVZuZVn.js → chunk-IMKFNOWR-Bu0Vh_Yi.js} +6 -6
  28. package/dist/{chunk-L3NEJ4N5-RhC7i0I2.js → chunk-L3NEJ4N5-B9_Alrxb.js} +5 -5
  29. package/dist/{chunk-OSK3NFVY-CZV09N-U.js → chunk-OSK3NFVY-PeQPH2fD.js} +6 -6
  30. package/dist/{chunk-P2QGCYS3-0TAWai9C.js → chunk-P2QGCYS3-D9twiFuU.js} +1 -1
  31. package/dist/{chunk-POPQ4Y6H-Cc3_56GX.js → chunk-POPQ4Y6H-BUiNs18s.js} +1 -1
  32. package/dist/{chunk-PWAF6VOD-lNxB9k8z.js → chunk-PWAF6VOD-D8S9NPCy.js} +1 -1
  33. package/dist/{chunk-SHT3W25Y-CrEPyWy1.js → chunk-SHT3W25Y-B2dyNZ31.js} +8 -8
  34. package/dist/{chunk-SVP7TREG-uIyyySp6.js → chunk-SVP7TREG-D7UPvB10.js} +2 -2
  35. package/dist/{chunk-TICWLB2K-DdXM3eg6.js → chunk-TICWLB2K-BNaGoadd.js} +6 -6
  36. package/dist/classDiagram-ZZMXUADV-Bbo2n384.js +30 -0
  37. package/dist/classDiagram-v2-VYDZK3BY-xR8cGP0r.js +30 -0
  38. package/dist/{clike-E2lFbGVj.js → clike-CxK9W55Z.js} +1 -1
  39. package/dist/{clojure-Dn_K4RlK.js → clojure-Dzcvwpxk.js} +1 -1
  40. package/dist/{cmake-DpN2Top5.js → cmake-DYr-71zp.js} +1 -1
  41. package/dist/{cobol-Chf22-GM.js → cobol-DC3g37Kq.js} +1 -1
  42. package/dist/{code-visibility-rUDTB2Ce.js → code-visibility-DTB0i3UU.js} +6 -6
  43. package/dist/{coffeescript-BVe1OiD9.js → coffeescript-C-eFwH5N.js} +1 -1
  44. package/dist/{common-BVErJKjc.js → common-CaVEr6tY.js} +11801 -11503
  45. package/dist/{commonlisp-DxoBG7fU.js → commonlisp-CyaNXrJR.js} +1 -1
  46. package/dist/{copy-icon-CLdENY__.js → copy-icon-BY7jgcaV.js} +3 -3
  47. package/dist/{crystal-DCM3yc4r.js → crystal-ih5ax5tQ.js} +1 -1
  48. package/dist/{css-DkZ9mMyI.js → css-CN_wP7_R.js} +1 -1
  49. package/dist/{cynefinDiagram-5FMLGOSQ-zknaAsGy.js → cynefinDiagram-5FMLGOSQ-CCDn4Z9e.js} +3 -3
  50. package/dist/{cypher-Drw_8U5I.js → cypher-CqGRcmZo.js} +1 -1
  51. package/dist/{d-CsVGcKMF.js → d-Cj0sOW2z.js} +1 -1
  52. package/dist/{dagre-GXQ25YYZ-BhMOoMGJ.js → dagre-GXQ25YYZ-BJiUO_SV.js} +10 -10
  53. package/dist/{data-grid-overlay-editor-7ANmo9c-.js → data-grid-overlay-editor-BzTuqI2T.js} +1 -1
  54. package/dist/{diagram-S7CK7UJ4-V5-Z-EDY.js → diagram-S7CK7UJ4-BZfxFNRR.js} +4 -4
  55. package/dist/{diagram-UQ7AKVKN-qw8AjDal.js → diagram-UQ7AKVKN-1xcsiIMg.js} +3 -3
  56. package/dist/{diagram-VSXAHHWV-CR7BJygZ.js → diagram-VSXAHHWV-DPAWJ9Nw.js} +2 -2
  57. package/dist/{diagram-VX7I27RA-DfuqFb1E.js → diagram-VX7I27RA-DmRsnHYY.js} +5 -5
  58. package/dist/{diagram-Z3DM3KII-DpWwlYZB.js → diagram-Z3DM3KII--b49ryKx.js} +3 -3
  59. package/dist/{dialog-CgNq6y9-.js → dialog-CmExhUDI.js} +26 -26
  60. package/dist/{diff-CBikYCUF.js → diff-B_hUkiat.js} +1 -1
  61. package/dist/{dist-Df0wKI0F.js → dist-BK4Oj99o.js} +1 -1
  62. package/dist/{dist-BVGtK7Ht.js → dist-BLfKmR-l.js} +1 -1
  63. package/dist/{dist-B8D7McG3.js → dist-BMQf5zIS.js} +46 -46
  64. package/dist/{dist-C2KzV-vf.js → dist-BorMD-uX.js} +2 -2
  65. package/dist/{dist-Cs2FijYk.js → dist-BuaRHxOc.js} +2 -2
  66. package/dist/{dist-DPcEtqmG.js → dist-Bvs24R_E.js} +47 -47
  67. package/dist/{dist-lA1Cttkb.js → dist-C8fAKSH1.js} +41 -41
  68. package/dist/{dist-DszxuxS1.js → dist-CLdpGQVr.js} +2 -2
  69. package/dist/{dist-CO1AwwG_.js → dist-CN8zI-XC.js} +209 -209
  70. package/dist/{dist-D1PpnuZB.js → dist-CN_BeG2I.js} +1 -1
  71. package/dist/{dist-CPGxfVGX.js → dist-CSJ0MDRw.js} +1 -1
  72. package/dist/{dist-Cm3iAFMD.js → dist-CSbh1PNP.js} +3 -3
  73. package/dist/{dist-9x1ZRe-e.js → dist-Cg7gzw-a.js} +2 -2
  74. package/dist/{dist-B1vYLK28.js → dist-CkTTIdBe.js} +345 -345
  75. package/dist/{dist-BRxfaJgs.js → dist-CrSP_H1M.js} +296 -296
  76. package/dist/{dist-C2wDlYdD.js → dist-D-wwqlzJ.js} +2 -2
  77. package/dist/{dist-BtKIs9N-.js → dist-D6d86eNJ.js} +1 -1
  78. package/dist/{dist-DHOTQar0.js → dist-DBtSl3sf.js} +1 -1
  79. package/dist/{dist-KzZ7WELx.js → dist-DiDibOYr.js} +120 -120
  80. package/dist/{dist-Kxgjxakw.js → dist-DoE4XJBC.js} +1277 -1222
  81. package/dist/{dist-BHCHt1NI.js → dist-F8Ep36rk.js} +1 -1
  82. package/dist/{dist-C8xMLVYi.js → dist-OR1OnN-y.js} +44 -44
  83. package/dist/{dist-1HDa70oE.js → dist-PXYI_yuP.js} +3 -3
  84. package/dist/{dist-CMh_W4y4.js → dist-diIx5qJW.js} +2 -2
  85. package/dist/{dockerfile-DJnSntVB.js → dockerfile-D0VKN500.js} +2 -2
  86. package/dist/dropdown-menu-Cz4TdOJh.js +4678 -0
  87. package/dist/{dtd-BHa4v0Bn.js → dtd-B8FGSWWe.js} +1 -1
  88. package/dist/{dylan-BypL2Zz8.js → dylan-DbIBYIrw.js} +1 -1
  89. package/dist/{ebnf-5guncNu-.js → ebnf-D-YbYLdk.js} +1 -1
  90. package/dist/{ebnfDiagram-PWID7BFC-C20OnNMZ.js → ebnfDiagram-PWID7BFC-rSwVyh4y.js} +3 -3
  91. package/dist/{ecl-iRcVIKYZ.js → ecl-DBmkdWAd.js} +1 -1
  92. package/dist/{eiffel-BEqF9aU4.js → eiffel-CcWSDDzK.js} +1 -1
  93. package/dist/{elm-DYcfNE9c.js → elm-MC-b8a6C.js} +1 -1
  94. package/dist/{erDiagram-RLTQ6QDP-DBXLWO9v.js → erDiagram-RLTQ6QDP-Bfd3iAoC.js} +12 -12
  95. package/dist/{erlang-BtAuIoF0.js → erlang-AdO1-xtV.js} +1 -1
  96. package/dist/error-banner-D30nA9nE.js +362 -0
  97. package/dist/{error-entries-DLl0XqoW.js → error-entries-BovkFYNy.js} +2 -2
  98. package/dist/{esm-BElI3qKH.js → esm-D2gTsXEV.js} +579 -579
  99. package/dist/{esm-h8f7-1CJ.js → esm-DAVrGVKP.js} +378 -372
  100. package/dist/{factor-3nzOwLuN.js → factor-Ys-13HOP.js} +2 -2
  101. package/dist/{fcl-C90TGnJJ.js → fcl-DnwditDr.js} +1 -1
  102. package/dist/{feedback-button-K1inEVfd.js → feedback-button-CHGz2EXX.js} +10 -10
  103. package/dist/flowDiagram-HODETNUW-D7IBKS12.js +16 -0
  104. package/dist/{formats-Cl_67ghI.js → formats-DhhbdyAH.js} +3 -3
  105. package/dist/{forth-DEaRrLUi.js → forth-DiMuIXFe.js} +1 -1
  106. package/dist/{fortran-Bv6JRUjY.js → fortran-hkrF2eM4.js} +1 -1
  107. package/dist/{ganttDiagram-EL5Y4UJY-cRRaDt88.js → ganttDiagram-EL5Y4UJY-B4m_YsKa.js} +2 -2
  108. package/dist/{gas-JNerWj3-.js → gas-DlhqN9k8.js} +1 -1
  109. package/dist/{gherkin-CSrl-H70.js → gherkin-0SlhEZ3t.js} +1 -1
  110. package/dist/{gitGraphDiagram-WWUBYQGX-Pox5k9-Y.js → gitGraphDiagram-WWUBYQGX-QRBbvWXh.js} +2 -2
  111. package/dist/{glide-data-editor-D2fDO5aG.js → glide-data-editor-WxMsJlmb.js} +11 -11
  112. package/dist/{glide-utils-B3rUT5PI.js → glide-utils-BVJ4fkxX.js} +3 -3
  113. package/dist/{globals-NylFP0CX.js → globals-BROokniw.js} +3 -3
  114. package/dist/{groovy-X7euO_vE.js → groovy-YhcTMyvX.js} +1 -1
  115. package/dist/{haskell-C48Z70Az.js → haskell-CodLxrtT.js} +1 -1
  116. package/dist/{haxe-CAUWMmwR.js → haxe-CiRWNFkH.js} +1 -1
  117. package/dist/{html-to-image-CmkwfNkf.js → html-to-image-Cn1_16-x.js} +543 -565
  118. package/dist/{http-BrSBnhDH.js → http-Bh6HhdNR.js} +1 -1
  119. package/dist/{idl-BXuPleZv.js → idl-DZgBq75I.js} +1 -1
  120. package/dist/{infoDiagram-27XIBGKW-ntpxMfrq.js → infoDiagram-27XIBGKW-DVQFYvhg.js} +2 -2
  121. package/dist/{ishikawaDiagram-5VMMS53U-BllIlHE5.js → ishikawaDiagram-5VMMS53U-viPND-nm.js} +3 -3
  122. package/dist/{javascript-B4EPWJf_.js → javascript-BfNytHiM.js} +1 -1
  123. package/dist/{journeyDiagram-3NMN7TZE-EPJDPlt0.js → journeyDiagram-3NMN7TZE-BeeJdJo3.js} +2 -2
  124. package/dist/{julia-ke9Kh8b7.js → julia--tLIAG7q.js} +1 -1
  125. package/dist/{kanban-definition-UXKFOSKX-GYtNMjtS.js → kanban-definition-UXKFOSKX-Dcl_ECO9.js} +9 -9
  126. package/dist/{label-BslhXqL6.js → label-DQO1jFjf.js} +96 -93
  127. package/dist/{livescript-Ce4uqGAC.js → livescript-CVPfYnY_.js} +1 -1
  128. package/dist/{loader-DEZSzvma.js → loader-Cm-ATtou.js} +1 -1
  129. package/dist/{lua-D6fti_Jk.js → lua-4Fa-T-qq.js} +1 -1
  130. package/dist/main.js +6966 -6827
  131. package/dist/{mathematica-DcEpZ3Vj.js → mathematica-CtYAy6GG.js} +1 -1
  132. package/dist/{mbox-DFBbOu0X.js → mbox-D0w9Ah1C.js} +1 -1
  133. package/dist/{mermaid-Dnzoxjt1.js → mermaid-BfhcnSj-.js} +54 -54
  134. package/dist/{mindmap-definition-YA3MSWOX-Cth76xgH.js → mindmap-definition-YA3MSWOX-BdxxhF-5.js} +11 -11
  135. package/dist/{mirc-CqeibO3N.js → mirc-De9aSAZM.js} +1 -1
  136. package/dist/{mllike-D54QZYTP.js → mllike-BbugeaY_.js} +1 -1
  137. package/dist/{modelica-DuML2-8V.js → modelica-BjJwWw1F.js} +1 -1
  138. package/dist/{mscgen-CJmKwp3b.js → mscgen-DwiRH5ma.js} +1 -1
  139. package/dist/{mumps-DaVgFtkd.js → mumps--plbDM9o.js} +1 -1
  140. package/dist/{nginx-BXN1rqI0.js → nginx-C4Df7REc.js} +1 -1
  141. package/dist/{nsis-CMfRqf0V.js → nsis-fiiOqLc3.js} +7 -7
  142. package/dist/{ntriples-BiOGlMDR.js → ntriples-jV77I4k8.js} +1 -1
  143. package/dist/{number-overlay-editor-B4XyCoMu.js → number-overlay-editor-DCj0MZgn.js} +1 -1
  144. package/dist/{octave-CgVnzxKk.js → octave-Cztd01tF.js} +1 -1
  145. package/dist/{oz-B2mky97X.js → oz-Bl8o3BDl.js} +1 -1
  146. package/dist/{pascal-BoZhBf6s.js → pascal-BO5JqysR.js} +1 -1
  147. package/dist/{pegDiagram-XKGWAZYB-Cu4uOXii.js → pegDiagram-XKGWAZYB-Du5p2s0w.js} +3 -3
  148. package/dist/{perl-DjzMqXtt.js → perl-Drlh9s6m.js} +1 -1
  149. package/dist/{pieDiagram-E7YTZNPT-Bh3eDa9s.js → pieDiagram-E7YTZNPT-DJg-SOIq.js} +3 -3
  150. package/dist/{pig-B2mB-01d.js → pig-BWGR8wZw.js} +1 -1
  151. package/dist/{powershell-D0zT88Aj.js → powershell-DT99xlz_.js} +1 -1
  152. package/dist/{process-output-CYN5E-iO.js → process-output-CUG57KRp.js} +4 -4
  153. package/dist/{properties-3_5qCgOj.js → properties-Q-rkxld0.js} +1 -1
  154. package/dist/{protobuf-Dgoxfi1H.js → protobuf-DKyWZbs7.js} +1 -1
  155. package/dist/{pug-CNRdd8oG.js → pug-42ZJUbEC.js} +2 -2
  156. package/dist/{puppet-DzILxZfz.js → puppet-B4UozHhh.js} +1 -1
  157. package/dist/purify.es-DMv5zIkJ.js +866 -0
  158. package/dist/{python-AfVdMn_l.js → python-DREjAV__.js} +1 -1
  159. package/dist/{q-C6p-CGWh.js → q-Bi63IpBO.js} +1 -1
  160. package/dist/{quadrantDiagram-AXDQQJYC--kqzFC3w.js → quadrantDiagram-AXDQQJYC-keLfFx9f.js} +1 -1
  161. package/dist/{r-CzKF1D2X.js → r-DSwXWKMR.js} +1 -1
  162. package/dist/{railroadDiagram-O6MQD6OU-DG-M6Rnc.js → railroadDiagram-O6MQD6OU-C0ojm-6_.js} +3 -3
  163. package/dist/{requirementDiagram-BXWQKSXE-DCwsThh0.js → requirementDiagram-BXWQKSXE-CNwNBmI3.js} +11 -11
  164. package/dist/{reveal-component-Dtm5GH3p.js → reveal-component-CSY54dq4.js} +10 -10
  165. package/dist/{rpm-Bx7FkjTO.js → rpm-DPb1DeKM.js} +1 -1
  166. package/dist/{ruby-BMzgq2bf.js → ruby-U7fZA4DP.js} +2 -2
  167. package/dist/{sankeyDiagram-P5KCCOFB-BdzhT0BM.js → sankeyDiagram-P5KCCOFB-Bh4EsJox.js} +1 -1
  168. package/dist/{sas-ClGVnK3F.js → sas-CLk1JpTn.js} +1 -1
  169. package/dist/{scheme-C0MXqXep.js → scheme-CT-2k2Tl.js} +1 -1
  170. package/dist/select-Bs-nmvm6.js +1344 -0
  171. package/dist/{sequenceDiagram-WJ2MYXX4-CbXB1_PU.js → sequenceDiagram-WJ2MYXX4-DQaW5qBG.js} +4 -4
  172. package/dist/{shell-CiQZv6oG.js → shell-BLO7fcsk.js} +1 -1
  173. package/dist/{sieve-BiIMePvV.js → sieve-nG3C7WNH.js} +1 -1
  174. package/dist/{simple-mode-8ETW2RS6.js → simple-mode-C683Q7or.js} +1 -1
  175. package/dist/{smalltalk-9-llftyG.js → smalltalk-BROcZybA.js} +1 -1
  176. package/dist/{solr-CxCKEuwq.js → solr-mVltHNc5.js} +1 -1
  177. package/dist/{sparql-BRmy7pzx.js → sparql-Cv1Ksr4v.js} +1 -1
  178. package/dist/{spec-DQBRQSba.js → spec-DVsoMvYT.js} +116 -135
  179. package/dist/{spreadsheet-UCNUIGsn.js → spreadsheet-BwTnp5K_.js} +1 -1
  180. package/dist/{sql-D0hSGZ-H.js → sql-CjLt0122.js} +1 -1
  181. package/dist/{stateDiagram-D77RDMKH-A-Zf3Sb2.js → stateDiagram-D77RDMKH-BDa515QC.js} +13 -13
  182. package/dist/stateDiagram-v2-MP3YSRHH-ChNddepZ.js +30 -0
  183. package/dist/{stex-UeT_Aofp.js → stex-Btf3omL8.js} +1 -1
  184. package/dist/style.css +1 -1
  185. package/dist/{stylus-Fi4waA2H.js → stylus-Dt4VvLXL.js} +1 -1
  186. package/dist/{swift-NqPyaBye.js → swift-DHsn_CVI.js} +1 -1
  187. package/dist/{swimlanes-42K2YHIH-B_pMf0J4.js → swimlanes-42K2YHIH-M4IdGi8J.js} +10 -10
  188. package/dist/swimlanesDiagram-VR7AAH4N-FUSwmzEp.js +30 -0
  189. package/dist/{swiper-component-IOUowglM.js → swiper-component-CpN-hewZ.js} +2 -2
  190. package/dist/{tcl-B4f0xfmM.js → tcl-CV0OLBOl.js} +1 -1
  191. package/dist/{textile-CnNbnPTe.js → textile-D320oKVM.js} +1 -1
  192. package/dist/{tiddlywiki-CSGSOg38.js → tiddlywiki-BVVNvfy4.js} +1 -1
  193. package/dist/{tiki-9F02WBA6.js → tiki-BF2aDPlB.js} +1 -1
  194. package/dist/{timeline-definition-24CTP7MA-DTXFjTTM.js → timeline-definition-24CTP7MA-DH-kvakg.js} +3 -3
  195. package/dist/{toDate-C67bxMWn.js → toDate-vEi5kTfY.js} +4 -5
  196. package/dist/{toast-DvY70eFX.js → toast-DfEpJedt.js} +157 -161
  197. package/dist/{toml-AesZ6RBt.js → toml-CaUN7UHo.js} +1 -1
  198. package/dist/{tooltip-qB8NlSqV.js → tooltip-CuNWg2ay.js} +543 -579
  199. package/dist/{troff-DlfvveK1.js → troff-DQUFcClZ.js} +1 -1
  200. package/dist/{ttcn--YVSkGs_.js → ttcn-CQL1duJS.js} +1 -1
  201. package/dist/{ttcn-cfg-Bb1Knl_J.js → ttcn-cfg-BMmEFJPu.js} +1 -1
  202. package/dist/{turtle-DC24v1bz.js → turtle-C3esgsRr.js} +1 -1
  203. package/dist/{use-restore-focus-D5D9xEjZ.js → use-restore-focus-kmgwrL8q.js} +1833 -1625
  204. package/dist/{useAsyncData-BD6AStMt.js → useAsyncData-rkAlR_vh.js} +1 -1
  205. package/dist/{useDateFormatter-BXQGu86d.js → useDateFormatter-C-tz65rD.js} +52 -31
  206. package/dist/{useDeepCompareMemoize-D_HNdyvI.js → useDeepCompareMemoize-BlHFBj5_.js} +1 -1
  207. package/dist/{useIframeCapabilities-CVtNkI3Y.js → useIframeCapabilities-C1Bt04Iz.js} +1 -1
  208. package/dist/{useLifecycle-DPgiiwwU.js → useLifecycle-B68iY077.js} +3 -3
  209. package/dist/{useTheme-DzXmYZ5V.js → useTheme-BwSgeAFb.js} +2 -2
  210. package/dist/{vb-Dpc8vhvF.js → vb-RK1eDXRl.js} +1 -1
  211. package/dist/{vbscript-B-Y1XnZe.js → vbscript-BCOeM0de.js} +1 -1
  212. package/dist/{vega-component-tFOzgarw.js → vega-component-C-bPttRN.js} +9 -9
  213. package/dist/{velocity-DHMu9kc-.js → velocity-CZKOFbOI.js} +1 -1
  214. package/dist/{vennDiagram-4TSXK5OY-BPHjZo0R.js → vennDiagram-4TSXK5OY-d5g7XeiI.js} +3 -3
  215. package/dist/{verilog-DhiEaoUl.js → verilog-DqQTzVn8.js} +1 -1
  216. package/dist/{vhdl-D4X23YKO.js → vhdl-vQr2bfmi.js} +1 -1
  217. package/dist/{wardleyDiagram-VM6X3IG4-6fTLYBuD.js → wardleyDiagram-VM6X3IG4-BfX3bSzR.js} +3 -3
  218. package/dist/{webidl-SyzNxWpJ.js → webidl-DzX7N40e.js} +1 -1
  219. package/dist/{xquery-BC2R4Hk6.js → xquery-Cw_Q_hGR.js} +1 -1
  220. package/dist/{xychartDiagram-S5SC5T6Z-BYjwjrzE.js → xychartDiagram-S5SC5T6Z-C1QsLZg7.js} +5 -5
  221. package/dist/{yacas-DLNXPMmH.js → yacas-DiC4jJBE.js} +1 -1
  222. package/dist/{z80-CDXWHOO6.js → z80-CUOQDEJO.js} +1 -1
  223. package/package.json +24 -23
  224. package/src/__tests__/mount.test.ts +6 -6
  225. package/src/components/chat/__tests__/chat-history-popover.test.tsx +157 -0
  226. package/src/components/chat/chat-history-popover.tsx +98 -17
  227. package/src/components/chat/chat-panel.tsx +29 -0
  228. package/src/components/chat/tool-call/__tests__/tool-result.test.tsx +56 -0
  229. package/src/components/chat/tool-call/tool-result.tsx +3 -3
  230. package/src/components/data-table/TableTopBar.tsx +4 -0
  231. package/src/components/data-table/__tests__/export-actions.test.tsx +1111 -14
  232. package/src/components/data-table/__tests__/pagination.test.tsx +85 -1
  233. package/src/components/data-table/__tests__/schemas.test.ts +57 -0
  234. package/src/components/data-table/charts/__tests__/schemas.test.ts +25 -0
  235. package/src/components/data-table/charts/__tests__/slider-field.test.tsx +54 -0
  236. package/src/components/data-table/charts/__tests__/spec.test.ts +26 -23
  237. package/src/components/data-table/charts/components/form-fields.tsx +3 -1
  238. package/src/components/data-table/charts/constants.ts +11 -10
  239. package/src/components/data-table/charts/types.ts +1 -0
  240. package/src/components/data-table/data-table.tsx +3 -0
  241. package/src/components/data-table/export-actions.tsx +365 -81
  242. package/src/components/data-table/pagination.tsx +16 -2
  243. package/src/components/data-table/range-focus/__tests__/atoms.test.ts +11 -11
  244. package/src/components/data-table/schemas.ts +90 -14
  245. package/src/components/editor/actions/__tests__/pair-with-agent-commands.test.ts +32 -46
  246. package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +29 -40
  247. package/src/components/editor/actions/__tests__/useSetOutputsExpanded.test.ts +42 -0
  248. package/src/components/editor/actions/pair-with-agent-commands.ts +3 -4
  249. package/src/components/editor/actions/pair-with-agent-modal.tsx +4 -7
  250. package/src/components/editor/actions/useNotebookActions.tsx +20 -0
  251. package/src/components/editor/actions/useRestartKernel.tsx +2 -2
  252. package/src/components/editor/actions/useSetOutputsExpanded.ts +67 -0
  253. package/src/components/editor/alerts/__tests__/connection-notice.test.tsx +224 -17
  254. package/src/components/editor/alerts/connection-details.tsx +61 -0
  255. package/src/components/editor/alerts/connection-notice.tsx +46 -53
  256. package/src/components/editor/alerts/startup-progress.tsx +73 -129
  257. package/src/components/editor/app-container.tsx +2 -2
  258. package/src/components/editor/boundary/__tests__/ErrorBoundary.test.tsx +2 -2
  259. package/src/components/editor/cell/CreateCellButton.tsx +2 -2
  260. package/src/components/editor/cell/DeleteButton.tsx +2 -2
  261. package/src/components/editor/cell/RunButton.tsx +3 -3
  262. package/src/components/editor/cell/StopButton.tsx +2 -2
  263. package/src/components/editor/chrome/components/__tests__/feedback-button.test.tsx +4 -4
  264. package/src/components/editor/chrome/components/feedback-button.tsx +3 -3
  265. package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +8 -8
  266. package/src/components/editor/chrome/panels/__tests__/{sandbox-details.test.tsx → runtime-details.test.tsx} +94 -22
  267. package/src/components/editor/chrome/panels/__tests__/sandbox-recovery.test.tsx +4 -4
  268. package/src/components/editor/chrome/panels/packages-panel.tsx +8 -29
  269. package/src/components/editor/chrome/panels/{sandbox-details-state.ts → runtime-details-state.ts} +1 -1
  270. package/src/components/editor/chrome/panels/{sandbox-panel.tsx → runtime-panel.tsx} +38 -66
  271. package/src/components/editor/chrome/panels/runtime-status-toggle.tsx +56 -0
  272. package/src/components/editor/chrome/panels/sandbox-controller.tsx +2 -2
  273. package/src/components/editor/chrome/wrapper/app-chrome.tsx +3 -3
  274. package/src/components/editor/chrome/wrapper/footer-items/machine-stats.tsx +2 -2
  275. package/src/components/editor/controls/Controls.tsx +3 -3
  276. package/src/components/editor/controls/__tests__/notebook-menu-dropdown.test.tsx +2 -2
  277. package/src/components/editor/header/__tests__/status.test.tsx +4 -4
  278. package/src/components/editor/header/app-header.tsx +2 -2
  279. package/src/components/editor/header/status.tsx +3 -3
  280. package/src/components/editor/navigation/__tests__/navigation.test.ts +8 -8
  281. package/src/components/tracing/tracing.test.tsx +30 -30
  282. package/src/components/ui/__tests__/slider.test.tsx +37 -0
  283. package/src/components/ui/progress-stages.tsx +114 -0
  284. package/src/components/ui/slider.tsx +2 -0
  285. package/src/core/ai/__tests__/state.test.ts +120 -0
  286. package/src/core/ai/state.ts +36 -10
  287. package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +106 -5
  288. package/src/core/codemirror/lsp/notebook-lsp.ts +16 -2
  289. package/src/core/codemirror/readonly/__tests__/extension.test.ts +6 -6
  290. package/src/core/codemirror/readonly/extension.ts +2 -2
  291. package/src/core/config/pair.ts +0 -1
  292. package/src/core/datasets/__tests__/data-source-discovery.test.ts +2 -2
  293. package/src/core/edit-app.tsx +21 -1
  294. package/src/core/export/hooks.ts +2 -2
  295. package/src/core/hotkeys/hotkeys.ts +12 -0
  296. package/src/core/islands/bootstrap.ts +1 -0
  297. package/src/core/kernel/session.ts +9 -0
  298. package/src/core/network/__tests__/connection.test.ts +3 -3
  299. package/src/core/network/connection-notice.ts +5 -5
  300. package/src/core/network/connection.ts +9 -9
  301. package/src/core/network/requests-lazy.ts +2 -2
  302. package/src/core/packages/__tests__/useSandboxController.test.tsx +2 -2
  303. package/src/core/packages/useSandboxController.ts +6 -6
  304. package/src/core/runtime/__tests__/adapter.test.ts +6 -6
  305. package/src/core/runtime/adapter.ts +7 -7
  306. package/src/core/runtime/config.ts +2 -2
  307. package/src/core/saving/filename.ts +2 -2
  308. package/src/core/saving/save-component.tsx +5 -5
  309. package/src/core/saving/useAutoSave.ts +2 -2
  310. package/src/core/wasm/__tests__/bootstrap.test.ts +33 -1
  311. package/src/core/wasm/worker/bootstrap.ts +22 -3
  312. package/src/core/websocket/__tests__/useMarimoKernelConnection.hook.test.tsx +30 -25
  313. package/src/core/websocket/__tests__/useMarimoKernelConnection.test.ts +5 -5
  314. package/src/core/websocket/connection-utils.ts +21 -21
  315. package/src/core/websocket/types.ts +8 -9
  316. package/src/core/websocket/useMarimoKernelConnection.tsx +33 -22
  317. package/src/css/katex-css.test.ts +166 -0
  318. package/src/css/katex.min.css +169 -168
  319. package/src/mount.tsx +2 -2
  320. package/src/plugins/core/__test__/registerReactComponent.test.ts +55 -0
  321. package/src/plugins/core/registerReactComponent.tsx +3 -1
  322. package/src/plugins/impl/CheckboxPlugin.tsx +1 -1
  323. package/src/plugins/impl/DataTablePlugin.tsx +23 -2
  324. package/src/plugins/impl/DatePickerPlugin.tsx +5 -3
  325. package/src/plugins/impl/DateRangePlugin.tsx +5 -3
  326. package/src/plugins/impl/DateTimePickerPlugin.tsx +5 -3
  327. package/src/plugins/impl/DropdownPlugin.tsx +1 -1
  328. package/src/plugins/impl/FileBrowserPlugin.tsx +45 -15
  329. package/src/plugins/impl/MultiselectPlugin.tsx +1 -1
  330. package/src/plugins/impl/NumberPlugin.tsx +1 -1
  331. package/src/plugins/impl/RadioPlugin.tsx +5 -1
  332. package/src/plugins/impl/RangeSliderPlugin.tsx +1 -1
  333. package/src/plugins/impl/SearchableSelect.tsx +1 -1
  334. package/src/plugins/impl/SliderPlugin.tsx +5 -1
  335. package/src/plugins/impl/SwitchPlugin.tsx +6 -1
  336. package/src/plugins/impl/TextAreaPlugin.tsx +23 -4
  337. package/src/plugins/impl/TextInputPlugin.tsx +10 -2
  338. package/src/plugins/impl/__test__/slider-labels.test.tsx +136 -0
  339. package/src/plugins/impl/__test__/text-labels.test.tsx +141 -0
  340. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +65 -8
  341. package/src/plugins/impl/__tests__/FileBrowserPlugin.test.tsx +85 -2
  342. package/src/plugins/impl/__tests__/widget-labels.test.tsx +122 -0
  343. package/src/plugins/impl/chat/ChatPlugin.tsx +1 -1
  344. package/src/plugins/impl/common/labeled.tsx +9 -3
  345. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +15 -3
  346. package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +0 -22
  347. package/src/stories/cell.stories.tsx +2 -2
  348. package/src/stories/dataframe.stories.tsx +7 -0
  349. package/src/stories/layout/vertical/one-column.stories.tsx +5 -5
  350. package/src/stories/progress-stages.stories.tsx +62 -0
  351. package/src/stories/runtime-existing.stories.tsx +44 -0
  352. package/src/stories/runtime-maintenance.stories.tsx +40 -0
  353. package/src/stories/runtime-pixi.stories.tsx +28 -0
  354. package/src/stories/{sandbox.stories.tsx → runtime-story.tsx} +191 -152
  355. package/src/stories/runtime-uv.stories.tsx +56 -0
  356. package/dist/assets/__vite-browser-external-C9iR87Zl.js +0 -1
  357. package/dist/classDiagram-ZZMXUADV-BiATbBE4.js +0 -30
  358. package/dist/classDiagram-v2-VYDZK3BY-JnH97GYw.js +0 -30
  359. package/dist/dropdown-menu-CZy06LAq.js +0 -4502
  360. package/dist/error-banner-B94dcDmP.js +0 -391
  361. package/dist/flowDiagram-HODETNUW-DL52nMkt.js +0 -16
  362. package/dist/purify.es-DgKyQviY.js +0 -805
  363. package/dist/select-C6plhmZr.js +0 -970
  364. package/dist/stateDiagram-v2-MP3YSRHH-D9YMnUGx.js +0 -30
  365. package/dist/swimlanesDiagram-VR7AAH4N-Ctgy-yGP.js +0 -30
  366. package/src/components/editor/chrome/panels/sandbox-toggle.tsx +0 -52
@@ -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 className="w-36 p-0" align="center" sideOffset={6}>
316
- <Command shouldFilter={false} value={String(currentPage)}>
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"
@@ -56,18 +56,18 @@ function createMockCell(
56
56
  }
57
57
 
58
58
  function createMockTable(): Table<T> {
59
- const mockToggleSelected = vi
60
- .fn()
61
- .mockImplementation(function (this: { isSelected: boolean }) {
62
- this.isSelected = !this.isSelected;
63
- return { isSelected: this.isSelected };
64
- });
59
+ const mockToggleSelected = vi.fn().mockImplementation(function (this: {
60
+ isSelected: boolean;
61
+ }) {
62
+ this.isSelected = !this.isSelected;
63
+ return { isSelected: this.isSelected };
64
+ });
65
65
 
66
- const mockGetIsSelected = vi
67
- .fn()
68
- .mockImplementation(function (this: { isSelected: boolean }) {
69
- return this.isSelected;
70
- });
66
+ const mockGetIsSelected = vi.fn().mockImplementation(function (this: {
67
+ isSelected: boolean;
68
+ }) {
69
+ return this.isSelected;
70
+ });
71
71
 
72
72
  const rows = [
73
73
  {
@@ -3,7 +3,7 @@
3
3
  import z from "zod";
4
4
  import { rpc } from "@/plugins/core/rpc";
5
5
 
6
- export type DownloadFormat = "csv" | "json" | "parquet" | "tsv";
6
+ export type DownloadFormat = "csv" | "json" | "parquet" | "tsv" | "geojson";
7
7
 
8
8
  /**
9
9
  * Per-request export options. Each field is optional. A missing field keeps
@@ -18,6 +18,7 @@ export interface DownloadAsOptions {
18
18
  export interface DownloadAsRequest {
19
19
  format: DownloadFormat;
20
20
  options?: DownloadAsOptions;
21
+ geometry_column?: string | null;
21
22
  }
22
23
 
23
24
  export type DownloadAsArgs = (req: DownloadAsRequest) => Promise<{
@@ -25,26 +26,101 @@ export type DownloadAsArgs = (req: DownloadAsRequest) => Promise<{
25
26
  filename: string;
26
27
  error?: string | null;
27
28
  missing_packages?: string[] | null;
29
+ code?:
30
+ | "geometry_required"
31
+ | "invalid_geometry"
32
+ | "invalid_metadata"
33
+ | "unsupported_representation"
34
+ | "unsupported_version"
35
+ | "missing_packages"
36
+ | "missing_crs"
37
+ | "conversion_failed"
38
+ | null;
39
+ column?: string | null;
28
40
  }>;
29
41
 
42
+ const DownloadRequestSchema = z.object({
43
+ geometry_column: z.string().nullish(),
44
+ options: z
45
+ .object({
46
+ separator: z.string().optional(),
47
+ encoding: z.string().optional(),
48
+ ensure_ascii: z.boolean().optional(),
49
+ })
50
+ .optional(),
51
+ });
52
+
53
+ const DownloadResponseSchema = z.object({
54
+ url: z.string(),
55
+ filename: z.string(),
56
+ error: z.string().nullish(),
57
+ missing_packages: z.array(z.string()).nullish(),
58
+ code: z
59
+ .enum([
60
+ "geometry_required",
61
+ "invalid_geometry",
62
+ "invalid_metadata",
63
+ "unsupported_representation",
64
+ "unsupported_version",
65
+ "missing_packages",
66
+ "conversion_failed",
67
+ ])
68
+ .nullish(),
69
+ column: z.string().nullish(),
70
+ });
71
+
30
72
  export const DownloadAsSchema = rpc
31
73
  .input(
32
- z.object({
74
+ DownloadRequestSchema.extend({
33
75
  format: z.enum(["csv", "json", "parquet", "tsv"]),
34
- options: z
35
- .object({
36
- separator: z.string().optional(),
37
- encoding: z.string().optional(),
38
- ensure_ascii: z.boolean().optional(),
39
- })
40
- .optional(),
41
76
  }),
42
77
  )
78
+ .output(DownloadResponseSchema);
79
+
80
+ export const DownloadGeoJSONSchema = rpc
81
+ .input(DownloadRequestSchema.extend({ format: z.literal("geojson") }))
43
82
  .output(
44
- z.object({
45
- url: z.string(),
46
- filename: z.string(),
47
- error: z.string().nullish(),
48
- missing_packages: z.array(z.string()).nullish(),
83
+ DownloadResponseSchema.extend({
84
+ code: z.union([
85
+ DownloadResponseSchema.shape.code,
86
+ z.literal("missing_crs"),
87
+ ]),
49
88
  }),
50
89
  );
90
+
91
+ export type DownloadAsFunction = (
92
+ req: z.infer<typeof DownloadAsSchema.input>,
93
+ ) => Promise<z.infer<typeof DownloadAsSchema.output>>;
94
+
95
+ export type DownloadGeoJSON = (
96
+ req: z.infer<typeof DownloadGeoJSONSchema.input>,
97
+ ) => Promise<z.infer<typeof DownloadGeoJSONSchema.output>>;
98
+
99
+ const ExportMetadataSchema = z.object({
100
+ geometry_columns: z.array(
101
+ z.object({
102
+ name: z.string(),
103
+ encoding: z.enum(["objects", "wkb", "wkt", "other"]),
104
+ crs: z.union([z.string(), z.record(z.string(), z.unknown())]).nullable(),
105
+ }),
106
+ ),
107
+ primary_geometry_column: z.string().nullable(),
108
+ default_geometry_column: z.string().nullable(),
109
+ formats: z.record(
110
+ z.string(),
111
+ z.object({
112
+ available: z.boolean(),
113
+ reason: z.string().nullable(),
114
+ missing_packages: z.array(z.string()),
115
+ }),
116
+ ),
117
+ });
118
+
119
+ export type ExportMetadata = z.infer<typeof ExportMetadataSchema>;
120
+ export type GetExportMetadata = (
121
+ opts: Record<string, never>,
122
+ ) => Promise<ExportMetadata>;
123
+
124
+ export const GetExportMetadataSchema = rpc
125
+ .input(z.object({}))
126
+ .output(ExportMetadataSchema);
@@ -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 file for each agent", () => {
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 --file notebooks/example.py --claude)"`,
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 --file notebooks/example.py --codex)"`,
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 --file notebooks/example.py --opencode)"`,
171
+ `opencode --prompt "$(uv run marimo pair prompt --url http://localhost:8000 --opencode)"`,
173
172
  );
174
173
  });
175
174
 
176
- it("omits the file flag when the page URL has no file", () => {
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("--session");
178
+ expect(command).not.toContain("notebooks/example.py");
184
179
  });
185
180
 
186
- it("shell-escapes a url containing metacharacters", () => {
187
- const command = getTerminalCommand(
188
- "claude",
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.each([
196
- ["relative/my notebook.py", "--file 'relative/my notebook.py'"],
197
- ["/tmp/my notebook.py", "--file '/tmp/my notebook.py'"],
198
- [
199
- String.raw`C:\Users\Jane Doe\notebook.py`,
200
- String.raw`--file 'C:\Users\Jane Doe\notebook.py'`,
201
- ],
202
- [
203
- String.raw`\\server\share\my notebook.py`,
204
- String.raw`--file '\\server\share\my notebook.py'`,
205
- ],
206
- ["notebooks/it's.py", `--file 'notebooks/it'"'"'s.py'`],
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: CONNECTION.url, file },
201
+ { url: "http://host:8000?auth=a&b" },
211
202
  false,
212
203
  );
213
- expect(command).toContain(expected);
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/{file}",
234
- file: "{session}/it's.py",
235
- session: "{command}",
224
+ url: "http://host/{session}",
225
+ session: "{command}/it's",
236
226
  },
237
- "tok'en {file} $&",
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{file}{session}{authentication}",
233
+ prompt: "{command}\n{url}\n{session}{authentication}",
244
234
  },
245
235
  },
246
236
  ),
247
237
  ).toBe(
248
- "custom marimo\nhttp://host/{file}\nFile: {session}/it's.py\nSession: {command}\n" +
249
- `\n\nFor authenticated Pair commands, set \`export MARIMO_TOKEN='tok'"'"'en {file} $&'\` in the shell that runs marimo.`,
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 optional session context", () => {
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 { getSessionId } from "@/core/kernel/session";
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 includes the current session in %s preview",
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(getSessionId());
78
- expect(panel).toHaveTextContent(
79
- tab === "Prompt" ? "File: notebook.py" : "--file notebook.py",
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
- expect(vi.mocked(copyToClipboard).mock.calls[0][0]).toContain(fileHint);
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([null, ""])(
117
- "omits the file when the URL and notebook filename are absent (%s)",
118
- async (filename) => {
119
- window.history.replaceState({}, "", "/");
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
- expect(screen.getByRole("tabpanel")).not.toHaveTextContent("--file");
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
- expect(screen.getByRole("tabpanel")).not.toHaveTextContent("File:");
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(getSessionId());
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
- --file notebook.py \
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 or notebook filename, when known. */
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, file, session }: ConnectionInfo,
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) })
@@ -18,8 +18,7 @@ import { Tooltip } from "@/components/ui/tooltip";
18
18
  import { asRemoteURL, useRuntimeManager } from "@/core/runtime/config";
19
19
  import { API } from "@/core/network/api";
20
20
  import { pairPreviewAtom } from "@/core/config/pair";
21
- import { getSessionId } from "@/core/kernel/session";
22
- import { useFilename } from "@/core/saving/filename";
21
+ import { stableSessionIdAtom } from "@/core/kernel/session";
23
22
  import {
24
23
  AGENT_LABELS,
25
24
  AGENT_TABS,
@@ -54,16 +53,14 @@ export const PairWithAgentModal: React.FC<{
54
53
  const [activeTab, setActiveTab] = useState<AgentTab>("claude");
55
54
  const runtimeManager = useRuntimeManager();
56
55
  const preview = useAtomValue(pairPreviewAtom);
57
- const filename = useFilename();
56
+ const stableSessionId = useAtomValue(stableSessionIdAtom);
58
57
  const commandStep = preview ? 1 : 2;
59
58
  const authToken = useAuthToken();
60
59
  const hasToken = Boolean(authToken);
61
60
  const connection: ConnectionInfo = {
62
61
  url: runtimeManager.httpURL.toString(),
63
- file:
64
- getFileFromURL(window.location.href) ??
65
- (preview ? filename || undefined : undefined),
66
- session: preview ? getSessionId() : undefined,
62
+ file: preview ? undefined : getFileFromURL(window.location.href),
63
+ session: preview ? (stableSessionId ?? undefined) : undefined,
67
64
  };
68
65
 
69
66
  return (
@@ -7,6 +7,8 @@ import {
7
7
  CheckIcon,
8
8
  ChevronDownCircleIcon,
9
9
  ChevronRightCircleIcon,
10
+ ChevronsDownUpIcon,
11
+ ChevronsUpDownIcon,
10
12
  ClipboardCopyIcon,
11
13
  CodeIcon,
12
14
  CommandIcon,
@@ -100,6 +102,7 @@ import type { ActionButton } from "./types";
100
102
  import { useCopyNotebook } from "./useCopyNotebook";
101
103
  import { useRestartKernel } from "./useRestartKernel";
102
104
  import { useSetCodeVisibility } from "./useSetCodeVisibility";
105
+ import { useSetOutputsExpanded } from "./useSetOutputsExpanded";
103
106
 
104
107
  const NOOP_HANDLER = (event?: Event) => {
105
108
  event?.preventDefault();
@@ -118,6 +121,7 @@ export function useNotebookActions({
118
121
  const [viewState] = useAtom(viewStateAtom);
119
122
  const kioskMode = useAtomValue(kioskModeAtom);
120
123
  const setCodeVisibility = useSetCodeVisibility();
124
+ const setOutputsExpanded = useSetOutputsExpanded();
121
125
  const [resolvedConfig] = useResolvedMarimoConfig();
122
126
  const capabilities = useAtomValue(capabilitiesAtom);
123
127
  const aiEnabled = useAtomValue(aiEnabledAtom);
@@ -596,6 +600,22 @@ export function useNotebookActions({
596
600
  handle: () => setCodeVisibility(true, "markdown"),
597
601
  redundant: true,
598
602
  },
603
+ {
604
+ icon: <ChevronsUpDownIcon size={14} strokeWidth={1.5} />,
605
+ label: "Expand all outputs",
606
+ hotkey: "global.expandAllOutputs",
607
+ hidden: viewState.mode !== "edit",
608
+ handle: () => setOutputsExpanded(true),
609
+ redundant: true,
610
+ },
611
+ {
612
+ icon: <ChevronsDownUpIcon size={14} strokeWidth={1.5} />,
613
+ label: "Clamp all outputs",
614
+ hotkey: "global.clampAllOutputs",
615
+ hidden: viewState.mode !== "edit",
616
+ handle: () => setOutputsExpanded(false),
617
+ redundant: true,
618
+ },
599
619
  {
600
620
  icon: <ChevronRightCircleIcon size={14} strokeWidth={1.5} />,
601
621
  label: "Collapse all sections",