@marimo-team/frontend 0.19.8-dev3 → 0.19.8-dev31

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 (335) hide show
  1. package/dist/assets/{CellStatus-CTtb89yx.js → CellStatus-BjDayMOF.js} +1 -1
  2. package/dist/assets/{Combination-C_mRvd_Z.js → Combination-izwufzWe.js} +1 -1
  3. package/dist/assets/{ConnectedDataExplorerComponent-CX7YQX42.js → ConnectedDataExplorerComponent-C1BlkUlk.js} +1 -1
  4. package/dist/assets/{DeferredRequestRegistry-CO2AyNfd.js → DeferredRequestRegistry-tv0PqJZ0.js} +1 -1
  5. package/dist/assets/{ErrorBoundary-ChCiwl15.js → ErrorBoundary-B9Ifj8Jf.js} +1 -1
  6. package/dist/assets/{ImageComparisonComponent-BVBGmVcA.js → ImageComparisonComponent-BVXYpigZ.js} +1 -1
  7. package/dist/assets/{ImperativeModal-CKeCkc1k.js → ImperativeModal-DZr52ffu.js} +1 -1
  8. package/dist/assets/{Inputs-CBxLLWdV.js → Inputs-CbenuziM.js} +1 -1
  9. package/dist/assets/{JsonOutput-BTBD86gT.js → JsonOutput-BUok9dqY.js} +11 -11
  10. package/dist/assets/{LazyAnyLanguageCodeMirror-Be7SB10I.js → LazyAnyLanguageCodeMirror-BqosdyZU.js} +2 -2
  11. package/dist/assets/MarimoErrorOutput-Dxf6p5lw.js +7 -0
  12. package/dist/assets/{RenderHTML-IBhB_MjX.js → RenderHTML-BUCe3qCj.js} +1 -1
  13. package/dist/assets/{SSRProvider-DBS9qs3r.js → SSRProvider-DrpctNAg.js} +1 -1
  14. package/dist/assets/__vite-browser-external-D-ioOGDE.js +1 -0
  15. package/dist/assets/__vite-browser-external-DBckR0WR.js +1 -0
  16. package/dist/assets/{add-cell-with-ai-DsiiVErB.js → add-cell-with-ai-J44RQi7o.js} +6 -6
  17. package/dist/assets/{add-database-form-B1frIn24.js → add-database-form-D8ppo-Wx.js} +1 -1
  18. package/dist/assets/{agent-panel-B_Ur2utx.js → agent-panel-Cf8Ij8-7.js} +5 -5
  19. package/dist/assets/{ai-model-dropdown-Dix8JIRc.js → ai-model-dropdown-DC4t5PJE.js} +4 -4
  20. package/dist/assets/{alert-adkp2Qj8.js → alert-Cx8eFRUM.js} +1 -1
  21. package/dist/assets/{alert-dialog-CordKci7.js → alert-dialog-Ctz24SMn.js} +1 -1
  22. package/dist/assets/{any-language-editor-Z9d2XKUM.js → any-language-editor-DyXJSyeK.js} +1 -1
  23. package/dist/assets/{app-config-button-CYFJH9oz.js → app-config-button-xVJ4tqzu.js} +1 -1
  24. package/dist/assets/{architectureDiagram-VXUJARFQ-B-zQV2Ro.js → architectureDiagram-VXUJARFQ-B8zMpJcM.js} +1 -1
  25. package/dist/assets/{arrow-left-Cb_73j1f.js → arrow-left-VDC1u5rq.js} +1 -1
  26. package/dist/assets/{badge-Ce8wRjuQ.js → badge-D4keL3YC.js} +1 -1
  27. package/dist/assets/blob-Bgnx1kuY.js +1 -0
  28. package/dist/assets/{blockDiagram-VD42YOAC-B7BRAty8.js → blockDiagram-VD42YOAC-CF1a-_t0.js} +1 -1
  29. package/dist/assets/{bundle.esm-B-jCcPJK.js → bundle.esm-CBAPjfrh.js} +1 -1
  30. package/dist/assets/{button-YC1gW_kJ.js → button-CZ3Cs4qb.js} +1 -1
  31. package/dist/assets/{c4Diagram-YG6GDRKO-C5JyC9v_.js → c4Diagram-YG6GDRKO-YIsEsUdQ.js} +1 -1
  32. package/dist/assets/{cache-panel-BfCxvTOh.js → cache-panel-C_9WDApV.js} +1 -1
  33. package/dist/assets/{card-BAxUmnnT.js → card-DdlNjkEA.js} +1 -1
  34. package/dist/assets/{cell-editor-BQ5bBOiS.js → cell-editor-DqRAVfCm.js} +14 -14
  35. package/dist/assets/{cell-link-DW0zobk9.js → cell-link-dnd6DfEI.js} +1 -1
  36. package/dist/assets/{cells-BcMpgRWV.js → cells-CiFhRLUd.js} +32 -32
  37. package/dist/assets/channel-CXFsg7SH.js +1 -0
  38. package/dist/assets/{chart-no-axes-column-W42b2ZIs.js → chart-no-axes-column-qvVRjhv1.js} +1 -1
  39. package/dist/assets/{chat-components-BpIX7pUp.js → chat-components-C5FA1-Vu.js} +1 -1
  40. package/dist/assets/{chat-display-CVXM0cmr.js → chat-display-ChS1NL3o.js} +1 -1
  41. package/dist/assets/chat-panel-Duk4139r.js +3 -0
  42. package/dist/assets/check-Dr3SxUsb.js +1 -0
  43. package/dist/assets/{chevron-right-DwagBitu.js → chevron-right--18M_6o9.js} +1 -1
  44. package/dist/assets/{chunk-5FQGJX7Z-Bmb7yu_c.js → chunk-5FQGJX7Z-T2jyw7ZD.js} +3 -3
  45. package/dist/assets/{chunk-ABZYJK2D-Coo5qi7b.js → chunk-ABZYJK2D-D1A06qKo.js} +3 -3
  46. package/dist/assets/{chunk-ATLVNIR6-C0ULYreM.js → chunk-ATLVNIR6-C5FWd1qN.js} +1 -1
  47. package/dist/assets/{chunk-B4BG7PRW-D6Q5lT5Z.js → chunk-B4BG7PRW-BEayfxv_.js} +1 -1
  48. package/dist/assets/{chunk-DI55MBZ5-BUUtkB-8.js → chunk-DI55MBZ5-BSrtupT8.js} +1 -1
  49. package/dist/assets/{chunk-EXTU4WIE-DQy5cN5X.js → chunk-EXTU4WIE-wi_fHsHN.js} +1 -1
  50. package/dist/assets/{chunk-JA3XYJ7Z-99Y1UR46.js → chunk-JA3XYJ7Z-tKDxhnhw.js} +1 -1
  51. package/dist/assets/{chunk-JZLCHNYA-DRGkEV50.js → chunk-JZLCHNYA-DtvI9B9X.js} +1 -1
  52. package/dist/assets/{chunk-N4CR4FBY-DHFG9ldR.js → chunk-N4CR4FBY-BQcJpHO7.js} +2 -2
  53. package/dist/assets/{chunk-QN33PNHL-DB8FgLRd.js → chunk-QN33PNHL-BboKw3W6.js} +1 -1
  54. package/dist/assets/{chunk-QXUST7PY-_zxuSm7L.js → chunk-QXUST7PY-C4Ihfbmy.js} +1 -1
  55. package/dist/assets/{chunk-S3R3BYOJ-PVCoxQeQ.js → chunk-S3R3BYOJ-D1UiABQX.js} +1 -1
  56. package/dist/assets/{chunk-TZMSLE5B-KYGSDxPK.js → chunk-TZMSLE5B-BjrxQwUX.js} +1 -1
  57. package/dist/assets/{circle-check-C57eOpl0.js → circle-check-DquVD4wZ.js} +1 -1
  58. package/dist/assets/{circle-play-BuOtSgid.js → circle-play-EowqxNIC.js} +1 -1
  59. package/dist/assets/{circle-plus-CnWl9uZo.js → circle-plus-haI9GLDP.js} +1 -1
  60. package/dist/assets/classDiagram-2ON5EDUG-BHD5dOKT.js +1 -0
  61. package/dist/assets/classDiagram-v2-WZHVMYZB-VYd80hrd.js +1 -0
  62. package/dist/assets/{clear-button-CF0iBcV9.js → clear-button-DI7_bdOB.js} +1 -1
  63. package/dist/assets/{click-outside-container-B12FHFHm.js → click-outside-container-Npdlddni.js} +1 -1
  64. package/dist/assets/{clipboard-paste-BiDF-cqm.js → clipboard-paste-CpyPR-HZ.js} +1 -1
  65. package/dist/assets/{code-block-37QAKDTI-D5PRUB7R.js → code-block-37QAKDTI-FUPT3-7o.js} +1 -1
  66. package/dist/assets/{code-xml-XLwHyDBr.js → code-xml-CgN_Yig7.js} +1 -1
  67. package/dist/assets/{column-preview-v3J210SK.js → column-preview-BUTci9vI.js} +1 -1
  68. package/dist/assets/{command-DOzj5zu3.js → command-MHa10zT2.js} +1 -1
  69. package/dist/assets/{command-palette-B94wuFEk.js → command-palette-BBecgDwg.js} +1 -1
  70. package/dist/assets/{common-DHF6uQdA.js → common-CR6DwVIy.js} +1 -1
  71. package/dist/assets/compiler-runtime-B3qBwwSJ.js +1 -0
  72. package/dist/assets/{config-C3-Nti03.js → config-D2-Bw6QC.js} +1 -1
  73. package/dist/assets/{context-CJp-B2dx.js → context-Ga_vV5mE.js} +1 -1
  74. package/dist/assets/{copy-CQ15EONK.js → copy-D-8y6iMN.js} +1 -1
  75. package/dist/assets/{copy-icon-C1fNHY3M.js → copy-icon-C9v8EtBA.js} +1 -1
  76. package/dist/assets/createLucideIcon-BCdY6lG5.js +1 -0
  77. package/dist/assets/{createReducer-Dnna-AUO.js → createReducer-B3rBsy4P.js} +1 -1
  78. package/dist/assets/{dagre-6UL2VRFP-khPiqbzB.js → dagre-6UL2VRFP-CX3NGWnu.js} +1 -1
  79. package/dist/assets/{data-grid-overlay-editor-Ca1ELXWD.js → data-grid-overlay-editor-BTyw6887.js} +1 -1
  80. package/dist/assets/{database-zap-B9y7063w.js → database-zap-k4ePIFAU.js} +1 -1
  81. package/dist/assets/{datasource-BZ3O2HG1.js → datasource-C7Acf9BM.js} +1 -1
  82. package/dist/assets/{dates-Cx863TsG.js → dates-CT5PUuFo.js} +1 -1
  83. package/dist/assets/{dependency-graph-panel-s45LIDec.js → dependency-graph-panel-n8clB1B4.js} +4 -4
  84. package/dist/assets/{diagram-PSM6KHXK-C7-DZLOE.js → diagram-PSM6KHXK-C0Sfgs1J.js} +1 -1
  85. package/dist/assets/{diagram-QEK2KX5R-Ct2_XsRV.js → diagram-QEK2KX5R-DYSkW6Ju.js} +1 -1
  86. package/dist/assets/{diagram-S2PKOQOG-C82IZoPA.js → diagram-S2PKOQOG-CfHqQVo3.js} +1 -1
  87. package/dist/assets/{dialog-Dstm3Ubn.js → dialog-tQELcltn.js} +1 -1
  88. package/dist/assets/{dist-oarhZoo6.js → dist-BMEHQAhk.js} +1 -1
  89. package/dist/assets/{dist-PT7WsOdN.js → dist-DDGMbl6p.js} +1 -1
  90. package/dist/assets/{dist-BhLw_JdQ.js → dist-h1RhtzUB.js} +1 -1
  91. package/dist/assets/{documentation-panel-DRqbOPwM.js → documentation-panel-B4SYV31-.js} +1 -1
  92. package/dist/assets/{download-zuPzhwvm.js → download-CUgZOA9O.js} +1 -1
  93. package/dist/assets/{download-B9SUL40m.js → download-Dg7clfkc.js} +1 -1
  94. package/dist/assets/{dropdown-menu-D8v7RjW8.js → dropdown-menu-BUgFWmX1.js} +1 -1
  95. package/dist/assets/{edit-page-Dlr4v1eI.js → edit-page-CZzL95NE.js} +7 -7
  96. package/dist/assets/{ellipsis-5ip-qDfN.js → ellipsis-DfDsMPvA.js} +1 -1
  97. package/dist/assets/{ellipsis-vertical-C7jYiLCo.js → ellipsis-vertical-J1F7_WS9.js} +1 -1
  98. package/dist/assets/{empty-state-BAGXXrn8.js → empty-state-DrmGF88A.js} +1 -1
  99. package/dist/assets/{en-US-XLBup7bs.js → en-US-DU2jJCpg.js} +1 -1
  100. package/dist/assets/{erDiagram-Q2GNP2WA-Ftt2qDiM.js → erDiagram-Q2GNP2WA-BfRyUS6D.js} +1 -1
  101. package/dist/assets/{error-banner-JIexM8h5.js → error-banner-w4pz2qUB.js} +1 -1
  102. package/dist/assets/{error-panel-TqjIx6nC.js → error-panel-Dp0gIK8O.js} +1 -1
  103. package/dist/assets/{errors-B5AI4nf5.js → errors-CPlNr33a.js} +1 -1
  104. package/dist/assets/{es-CPSXxuS6.js → es-GXAIFcot.js} +5 -5
  105. package/dist/assets/{esm-BbNm2fB0.js → esm-BK6tLEHQ.js} +1 -1
  106. package/dist/assets/{eye-off-BhExYOph.js → eye-off-AK_9uodG.js} +1 -1
  107. package/dist/assets/{field-1uCBX4j4.js → field-D9jE8HEt.js} +1 -1
  108. package/dist/assets/{file-Cs1JbsV6.js → file-Ch78NKWp.js} +1 -1
  109. package/dist/assets/{file-explorer-panel-jku_uMQn.js → file-explorer-panel-BqVToUzC.js} +1 -1
  110. package/dist/assets/{file-plus-corner-Da9I6dgU.js → file-plus-corner-CvAy4H5W.js} +1 -1
  111. package/dist/assets/{file-video-camera-DW3v07j2.js → file-video-camera-C3wGzBnE.js} +1 -1
  112. package/dist/assets/{floating-outline-CZbF47gm.js → floating-outline-CZzxqWyr.js} +1 -1
  113. package/dist/assets/{flowDiagram-NV44I4VS-Ca9aZp-3.js → flowDiagram-NV44I4VS-DKkZCUwG.js} +1 -1
  114. package/dist/assets/{focus-BxGelf2n.js → focus-CtXToHnV.js} +1 -1
  115. package/dist/assets/{form-DQt-Ldr4.js → form-CvVbbh8Y.js} +1 -1
  116. package/dist/assets/{formats-CobRswjh.js → formats-DGZwRUPy.js} +1 -1
  117. package/dist/assets/gallery-page-1AmSypJ6.js +1 -0
  118. package/dist/assets/{ganttDiagram-JELNMOA3-PYFPdyuJ.js → ganttDiagram-JELNMOA3-J8yLTqxn.js} +1 -1
  119. package/dist/assets/{gitGraphDiagram-NY62KEGX-CfGWoYOo.js → gitGraphDiagram-NY62KEGX-DXw3a-uS.js} +1 -1
  120. package/dist/assets/{glide-data-editor-8ek3zzAO.js → glide-data-editor-Cw8eE9Xn.js} +4 -4
  121. package/dist/assets/globals-D1aM0aUX.js +1 -0
  122. package/dist/assets/{home-page-xDhfcHL1.js → home-page-DJMymeT8.js} +1 -1
  123. package/dist/assets/{hooks-MQa8CSUr.js → hooks-STSuFYve.js} +1 -1
  124. package/dist/assets/{house-DhFkiXz7.js → house-BI81AWSn.js} +1 -1
  125. package/dist/assets/{html-to-image-DKqpcM7V.js → html-to-image-BKGhRUqR.js} +1 -1
  126. package/dist/assets/{icons-Dw4USSvE.js → icons-DjR3qLG_.js} +1 -1
  127. package/dist/assets/{index-DuqUGjtK.js → index-CQLP3a6_.js} +22 -22
  128. package/dist/assets/index-GcHhnSIR.css +2 -0
  129. package/dist/assets/{infoDiagram-WHAUD3N6-Csbwq6Ks.js → infoDiagram-WHAUD3N6-32du45zK.js} +1 -1
  130. package/dist/assets/{input-DcAGg_4_.js → input-DHHmNa19.js} +1 -1
  131. package/dist/assets/{isValid-BLB2jskA.js → isValid-DpSSOU5z.js} +1 -1
  132. package/dist/assets/{journeyDiagram-XKPGCS4Q-DArwMxlY.js → journeyDiagram-XKPGCS4Q-Bmx7dA25.js} +1 -1
  133. package/dist/assets/{kanban-definition-3W4ZIXB7-CPjBJiO_.js → kanban-definition-3W4ZIXB7-DJzhLwsl.js} +1 -1
  134. package/dist/assets/{katex-DYp6oq7P.js → katex-CbllUrnh.js} +1 -1
  135. package/dist/assets/katex-axIMlGRc.js +1 -0
  136. package/dist/assets/{kbd-uRyPZ9w_.js → kbd-k3Sn_RwW.js} +1 -1
  137. package/dist/assets/kiosk-mode-B93ch1Yg.js +1 -0
  138. package/dist/assets/{label-CL9Xfexh.js → label-C--1sWU6.js} +1 -1
  139. package/dist/assets/{layout-D-YPCWvX.js → layout-DWzvYkJc.js} +4 -4
  140. package/dist/assets/{linear-BxhToEEF.js → linear-DWpCiijk.js} +1 -1
  141. package/dist/assets/{link-BsTPF7B0.js → link-DxicfMbs.js} +1 -1
  142. package/dist/assets/{links-BhgWpHdU.js → links-fh_IXIKE.js} +1 -1
  143. package/dist/assets/{logs-panel-DKSJRyF4.js → logs-panel-Cqc-8g3U.js} +1 -1
  144. package/dist/assets/{loro_wasm_bg-BnAHSQ7o.js → loro_wasm_bg-CdafknAX.js} +2 -2
  145. package/dist/assets/loro_wasm_bg-WKwciKJa.wasm +0 -0
  146. package/dist/assets/{loro_wasm_bg-CKQGJrH5.js → loro_wasm_bg-aCueZs8k.js} +1 -1
  147. package/dist/assets/{maps-t9yNKYA8.js → maps-D2_Mq1pZ.js} +1 -1
  148. package/dist/assets/markdown-renderer-Dotqbx_q.js +10 -0
  149. package/dist/assets/{menu-items-NblnuU_B.js → menu-items-vwmjPhjW.js} +1 -1
  150. package/dist/assets/mermaid-4DMBBIKO-Dn0v3H8Z.js +1 -0
  151. package/dist/assets/{mermaid-Bzaf_nA9.js → mermaid-dAaJQU1M.js} +3 -3
  152. package/dist/assets/{mhchem-DLDYYsJK.js → mhchem-2XRJK9de.js} +1 -1
  153. package/dist/assets/{mindmap-definition-VGOIOE7T-DVB4z5Yy.js → mindmap-definition-VGOIOE7T-whTFv8Zv.js} +1 -1
  154. package/dist/assets/{mode-CevBiFCd.js → mode-O-1bKZO6.js} +1 -1
  155. package/dist/assets/{multi-icon-CLzAg610.js → multi-icon-BWLbAXq5.js} +1 -1
  156. package/dist/assets/{multi-map-W4zci54U.js → multi-map-A4XNra08.js} +1 -1
  157. package/dist/assets/{name-cell-input-DwvdP1Ck.js → name-cell-input-Bb4XgE9B.js} +1 -1
  158. package/dist/assets/{number-overlay-editor-CvIcqV0W.js → number-overlay-editor-65UcMR52.js} +1 -1
  159. package/dist/assets/{outline-panel-Bg_CP1WV.js → outline-panel-DvQn81N7.js} +1 -1
  160. package/dist/assets/{packages-panel-DBgrbk-q.js → packages-panel-CFja8lcb.js} +1 -1
  161. package/dist/assets/{panel-context-C-UJlFyL.js → panel-context-2mVKaSYm.js} +1 -1
  162. package/dist/assets/panels-DkQNKTXx.js +1 -0
  163. package/dist/assets/{pieDiagram-ADFJNKIX-vwwb5uL8.js → pieDiagram-ADFJNKIX-4n07I4VV.js} +1 -1
  164. package/dist/assets/{play-BPIh-ZEU.js → play-GLWQQs7F.js} +1 -1
  165. package/dist/assets/{plus-BD5o34_i.js → plus-B7DF33lD.js} +1 -1
  166. package/dist/assets/{popover-BZZFx3Q8.js → popover-B-131r4d.js} +1 -1
  167. package/dist/assets/{precisionRound-CU2C3Vxx.js → precisionRound-C3fmBb6j.js} +1 -1
  168. package/dist/assets/{process-output-Cl2N-HlT.js → process-output-B1EqjOGn.js} +1 -1
  169. package/dist/assets/{quadrantDiagram-AYHSOK5B-Y8bEZ32G.js → quadrantDiagram-AYHSOK5B-CNm24EC2.js} +1 -1
  170. package/dist/assets/{react-BGmjiNul.js → react-Bj1aDYRI.js} +1 -1
  171. package/dist/assets/{react-dom-C9fstfnp.js → react-dom-CSu739Rf.js} +1 -1
  172. package/dist/assets/{react-plotly-CZMBCa5P.js → react-plotly-OyYr93y7.js} +1 -1
  173. package/dist/assets/{react-resizable-panels.browser.esm-BFvP7Upm.js → react-resizable-panels.browser.esm-Mq45xjWt.js} +1 -1
  174. package/dist/assets/{react-vega-BCDifxTe.js → react-vega-BEiHA2e9.js} +1 -1
  175. package/dist/assets/react-vega-BrNLU7si.js +1 -0
  176. package/dist/assets/readonly-python-code-3nLIGqDx.js +1 -0
  177. package/dist/assets/{refresh-ccw-DLEiQDS3.js → refresh-ccw-DN_xCV6A.js} +1 -1
  178. package/dist/assets/{refresh-cw-CQd-1kjx.js → refresh-cw-Dx8TEWFP.js} +1 -1
  179. package/dist/assets/{renderShortcut-zxgoVTeP.js → renderShortcut-Xr6z-RjZ.js} +1 -1
  180. package/dist/assets/request-registry-BWqkV683.js +1 -0
  181. package/dist/assets/{requests-BsVD4CdD.js → requests-B4FYHTZl.js} +1 -1
  182. package/dist/assets/requests-BQkjRazP.js +1 -0
  183. package/dist/assets/{requirementDiagram-UZGBJVZJ-ChckaTrX.js → requirementDiagram-UZGBJVZJ-B7BwuJGh.js} +1 -1
  184. package/dist/assets/{rotate-ccw-B_yU4f05.js → rotate-ccw-DPbJxVVN.js} +1 -1
  185. package/dist/assets/run-page-CyMNZt0d.js +1 -0
  186. package/dist/assets/{runs-X54OGDTq.js → runs-DyBOFmAK.js} +1 -1
  187. package/dist/assets/{sankeyDiagram-TZEHDZUN-DtU4O0-i.js → sankeyDiagram-TZEHDZUN-C8KpmdhC.js} +1 -1
  188. package/dist/assets/{save-PMHbdtqc.js → save-DZodxFnE.js} +1 -1
  189. package/dist/assets/{save-worker-DtF6B3PS.js → save-worker-CtJsIYIM.js} +3 -3
  190. package/dist/assets/{scratchpad-panel-CIxZIJ-1.js → scratchpad-panel-eznTRPdo.js} +1 -1
  191. package/dist/assets/{secrets-panel-TwfjwIVv.js → secrets-panel-CEMSgQv5.js} +1 -1
  192. package/dist/assets/{select-CX1Yi8J8.js → select-B7bfltkI.js} +1 -1
  193. package/dist/assets/{sequenceDiagram-WL72ISMW-BGXrTemh.js → sequenceDiagram-WL72ISMW-D0_AcPzd.js} +1 -1
  194. package/dist/assets/{session-panel-CNeWVmTR.js → session-panel-BCN5AHky.js} +1 -1
  195. package/dist/assets/{settings-DOXWMfVd.js → settings-OBbrbhij.js} +1 -1
  196. package/dist/assets/{share-Ba-pHZtq.js → share-rXkgGlhr.js} +1 -1
  197. package/dist/assets/{slides-component-CGMJm_kL.js → slides-component-C0UAH9QZ.js} +1 -1
  198. package/dist/assets/{snippets-panel-DMN_ZSXA.js → snippets-panel-Exg8CrcD.js} +1 -1
  199. package/dist/assets/{spec-D1kBp3jX.js → spec-Ch0xnJY4.js} +1 -1
  200. package/dist/assets/{spinner-DaIKav-i.js → spinner-DA8-7wQv.js} +1 -1
  201. package/dist/assets/{square-C8Tw_XXG.js → square-DPZjfUaq.js} +1 -1
  202. package/dist/assets/{square-function-CqXXKtIq.js → square-function-B6mgCeFJ.js} +1 -1
  203. package/dist/assets/{state-BLsnFVwy.js → state-CMAvJZxx.js} +1 -1
  204. package/dist/assets/{state-n1Xz9vt7.js → state-DAl4qLSi.js} +1 -1
  205. package/dist/assets/{stateDiagram-FKZM4ZOC-BwSf7RIr.js → stateDiagram-FKZM4ZOC-Dz_iVJd6.js} +1 -1
  206. package/dist/assets/stateDiagram-v2-4FDKWEC3-CupainMB.js +1 -0
  207. package/dist/assets/{switch-CfRu5JBF.js → switch-BF1BnESM.js} +1 -1
  208. package/dist/assets/{table-qbh6Daed.js → table-BOsFCeLh.js} +1 -1
  209. package/dist/assets/{table-DZR6ewbN.js → table-CfDbAm78.js} +1 -1
  210. package/dist/assets/{terminal-C0fH4d_0.js → terminal-BLSSaFMR.js} +1 -1
  211. package/dist/assets/{textarea-3ZXdUni1.js → textarea-sdXkC92D.js} +1 -1
  212. package/dist/assets/{time-EL4bnqqQ.js → time-CSCsAxXS.js} +1 -1
  213. package/dist/assets/{timeline-definition-IT6M3QCI-BZakpQwy.js → timeline-definition-IT6M3QCI-DPXEeoSm.js} +1 -1
  214. package/dist/assets/{toDate-CgbKQM5E.js → toDate-DETS9bBd.js} +1 -1
  215. package/dist/assets/{toggle-CWS-iCmF.js → toggle-CriARMQK.js} +1 -1
  216. package/dist/assets/{tooltip-DH6k_bBY.js → tooltip-C_WgOOcZ.js} +1 -1
  217. package/dist/assets/{tooltip-DxKBXCGp.js → tooltip-DqsDDLgU.js} +1 -1
  218. package/dist/assets/{tracing-zzjDz6Hy.js → tracing-BCW3BhkT.js} +1 -1
  219. package/dist/assets/tracing-panel-0nE7-znv.js +2 -0
  220. package/dist/assets/{trash-2-CyqGun26.js → trash-2-B8SQYdQq.js} +1 -1
  221. package/dist/assets/{trash-DMqDgJ5r.js → trash-Cv0yH8fs.js} +1 -1
  222. package/dist/assets/{tree-DHpFOpHo.js → tree-Hg81oJmp.js} +1 -1
  223. package/dist/assets/{triangle-alert-B65rDESJ.js → triangle-alert-U93NZYDl.js} +1 -1
  224. package/dist/assets/{types-CS34eOZi.js → types-C1UhS3qM.js} +1 -1
  225. package/dist/assets/{types-CW-zyy80.js → types-ChPQge47.js} +1 -1
  226. package/dist/assets/{use-toast-rmUWldD_.js → use-toast-T0_cQDma.js} +1 -1
  227. package/dist/assets/useAddCell-DQzBfMNz.js +1 -0
  228. package/dist/assets/{useAsyncData-BAVCkkQP.js → useAsyncData-CgmD3hjw.js} +1 -1
  229. package/dist/assets/{useBoolean-BjVFTMam.js → useBoolean-IZsSX_XF.js} +1 -1
  230. package/dist/assets/useCellActionButton-ChlSq72t.js +1 -0
  231. package/dist/assets/{useDateFormatter-D89e9xZY.js → useDateFormatter-CieT0-H-.js} +1 -1
  232. package/dist/assets/{useDebounce-CU_caGaU.js → useDebounce-B28kFfrM.js} +1 -1
  233. package/dist/assets/{useDeepCompareMemoize-DiyglPgJ.js → useDeepCompareMemoize-CFtQU7An.js} +1 -1
  234. package/dist/assets/{useDeleteCell-B8CxYiji.js → useDeleteCell-BocCAiDk.js} +1 -1
  235. package/dist/assets/{useDependencyPanelTab-YtWR0xDK.js → useDependencyPanelTab-BUgnrQ1n.js} +1 -1
  236. package/dist/assets/useEvent-BhXAndur.js +1 -0
  237. package/dist/assets/{useEventListener-DIUKKfEy.js → useEventListener-Cb-RVVEn.js} +1 -1
  238. package/dist/assets/{useIframeCapabilities-DzIlROXe.js → useIframeCapabilities-CC8VH6kZ.js} +1 -1
  239. package/dist/assets/{useInstallPackage-C-gjrVjb.js → useInstallPackage-Co79H1lQ.js} +1 -1
  240. package/dist/assets/{useInterval-y9MtYlSD.js → useInterval-BNfubus2.js} +1 -1
  241. package/dist/assets/{useLifecycle-D35CBukS.js → useLifecycle-ClI_npeg.js} +1 -1
  242. package/dist/assets/{useNonce-_Aax6sXd.js → useNonce-CS26E0hA.js} +1 -1
  243. package/dist/assets/{useNotebookActions-Dfh_7NPm.js → useNotebookActions-wEv3D5Ih.js} +1 -1
  244. package/dist/assets/{useNumberFormatter-CTkflual.js → useNumberFormatter-BX4DTYtT.js} +1 -1
  245. package/dist/assets/{usePress-CoEeT5jq.js → usePress-3CRs0fQg.js} +1 -1
  246. package/dist/assets/{useRunCells-rjrIgU8v.js → useRunCells-CNmJhP6h.js} +1 -1
  247. package/dist/assets/{useSplitCell-fcjSuBNO.js → useSplitCell-DwvRo6W7.js} +1 -1
  248. package/dist/assets/{useTheme-EGf2UOFo.js → useTheme-CTORu22_.js} +1 -1
  249. package/dist/assets/utilities.esm-OH_d3CNC.js +3 -0
  250. package/dist/assets/{utils-DXvhzCGS.js → utils-YqBXNpsM.js} +1 -1
  251. package/dist/assets/{vega-component-DAJbxD47.js → vega-component-7jd4fFCJ.js} +1 -1
  252. package/dist/assets/{vega-loader.browser-DXARUlxo.js → vega-loader.browser-BegSZk0G.js} +1 -1
  253. package/dist/assets/{worker-CUL1lW-N.js → worker-CyCdlLVf.js} +3 -3
  254. package/dist/assets/{workflow-CMjI9cxl.js → workflow-B12dAR4X.js} +1 -1
  255. package/dist/assets/{write-secret-modal-CgAvgY9w.js → write-secret-modal-DO-EOoNO.js} +1 -1
  256. package/dist/assets/{x-CoXDX2vQ.js → x-ZP5cObgf.js} +1 -1
  257. package/dist/assets/{xychartDiagram-PRI3JC2R-CAHFvN1H.js → xychartDiagram-PRI3JC2R-DINfGlOV.js} +1 -1
  258. package/dist/assets/{youtube-8p26v8EM.js → youtube--tNPNRy6.js} +1 -1
  259. package/dist/assets/zod-H_cgTO0M.js +40 -0
  260. package/dist/index.html +139 -139
  261. package/package.json +18 -18
  262. package/src/components/app-config/ai-config.tsx +11 -2
  263. package/src/components/app-config/user-config-form.tsx +0 -54
  264. package/src/components/chat/acp/__tests__/state.test.ts +69 -0
  265. package/src/components/chat/acp/state.ts +6 -6
  266. package/src/components/chat/chat-panel.tsx +47 -30
  267. package/src/components/data-table/__tests__/data-table.test.tsx +94 -2
  268. package/src/components/editor/actions/useCellActionButton.tsx +14 -1
  269. package/src/components/editor/cell/CreateCellButton.tsx +2 -1
  270. package/src/components/editor/cell/code/cell-editor.tsx +12 -0
  271. package/src/components/editor/renderers/cell-array.tsx +2 -1
  272. package/src/components/editor/renderers/vertical-layout/vertical-layout.tsx +12 -0
  273. package/src/components/pages/gallery-page.tsx +37 -6
  274. package/src/core/MarimoApp.tsx +12 -8
  275. package/src/core/ai/context/providers/file.ts +1 -1
  276. package/src/core/cells/__tests__/cells.test.ts +120 -0
  277. package/src/core/cells/cells.ts +14 -0
  278. package/src/core/codemirror/language/languages/markdown.ts +7 -0
  279. package/src/core/config/feature-flag.tsx +0 -4
  280. package/src/core/islands/__tests__/bridge.test.ts +241 -0
  281. package/src/core/islands/bridge.ts +22 -6
  282. package/src/core/run-app.tsx +11 -4
  283. package/src/core/static/__tests__/files.test.ts +195 -1
  284. package/src/core/static/files.ts +39 -9
  285. package/src/plugins/core/registerReactComponent.tsx +9 -1
  286. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +164 -0
  287. package/src/plugins/impl/anywidget/AnyWidgetPlugin.tsx +7 -1
  288. package/src/utils/__tests__/blob.test.ts +3 -3
  289. package/src/utils/__tests__/mime-types.test.ts +8 -10
  290. package/src/utils/__tests__/url-parser.test.ts +22 -0
  291. package/src/utils/blob.ts +14 -27
  292. package/src/utils/mime-types.ts +5 -5
  293. package/src/utils/url-parser.ts +1 -1
  294. package/dist/assets/MarimoErrorOutput-DuaUr0W-.js +0 -7
  295. package/dist/assets/__vite-browser-external-BkzFKOxE.js +0 -1
  296. package/dist/assets/__vite-browser-external-CPyDqUtZ.js +0 -1
  297. package/dist/assets/blob-t6qcPM7K.js +0 -1
  298. package/dist/assets/channel-ownMsSXG.js +0 -1
  299. package/dist/assets/chat-panel-FiDMP_Qr.js +0 -3
  300. package/dist/assets/check-DdfN0k2d.js +0 -1
  301. package/dist/assets/classDiagram-2ON5EDUG-CSgD2v8F.js +0 -1
  302. package/dist/assets/classDiagram-v2-WZHVMYZB-YTETTIT0.js +0 -1
  303. package/dist/assets/compiler-runtime-DeeZ7FnK.js +0 -1
  304. package/dist/assets/createLucideIcon-CnW3RofX.js +0 -1
  305. package/dist/assets/gallery-page-D_5X4kKx.js +0 -1
  306. package/dist/assets/globals-D4t_HyAp.js +0 -1
  307. package/dist/assets/index-CikhHYAB.css +0 -2
  308. package/dist/assets/katex-BZrXWsTs.js +0 -1
  309. package/dist/assets/kiosk-mode-C9XznhoS.js +0 -1
  310. package/dist/assets/loro_wasm_bg-DV7Kb4_M.wasm +0 -0
  311. package/dist/assets/markdown-renderer-Bu12gPyJ.js +0 -10
  312. package/dist/assets/mermaid-4DMBBIKO-RE7Z6-fl.js +0 -1
  313. package/dist/assets/panels-CaoDGKmF.js +0 -1
  314. package/dist/assets/react-vega-DkHO4e2L.js +0 -1
  315. package/dist/assets/readonly-python-code-H1kzT-lB.js +0 -1
  316. package/dist/assets/request-registry-CjZcQuTP.js +0 -1
  317. package/dist/assets/requests-BSPGoGJL.js +0 -1
  318. package/dist/assets/run-page-BmTC7uxn.js +0 -1
  319. package/dist/assets/stateDiagram-v2-4FDKWEC3-SWMI9LKY.js +0 -1
  320. package/dist/assets/tracing-panel-DogOVTzf.js +0 -2
  321. package/dist/assets/useAddCell-mkD8zurm.js +0 -1
  322. package/dist/assets/useCellActionButton-BZ46_Pdt.js +0 -1
  323. package/dist/assets/useEvent-DO6uJBas.js +0 -1
  324. package/dist/assets/utilities.esm-CkqwfzLw.js +0 -3
  325. package/dist/assets/zod-Cg4WLWh2.js +0 -40
  326. /package/dist/assets/{copy-DHrHayPa.js → copy-BaRrAFL-.js} +0 -0
  327. /package/dist/assets/{defaultLocale-BLne0bXb.js → defaultLocale-B6z1Qyqt.js} +0 -0
  328. /package/dist/assets/{defaultLocale-JieDVWC_.js → defaultLocale-YteS-k_t.js} +0 -0
  329. /package/dist/assets/{emotion-is-prop-valid.esm-C59xfSYt.js → emotion-is-prop-valid.esm-Dangy3Bv.js} +0 -0
  330. /package/dist/assets/{extends-BiFDv3jB.js → extends-Dqvpuc10.js} +0 -0
  331. /package/dist/assets/{objectWithoutPropertiesLoose-DfWeGRFv.js → objectWithoutPropertiesLoose-DoKw85w0.js} +0 -0
  332. /package/dist/assets/{ordinal-C93T4L8H.js → ordinal-DAqJmfoU.js} +0 -0
  333. /package/dist/assets/{prop-types-DaaA-ptl.js → prop-types-DVDiRdwc.js} +0 -0
  334. /package/dist/assets/{purify.es-DZrAQFIu.js → purify.es-B-nzWya6.js} +0 -0
  335. /package/dist/assets/{range-1DwpgXvM.js → range-7fnH_zLA.js} +0 -0
@@ -2561,6 +2561,126 @@ describe("cell reducer", () => {
2561
2561
  expect(state.untouchedNewCells.has(newCellId)).toBe(false);
2562
2562
  expect(exportedForTesting.isCellCodeHidden(state, newCellId)).toBe(true);
2563
2563
  });
2564
+
2565
+ it("can mark an existing cell as untouched", () => {
2566
+ // Create a cell without hideCode (not in untouchedNewCells)
2567
+ actions.createNewCell({
2568
+ cellId: "__end__",
2569
+ before: false,
2570
+ hideCode: false,
2571
+ });
2572
+
2573
+ const newCellId =
2574
+ state.cellIds.inOrderIds[state.cellIds.inOrderIds.length - 1];
2575
+ expect(state.untouchedNewCells.has(newCellId)).toBe(false);
2576
+
2577
+ // Mark it as untouched
2578
+ actions.markUntouched({ cellId: newCellId });
2579
+
2580
+ expect(state.untouchedNewCells.has(newCellId)).toBe(true);
2581
+ });
2582
+
2583
+ it("markUntouched is idempotent", () => {
2584
+ // Create a cell without hideCode
2585
+ actions.createNewCell({
2586
+ cellId: "__end__",
2587
+ before: false,
2588
+ hideCode: false,
2589
+ });
2590
+
2591
+ const newCellId =
2592
+ state.cellIds.inOrderIds[state.cellIds.inOrderIds.length - 1];
2593
+ expect(state.untouchedNewCells.has(newCellId)).toBe(false);
2594
+
2595
+ // Mark as untouched multiple times
2596
+ actions.markUntouched({ cellId: newCellId });
2597
+ actions.markUntouched({ cellId: newCellId });
2598
+ actions.markUntouched({ cellId: newCellId });
2599
+
2600
+ expect(state.untouchedNewCells.has(newCellId)).toBe(true);
2601
+ });
2602
+
2603
+ it("markUntouched does not affect already untouched cells", () => {
2604
+ // Create a cell with hideCode (already in untouchedNewCells)
2605
+ actions.createNewCell({
2606
+ cellId: "__end__",
2607
+ before: false,
2608
+ hideCode: true,
2609
+ });
2610
+
2611
+ const newCellId =
2612
+ state.cellIds.inOrderIds[state.cellIds.inOrderIds.length - 1];
2613
+ expect(state.untouchedNewCells.has(newCellId)).toBe(true);
2614
+
2615
+ // Calling markUntouched should not change anything
2616
+ actions.markUntouched({ cellId: newCellId });
2617
+
2618
+ expect(state.untouchedNewCells.has(newCellId)).toBe(true);
2619
+ });
2620
+
2621
+ it("markTouched and markUntouched can toggle cell state", () => {
2622
+ // Create a cell without hideCode
2623
+ actions.createNewCell({
2624
+ cellId: "__end__",
2625
+ before: false,
2626
+ hideCode: false,
2627
+ });
2628
+
2629
+ const newCellId =
2630
+ state.cellIds.inOrderIds[state.cellIds.inOrderIds.length - 1];
2631
+
2632
+ // Initially not untouched
2633
+ expect(state.untouchedNewCells.has(newCellId)).toBe(false);
2634
+
2635
+ // Mark as untouched
2636
+ actions.markUntouched({ cellId: newCellId });
2637
+ expect(state.untouchedNewCells.has(newCellId)).toBe(true);
2638
+
2639
+ // Mark as touched
2640
+ actions.markTouched({ cellId: newCellId });
2641
+ expect(state.untouchedNewCells.has(newCellId)).toBe(false);
2642
+
2643
+ // Mark as untouched again
2644
+ actions.markUntouched({ cellId: newCellId });
2645
+ expect(state.untouchedNewCells.has(newCellId)).toBe(true);
2646
+ });
2647
+
2648
+ it("markUntouched works for markdown cell conversion scenario", () => {
2649
+ // Simulates converting a Python cell to Markdown
2650
+ // 1. Create a regular cell (no hideCode)
2651
+ actions.createNewCell({
2652
+ cellId: "__end__",
2653
+ before: false,
2654
+ hideCode: false,
2655
+ });
2656
+
2657
+ const cellId =
2658
+ state.cellIds.inOrderIds[state.cellIds.inOrderIds.length - 1];
2659
+
2660
+ // Cell starts without hide_code and not in untouchedNewCells
2661
+ expect(state.cellData[cellId].config.hide_code).toBe(false);
2662
+ expect(state.untouchedNewCells.has(cellId)).toBe(false);
2663
+ expect(exportedForTesting.isCellCodeHidden(state, cellId)).toBe(false);
2664
+
2665
+ // 2. Convert to markdown: set hide_code and mark as untouched
2666
+ actions.updateCellConfig({
2667
+ cellId,
2668
+ config: { hide_code: true },
2669
+ });
2670
+ actions.markUntouched({ cellId });
2671
+
2672
+ // Code should NOT be hidden because cell is untouched (user can edit)
2673
+ expect(state.cellData[cellId].config.hide_code).toBe(true);
2674
+ expect(state.untouchedNewCells.has(cellId)).toBe(true);
2675
+ expect(exportedForTesting.isCellCodeHidden(state, cellId)).toBe(false);
2676
+
2677
+ // 3. User blurs the cell (markTouched)
2678
+ actions.markTouched({ cellId });
2679
+
2680
+ // Now code should be hidden
2681
+ expect(state.untouchedNewCells.has(cellId)).toBe(false);
2682
+ expect(exportedForTesting.isCellCodeHidden(state, cellId)).toBe(true);
2683
+ });
2564
2684
  });
2565
2685
 
2566
2686
  describe("releaseCellAtoms", () => {
@@ -1033,6 +1033,20 @@ const {
1033
1033
 
1034
1034
  return state;
1035
1035
  },
1036
+ markUntouched: (state, action: { cellId: CellId }) => {
1037
+ const { cellId } = action;
1038
+
1039
+ if (!state.untouchedNewCells.has(cellId)) {
1040
+ const nextUntouchedNewCells = new Set(state.untouchedNewCells);
1041
+ nextUntouchedNewCells.add(cellId);
1042
+ return {
1043
+ ...state,
1044
+ untouchedNewCells: nextUntouchedNewCells,
1045
+ };
1046
+ }
1047
+
1048
+ return state;
1049
+ },
1036
1050
  scrollToTarget: (state) => {
1037
1051
  // Scroll to the specified cell and clear the scroll key.
1038
1052
  const scrollKey = state.scrollKey;
@@ -28,6 +28,13 @@ import type { LanguageAdapter } from "../types";
28
28
 
29
29
  export type MarkdownLanguageAdapterMetadata = MarkdownMetadata;
30
30
 
31
+ /**
32
+ * Default hide_code setting for markdown cells.
33
+ * When true, the markdown code is hidden after the cell is blurred,
34
+ * showing only the rendered output.
35
+ */
36
+ export const MARKDOWN_INITIAL_HIDE_CODE = true;
37
+
31
38
  /**
32
39
  * Language adapter for Markdown.
33
40
  */
@@ -9,8 +9,6 @@ export interface ExperimentalFeatures {
9
9
  markdown: boolean; // Used in playground (community cloud)
10
10
  wasm_layouts: boolean; // Used in playground (community cloud)
11
11
  rtc_v2: boolean;
12
- performant_table_charts: boolean;
13
- chat_modes: boolean;
14
12
  cache_panel: boolean;
15
13
  external_agents: boolean;
16
14
  server_side_pdf_export: boolean;
@@ -21,8 +19,6 @@ const defaultValues: ExperimentalFeatures = {
21
19
  markdown: true,
22
20
  wasm_layouts: false,
23
21
  rtc_v2: false,
24
- performant_table_charts: false,
25
- chat_modes: false,
26
22
  cache_panel: false,
27
23
  external_agents: import.meta.env.DEV,
28
24
  server_side_pdf_export: true,
@@ -0,0 +1,241 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
+
4
+ // Mock browser APIs before any imports
5
+ vi.stubGlobal(
6
+ "Worker",
7
+ vi.fn(() => ({
8
+ addEventListener: vi.fn(),
9
+ postMessage: vi.fn(),
10
+ terminate: vi.fn(),
11
+ })),
12
+ );
13
+
14
+ // Create a mock URL class that works as a constructor
15
+ class MockURL {
16
+ href: string;
17
+ constructor(url: string, base?: string | URL) {
18
+ this.href = base ? `${base}/${url}` : url;
19
+ }
20
+ static createObjectURL = vi.fn(() => "blob:mock-url");
21
+ static revokeObjectURL = vi.fn();
22
+ }
23
+ vi.stubGlobal("URL", MockURL);
24
+
25
+ // Mock the worker RPC before importing the bridge
26
+ const mockBridge = vi.fn();
27
+ const mockLoadPackages = vi.fn();
28
+
29
+ vi.mock("@/core/wasm/rpc", () => ({
30
+ getWorkerRPC: () => ({
31
+ proxy: {
32
+ request: {
33
+ bridge: mockBridge,
34
+ loadPackages: mockLoadPackages,
35
+ startSession: vi.fn(),
36
+ },
37
+ send: {
38
+ consumerReady: vi.fn(),
39
+ },
40
+ },
41
+ addMessageListener: vi.fn(),
42
+ }),
43
+ }));
44
+
45
+ // Mock the parse module to avoid DOM dependencies
46
+ vi.mock("../parse", () => ({
47
+ parseMarimoIslandApps: () => [],
48
+ createMarimoFile: vi.fn(),
49
+ }));
50
+
51
+ // Mock uuid to have predictable tokens
52
+ vi.mock("@/utils/uuid", () => ({
53
+ generateUUID: () => "test-uuid-12345",
54
+ }));
55
+
56
+ // Mock getMarimoVersion
57
+ vi.mock("@/core/meta/globals", () => ({
58
+ getMarimoVersion: () => "0.0.0-test",
59
+ }));
60
+
61
+ // Mock the jotai store
62
+ vi.mock("@/core/state/jotai", () => ({
63
+ store: {
64
+ set: vi.fn(),
65
+ },
66
+ }));
67
+
68
+ // Now import the bridge class
69
+ import { IslandsPyodideBridge } from "../bridge";
70
+
71
+ describe("IslandsPyodideBridge", () => {
72
+ let bridge: IslandsPyodideBridge;
73
+
74
+ beforeEach(() => {
75
+ vi.clearAllMocks();
76
+ // Reset the singleton by clearing the window property
77
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
78
+ delete (window as any)._marimo_private_IslandsPyodideBridge;
79
+ // Access the singleton - creates a fresh instance
80
+ bridge = IslandsPyodideBridge.INSTANCE;
81
+ });
82
+
83
+ afterEach(() => {
84
+ // Clean up singleton
85
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
86
+ delete (window as any)._marimo_private_IslandsPyodideBridge;
87
+ });
88
+
89
+ describe("sendComponentValues", () => {
90
+ it("should include type field and token in control request", async () => {
91
+ const request = {
92
+ objectIds: ["Hbol-0"],
93
+ values: [58],
94
+ };
95
+
96
+ await bridge.sendComponentValues(request);
97
+
98
+ expect(mockBridge).toHaveBeenCalledWith({
99
+ functionName: "put_control_request",
100
+ payload: {
101
+ type: "update-ui-element",
102
+ objectIds: ["Hbol-0"],
103
+ values: [58],
104
+ token: "test-uuid-12345",
105
+ },
106
+ });
107
+ });
108
+
109
+ it("should preserve all request properties", async () => {
110
+ const request = {
111
+ objectIds: ["slider-1", "slider-2"],
112
+ values: [10, 20],
113
+ };
114
+
115
+ await bridge.sendComponentValues(request);
116
+
117
+ expect(mockBridge).toHaveBeenCalledWith({
118
+ functionName: "put_control_request",
119
+ payload: expect.objectContaining({
120
+ type: "update-ui-element",
121
+ objectIds: ["slider-1", "slider-2"],
122
+ values: [10, 20],
123
+ }),
124
+ });
125
+ });
126
+ });
127
+
128
+ describe("sendFunctionRequest", () => {
129
+ it("should include type field in control request", async () => {
130
+ const request = {
131
+ functionCallId: "call-123",
132
+ namespace: "test_namespace",
133
+ functionName: "my_function",
134
+ args: { x: 1, y: 2 },
135
+ };
136
+
137
+ await bridge.sendFunctionRequest(request);
138
+
139
+ expect(mockBridge).toHaveBeenCalledWith({
140
+ functionName: "put_control_request",
141
+ payload: {
142
+ type: "invoke-function",
143
+ functionCallId: "call-123",
144
+ namespace: "test_namespace",
145
+ functionName: "my_function",
146
+ args: { x: 1, y: 2 },
147
+ },
148
+ });
149
+ });
150
+ });
151
+
152
+ describe("sendRun", () => {
153
+ it("should include type field in control request", async () => {
154
+ const request = {
155
+ cellIds: ["cell-1", "cell-2"],
156
+ codes: ["print('hello')", "print('world')"],
157
+ };
158
+
159
+ await bridge.sendRun(request);
160
+
161
+ expect(mockBridge).toHaveBeenCalledWith({
162
+ functionName: "put_control_request",
163
+ payload: {
164
+ type: "execute-cells",
165
+ cellIds: ["cell-1", "cell-2"],
166
+ codes: ["print('hello')", "print('world')"],
167
+ },
168
+ });
169
+ });
170
+
171
+ it("should call loadPackages before putControlRequest", async () => {
172
+ const request = {
173
+ cellIds: ["cell-1"],
174
+ codes: ["import pandas"],
175
+ };
176
+
177
+ await bridge.sendRun(request);
178
+
179
+ // Verify loadPackages was called with joined codes
180
+ expect(mockLoadPackages).toHaveBeenCalledWith("import pandas");
181
+
182
+ // Verify order: loadPackages should be called before bridge
183
+ const loadPackagesCallOrder =
184
+ mockLoadPackages.mock.invocationCallOrder[0];
185
+ const bridgeCallOrder = mockBridge.mock.invocationCallOrder[0];
186
+ expect(loadPackagesCallOrder).toBeLessThan(bridgeCallOrder);
187
+ });
188
+ });
189
+
190
+ describe("sendModelValue", () => {
191
+ it("should include type field in control request", async () => {
192
+ const request = {
193
+ modelId: "widget-1",
194
+ message: {
195
+ state: { value: 42 },
196
+ bufferPaths: [],
197
+ },
198
+ };
199
+
200
+ await bridge.sendModelValue(request);
201
+
202
+ expect(mockBridge).toHaveBeenCalledWith({
203
+ functionName: "put_control_request",
204
+ payload: {
205
+ type: "update-widget-model",
206
+ modelId: "widget-1",
207
+ message: {
208
+ state: { value: 42 },
209
+ bufferPaths: [],
210
+ },
211
+ },
212
+ });
213
+ });
214
+ });
215
+
216
+ describe("control request message format", () => {
217
+ it("should always include the type field required by msgspec", async () => {
218
+ // Test all methods to ensure they include the type field
219
+ await bridge.sendComponentValues({ objectIds: [], values: [] });
220
+ await bridge.sendFunctionRequest({
221
+ functionCallId: "",
222
+ namespace: "",
223
+ functionName: "",
224
+ args: {},
225
+ });
226
+ await bridge.sendRun({ cellIds: [], codes: [] });
227
+ await bridge.sendModelValue({
228
+ modelId: "",
229
+ message: { state: {}, bufferPaths: [] },
230
+ });
231
+
232
+ // All calls should have the type field
233
+ const allCalls = mockBridge.mock.calls;
234
+ for (const call of allCalls) {
235
+ const payload = call[0].payload;
236
+ expect(payload).toHaveProperty("type");
237
+ expect(typeof payload.type).toBe("string");
238
+ }
239
+ });
240
+ });
241
+ });
@@ -6,7 +6,8 @@ import { Deferred } from "@/utils/Deferred";
6
6
  import { throwNotImplemented } from "@/utils/functions";
7
7
  import type { JsonString } from "@/utils/json/base64";
8
8
  import { Logger } from "@/utils/Logger";
9
- import type { NotificationPayload } from "../kernel/messages";
9
+ import { generateUUID } from "@/utils/uuid";
10
+ import type { CommandMessage, NotificationPayload } from "../kernel/messages";
10
11
  import { getMarimoVersion } from "../meta/globals";
11
12
  import type { EditRequests, RunRequests } from "../network/types";
12
13
  import { store } from "../state/jotai";
@@ -104,7 +105,11 @@ export class IslandsPyodideBridge implements RunRequests, EditRequests {
104
105
  sendComponentValues: RunRequests["sendComponentValues"] = async (
105
106
  request,
106
107
  ): Promise<null> => {
107
- await this.putControlRequest(request);
108
+ await this.putControlRequest({
109
+ type: "update-ui-element",
110
+ ...request,
111
+ token: generateUUID(),
112
+ });
108
113
  return null;
109
114
  };
110
115
 
@@ -117,18 +122,27 @@ export class IslandsPyodideBridge implements RunRequests, EditRequests {
117
122
  sendFunctionRequest: RunRequests["sendFunctionRequest"] = async (
118
123
  request,
119
124
  ): Promise<null> => {
120
- await this.putControlRequest(request);
125
+ await this.putControlRequest({
126
+ type: "invoke-function",
127
+ ...request,
128
+ });
121
129
  return null;
122
130
  };
123
131
 
124
132
  sendRun: EditRequests["sendRun"] = async (request): Promise<null> => {
125
133
  await this.rpc.proxy.request.loadPackages(request.codes.join("\n"));
126
- await this.putControlRequest(request);
134
+ await this.putControlRequest({
135
+ type: "execute-cells",
136
+ ...request,
137
+ });
127
138
  return null;
128
139
  };
129
140
 
130
141
  sendModelValue: RunRequests["sendModelValue"] = async (request) => {
131
- await this.putControlRequest(request);
142
+ await this.putControlRequest({
143
+ type: "update-widget-model",
144
+ ...request,
145
+ });
132
146
  return null;
133
147
  };
134
148
 
@@ -187,7 +201,9 @@ export class IslandsPyodideBridge implements RunRequests, EditRequests {
187
201
  clearCache = throwNotImplemented;
188
202
  getCacheInfo = throwNotImplemented;
189
203
 
190
- private async putControlRequest(operation: object) {
204
+ // The kernel uses msgspec to parse control requests, which requires a 'type'
205
+ // field for discriminated union deserialization.
206
+ private async putControlRequest(operation: CommandMessage) {
191
207
  await this.rpc.proxy.request.bridge({
192
208
  functionName: "put_control_request",
193
209
  payload: operation,
@@ -1,11 +1,14 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
3
  import { useAtomValue } from "jotai";
4
+ import { ArrowLeftIcon } from "lucide-react";
4
5
  import { useEffect } from "react";
5
6
  import { AppContainer } from "@/components/editor/app-container";
6
7
  import { AppHeader } from "@/components/editor/header/app-header";
7
8
  import { Spinner } from "@/components/icons/spinner";
9
+ import { buttonVariants } from "@/components/ui/button";
8
10
  import { DelayMount } from "@/components/utils/delay-mount";
11
+ import { cn } from "@/utils/cn";
9
12
  import { CellsRenderer } from "../components/editor/renderers/cells-renderer";
10
13
  import { notebookIsRunningAtom, useCellActions } from "./cells/cells";
11
14
  import type { AppConfig } from "./config/config-schema";
@@ -75,15 +78,19 @@ export const RunApp: React.FC<AppProps> = ({ appConfig }) => {
75
78
  isRunning={isRunning}
76
79
  width={appConfig.width}
77
80
  >
78
- <AppHeader connection={connection} className={"sm:pt-8"}>
81
+ <AppHeader connection={connection} className="sm:pt-8">
79
82
  {galleryHref && (
80
- <div className="flex items-center px-6 pt-4">
83
+ <div className="flex items-center px-6 pt-4 sm:-mt-8">
81
84
  <a
82
85
  href={galleryHref}
83
86
  aria-label="Back to gallery"
84
- className="inline-flex items-center"
87
+ className={cn(
88
+ buttonVariants({ variant: "text", size: "sm" }),
89
+ "gap-2 px-0 text-muted-foreground hover:text-foreground",
90
+ )}
85
91
  >
86
- <img src="logo.png" alt="marimo logo" className="h-6 w-auto" />
92
+ <ArrowLeftIcon className="size-4" aria-hidden={true} />
93
+ <span>Back</span>
87
94
  </a>
88
95
  </div>
89
96
  )}