@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.
Files changed (270) hide show
  1. package/dist/{ConnectedDataExplorerComponent-C2d9ysUI.js → ConnectedDataExplorerComponent-CglAbSke.js} +11 -11
  2. package/dist/{ErrorBoundary-CHS5luyo.js → ErrorBoundary-DsSFkMNZ.js} +8 -8
  3. package/dist/{abnfDiagram-VCTEODGH-AFhOQTt8.js → abnfDiagram-VCTEODGH-Bd5MYz7g.js} +3 -3
  4. package/dist/{any-language-editor-CycIVIeP.js → any-language-editor-DJ2MRREE.js} +5 -5
  5. package/dist/{apl-BYaaig9_.js → apl-GEW9-ZP1.js} +1 -1
  6. package/dist/{architectureDiagram-5GKGNRK7-BngksAAQ.js → architectureDiagram-5GKGNRK7-12FmGgo8.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-B0Xgl-Qn.js} +12 -0
  15. package/dist/{c4Diagram-7LVT6UL2-EceL4_jH.js → c4Diagram-7LVT6UL2-Bao10t_O.js} +7 -7
  16. package/dist/{capabilities-B3ce_GNu.js → capabilities-D7Ad8-zw.js} +1 -1
  17. package/dist/{cells-Cv93oav_.js → cells-HZp46rAW.js} +278 -278
  18. package/dist/{channel-z7HZXHwv.js → channel-BxCkvUgE.js} +1 -1
  19. package/dist/{chat-ui-fVyVOhYN.js → chat-ui-BSm4FFA7.js} +46 -46
  20. package/dist/{check-B7cIK6gb.js → check-DGZ74tV2.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-BlsbbLiS.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-DoIB7Bub.js} +8 -8
  34. package/dist/{chunk-SVP7TREG-uIyyySp6.js → chunk-SVP7TREG-B0dScloT.js} +2 -2
  35. package/dist/{chunk-TICWLB2K-DdXM3eg6.js → chunk-TICWLB2K-C-lzn2th.js} +6 -6
  36. package/dist/classDiagram-ZZMXUADV-C5vpBHoS.js +30 -0
  37. package/dist/classDiagram-v2-VYDZK3BY-BS2Wadt0.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-DOzR4Dbu.js → code-visibility-CF8pyEd4.js} +6 -6
  43. package/dist/{coffeescript-BVe1OiD9.js → coffeescript-C-eFwH5N.js} +1 -1
  44. package/dist/{common-BH1qMx9b.js → common-CuGATPZ-.js} +31 -24
  45. package/dist/{commonlisp-DxoBG7fU.js → commonlisp-CyaNXrJR.js} +1 -1
  46. package/dist/{copy-icon-CLdENY__.js → copy-icon-qmRg_VTX.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-fxnL4mfp.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-D5NkGE9i.js} +10 -10
  53. package/dist/{data-grid-overlay-editor-C23bOAVI.js → data-grid-overlay-editor-Mbr-fS3b.js} +1 -1
  54. package/dist/{diagram-S7CK7UJ4-V5-Z-EDY.js → diagram-S7CK7UJ4-CATbk1XK.js} +4 -4
  55. package/dist/{diagram-UQ7AKVKN-qw8AjDal.js → diagram-UQ7AKVKN-Cjha5vrC.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-BHfAjgGw.js} +5 -5
  58. package/dist/{diagram-Z3DM3KII-DpWwlYZB.js → diagram-Z3DM3KII-eAoDps6E.js} +3 -3
  59. package/dist/{dialog-CgNq6y9-.js → dialog-CILKhbsG.js} +3 -3
  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-CZy06LAq.js → dropdown-menu-BaqM0t4N.js} +7 -7
  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-D8RYnIZC.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-BfmoNNce.js} +12 -12
  95. package/dist/{erlang-BtAuIoF0.js → erlang-AdO1-xtV.js} +1 -1
  96. package/dist/{error-banner-B94dcDmP.js → error-banner-DzAmP0AQ.js} +2 -2
  97. package/dist/{error-entries-DLl0XqoW.js → error-entries-BmuhCp3w.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-B6DzYbxQ.js → feedback-button-D3il03Hy.js} +10 -10
  103. package/dist/flowDiagram-HODETNUW-Du_I0oTA.js +16 -0
  104. package/dist/{formats-Cl_67ghI.js → formats-pPD5eNN7.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-H0BN7EiD.js → glide-data-editor-DPBV7xdX.js} +11 -11
  112. package/dist/{glide-utils-B3rUT5PI.js → glide-utils-CzzWU59p.js} +3 -3
  113. package/dist/{globals-C9VJ-IPA.js → globals-CxhiGjJ0.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-BF9hL2Aa.js} +12 -12
  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-CHsocw1z.js} +2 -2
  121. package/dist/{ishikawaDiagram-5VMMS53U-BllIlHE5.js → ishikawaDiagram-5VMMS53U-DZdZJdsT.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-B1rrJRmN.js} +9 -9
  126. package/dist/{label-BslhXqL6.js → label-MNhNNoN6.js} +2 -2
  127. package/dist/{livescript-Ce4uqGAC.js → livescript-CVPfYnY_.js} +1 -1
  128. package/dist/{loader-DEZSzvma.js → loader-C9OUkMrj.js} +1 -1
  129. package/dist/{lua-D6fti_Jk.js → lua-4Fa-T-qq.js} +1 -1
  130. package/dist/main.js +184 -157
  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-CEceCleL.js} +54 -54
  134. package/dist/{mindmap-definition-YA3MSWOX-Cth76xgH.js → mindmap-definition-YA3MSWOX-C6-S9h9O.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-MgsEqPLj.js → number-overlay-editor-V4Mh8AtO.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-BL-R6P57.js} +3 -3
  148. package/dist/{perl-DjzMqXtt.js → perl-Drlh9s6m.js} +1 -1
  149. package/dist/{pieDiagram-E7YTZNPT-Bh3eDa9s.js → pieDiagram-E7YTZNPT-DuAOxSRy.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-BCZh7Wj_.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-f-sfFoX9.js} +3 -3
  163. package/dist/{requirementDiagram-BXWQKSXE-DCwsThh0.js → requirementDiagram-BXWQKSXE-BICupkaf.js} +11 -11
  164. package/dist/{reveal-component-BNJLyBZU.js → reveal-component-D-j1l0o6.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-C6plhmZr.js → select-BcObMjGz.js} +4 -4
  171. package/dist/{sequenceDiagram-WJ2MYXX4-CbXB1_PU.js → sequenceDiagram-WJ2MYXX4-DBFRnNGU.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-BSchR9UD.js} +16 -14
  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-CUP7QQW8.js} +13 -13
  182. package/dist/stateDiagram-v2-MP3YSRHH-B5mAItmH.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-BtIMdg7b.js} +10 -10
  188. package/dist/swimlanesDiagram-VR7AAH4N-CGnrrHpw.js +30 -0
  189. package/dist/{swiper-component-IOUowglM.js → swiper-component-DkV7T44B.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-UwihiSH2.js} +3 -3
  195. package/dist/{toDate-C67bxMWn.js → toDate-G79A_pyJ.js} +4 -5
  196. package/dist/{toast-DvY70eFX.js → toast-DcoJGS3-.js} +4 -4
  197. package/dist/{toml-AesZ6RBt.js → toml-CaUN7UHo.js} +1 -1
  198. package/dist/{tooltip-qB8NlSqV.js → tooltip-Bi36DgYh.js} +2 -2
  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-ZgG5Br63.js} +1 -1
  204. package/dist/{useAsyncData-BD6AStMt.js → useAsyncData-BD7NLQ3_.js} +1 -1
  205. package/dist/{useDateFormatter-BXQGu86d.js → useDateFormatter-D8XWr8lL.js} +2 -2
  206. package/dist/{useDeepCompareMemoize-D_HNdyvI.js → useDeepCompareMemoize-CawMGSRU.js} +1 -1
  207. package/dist/{useIframeCapabilities-CVtNkI3Y.js → useIframeCapabilities-BUMBOpsM.js} +1 -1
  208. package/dist/{useLifecycle-DPgiiwwU.js → useLifecycle-3vGhRa1o.js} +3 -3
  209. package/dist/{useTheme-DzXmYZ5V.js → useTheme-BOw801nZ.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-DyMT9lIi.js} +9 -9
  213. package/dist/{velocity-DHMu9kc-.js → velocity-CZKOFbOI.js} +1 -1
  214. package/dist/{vennDiagram-4TSXK5OY-BPHjZo0R.js → vennDiagram-4TSXK5OY-D5LNVIRI.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-BwKf-b0_.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-Cg_vyuW2.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 +12 -12
  224. package/src/components/chat/tool-call/__tests__/tool-result.test.tsx +56 -0
  225. package/src/components/chat/tool-call/tool-result.tsx +3 -3
  226. package/src/components/data-table/__tests__/pagination.test.tsx +85 -1
  227. package/src/components/data-table/charts/__tests__/schemas.test.ts +25 -0
  228. package/src/components/data-table/charts/__tests__/spec.test.ts +26 -23
  229. package/src/components/data-table/charts/constants.ts +11 -10
  230. package/src/components/data-table/charts/types.ts +1 -0
  231. package/src/components/data-table/pagination.tsx +16 -2
  232. package/src/components/editor/actions/__tests__/pair-with-agent-commands.test.ts +32 -46
  233. package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +29 -40
  234. package/src/components/editor/actions/__tests__/useSetOutputsExpanded.test.ts +42 -0
  235. package/src/components/editor/actions/pair-with-agent-commands.ts +3 -4
  236. package/src/components/editor/actions/pair-with-agent-modal.tsx +4 -7
  237. package/src/components/editor/actions/useNotebookActions.tsx +20 -0
  238. package/src/components/editor/actions/useSetOutputsExpanded.ts +67 -0
  239. package/src/core/config/pair.ts +0 -1
  240. package/src/core/edit-app.tsx +16 -0
  241. package/src/core/hotkeys/hotkeys.ts +12 -0
  242. package/src/core/kernel/session.ts +9 -0
  243. package/src/core/wasm/__tests__/bootstrap.test.ts +33 -1
  244. package/src/core/wasm/worker/bootstrap.ts +22 -3
  245. package/src/core/websocket/useMarimoKernelConnection.tsx +10 -1
  246. package/src/css/katex.min.css +145 -144
  247. package/src/plugins/impl/CheckboxPlugin.tsx +1 -1
  248. package/src/plugins/impl/DatePickerPlugin.tsx +5 -3
  249. package/src/plugins/impl/DateRangePlugin.tsx +5 -3
  250. package/src/plugins/impl/DateTimePickerPlugin.tsx +5 -3
  251. package/src/plugins/impl/DropdownPlugin.tsx +1 -1
  252. package/src/plugins/impl/FileBrowserPlugin.tsx +45 -15
  253. package/src/plugins/impl/MultiselectPlugin.tsx +1 -1
  254. package/src/plugins/impl/NumberPlugin.tsx +1 -1
  255. package/src/plugins/impl/RadioPlugin.tsx +5 -1
  256. package/src/plugins/impl/RangeSliderPlugin.tsx +1 -1
  257. package/src/plugins/impl/SearchableSelect.tsx +1 -1
  258. package/src/plugins/impl/SliderPlugin.tsx +1 -1
  259. package/src/plugins/impl/SwitchPlugin.tsx +6 -1
  260. package/src/plugins/impl/__tests__/FileBrowserPlugin.test.tsx +85 -2
  261. package/src/plugins/impl/__tests__/widget-labels.test.tsx +122 -0
  262. package/src/plugins/impl/chat/ChatPlugin.tsx +1 -1
  263. package/src/plugins/impl/common/labeled.tsx +9 -3
  264. package/dist/assets/__vite-browser-external-C9iR87Zl.js +0 -1
  265. package/dist/classDiagram-ZZMXUADV-BiATbBE4.js +0 -30
  266. package/dist/classDiagram-v2-VYDZK3BY-JnH97GYw.js +0 -30
  267. package/dist/flowDiagram-HODETNUW-DL52nMkt.js +0 -16
  268. package/dist/purify.es-DgKyQviY.js +0 -805
  269. package/dist/stateDiagram-v2-MP3YSRHH-D9YMnUGx.js +0 -30
  270. 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 { matchingPageRanges } from "../pagination";
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("should return correct encoding for temporal field with timeUnit", () => {
73
- const result = getAxisEncoding(
74
- {
75
- field: "date",
76
- selectedDataType: "temporal",
77
- aggregate: NONE_VALUE,
78
- timeUnit: "yearmonth",
79
- },
80
- undefined,
81
- "Date",
82
- undefined,
83
- ChartType.LINE,
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
- expect(result).toEqual({
87
- field: "date",
88
- type: "temporal",
89
- bin: undefined,
90
- title: "Date",
91
- stack: undefined,
92
- aggregate: undefined,
93
- timeUnit: "yearmonth",
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 2025"],
151
- month: ["Month", "Jan 2025"],
152
- week: ["Week", "Jan 01, 2025"],
153
- day: ["Day", "Jan 01, 2025"],
154
- hours: ["Hour", "Jan 01, 2025 12:00"],
155
- minutes: ["Minute", "Jan 01, 2025 12:34"],
156
- seconds: ["Second", "Jan 01, 2025 12:34:56"],
157
- milliseconds: ["Millisecond", "Jan 01, 2025 12:34:56.789"],
158
- date: ["Date", "Jan 01, 2025"],
159
- dayofyear: ["Day of Year", "Day 1 of 2025"],
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
  };
@@ -40,6 +40,7 @@ export const SINGLE_TIME_UNITS = [
40
40
  export const COMBINED_TIME_UNITS = [
41
41
  "yearmonth",
42
42
  "yearmonthdate",
43
+ "yearmonthdatehours",
43
44
  "monthdate",
44
45
  ] as const;
45
46
  export const TIME_UNITS = [
@@ -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"
@@ -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) })