@marimo-team/islands 0.23.15-dev6 → 0.23.15-dev62

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 (578) 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-CjNAy01L.js +1 -0
  12. package/dist/assets/worker-B3XPCb6y.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-Dpab3kCj.js → code-visibility-D7Oaafvl.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 +2217 -2116
  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-BfYO8h-9.js → reveal-component-TK3vi1Xl.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__/bridge.test.ts +341 -46
  317. package/src/core/islands/__tests__/main.test.ts +176 -0
  318. package/src/core/islands/__tests__/parse.test.ts +105 -0
  319. package/src/core/islands/bootstrap.ts +8 -3
  320. package/src/core/islands/bridge.ts +117 -23
  321. package/src/core/islands/components/__tests__/web-components.test.tsx +214 -0
  322. package/src/core/islands/components/web-components.tsx +76 -15
  323. package/src/core/islands/constants.ts +1 -0
  324. package/src/core/islands/main.ts +69 -3
  325. package/src/core/islands/parse.ts +70 -23
  326. package/src/core/islands/worker/__tests__/controller.test.ts +173 -0
  327. package/src/core/islands/worker/worker.tsx +145 -57
  328. package/src/core/network/__tests__/requests-lazy.test.ts +18 -0
  329. package/src/core/network/__tests__/requests-network.test.ts +7 -0
  330. package/src/core/network/requests-lazy.ts +13 -1
  331. package/src/core/network/requests-network.ts +3 -0
  332. package/src/core/network/requests-static.ts +1 -0
  333. package/src/core/network/requests-toasting.tsx +1 -0
  334. package/src/core/network/types.ts +3 -0
  335. package/src/core/runtime/__tests__/runtime.test.ts +64 -0
  336. package/src/core/runtime/runtime.ts +30 -10
  337. package/src/core/wasm/bridge.ts +8 -0
  338. package/src/core/wasm/worker/bootstrap.ts +113 -20
  339. package/src/core/wasm/worker/types.ts +2 -0
  340. package/src/css/app/Cell.css +10 -0
  341. package/src/hooks/__tests__/useHotkey.test.tsx +88 -0
  342. package/src/hooks/useHotkey.ts +29 -4
  343. package/src/plugins/impl/anywidget/__tests__/host.test.ts +6 -9
  344. package/src/plugins/impl/anywidget/__tests__/registry.test.ts +3 -1
  345. package/src/plugins/impl/anywidget/__tests__/widget-binding.test.ts +32 -61
  346. package/src/plugins/impl/anywidget/model-proxy.ts +0 -13
  347. package/src/plugins/impl/anywidget/runtime.ts +1 -0
  348. package/src/plugins/impl/anywidget/widget-binding.ts +8 -34
  349. package/src/plugins/impl/image-comparison/ImageComparisonComponent.tsx +53 -2
  350. package/src/plugins/impl/image-comparison/__tests__/ImageComparisonComponent.test.tsx +71 -0
  351. package/src/plugins/impl/vega/__tests__/use-vega-container-remeasure.test.ts +102 -0
  352. package/src/plugins/impl/vega/use-vega-container-remeasure.ts +39 -0
  353. package/src/plugins/impl/vega/vega-component.tsx +5 -4
  354. package/src/theme/__tests__/useTheme.test.ts +68 -0
  355. package/src/theme/useTheme.ts +16 -1
  356. package/dist/apl-Bdc61P1y.js +0 -4
  357. package/dist/architecture-7HQA4BMR-Kyc44TmC.js +0 -6
  358. package/dist/asciiarmor-DVRHDGzT.js +0 -4
  359. package/dist/asn1-BmuKfkfu.js +0 -4
  360. package/dist/assets/__vite-browser-external-BQCLNwri.js +0 -1
  361. package/dist/assets/worker-DAWRHcPq.js +0 -73
  362. package/dist/brainfuck-DPrRpyTV.js +0 -4
  363. package/dist/classDiagram-2ON5EDUG-QjoAcuFE.js +0 -30
  364. package/dist/classDiagram-v2-WZHVMYZB-bUCv4gu2.js +0 -30
  365. package/dist/clojure-DEttQW5T.js +0 -4
  366. package/dist/cmake-jNlx_DaM.js +0 -4
  367. package/dist/cobol-BvvIm5MJ.js +0 -4
  368. package/dist/coffeescript-DTpBMyFU.js +0 -4
  369. package/dist/commonlisp-BmmUG8jb.js +0 -4
  370. package/dist/crystal-BxyqmEWC.js +0 -4
  371. package/dist/css-BGoCtuG3.js +0 -4
  372. package/dist/cypher-BmCbdl3u.js +0 -4
  373. package/dist/d-CFrlbjZt.js +0 -4
  374. package/dist/diff-D6XwL6P8.js +0 -4
  375. package/dist/dist-7QfXoMdB.js +0 -5
  376. package/dist/dist-BEXXyZig.js +0 -5
  377. package/dist/dist-BYj57OV4.js +0 -5
  378. package/dist/dist-BlSvQzNr.js +0 -5
  379. package/dist/dist-CCBlxAgS.js +0 -8
  380. package/dist/dist-CIDTVIUf.js +0 -5
  381. package/dist/dist-CqQyhAM8.js +0 -8
  382. package/dist/dist-CwRu2Xzh.js +0 -5
  383. package/dist/dist-D8CDTVgf.js +0 -6
  384. package/dist/dist-D8DNB0nO.js +0 -8
  385. package/dist/dist-DL6N_q-A.js +0 -5
  386. package/dist/dist-DOFbNV_b.js +0 -8
  387. package/dist/dist-DPrYzMY0.js +0 -6
  388. package/dist/dist-cdmMjgsn.js +0 -5
  389. package/dist/dtd-Bw0lRN0-.js +0 -4
  390. package/dist/dylan-B55eBHTt.js +0 -4
  391. package/dist/ecl-C8G4p0wn.js +0 -4
  392. package/dist/eiffel-BmH46VJl.js +0 -4
  393. package/dist/elm-DhzeFqkl.js +0 -4
  394. package/dist/erlang-CY-wdlsU.js +0 -4
  395. package/dist/esm-M837UxV5.js +0 -1171
  396. package/dist/factor-DWkgl0xw.js +0 -4
  397. package/dist/forth-Cij_ie2t.js +0 -4
  398. package/dist/fortran-Br3X9cfm.js +0 -4
  399. package/dist/gas-DYsGcMN2.js +0 -4
  400. package/dist/gherkin-eVgXQ0fQ.js +0 -4
  401. package/dist/groovy-_NFHIXG7.js +0 -4
  402. package/dist/haskell-D6xNG_bH.js +0 -4
  403. package/dist/haxe-sU_rzAwn.js +0 -5
  404. package/dist/idl-Ds_VbrUx.js +0 -4
  405. package/dist/infoDiagram-HS3SLOUP-CEnzWruK.js +0 -30
  406. package/dist/javascript-CztfIl0i.js +0 -4
  407. package/dist/julia-DDv40QMV.js +0 -4
  408. package/dist/livescript-BEOngLLc.js +0 -4
  409. package/dist/lua-9-7BhQ4Y.js +0 -4
  410. package/dist/mathematica-DDa0Pfxm.js +0 -4
  411. package/dist/mbox-iO03mmoE.js +0 -4
  412. package/dist/mirc-C9z5LT4X.js +0 -4
  413. package/dist/mllike-jGJbdm_C.js +0 -6
  414. package/dist/modelica-DzF7oIEL.js +0 -4
  415. package/dist/mscgen-DB-u125o.js +0 -6
  416. package/dist/mumps-CRTFHhzh.js +0 -4
  417. package/dist/nsis-C4NPTuox.js +0 -4
  418. package/dist/ntriples-BCOoGph1.js +0 -4
  419. package/dist/octave-DTwNlazz.js +0 -4
  420. package/dist/oz-DD38AzSz.js +0 -4
  421. package/dist/pascal-BohSp9jV.js +0 -4
  422. package/dist/perl-f5OutoPM.js +0 -4
  423. package/dist/pig-Dv7wSmHb.js +0 -4
  424. package/dist/powershell-rYgjKB39.js +0 -4
  425. package/dist/properties-BFUNLRDN.js +0 -4
  426. package/dist/protobuf-B9QJQPPv.js +0 -4
  427. package/dist/pug-DzvWpaMC.js +0 -4
  428. package/dist/puppet-B_K-n_xK.js +0 -4
  429. package/dist/purify.es-H92eMd9-.js +0 -557
  430. package/dist/python-CAiFcaA2.js +0 -4
  431. package/dist/q-cLeFIBLK.js +0 -4
  432. package/dist/r-04Y-Wco3.js +0 -4
  433. package/dist/react-vega-B6ncY2Tp.js +0 -9
  434. package/dist/rpm-FUdrIia9.js +0 -5
  435. package/dist/ruby-DMjFXuEW.js +0 -4
  436. package/dist/sas-DzHZxjXK.js +0 -4
  437. package/dist/scheme-DxHd_Rb9.js +0 -4
  438. package/dist/shell-C8Kwypgf.js +0 -4
  439. package/dist/sieve-DdyqOKXZ.js +0 -4
  440. package/dist/smalltalk-pB7X1D9y.js +0 -4
  441. package/dist/sparql-NhBO6oOa.js +0 -4
  442. package/dist/stateDiagram-v2-4FDKWEC3-E0RGjKsm.js +0 -29
  443. package/dist/stex-KfRnSHzF.js +0 -4
  444. package/dist/stylus-SfWSnzPv.js +0 -4
  445. package/dist/swift-jRPdq2zR.js +0 -4
  446. package/dist/tcl-_hpTHGX3.js +0 -4
  447. package/dist/textile-C9h8slqH.js +0 -4
  448. package/dist/toml-DWvtinD4.js +0 -4
  449. package/dist/troff-Dwo_A0y7.js +0 -4
  450. package/dist/ttcn-V--CPFKq.js +0 -4
  451. package/dist/ttcn-cfg-CPSMchTG.js +0 -4
  452. package/dist/turtle-B4rPGBWu.js +0 -4
  453. package/dist/vb-DaMBBd4j.js +0 -4
  454. package/dist/vbscript-BMJQqcE2.js +0 -4
  455. package/dist/vega-loader.browser-CZ-J8Py3.js +0 -1321
  456. package/dist/velocity-CGq2QRq2.js +0 -4
  457. package/dist/verilog-CUNo8F5u.js +0 -4
  458. package/dist/vhdl-CCzA0msW.js +0 -4
  459. package/dist/webidl-CqIMDIBL.js +0 -4
  460. package/dist/xquery-XC5Kbr-1.js +0 -4
  461. package/dist/yacas-CGOv7Dzy.js +0 -4
  462. package/dist/z80-CXhVmi-f.js +0 -4
  463. /package/dist/{Plot-CAYS29h9.js → Plot-YQOuVIei.js} +0 -0
  464. /package/dist/{apl-BCgCq9iM.js → apl-99A7dLQe.js} +0 -0
  465. /package/dist/{array-tvvEqPy7.js → array-O78LT16Y.js} +0 -0
  466. /package/dist/{asciiarmor-BtqU-KJQ.js → asciiarmor-DLEhpFDx.js} +0 -0
  467. /package/dist/{asn1-Dmb-dTMx.js → asn1-CMrcTsT4.js} +0 -0
  468. /package/dist/{asterisk-DaVJJDnV.js → asterisk-CqykImq7.js} +0 -0
  469. /package/dist/{brainfuck-C1HoZKlE.js → brainfuck-ChPt5yBe.js} +0 -0
  470. /package/dist/{chunk-DR5Q36YT-BflwErH1.js → chunk-DR5Q36YT-5Yp2GWwR.js} +0 -0
  471. /package/dist/{click-outside-container-BLPjMamz.js → click-outside-container-BSIeYt4y.js} +0 -0
  472. /package/dist/{clike-CdT0yHjt.js → clike-CE0fXfM_.js} +0 -0
  473. /package/dist/{clojure-CdyrCpUv.js → clojure-QkBEMU-g.js} +0 -0
  474. /package/dist/{cmake-BFlPxym7.js → cmake-CU1jX7Mo.js} +0 -0
  475. /package/dist/{cobol-CcJXewp8.js → cobol-DMOKzzky.js} +0 -0
  476. /package/dist/{coffeescript-DnKuIKRo.js → coffeescript-DjnjLyfk.js} +0 -0
  477. /package/dist/{colors-CQAOa8cK.js → colors-DmiH1bIH.js} +0 -0
  478. /package/dist/{common-keywords-FBrXPTcz.js → common-keywords-D3nPJNQP.js} +0 -0
  479. /package/dist/{commonlisp-B-kok83Z.js → commonlisp-CYd9iOSe.js} +0 -0
  480. /package/dist/{crystal-FYRYjI1I.js → crystal-Dy55yoYG.js} +0 -0
  481. /package/dist/{css-B45lc2V3.js → css-CNU8w3HJ.js} +0 -0
  482. /package/dist/{cypher-DZMLyVY_.js → cypher-q47DGzK7.js} +0 -0
  483. /package/dist/{cytoscape.esm-ayF70frT.js → cytoscape.esm-Dr8XzXWK.js} +0 -0
  484. /package/dist/{d-x-VVT4o9.js → d-jEkaLvxX.js} +0 -0
  485. /package/dist/{defaultLocale-u-3osm0P.js → defaultLocale-BpsHxBd7.js} +0 -0
  486. /package/dist/{defaultLocale-BoHTsDG6.js → defaultLocale-DoeErsX2.js} +0 -0
  487. /package/dist/{diff-Dxe2mpXk.js → diff-vb2-unFN.js} +0 -0
  488. /package/dist/{dist-BGdYVvOu.js → dist-DsoKosxi.js} +0 -0
  489. /package/dist/{dtd-C9VM_Wfu.js → dtd-C9kR-bXa.js} +0 -0
  490. /package/dist/{duckdb-keywords-CvJhR_Yd.js → duckdb-keywords-B6HYCMOT.js} +0 -0
  491. /package/dist/{dylan-DTSnEIFO.js → dylan-BLckrK-V.js} +0 -0
  492. /package/dist/{ebnf-2D4Ctp3y.js → ebnf-Cnp3L9jg.js} +0 -0
  493. /package/dist/{ecl-N04ptnRK.js → ecl-CEsf6XVg.js} +0 -0
  494. /package/dist/{eiffel-Dd8rpqr_.js → eiffel-2KGZNzx6.js} +0 -0
  495. /package/dist/{elm-GT2E866W.js → elm-D2s3K5wF.js} +0 -0
  496. /package/dist/{emotion-is-prop-valid.esm-DzSb5hsH.js → emotion-is-prop-valid.esm-DdVSF4FD.js} +0 -0
  497. /package/dist/{erlang-Cf0Bp5pY.js → erlang-0PMFOndk.js} +0 -0
  498. /package/dist/{esm-BaaaPNGl.js → esm-CuQHjs36.js} +0 -0
  499. /package/dist/{fcl-Ccj8Z5Xd.js → fcl-D9nccAWI.js} +0 -0
  500. /package/dist/{forth-wd_XzGTg.js → forth-DG89iUsu.js} +0 -0
  501. /package/dist/{fortran-DcwUTZFe.js → fortran-ytKsAVvu.js} +0 -0
  502. /package/dist/{gas-DeALIER3.js → gas-Cg2Fm0N2.js} +0 -0
  503. /package/dist/{gherkin-CKTqaJNX.js → gherkin-B87FEnZ-.js} +0 -0
  504. /package/dist/{groovy-Bwdp_d8D.js → groovy-Dcs08AWD.js} +0 -0
  505. /package/dist/{haskell-DCdCcPLK.js → haskell-cwkOuhx6.js} +0 -0
  506. /package/dist/{haxe-DAyktQWJ.js → haxe-DWEo4q10.js} +0 -0
  507. /package/dist/{http-_DVAYWoR.js → http-B8jdG64J.js} +0 -0
  508. /package/dist/{idl-CBuZiRYu.js → idl-WWQwDcRV.js} +0 -0
  509. /package/dist/{init-uv0kkh4g.js → init-DNBbYZd_.js} +0 -0
  510. /package/dist/{javascript-DzigE11c.js → javascript-BeR74dxD.js} +0 -0
  511. /package/dist/{julia-PwfB-0Cm.js → julia-UlvCUYGL.js} +0 -0
  512. /package/dist/{katex-C_XRmjAP.js → katex-Bld7b-fk.js} +0 -0
  513. /package/dist/{livescript-BJLz1EbT.js → livescript-GPmFcmYV.js} +0 -0
  514. /package/dist/{lua-ZC-XC2jf.js → lua-DYoT_0zM.js} +0 -0
  515. /package/dist/{main-Tj_-QTyF.js → main-B1Jo_8pC.js} +0 -0
  516. /package/dist/{math-DFcdCCU8.js → math-CBNc2Ib0.js} +0 -0
  517. /package/dist/{mathematica-DCYMx6qB.js → mathematica-DSFIQlbG.js} +0 -0
  518. /package/dist/{mbox-OxMK_9XI.js → mbox-ej8lFMdL.js} +0 -0
  519. /package/dist/{micromark-factory-space-DF2w36zS.js → micromark-factory-space-CwHmg6iz.js} +0 -0
  520. /package/dist/{mirc-nJVyhA0H.js → mirc-CAdIdvHQ.js} +0 -0
  521. /package/dist/{mllike-DRO89bsU.js → mllike-CjTB1lHF.js} +0 -0
  522. /package/dist/{modelica-Don3E6ZD.js → modelica-BB68FYMa.js} +0 -0
  523. /package/dist/{mscgen-DJfqD3bN.js → mscgen-BkbzgGGI.js} +0 -0
  524. /package/dist/{mumps-SjGTvDYL.js → mumps-Cu-28E9F.js} +0 -0
  525. /package/dist/{nginx-DasThI7R.js → nginx-C1ofKPst.js} +0 -0
  526. /package/dist/{node-sql-parser-B8nBD36q.js → node-sql-parser-DLl_zNw0.js} +0 -0
  527. /package/dist/{ntriples-CNBKRl3I.js → ntriples-D9cQiZxZ.js} +0 -0
  528. /package/dist/{octave-DdeVHNlx.js → octave-BvtAnPX0.js} +0 -0
  529. /package/dist/{once-DPuqGUeo.js → once-B60G2fuJ.js} +0 -0
  530. /package/dist/{oz-CcKSoNvN.js → oz-COaVHk2E.js} +0 -0
  531. /package/dist/{pascal-6leftwNj.js → pascal-BFpqVD2x.js} +0 -0
  532. /package/dist/{path-BGaWgPKg.js → path-DwWbhZFI.js} +0 -0
  533. /package/dist/{perl-BhJIwWzN.js → perl-DaiORxHP.js} +0 -0
  534. /package/dist/{pig-r-xDHqRf.js → pig-DFzRhmsF.js} +0 -0
  535. /package/dist/{powershell-D-BELeNi.js → powershell-BG2LQNKN.js} +0 -0
  536. /package/dist/{properties-CnuDhbll.js → properties-CqJJR5QY.js} +0 -0
  537. /package/dist/{protobuf-CO8RBhvX.js → protobuf-WwDYV1yY.js} +0 -0
  538. /package/dist/{puppet-NmXHjLy8.js → puppet-QNY3w_uN.js} +0 -0
  539. /package/dist/{python-DAQXi720.js → python-4QrQ3Ugi.js} +0 -0
  540. /package/dist/{q-DlikXfV0.js → q-DhwXuxE2.js} +0 -0
  541. /package/dist/{r-CuohilwT.js → r-Df-nkR25.js} +0 -0
  542. /package/dist/{range-C-rmrM1O.js → range-BOiA8qqU.js} +0 -0
  543. /package/dist/{rpm-0Pjwp0Pb.js → rpm-Cokue07s.js} +0 -0
  544. /package/dist/{ruby-Dq8NJTDG.js → ruby-DrYcL3qF.js} +0 -0
  545. /package/dist/{sas-CuwonyVP.js → sas-CoiPirA5.js} +0 -0
  546. /package/dist/{scheme-CYU-RRIf.js → scheme-CwFLjzHv.js} +0 -0
  547. /package/dist/{semaphore-CNDGTzkX.js → semaphore-C8rmHdhj.js} +0 -0
  548. /package/dist/{shell-COPmX2qE.js → shell-BFV-R24I.js} +0 -0
  549. /package/dist/{sieve-B_3zyLne.js → sieve-CxwXF5T9.js} +0 -0
  550. /package/dist/{simple-mode-DSBniks8.js → simple-mode-DTaJtKPt.js} +0 -0
  551. /package/dist/{smalltalk-DRft7iPv.js → smalltalk-QivVOCtX.js} +0 -0
  552. /package/dist/{solr-RZ9uTl59.js → solr-BLvysN-c.js} +0 -0
  553. /package/dist/{sparql-CN6qj55H.js → sparql-nKsFk8j7.js} +0 -0
  554. /package/dist/{spreadsheet-BNNUNXA2.js → spreadsheet-BWc8C2FT.js} +0 -0
  555. /package/dist/{sql-B4x8IkwU.js → sql-CWfUjlV1.js} +0 -0
  556. /package/dist/{stex-BIsgBmK4.js → stex-DtMAhV4-.js} +0 -0
  557. /package/dist/{stylus-Bn_ZjOQ3.js → stylus-BLKQAycn.js} +0 -0
  558. /package/dist/{swift-BLUJhMbz.js → swift-CJoKqiKj.js} +0 -0
  559. /package/dist/{tcl-C86fxecl.js → tcl-YTeYFNUc.js} +0 -0
  560. /package/dist/{textile-DmHh2rsK.js → textile-C6rKQqMQ.js} +0 -0
  561. /package/dist/{tiddlywiki-DI0mF2WJ.js → tiddlywiki-ZXwTHGNT.js} +0 -0
  562. /package/dist/{tiki-2HU6XLLn.js → tiki-C628O_u4.js} +0 -0
  563. /package/dist/{timer-YZl28NYN.js → timer-BpI_FKSA.js} +0 -0
  564. /package/dist/{toml-GWANRNAD.js → toml-DxlPGbRy.js} +0 -0
  565. /package/dist/{treemap-D-ka1hvx.js → treemap-DY3NBr79.js} +0 -0
  566. /package/dist/{troff-BHTsomIy.js → troff-DFCfH7Ku.js} +0 -0
  567. /package/dist/{ttcn-DQuhn5Mn.js → ttcn-DAW-ERVP.js} +0 -0
  568. /package/dist/{ttcn-cfg-HjFYtdB-.js → ttcn-cfg-CpJ8b7EN.js} +0 -0
  569. /package/dist/{turtle-nCay33Nv.js → turtle-BneV2f8L.js} +0 -0
  570. /package/dist/{vb-BG-XlqqJ.js → vb-D973Vxxh.js} +0 -0
  571. /package/dist/{vbscript-B6vyW0-D.js → vbscript-Dckaq3YO.js} +0 -0
  572. /package/dist/{velocity-CWegueqO.js → velocity-DKty-GUC.js} +0 -0
  573. /package/dist/{verilog-CzSQm4cG.js → verilog-aNaK_biA.js} +0 -0
  574. /package/dist/{vhdl-DqnNVL7r.js → vhdl-CQuehnQy.js} +0 -0
  575. /package/dist/{webidl-DXEUpDWH.js → webidl-Bhg8vaMr.js} +0 -0
  576. /package/dist/{xquery-Ba_NB5bD.js → xquery-D2q16GaM.js} +0 -0
  577. /package/dist/{yacas-HKQU6hyk.js → yacas-DHGOHnNa.js} +0 -0
  578. /package/dist/{z80-CXkHXLdj.js → z80-BPhTmO22.js} +0 -0
@@ -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";
@@ -50,59 +50,128 @@ const messageBuffer = new MessageBuffer(
50
50
  rpc.send.kernelMessage({ message });
51
51
  },
52
52
  );
53
- const bridgeReady = new Deferred<SerializedBridge>();
53
+ interface SessionRequest {
54
+ code: string;
55
+ appId: string;
56
+ sessionGeneration: number;
57
+ }
58
+
59
+ let activeSession:
60
+ | (Omit<SessionRequest, "code"> & { bridge: SerializedBridge })
61
+ | undefined;
62
+ let sessionQueue = Promise.resolve();
63
+
64
+ async function startSession(
65
+ opts: SessionRequest,
66
+ replace: boolean,
67
+ ): Promise<void> {
68
+ await pyodideReadyPromise;
69
+
70
+ try {
71
+ invariant(self.controller, "Controller not loaded");
72
+ if (replace) {
73
+ await stopActiveSession();
74
+ }
75
+ const notebook = await self.controller.mountFilesystem({
76
+ code: opts.code,
77
+ filename: `app-${opts.appId}.py`,
78
+ });
79
+ const nextBridge = await self.controller.startSession({
80
+ ...notebook,
81
+ onMessage: messageBuffer.push,
82
+ });
83
+ if (activeSession) {
84
+ (nextBridge as unknown as PyProxy).destroy();
85
+ } else {
86
+ activeSession = {
87
+ appId: opts.appId,
88
+ bridge: nextBridge,
89
+ sessionGeneration: opts.sessionGeneration,
90
+ };
91
+ }
92
+ rpc.send.initialized({});
93
+ } catch (error) {
94
+ rpc.send.initializedError({
95
+ error: prettyError(error),
96
+ });
97
+ throw error;
98
+ }
99
+ }
100
+
101
+ async function stopActiveSession(): Promise<void> {
102
+ const session = activeSession;
103
+ await self.controller.stopSession();
104
+ activeSession = undefined;
105
+ (session?.bridge as unknown as PyProxy | undefined)?.destroy();
106
+ }
107
+
108
+ function enqueueSession<T>(operation: () => Promise<T>): Promise<T> {
109
+ const result = sessionQueue.then(operation);
110
+ sessionQueue = result.then(
111
+ () => undefined,
112
+ () => undefined,
113
+ );
114
+ return result;
115
+ }
54
116
 
55
117
  // Handle RPC requests
56
118
  const requestHandler = createRPCRequestHandler({
57
119
  /**
58
120
  * Start the session
59
121
  */
60
- startSession: async (opts: { code: string; appId: string }) => {
61
- await pyodideReadyPromise; // Make sure loading is done
122
+ startSession: async (opts: SessionRequest) => {
123
+ await enqueueSession(() => startSession(opts, false));
124
+ },
62
125
 
63
- try {
126
+ replaceSession: async (opts: SessionRequest) => {
127
+ await enqueueSession(() => startSession(opts, true));
128
+ },
129
+
130
+ stopSession: async (opts: { appId: string; sessionGeneration: number }) => {
131
+ await enqueueSession(async () => {
132
+ if (
133
+ activeSession?.appId !== opts.appId ||
134
+ activeSession?.sessionGeneration !== opts.sessionGeneration
135
+ ) {
136
+ return;
137
+ }
64
138
  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;
139
+ await stopActiveSession();
140
+ });
81
141
  },
82
142
 
83
143
  /**
84
144
  * Load packages
85
145
  */
86
- loadPackages: async (code: string) => {
146
+ loadPackages: async (opts: {
147
+ appId: string;
148
+ code: string;
149
+ sessionGeneration: number;
150
+ }) => {
87
151
  await pyodideReadyPromise; // Make sure loading is done
152
+ await enqueueSession(async () => {
153
+ requireActiveBridge(opts);
154
+
155
+ let { code } = opts;
88
156
 
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}`;
157
+ if (shouldLoadDuckDBPackages(code)) {
158
+ // Add pandas and duckdb to the code for mo.sql and for remote duckdb sources
159
+ code = `import pandas\n${code}`;
160
+ code = `import duckdb\n${code}`;
161
+ code = `import sqlglot\n${code}`;
162
+
163
+ // Polars + SQL requires pyarrow, and installing
164
+ // after notebook load does not work. As a heuristic,
165
+ // if it appears that the notebook uses polars, add pyarrow.
166
+ if (code.includes("polars")) {
167
+ code = `import pyarrow\n${code}`;
168
+ }
100
169
  }
101
- }
102
170
 
103
- await self.pyodide.loadPackagesFromImports(code, {
104
- messageCallback: Logger.log,
105
- errorCallback: Logger.error,
171
+ await self.pyodide.loadPackagesFromImports(code, {
172
+ messageCallback: Logger.log,
173
+ errorCallback: Logger.error,
174
+ });
106
175
  });
107
176
  },
108
177
 
@@ -110,37 +179,56 @@ const requestHandler = createRPCRequestHandler({
110
179
  * Call a function on the bridge
111
180
  */
112
181
  bridge: async (opts: {
182
+ appId: string;
113
183
  functionName: keyof RawBridge;
114
184
  payload: {} | undefined | null;
185
+ sessionGeneration: number;
115
186
  }) => {
116
187
  await pyodideReadyPromise; // Make sure loading is done
117
188
 
118
189
  const { functionName, payload } = opts;
119
190
 
120
191
  // 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;
192
+ return enqueueSession(async () => {
193
+ const bridge = requireActiveBridge(opts);
194
+
195
+ // Serialize the payload
196
+ const payloadString =
197
+ payload == null
198
+ ? null
199
+ : typeof payload === "string"
200
+ ? payload
201
+ : JSON.stringify(payload);
202
+
203
+ // Make the request
204
+ const response =
205
+ payloadString == null
206
+ ? // @ts-expect-error ehh TypeScript
207
+ await bridge[functionName]()
208
+ : // @ts-expect-error ehh TypeScript
209
+ await bridge[functionName](payloadString);
210
+
211
+ // Post the response back to the main thread
212
+ return typeof response === "string" ? JSON.parse(response) : response;
213
+ });
141
214
  },
142
215
  });
143
216
 
217
+ function requireActiveBridge(opts: {
218
+ appId: string;
219
+ sessionGeneration: number;
220
+ }): SerializedBridge {
221
+ const session = activeSession;
222
+ if (
223
+ !session ||
224
+ opts.appId !== session.appId ||
225
+ opts.sessionGeneration !== session.sessionGeneration
226
+ ) {
227
+ throw new Error("The marimo app session is no longer active.");
228
+ }
229
+ return session.bridge;
230
+ }
231
+
144
232
  // create the iframe's schema
145
233
  export type WorkerSchema = RPCSchema<
146
234
  {
@@ -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,
@@ -114,6 +114,13 @@ describe("createNetworkRequests", () => {
114
114
  );
115
115
  });
116
116
 
117
+ it("getEnvironmentInfo should GET /api/environment", async () => {
118
+ const requests = createNetworkRequests();
119
+ await requests.getEnvironmentInfo();
120
+
121
+ expect(mockClient.GET).toHaveBeenCalledWith("/api/environment");
122
+ });
123
+
117
124
  it("exportAsIPYNB should call the new endpoint as text", async () => {
118
125
  const requests = createNetworkRequests();
119
126
  await requests.exportAsIPYNB({
@@ -29,12 +29,17 @@ type AllRequests = EditRequests & RunRequests;
29
29
  // - waitForConnectionOpen: Waits for an existing connection but won't start one.
30
30
  // Use for operations that depend on a running kernel but shouldn't be the
31
31
  // trigger to start it (e.g., saving, interrupting).
32
+ //
33
+ // - serverOnly: Calls the HTTP delegate directly without touching the kernel.
34
+ // Use for requests served by the marimo server itself, which resolve without
35
+ // a session (e.g., fetching environment diagnostics).
32
36
 
33
37
  type Action =
34
38
  | "throwError"
35
39
  | "dropRequest"
36
40
  | "startConnection"
37
- | "waitForConnectionOpen";
41
+ | "waitForConnectionOpen"
42
+ | "serverOnly";
38
43
 
39
44
  const ACTIONS: Record<keyof AllRequests, Action> = {
40
45
  // These will start a connection if not already connected and then wait until the connection is open
@@ -96,6 +101,9 @@ const ACTIONS: Record<keyof AllRequests, Action> = {
96
101
  sendFileDetails: "throwError",
97
102
  openFile: "throwError",
98
103
 
104
+ // Served by the marimo server without a kernel session
105
+ getEnvironmentInfo: "serverOnly",
106
+
99
107
  // Home operations throw errors
100
108
  getRecentFiles: "startConnection",
101
109
  getWorkspaceFiles: "startConnection",
@@ -155,6 +163,10 @@ export function createLazyRequests(
155
163
  }
156
164
 
157
165
  switch (action) {
166
+ case "serverOnly":
167
+ // Served by the marimo server itself; no kernel required
168
+ return request(...args);
169
+
158
170
  case "dropRequest":
159
171
  Logger.debug(
160
172
  `Dropping request: ${key}, since not connected to a kernel.`,
@@ -285,6 +285,9 @@ export function createNetworkRequests(): EditRequests & RunRequests {
285
285
  await waitForConnectionOpen();
286
286
  return getClient().GET("/api/usage").then(handleResponse);
287
287
  },
288
+ getEnvironmentInfo: () => {
289
+ return getClient().GET("/api/environment").then(handleResponse);
290
+ },
288
291
  sendPdb: (request) => {
289
292
  return getClient()
290
293
  .POST("/api/kernel/pdb/pm", {
@@ -65,6 +65,7 @@ export function createStaticRequests(): EditRequests & RunRequests {
65
65
  validateSQL: throwNotInEditMode,
66
66
  openFile: throwNotInEditMode,
67
67
  getUsageStats: throwNotInEditMode,
68
+ getEnvironmentInfo: throwNotInEditMode,
68
69
  sendListFiles: throwNotInEditMode,
69
70
  sendSearchFiles: throwNotInEditMode,
70
71
  sendPdb: throwNotInEditMode,
@@ -46,6 +46,7 @@ export function createErrorToastingRequests(
46
46
  validateSQL: "Failed to validate SQL",
47
47
  openFile: "Failed to open file",
48
48
  getUsageStats: "", // No toast
49
+ getEnvironmentInfo: "", // No toast
49
50
  sendListFiles: "Failed to list files",
50
51
  sendSearchFiles: "Failed to search files",
51
52
  sendPdb: "Failed to start debug session",
@@ -107,6 +107,8 @@ export type UpdateUIElementValuesRequest =
107
107
  schemas["UpdateUIElementValuesRequest"];
108
108
  export type UsageResponse =
109
109
  paths["/api/usage"]["get"]["responses"]["200"]["content"]["application/json"];
110
+ export type EnvironmentInfo =
111
+ paths["/api/environment"]["get"]["responses"]["200"]["content"]["application/json"];
110
112
  export type WorkspaceFilesRequest = schemas["WorkspaceFilesRequest"];
111
113
  export type WorkspaceFilesResponse = schemas["WorkspaceFilesResponse"];
112
114
  export type RunningNotebooksResponse = schemas["RunningNotebooksResponse"];
@@ -171,6 +173,7 @@ export interface EditRequests {
171
173
  validateSQL: (request: ValidateSQLRequest) => Promise<null>;
172
174
  openFile: (request: { path: string; lineNumber?: number }) => Promise<null>;
173
175
  getUsageStats: () => Promise<UsageResponse>;
176
+ getEnvironmentInfo: () => Promise<EnvironmentInfo>;
174
177
  // Debugger
175
178
  sendPdb: (request: DebugCellRequest) => Promise<null>;
176
179
  sendSetBreakpoints: (request: SetBreakpointsRequest) => Promise<null>;
@@ -154,6 +154,70 @@ describe("RuntimeManager", () => {
154
154
  });
155
155
  });
156
156
 
157
+ describe("formatNavigableHttpURL", () => {
158
+ it("adds access_token when cross-origin with authToken", () => {
159
+ const runtime = new RuntimeManager(
160
+ {
161
+ url: "https://sandbox.example.com",
162
+ lazy: true,
163
+ authToken: "my-secret-token",
164
+ },
165
+ true,
166
+ );
167
+ const url = runtime.formatNavigableHttpURL(
168
+ "api/files/download",
169
+ new URLSearchParams({ path: "/tmp/data.csv" }),
170
+ );
171
+
172
+ expect(url.pathname).toBe("/api/files/download");
173
+ expect(url.searchParams.get("path")).toBe("/tmp/data.csv");
174
+ expect(url.searchParams.get("access_token")).toBe("my-secret-token");
175
+ });
176
+
177
+ it("omits access_token when same-origin", () => {
178
+ const runtime = new RuntimeManager(
179
+ {
180
+ url: window.location.origin,
181
+ lazy: true,
182
+ authToken: "my-secret-token",
183
+ },
184
+ true,
185
+ );
186
+ const url = runtime.formatNavigableHttpURL(
187
+ "api/files/download",
188
+ new URLSearchParams({ path: "/tmp/data.csv" }),
189
+ );
190
+
191
+ expect(url.searchParams.get("access_token")).toBeNull();
192
+ expect(url.searchParams.get("path")).toBe("/tmp/data.csv");
193
+ });
194
+
195
+ it("omits access_token when no authToken configured", () => {
196
+ const runtime = new RuntimeManager(
197
+ { url: "https://sandbox.example.com", lazy: true },
198
+ true,
199
+ );
200
+ const url = runtime.formatNavigableHttpURL("api/files/download");
201
+
202
+ expect(url.searchParams.get("access_token")).toBeNull();
203
+ });
204
+
205
+ it("does not forward a page-inherited access_token when same-origin", () => {
206
+ const runtime = new RuntimeManager(
207
+ { url: window.location.origin, lazy: true },
208
+ true,
209
+ );
210
+ const original = window.location.href;
211
+ window.history.replaceState({}, "", "/?access_token=page-token");
212
+ try {
213
+ const url = runtime.formatNavigableHttpURL("api/files/download");
214
+ expect(url.searchParams.get("access_token")).toBeNull();
215
+ } finally {
216
+ window.history.replaceState({}, "", original);
217
+ }
218
+ });
219
+ });
220
+
157
221
  describe("getSseURL", () => {
158
222
  it("should return an http(s) URL with the session ID", () => {
159
223
  const runtime = new RuntimeManager(mockConfig);
@@ -86,6 +86,35 @@ export class RuntimeManager {
86
86
  return baseUrl;
87
87
  }
88
88
 
89
+ /**
90
+ * Channels that cannot send custom headers (WebSockets, and browser
91
+ * navigations such as file downloads) carry the auth token as a query
92
+ * param instead, but only when cross-origin. Same-origin requests
93
+ * authenticate via the session cookie, which keeps the token out of
94
+ * browser history and logs; cross-origin cookies are blocked by browsers,
95
+ * so the access_token query param is the only option there.
96
+ */
97
+ private appendCrossOriginAuth(url: URL): URL {
98
+ if (!this.isSameOrigin && this.config.authToken) {
99
+ url.searchParams.set(KnownQueryParams.accessToken, this.config.authToken);
100
+ }
101
+ return url;
102
+ }
103
+
104
+ /**
105
+ * An HTTP URL for requests made by browser navigation (e.g. anchor-click
106
+ * downloads), which cannot attach auth headers.
107
+ */
108
+ formatNavigableHttpURL(path: string, searchParams?: URLSearchParams): URL {
109
+ const url = this.formatHttpURL({ path, searchParams });
110
+ // Drop any token inherited from the current page's query params; re-add it
111
+ // only when cross-origin. Same-origin downloads authenticate via the
112
+ // session cookie, so a token in the URL would needlessly leak into
113
+ // proxy/server logs.
114
+ url.searchParams.delete(KnownQueryParams.accessToken);
115
+ return this.appendCrossOriginAuth(url);
116
+ }
117
+
89
118
  formatWsURL(path: string, searchParams?: URLSearchParams): URL {
90
119
  // We don't restrict to known query parameters, since mo.query_params()
91
120
  // can accept arbitrary parameters.
@@ -94,16 +123,7 @@ export class RuntimeManager {
94
123
  searchParams,
95
124
  restrictToKnownQueryParams: false,
96
125
  });
97
-
98
- // For cross-origin runtimes, pass the auth token as a query parameter.
99
- // WebSocket connections cannot send custom headers (no Authorization
100
- // header), and cross-origin cookies are blocked by browsers, so the
101
- // access_token query param is the only way to authenticate.
102
- if (!this.isSameOrigin && this.config.authToken) {
103
- url.searchParams.set(KnownQueryParams.accessToken, this.config.authToken);
104
- }
105
-
106
- return asWsUrl(url.toString());
126
+ return asWsUrl(this.appendCrossOriginAuth(url).toString());
107
127
  }
108
128
 
109
129
  /**