@marimo-team/islands 0.23.15-dev7 → 0.23.15-dev72

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 (584) hide show
  1. package/dist/{ConnectedDataExplorerComponent-CU4fZJzG.js → ConnectedDataExplorerComponent-CJaUI-S-.js} +85 -84
  2. package/dist/{ErrorBoundary-DE6tzZf-.js → ErrorBoundary-DXlxsrTF.js} +3 -3
  3. package/dist/{ImageComparisonComponent-CHrI72em.js → ImageComparisonComponent-C3y7L3eJ.js} +173 -129
  4. package/dist/{any-language-editor-DN1R-1KZ.js → any-language-editor-P9tjkj4n.js} +21 -21
  5. package/dist/apl-e1B5LPEL.js +4 -0
  6. package/dist/{arc-DfkSnvZm.js → arc-CTIpFoOn.js} +2 -2
  7. package/dist/architecture-7HQA4BMR-DHUrQjL4.js +6 -0
  8. package/dist/{architectureDiagram-VXUJARFQ-CT2SuxNw.js → architectureDiagram-VXUJARFQ-DXwkyAaM.js} +19 -19
  9. package/dist/asciiarmor-B-gwgesP.js +4 -0
  10. package/dist/asn1-DF2ckRB4.js +4 -0
  11. package/dist/assets/__vite-browser-external-DltVXDv7.js +1 -0
  12. package/dist/assets/worker-CDEKsBgX.js +98 -0
  13. package/dist/{blockDiagram-VD42YOAC-Dy7hlFla.js → blockDiagram-VD42YOAC-CIOjvxeD.js} +12 -12
  14. package/dist/brainfuck-4G-7_gq_.js +4 -0
  15. package/dist/{button-BacYv-bE.js → button-BcSml68y.js} +12 -65
  16. package/dist/{c4Diagram-YG6GDRKO-BXlAmZ8Z.js → c4Diagram-YG6GDRKO-B6dZC_oU.js} +6 -6
  17. package/dist/{capabilities-D_4LYhSU.js → capabilities-BYLFYTYv.js} +2 -2
  18. package/dist/{channel-D_PHgcig.js → channel-BN070S0F.js} +1 -1
  19. package/dist/{chat-ui-DinOvbWu.js → chat-ui-BdSDiVjk.js} +3122 -3116
  20. package/dist/{check-C9OoNtR4.js → check-Cs-KV5XY.js} +1 -1
  21. package/dist/{chunk-4BX2VUAB-CzXltWHN.js → chunk-4BX2VUAB-iU5lQTDI.js} +1 -1
  22. package/dist/{chunk-4F5CHEZ2-D9nGEHV8.js → chunk-4F5CHEZ2-VlodlEGo.js} +1 -1
  23. package/dist/{chunk-55IACEB6-B-1mjMMC.js → chunk-55IACEB6-7h71GwyW.js} +1 -1
  24. package/dist/{chunk-5FQGJX7Z-BbqSm5gU.js → chunk-5FQGJX7Z-B9WoXK1R.js} +3 -3
  25. package/dist/{chunk-ABZYJK2D-Dz0-H2B5.js → chunk-ABZYJK2D-BxBDji1u.js} +3 -3
  26. package/dist/{chunk-ATLVNIR6-o0Z5MZLd.js → chunk-ATLVNIR6-qFiszptQ.js} +2 -2
  27. package/dist/{chunk-B2363JML-KEJpLGGP.js → chunk-B2363JML-zL3VngtH.js} +1 -1
  28. package/dist/{chunk-B4BG7PRW-BL98U9B4.js → chunk-B4BG7PRW-B_z2FEHm.js} +7 -7
  29. package/dist/{chunk-CVBHYZKI-B_c5YBcW.js → chunk-CVBHYZKI-CwazXVlJ.js} +1 -1
  30. package/dist/{chunk-DI55MBZ5-Dwkn0LWm.js → chunk-DI55MBZ5-D4Y8yV8B.js} +6 -6
  31. package/dist/{chunk-EXTU4WIE-9sNjmQrB.js → chunk-EXTU4WIE-BQPBhApE.js} +2 -2
  32. package/dist/{chunk-FMBD7UC4-Ie8M9q0W.js → chunk-FMBD7UC4-quJmebXa.js} +1 -1
  33. package/dist/{chunk-FRFDVMJY-DzQqMWrl.js → chunk-FRFDVMJY-BHBqN-vD.js} +1 -1
  34. package/dist/{chunk-HN2XXSSU-E3n-Ys7Z.js → chunk-HN2XXSSU-Bv0QkeMr.js} +1 -1
  35. package/dist/{chunk-JA3XYJ7Z-C32Y7Epf.js → chunk-JA3XYJ7Z-CY4CRbV5.js} +3 -3
  36. package/dist/{chunk-JZLCHNYA-C6ftyVMN.js → chunk-JZLCHNYA-DWIR9m5O.js} +6 -6
  37. package/dist/{chunk-MI3HLSF2-CUYEasXO.js → chunk-MI3HLSF2-HGWI-8Pg.js} +1 -1
  38. package/dist/{chunk-N4CR4FBY-DUhGZhZs.js → chunk-N4CR4FBY-Bw2HcMNc.js} +7 -7
  39. package/dist/{chunk-PL6DKKU2-D7km-08O.js → chunk-PL6DKKU2-CAHKc95s.js} +1 -1
  40. package/dist/{chunk-QN33PNHL-0K6SDYn3.js → chunk-QN33PNHL-DPBNNzpR.js} +2 -2
  41. package/dist/{chunk-QXUST7PY-DMhsRpYK.js → chunk-QXUST7PY-DtC2t9Mk.js} +10 -10
  42. package/dist/{chunk-QZHKN3VN-DRjXVwuJ.js → chunk-QZHKN3VN-Dym5BS7y.js} +1 -1
  43. package/dist/{chunk-S3R3BYOJ-oAe3dEbO.js → chunk-S3R3BYOJ-BdgLc8AM.js} +4 -4
  44. package/dist/{chunk-SJTYNZTY-BkJrPRFC.js → chunk-SJTYNZTY-DnXoKWpW.js} +1 -1
  45. package/dist/{chunk-TCCFYFTB-D58KeXnC.js → chunk-TCCFYFTB-DPWJa9zL.js} +1 -1
  46. package/dist/{chunk-TQ3KTPDO-D_yA_wAb.js → chunk-TQ3KTPDO-CsDx6v37.js} +1 -1
  47. package/dist/{chunk-TZMSLE5B-yBKS_DQU.js → chunk-TZMSLE5B-BzSHcq-K.js} +3 -3
  48. package/dist/{chunk-UMXZTB3W-D7uwvNjd.js → chunk-UMXZTB3W-D1uHz8MN.js} +1 -1
  49. package/dist/classDiagram-2ON5EDUG-BiQPjMNY.js +30 -0
  50. package/dist/classDiagram-v2-WZHVMYZB-YHdR8fqM.js +30 -0
  51. package/dist/{clike-DTxNUn7l.js → clike-7lgyEYRk.js} +1 -1
  52. package/dist/clojure-CUybM11R.js +4 -0
  53. package/dist/cmake-BPjGcuDL.js +4 -0
  54. package/dist/cobol-BETk_nb6.js +4 -0
  55. package/dist/{code-block-37QAKDTI-O6IH6wAi.js → code-block-37QAKDTI-MSxEjskJ.js} +1 -1
  56. package/dist/{code-visibility-B8b6lh5X.js → code-visibility-i9MrZhpb.js} +1554 -1471
  57. package/dist/coffeescript-CManZxXL.js +4 -0
  58. package/dist/commonlisp-DWkn7GW8.js +4 -0
  59. package/dist/{copy-COam1EG7.js → copy-Cs3yt6Vt.js} +2 -2
  60. package/dist/{cose-bilkent-S5V4N54A-kjoZoid4.js → cose-bilkent-S5V4N54A-BYj0aL7z.js} +2 -2
  61. package/dist/crystal-CCbg5EUH.js +4 -0
  62. package/dist/css-By8eo-XS.js +4 -0
  63. package/dist/cypher-DwfHg3nP.js +4 -0
  64. package/dist/d-Brs1wNbw.js +4 -0
  65. package/dist/{dagre-6UL2VRFP-J0JKgwOt.js → dagre-6UL2VRFP-DpYjBqQs.js} +11 -11
  66. package/dist/{data-grid-overlay-editor-C6lxUJp-.js → data-grid-overlay-editor-BWRG2b_o.js} +2 -2
  67. package/dist/{constants-T20xxyNf.js → debounce-BOD3DbfP.js} +1 -24
  68. package/dist/{diagram-PSM6KHXK-DYgJuNk9.js → diagram-PSM6KHXK-D4ftnaua.js} +22 -22
  69. package/dist/{diagram-QEK2KX5R-CKdBR2sb.js → diagram-QEK2KX5R-DVlUOgs1.js} +17 -17
  70. package/dist/{diagram-S2PKOQOG-Dpi7mo5W.js → diagram-S2PKOQOG-CGh4OMEV.js} +17 -17
  71. package/dist/diff-DJIRmJ1g.js +4 -0
  72. package/dist/{dist-DyyjKEYf.js → dist-3NCqaWjt.js} +2 -2
  73. package/dist/{dist-D-W5ny5a.js → dist-4lVIWUT3.js} +1 -1
  74. package/dist/dist-5o9uz19x.js +5 -0
  75. package/dist/{dist-GZXUmt0b.js → dist-B2jmQKKx.js} +2 -2
  76. package/dist/{dist--2Bqjvs0.js → dist-B96tMAst.js} +2 -2
  77. package/dist/{dist-BaoDKvdy.js → dist-BCX980mU.js} +2 -2
  78. package/dist/{dist-DMjWuVs8.js → dist-BIEt-mlF.js} +1 -1
  79. package/dist/{dist-BR_gyG9L.js → dist-BO5HRiTf.js} +2 -2
  80. package/dist/{dist-Dv_Y15yk.js → dist-BOMbzyb3.js} +85 -85
  81. package/dist/{dist-CIYBwstr.js → dist-BP39XM8u.js} +1 -1
  82. package/dist/{dist-DZo4nSS0.js → dist-BPF0gTRZ.js} +6 -6
  83. package/dist/{dist-BSAt6RhH.js → dist-BTdrwBWP.js} +22 -22
  84. package/dist/{dist-BY018Paw.js → dist-BdqCKQ1O.js} +2 -2
  85. package/dist/dist-BpDH0DEP.js +5 -0
  86. package/dist/dist-BpXhbQXO.js +8 -0
  87. package/dist/{dist-CcWX6tmx.js → dist-BpeiYpG2.js} +2 -2
  88. package/dist/{dist-A2846XWO.js → dist-BwhXBwMd.js} +1 -1
  89. package/dist/dist-ByadAk_L.js +5 -0
  90. package/dist/{dist-abid3KgM.js → dist-C18MUWTj.js} +2 -2
  91. package/dist/{dist-DZORgqKY.js → dist-C2_4pjuS.js} +1 -1
  92. package/dist/{dist-BzEzfugY.js → dist-CFSb_Frm.js} +1 -1
  93. package/dist/dist-CK0g7JvP.js +8 -0
  94. package/dist/{dist-C_Y3oV3C.js → dist-CRmSjkLP.js} +2 -2
  95. package/dist/{dist-hT4QzYX-.js → dist-CSlJrrAw.js} +86 -81
  96. package/dist/{dist-Du8WkPuU.js → dist-CV79CsQ0.js} +2 -2
  97. package/dist/dist-CfzCtiq2.js +5 -0
  98. package/dist/{dist-CoXAujgg.js → dist-D3bdsa1d.js} +4 -4
  99. package/dist/dist-D8JtVFrW.js +8 -0
  100. package/dist/dist-DK2Oocpu.js +6 -0
  101. package/dist/{dist-LTU8Hdvn.js → dist-DZwp8lro.js} +3 -3
  102. package/dist/{dist-t9Kf7xqC.js → dist-DaXJPX8F.js} +2 -2
  103. package/dist/{dist-U4F-tbMs.js → dist-De-GlSAs.js} +246 -184
  104. package/dist/{dist-M9Vag9Y0.js → dist-DgjbnqTg.js} +125 -125
  105. package/dist/dist-DnSu977r.js +5 -0
  106. package/dist/{dist-CxJDU6Bh.js → dist-DviUBLUp.js} +4 -4
  107. package/dist/{dist-CpxNdDkw.js → dist-DwqBJ014.js} +2 -2
  108. package/dist/{dist-Bf7SHuNp.js → dist-JGehap7K.js} +5 -5
  109. package/dist/{dist-Bk75fBZA.js → dist-LpLXa9Lb.js} +2 -2
  110. package/dist/{dist-Bf9f8MuT.js → dist-SXNmlE8A.js} +1 -1
  111. package/dist/dist-UmxJm6sW.js +8 -0
  112. package/dist/dist-aYSBQSyM.js +5 -0
  113. package/dist/dist-kkZ1Ztlh.js +6 -0
  114. package/dist/dist-ngPczwNi.js +5 -0
  115. package/dist/{dist-DgGbNavJ.js → dist-pqIwD8VD.js} +2 -2
  116. package/dist/dist-wQRyxyTV.js +5 -0
  117. package/dist/{dist-Dax--nl9.js → dist-w_gWE5Wf.js} +1 -1
  118. package/dist/{dockerfile-twL37N91.js → dockerfile-B82Pkz_V.js} +1 -1
  119. package/dist/dtd-Dyiazv4N.js +4 -0
  120. package/dist/dylan-D8Fcw7NA.js +4 -0
  121. package/dist/ecl-CjKp8Vii.js +4 -0
  122. package/dist/eiffel-K9ViOX5r.js +4 -0
  123. package/dist/elm-B5NVtRco.js +4 -0
  124. package/dist/{erDiagram-Q2GNP2WA-BU-m41EQ.js → erDiagram-Q2GNP2WA-BcKAHFqF.js} +15 -15
  125. package/dist/erlang-BnLzgk7R.js +4 -0
  126. package/dist/{error-banner-DFPfz_Qf.js → error-banner-DR7o3CbX.js} +68 -68
  127. package/dist/{esm-ga2Bf3O2.js → esm-DKOv6P2M.js} +424 -424
  128. package/dist/esm-k8PIvuZW.js +1180 -0
  129. package/dist/{extends-9MVIxxRo.js → extends-Cq2JYHKy.js} +36 -20
  130. package/dist/{factor-CajWS6mS.js → factor-Bq2mGIHt.js} +1 -1
  131. package/dist/factor-C7f9Jz5R.js +4 -0
  132. package/dist/{flowDiagram-NV44I4VS-CRoXKjGq.js → flowDiagram-NV44I4VS-BRhSg-ro.js} +17 -17
  133. package/dist/{formats-Dzx4J_z1.js → formats-BFhkZJwd.js} +3 -3
  134. package/dist/forth-rGM8jLao.js +4 -0
  135. package/dist/fortran-B3acSe0i.js +4 -0
  136. package/dist/{ganttDiagram-JELNMOA3-7mq5f9cO.js → ganttDiagram-JELNMOA3-CXXCN7LN.js} +10 -10
  137. package/dist/gas-Bb1Vmv_N.js +4 -0
  138. package/dist/gherkin-C9Lyidgd.js +4 -0
  139. package/dist/{gitGraph-G5XIXVHT-DiniR35k.js → gitGraph-G5XIXVHT-BjTx0kww.js} +3 -3
  140. package/dist/{gitGraphDiagram-V2S2FVAM-Dfuokq6w.js → gitGraphDiagram-V2S2FVAM-BOlkMSqK.js} +17 -17
  141. package/dist/{glide-data-editor-CjTu7ukN.js → glide-data-editor--CaN-f27.js} +13 -13
  142. package/dist/groovy-DQk6XcGH.js +4 -0
  143. package/dist/haskell-mV0Vw9gv.js +4 -0
  144. package/dist/haxe-DqxN89zH.js +5 -0
  145. package/dist/{html-to-image-_wGfk8V-.js → html-to-image-DDENewl2.js} +2649 -2607
  146. package/dist/idl-ya8W561J.js +4 -0
  147. package/dist/{info-VBDWY6EO-DVZvGhkQ.js → info-VBDWY6EO-CA67FznA.js} +3 -3
  148. package/dist/infoDiagram-HS3SLOUP-D3TyKnL_.js +30 -0
  149. package/dist/{input-DtsN7xm-.js → input-DStQIuqD.js} +51 -51
  150. package/dist/javascript-CgqgptVu.js +4 -0
  151. package/dist/{journeyDiagram-XKPGCS4Q-8XYSU1GI.js → journeyDiagram-XKPGCS4Q-DEal0aT1.js} +7 -7
  152. package/dist/julia-CFQ-HusI.js +4 -0
  153. package/dist/{kanban-definition-3W4ZIXB7--9pT9z1R.js → kanban-definition-3W4ZIXB7-Dl90wENN.js} +12 -12
  154. package/dist/{katex-9-9QRhxz.js → katex-C4t-BmrK.js} +1 -1
  155. package/dist/{label-WfTSU8L4.js → label-DIk0QoFe.js} +2 -2
  156. package/dist/{line-C5s_12ee.js → line-C43FIPBd.js} +3 -3
  157. package/dist/{linear-B5-AFRiR.js → linear-H_vsH9ao.js} +4 -4
  158. package/dist/livescript-D__3TmDo.js +4 -0
  159. package/dist/{loader-Boph2xIS.js → loader-CTHCI-qe.js} +5 -16
  160. package/dist/lua-Bytcgj_W.js +4 -0
  161. package/dist/main.js +2439 -2199
  162. package/dist/mathematica-DJhvVKvl.js +4 -0
  163. package/dist/mbox-IGHPCjfR.js +4 -0
  164. package/dist/{mermaid-4DMBBIKO-Eg3D4FVz.js → mermaid-4DMBBIKO-FXbOziy9.js} +1 -1
  165. package/dist/{mermaid-BYqXy_NE.js → mermaid-CdSvixW2.js} +47 -47
  166. package/dist/{mermaid-parser.core-C3XRsazI.js → mermaid-parser.core-DoivvxPd.js} +8 -8
  167. package/dist/{mhchem-yiCCuiEF.js → mhchem-EGhUZR1V.js} +1 -1
  168. package/dist/{mindmap-definition-VGOIOE7T-B-4mnfFG.js → mindmap-definition-VGOIOE7T-CCDupjWW.js} +14 -14
  169. package/dist/mirc-tcwvVugm.js +4 -0
  170. package/dist/mllike-Dx91i62r.js +6 -0
  171. package/dist/modelica-_SRt-yU5.js +4 -0
  172. package/dist/mscgen-GZrGS9gt.js +6 -0
  173. package/dist/mumps-Cv3ygyod.js +4 -0
  174. package/dist/nsis-BU7GeGbI.js +4 -0
  175. package/dist/{nsis-ClF3r5Tr.js → nsis-i9_sgigf.js} +1 -1
  176. package/dist/ntriples-CL-FCYXb.js +4 -0
  177. package/dist/{number-overlay-editor-BLJXvX9c.js → number-overlay-editor-Ck_mc_gT.js} +1 -1
  178. package/dist/objects-De59twF-.js +56 -0
  179. package/dist/octave-Dc6_3DIu.js +4 -0
  180. package/dist/{ordinal-ArJavP1Q.js → ordinal-Bkv2-veX.js} +1 -1
  181. package/dist/oz-DpUAJCXf.js +4 -0
  182. package/dist/{packet-DYOGHKS2-34raHOiB.js → packet-DYOGHKS2-Bkgofxf3.js} +3 -3
  183. package/dist/pascal-B17mncXs.js +4 -0
  184. package/dist/perl-BTpK97q9.js +4 -0
  185. package/dist/{pie-VRWISCQL-BaLlzZa3.js → pie-VRWISCQL-B1AMhN_7.js} +3 -3
  186. package/dist/{pieDiagram-ADFJNKIX-Cr3cNpZY.js → pieDiagram-ADFJNKIX-JvXG_6hk.js} +22 -22
  187. package/dist/pig-CFb638Ap.js +4 -0
  188. package/dist/powershell-Cxo-_2A5.js +4 -0
  189. package/dist/{precisionRound-Tqb4mg-H.js → precisionRound-CnHPY_5v.js} +1 -1
  190. package/dist/{process-output-Mh4UrjwM.js → process-output-2QPcgBQg.js} +4 -4
  191. package/dist/properties-BPgT1xTB.js +4 -0
  192. package/dist/protobuf-BgHBaIIK.js +4 -0
  193. package/dist/pug-25-oS0SG.js +4 -0
  194. package/dist/{pug-B_rby2yb.js → pug-BhE2JRSg.js} +1 -1
  195. package/dist/puppet-DarIr20S.js +4 -0
  196. package/dist/purify.es-EnR5yhgI.js +783 -0
  197. package/dist/python-BqmOsBsi.js +4 -0
  198. package/dist/q-D3QJCTup.js +4 -0
  199. package/dist/{quadrantDiagram-AYHSOK5B-BuNL8Q93.js → quadrantDiagram-AYHSOK5B-BqDB9tUC.js} +5 -5
  200. package/dist/r-Cz_yBX4z.js +4 -0
  201. package/dist/{radar-ZZBFDIW7-Ci7bfoZa.js → radar-ZZBFDIW7-C2b7A32s.js} +3 -3
  202. package/dist/{react-vega-B0sAlDTL.js → react-vega-BazDALhI.js} +469 -469
  203. package/dist/{requirementDiagram-UZGBJVZJ-BG2lLUN1.js → requirementDiagram-UZGBJVZJ-KbVt8SPH.js} +14 -14
  204. package/dist/{reveal-component-D0fwa0Mk.js → reveal-component-BQQIEJqn.js} +629 -622
  205. package/dist/rpm-DGOtYwAI.js +5 -0
  206. package/dist/ruby-DBZu4rPc.js +4 -0
  207. package/dist/{sankeyDiagram-TZEHDZUN-DMal8sps.js → sankeyDiagram-TZEHDZUN-DgkF38jx.js} +5 -5
  208. package/dist/sas-Dd1D9qTq.js +4 -0
  209. package/dist/scheme-BmDjvTHX.js +4 -0
  210. package/dist/{sequenceDiagram-WL72ISMW-DT6Tk-Eo.js → sequenceDiagram-WL72ISMW-BDmx9n95.js} +8 -8
  211. package/dist/shell-BL8zFSaj.js +4 -0
  212. package/dist/sieve-BAx2WqUP.js +4 -0
  213. package/dist/smalltalk-CYRzF7VV.js +4 -0
  214. package/dist/sparql-YWaDRO4A.js +4 -0
  215. package/dist/{spec-Cz-Bj1JI.js → spec-CnaxwDqy.js} +4 -4
  216. package/dist/{src-Bf2iLOlr.js → src-DV3ha_nA.js} +1 -1
  217. package/dist/{stateDiagram-FKZM4ZOC-CB_lodq3.js → stateDiagram-FKZM4ZOC-ByOvQf2n.js} +17 -17
  218. package/dist/stateDiagram-v2-4FDKWEC3-C3xqeavR.js +29 -0
  219. package/dist/{step-CWipAYTY.js → step-BqHnkgWE.js} +1 -1
  220. package/dist/stex-B5O-env2.js +4 -0
  221. package/dist/{strings-Dq_j3Rxw.js → strings-BYAhZnQi.js} +354 -354
  222. package/dist/style.css +1 -1
  223. package/dist/stylus-lYsyLFc1.js +4 -0
  224. package/dist/swift-ClQz9z1n.js +4 -0
  225. package/dist/{swiper-component-5HoSsPi1.js → swiper-component-DE94711u.js} +4 -4
  226. package/dist/tcl-B3jhsfqY.js +4 -0
  227. package/dist/textile-Cb1Dw7Aq.js +4 -0
  228. package/dist/{time-CsmIF9YZ.js → time-Bb4A7I6a.js} +4 -4
  229. package/dist/{timeline-definition-IT6M3QCI-NfSKRvH0.js → timeline-definition-IT6M3QCI-CkD_trIn.js} +4 -4
  230. package/dist/{toDate-CWNNlFEX.js → toDate-B3IRfHhw.js} +16 -7
  231. package/dist/toml-nHZhetdO.js +4 -0
  232. package/dist/{tooltip-Czds6Qr8.js → tooltip-B-qh7UPB.js} +3 -3
  233. package/dist/{treemap-GDKQZRPO-Cl6OQh8D.js → treemap-GDKQZRPO-SDux0AV8.js} +3 -3
  234. package/dist/troff-DuJAGWKH.js +4 -0
  235. package/dist/ttcn-BxrcwP21.js +4 -0
  236. package/dist/ttcn-cfg-BAg_9dcc.js +4 -0
  237. package/dist/turtle-zCq949as.js +4 -0
  238. package/dist/{types-C2Ir191_.js → types-DQl7jVYK.js} +1 -1
  239. package/dist/use-vega-container-remeasure-DGNrIQSk.js +27 -0
  240. package/dist/{useAsyncData-KfHB8wQR.js → useAsyncData-CvO8WUy3.js} +1 -1
  241. package/dist/{useDateFormatter-CMnRuVmN.js → useDateFormatter-BSoGim-G.js} +2 -2
  242. package/dist/{useDeepCompareMemoize-nJMtxhm4.js → useDeepCompareMemoize-J3MKRdA4.js} +1 -1
  243. package/dist/{useIframeCapabilities-DWIYvDh7.js → useIframeCapabilities-POcFXHbw.js} +1 -1
  244. package/dist/{useLifecycle-DegSo0lV.js → useLifecycle-DqPxHgAN.js} +3 -3
  245. package/dist/{useTheme-6eZ3GOTS.js → useTheme-XMq9mNf_.js} +65 -29
  246. package/dist/vb-De5hElus.js +4 -0
  247. package/dist/vbscript-Cypcpv4F.js +4 -0
  248. package/dist/{vega-component-DzyyM9fc.js → vega-component-CrFoZT1S.js} +225 -223
  249. package/dist/vega-embed-container-DAQAMjiO.js +22 -0
  250. package/dist/vega-loader.browser-DmpxCJqx.js +1353 -0
  251. package/dist/velocity-Di7l-yhe.js +4 -0
  252. package/dist/verilog-Bzi-S3g2.js +4 -0
  253. package/dist/vhdl-B0ZZITaW.js +4 -0
  254. package/dist/webidl-0sviiRcN.js +4 -0
  255. package/dist/xquery-B4qMVWaB.js +4 -0
  256. package/dist/{xychartDiagram-PRI3JC2R-BvwftqMA.js → xychartDiagram-PRI3JC2R-BSkNxYNw.js} +13 -13
  257. package/dist/yacas-Jt25Fuv8.js +4 -0
  258. package/dist/z80-CrcbYzmp.js +4 -0
  259. package/dist/{zod-CijjQh4u.js → zod-D0yOqoGe.js} +26 -26
  260. package/package.json +3 -1
  261. package/src/__mocks__/requests.ts +3 -0
  262. package/src/components/charts/lazy.tsx +3 -1
  263. package/src/components/charts/vega-embed-container.tsx +18 -0
  264. package/src/components/chat/__tests__/chat-utils.test.ts +244 -1
  265. package/src/components/chat/__tests__/message-queue.test.tsx +121 -0
  266. package/src/components/chat/chat-panel.tsx +196 -67
  267. package/src/components/chat/chat-utils.ts +111 -2
  268. package/src/components/editor/RecoveryButton.tsx +2 -2
  269. package/src/components/editor/SortableCell.tsx +6 -2
  270. package/src/components/editor/__tests__/output-persistence.test.tsx +241 -0
  271. package/src/components/editor/actions/__tests__/pair-with-agent-commands.test.ts +153 -0
  272. package/src/components/editor/actions/pair-with-agent-commands.ts +109 -0
  273. package/src/components/editor/actions/pair-with-agent-modal.tsx +20 -64
  274. package/src/components/editor/actions/useNotebookActions.tsx +8 -0
  275. package/src/components/editor/ai/add-cell-with-ai.tsx +14 -5
  276. package/src/components/editor/ai/ai-completion-editor.tsx +4 -1
  277. package/src/components/editor/cell/cell-context-menu.tsx +7 -0
  278. package/src/components/editor/chrome/components/__tests__/feedback-button.test.tsx +221 -0
  279. package/src/components/editor/chrome/components/feedback-button.tsx +308 -77
  280. package/src/components/editor/chrome/panels/packages-panel.tsx +11 -1
  281. package/src/components/editor/chrome/panels/write-secret-modal.tsx +3 -2
  282. package/src/components/editor/columns/__tests__/cell-column.test.tsx +105 -0
  283. package/src/components/editor/columns/cell-column.tsx +34 -4
  284. package/src/components/editor/columns/sortable-column.tsx +24 -4
  285. package/src/components/editor/connections/__tests__/secret-combobox.test.ts +134 -0
  286. package/src/components/editor/connections/database/schemas.ts +35 -27
  287. package/src/components/editor/connections/form-renderers.tsx +42 -110
  288. package/src/components/editor/connections/secret-combobox.tsx +253 -0
  289. package/src/components/editor/connections/storage/schemas.ts +12 -6
  290. package/src/components/editor/file-tree/download.ts +46 -0
  291. package/src/components/editor/file-tree/file-explorer.tsx +3 -21
  292. package/src/components/editor/file-tree/file-viewer.tsx +4 -27
  293. package/src/components/editor/navigation/__tests__/navigation.test.ts +33 -0
  294. package/src/components/editor/navigation/navigation.ts +8 -1
  295. package/src/components/editor/notebook-cell.tsx +203 -106
  296. package/src/components/editor/renderers/__tests__/cells-renderer.test.tsx +66 -0
  297. package/src/components/editor/renderers/cell-array.tsx +26 -13
  298. package/src/components/editor/renderers/cells-renderer.tsx +8 -2
  299. package/src/components/editor/renderers/slides-layout/__tests__/plugin.test.ts +29 -0
  300. package/src/components/editor/renderers/slides-layout/types.ts +4 -0
  301. package/src/components/editor/renderers/vertical-layout/vertical-layout.tsx +19 -19
  302. package/src/components/slides/reveal-component.tsx +37 -17
  303. package/src/components/slides/slide-form.tsx +72 -0
  304. package/src/components/ui/toast.tsx +11 -3
  305. package/src/components/ui/toaster.tsx +65 -9
  306. package/src/core/ai/context/providers/error.ts +6 -158
  307. package/src/core/cells/__tests__/utils.test.ts +59 -0
  308. package/src/core/cells/utils.ts +51 -0
  309. package/src/core/codemirror/completion/__tests__/signature-hint.test.ts +97 -3
  310. package/src/core/codemirror/completion/signature-hint.ts +78 -11
  311. package/src/core/constants.ts +8 -0
  312. package/src/core/diagnostics/__tests__/issue-details.test.ts +173 -0
  313. package/src/core/diagnostics/issue-details.ts +139 -0
  314. package/src/core/errors/__tests__/error-entries.test.ts +25 -0
  315. package/src/core/errors/error-entries.ts +176 -0
  316. package/src/core/islands/__tests__/bootstrap.test.ts +61 -0
  317. package/src/core/islands/__tests__/bridge.test.ts +373 -47
  318. package/src/core/islands/__tests__/main.test.ts +176 -0
  319. package/src/core/islands/__tests__/parse.test.ts +105 -0
  320. package/src/core/islands/bootstrap.ts +28 -5
  321. package/src/core/islands/bridge.ts +140 -39
  322. package/src/core/islands/components/__tests__/web-components.test.tsx +248 -0
  323. package/src/core/islands/components/output-wrapper.tsx +4 -1
  324. package/src/core/islands/components/web-components.tsx +76 -15
  325. package/src/core/islands/constants.ts +1 -0
  326. package/src/core/islands/main.ts +69 -3
  327. package/src/core/islands/parse.ts +70 -23
  328. package/src/core/islands/state.ts +9 -0
  329. package/src/core/islands/worker/__tests__/controller.test.ts +173 -0
  330. package/src/core/islands/worker/worker.tsx +159 -63
  331. package/src/core/network/__tests__/requests-lazy.test.ts +18 -0
  332. package/src/core/network/__tests__/requests-network.test.ts +7 -0
  333. package/src/core/network/requests-lazy.ts +13 -1
  334. package/src/core/network/requests-network.ts +3 -0
  335. package/src/core/network/requests-static.ts +1 -0
  336. package/src/core/network/requests-toasting.tsx +1 -0
  337. package/src/core/network/types.ts +3 -0
  338. package/src/core/runtime/__tests__/runtime.test.ts +64 -0
  339. package/src/core/runtime/runtime.ts +30 -10
  340. package/src/core/wasm/bridge.ts +8 -0
  341. package/src/core/wasm/worker/bootstrap.ts +113 -20
  342. package/src/core/wasm/worker/types.ts +2 -0
  343. package/src/css/app/Cell.css +10 -0
  344. package/src/hooks/__tests__/useHotkey.test.tsx +88 -0
  345. package/src/hooks/useHotkey.ts +29 -4
  346. package/src/plugins/impl/anywidget/AnyWidgetPlugin.tsx +7 -1
  347. package/src/plugins/impl/anywidget/__tests__/AnyWidgetPlugin.test.tsx +26 -1
  348. package/src/plugins/impl/anywidget/__tests__/host.test.ts +6 -9
  349. package/src/plugins/impl/anywidget/__tests__/registry.test.ts +3 -1
  350. package/src/plugins/impl/anywidget/__tests__/widget-binding.test.ts +32 -61
  351. package/src/plugins/impl/anywidget/model-proxy.ts +0 -13
  352. package/src/plugins/impl/anywidget/runtime.ts +1 -0
  353. package/src/plugins/impl/anywidget/widget-binding.ts +8 -34
  354. package/src/plugins/impl/image-comparison/ImageComparisonComponent.tsx +53 -2
  355. package/src/plugins/impl/image-comparison/__tests__/ImageComparisonComponent.test.tsx +71 -0
  356. package/src/plugins/impl/vega/__tests__/use-vega-container-remeasure.test.ts +102 -0
  357. package/src/plugins/impl/vega/use-vega-container-remeasure.ts +39 -0
  358. package/src/plugins/impl/vega/vega-component.tsx +5 -4
  359. package/src/plugins/layout/NavigationMenuPlugin.tsx +156 -25
  360. package/src/theme/__tests__/useTheme.test.ts +68 -0
  361. package/src/theme/useTheme.ts +16 -1
  362. package/dist/apl-Bdc61P1y.js +0 -4
  363. package/dist/architecture-7HQA4BMR-Kyc44TmC.js +0 -6
  364. package/dist/asciiarmor-DVRHDGzT.js +0 -4
  365. package/dist/asn1-BmuKfkfu.js +0 -4
  366. package/dist/assets/__vite-browser-external-BQCLNwri.js +0 -1
  367. package/dist/assets/worker-DAWRHcPq.js +0 -73
  368. package/dist/brainfuck-DPrRpyTV.js +0 -4
  369. package/dist/classDiagram-2ON5EDUG-QjoAcuFE.js +0 -30
  370. package/dist/classDiagram-v2-WZHVMYZB-bUCv4gu2.js +0 -30
  371. package/dist/clojure-DEttQW5T.js +0 -4
  372. package/dist/cmake-jNlx_DaM.js +0 -4
  373. package/dist/cobol-BvvIm5MJ.js +0 -4
  374. package/dist/coffeescript-DTpBMyFU.js +0 -4
  375. package/dist/commonlisp-BmmUG8jb.js +0 -4
  376. package/dist/crystal-BxyqmEWC.js +0 -4
  377. package/dist/css-BGoCtuG3.js +0 -4
  378. package/dist/cypher-BmCbdl3u.js +0 -4
  379. package/dist/d-CFrlbjZt.js +0 -4
  380. package/dist/diff-D6XwL6P8.js +0 -4
  381. package/dist/dist-7QfXoMdB.js +0 -5
  382. package/dist/dist-BEXXyZig.js +0 -5
  383. package/dist/dist-BYj57OV4.js +0 -5
  384. package/dist/dist-BlSvQzNr.js +0 -5
  385. package/dist/dist-CCBlxAgS.js +0 -8
  386. package/dist/dist-CIDTVIUf.js +0 -5
  387. package/dist/dist-CqQyhAM8.js +0 -8
  388. package/dist/dist-CwRu2Xzh.js +0 -5
  389. package/dist/dist-D8CDTVgf.js +0 -6
  390. package/dist/dist-D8DNB0nO.js +0 -8
  391. package/dist/dist-DL6N_q-A.js +0 -5
  392. package/dist/dist-DOFbNV_b.js +0 -8
  393. package/dist/dist-DPrYzMY0.js +0 -6
  394. package/dist/dist-cdmMjgsn.js +0 -5
  395. package/dist/dtd-Bw0lRN0-.js +0 -4
  396. package/dist/dylan-B55eBHTt.js +0 -4
  397. package/dist/ecl-C8G4p0wn.js +0 -4
  398. package/dist/eiffel-BmH46VJl.js +0 -4
  399. package/dist/elm-DhzeFqkl.js +0 -4
  400. package/dist/erlang-CY-wdlsU.js +0 -4
  401. package/dist/esm-M837UxV5.js +0 -1171
  402. package/dist/factor-DWkgl0xw.js +0 -4
  403. package/dist/forth-Cij_ie2t.js +0 -4
  404. package/dist/fortran-Br3X9cfm.js +0 -4
  405. package/dist/gas-DYsGcMN2.js +0 -4
  406. package/dist/gherkin-eVgXQ0fQ.js +0 -4
  407. package/dist/groovy-_NFHIXG7.js +0 -4
  408. package/dist/haskell-D6xNG_bH.js +0 -4
  409. package/dist/haxe-sU_rzAwn.js +0 -5
  410. package/dist/idl-Ds_VbrUx.js +0 -4
  411. package/dist/infoDiagram-HS3SLOUP-CEnzWruK.js +0 -30
  412. package/dist/javascript-CztfIl0i.js +0 -4
  413. package/dist/julia-DDv40QMV.js +0 -4
  414. package/dist/livescript-BEOngLLc.js +0 -4
  415. package/dist/lua-9-7BhQ4Y.js +0 -4
  416. package/dist/mathematica-DDa0Pfxm.js +0 -4
  417. package/dist/mbox-iO03mmoE.js +0 -4
  418. package/dist/mirc-C9z5LT4X.js +0 -4
  419. package/dist/mllike-jGJbdm_C.js +0 -6
  420. package/dist/modelica-DzF7oIEL.js +0 -4
  421. package/dist/mscgen-DB-u125o.js +0 -6
  422. package/dist/mumps-CRTFHhzh.js +0 -4
  423. package/dist/nsis-C4NPTuox.js +0 -4
  424. package/dist/ntriples-BCOoGph1.js +0 -4
  425. package/dist/octave-DTwNlazz.js +0 -4
  426. package/dist/oz-DD38AzSz.js +0 -4
  427. package/dist/pascal-BohSp9jV.js +0 -4
  428. package/dist/perl-f5OutoPM.js +0 -4
  429. package/dist/pig-Dv7wSmHb.js +0 -4
  430. package/dist/powershell-rYgjKB39.js +0 -4
  431. package/dist/properties-BFUNLRDN.js +0 -4
  432. package/dist/protobuf-B9QJQPPv.js +0 -4
  433. package/dist/pug-DzvWpaMC.js +0 -4
  434. package/dist/puppet-B_K-n_xK.js +0 -4
  435. package/dist/purify.es-H92eMd9-.js +0 -557
  436. package/dist/python-CAiFcaA2.js +0 -4
  437. package/dist/q-cLeFIBLK.js +0 -4
  438. package/dist/r-04Y-Wco3.js +0 -4
  439. package/dist/react-vega-B6ncY2Tp.js +0 -9
  440. package/dist/rpm-FUdrIia9.js +0 -5
  441. package/dist/ruby-DMjFXuEW.js +0 -4
  442. package/dist/sas-DzHZxjXK.js +0 -4
  443. package/dist/scheme-DxHd_Rb9.js +0 -4
  444. package/dist/shell-C8Kwypgf.js +0 -4
  445. package/dist/sieve-DdyqOKXZ.js +0 -4
  446. package/dist/smalltalk-pB7X1D9y.js +0 -4
  447. package/dist/sparql-NhBO6oOa.js +0 -4
  448. package/dist/stateDiagram-v2-4FDKWEC3-E0RGjKsm.js +0 -29
  449. package/dist/stex-KfRnSHzF.js +0 -4
  450. package/dist/stylus-SfWSnzPv.js +0 -4
  451. package/dist/swift-jRPdq2zR.js +0 -4
  452. package/dist/tcl-_hpTHGX3.js +0 -4
  453. package/dist/textile-C9h8slqH.js +0 -4
  454. package/dist/toml-DWvtinD4.js +0 -4
  455. package/dist/troff-Dwo_A0y7.js +0 -4
  456. package/dist/ttcn-V--CPFKq.js +0 -4
  457. package/dist/ttcn-cfg-CPSMchTG.js +0 -4
  458. package/dist/turtle-B4rPGBWu.js +0 -4
  459. package/dist/vb-DaMBBd4j.js +0 -4
  460. package/dist/vbscript-BMJQqcE2.js +0 -4
  461. package/dist/vega-loader.browser-CZ-J8Py3.js +0 -1321
  462. package/dist/velocity-CGq2QRq2.js +0 -4
  463. package/dist/verilog-CUNo8F5u.js +0 -4
  464. package/dist/vhdl-CCzA0msW.js +0 -4
  465. package/dist/webidl-CqIMDIBL.js +0 -4
  466. package/dist/xquery-XC5Kbr-1.js +0 -4
  467. package/dist/yacas-CGOv7Dzy.js +0 -4
  468. package/dist/z80-CXhVmi-f.js +0 -4
  469. /package/dist/{Plot-CAYS29h9.js → Plot-YQOuVIei.js} +0 -0
  470. /package/dist/{apl-BCgCq9iM.js → apl-99A7dLQe.js} +0 -0
  471. /package/dist/{array-tvvEqPy7.js → array-O78LT16Y.js} +0 -0
  472. /package/dist/{asciiarmor-BtqU-KJQ.js → asciiarmor-DLEhpFDx.js} +0 -0
  473. /package/dist/{asn1-Dmb-dTMx.js → asn1-CMrcTsT4.js} +0 -0
  474. /package/dist/{asterisk-DaVJJDnV.js → asterisk-CqykImq7.js} +0 -0
  475. /package/dist/{brainfuck-C1HoZKlE.js → brainfuck-ChPt5yBe.js} +0 -0
  476. /package/dist/{chunk-DR5Q36YT-BflwErH1.js → chunk-DR5Q36YT-5Yp2GWwR.js} +0 -0
  477. /package/dist/{click-outside-container-BLPjMamz.js → click-outside-container-BSIeYt4y.js} +0 -0
  478. /package/dist/{clike-CdT0yHjt.js → clike-CE0fXfM_.js} +0 -0
  479. /package/dist/{clojure-CdyrCpUv.js → clojure-QkBEMU-g.js} +0 -0
  480. /package/dist/{cmake-BFlPxym7.js → cmake-CU1jX7Mo.js} +0 -0
  481. /package/dist/{cobol-CcJXewp8.js → cobol-DMOKzzky.js} +0 -0
  482. /package/dist/{coffeescript-DnKuIKRo.js → coffeescript-DjnjLyfk.js} +0 -0
  483. /package/dist/{colors-CQAOa8cK.js → colors-DmiH1bIH.js} +0 -0
  484. /package/dist/{common-keywords-FBrXPTcz.js → common-keywords-D3nPJNQP.js} +0 -0
  485. /package/dist/{commonlisp-B-kok83Z.js → commonlisp-CYd9iOSe.js} +0 -0
  486. /package/dist/{crystal-FYRYjI1I.js → crystal-Dy55yoYG.js} +0 -0
  487. /package/dist/{css-B45lc2V3.js → css-CNU8w3HJ.js} +0 -0
  488. /package/dist/{cypher-DZMLyVY_.js → cypher-q47DGzK7.js} +0 -0
  489. /package/dist/{cytoscape.esm-ayF70frT.js → cytoscape.esm-Dr8XzXWK.js} +0 -0
  490. /package/dist/{d-x-VVT4o9.js → d-jEkaLvxX.js} +0 -0
  491. /package/dist/{defaultLocale-u-3osm0P.js → defaultLocale-BpsHxBd7.js} +0 -0
  492. /package/dist/{defaultLocale-BoHTsDG6.js → defaultLocale-DoeErsX2.js} +0 -0
  493. /package/dist/{diff-Dxe2mpXk.js → diff-vb2-unFN.js} +0 -0
  494. /package/dist/{dist-BGdYVvOu.js → dist-DsoKosxi.js} +0 -0
  495. /package/dist/{dtd-C9VM_Wfu.js → dtd-C9kR-bXa.js} +0 -0
  496. /package/dist/{duckdb-keywords-CvJhR_Yd.js → duckdb-keywords-B6HYCMOT.js} +0 -0
  497. /package/dist/{dylan-DTSnEIFO.js → dylan-BLckrK-V.js} +0 -0
  498. /package/dist/{ebnf-2D4Ctp3y.js → ebnf-Cnp3L9jg.js} +0 -0
  499. /package/dist/{ecl-N04ptnRK.js → ecl-CEsf6XVg.js} +0 -0
  500. /package/dist/{eiffel-Dd8rpqr_.js → eiffel-2KGZNzx6.js} +0 -0
  501. /package/dist/{elm-GT2E866W.js → elm-D2s3K5wF.js} +0 -0
  502. /package/dist/{emotion-is-prop-valid.esm-DzSb5hsH.js → emotion-is-prop-valid.esm-DdVSF4FD.js} +0 -0
  503. /package/dist/{erlang-Cf0Bp5pY.js → erlang-0PMFOndk.js} +0 -0
  504. /package/dist/{esm-BaaaPNGl.js → esm-CuQHjs36.js} +0 -0
  505. /package/dist/{fcl-Ccj8Z5Xd.js → fcl-D9nccAWI.js} +0 -0
  506. /package/dist/{forth-wd_XzGTg.js → forth-DG89iUsu.js} +0 -0
  507. /package/dist/{fortran-DcwUTZFe.js → fortran-ytKsAVvu.js} +0 -0
  508. /package/dist/{gas-DeALIER3.js → gas-Cg2Fm0N2.js} +0 -0
  509. /package/dist/{gherkin-CKTqaJNX.js → gherkin-B87FEnZ-.js} +0 -0
  510. /package/dist/{groovy-Bwdp_d8D.js → groovy-Dcs08AWD.js} +0 -0
  511. /package/dist/{haskell-DCdCcPLK.js → haskell-cwkOuhx6.js} +0 -0
  512. /package/dist/{haxe-DAyktQWJ.js → haxe-DWEo4q10.js} +0 -0
  513. /package/dist/{http-_DVAYWoR.js → http-B8jdG64J.js} +0 -0
  514. /package/dist/{idl-CBuZiRYu.js → idl-WWQwDcRV.js} +0 -0
  515. /package/dist/{init-uv0kkh4g.js → init-DNBbYZd_.js} +0 -0
  516. /package/dist/{javascript-DzigE11c.js → javascript-BeR74dxD.js} +0 -0
  517. /package/dist/{julia-PwfB-0Cm.js → julia-UlvCUYGL.js} +0 -0
  518. /package/dist/{katex-C_XRmjAP.js → katex-Bld7b-fk.js} +0 -0
  519. /package/dist/{livescript-BJLz1EbT.js → livescript-GPmFcmYV.js} +0 -0
  520. /package/dist/{lua-ZC-XC2jf.js → lua-DYoT_0zM.js} +0 -0
  521. /package/dist/{main-Tj_-QTyF.js → main-B1Jo_8pC.js} +0 -0
  522. /package/dist/{math-DFcdCCU8.js → math-CBNc2Ib0.js} +0 -0
  523. /package/dist/{mathematica-DCYMx6qB.js → mathematica-DSFIQlbG.js} +0 -0
  524. /package/dist/{mbox-OxMK_9XI.js → mbox-ej8lFMdL.js} +0 -0
  525. /package/dist/{micromark-factory-space-DF2w36zS.js → micromark-factory-space-CwHmg6iz.js} +0 -0
  526. /package/dist/{mirc-nJVyhA0H.js → mirc-CAdIdvHQ.js} +0 -0
  527. /package/dist/{mllike-DRO89bsU.js → mllike-CjTB1lHF.js} +0 -0
  528. /package/dist/{modelica-Don3E6ZD.js → modelica-BB68FYMa.js} +0 -0
  529. /package/dist/{mscgen-DJfqD3bN.js → mscgen-BkbzgGGI.js} +0 -0
  530. /package/dist/{mumps-SjGTvDYL.js → mumps-Cu-28E9F.js} +0 -0
  531. /package/dist/{nginx-DasThI7R.js → nginx-C1ofKPst.js} +0 -0
  532. /package/dist/{node-sql-parser-B8nBD36q.js → node-sql-parser-DLl_zNw0.js} +0 -0
  533. /package/dist/{ntriples-CNBKRl3I.js → ntriples-D9cQiZxZ.js} +0 -0
  534. /package/dist/{octave-DdeVHNlx.js → octave-BvtAnPX0.js} +0 -0
  535. /package/dist/{once-DPuqGUeo.js → once-B60G2fuJ.js} +0 -0
  536. /package/dist/{oz-CcKSoNvN.js → oz-COaVHk2E.js} +0 -0
  537. /package/dist/{pascal-6leftwNj.js → pascal-BFpqVD2x.js} +0 -0
  538. /package/dist/{path-BGaWgPKg.js → path-DwWbhZFI.js} +0 -0
  539. /package/dist/{perl-BhJIwWzN.js → perl-DaiORxHP.js} +0 -0
  540. /package/dist/{pig-r-xDHqRf.js → pig-DFzRhmsF.js} +0 -0
  541. /package/dist/{powershell-D-BELeNi.js → powershell-BG2LQNKN.js} +0 -0
  542. /package/dist/{properties-CnuDhbll.js → properties-CqJJR5QY.js} +0 -0
  543. /package/dist/{protobuf-CO8RBhvX.js → protobuf-WwDYV1yY.js} +0 -0
  544. /package/dist/{puppet-NmXHjLy8.js → puppet-QNY3w_uN.js} +0 -0
  545. /package/dist/{python-DAQXi720.js → python-4QrQ3Ugi.js} +0 -0
  546. /package/dist/{q-DlikXfV0.js → q-DhwXuxE2.js} +0 -0
  547. /package/dist/{r-CuohilwT.js → r-Df-nkR25.js} +0 -0
  548. /package/dist/{range-C-rmrM1O.js → range-BOiA8qqU.js} +0 -0
  549. /package/dist/{rpm-0Pjwp0Pb.js → rpm-Cokue07s.js} +0 -0
  550. /package/dist/{ruby-Dq8NJTDG.js → ruby-DrYcL3qF.js} +0 -0
  551. /package/dist/{sas-CuwonyVP.js → sas-CoiPirA5.js} +0 -0
  552. /package/dist/{scheme-CYU-RRIf.js → scheme-CwFLjzHv.js} +0 -0
  553. /package/dist/{semaphore-CNDGTzkX.js → semaphore-C8rmHdhj.js} +0 -0
  554. /package/dist/{shell-COPmX2qE.js → shell-BFV-R24I.js} +0 -0
  555. /package/dist/{sieve-B_3zyLne.js → sieve-CxwXF5T9.js} +0 -0
  556. /package/dist/{simple-mode-DSBniks8.js → simple-mode-DTaJtKPt.js} +0 -0
  557. /package/dist/{smalltalk-DRft7iPv.js → smalltalk-QivVOCtX.js} +0 -0
  558. /package/dist/{solr-RZ9uTl59.js → solr-BLvysN-c.js} +0 -0
  559. /package/dist/{sparql-CN6qj55H.js → sparql-nKsFk8j7.js} +0 -0
  560. /package/dist/{spreadsheet-BNNUNXA2.js → spreadsheet-BWc8C2FT.js} +0 -0
  561. /package/dist/{sql-B4x8IkwU.js → sql-CWfUjlV1.js} +0 -0
  562. /package/dist/{stex-BIsgBmK4.js → stex-DtMAhV4-.js} +0 -0
  563. /package/dist/{stylus-Bn_ZjOQ3.js → stylus-BLKQAycn.js} +0 -0
  564. /package/dist/{swift-BLUJhMbz.js → swift-CJoKqiKj.js} +0 -0
  565. /package/dist/{tcl-C86fxecl.js → tcl-YTeYFNUc.js} +0 -0
  566. /package/dist/{textile-DmHh2rsK.js → textile-C6rKQqMQ.js} +0 -0
  567. /package/dist/{tiddlywiki-DI0mF2WJ.js → tiddlywiki-ZXwTHGNT.js} +0 -0
  568. /package/dist/{tiki-2HU6XLLn.js → tiki-C628O_u4.js} +0 -0
  569. /package/dist/{timer-YZl28NYN.js → timer-BpI_FKSA.js} +0 -0
  570. /package/dist/{toml-GWANRNAD.js → toml-DxlPGbRy.js} +0 -0
  571. /package/dist/{treemap-D-ka1hvx.js → treemap-DY3NBr79.js} +0 -0
  572. /package/dist/{troff-BHTsomIy.js → troff-DFCfH7Ku.js} +0 -0
  573. /package/dist/{ttcn-DQuhn5Mn.js → ttcn-DAW-ERVP.js} +0 -0
  574. /package/dist/{ttcn-cfg-HjFYtdB-.js → ttcn-cfg-CpJ8b7EN.js} +0 -0
  575. /package/dist/{turtle-nCay33Nv.js → turtle-BneV2f8L.js} +0 -0
  576. /package/dist/{vb-BG-XlqqJ.js → vb-D973Vxxh.js} +0 -0
  577. /package/dist/{vbscript-B6vyW0-D.js → vbscript-Dckaq3YO.js} +0 -0
  578. /package/dist/{velocity-CWegueqO.js → velocity-DKty-GUC.js} +0 -0
  579. /package/dist/{verilog-CzSQm4cG.js → verilog-aNaK_biA.js} +0 -0
  580. /package/dist/{vhdl-DqnNVL7r.js → vhdl-CQuehnQy.js} +0 -0
  581. /package/dist/{webidl-DXEUpDWH.js → webidl-Bhg8vaMr.js} +0 -0
  582. /package/dist/{xquery-Ba_NB5bD.js → xquery-D2q16GaM.js} +0 -0
  583. /package/dist/{yacas-HKQU6hyk.js → yacas-DHGOHnNa.js} +0 -0
  584. /package/dist/{z80-CXkHXLdj.js → z80-BPhTmO22.js} +0 -0
@@ -2,6 +2,7 @@
2
2
 
3
3
  import {
4
4
  ISLAND_DATA_ATTRIBUTES,
5
+ ISLAND_SOURCE_CHANGED_EVENT,
5
6
  ISLAND_TAG_NAMES,
6
7
  ISLANDS_JSON_SCRIPT_TYPE,
7
8
  } from "@/core/islands/constants";
@@ -74,12 +75,15 @@ interface MarimoIslandPayloadCell {
74
75
  displayOutput: boolean;
75
76
  }
76
77
 
78
+ const retainedPayloadCellIds = new WeakMap<HTMLElement, string>();
79
+
77
80
  /**
78
81
  * Parses marimo island apps from the DOM
79
82
  * @param root - Root element to search within (defaults to document)
80
83
  */
81
84
  export function parseMarimoIslandApps(
82
85
  root: Document | Element = document,
86
+ options: { materialize?: boolean } = {},
83
87
  ): MarimoIslandApp[] {
84
88
  const embeds = [
85
89
  ...root.querySelectorAll<HTMLElement>(ISLAND_TAG_NAMES.ISLAND),
@@ -90,11 +94,12 @@ export function parseMarimoIslandApps(
90
94
  return [];
91
95
  }
92
96
 
97
+ const materialize = options.materialize ?? true;
93
98
  if (payloads.length > 0) {
94
- return parsePayloadBackedApps(embeds, payloads);
99
+ return parsePayloadBackedApps({ embeds, materialize, payloads });
95
100
  }
96
101
 
97
- return parseIslandElementsIntoApps(embeds);
102
+ return parseIslandElementsIntoApps(embeds, materialize);
98
103
  }
99
104
 
100
105
  /**
@@ -103,6 +108,7 @@ export function parseMarimoIslandApps(
103
108
  */
104
109
  export function parseIslandElementsIntoApps(
105
110
  embeds: HTMLElement[],
111
+ materialize = true,
106
112
  ): MarimoIslandApp[] {
107
113
  const apps = new Map<string, MarimoIslandApp>();
108
114
 
@@ -140,16 +146,24 @@ export function parseIslandElementsIntoApps(
140
146
  });
141
147
 
142
148
  // Add data-cell-idx attribute to the island element
143
- embed.setAttribute(ISLAND_DATA_ATTRIBUTES.CELL_IDX, idx.toString());
149
+ if (materialize) {
150
+ embed.setAttribute(ISLAND_DATA_ATTRIBUTES.CELL_IDX, idx.toString());
151
+ embed.dispatchEvent(new Event(ISLAND_SOURCE_CHANGED_EVENT));
152
+ }
144
153
  }
145
154
 
146
155
  return [...apps.values()];
147
156
  }
148
157
 
149
- function parsePayloadBackedApps(
150
- embeds: HTMLElement[],
151
- payloads: MarimoIslandPayload[],
152
- ): MarimoIslandApp[] {
158
+ function parsePayloadBackedApps({
159
+ embeds,
160
+ materialize,
161
+ payloads,
162
+ }: {
163
+ embeds: HTMLElement[];
164
+ materialize: boolean;
165
+ payloads: MarimoIslandPayload[];
166
+ }): MarimoIslandApp[] {
153
167
  const apps = new Map<string, MarimoIslandApp>();
154
168
  const matchedPayloadCells = new Map<MarimoIslandPayloadCell, HTMLElement>();
155
169
  const consumedEmbeds = new Set<HTMLElement>();
@@ -169,7 +183,9 @@ function parsePayloadBackedApps(
169
183
  }
170
184
  consumedEmbeds.add(embed);
171
185
  matchedPayloadCells.set(cell, embed);
172
- materializeIslandPayload(embed, cell);
186
+ if (materialize) {
187
+ materializeIslandPayload(embed, cell);
188
+ }
173
189
  hasMatchedIsland = true;
174
190
  }
175
191
  // Only payloads matched to island anchors can start runtime apps.
@@ -215,7 +231,7 @@ function parsePayloadBackedApps(
215
231
  appCell.disabled = true;
216
232
  }
217
233
  app.cells.push(appCell);
218
- if (cell.reactive) {
234
+ if (materialize && cell.reactive) {
219
235
  embed?.setAttribute(ISLAND_DATA_ATTRIBUTES.CELL_IDX, idx.toString());
220
236
  }
221
237
  }
@@ -223,12 +239,15 @@ function parsePayloadBackedApps(
223
239
 
224
240
  // A supported payload is the runtime source for its app. Extra same-app DOM
225
241
  // islands are disconnected from runtime binding.
226
- for (const embed of embeds) {
227
- const appId = embed.getAttribute(ISLAND_DATA_ATTRIBUTES.APP_ID);
228
- if (appId && payloadAppIds.has(appId) && !consumedEmbeds.has(embed)) {
229
- embed.removeAttribute(ISLAND_DATA_ATTRIBUTES.CELL_ID);
230
- embed.removeAttribute(ISLAND_DATA_ATTRIBUTES.CELL_IDX);
231
- embed.setAttribute(ISLAND_DATA_ATTRIBUTES.REACTIVE, "false");
242
+ if (materialize) {
243
+ for (const embed of embeds) {
244
+ const appId = embed.getAttribute(ISLAND_DATA_ATTRIBUTES.APP_ID);
245
+ if (appId && payloadAppIds.has(appId) && !consumedEmbeds.has(embed)) {
246
+ embed.removeAttribute(ISLAND_DATA_ATTRIBUTES.CELL_ID);
247
+ embed.removeAttribute(ISLAND_DATA_ATTRIBUTES.CELL_IDX);
248
+ embed.setAttribute(ISLAND_DATA_ATTRIBUTES.REACTIVE, "false");
249
+ consumedEmbeds.add(embed);
250
+ }
232
251
  }
233
252
  }
234
253
 
@@ -237,7 +256,16 @@ function parsePayloadBackedApps(
237
256
  return !appId || !payloadAppIds.has(appId);
238
257
  });
239
258
 
240
- return [...apps.values(), ...parseIslandElementsIntoApps(domOnlyEmbeds)];
259
+ if (materialize) {
260
+ for (const embed of consumedEmbeds) {
261
+ embed.dispatchEvent(new Event(ISLAND_SOURCE_CHANGED_EVENT));
262
+ }
263
+ }
264
+
265
+ return [
266
+ ...apps.values(),
267
+ ...parseIslandElementsIntoApps(domOnlyEmbeds, materialize),
268
+ ];
241
269
  }
242
270
 
243
271
  function findMatchingIsland({
@@ -257,7 +285,8 @@ function findMatchingIsland({
257
285
  }
258
286
  return (
259
287
  embed.getAttribute(ISLAND_DATA_ATTRIBUTES.APP_ID) === appId &&
260
- embed.getAttribute(ISLAND_DATA_ATTRIBUTES.CELL_ID) === cell.cellId
288
+ (embed.getAttribute(ISLAND_DATA_ATTRIBUTES.CELL_ID) ??
289
+ retainedPayloadCellIds.get(embed)) === cell.cellId
261
290
  );
262
291
  });
263
292
  }
@@ -266,6 +295,7 @@ function materializeIslandPayload(
266
295
  embed: HTMLElement,
267
296
  cell: MarimoIslandPayloadCell,
268
297
  ): void {
298
+ retainedPayloadCellIds.set(embed, cell.cellId);
269
299
  embed.setAttribute(
270
300
  ISLAND_DATA_ATTRIBUTES.REACTIVE,
271
301
  JSON.stringify(cell.reactive),
@@ -304,6 +334,22 @@ function ensureIslandChild(embed: HTMLElement, tagName: string): HTMLElement {
304
334
  * @param embed - The island HTML element
305
335
  * @returns Cell data or null if invalid
306
336
  */
337
+ const retainedIslandSources = new WeakMap<
338
+ HTMLElement,
339
+ { output: string; code: string }
340
+ >();
341
+
342
+ export function retainIslandSource(
343
+ embed: HTMLElement,
344
+ source: { output: string; code: string },
345
+ ): void {
346
+ if (source.code) {
347
+ retainedIslandSources.set(embed, source);
348
+ } else {
349
+ retainedIslandSources.delete(embed);
350
+ }
351
+ }
352
+
307
353
  export function parseIslandElement(
308
354
  embed: HTMLElement,
309
355
  ): { output: string; code: string } | null {
@@ -312,14 +358,15 @@ export function parseIslandElement(
312
358
  );
313
359
  const code = extractIslandCodeFromEmbed(embed);
314
360
 
315
- if (!cellOutput || !code) {
316
- return null;
361
+ if (cellOutput && code) {
362
+ return {
363
+ output: cellOutput.innerHTML,
364
+ code: code,
365
+ };
317
366
  }
318
367
 
319
- return {
320
- output: cellOutput.innerHTML,
321
- code: code,
322
- };
368
+ const retained = retainedIslandSources.get(embed);
369
+ return retained?.code ? retained : null;
323
370
  }
324
371
 
325
372
  export function createMarimoFile(app: {
@@ -11,6 +11,15 @@ import { atom } from "jotai";
11
11
  */
12
12
  export const islandsInitializedAtom = atom<boolean | string>(false);
13
13
 
14
+ /** Pending initial session generations. Null waits for a session to start. */
15
+ export const islandsPendingInitialRunsAtom = atom<ReadonlySet<number> | null>(
16
+ new Set<number>(),
17
+ );
18
+
19
+ export const islandsHydratedAtom = atom(
20
+ (get) => get(islandsPendingInitialRunsAtom)?.size === 0,
21
+ );
22
+
14
23
  /**
15
24
  * Whether the user has tried to interact with the islands.
16
25
  */
@@ -0,0 +1,173 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import type { PyodideInterface } from "pyodide";
4
+ import { describe, expect, it, vi } from "vitest";
5
+ import { ReadonlyWasmController } from "../controller";
6
+
7
+ class TestController extends ReadonlyWasmController {
8
+ setPyodide(pyodide: PyodideInterface) {
9
+ this.pyodide = pyodide;
10
+ }
11
+ }
12
+
13
+ function createSessionResources(
14
+ stopImplementation: () => Promise<void> = () => Promise.resolve(),
15
+ ) {
16
+ const bridge = { destroy: vi.fn() };
17
+ const init = Object.assign(vi.fn(), { destroy: vi.fn() });
18
+ const stop = Object.assign(vi.fn(stopImplementation), {
19
+ destroy: vi.fn(),
20
+ });
21
+ const packages = { destroy: vi.fn(), toJs: () => [] };
22
+ const sessionResources = Object.assign([bridge, init, packages, stop], {
23
+ destroy: vi.fn(),
24
+ });
25
+
26
+ return { bridge, init, packages, sessionResources, stop };
27
+ }
28
+
29
+ function createPyodideStub(
30
+ sessions = Array.from({ length: 4 }, () => createSessionResources()),
31
+ ) {
32
+ const [first] = sessions;
33
+ if (!first) {
34
+ throw new Error("At least one session is required");
35
+ }
36
+ const loadPackagesFromImports = vi.fn().mockResolvedValue(undefined);
37
+ const pyodide = {
38
+ runPython: vi
39
+ .fn()
40
+ .mockImplementation(() => sessions.shift()?.sessionResources),
41
+ loadPackagesFromImports,
42
+ loadedPackages: {},
43
+ runPythonAsync: vi.fn(),
44
+ } as unknown as PyodideInterface;
45
+
46
+ return {
47
+ ...first,
48
+ loadPackagesFromImports,
49
+ pyodide,
50
+ };
51
+ }
52
+
53
+ function startSession(controller: TestController, code: string) {
54
+ return controller.startSession({
55
+ code,
56
+ filename: `${code}.py`,
57
+ onMessage: vi.fn(),
58
+ });
59
+ }
60
+
61
+ describe("WASM controller session lifecycle", () => {
62
+ it("stops and releases the active session", async () => {
63
+ const { init, packages, pyodide, sessionResources, stop } =
64
+ createPyodideStub();
65
+ const controller = new TestController();
66
+ controller.setPyodide(pyodide);
67
+
68
+ await startSession(controller, "current");
69
+ await vi.waitFor(() => expect(init).toHaveBeenCalledOnce());
70
+ await controller.stopSession();
71
+
72
+ expect(stop).toHaveBeenCalledOnce();
73
+ expect(stop.destroy).toHaveBeenCalledOnce();
74
+ expect(sessionResources.destroy).toHaveBeenCalledOnce();
75
+ expect(packages.destroy).toHaveBeenCalledOnce();
76
+ expect(init.destroy).toHaveBeenCalledOnce();
77
+ });
78
+
79
+ it("loads dependencies serially and skips superseded sessions", async () => {
80
+ let finishFirstLoad!: () => void;
81
+ const { loadPackagesFromImports, pyodide } = createPyodideStub();
82
+ loadPackagesFromImports
83
+ .mockReturnValueOnce(
84
+ new Promise<void>((resolve) => {
85
+ finishFirstLoad = resolve;
86
+ }),
87
+ )
88
+ .mockResolvedValueOnce(undefined);
89
+ const controller = new TestController();
90
+ controller.setPyodide(pyodide);
91
+
92
+ await startSession(controller, "first_dependency");
93
+ await startSession(controller, "superseded_dependency");
94
+ await controller.stopSession();
95
+ await startSession(controller, "current_dependency");
96
+
97
+ expect(loadPackagesFromImports).toHaveBeenCalledOnce();
98
+ finishFirstLoad();
99
+ await vi.waitFor(() =>
100
+ expect(loadPackagesFromImports).toHaveBeenCalledTimes(2),
101
+ );
102
+
103
+ const loadedSources = loadPackagesFromImports.mock.calls.map(
104
+ ([source]) => source as string,
105
+ );
106
+ expect(loadedSources[1]).toContain("current_dependency");
107
+ expect(loadedSources.join("\n")).not.toContain("superseded_dependency");
108
+ });
109
+
110
+ it("stops every session created for a multi-app page", async () => {
111
+ const first = createSessionResources();
112
+ const second = createSessionResources();
113
+ const { pyodide } = createPyodideStub([first, second]);
114
+ const controller = new TestController();
115
+ controller.setPyodide(pyodide);
116
+
117
+ await startSession(controller, "first");
118
+ await startSession(controller, "second");
119
+ second.bridge.destroy();
120
+
121
+ expect(first.stop.destroy).not.toHaveBeenCalled();
122
+
123
+ await controller.stopSession();
124
+
125
+ expect(first.stop).toHaveBeenCalledOnce();
126
+ expect(second.stop).toHaveBeenCalledOnce();
127
+ expect(first.stop.destroy).toHaveBeenCalledOnce();
128
+ expect(second.stop.destroy).toHaveBeenCalledOnce();
129
+ });
130
+
131
+ it("continues stopping sessions after one stop fails", async () => {
132
+ const failure = new Error("stop failed");
133
+ const first = createSessionResources(() => Promise.reject(failure));
134
+ const second = createSessionResources();
135
+ const { pyodide } = createPyodideStub([first, second]);
136
+ const controller = new TestController();
137
+ controller.setPyodide(pyodide);
138
+
139
+ await startSession(controller, "first");
140
+ await startSession(controller, "second");
141
+
142
+ await expect(controller.stopSession()).rejects.toThrow("stop failed");
143
+ expect(first.stop).toHaveBeenCalledOnce();
144
+ expect(second.stop).toHaveBeenCalledOnce();
145
+ expect(first.stop.destroy).not.toHaveBeenCalled();
146
+ expect(second.stop.destroy).toHaveBeenCalledOnce();
147
+
148
+ first.stop.mockResolvedValueOnce(undefined);
149
+ await controller.stopSession();
150
+
151
+ expect(first.stop).toHaveBeenCalledTimes(2);
152
+ expect(first.stop.destroy).toHaveBeenCalledOnce();
153
+ expect(second.stop).toHaveBeenCalledOnce();
154
+ });
155
+
156
+ it("reports and retries a falsy stop failure", async () => {
157
+ const session = createSessionResources(() => Promise.reject(false));
158
+ const { pyodide } = createPyodideStub([session]);
159
+ const controller = new TestController();
160
+ controller.setPyodide(pyodide);
161
+
162
+ await startSession(controller, "current");
163
+
164
+ await expect(controller.stopSession()).rejects.toBe(false);
165
+ expect(session.stop.destroy).not.toHaveBeenCalled();
166
+
167
+ session.stop.mockResolvedValueOnce(undefined);
168
+ await controller.stopSession();
169
+
170
+ expect(session.stop).toHaveBeenCalledTimes(2);
171
+ expect(session.stop.destroy).toHaveBeenCalledOnce();
172
+ });
173
+ });
@@ -1,6 +1,7 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
3
  import type { PyodideInterface } from "pyodide";
4
+ import type { PyProxy } from "pyodide/ffi";
4
5
  import {
5
6
  createRPC,
6
7
  createRPCRequestHandler,
@@ -16,7 +17,6 @@ import { MessageBuffer } from "@/core/wasm/worker/message-buffer";
16
17
  import type { RawBridge, SerializedBridge } from "@/core/wasm/worker/types";
17
18
  import type { JsonString } from "@/utils/json/base64";
18
19
  import { Logger } from "@/utils/Logger";
19
- import { Deferred } from "../../../utils/Deferred";
20
20
  import { prettyError } from "../../../utils/errors";
21
21
  import { invariant } from "../../../utils/invariant";
22
22
  import { ReadonlyWasmController } from "./controller";
@@ -45,64 +45,141 @@ async function loadPyodideAndPackages() {
45
45
  }
46
46
 
47
47
  const pyodideReadyPromise = loadPyodideAndPackages();
48
- const messageBuffer = new MessageBuffer(
49
- (message: JsonString<NotificationPayload>) => {
50
- rpc.send.kernelMessage({ message });
51
- },
52
- );
53
- const bridgeReady = new Deferred<SerializedBridge>();
48
+ export interface IslandsKernelMessage {
49
+ message: JsonString<NotificationPayload>;
50
+ sessionGeneration: number;
51
+ }
52
+
53
+ const messageBuffer = new MessageBuffer<IslandsKernelMessage>((payload) => {
54
+ rpc.send.kernelMessage(payload);
55
+ });
56
+ interface SessionRequest {
57
+ code: string;
58
+ appId: string;
59
+ sessionGeneration: number;
60
+ }
61
+
62
+ let activeSession:
63
+ | (Omit<SessionRequest, "code"> & { bridge: SerializedBridge })
64
+ | undefined;
65
+ let sessionQueue = Promise.resolve();
66
+
67
+ async function startSession(
68
+ opts: SessionRequest,
69
+ replace: boolean,
70
+ ): Promise<void> {
71
+ await pyodideReadyPromise;
72
+
73
+ try {
74
+ invariant(self.controller, "Controller not loaded");
75
+ if (replace) {
76
+ await stopActiveSession();
77
+ }
78
+ const notebook = await self.controller.mountFilesystem({
79
+ code: opts.code,
80
+ filename: `app-${opts.appId}.py`,
81
+ });
82
+ const nextBridge = await self.controller.startSession({
83
+ ...notebook,
84
+ onMessage: (message) => {
85
+ messageBuffer.push({
86
+ message,
87
+ sessionGeneration: opts.sessionGeneration,
88
+ });
89
+ },
90
+ });
91
+ if (activeSession) {
92
+ (nextBridge as unknown as PyProxy).destroy();
93
+ } else {
94
+ activeSession = {
95
+ appId: opts.appId,
96
+ bridge: nextBridge,
97
+ sessionGeneration: opts.sessionGeneration,
98
+ };
99
+ }
100
+ rpc.send.initialized({});
101
+ } catch (error) {
102
+ rpc.send.initializedError({
103
+ error: prettyError(error),
104
+ });
105
+ throw error;
106
+ }
107
+ }
108
+
109
+ async function stopActiveSession(): Promise<void> {
110
+ const session = activeSession;
111
+ await self.controller.stopSession();
112
+ activeSession = undefined;
113
+ (session?.bridge as unknown as PyProxy | undefined)?.destroy();
114
+ }
115
+
116
+ function enqueueSession<T>(operation: () => Promise<T>): Promise<T> {
117
+ const result = sessionQueue.then(operation);
118
+ sessionQueue = result.then(
119
+ () => undefined,
120
+ () => undefined,
121
+ );
122
+ return result;
123
+ }
54
124
 
55
125
  // Handle RPC requests
56
126
  const requestHandler = createRPCRequestHandler({
57
127
  /**
58
128
  * Start the session
59
129
  */
60
- startSession: async (opts: { code: string; appId: string }) => {
61
- await pyodideReadyPromise; // Make sure loading is done
130
+ startSession: async (opts: SessionRequest) => {
131
+ await enqueueSession(() => startSession(opts, false));
132
+ },
133
+
134
+ replaceSession: async (opts: SessionRequest) => {
135
+ await enqueueSession(() => startSession(opts, true));
136
+ },
62
137
 
63
- try {
138
+ stopSession: async (opts: { appId: string; sessionGeneration: number }) => {
139
+ await enqueueSession(async () => {
140
+ if (
141
+ activeSession?.appId !== opts.appId ||
142
+ activeSession?.sessionGeneration !== opts.sessionGeneration
143
+ ) {
144
+ return;
145
+ }
64
146
  invariant(self.controller, "Controller not loaded");
65
- const notebook = await self.controller.mountFilesystem({
66
- code: opts.code,
67
- filename: `app-${opts.appId}.py`,
68
- });
69
- const bridge = await self.controller.startSession({
70
- ...notebook,
71
- onMessage: messageBuffer.push,
72
- });
73
- bridgeReady.resolve(bridge);
74
- rpc.send.initialized({});
75
- } catch (error) {
76
- rpc.send.initializedError({
77
- error: prettyError(error),
78
- });
79
- }
80
- return;
147
+ await stopActiveSession();
148
+ });
81
149
  },
82
150
 
83
151
  /**
84
152
  * Load packages
85
153
  */
86
- loadPackages: async (code: string) => {
154
+ loadPackages: async (opts: {
155
+ appId: string;
156
+ code: string;
157
+ sessionGeneration: number;
158
+ }) => {
87
159
  await pyodideReadyPromise; // Make sure loading is done
160
+ await enqueueSession(async () => {
161
+ requireActiveBridge(opts);
88
162
 
89
- if (shouldLoadDuckDBPackages(code)) {
90
- // Add pandas and duckdb to the code for mo.sql and for remote duckdb sources
91
- code = `import pandas\n${code}`;
92
- code = `import duckdb\n${code}`;
93
- code = `import sqlglot\n${code}`;
94
-
95
- // Polars + SQL requires pyarrow, and installing
96
- // after notebook load does not work. As a heuristic,
97
- // if it appears that the notebook uses polars, add pyarrow.
98
- if (code.includes("polars")) {
99
- code = `import pyarrow\n${code}`;
163
+ let { code } = opts;
164
+
165
+ if (shouldLoadDuckDBPackages(code)) {
166
+ // Add pandas and duckdb to the code for mo.sql and for remote duckdb sources
167
+ code = `import pandas\n${code}`;
168
+ code = `import duckdb\n${code}`;
169
+ code = `import sqlglot\n${code}`;
170
+
171
+ // Polars + SQL requires pyarrow, and installing
172
+ // after notebook load does not work. As a heuristic,
173
+ // if it appears that the notebook uses polars, add pyarrow.
174
+ if (code.includes("polars")) {
175
+ code = `import pyarrow\n${code}`;
176
+ }
100
177
  }
101
- }
102
178
 
103
- await self.pyodide.loadPackagesFromImports(code, {
104
- messageCallback: Logger.log,
105
- errorCallback: Logger.error,
179
+ await self.pyodide.loadPackagesFromImports(code, {
180
+ messageCallback: Logger.log,
181
+ errorCallback: Logger.error,
182
+ });
106
183
  });
107
184
  },
108
185
 
@@ -110,37 +187,56 @@ const requestHandler = createRPCRequestHandler({
110
187
  * Call a function on the bridge
111
188
  */
112
189
  bridge: async (opts: {
190
+ appId: string;
113
191
  functionName: keyof RawBridge;
114
192
  payload: {} | undefined | null;
193
+ sessionGeneration: number;
115
194
  }) => {
116
195
  await pyodideReadyPromise; // Make sure loading is done
117
196
 
118
197
  const { functionName, payload } = opts;
119
198
 
120
199
  // Perform the function call to the Python bridge
121
- const bridge = await bridgeReady.promise;
122
-
123
- // Serialize the payload
124
- const payloadString =
125
- payload == null
126
- ? null
127
- : typeof payload === "string"
128
- ? payload
129
- : JSON.stringify(payload);
130
-
131
- // Make the request
132
- const response =
133
- payloadString == null
134
- ? // @ts-expect-error ehh TypeScript
135
- await bridge[functionName]()
136
- : // @ts-expect-error ehh TypeScript
137
- await bridge[functionName](payloadString);
138
-
139
- // Post the response back to the main thread
140
- return typeof response === "string" ? JSON.parse(response) : response;
200
+ return enqueueSession(async () => {
201
+ const bridge = requireActiveBridge(opts);
202
+
203
+ // Serialize the payload
204
+ const payloadString =
205
+ payload == null
206
+ ? null
207
+ : typeof payload === "string"
208
+ ? payload
209
+ : JSON.stringify(payload);
210
+
211
+ // Make the request
212
+ const response =
213
+ payloadString == null
214
+ ? // @ts-expect-error ehh TypeScript
215
+ await bridge[functionName]()
216
+ : // @ts-expect-error ehh TypeScript
217
+ await bridge[functionName](payloadString);
218
+
219
+ // Post the response back to the main thread
220
+ return typeof response === "string" ? JSON.parse(response) : response;
221
+ });
141
222
  },
142
223
  });
143
224
 
225
+ function requireActiveBridge(opts: {
226
+ appId: string;
227
+ sessionGeneration: number;
228
+ }): SerializedBridge {
229
+ const session = activeSession;
230
+ if (
231
+ !session ||
232
+ opts.appId !== session.appId ||
233
+ opts.sessionGeneration !== session.sessionGeneration
234
+ ) {
235
+ throw new Error("The marimo app session is no longer active.");
236
+ }
237
+ return session.bridge;
238
+ }
239
+
144
240
  // create the iframe's schema
145
241
  export type WorkerSchema = RPCSchema<
146
242
  {
@@ -148,7 +244,7 @@ export type WorkerSchema = RPCSchema<
148
244
  // Emitted when the worker is ready
149
245
  ready: {};
150
246
  // Emitted when the kernel sends a message
151
- kernelMessage: { message: JsonString<NotificationPayload> };
247
+ kernelMessage: IslandsKernelMessage;
152
248
  // Emitted when the Pyodide is initialized
153
249
  initialized: {};
154
250
  // Emitted when the Pyodide fails to initialize
@@ -54,6 +54,24 @@ describe("createLazyRequests", () => {
54
54
  } as unknown as EditRequests & RunRequests;
55
55
  });
56
56
 
57
+ it("passes server-only requests through without starting a kernel", async () => {
58
+ const environment = { marimo: "1.2.3" };
59
+ mockDelegate.getEnvironmentInfo = vi
60
+ .fn()
61
+ .mockResolvedValue(environment) as EditRequests["getEnvironmentInfo"];
62
+
63
+ const lazyRequests = createLazyRequests(
64
+ mockDelegate,
65
+ mockGetRuntimeManager,
66
+ );
67
+
68
+ await expect(lazyRequests.getEnvironmentInfo()).resolves.toEqual(
69
+ environment,
70
+ );
71
+ expect(mockInit).not.toHaveBeenCalled();
72
+ expect(mockDelegate.getEnvironmentInfo).toHaveBeenCalledOnce();
73
+ });
74
+
57
75
  it("should call init once before first request", async () => {
58
76
  const lazyRequests = createLazyRequests(
59
77
  mockDelegate,