@marimo-team/frontend 0.23.3-dev3 → 0.23.3-dev33

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 (622) hide show
  1. package/dist/assets/{CellStatus-Dtymd7Mw.js → CellStatus-BRcxaA-Z.js} +1 -1
  2. package/dist/assets/{ConnectedDataExplorerComponent-ChNjqWW0.js → ConnectedDataExplorerComponent-Bxogo_Sw.js} +1 -1
  3. package/dist/assets/{DeferredRequestRegistry-C2V-hXrK.js → DeferredRequestRegistry-Bobqy1XF.js} +1 -1
  4. package/dist/assets/{ImperativeModal-CAFE3UV7.js → ImperativeModal-QWJWbLVR.js} +1 -1
  5. package/dist/assets/{JsonOutput-sWUD3O5F.js → JsonOutput-BLiYwyAC.js} +12 -12
  6. package/dist/assets/LazyAnyLanguageCodeMirror-B4dqgtrW.js +2 -0
  7. package/dist/assets/{MarimoErrorOutput-CUkxKVSp.js → MarimoErrorOutput-BWFFx2VQ.js} +1 -1
  8. package/dist/assets/{RSPContexts-CrATdGvz.js → RSPContexts-Bxv3gv46.js} +1 -1
  9. package/dist/assets/{RenderHTML-aOmkRy0R.js → RenderHTML-DweIff7M.js} +1 -1
  10. package/dist/assets/{add-cell-with-ai-apfqz2QF.js → add-cell-with-ai-BKhUWiT4.js} +1 -1
  11. package/dist/assets/{add-connection-dialog-D6XFTnTb.js → add-connection-dialog-C1aIq9FP.js} +1 -1
  12. package/dist/assets/{agent-panel-D7n2noTX.js → agent-panel-BF6fYTEU.js} +1 -1
  13. package/dist/assets/{ai-model-dropdown-CMNpHk5I.js → ai-model-dropdown-Cq8Bx0V5.js} +1 -1
  14. package/dist/assets/{any-language-editor-CFmH0GoP.js → any-language-editor-DxmolZrV.js} +1 -1
  15. package/dist/assets/apl-CuOurP-c.js +1 -0
  16. package/dist/assets/{app-config-button-CXAAPUFL.js → app-config-button-DA64Zwmh.js} +1 -1
  17. package/dist/assets/{arc-3DY1fURi.js → arc-dPVZ2r1X.js} +1 -1
  18. package/dist/assets/{architecture-7HQA4BMR-CKjkd5Dl.js → architecture-7HQA4BMR-CDlW2bIF.js} +1 -1
  19. package/dist/assets/{architectureDiagram-VXUJARFQ-x1tfs-Zy.js → architectureDiagram-VXUJARFQ-BIxSxJ1n.js} +1 -1
  20. package/dist/assets/asciiarmor-C4q0KAuh.js +1 -0
  21. package/dist/assets/asn1-gmsDz0li.js +1 -0
  22. package/dist/assets/{blockDiagram-VD42YOAC-DsnHpCid.js → blockDiagram-VD42YOAC-Bhz_qfg3.js} +1 -1
  23. package/dist/assets/brainfuck-RlYwG6Xx.js +1 -0
  24. package/dist/assets/{c4Diagram-YG6GDRKO-D32cjsO5.js → c4Diagram-YG6GDRKO-C2TPKPvJ.js} +1 -1
  25. package/dist/assets/{cache-panel-_zalrRwf.js → cache-panel-Ks8PpcN1.js} +1 -1
  26. package/dist/assets/{cell-editor-BUrhiKcX.js → cell-editor-DL4womh8.js} +3 -3
  27. package/dist/assets/{cell-link-owqfXuA4.js → cell-link-DiZacqDz.js} +1 -1
  28. package/dist/assets/{cells-BA9ZN5Xy.js → cells-_QgKZKXb.js} +5 -5
  29. package/dist/assets/channel-DrzQ4dkV.js +1 -0
  30. package/dist/assets/{chat-display-AB-C2j6p.js → chat-display-DyTcEZFU.js} +1 -1
  31. package/dist/assets/{chat-panel-C1Evz8wb.js → chat-panel-DVFjhDIb.js} +1 -1
  32. package/dist/assets/{chat-ui-CcArYoMw.js → chat-ui-CyIhz4-T.js} +1 -1
  33. package/dist/assets/{chunk-4BX2VUAB-hp7-9s5b.js → chunk-4BX2VUAB-BtkoEUm5.js} +1 -1
  34. package/dist/assets/chunk-55IACEB6-C0WB3ojj.js +1 -0
  35. package/dist/assets/{chunk-5FQGJX7Z-wbiBygI_.js → chunk-5FQGJX7Z-CQS0x34U.js} +3 -3
  36. package/dist/assets/{chunk-ABZYJK2D-CSzcbtsR.js → chunk-ABZYJK2D-Djqzm08o.js} +3 -3
  37. package/dist/assets/{chunk-ATLVNIR6-BGYBu2zE.js → chunk-ATLVNIR6-BLh4jD_n.js} +1 -1
  38. package/dist/assets/{chunk-B4BG7PRW-S78japIA.js → chunk-B4BG7PRW-CEbAymbQ.js} +1 -1
  39. package/dist/assets/{chunk-CVBHYZKI-DJ6aHNEG.js → chunk-CVBHYZKI-DU48rJVu.js} +1 -1
  40. package/dist/assets/{chunk-DI55MBZ5-B1Vz0MTl.js → chunk-DI55MBZ5-D27slPkl.js} +1 -1
  41. package/dist/assets/{chunk-EXTU4WIE-D-Spa6rW.js → chunk-EXTU4WIE-CIsrjnFi.js} +1 -1
  42. package/dist/assets/{chunk-FMBD7UC4-DiqdRLvx.js → chunk-FMBD7UC4-Dt9Umy1r.js} +1 -1
  43. package/dist/assets/{chunk-HN2XXSSU-CigyI152.js → chunk-HN2XXSSU-Bdbi3Mns.js} +1 -1
  44. package/dist/assets/{chunk-JA3XYJ7Z-BJGCDHDS.js → chunk-JA3XYJ7Z-BTrWHP3y.js} +1 -1
  45. package/dist/assets/{chunk-JZLCHNYA-lm1LBIfJ.js → chunk-JZLCHNYA-LclGfauS.js} +1 -1
  46. package/dist/assets/{chunk-MI3HLSF2-vtv46ho2.js → chunk-MI3HLSF2-n3vxgSbN.js} +1 -1
  47. package/dist/assets/{chunk-N4CR4FBY-BQWUF0Ly.js → chunk-N4CR4FBY-w0eE8xM0.js} +2 -2
  48. package/dist/assets/{chunk-QN33PNHL-Buv0c3y8.js → chunk-QN33PNHL-f1vj2iOo.js} +1 -1
  49. package/dist/assets/{chunk-QXUST7PY-tI3bGlcO.js → chunk-QXUST7PY-qfZjyLmh.js} +1 -1
  50. package/dist/assets/{chunk-QZHKN3VN-BWO63iFa.js → chunk-QZHKN3VN-Cp6Fo6NS.js} +1 -1
  51. package/dist/assets/{chunk-S3R3BYOJ-BwE-T8-d.js → chunk-S3R3BYOJ-CcarQkcq.js} +1 -1
  52. package/dist/assets/{chunk-TZMSLE5B-zQ3MzIy5.js → chunk-TZMSLE5B-CWbra1hF.js} +1 -1
  53. package/dist/assets/classDiagram-2ON5EDUG-BDDARHRt.js +1 -0
  54. package/dist/assets/classDiagram-v2-WZHVMYZB-DCy5PwnC.js +1 -0
  55. package/dist/assets/{clike-B5Yp94w5.js → clike-0Uxq7Mmj.js} +1 -1
  56. package/dist/assets/clojure-DaWCBM5I.js +1 -0
  57. package/dist/assets/cmake-Nobmxv0n.js +1 -0
  58. package/dist/assets/cobol--NmnvDWE.js +1 -0
  59. package/dist/assets/{code-block-37QAKDTI-Bf-3UT2Z.js → code-block-37QAKDTI-DIqDJgVj.js} +1 -1
  60. package/dist/assets/coffeescript-Cv1Wf46X.js +1 -0
  61. package/dist/assets/{column-preview-BbSZl4gC.js → column-preview-rQE4qc5R.js} +1 -1
  62. package/dist/assets/{command-DQS2IzwJ.js → command-DAtXz-Gx.js} +1 -1
  63. package/dist/assets/{command-palette-Cc7XXZHG.js → command-palette-Cd2q-HUO.js} +1 -1
  64. package/dist/assets/{common-CakcoJKZ.js → common-CP7IrRbz.js} +1 -1
  65. package/dist/assets/commonlisp-8PbUodZQ.js +1 -0
  66. package/dist/assets/{components-DVzYtTDe.js → components-BHpyAs_N.js} +1 -1
  67. package/dist/assets/components-C7yXo-zq.js +1 -0
  68. package/dist/assets/{config-Calf6e81.js → config-BwY7xK-l.js} +1 -1
  69. package/dist/assets/{context-BrNoqz7t.js → context-DgMiuV-M.js} +1 -1
  70. package/dist/assets/{copy-icon-D189KR4Z.js → copy-icon-D6J-Qe0V.js} +1 -1
  71. package/dist/assets/{cose-bilkent-S5V4N54A-DT_V8ZfF.js → cose-bilkent-S5V4N54A-w2ZbuMrq.js} +1 -1
  72. package/dist/assets/crystal-DOOJCjhq.js +1 -0
  73. package/dist/assets/{css-B68S0me4.js → css-vLkD8PfS.js} +1 -1
  74. package/dist/assets/cypher-Aazxis5r.js +1 -0
  75. package/dist/assets/d-B-5Jnu40.js +1 -0
  76. package/dist/assets/{dagre-6UL2VRFP-DGYXMu3i.js → dagre-6UL2VRFP-DPsGmD7I.js} +1 -1
  77. package/dist/assets/{data-grid-overlay-editor-CD6KDhh4.js → data-grid-overlay-editor--tsDL5t_.js} +1 -1
  78. package/dist/assets/{datasource-BZ77nRPA.js → datasource-BwNTnVse.js} +1 -1
  79. package/dist/assets/{dates-CtmdgiVR.js → dates-C-8zX5--.js} +1 -1
  80. package/dist/assets/{dependency-graph-panel-DJodxi-n.js → dependency-graph-panel-DWJUNQBd.js} +1 -1
  81. package/dist/assets/{diagram-PSM6KHXK-Df7m0-Bk.js → diagram-PSM6KHXK-B5QExXBA.js} +1 -1
  82. package/dist/assets/{diagram-QEK2KX5R-BC5JXjfp.js → diagram-QEK2KX5R-B-41avP4.js} +1 -1
  83. package/dist/assets/{diagram-S2PKOQOG-D6E97R3h.js → diagram-S2PKOQOG-CuAoGDsR.js} +1 -1
  84. package/dist/assets/diff-8GFZiZ2V.js +1 -0
  85. package/dist/assets/dist-2R4BmaTU.js +1 -0
  86. package/dist/assets/{dist-CD7-c8A4.js → dist-78cHWCwm.js} +1 -1
  87. package/dist/assets/dist-7la8MlmI.js +1 -0
  88. package/dist/assets/{dist-Cb9wJQiu.js → dist-B8l8kyRO.js} +1 -1
  89. package/dist/assets/{dist-BvefCWaz.js → dist-BCAHuLK8.js} +1 -1
  90. package/dist/assets/dist-BDO57Gzu.js +1 -0
  91. package/dist/assets/{dist-BwejP-9J.js → dist-Bd6jkjtM.js} +1 -1
  92. package/dist/assets/{dist-C5pbZROJ.js → dist-BfwIwU8S.js} +1 -1
  93. package/dist/assets/{dist-DSv2WUkf.js → dist-BjR_2YCR.js} +1 -1
  94. package/dist/assets/{dist-D8mC0RLm.js → dist-BxAV3E_D.js} +1 -1
  95. package/dist/assets/{dist-fKK_jBk2.js → dist-C6ZECnB-.js} +1 -1
  96. package/dist/assets/{dist-G8rBPeDP.js → dist-CE09e8bx.js} +1 -1
  97. package/dist/assets/dist-CYeDRMz-.js +1 -0
  98. package/dist/assets/{dist-G3xLh7ZX.js → dist-CZoX3_w7.js} +1 -1
  99. package/dist/assets/dist-Ct7IOnPn.js +1 -0
  100. package/dist/assets/{dist-CM2zL7eu.js → dist-D9A9VND-.js} +1 -1
  101. package/dist/assets/{dist-CSLszKKS.js → dist-DG5oYwLf.js} +1 -1
  102. package/dist/assets/dist-DMrvUyzG.js +1 -0
  103. package/dist/assets/{dist-DX-ejWLY.js → dist-DX7lwwkF.js} +1 -1
  104. package/dist/assets/dist-DbrS_VZM.js +1 -0
  105. package/dist/assets/{dist-D9brkCnf.js → dist-DrmtAiKa.js} +1 -1
  106. package/dist/assets/{dist-CdAQ8eZ9.js → dist-DrwAJH5c.js} +1 -1
  107. package/dist/assets/{dist-BuSjuYCJ.js → dist-DwRhpGvx.js} +1 -1
  108. package/dist/assets/{dist-BvpmHCI2.js → dist-EeiXxq6X.js} +1 -1
  109. package/dist/assets/dist-LftDLXf7.js +1 -0
  110. package/dist/assets/{dist-HIpA48xV.js → dist-Q7HIqK0H.js} +1 -1
  111. package/dist/assets/{dist-D8d8D49Y.js → dist-Sg8yY2ZO.js} +1 -1
  112. package/dist/assets/dist-TTJY3rXz.js +1 -0
  113. package/dist/assets/{dist-C2akIBaE.js → dist-b34Ig78W.js} +1 -1
  114. package/dist/assets/dist-u-Lxqf65.js +1 -0
  115. package/dist/assets/{dockerfile-COvjaTvv.js → dockerfile-BG4x0ExJ.js} +1 -1
  116. package/dist/assets/{documentation-panel-DMXEUS7v.js → documentation-panel-CZt-M5JN.js} +1 -1
  117. package/dist/assets/{download-rCRPD7IF.js → download-Bc8oaRxn.js} +1 -1
  118. package/dist/assets/dtd-DbhDFQ4b.js +1 -0
  119. package/dist/assets/dylan-4K5wZgOx.js +1 -0
  120. package/dist/assets/ecl-BCQ-LzuG.js +1 -0
  121. package/dist/assets/{edit-page-CK943x81.js → edit-page-BQ7AdKwV.js} +3 -3
  122. package/dist/assets/eiffel-DjgNAio4.js +1 -0
  123. package/dist/assets/elm-BJzUTgDF.js +1 -0
  124. package/dist/assets/{erDiagram-Q2GNP2WA-AvxewI5H.js → erDiagram-Q2GNP2WA-DnP7h2-r.js} +1 -1
  125. package/dist/assets/erlang-BMwCh1Tz.js +1 -0
  126. package/dist/assets/{error-banner-BxlXxssi.js → error-banner-B6M4W7BS.js} +1 -1
  127. package/dist/assets/{error-panel-4rKxybFL.js → error-panel-BN05vshu.js} +1 -1
  128. package/dist/assets/es-DpJU8Hx8.js +5 -0
  129. package/dist/assets/{esm-CcSYdGmP.js → esm-B4U2RMiA.js} +1 -1
  130. package/dist/assets/{esm-jhgLTcf6.js → esm-BGvvz4bU.js} +1 -1
  131. package/dist/assets/{factor-PbpmJuj6.js → factor-B-0VZGQP.js} +1 -1
  132. package/dist/assets/factor-DuQK79vi.js +1 -0
  133. package/dist/assets/{field-Dpiu3eud.js → field-Dolqshm5.js} +1 -1
  134. package/dist/assets/file-explorer-panel-Ci0Cz4JU.js +26 -0
  135. package/dist/assets/{file-icons-CSF7UWQn.js → file-icons-uyLXhwTt.js} +1 -1
  136. package/dist/assets/file-name-input-Cx8sGgtD.js +3 -0
  137. package/dist/assets/{floating-outline-DzcyDJwQ.js → floating-outline-CGwx3Uc3.js} +1 -1
  138. package/dist/assets/{flowDiagram-NV44I4VS-BqW0suiP.js → flowDiagram-NV44I4VS-V3Xf7aMp.js} +1 -1
  139. package/dist/assets/{focus-BRfyPUhi.js → focus-Ci7q4lAK.js} +1 -1
  140. package/dist/assets/{form-BUVFJb5I.js → form-BON4sAdY.js} +1 -1
  141. package/dist/assets/{formats-CQbVJYLi.js → formats-O_Kup2es.js} +1 -1
  142. package/dist/assets/{formatting-CbFi9xG8.js → formatting-cNkBQVu3.js} +1 -1
  143. package/dist/assets/forth-CN0H2hBb.js +1 -0
  144. package/dist/assets/fortran-D-JaE1fl.js +1 -0
  145. package/dist/assets/{gallery-page-ClCkynuR.js → gallery-page-ry801rEh.js} +1 -1
  146. package/dist/assets/{ganttDiagram-JELNMOA3-CeCvJWgC.js → ganttDiagram-JELNMOA3-CpnbMA7j.js} +1 -1
  147. package/dist/assets/gas-B-bID6UX.js +1 -0
  148. package/dist/assets/gherkin-JGxOpXhU.js +1 -0
  149. package/dist/assets/{gitGraph-G5XIXVHT-nrZ-BMna.js → gitGraph-G5XIXVHT-CT2LFSad.js} +1 -1
  150. package/dist/assets/{gitGraphDiagram-V2S2FVAM-Dn1AbOWu.js → gitGraphDiagram-V2S2FVAM-Da6kLjST.js} +1 -1
  151. package/dist/assets/{glide-data-editor-CKiZFI5U.js → glide-data-editor-Bsfs3Z8D.js} +4 -4
  152. package/dist/assets/{globals-DY_dRKpv.js → globals-fN2Lim68.js} +1 -1
  153. package/dist/assets/groovy-BHPB9Hfx.js +1 -0
  154. package/dist/assets/haskell-By6RbCCv.js +1 -0
  155. package/dist/assets/haxe-HQiVsOCF.js +1 -0
  156. package/dist/assets/home-page-CUCcuheh.js +4 -0
  157. package/dist/assets/{hooks-CK1ac3iV.js → hooks-CLXoEljg.js} +1 -1
  158. package/dist/assets/{html-to-image-BOWUS6J2.js → html-to-image-s8Gi2a0d.js} +1 -1
  159. package/dist/assets/idl-B2iocbwq.js +1 -0
  160. package/dist/assets/{index-DCq7udug.js → index-Flgwmpg_.js} +8 -8
  161. package/dist/assets/{info-VBDWY6EO-Bn_7XCeN.js → info-VBDWY6EO-Dek9l4Y7.js} +1 -1
  162. package/dist/assets/infoDiagram-HS3SLOUP-DbESo9Nm.js +2 -0
  163. package/dist/assets/{input-2egRGOhT.js → input-gOeJx-hY.js} +1 -1
  164. package/dist/assets/javascript-CTjlnOSz.js +1 -0
  165. package/dist/assets/{journeyDiagram-XKPGCS4Q-BQL61Vfo.js → journeyDiagram-XKPGCS4Q-BXrwe60A.js} +1 -1
  166. package/dist/assets/julia-BiUkdI9P.js +1 -0
  167. package/dist/assets/{kanban-definition-3W4ZIXB7-CMoUF4Qw.js → kanban-definition-3W4ZIXB7-DUU5VV3y.js} +1 -1
  168. package/dist/assets/katex-BpW3cI17.js +1 -0
  169. package/dist/assets/{kiosk-mode-BJNsfVZJ.js → kiosk-mode-PchJOoW7.js} +1 -1
  170. package/dist/assets/{layout-0Xp7ABJw.js → layout-B31_eP6P.js} +3 -3
  171. package/dist/assets/{line-BCZzhM6G.js → line-BGH_46b5.js} +1 -1
  172. package/dist/assets/{linear-DxS7NPzz.js → linear-DPcd3E-t.js} +1 -1
  173. package/dist/assets/{links-DhwG_EVu.js → links-DJCEkOLM.js} +1 -1
  174. package/dist/assets/livescript-uNIpKRlq.js +1 -0
  175. package/dist/assets/{logs-panel-bp6XOaLO.js → logs-panel-XG-10F8K.js} +1 -1
  176. package/dist/assets/{loro_wasm_bg-DpX928kr.js → loro_wasm_bg-BzwizXI_.js} +1 -1
  177. package/dist/assets/lua-CMIwWFMm.js +1 -0
  178. package/dist/assets/{markdown-renderer-3M2UXZOE.js → markdown-renderer-Cown6yO8.js} +3 -3
  179. package/dist/assets/mathematica-eDJrChdG.js +1 -0
  180. package/dist/assets/mbox-zqvBlhy3.js +1 -0
  181. package/dist/assets/mermaid-4DMBBIKO-CMn6CB3M.js +1 -0
  182. package/dist/assets/{mermaid-CI6k86rB.js → mermaid-LF8PrN7e.js} +3 -3
  183. package/dist/assets/{mermaid-parser.core-B0EhnNjP.js → mermaid-parser.core-C7QPzAah.js} +2 -2
  184. package/dist/assets/{mhchem-Bzl65iLm.js → mhchem-DJIKMDhe.js} +1 -1
  185. package/dist/assets/{mindmap-definition-VGOIOE7T-C0BN8YhO.js → mindmap-definition-VGOIOE7T-h5az-Gzm.js} +1 -1
  186. package/dist/assets/mirc-DA5aApOX.js +1 -0
  187. package/dist/assets/mllike-bIsNpdn1.js +1 -0
  188. package/dist/assets/modelica-0mx6heI0.js +1 -0
  189. package/dist/assets/mscgen-BKLWiiDn.js +1 -0
  190. package/dist/assets/mumps-5_kXgafg.js +1 -0
  191. package/dist/assets/{name-cell-input-CUkoykAD.js → name-cell-input-o3llo2cQ.js} +1 -1
  192. package/dist/assets/{nsis-BbDlITQ-.js → nsis-DGDbP9K4.js} +1 -1
  193. package/dist/assets/nsis-DOhuqhNG.js +1 -0
  194. package/dist/assets/ntriples-BWf6tqTo.js +1 -0
  195. package/dist/assets/{number-overlay-editor-DJEXT_Ye.js → number-overlay-editor-BNttkvY4.js} +1 -1
  196. package/dist/assets/octave-DmFvn7Va.js +1 -0
  197. package/dist/assets/{ordinal-DTOdb5Da.js → ordinal-COKHkltN.js} +1 -1
  198. package/dist/assets/{outline-panel-s7vxHE_P.js → outline-panel-DRIKTKZY.js} +1 -1
  199. package/dist/assets/oz-TIwA1cRs.js +1 -0
  200. package/dist/assets/{packages-panel-CDb4sauq.js → packages-panel-B6wpAt69.js} +1 -1
  201. package/dist/assets/{packet-DYOGHKS2-B53MIhbR.js → packet-DYOGHKS2-DlIjAe6N.js} +1 -1
  202. package/dist/assets/{panels-s8gQr6G_.js → panels-CfgYkAvQ.js} +1 -1
  203. package/dist/assets/pascal-BFfHjByI.js +1 -0
  204. package/dist/assets/pathUtils-B1w9iv-i.js +1 -0
  205. package/dist/assets/paths-2eb7kMpE.js +1 -0
  206. package/dist/assets/perl-iyEBGoKl.js +1 -0
  207. package/dist/assets/{pie-VRWISCQL-CsQYRyI_.js → pie-VRWISCQL-CY-XhoDk.js} +1 -1
  208. package/dist/assets/{pieDiagram-ADFJNKIX-CZ1pBex_.js → pieDiagram-ADFJNKIX-C8MBDnEw.js} +1 -1
  209. package/dist/assets/pig-Du8JEd9u.js +1 -0
  210. package/dist/assets/powershell-rJPOSwVp.js +1 -0
  211. package/dist/assets/{precisionRound-BMPhtTJQ.js → precisionRound-DaoicKhB.js} +1 -1
  212. package/dist/assets/{process-output-C6_eNZv8.js → process-output-D2bI7SXv.js} +1 -1
  213. package/dist/assets/properties-B7p1o35g.js +1 -0
  214. package/dist/assets/protobuf-DSVPm4uR.js +1 -0
  215. package/dist/assets/{pug-B2p6efPp.js → pug-5wW7Sn9S.js} +1 -1
  216. package/dist/assets/pug-BBnJinJ-.js +1 -0
  217. package/dist/assets/puppet-CvB_7oA0.js +1 -0
  218. package/dist/assets/python-D-LGD-zO.js +1 -0
  219. package/dist/assets/q-s96Dgstm.js +1 -0
  220. package/dist/assets/{quadrantDiagram-AYHSOK5B-D6LNQBr8.js → quadrantDiagram-AYHSOK5B-Behe9yHt.js} +1 -1
  221. package/dist/assets/r-DCKN0Q_M.js +1 -0
  222. package/dist/assets/{radar-ZZBFDIW7-DixuyYGz.js → radar-ZZBFDIW7-i-Te6Y8v.js} +1 -1
  223. package/dist/assets/react-vega-CPP33Ky2.js +1 -0
  224. package/dist/assets/{react-vega-D3GJC5Ll.js → react-vega-FSXcjjhW.js} +1 -1
  225. package/dist/assets/{readonly-python-code-BBLUUIbP.js → readonly-python-code-BahUauZ9.js} +1 -1
  226. package/dist/assets/{request-registry-yZbbPZkh.js → request-registry-BoWteoOD.js} +1 -1
  227. package/dist/assets/{requirementDiagram-UZGBJVZJ-BQCIkW22.js → requirementDiagram-UZGBJVZJ-BZ7h3AoJ.js} +1 -1
  228. package/dist/assets/{reveal-component-CT2scTNG.js → reveal-component-Bt3Epro6.js} +1 -1
  229. package/dist/assets/rpm-DKF6hj80.js +1 -0
  230. package/dist/assets/ruby-DrHWYpO-.js +1 -0
  231. package/dist/assets/{run-page-BebSJHhp.js → run-page-4lA-192f.js} +1 -1
  232. package/dist/assets/{sankeyDiagram-TZEHDZUN-WXVSVZRc.js → sankeyDiagram-TZEHDZUN-Co7WU0tF.js} +1 -1
  233. package/dist/assets/sas-Bf--oEyw.js +1 -0
  234. package/dist/assets/scheme-BZSq5_CL.js +1 -0
  235. package/dist/assets/{scratchpad-panel-CPn_yM49.js → scratchpad-panel-CiXkVXhL.js} +1 -1
  236. package/dist/assets/{secrets-panel-B6HrST_M.js → secrets-panel-Bxz9BsLr.js} +1 -1
  237. package/dist/assets/{sequenceDiagram-WL72ISMW-FSYTKWFS.js → sequenceDiagram-WL72ISMW-BKeDY4nC.js} +1 -1
  238. package/dist/assets/session-panel-oGdw6hvF.js +1 -0
  239. package/dist/assets/{share-CJEPnWjm.js → share-C7-yIyYZ.js} +1 -1
  240. package/dist/assets/shell-C5LsobAY.js +1 -0
  241. package/dist/assets/sieve-B6cTRfjv.js +1 -0
  242. package/dist/assets/{slide-CdqatvaH.js → slide-C5wPx0qL.js} +1 -1
  243. package/dist/assets/smalltalk-B-ZeF8oP.js +1 -0
  244. package/dist/assets/{snippets-panel-tfceTIEM.js → snippets-panel-C1g0FaLN.js} +1 -1
  245. package/dist/assets/sparql-hKgXdTt3.js +1 -0
  246. package/dist/assets/{spec-6oUobewY.js → spec-C-DRirsO.js} +1 -1
  247. package/dist/assets/{src-COk1uIaa.js → src-CWJKdmqu.js} +1 -1
  248. package/dist/assets/{state-Dlj7aAV2.js → state-BqtnroUI.js} +1 -1
  249. package/dist/assets/{state-INwBo8-b.js → state-CvCX-bpE.js} +1 -1
  250. package/dist/assets/state-DpMLCkRP.js +3 -0
  251. package/dist/assets/{state-SzKMGrBW.js → state-Vt0MLBrw.js} +1 -1
  252. package/dist/assets/{stateDiagram-FKZM4ZOC-NXeF8b27.js → stateDiagram-FKZM4ZOC-DEmCk9Rd.js} +1 -1
  253. package/dist/assets/stateDiagram-v2-4FDKWEC3-BnQZW9RQ.js +1 -0
  254. package/dist/assets/{step-COhf-b0R.js → step-BEsMOrhi.js} +1 -1
  255. package/dist/assets/stex-C5zzfAG3.js +1 -0
  256. package/dist/assets/stylus-MJ5VouuS.js +1 -0
  257. package/dist/assets/swift-jqL65uqK.js +1 -0
  258. package/dist/assets/{switch-CqJGGLBT.js → switch-QpkpQKr6.js} +1 -1
  259. package/dist/assets/tcl-D9FDKTky.js +1 -0
  260. package/dist/assets/{terminal-6UFUAGzf.js → terminal-CyaX8miJ.js} +1 -1
  261. package/dist/assets/{textarea-D2liylO5.js → textarea-DLywVJ2b.js} +1 -1
  262. package/dist/assets/textile-Ne1MkNjB.js +1 -0
  263. package/dist/assets/{time-hqD5bg84.js → time-C4Bk-t_8.js} +1 -1
  264. package/dist/assets/{timeline-definition-IT6M3QCI-B3aCCYAY.js → timeline-definition-IT6M3QCI-CNeWgYoO.js} +1 -1
  265. package/dist/assets/toml-Ba1TjbvG.js +1 -0
  266. package/dist/assets/{tracing-BUxVK-Z_.js → tracing-D5CN46rG.js} +1 -1
  267. package/dist/assets/tracing-panel-CoriopUM.js +2 -0
  268. package/dist/assets/tree-actions-BEhaM9eb.js +1 -0
  269. package/dist/assets/{treemap-GDKQZRPO-C7ssVrVz.js → treemap-GDKQZRPO-M0PfNVm7.js} +1 -1
  270. package/dist/assets/troff-ClRZFpM8.js +1 -0
  271. package/dist/assets/ttcn-JOxk9-wl.js +1 -0
  272. package/dist/assets/ttcn-cfg-D-oWP0t7.js +1 -0
  273. package/dist/assets/turtle-CfJStbTs.js +1 -0
  274. package/dist/assets/{useAddCell-xtQoaf-X.js → useAddCell-DtcrFkTf.js} +1 -1
  275. package/dist/assets/{useBoolean-D2Wc5G49.js → useBoolean-CZ3cQicK.js} +1 -1
  276. package/dist/assets/{useCellActionButton-DXgH5B4A.js → useCellActionButton-DLUN-oPD.js} +1 -1
  277. package/dist/assets/{useDateFormatter-_XK-fjTQ.js → useDateFormatter-DncW9tjn.js} +1 -1
  278. package/dist/assets/{useDeleteCell-C1_f7lEy.js → useDeleteCell-Y0BbfZjx.js} +1 -1
  279. package/dist/assets/{useDependencyPanelTab-PKhgm9-V.js → useDependencyPanelTab-BTOhjR-l.js} +1 -1
  280. package/dist/assets/{useInstallPackage-BHZ1EjqC.js → useInstallPackage-DQBOxUeJ.js} +1 -1
  281. package/dist/assets/{useNotebookActions-BPt4w3KQ.js → useNotebookActions-C-Vve9tT.js} +1 -1
  282. package/dist/assets/{useNumberFormatter-D_mZTdYK.js → useNumberFormatter-DYIfVU-H.js} +1 -1
  283. package/dist/assets/{usePress-Cj1lHaxt.js → usePress-BPoseSMY.js} +1 -1
  284. package/dist/assets/{useRunCells-cIxqHRwZ.js → useRunCells-Ce0N_5Wc.js} +1 -1
  285. package/dist/assets/{useSplitCell-B0qjEpW1.js → useSplitCell-Dby_-BDH.js} +1 -1
  286. package/dist/assets/{utils-DVodi8oQ.js → utils-B_ZkX8f0.js} +1 -1
  287. package/dist/assets/vb-DtMAcbIy.js +1 -0
  288. package/dist/assets/vbscript-CUB17r-X.js +1 -0
  289. package/dist/assets/{vega-component-Dh_sdcAu.js → vega-component-VkLCyBCX.js} +1 -1
  290. package/dist/assets/{vega-loader.browser-CRZ52CKf.js → vega-loader.browser-BlkwfOz9.js} +1 -1
  291. package/dist/assets/velocity-Dwo66olV.js +1 -0
  292. package/dist/assets/verilog-DuexQCyX.js +1 -0
  293. package/dist/assets/vhdl-Mgyyw75F.js +1 -0
  294. package/dist/assets/webidl-DZaOA0mR.js +1 -0
  295. package/dist/assets/{write-secret-modal-DNCTT09O.js → write-secret-modal-Chu5xifR.js} +1 -1
  296. package/dist/assets/xquery-DpQixCSm.js +1 -0
  297. package/dist/assets/{xychartDiagram-PRI3JC2R-eSL2LfH9.js → xychartDiagram-PRI3JC2R-eqzm3nQu.js} +1 -1
  298. package/dist/assets/yacas-B1gHpHXz.js +1 -0
  299. package/dist/assets/z80-IF9HkI5m.js +1 -0
  300. package/dist/index.html +93 -91
  301. package/package.json +2 -2
  302. package/src/components/editor/file-tree/__tests__/requesting-tree.test.ts +84 -2
  303. package/src/components/editor/file-tree/file-explorer.tsx +142 -203
  304. package/src/components/editor/file-tree/file-name-input.tsx +41 -0
  305. package/src/components/editor/file-tree/file-operations.tsx +266 -0
  306. package/src/components/editor/file-tree/renderers.tsx +1 -1
  307. package/src/components/editor/file-tree/requesting-tree.tsx +68 -49
  308. package/src/components/editor/output/JsonOutput.tsx +157 -4
  309. package/src/components/editor/output/__tests__/JsonOutput-mimetype.test.tsx +80 -0
  310. package/src/components/editor/output/__tests__/json-output.test.ts +147 -2
  311. package/src/components/home/state.ts +13 -1
  312. package/src/components/pages/home-page.tsx +116 -10
  313. package/src/core/islands/__tests__/bridge.test.ts +116 -5
  314. package/src/core/islands/bridge.ts +5 -1
  315. package/src/core/network/requests-network.ts +0 -3
  316. package/src/core/static/export-context.ts +43 -0
  317. package/src/plugins/core/__test__/trusted-url.test.ts +130 -18
  318. package/src/plugins/core/trusted-url.ts +23 -10
  319. package/src/plugins/impl/anywidget/__tests__/widget-binding.test.ts +29 -1
  320. package/src/plugins/impl/mpl-interactive/__tests__/MplInteractivePlugin.test.tsx +34 -0
  321. package/src/plugins/impl/panel/__tests__/PanelPlugin.test.ts +35 -2
  322. package/src/utils/__tests__/path.test.ts +20 -0
  323. package/src/utils/pathUtils.test.ts +141 -1
  324. package/src/utils/pathUtils.ts +46 -0
  325. package/src/utils/paths.ts +9 -1
  326. package/dist/assets/LazyAnyLanguageCodeMirror-BYkSpfWg.js +0 -2
  327. package/dist/assets/apl-ezh0ScS-.js +0 -1
  328. package/dist/assets/asciiarmor-DBqyln4y.js +0 -1
  329. package/dist/assets/asn1-C9Hie9a5.js +0 -1
  330. package/dist/assets/brainfuck-BDNU41Mw.js +0 -1
  331. package/dist/assets/channel-esN5troS.js +0 -1
  332. package/dist/assets/chunk-55IACEB6-C_BE0X2F.js +0 -1
  333. package/dist/assets/classDiagram-2ON5EDUG-BSpbvL3e.js +0 -1
  334. package/dist/assets/classDiagram-v2-WZHVMYZB-CQ49gdZV.js +0 -1
  335. package/dist/assets/clojure-DnkK3bSc.js +0 -1
  336. package/dist/assets/cmake-BnWrJdTV.js +0 -1
  337. package/dist/assets/cobol-HBrO1JaF.js +0 -1
  338. package/dist/assets/coffeescript-CRPuDhgD.js +0 -1
  339. package/dist/assets/commonlisp-Da4KcekY.js +0 -1
  340. package/dist/assets/components-eaRIBPb2.js +0 -1
  341. package/dist/assets/crystal-DSapLTsa.js +0 -1
  342. package/dist/assets/cypher-xFGoEou9.js +0 -1
  343. package/dist/assets/d-DgvhEIBQ.js +0 -1
  344. package/dist/assets/diff-_ncWAuCI.js +0 -1
  345. package/dist/assets/dist-BOBxlWRU.js +0 -1
  346. package/dist/assets/dist-C9byx33H.js +0 -1
  347. package/dist/assets/dist-CAjNwSwp.js +0 -1
  348. package/dist/assets/dist-ChEIZSwD.js +0 -1
  349. package/dist/assets/dist-DEsgb6r0.js +0 -1
  350. package/dist/assets/dist-DK65leDK.js +0 -1
  351. package/dist/assets/dist-DMIdeanR.js +0 -1
  352. package/dist/assets/dist-DlFpiRHv.js +0 -1
  353. package/dist/assets/dist-H-P6qorM.js +0 -1
  354. package/dist/assets/dist-vhQjV8kg.js +0 -1
  355. package/dist/assets/dtd-BnBIn3kr.js +0 -1
  356. package/dist/assets/dylan-CkGqQmFw.js +0 -1
  357. package/dist/assets/ecl-CFTIHpsV.js +0 -1
  358. package/dist/assets/eiffel-DqSKoxJh.js +0 -1
  359. package/dist/assets/elm-dL9c1n0U.js +0 -1
  360. package/dist/assets/erlang-ZIYI48gw.js +0 -1
  361. package/dist/assets/es-CjWf0wU3.js +0 -5
  362. package/dist/assets/factor-CDbckATe.js +0 -1
  363. package/dist/assets/file-explorer-panel-B5sFxYu1.js +0 -26
  364. package/dist/assets/forth-ClT6YoKq.js +0 -1
  365. package/dist/assets/fortran-D3wR_E-8.js +0 -1
  366. package/dist/assets/gas-_ShnzaTM.js +0 -1
  367. package/dist/assets/gherkin-LsHtc0Ns.js +0 -1
  368. package/dist/assets/groovy-D_Yv0Fac.js +0 -1
  369. package/dist/assets/haskell-qhM1HAIB.js +0 -1
  370. package/dist/assets/haxe-Bi62PpIr.js +0 -1
  371. package/dist/assets/home-page-BvfssQ5c.js +0 -4
  372. package/dist/assets/idl-CI42bOaI.js +0 -1
  373. package/dist/assets/infoDiagram-HS3SLOUP-DTO3Z6Cg.js +0 -2
  374. package/dist/assets/javascript-BNZ5YnSy.js +0 -1
  375. package/dist/assets/julia-dpVUKOp6.js +0 -1
  376. package/dist/assets/katex-B5wxkMHB.js +0 -1
  377. package/dist/assets/livescript-BDwSUbUd.js +0 -1
  378. package/dist/assets/lua-cGUKNtb5.js +0 -1
  379. package/dist/assets/mathematica-D4XScfvP.js +0 -1
  380. package/dist/assets/mbox-COnP75oc.js +0 -1
  381. package/dist/assets/mermaid-4DMBBIKO-D-U6KmKa.js +0 -1
  382. package/dist/assets/mirc-DXskkW6M.js +0 -1
  383. package/dist/assets/mllike-B3ebn_fS.js +0 -1
  384. package/dist/assets/modelica-Df8_BOFz.js +0 -1
  385. package/dist/assets/mscgen-ugK6iLdl.js +0 -1
  386. package/dist/assets/mumps-Qes0D9Sq.js +0 -1
  387. package/dist/assets/nsis-CvTk2ElD.js +0 -1
  388. package/dist/assets/ntriples-BrWSHgAl.js +0 -1
  389. package/dist/assets/octave--UXUC2au.js +0 -1
  390. package/dist/assets/oz-SCICUQnB.js +0 -1
  391. package/dist/assets/pascal-BZRIRN0Y.js +0 -1
  392. package/dist/assets/paths-DsQUzvvb.js +0 -1
  393. package/dist/assets/perl-BJBf_VRX.js +0 -1
  394. package/dist/assets/pig-8VtGvtGP.js +0 -1
  395. package/dist/assets/powershell-MUdKU-yo.js +0 -1
  396. package/dist/assets/properties-B_YTP79K.js +0 -1
  397. package/dist/assets/protobuf-BjqtN1d3.js +0 -1
  398. package/dist/assets/pug-pCMDyY3V.js +0 -1
  399. package/dist/assets/puppet-ByNusmmY.js +0 -1
  400. package/dist/assets/python-CeK7Mdg6.js +0 -1
  401. package/dist/assets/q-BPLn3RjU.js +0 -1
  402. package/dist/assets/r-C6hL19P_.js +0 -1
  403. package/dist/assets/react-vega-B2Q2ObPu.js +0 -1
  404. package/dist/assets/rpm-Cepx5AK5.js +0 -1
  405. package/dist/assets/ruby-8a_JNJtC.js +0 -1
  406. package/dist/assets/sas-DRXu6Kkn.js +0 -1
  407. package/dist/assets/scheme-DaBlDkbO.js +0 -1
  408. package/dist/assets/session-panel-CfLYfSX2.js +0 -1
  409. package/dist/assets/shell-CEmng-T5.js +0 -1
  410. package/dist/assets/sieve-CTG31Wbe.js +0 -1
  411. package/dist/assets/smalltalk-DlBjAIRH.js +0 -1
  412. package/dist/assets/sparql-D8XQtNgL.js +0 -1
  413. package/dist/assets/state-BFFSWzNE.js +0 -3
  414. package/dist/assets/stateDiagram-v2-4FDKWEC3-co6cLoce.js +0 -1
  415. package/dist/assets/stex-CXcPf-7C.js +0 -1
  416. package/dist/assets/stylus-DpfM4Y-0.js +0 -1
  417. package/dist/assets/swift-Bevjlmsx.js +0 -1
  418. package/dist/assets/tcl-CWB1W9St.js +0 -1
  419. package/dist/assets/textile-DrGyKlBQ.js +0 -1
  420. package/dist/assets/toml-CF49H3Gs.js +0 -1
  421. package/dist/assets/tracing-panel-BZQdh8Uh.js +0 -2
  422. package/dist/assets/tree-Dtn4o2IZ.js +0 -3
  423. package/dist/assets/troff-DS9glUnj.js +0 -1
  424. package/dist/assets/ttcn-cfg-D8JUANmi.js +0 -1
  425. package/dist/assets/ttcn-iXXxBDpr.js +0 -1
  426. package/dist/assets/turtle-IsYxGpD1.js +0 -1
  427. package/dist/assets/vb-CJBc18Ui.js +0 -1
  428. package/dist/assets/vbscript-f-536WNP.js +0 -1
  429. package/dist/assets/velocity-BKcC2FIu.js +0 -1
  430. package/dist/assets/verilog-BwwsdDY5.js +0 -1
  431. package/dist/assets/vhdl-BG8PfJd8.js +0 -1
  432. package/dist/assets/webidl-BHBWV-F6.js +0 -1
  433. package/dist/assets/xquery-BSuR2Wlv.js +0 -1
  434. package/dist/assets/yacas-DdJ1FiXV.js +0 -1
  435. package/dist/assets/z80-BWehJ3ot.js +0 -1
  436. /package/dist/assets/{Deferred-Bk0r4KDZ.js → Deferred-CcWopv8N.js} +0 -0
  437. /package/dist/assets/{ImageComparisonComponent-BDf80c-c.js → ImageComparisonComponent-BbeHudzx.js} +0 -0
  438. /package/dist/assets/{Inputs-kqHYE7dL.js → Inputs-BJt-xWQ4.js} +0 -0
  439. /package/dist/assets/{Plot-Dw2rpqfa.js → Plot-NkctaBpw.js} +0 -0
  440. /package/dist/assets/{SSRProvider-1sSrgJwI.js → SSRProvider-ChaJ6dv8.js} +0 -0
  441. /package/dist/assets/{apl-BYqtBlld.js → apl-CArdF_Ee.js} +0 -0
  442. /package/dist/assets/{array-BF0shS9G.js → array-vLcKmV3f.js} +0 -0
  443. /package/dist/assets/{asciiarmor-DUW0Iozu.js → asciiarmor-rf6n_8YZ.js} +0 -0
  444. /package/dist/assets/{asn1-ClnHsHDP.js → asn1-Bl4vlAxN.js} +0 -0
  445. /package/dist/assets/{asterisk-CO_c0gwL.js → asterisk-B04IJwAt.js} +0 -0
  446. /package/dist/assets/{azure-BGC9_IAe.js → azure-DZ9IQ5nj.js} +0 -0
  447. /package/dist/assets/{badge-IqsYSyWB.js → badge-OeIzJ2Mo.js} +0 -0
  448. /package/dist/assets/{blob-CpeNXBj-.js → blob-Gsfvuteh.js} +0 -0
  449. /package/dist/assets/{brainfuck-FB_E90sw.js → brainfuck-CWRjg_-2.js} +0 -0
  450. /package/dist/assets/{card-DaCTzD6y.js → card-CVZJbqix.js} +0 -0
  451. /package/dist/assets/{chunk-4F5CHEZ2-CiW94ehv.js → chunk-4F5CHEZ2-Cw8YQRir.js} +0 -0
  452. /package/dist/assets/{chunk-B2363JML-Dj_BsGfX.js → chunk-B2363JML-BSJ4A4O7.js} +0 -0
  453. /package/dist/assets/{chunk-DR5Q36YT-CCzZb1o4.js → chunk-DR5Q36YT-BAovSO-b.js} +0 -0
  454. /package/dist/assets/{chunk-FRFDVMJY-BB5sTbw6.js → chunk-FRFDVMJY-Ca8ZLUo3.js} +0 -0
  455. /package/dist/assets/{chunk-PL6DKKU2-BVOKRgy0.js → chunk-PL6DKKU2-BjuKxBfi.js} +0 -0
  456. /package/dist/assets/{chunk-SJTYNZTY-BY2Gu6VM.js → chunk-SJTYNZTY-wqlkd3w7.js} +0 -0
  457. /package/dist/assets/{chunk-TQ3KTPDO-BXqsqDoM.js → chunk-TQ3KTPDO-BUikk8OW.js} +0 -0
  458. /package/dist/assets/{chunk-UMXZTB3W-2RQe-UTW.js → chunk-UMXZTB3W-lROkSRJ2.js} +0 -0
  459. /package/dist/assets/{clear-button-hXGBrmNq.js → clear-button-cQS2Q-bl.js} +0 -0
  460. /package/dist/assets/{click-outside-container-7UXGgq-9.js → click-outside-container-ChOZeHlm.js} +0 -0
  461. /package/dist/assets/{clike-B7PZCnaI.js → clike-B4xEkWXN.js} +0 -0
  462. /package/dist/assets/{clojure-DtLrahuY.js → clojure-04C6o-hL.js} +0 -0
  463. /package/dist/assets/{cmake-DGfhkTv5.js → cmake-Dh64a3j4.js} +0 -0
  464. /package/dist/assets/{cobol-Cpbk-vCU.js → cobol-B24ofC4q.js} +0 -0
  465. /package/dist/assets/{coffeescript-BATQF8kE.js → coffeescript-B0i0O-b-.js} +0 -0
  466. /package/dist/assets/{colors-C3_wIR8c.js → colors-CgemTayT.js} +0 -0
  467. /package/dist/assets/{common-keywords-CvypSGuw.js → common-keywords-D6ImdZX8.js} +0 -0
  468. /package/dist/assets/{commonlisp-C9N48zGs.js → commonlisp-NXg-Bye5.js} +0 -0
  469. /package/dist/assets/{copy-BnK_ki61.js → copy-MpDsCBB6.js} +0 -0
  470. /package/dist/assets/{crystal-D2nrZv1k.js → crystal-BOjNTZjx.js} +0 -0
  471. /package/dist/assets/{css-DNoZFvlx.js → css-C_vknI7E.js} +0 -0
  472. /package/dist/assets/{cypher-6TFCZzgE.js → cypher-DwQoZmH9.js} +0 -0
  473. /package/dist/assets/{cytoscape.esm-BihqZ2_-.js → cytoscape.esm-BUYfy0ER.js} +0 -0
  474. /package/dist/assets/{d-DHH1X7PS.js → d-xedQGhmO.js} +0 -0
  475. /package/dist/assets/{defaultLocale-D_rSvXvJ.js → defaultLocale-CIhzTQNN.js} +0 -0
  476. /package/dist/assets/{defaultLocale-C92Rrpmf.js → defaultLocale-CUv_V9gw.js} +0 -0
  477. /package/dist/assets/{dialog-CqE8CV1Y.js → dialog-BEgS5oXa.js} +0 -0
  478. /package/dist/assets/{diff-DNDp4fOd.js → diff-ChFnp8JW.js} +0 -0
  479. /package/dist/assets/{dist-DfWgLTCQ.js → dist-B4jGC5bx.js} +0 -0
  480. /package/dist/assets/{dist-Dg3CCt0r.js → dist-BNScjj64.js} +0 -0
  481. /package/dist/assets/{dist-a6hqEAyw.js → dist-ByJngTCJ.js} +0 -0
  482. /package/dist/assets/{dist-D-j2KFQ4.js → dist-C1VXabOr.js} +0 -0
  483. /package/dist/assets/{dist-Bgd1ZX49.js → dist-Cqk8HSav.js} +0 -0
  484. /package/dist/assets/{dist-idZNafp8.js → dist-D80LaxlS.js} +0 -0
  485. /package/dist/assets/{dist-B5ONF0fx.js → dist-DdzMFGlM.js} +0 -0
  486. /package/dist/assets/{dist-Ct7BBGwl.js → dist-FpqIkji6.js} +0 -0
  487. /package/dist/assets/{dist-B804XDz9.js → dist-R9N_YrBH.js} +0 -0
  488. /package/dist/assets/{dist-D8llshvP.js → dist-SITbEFUx.js} +0 -0
  489. /package/dist/assets/{dist-DDWNnRcK.js → dist-fKKpzSr2.js} +0 -0
  490. /package/dist/assets/{dist-CpbLJKXc.js → dist-fOLN5Vji.js} +0 -0
  491. /package/dist/assets/{dist-BiQrY0m-.js → dist-wsxxqJfJ.js} +0 -0
  492. /package/dist/assets/{dtd-BYdB19UC.js → dtd-KbDPyUs4.js} +0 -0
  493. /package/dist/assets/{duckdb-keywords-C63auBrb.js → duckdb-keywords-5i8us9ML.js} +0 -0
  494. /package/dist/assets/{dylan-3sqQfqPE.js → dylan-0KH4Nowk.js} +0 -0
  495. /package/dist/assets/{ebnf-CJQ7hlUt.js → ebnf--2SLsnbd.js} +0 -0
  496. /package/dist/assets/{ecl-79y60Sdt.js → ecl-B5iM_b7s.js} +0 -0
  497. /package/dist/assets/{eiffel-Cy1qkCDz.js → eiffel-sVM1STl5.js} +0 -0
  498. /package/dist/assets/{elm-DrRzHEES.js → elm-BlNENVB6.js} +0 -0
  499. /package/dist/assets/{emotion-is-prop-valid.esm-UWgehH47.js → emotion-is-prop-valid.esm-BvF4JMSP.js} +0 -0
  500. /package/dist/assets/{empty-state-CrP10sqm.js → empty-state-CPvr0RGL.js} +0 -0
  501. /package/dist/assets/{en-US-B8TXLgVt.js → en-US-BXVprI6a.js} +0 -0
  502. /package/dist/assets/{erlang-D3BTE-y0.js → erlang-C0uOSFok.js} +0 -0
  503. /package/dist/assets/{errors-DVkmLSXX.js → errors-pt9sYxVM.js} +0 -0
  504. /package/dist/assets/{esm-vpVfqVb3.js → esm-D6KjvJkM.js} +0 -0
  505. /package/dist/assets/{events-CWUex2qo.js → events-CKqlBGzI.js} +0 -0
  506. /package/dist/assets/{extends-q1GgI0Ag.js → extends-DYqjHZ5t.js} +0 -0
  507. /package/dist/assets/{fcl-BM8Miy5A.js → fcl-CcJxrJDr.js} +0 -0
  508. /package/dist/assets/{forth-DGce5eRS.js → forth-Dkvgp5v0.js} +0 -0
  509. /package/dist/assets/{fortran-CS97oQQW.js → fortran-DWGt9NN5.js} +0 -0
  510. /package/dist/assets/{gas-7e_zvN4u.js → gas-ucVnXY28.js} +0 -0
  511. /package/dist/assets/{gherkin-3f1nzx4Y.js → gherkin-BRjIORXo.js} +0 -0
  512. /package/dist/assets/{groovy-Bn1MvSId.js → groovy-BwyAyRPC.js} +0 -0
  513. /package/dist/assets/{haskell-qtyafuM6.js → haskell-Cs-Andhs.js} +0 -0
  514. /package/dist/assets/{haxe-CQwWk_Ht.js → haxe-BW46cyaq.js} +0 -0
  515. /package/dist/assets/{http-DJG1eSBi.js → http-BBXW5Cu0.js} +0 -0
  516. /package/dist/assets/{idl-BnUby_AK.js → idl-BGiQ18ct.js} +0 -0
  517. /package/dist/assets/{init-AtRnKt23.js → init-NRxdWJN-.js} +0 -0
  518. /package/dist/assets/{isValid-KoNx_uxe.js → isValid-BBUyUJly.js} +0 -0
  519. /package/dist/assets/{javascript-BFKHKHDt.js → javascript-I9_Q-6Fg.js} +0 -0
  520. /package/dist/assets/{julia-BZeLe6be.js → julia-Wfay9brY.js} +0 -0
  521. /package/dist/assets/{katex-Bc4cO2Ba.js → katex-BIY1ztUE.js} +0 -0
  522. /package/dist/assets/{livescript-LB6oZdgV.js → livescript-J6EnSQWw.js} +0 -0
  523. /package/dist/assets/{loro_wasm_bg-DSqjo7Pf.js → loro_wasm_bg-BAHdi7Mz.js} +0 -0
  524. /package/dist/assets/{lua-D73MeF_d.js → lua-BO_knq_Q.js} +0 -0
  525. /package/dist/assets/{marimo-icons-Ce24dQVN.js → marimo-icons-ifBE8yqY.js} +0 -0
  526. /package/dist/assets/{math-BIeW4iGV.js → math-CIWU-TqO.js} +0 -0
  527. /package/dist/assets/{mathematica-SckqhulL.js → mathematica-DU8ikXHk.js} +0 -0
  528. /package/dist/assets/{mbox-DpdjYR8y.js → mbox-Dzzw6MxI.js} +0 -0
  529. /package/dist/assets/{mirc-9Mp8ii_5.js → mirc-82uLLidC.js} +0 -0
  530. /package/dist/assets/{mllike-CteazA5r.js → mllike-WTbu2PGL.js} +0 -0
  531. /package/dist/assets/{modelica-DruS-uJ8.js → modelica-w4uKZrXu.js} +0 -0
  532. /package/dist/assets/{mscgen-Dqm6ZJyo.js → mscgen-Bf7m7BDT.js} +0 -0
  533. /package/dist/assets/{multi-icon-nJMmVh2f.js → multi-icon-CPhrdW6o.js} +0 -0
  534. /package/dist/assets/{mumps-DAwJeUn4.js → mumps-Bicgf-gh.js} +0 -0
  535. /package/dist/assets/{nginx-B_wjuKSa.js → nginx-CiiHaY6Q.js} +0 -0
  536. /package/dist/assets/{node-sql-parser-UQ9Ur_LP.js → node-sql-parser-DllVaz4k.js} +0 -0
  537. /package/dist/assets/{ntriples-D5_p8srT.js → ntriples-CyotCBD4.js} +0 -0
  538. /package/dist/assets/{numbers-epUg4eUW.js → numbers-CHuwXNCA.js} +0 -0
  539. /package/dist/assets/{objectWithoutPropertiesLoose-BQlZis3f.js → objectWithoutPropertiesLoose-CUZPaRZf.js} +0 -0
  540. /package/dist/assets/{octave-StxXX2kg.js → octave-BP7UuRZ-.js} +0 -0
  541. /package/dist/assets/{oz-CZcv8Gut.js → oz-C9dsRBsA.js} +0 -0
  542. /package/dist/assets/{panel-context-DgIiEtMa.js → panel-context-S-AFWBnz.js} +0 -0
  543. /package/dist/assets/{pascal-BTSTYf7j.js → pascal-Do-HizJs.js} +0 -0
  544. /package/dist/assets/{path-BMloFSsK.js → path-CQRzwJPY.js} +0 -0
  545. /package/dist/assets/{perl-D3WNCnWS.js → perl-DkWjygEp.js} +0 -0
  546. /package/dist/assets/{pig-m1LfHx7X.js → pig-C5cO5Lzu.js} +0 -0
  547. /package/dist/assets/{play-CEytussU.js → play-DSUm4sBu.js} +0 -0
  548. /package/dist/assets/{plus-BueqiM86.js → plus-DgRbTQuK.js} +0 -0
  549. /package/dist/assets/{powershell-C7evXFhK.js → powershell-B7iMkhi7.js} +0 -0
  550. /package/dist/assets/{preload-helper-BFv3hW2s.js → preload-helper-DXnewu3N.js} +0 -0
  551. /package/dist/assets/{prop-types-D9vVr8W2.js → prop-types-CMQyZoIm.js} +0 -0
  552. /package/dist/assets/{properties-CX3A241c.js → properties-BojS2wNP.js} +0 -0
  553. /package/dist/assets/{protobuf-CEqDY4vo.js → protobuf-C3jQLUT4.js} +0 -0
  554. /package/dist/assets/{puppet-DlFBPmUd.js → puppet-BIu7yw7Q.js} +0 -0
  555. /package/dist/assets/{purify.es-Cg0r2qW-.js → purify.es-Lm0LKKB_.js} +0 -0
  556. /package/dist/assets/{python-kNH0316T.js → python-BvK-LeGt.js} +0 -0
  557. /package/dist/assets/{q-KQ_N2MXi.js → q-DxTFD_3l.js} +0 -0
  558. /package/dist/assets/{r-Dj_WdT8c.js → r-D9kMb9Pl.js} +0 -0
  559. /package/dist/assets/{range-Bc7-zhbC.js → range-l5y19iar.js} +0 -0
  560. /package/dist/assets/{react-icons.esm-B8rtE4cC.js → react-icons.esm-CwO5-6Hf.js} +0 -0
  561. /package/dist/assets/{refresh-ccw-BuMhEaS9.js → refresh-ccw-B-iu4wyD.js} +0 -0
  562. /package/dist/assets/{refresh-cw-BmiNHssk.js → refresh-cw-C6hZr6dA.js} +0 -0
  563. /package/dist/assets/{requests-DdU2Ap88.js → requests-dD3-AncY.js} +0 -0
  564. /package/dist/assets/{rotate-ccw-Bwso-5RT.js → rotate-ccw-CMEpyC--.js} +0 -0
  565. /package/dist/assets/{rpm-C3VyCeYo.js → rpm-DMBmptJ_.js} +0 -0
  566. /package/dist/assets/{ruby-9RpAFOsP.js → ruby-Bi66LQBu.js} +0 -0
  567. /package/dist/assets/{runs-BBFoea9K.js → runs-5FOfd9Cy.js} +0 -0
  568. /package/dist/assets/{sas-CFBIkOrK.js → sas-DDMCLlZz.js} +0 -0
  569. /package/dist/assets/{save-B_q9ApPf.js → save-B5tS7kkh.js} +0 -0
  570. /package/dist/assets/{scheme-n4WmsRUQ.js → scheme-MngEI34z.js} +0 -0
  571. /package/dist/assets/{session-DdhIEena.js → session-DI1agD5_.js} +0 -0
  572. /package/dist/assets/{settings-C_KZ1Eue.js → settings-DDffqDzb.js} +0 -0
  573. /package/dist/assets/{shell-BDAgpmgp.js → shell-BSVgrHzY.js} +0 -0
  574. /package/dist/assets/{sieve-BVNIn7Yz.js → sieve-DvUWNrPv.js} +0 -0
  575. /package/dist/assets/{simple-mode-C-nP-kAb.js → simple-mode-DxeVZov3.js} +0 -0
  576. /package/dist/assets/{smalltalk-C7nE9dmX.js → smalltalk-CeZ66qpG.js} +0 -0
  577. /package/dist/assets/{solr-CU1BrlpT.js → solr-DYYuHZ7Q.js} +0 -0
  578. /package/dist/assets/{sparkles-BRTQ46qC.js → sparkles-C9V_hOqY.js} +0 -0
  579. /package/dist/assets/{sparql-DPFIzZM3.js → sparql-oFx_t7AO.js} +0 -0
  580. /package/dist/assets/{spreadsheet-DwP77QON.js → spreadsheet-hVThRh5Z.js} +0 -0
  581. /package/dist/assets/{sql-CBifPEyZ.js → sql-DG1AJQLP.js} +0 -0
  582. /package/dist/assets/{square-function-DN3RwIjj.js → square-function-iLrgnnoW.js} +0 -0
  583. /package/dist/assets/{src-DSbF9mby.js → src-CsZby044.js} +0 -0
  584. /package/dist/assets/{stex--zUcZkER.js → stex-CHLzTK9d.js} +0 -0
  585. /package/dist/assets/{stylus-DGcebGVS.js → stylus-KE-9LQSK.js} +0 -0
  586. /package/dist/assets/{swift-DiAJo7C6.js → swift-A-ZhZWU8.js} +0 -0
  587. /package/dist/assets/{swiper-component-BIp7oQxt.js → swiper-component-DL6ct72W.js} +0 -0
  588. /package/dist/assets/{tcl-DpD837eJ.js → tcl-CREXWwrr.js} +0 -0
  589. /package/dist/assets/{textile-DEqOicm6.js → textile-Cj8L4qVJ.js} +0 -0
  590. /package/dist/assets/{tiddlywiki-CqVNI8lH.js → tiddlywiki-Dc8c_QaF.js} +0 -0
  591. /package/dist/assets/{tiki-BIINIJTn.js → tiki-CwGnGueS.js} +0 -0
  592. /package/dist/assets/{timer-DwQQMK5T.js → timer-CEUQS2Fi.js} +0 -0
  593. /package/dist/assets/{toml-BdA-7EhB.js → toml-BwSlV2Pt.js} +0 -0
  594. /package/dist/assets/{trash-2-C5AzNaHr.js → trash-2-3m1rZsYE.js} +0 -0
  595. /package/dist/assets/{trash-BUseJO4n.js → trash-D89_qya1.js} +0 -0
  596. /package/dist/assets/{treemap-DqSsE4KM.js → treemap-BYvDYG1E.js} +0 -0
  597. /package/dist/assets/{triangle-alert-CBEvAwaa.js → triangle-alert-Bt-v8HXv.js} +0 -0
  598. /package/dist/assets/{troff-iGRgQHLe.js → troff-DWonWT6V.js} +0 -0
  599. /package/dist/assets/{ttcn-CLQ1c3XL.js → ttcn--CHQduBW.js} +0 -0
  600. /package/dist/assets/{ttcn-cfg-BFj90pgD.js → ttcn-cfg-Cei3Mnk3.js} +0 -0
  601. /package/dist/assets/{turtle-DwFVq6UC.js → turtle-BaGuNPTf.js} +0 -0
  602. /package/dist/assets/{types-D8yP89N6.js → types-DOdUT9LT.js} +0 -0
  603. /package/dist/assets/{types-Bpx1EWqM.js → types-jWhVbgX6.js} +0 -0
  604. /package/dist/assets/{use-toast-PYIpV284.js → use-toast-DZOInYtM.js} +0 -0
  605. /package/dist/assets/{useDebounce-BxKDvvzN.js → useDebounce-C0E828y0.js} +0 -0
  606. /package/dist/assets/{useDeepCompareMemoize-pHFuC8FJ.js → useDeepCompareMemoize-606Ao2HX.js} +0 -0
  607. /package/dist/assets/{useHotkey-j1wCvjNq.js → useHotkey-DMv61Udq.js} +0 -0
  608. /package/dist/assets/{useInterval-BePSL0QQ.js → useInterval-zx_Q7num.js} +0 -0
  609. /package/dist/assets/{useTheme-AmxLvSQ5.js → useTheme-DhrO1NvC.js} +0 -0
  610. /package/dist/assets/{uuid-CCkGk34L.js → uuid-D_ujsK2Y.js} +0 -0
  611. /package/dist/assets/{vb-gm5P9Pn5.js → vb-DQgwufRi.js} +0 -0
  612. /package/dist/assets/{vbscript-gQvKiDdU.js → vbscript-B66XhQhu.js} +0 -0
  613. /package/dist/assets/{velocity-CkfRmD_d.js → velocity-D7CxwqhZ.js} +0 -0
  614. /package/dist/assets/{verilog-D3b05tu1.js → verilog-SCT9zECa.js} +0 -0
  615. /package/dist/assets/{vhdl-DRo1SU3e.js → vhdl-Bz6d75os.js} +0 -0
  616. /package/dist/assets/{web-vitals-CUbDLLN1.js → web-vitals-CMDkd9l8.js} +0 -0
  617. /package/dist/assets/{webidl-DFtmGFay.js → webidl-B7LbwCfy.js} +0 -0
  618. /package/dist/assets/{workflow-ktgLxNKJ.js → workflow-CyJEIDjL.js} +0 -0
  619. /package/dist/assets/{ws-BV-4clkP.js → ws-Bim0WMvW.js} +0 -0
  620. /package/dist/assets/{xquery-CzUikajR.js → xquery-BOMK2ySj.js} +0 -0
  621. /package/dist/assets/{yacas-BqvQWbYq.js → yacas-Yk74VuuD.js} +0 -0
  622. /package/dist/assets/{z80-CQqkYd-2.js → z80-BQKQ7DhX.js} +0 -0
@@ -10,6 +10,7 @@ import { generateUUID } from "@/utils/uuid";
10
10
  import type { CommandMessage, NotificationPayload } from "../kernel/messages";
11
11
  import type { EditRequests, RunRequests } from "../network/types";
12
12
  import { store as defaultStore } from "../state/jotai";
13
+ import { getMarimoExportContext } from "../static/export-context";
13
14
  import { createMarimoFile, parseMarimoIslandApps } from "./parse";
14
15
  import { islandsInitializedAtom } from "./state";
15
16
  import type { WorkerSchema } from "./worker/worker";
@@ -123,8 +124,11 @@ export class IslandsPyodideBridge implements RunRequests, EditRequests {
123
124
  `Starting sessions for ${apps.length} app(s):`,
124
125
  apps.map((a) => `${a.id} (${a.cells.length} cells)`),
125
126
  );
127
+ const exportContext =
128
+ apps.length === 1 ? getMarimoExportContext() : undefined;
129
+ const notebookCode = exportContext?.notebookCode;
126
130
  for (const app of apps) {
127
- const file = createMarimoFile(app);
131
+ const file = notebookCode || createMarimoFile(app);
128
132
  Logger.debug(`App ${app.id} marimo file:\n`, file);
129
133
  this.startSession({
130
134
  code: file,
@@ -305,7 +305,6 @@ export function createNetworkRequests(): EditRequests & RunRequests {
305
305
  .then(handleResponse);
306
306
  },
307
307
  sendDeleteFileOrFolder: async (request) => {
308
- await waitForConnectionOpen();
309
308
  return getClient()
310
309
  .POST("/api/files/delete", {
311
310
  body: request,
@@ -313,7 +312,6 @@ export function createNetworkRequests(): EditRequests & RunRequests {
313
312
  .then(handleResponse);
314
313
  },
315
314
  sendCopyFileOrFolder: async (request) => {
316
- await waitForConnectionOpen();
317
315
  return getClient()
318
316
  .POST("/api/files/copy", {
319
317
  body: request,
@@ -321,7 +319,6 @@ export function createNetworkRequests(): EditRequests & RunRequests {
321
319
  .then(handleResponse);
322
320
  },
323
321
  sendRenameFileOrFolder: async (request) => {
324
- await waitForConnectionOpen();
325
322
  return getClient()
326
323
  .POST("/api/files/move", {
327
324
  body: request,
@@ -0,0 +1,43 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ export interface MarimoExportContext {
4
+ trusted: true;
5
+ notebookCode?: string;
6
+ }
7
+
8
+ declare global {
9
+ interface Window {
10
+ __MARIMO_EXPORT_CONTEXT__?: Readonly<MarimoExportContext>;
11
+ }
12
+ }
13
+
14
+ function isMarimoExportContext(
15
+ value: unknown,
16
+ ): value is Readonly<MarimoExportContext> {
17
+ if (typeof value !== "object" || value === null) {
18
+ return false;
19
+ }
20
+
21
+ const candidate = value as MarimoExportContext;
22
+ if (candidate.trusted !== true) {
23
+ return false;
24
+ }
25
+ if (
26
+ candidate.notebookCode !== undefined &&
27
+ typeof candidate.notebookCode !== "string"
28
+ ) {
29
+ return false;
30
+ }
31
+ return true;
32
+ }
33
+
34
+ export function getMarimoExportContext():
35
+ | Readonly<MarimoExportContext>
36
+ | undefined {
37
+ const context = window?.__MARIMO_EXPORT_CONTEXT__;
38
+ return isMarimoExportContext(context) ? context : undefined;
39
+ }
40
+
41
+ export function hasTrustedExportContext(): boolean {
42
+ return getMarimoExportContext()?.trusted === true;
43
+ }
@@ -1,10 +1,66 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
  import { afterEach, beforeEach, describe, expect, it } from "vitest";
3
3
  import { hasRunAnyCellAtom } from "@/components/editor/cell/useRunCells";
4
+ import { userConfigAtom } from "@/core/config/config";
5
+ import { parseUserConfig } from "@/core/config/config-schema";
6
+ import { initialModeAtom } from "@/core/mode";
4
7
  import { store } from "@/core/state/jotai";
5
8
  import { isTrustedVirtualFileUrl } from "../trusted-url";
6
9
 
10
+ type ExportContextWindow = Window & {
11
+ __MARIMO_EXPORT_CONTEXT__?: {
12
+ trusted: true;
13
+ notebookCode?: string;
14
+ };
15
+ __MARIMO_STATIC__?: unknown;
16
+ };
17
+
18
+ function snapshotTrustState() {
19
+ return {
20
+ hasRunAnyCell: store.get(hasRunAnyCellAtom),
21
+ userConfig: store.get(userConfigAtom),
22
+ initialMode: store.get(initialModeAtom),
23
+ };
24
+ }
25
+
26
+ function restoreTrustState(snapshot: ReturnType<typeof snapshotTrustState>) {
27
+ store.set(hasRunAnyCellAtom, snapshot.hasRunAnyCell);
28
+ store.set(userConfigAtom, snapshot.userConfig);
29
+ store.set(initialModeAtom, snapshot.initialMode);
30
+ }
31
+
32
+ function setAutoInstantiate(value: boolean) {
33
+ const cleared = parseUserConfig({});
34
+ store.set(userConfigAtom, {
35
+ ...cleared,
36
+ runtime: { ...cleared.runtime, auto_instantiate: value },
37
+ });
38
+ }
39
+
40
+ function clearTrustSignals() {
41
+ store.set(hasRunAnyCellAtom, false);
42
+ setAutoInstantiate(false);
43
+ store.set(initialModeAtom, "edit");
44
+ }
45
+
7
46
  describe("isTrustedVirtualFileUrl", () => {
47
+ let windowWithExportContext: ExportContextWindow;
48
+ let trustStateSnapshot: ReturnType<typeof snapshotTrustState>;
49
+
50
+ beforeEach(() => {
51
+ windowWithExportContext = window as ExportContextWindow;
52
+ trustStateSnapshot = snapshotTrustState();
53
+ clearTrustSignals();
54
+ delete windowWithExportContext.__MARIMO_EXPORT_CONTEXT__;
55
+ delete windowWithExportContext.__MARIMO_STATIC__;
56
+ });
57
+
58
+ afterEach(() => {
59
+ restoreTrustState(trustStateSnapshot);
60
+ delete windowWithExportContext.__MARIMO_EXPORT_CONTEXT__;
61
+ delete windowWithExportContext.__MARIMO_STATIC__;
62
+ });
63
+
8
64
  it.each([
9
65
  "./@file/123-mpl.js",
10
66
  "./@file/456-mpl.css",
@@ -48,40 +104,96 @@ describe("isTrustedVirtualFileUrl", () => {
48
104
  expect(isTrustedVirtualFileUrl({})).toBe(false);
49
105
  });
50
106
 
51
- describe("data URL exemption", () => {
52
- let previousHasRunAnyCell: boolean;
107
+ /**
108
+ * Data URLs are the WASM / Pyodide fallback shape (see
109
+ * `virtual_file.py`: when `virtual_files_supported=False`, files are
110
+ * emitted directly as base64 data URLs). The tests below cover each
111
+ * supported and unsupported trust signal.
112
+ */
113
+ describe("data URL acceptance", () => {
114
+ const SAFE_DATA_URLS = [
115
+ "data:text/javascript;base64,ZXhwb3J0IGRlZmF1bHQge30=",
116
+ "data:application/javascript;base64,ZXhwb3J0IGRlZmF1bHQge30=",
117
+ "data:text/css;base64,Ym9keXt9",
118
+ ];
53
119
 
54
- beforeEach(() => {
55
- previousHasRunAnyCell = store.get(hasRunAnyCellAtom);
56
- store.set(hasRunAnyCellAtom, true);
120
+ it.each(SAFE_DATA_URLS)(
121
+ "accepts %s once the user has run a cell",
122
+ (url) => {
123
+ store.set(hasRunAnyCellAtom, true);
124
+ expect(isTrustedVirtualFileUrl(url)).toBe(true);
125
+ },
126
+ );
127
+
128
+ it("accepts safe data URL when trusted export context is present", () => {
129
+ windowWithExportContext.__MARIMO_EXPORT_CONTEXT__ = {
130
+ trusted: true,
131
+ notebookCode: "import marimo\napp = marimo.App()",
132
+ };
133
+ expect(
134
+ isTrustedVirtualFileUrl(
135
+ "data:text/javascript;base64,ZXhwb3J0IGRlZmF1bHQge30=",
136
+ ),
137
+ ).toBe(true);
138
+ });
139
+
140
+ it("rejects safe data URL when only read mode is present", () => {
141
+ store.set(initialModeAtom, "read");
142
+ expect(
143
+ isTrustedVirtualFileUrl(
144
+ "data:text/javascript;base64,ZXhwb3J0IGRlZmF1bHQge30=",
145
+ ),
146
+ ).toBe(false);
57
147
  });
58
148
 
59
- afterEach(() => {
60
- store.set(hasRunAnyCellAtom, previousHasRunAnyCell);
149
+ it("rejects safe data URL when only auto_instantiate is enabled", () => {
150
+ setAutoInstantiate(true);
151
+ expect(
152
+ isTrustedVirtualFileUrl(
153
+ "data:text/javascript;base64,ZXhwb3J0IGRlZmF1bHQge30=",
154
+ ),
155
+ ).toBe(false);
61
156
  });
62
157
 
63
- it.each([
64
- "data:text/javascript;base64,ZXhwb3J0IGRlZmF1bHQge30=",
65
- "data:application/javascript;base64,ZXhwb3J0IGRlZmF1bHQge30=",
66
- "data:text/css;base64,Ym9keXt9",
67
- ])("accepts safe data URL %s after a cell has run", (url) => {
68
- expect(isTrustedVirtualFileUrl(url)).toBe(true);
158
+ it("rejects safe data URL when only a marimo-code tag is present", () => {
159
+ const tag = document.createElement("marimo-code");
160
+ tag.textContent = encodeURIComponent("import marimo\napp = marimo.App()");
161
+ document.body.appendChild(tag);
162
+ try {
163
+ expect(
164
+ isTrustedVirtualFileUrl(
165
+ "data:text/javascript;base64,ZXhwb3J0IGRlZmF1bHQge30=",
166
+ ),
167
+ ).toBe(false);
168
+ } finally {
169
+ tag.remove();
170
+ }
171
+ });
172
+
173
+ it("rejects safe data URL when only __MARIMO_STATIC__ is present", () => {
174
+ windowWithExportContext.__MARIMO_STATIC__ = { files: {} };
175
+ expect(
176
+ isTrustedVirtualFileUrl(
177
+ "data:text/javascript;base64,ZXhwb3J0IGRlZmF1bHQge30=",
178
+ ),
179
+ ).toBe(false);
69
180
  });
70
181
 
71
182
  it.each([
72
- // Non-base64 data URLs are refused
183
+ // Non-base64 data URLs are refused because the unencoded payload
184
+ // broadens the parsing/loading surface for attacker-controlled content.
73
185
  "data:text/javascript,alert(1)",
74
186
  "data:text/javascript;charset=utf-8,alert(1)",
75
- // HTML / SVG / arbitrary types are refused
187
+ // HTML / SVG / arbitrary types are refused even when trusted.
76
188
  "data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==",
77
189
  "data:image/svg+xml;base64,PHN2Zy8+",
78
190
  "data:application/octet-stream;base64,AAA=",
79
- ])("still rejects unsafe data URL %s", (url) => {
191
+ ])("still rejects unsafe data URL %s in trusted context", (url) => {
192
+ store.set(hasRunAnyCellAtom, true);
80
193
  expect(isTrustedVirtualFileUrl(url)).toBe(false);
81
194
  });
82
195
 
83
- it("rejects data URL when no cell has been run", () => {
84
- store.set(hasRunAnyCellAtom, false);
196
+ it("rejects data URLs when no trust signal is set", () => {
85
197
  expect(
86
198
  isTrustedVirtualFileUrl(
87
199
  "data:text/javascript;base64,ZXhwb3J0IGRlZmF1bHQge30=",
@@ -1,6 +1,7 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
3
  import { hasRunAnyCellAtom } from "@/components/editor/cell/useRunCells";
4
+ import { hasTrustedExportContext } from "@/core/static/export-context";
4
5
  import { store } from "@/core/state/jotai";
5
6
 
6
7
  /**
@@ -15,13 +16,13 @@ import { store } from "@/core/state/jotai";
15
16
  * attacker-controlled JavaScript at same origin, since the HTML sanitizer
16
17
  * lets arbitrary marimo custom elements and attributes through.
17
18
  *
18
- * Some runtimes (WASM, VS Code) have no backend to serve virtual files, so
19
- * `VirtualFile` falls back to inline base64 data URLs (see `virtual_file.py`).
19
+ * Some runtimes (WASM, VS Code, and trusted exported notebook contexts such as
20
+ * Quarto islands) have no backend to serve virtual files, so `VirtualFile`
21
+ * falls back to inline base64 data URLs (see `virtual_file.py`).
20
22
  * We accept those only once the user has explicitly run a cell in the current
21
- * notebook the same trust signal `sanitize.ts` uses to lift HTML
22
- * sanitization. Running a cell requires deliberate user action and already
23
- * executes arbitrary Python, so a data URL script loaded afterwards is not a
24
- * new attack surface.
23
+ * notebook, or when a first-party export script has installed a trusted
24
+ * notebook export context. Both cases already imply trust in notebook-authored
25
+ * code, so loading the matching data URL is not a new attack surface.
25
26
  */
26
27
  export function isTrustedVirtualFileUrl(url: unknown): url is string {
27
28
  if (typeof url !== "string" || url.length === 0) {
@@ -30,16 +31,28 @@ export function isTrustedVirtualFileUrl(url: unknown): url is string {
30
31
  if (/^(\.?\/)?@file\/[^?#]+$/.test(url)) {
31
32
  return true;
32
33
  }
33
- if (isSafeDataUrl(url) && store.get(hasRunAnyCellAtom)) {
34
+ if (isSafeDataUrl(url)) {
34
35
  return true;
35
36
  }
36
37
  return false;
37
38
  }
38
39
 
40
+ function hasNotebookTrustedDataUrlContext(): boolean {
41
+ return store.get(hasRunAnyCellAtom) || hasTrustedExportContext();
42
+ }
43
+
44
+ /**
45
+ * Safe data URL formats: JS/CSS inlined as base64. Non-base64 data URLs and
46
+ * other MIME types (HTML, SVG, octet-stream, etc.) are refused because they
47
+ * broaden the surface for attacker-controlled inline content.
48
+ */
39
49
  function isSafeDataUrl(url: string): boolean {
40
- return (
50
+ const isSafeKind =
41
51
  url.startsWith("data:text/javascript;base64,") ||
42
52
  url.startsWith("data:application/javascript;base64,") ||
43
- url.startsWith("data:text/css;base64,")
44
- );
53
+ url.startsWith("data:text/css;base64,");
54
+ if (!isSafeKind) {
55
+ return false;
56
+ }
57
+ return hasNotebookTrustedDataUrlContext();
45
58
  }
@@ -1,5 +1,11 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- import { beforeEach, describe, expect, it, vi } from "vitest";
2
+ import type { ExtractAtomValue } from "jotai";
3
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
4
+ import { hasRunAnyCellAtom } from "@/components/editor/cell/useRunCells";
5
+ import { userConfigAtom } from "@/core/config/config";
6
+ import { parseUserConfig } from "@/core/config/config-schema";
7
+ import { initialModeAtom } from "@/core/mode";
8
+ import { store } from "@/core/state/jotai";
3
9
  import { Model } from "../model";
4
10
  import type { ModelState, WidgetModelId } from "../types";
5
11
  import { visibleForTesting } from "../widget-binding";
@@ -18,9 +24,31 @@ function createMockComm() {
18
24
 
19
25
  describe("WidgetDefRegistry", () => {
20
26
  let registry: InstanceType<typeof WidgetDefRegistry>;
27
+ let previousConfig: ExtractAtomValue<typeof userConfigAtom>;
28
+ let previousMode: ExtractAtomValue<typeof initialModeAtom>;
29
+ let previousHasRunAnyCell: ExtractAtomValue<typeof hasRunAnyCellAtom>;
21
30
 
22
31
  beforeEach(() => {
23
32
  registry = new WidgetDefRegistry();
33
+ // Force "no notebook trust" so the `data:` rejection test below
34
+ // exercises the untrusted branch. The positive trust path is covered
35
+ // centrally in trusted-url.test.ts.
36
+ previousConfig = store.get(userConfigAtom);
37
+ previousMode = store.get(initialModeAtom);
38
+ previousHasRunAnyCell = store.get(hasRunAnyCellAtom);
39
+ store.set(hasRunAnyCellAtom, false);
40
+ const cleared = parseUserConfig({});
41
+ store.set(userConfigAtom, {
42
+ ...cleared,
43
+ runtime: { ...cleared.runtime, auto_instantiate: false },
44
+ });
45
+ store.set(initialModeAtom, "edit");
46
+ });
47
+
48
+ afterEach(() => {
49
+ store.set(userConfigAtom, previousConfig);
50
+ store.set(initialModeAtom, previousMode);
51
+ store.set(hasRunAnyCellAtom, previousHasRunAnyCell);
24
52
  });
25
53
 
26
54
  it("should cache modules by jsHash and return same promise", () => {
@@ -1,12 +1,41 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
+ import type { ExtractAtomValue } from "jotai";
2
3
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
4
+ import { hasRunAnyCellAtom } from "@/components/editor/cell/useRunCells";
5
+ import { userConfigAtom } from "@/core/config/config";
6
+ import { parseUserConfig } from "@/core/config/config-schema";
7
+ import { initialModeAtom } from "@/core/mode";
8
+ import { store } from "@/core/state/jotai";
3
9
  import { Logger } from "@/utils/Logger";
4
10
  import { visibleForTesting } from "../MplInteractivePlugin";
5
11
 
6
12
  const { ensureMplJs, injectCss, resetMplJsLoading } = visibleForTesting;
7
13
 
14
+ /**
15
+ * Clear every "notebook trust" signal `isTrustedVirtualFileUrl` consults so
16
+ * the rejection cases below test the actually-untrusted branch. Positive
17
+ * export-context trust is covered centrally in trusted-url.test.ts.
18
+ */
19
+ function clearTrustSignals() {
20
+ store.set(hasRunAnyCellAtom, false);
21
+ const cleared = parseUserConfig({});
22
+ store.set(userConfigAtom, {
23
+ ...cleared,
24
+ runtime: { ...cleared.runtime, auto_instantiate: false },
25
+ });
26
+ store.set(initialModeAtom, "edit");
27
+ }
28
+
8
29
  describe("MplInteractivePlugin URL validation", () => {
30
+ let previousConfig: ExtractAtomValue<typeof userConfigAtom>;
31
+ let previousMode: ExtractAtomValue<typeof initialModeAtom>;
32
+ let previousHasRunAnyCell: ExtractAtomValue<typeof hasRunAnyCellAtom>;
33
+
9
34
  beforeEach(() => {
35
+ previousConfig = store.get(userConfigAtom);
36
+ previousMode = store.get(initialModeAtom);
37
+ previousHasRunAnyCell = store.get(hasRunAnyCellAtom);
38
+ clearTrustSignals();
10
39
  // Reset module-level script-loading state and any stubs.
11
40
  delete (window as { mpl?: unknown }).mpl;
12
41
  resetMplJsLoading();
@@ -20,6 +49,9 @@ describe("MplInteractivePlugin URL validation", () => {
20
49
 
21
50
  afterEach(() => {
22
51
  vi.restoreAllMocks();
52
+ store.set(userConfigAtom, previousConfig);
53
+ store.set(initialModeAtom, previousMode);
54
+ store.set(hasRunAnyCellAtom, previousHasRunAnyCell);
23
55
  });
24
56
 
25
57
  describe("ensureMplJs", () => {
@@ -35,6 +67,8 @@ describe("MplInteractivePlugin URL validation", () => {
35
67
  "https://evil.example.com/x.js",
36
68
  "//evil.example.com/x.js",
37
69
  "javascript:alert(1)",
70
+ // Data URL is rejected only in an untrusted context. WASM/autoInstantiate
71
+ // intentionally accepts it — covered by trusted-url.test.ts.
38
72
  "data:text/javascript;base64,YWxlcnQoMSk=",
39
73
  "./@file/x.js?redirect=http://evil.com",
40
74
  ])("rejects %s", async (url) => {
@@ -1,10 +1,39 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
+ import type { ExtractAtomValue } from "jotai";
2
3
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
4
+ import { hasRunAnyCellAtom } from "@/components/editor/cell/useRunCells";
5
+ import { userConfigAtom } from "@/core/config/config";
6
+ import { parseUserConfig } from "@/core/config/config-schema";
7
+ import { initialModeAtom } from "@/core/mode";
8
+ import { store } from "@/core/state/jotai";
3
9
  import { Logger } from "@/utils/Logger";
4
10
  import { loadPanelExtension } from "../PanelPlugin";
5
11
 
12
+ /**
13
+ * Force the "no notebook trust" branch so the `data:` URL rejection below
14
+ * actually exercises the untrusted path. Positive export-context trust is
15
+ * covered centrally in trusted-url.test.ts.
16
+ */
17
+ function clearTrustSignals() {
18
+ store.set(hasRunAnyCellAtom, false);
19
+ const cleared = parseUserConfig({});
20
+ store.set(userConfigAtom, {
21
+ ...cleared,
22
+ runtime: { ...cleared.runtime, auto_instantiate: false },
23
+ });
24
+ store.set(initialModeAtom, "edit");
25
+ }
26
+
6
27
  describe("loadPanelExtension", () => {
28
+ let previousConfig: ExtractAtomValue<typeof userConfigAtom>;
29
+ let previousMode: ExtractAtomValue<typeof initialModeAtom>;
30
+ let previousHasRunAnyCell: ExtractAtomValue<typeof hasRunAnyCellAtom>;
31
+
7
32
  beforeEach(() => {
33
+ previousConfig = store.get(userConfigAtom);
34
+ previousMode = store.get(initialModeAtom);
35
+ previousHasRunAnyCell = store.get(hasRunAnyCellAtom);
36
+ clearTrustSignals();
8
37
  for (const el of document.head.querySelectorAll("script")) {
9
38
  el.remove();
10
39
  }
@@ -12,6 +41,9 @@ describe("loadPanelExtension", () => {
12
41
 
13
42
  afterEach(() => {
14
43
  vi.restoreAllMocks();
44
+ store.set(userConfigAtom, previousConfig);
45
+ store.set(initialModeAtom, previousMode);
46
+ store.set(hasRunAnyCellAtom, previousHasRunAnyCell);
15
47
  });
16
48
 
17
49
  it("does nothing and returns false for null URL", () => {
@@ -35,8 +67,9 @@ describe("loadPanelExtension", () => {
35
67
  it.each([
36
68
  "https://evil.example.com/x.js",
37
69
  "//evil.example.com/x.js",
38
- // An attacker embedding inline JS as a data URLwhat the old plugin
39
- // would have executed verbatim via script.innerHTML.
70
+ // Data URL is rejected only in an untrusted context — the WASM fallback
71
+ // legitimately produces these, so trusted-url.test.ts covers the
72
+ // positive path when a notebook trust signal is set.
40
73
  "data:text/javascript;base64,YWxlcnQoMSk=",
41
74
  "javascript:alert(1)",
42
75
  "./@file/x.js#http://evil.com",
@@ -9,6 +9,26 @@ describe("Paths", () => {
9
9
  expect(Paths.isAbsolute("/user/docs/Letter.txt")).toBe(true);
10
10
  expect(Paths.isAbsolute("C:\\user\\docs\\Letter.txt")).toBe(true);
11
11
  expect(Paths.isAbsolute("user/docs/Letter.txt")).toBe(false);
12
+
13
+ // Any Windows drive letter, either separator, and any case
14
+ expect(Paths.isAbsolute("D:\\Users\\x\\a.py")).toBe(true);
15
+ expect(Paths.isAbsolute("z:/tmp/file")).toBe(true);
16
+ expect(Paths.isAbsolute("e:\\")).toBe(true);
17
+
18
+ // UNC / server paths
19
+ expect(Paths.isAbsolute("\\\\server\\share\\file")).toBe(true);
20
+
21
+ // URI schemes
22
+ expect(Paths.isAbsolute("s3://bucket/key")).toBe(true);
23
+ expect(Paths.isAbsolute("gs://bucket/key")).toBe(true);
24
+ expect(Paths.isAbsolute("file:///tmp/file")).toBe(true);
25
+ expect(Paths.isAbsolute("http://example.com/x")).toBe(true);
26
+
27
+ // Negative cases
28
+ expect(Paths.isAbsolute("C:file")).toBe(false); // drive without separator
29
+ expect(Paths.isAbsolute("notebook.py")).toBe(false);
30
+ expect(Paths.isAbsolute("./relative")).toBe(false);
31
+ expect(Paths.isAbsolute("")).toBe(false);
12
32
  });
13
33
 
14
34
  describe("dirname", () => {
@@ -1,6 +1,12 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
  import { describe, expect, it } from "vitest";
3
- import { fileSplit, getProtocolAndParentDirectories } from "./pathUtils";
3
+ import {
4
+ fileSplit,
5
+ getProtocolAndParentDirectories,
6
+ makeDuplicateName,
7
+ resolvePaths,
8
+ toAbsolutePath,
9
+ } from "./pathUtils";
4
10
 
5
11
  describe("getProtocolAndParentDirectories", () => {
6
12
  it("should extract protocol and list parent directories correctly", () => {
@@ -111,3 +117,137 @@ describe("fileSplit", () => {
111
117
  ]);
112
118
  });
113
119
  });
120
+
121
+ describe("makeDuplicateName", () => {
122
+ it("appends _copy before the extension", () => {
123
+ expect(makeDuplicateName("notebook.py")).toBe("notebook_copy.py");
124
+ expect(makeDuplicateName("foo.tar.gz")).toBe("foo.tar_copy.gz");
125
+ });
126
+
127
+ it("appends _copy for extensionless names", () => {
128
+ expect(makeDuplicateName("README")).toBe("README_copy");
129
+ });
130
+ });
131
+
132
+ describe("toAbsolutePath", () => {
133
+ it("joins relative paths against the root", () => {
134
+ expect(toAbsolutePath("notebooks/a.py", "/workspaces/marimo")).toBe(
135
+ "/workspaces/marimo/notebooks/a.py",
136
+ );
137
+ });
138
+
139
+ it("returns absolute POSIX paths unchanged", () => {
140
+ expect(toAbsolutePath("/abs/a.py", "/workspaces/marimo")).toBe("/abs/a.py");
141
+ });
142
+
143
+ it("returns absolute Windows paths unchanged", () => {
144
+ expect(toAbsolutePath("C:\\Users\\x\\a.py", "C:\\Users\\marimo")).toBe(
145
+ "C:\\Users\\x\\a.py",
146
+ );
147
+ });
148
+
149
+ it("joins relative paths using the Windows delimiter", () => {
150
+ expect(toAbsolutePath("a.py", "C:\\Users\\marimo")).toBe(
151
+ "C:\\Users\\marimo\\a.py",
152
+ );
153
+ });
154
+ });
155
+
156
+ describe("resolvePaths", () => {
157
+ it("resolves relative paths against the root", () => {
158
+ expect(
159
+ resolvePaths({
160
+ path: "notebooks/notebook.py",
161
+ name: "notebook_copy.py",
162
+ root: "/workspaces/marimo",
163
+ }),
164
+ ).toEqual({
165
+ path: "/workspaces/marimo/notebooks/notebook.py",
166
+ newPath: "/workspaces/marimo/notebooks/notebook_copy.py",
167
+ });
168
+ });
169
+
170
+ it("keeps absolute source paths untouched", () => {
171
+ expect(
172
+ resolvePaths({
173
+ path: "/abs/path/notebook.py",
174
+ name: "notebook_copy.py",
175
+ root: "/workspaces/marimo",
176
+ }),
177
+ ).toEqual({
178
+ path: "/abs/path/notebook.py",
179
+ newPath: "/abs/path/notebook_copy.py",
180
+ });
181
+ });
182
+
183
+ it("handles Windows roots for relative paths", () => {
184
+ expect(
185
+ resolvePaths({
186
+ path: "notebook.py",
187
+ name: "notebook_copy.py",
188
+ root: "C:\\Users\\marimo",
189
+ }),
190
+ ).toEqual({
191
+ path: "C:\\Users\\marimo\\notebook.py",
192
+ newPath: "C:\\Users\\marimo\\notebook_copy.py",
193
+ });
194
+ });
195
+
196
+ it("handles Windows absolute source paths", () => {
197
+ // The tricky case: `path` is an absolute Windows path with a drive letter,
198
+ // so it must be detected by `Paths.isAbsolute` AND the deliminator must be
199
+ // picked up from the root so the join uses backslashes.
200
+ expect(
201
+ resolvePaths({
202
+ path: "C:\\Users\\marimo\\folder\\notebook.py",
203
+ name: "notebook_copy.py",
204
+ root: "C:\\Users\\marimo",
205
+ }),
206
+ ).toEqual({
207
+ path: "C:\\Users\\marimo\\folder\\notebook.py",
208
+ newPath: "C:\\Users\\marimo\\folder\\notebook_copy.py",
209
+ });
210
+ });
211
+
212
+ it("keeps the file in its current directory when renaming", () => {
213
+ expect(
214
+ resolvePaths({
215
+ path: "/root/a/b/file.py",
216
+ name: "renamed.py",
217
+ root: "/root",
218
+ }),
219
+ ).toEqual({
220
+ path: "/root/a/b/file.py",
221
+ newPath: "/root/a/b/renamed.py",
222
+ });
223
+ });
224
+
225
+ it("handles an empty root with an absolute POSIX path", () => {
226
+ // Callers that already hold absolute paths pass `root: ""`. In that case
227
+ // the delimiter must be inferred from the path itself, not from `""` (which
228
+ // would otherwise default to Windows backslashes).
229
+ expect(
230
+ resolvePaths({
231
+ path: "/abs/path/file.py",
232
+ name: "renamed.py",
233
+ root: "",
234
+ }),
235
+ ).toEqual({
236
+ path: "/abs/path/file.py",
237
+ newPath: "/abs/path/renamed.py",
238
+ });
239
+ });
240
+
241
+ it("handles an empty root with an absolute Windows path", () => {
242
+ expect(
243
+ resolvePaths({
244
+ path: "C:\\Users\\marimo\\file.py",
245
+ name: "renamed.py",
246
+ root: "",
247
+ }),
248
+ ).toEqual({
249
+ path: "C:\\Users\\marimo\\file.py",
250
+ newPath: "C:\\Users\\marimo\\renamed.py",
251
+ });
252
+ });
253
+ });