@marimo-team/islands 0.23.15-dev6 → 0.23.15-dev63
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.
- package/dist/{ConnectedDataExplorerComponent-CU4fZJzG.js → ConnectedDataExplorerComponent-CJaUI-S-.js} +85 -84
- package/dist/{ErrorBoundary-DE6tzZf-.js → ErrorBoundary-DXlxsrTF.js} +3 -3
- package/dist/{ImageComparisonComponent-CHrI72em.js → ImageComparisonComponent-C3y7L3eJ.js} +173 -129
- package/dist/{any-language-editor-DN1R-1KZ.js → any-language-editor-P9tjkj4n.js} +21 -21
- package/dist/apl-e1B5LPEL.js +4 -0
- package/dist/{arc-DfkSnvZm.js → arc-CTIpFoOn.js} +2 -2
- package/dist/architecture-7HQA4BMR-DHUrQjL4.js +6 -0
- package/dist/{architectureDiagram-VXUJARFQ-CT2SuxNw.js → architectureDiagram-VXUJARFQ-DXwkyAaM.js} +19 -19
- package/dist/asciiarmor-B-gwgesP.js +4 -0
- package/dist/asn1-DF2ckRB4.js +4 -0
- package/dist/assets/__vite-browser-external-CjNAy01L.js +1 -0
- package/dist/assets/worker-B3XPCb6y.js +98 -0
- package/dist/{blockDiagram-VD42YOAC-Dy7hlFla.js → blockDiagram-VD42YOAC-CIOjvxeD.js} +12 -12
- package/dist/brainfuck-4G-7_gq_.js +4 -0
- package/dist/{button-BacYv-bE.js → button-BcSml68y.js} +12 -65
- package/dist/{c4Diagram-YG6GDRKO-BXlAmZ8Z.js → c4Diagram-YG6GDRKO-B6dZC_oU.js} +6 -6
- package/dist/{capabilities-D_4LYhSU.js → capabilities-BYLFYTYv.js} +2 -2
- package/dist/{channel-D_PHgcig.js → channel-BN070S0F.js} +1 -1
- package/dist/{chat-ui-DinOvbWu.js → chat-ui-BdSDiVjk.js} +3122 -3116
- package/dist/{check-C9OoNtR4.js → check-Cs-KV5XY.js} +1 -1
- package/dist/{chunk-4BX2VUAB-CzXltWHN.js → chunk-4BX2VUAB-iU5lQTDI.js} +1 -1
- package/dist/{chunk-4F5CHEZ2-D9nGEHV8.js → chunk-4F5CHEZ2-VlodlEGo.js} +1 -1
- package/dist/{chunk-55IACEB6-B-1mjMMC.js → chunk-55IACEB6-7h71GwyW.js} +1 -1
- package/dist/{chunk-5FQGJX7Z-BbqSm5gU.js → chunk-5FQGJX7Z-B9WoXK1R.js} +3 -3
- package/dist/{chunk-ABZYJK2D-Dz0-H2B5.js → chunk-ABZYJK2D-BxBDji1u.js} +3 -3
- package/dist/{chunk-ATLVNIR6-o0Z5MZLd.js → chunk-ATLVNIR6-qFiszptQ.js} +2 -2
- package/dist/{chunk-B2363JML-KEJpLGGP.js → chunk-B2363JML-zL3VngtH.js} +1 -1
- package/dist/{chunk-B4BG7PRW-BL98U9B4.js → chunk-B4BG7PRW-B_z2FEHm.js} +7 -7
- package/dist/{chunk-CVBHYZKI-B_c5YBcW.js → chunk-CVBHYZKI-CwazXVlJ.js} +1 -1
- package/dist/{chunk-DI55MBZ5-Dwkn0LWm.js → chunk-DI55MBZ5-D4Y8yV8B.js} +6 -6
- package/dist/{chunk-EXTU4WIE-9sNjmQrB.js → chunk-EXTU4WIE-BQPBhApE.js} +2 -2
- package/dist/{chunk-FMBD7UC4-Ie8M9q0W.js → chunk-FMBD7UC4-quJmebXa.js} +1 -1
- package/dist/{chunk-FRFDVMJY-DzQqMWrl.js → chunk-FRFDVMJY-BHBqN-vD.js} +1 -1
- package/dist/{chunk-HN2XXSSU-E3n-Ys7Z.js → chunk-HN2XXSSU-Bv0QkeMr.js} +1 -1
- package/dist/{chunk-JA3XYJ7Z-C32Y7Epf.js → chunk-JA3XYJ7Z-CY4CRbV5.js} +3 -3
- package/dist/{chunk-JZLCHNYA-C6ftyVMN.js → chunk-JZLCHNYA-DWIR9m5O.js} +6 -6
- package/dist/{chunk-MI3HLSF2-CUYEasXO.js → chunk-MI3HLSF2-HGWI-8Pg.js} +1 -1
- package/dist/{chunk-N4CR4FBY-DUhGZhZs.js → chunk-N4CR4FBY-Bw2HcMNc.js} +7 -7
- package/dist/{chunk-PL6DKKU2-D7km-08O.js → chunk-PL6DKKU2-CAHKc95s.js} +1 -1
- package/dist/{chunk-QN33PNHL-0K6SDYn3.js → chunk-QN33PNHL-DPBNNzpR.js} +2 -2
- package/dist/{chunk-QXUST7PY-DMhsRpYK.js → chunk-QXUST7PY-DtC2t9Mk.js} +10 -10
- package/dist/{chunk-QZHKN3VN-DRjXVwuJ.js → chunk-QZHKN3VN-Dym5BS7y.js} +1 -1
- package/dist/{chunk-S3R3BYOJ-oAe3dEbO.js → chunk-S3R3BYOJ-BdgLc8AM.js} +4 -4
- package/dist/{chunk-SJTYNZTY-BkJrPRFC.js → chunk-SJTYNZTY-DnXoKWpW.js} +1 -1
- package/dist/{chunk-TCCFYFTB-D58KeXnC.js → chunk-TCCFYFTB-DPWJa9zL.js} +1 -1
- package/dist/{chunk-TQ3KTPDO-D_yA_wAb.js → chunk-TQ3KTPDO-CsDx6v37.js} +1 -1
- package/dist/{chunk-TZMSLE5B-yBKS_DQU.js → chunk-TZMSLE5B-BzSHcq-K.js} +3 -3
- package/dist/{chunk-UMXZTB3W-D7uwvNjd.js → chunk-UMXZTB3W-D1uHz8MN.js} +1 -1
- package/dist/classDiagram-2ON5EDUG-BiQPjMNY.js +30 -0
- package/dist/classDiagram-v2-WZHVMYZB-YHdR8fqM.js +30 -0
- package/dist/{clike-DTxNUn7l.js → clike-7lgyEYRk.js} +1 -1
- package/dist/clojure-CUybM11R.js +4 -0
- package/dist/cmake-BPjGcuDL.js +4 -0
- package/dist/cobol-BETk_nb6.js +4 -0
- package/dist/{code-block-37QAKDTI-O6IH6wAi.js → code-block-37QAKDTI-MSxEjskJ.js} +1 -1
- package/dist/{code-visibility-Dpab3kCj.js → code-visibility-yIEEWI5w.js} +1554 -1471
- package/dist/coffeescript-CManZxXL.js +4 -0
- package/dist/commonlisp-DWkn7GW8.js +4 -0
- package/dist/{copy-COam1EG7.js → copy-Cs3yt6Vt.js} +2 -2
- package/dist/{cose-bilkent-S5V4N54A-kjoZoid4.js → cose-bilkent-S5V4N54A-BYj0aL7z.js} +2 -2
- package/dist/crystal-CCbg5EUH.js +4 -0
- package/dist/css-By8eo-XS.js +4 -0
- package/dist/cypher-DwfHg3nP.js +4 -0
- package/dist/d-Brs1wNbw.js +4 -0
- package/dist/{dagre-6UL2VRFP-J0JKgwOt.js → dagre-6UL2VRFP-DpYjBqQs.js} +11 -11
- package/dist/{data-grid-overlay-editor-C6lxUJp-.js → data-grid-overlay-editor-BWRG2b_o.js} +2 -2
- package/dist/{constants-T20xxyNf.js → debounce-BOD3DbfP.js} +1 -24
- package/dist/{diagram-PSM6KHXK-DYgJuNk9.js → diagram-PSM6KHXK-D4ftnaua.js} +22 -22
- package/dist/{diagram-QEK2KX5R-CKdBR2sb.js → diagram-QEK2KX5R-DVlUOgs1.js} +17 -17
- package/dist/{diagram-S2PKOQOG-Dpi7mo5W.js → diagram-S2PKOQOG-CGh4OMEV.js} +17 -17
- package/dist/diff-DJIRmJ1g.js +4 -0
- package/dist/{dist-DyyjKEYf.js → dist-3NCqaWjt.js} +2 -2
- package/dist/{dist-D-W5ny5a.js → dist-4lVIWUT3.js} +1 -1
- package/dist/dist-5o9uz19x.js +5 -0
- package/dist/{dist-GZXUmt0b.js → dist-B2jmQKKx.js} +2 -2
- package/dist/{dist--2Bqjvs0.js → dist-B96tMAst.js} +2 -2
- package/dist/{dist-BaoDKvdy.js → dist-BCX980mU.js} +2 -2
- package/dist/{dist-DMjWuVs8.js → dist-BIEt-mlF.js} +1 -1
- package/dist/{dist-BR_gyG9L.js → dist-BO5HRiTf.js} +2 -2
- package/dist/{dist-Dv_Y15yk.js → dist-BOMbzyb3.js} +85 -85
- package/dist/{dist-CIYBwstr.js → dist-BP39XM8u.js} +1 -1
- package/dist/{dist-DZo4nSS0.js → dist-BPF0gTRZ.js} +6 -6
- package/dist/{dist-BSAt6RhH.js → dist-BTdrwBWP.js} +22 -22
- package/dist/{dist-BY018Paw.js → dist-BdqCKQ1O.js} +2 -2
- package/dist/dist-BpDH0DEP.js +5 -0
- package/dist/dist-BpXhbQXO.js +8 -0
- package/dist/{dist-CcWX6tmx.js → dist-BpeiYpG2.js} +2 -2
- package/dist/{dist-A2846XWO.js → dist-BwhXBwMd.js} +1 -1
- package/dist/dist-ByadAk_L.js +5 -0
- package/dist/{dist-abid3KgM.js → dist-C18MUWTj.js} +2 -2
- package/dist/{dist-DZORgqKY.js → dist-C2_4pjuS.js} +1 -1
- package/dist/{dist-BzEzfugY.js → dist-CFSb_Frm.js} +1 -1
- package/dist/dist-CK0g7JvP.js +8 -0
- package/dist/{dist-C_Y3oV3C.js → dist-CRmSjkLP.js} +2 -2
- package/dist/{dist-hT4QzYX-.js → dist-CSlJrrAw.js} +86 -81
- package/dist/{dist-Du8WkPuU.js → dist-CV79CsQ0.js} +2 -2
- package/dist/dist-CfzCtiq2.js +5 -0
- package/dist/{dist-CoXAujgg.js → dist-D3bdsa1d.js} +4 -4
- package/dist/dist-D8JtVFrW.js +8 -0
- package/dist/dist-DK2Oocpu.js +6 -0
- package/dist/{dist-LTU8Hdvn.js → dist-DZwp8lro.js} +3 -3
- package/dist/{dist-t9Kf7xqC.js → dist-DaXJPX8F.js} +2 -2
- package/dist/{dist-U4F-tbMs.js → dist-De-GlSAs.js} +246 -184
- package/dist/{dist-M9Vag9Y0.js → dist-DgjbnqTg.js} +125 -125
- package/dist/dist-DnSu977r.js +5 -0
- package/dist/{dist-CxJDU6Bh.js → dist-DviUBLUp.js} +4 -4
- package/dist/{dist-CpxNdDkw.js → dist-DwqBJ014.js} +2 -2
- package/dist/{dist-Bf7SHuNp.js → dist-JGehap7K.js} +5 -5
- package/dist/{dist-Bk75fBZA.js → dist-LpLXa9Lb.js} +2 -2
- package/dist/{dist-Bf9f8MuT.js → dist-SXNmlE8A.js} +1 -1
- package/dist/dist-UmxJm6sW.js +8 -0
- package/dist/dist-aYSBQSyM.js +5 -0
- package/dist/dist-kkZ1Ztlh.js +6 -0
- package/dist/dist-ngPczwNi.js +5 -0
- package/dist/{dist-DgGbNavJ.js → dist-pqIwD8VD.js} +2 -2
- package/dist/dist-wQRyxyTV.js +5 -0
- package/dist/{dist-Dax--nl9.js → dist-w_gWE5Wf.js} +1 -1
- package/dist/{dockerfile-twL37N91.js → dockerfile-B82Pkz_V.js} +1 -1
- package/dist/dtd-Dyiazv4N.js +4 -0
- package/dist/dylan-D8Fcw7NA.js +4 -0
- package/dist/ecl-CjKp8Vii.js +4 -0
- package/dist/eiffel-K9ViOX5r.js +4 -0
- package/dist/elm-B5NVtRco.js +4 -0
- package/dist/{erDiagram-Q2GNP2WA-BU-m41EQ.js → erDiagram-Q2GNP2WA-BcKAHFqF.js} +15 -15
- package/dist/erlang-BnLzgk7R.js +4 -0
- package/dist/{error-banner-DFPfz_Qf.js → error-banner-DR7o3CbX.js} +68 -68
- package/dist/{esm-ga2Bf3O2.js → esm-DKOv6P2M.js} +424 -424
- package/dist/esm-k8PIvuZW.js +1180 -0
- package/dist/{extends-9MVIxxRo.js → extends-Cq2JYHKy.js} +36 -20
- package/dist/{factor-CajWS6mS.js → factor-Bq2mGIHt.js} +1 -1
- package/dist/factor-C7f9Jz5R.js +4 -0
- package/dist/{flowDiagram-NV44I4VS-CRoXKjGq.js → flowDiagram-NV44I4VS-BRhSg-ro.js} +17 -17
- package/dist/{formats-Dzx4J_z1.js → formats-BFhkZJwd.js} +3 -3
- package/dist/forth-rGM8jLao.js +4 -0
- package/dist/fortran-B3acSe0i.js +4 -0
- package/dist/{ganttDiagram-JELNMOA3-7mq5f9cO.js → ganttDiagram-JELNMOA3-CXXCN7LN.js} +10 -10
- package/dist/gas-Bb1Vmv_N.js +4 -0
- package/dist/gherkin-C9Lyidgd.js +4 -0
- package/dist/{gitGraph-G5XIXVHT-DiniR35k.js → gitGraph-G5XIXVHT-BjTx0kww.js} +3 -3
- package/dist/{gitGraphDiagram-V2S2FVAM-Dfuokq6w.js → gitGraphDiagram-V2S2FVAM-BOlkMSqK.js} +17 -17
- package/dist/{glide-data-editor-CjTu7ukN.js → glide-data-editor--CaN-f27.js} +13 -13
- package/dist/groovy-DQk6XcGH.js +4 -0
- package/dist/haskell-mV0Vw9gv.js +4 -0
- package/dist/haxe-DqxN89zH.js +5 -0
- package/dist/{html-to-image-_wGfk8V-.js → html-to-image-DDENewl2.js} +2649 -2607
- package/dist/idl-ya8W561J.js +4 -0
- package/dist/{info-VBDWY6EO-DVZvGhkQ.js → info-VBDWY6EO-CA67FznA.js} +3 -3
- package/dist/infoDiagram-HS3SLOUP-D3TyKnL_.js +30 -0
- package/dist/{input-DtsN7xm-.js → input-DStQIuqD.js} +51 -51
- package/dist/javascript-CgqgptVu.js +4 -0
- package/dist/{journeyDiagram-XKPGCS4Q-8XYSU1GI.js → journeyDiagram-XKPGCS4Q-DEal0aT1.js} +7 -7
- package/dist/julia-CFQ-HusI.js +4 -0
- package/dist/{kanban-definition-3W4ZIXB7--9pT9z1R.js → kanban-definition-3W4ZIXB7-Dl90wENN.js} +12 -12
- package/dist/{katex-9-9QRhxz.js → katex-C4t-BmrK.js} +1 -1
- package/dist/{label-WfTSU8L4.js → label-DIk0QoFe.js} +2 -2
- package/dist/{line-C5s_12ee.js → line-C43FIPBd.js} +3 -3
- package/dist/{linear-B5-AFRiR.js → linear-H_vsH9ao.js} +4 -4
- package/dist/livescript-D__3TmDo.js +4 -0
- package/dist/{loader-Boph2xIS.js → loader-CTHCI-qe.js} +5 -16
- package/dist/lua-Bytcgj_W.js +4 -0
- package/dist/main.js +2217 -2116
- package/dist/mathematica-DJhvVKvl.js +4 -0
- package/dist/mbox-IGHPCjfR.js +4 -0
- package/dist/{mermaid-4DMBBIKO-Eg3D4FVz.js → mermaid-4DMBBIKO-FXbOziy9.js} +1 -1
- package/dist/{mermaid-BYqXy_NE.js → mermaid-CdSvixW2.js} +47 -47
- package/dist/{mermaid-parser.core-C3XRsazI.js → mermaid-parser.core-DoivvxPd.js} +8 -8
- package/dist/{mhchem-yiCCuiEF.js → mhchem-EGhUZR1V.js} +1 -1
- package/dist/{mindmap-definition-VGOIOE7T-B-4mnfFG.js → mindmap-definition-VGOIOE7T-CCDupjWW.js} +14 -14
- package/dist/mirc-tcwvVugm.js +4 -0
- package/dist/mllike-Dx91i62r.js +6 -0
- package/dist/modelica-_SRt-yU5.js +4 -0
- package/dist/mscgen-GZrGS9gt.js +6 -0
- package/dist/mumps-Cv3ygyod.js +4 -0
- package/dist/nsis-BU7GeGbI.js +4 -0
- package/dist/{nsis-ClF3r5Tr.js → nsis-i9_sgigf.js} +1 -1
- package/dist/ntriples-CL-FCYXb.js +4 -0
- package/dist/{number-overlay-editor-BLJXvX9c.js → number-overlay-editor-Ck_mc_gT.js} +1 -1
- package/dist/objects-De59twF-.js +56 -0
- package/dist/octave-Dc6_3DIu.js +4 -0
- package/dist/{ordinal-ArJavP1Q.js → ordinal-Bkv2-veX.js} +1 -1
- package/dist/oz-DpUAJCXf.js +4 -0
- package/dist/{packet-DYOGHKS2-34raHOiB.js → packet-DYOGHKS2-Bkgofxf3.js} +3 -3
- package/dist/pascal-B17mncXs.js +4 -0
- package/dist/perl-BTpK97q9.js +4 -0
- package/dist/{pie-VRWISCQL-BaLlzZa3.js → pie-VRWISCQL-B1AMhN_7.js} +3 -3
- package/dist/{pieDiagram-ADFJNKIX-Cr3cNpZY.js → pieDiagram-ADFJNKIX-JvXG_6hk.js} +22 -22
- package/dist/pig-CFb638Ap.js +4 -0
- package/dist/powershell-Cxo-_2A5.js +4 -0
- package/dist/{precisionRound-Tqb4mg-H.js → precisionRound-CnHPY_5v.js} +1 -1
- package/dist/{process-output-Mh4UrjwM.js → process-output-2QPcgBQg.js} +4 -4
- package/dist/properties-BPgT1xTB.js +4 -0
- package/dist/protobuf-BgHBaIIK.js +4 -0
- package/dist/pug-25-oS0SG.js +4 -0
- package/dist/{pug-B_rby2yb.js → pug-BhE2JRSg.js} +1 -1
- package/dist/puppet-DarIr20S.js +4 -0
- package/dist/purify.es-EnR5yhgI.js +783 -0
- package/dist/python-BqmOsBsi.js +4 -0
- package/dist/q-D3QJCTup.js +4 -0
- package/dist/{quadrantDiagram-AYHSOK5B-BuNL8Q93.js → quadrantDiagram-AYHSOK5B-BqDB9tUC.js} +5 -5
- package/dist/r-Cz_yBX4z.js +4 -0
- package/dist/{radar-ZZBFDIW7-Ci7bfoZa.js → radar-ZZBFDIW7-C2b7A32s.js} +3 -3
- package/dist/{react-vega-B0sAlDTL.js → react-vega-BazDALhI.js} +469 -469
- package/dist/{requirementDiagram-UZGBJVZJ-BG2lLUN1.js → requirementDiagram-UZGBJVZJ-KbVt8SPH.js} +14 -14
- package/dist/{reveal-component-BfYO8h-9.js → reveal-component-CCyp8KHw.js} +629 -622
- package/dist/rpm-DGOtYwAI.js +5 -0
- package/dist/ruby-DBZu4rPc.js +4 -0
- package/dist/{sankeyDiagram-TZEHDZUN-DMal8sps.js → sankeyDiagram-TZEHDZUN-DgkF38jx.js} +5 -5
- package/dist/sas-Dd1D9qTq.js +4 -0
- package/dist/scheme-BmDjvTHX.js +4 -0
- package/dist/{sequenceDiagram-WL72ISMW-DT6Tk-Eo.js → sequenceDiagram-WL72ISMW-BDmx9n95.js} +8 -8
- package/dist/shell-BL8zFSaj.js +4 -0
- package/dist/sieve-BAx2WqUP.js +4 -0
- package/dist/smalltalk-CYRzF7VV.js +4 -0
- package/dist/sparql-YWaDRO4A.js +4 -0
- package/dist/{spec-Cz-Bj1JI.js → spec-CnaxwDqy.js} +4 -4
- package/dist/{src-Bf2iLOlr.js → src-DV3ha_nA.js} +1 -1
- package/dist/{stateDiagram-FKZM4ZOC-CB_lodq3.js → stateDiagram-FKZM4ZOC-ByOvQf2n.js} +17 -17
- package/dist/stateDiagram-v2-4FDKWEC3-C3xqeavR.js +29 -0
- package/dist/{step-CWipAYTY.js → step-BqHnkgWE.js} +1 -1
- package/dist/stex-B5O-env2.js +4 -0
- package/dist/{strings-Dq_j3Rxw.js → strings-BYAhZnQi.js} +354 -354
- package/dist/style.css +1 -1
- package/dist/stylus-lYsyLFc1.js +4 -0
- package/dist/swift-ClQz9z1n.js +4 -0
- package/dist/{swiper-component-5HoSsPi1.js → swiper-component-DE94711u.js} +4 -4
- package/dist/tcl-B3jhsfqY.js +4 -0
- package/dist/textile-Cb1Dw7Aq.js +4 -0
- package/dist/{time-CsmIF9YZ.js → time-Bb4A7I6a.js} +4 -4
- package/dist/{timeline-definition-IT6M3QCI-NfSKRvH0.js → timeline-definition-IT6M3QCI-CkD_trIn.js} +4 -4
- package/dist/{toDate-CWNNlFEX.js → toDate-B3IRfHhw.js} +16 -7
- package/dist/toml-nHZhetdO.js +4 -0
- package/dist/{tooltip-Czds6Qr8.js → tooltip-B-qh7UPB.js} +3 -3
- package/dist/{treemap-GDKQZRPO-Cl6OQh8D.js → treemap-GDKQZRPO-SDux0AV8.js} +3 -3
- package/dist/troff-DuJAGWKH.js +4 -0
- package/dist/ttcn-BxrcwP21.js +4 -0
- package/dist/ttcn-cfg-BAg_9dcc.js +4 -0
- package/dist/turtle-zCq949as.js +4 -0
- package/dist/{types-C2Ir191_.js → types-DQl7jVYK.js} +1 -1
- package/dist/use-vega-container-remeasure-DGNrIQSk.js +27 -0
- package/dist/{useAsyncData-KfHB8wQR.js → useAsyncData-CvO8WUy3.js} +1 -1
- package/dist/{useDateFormatter-CMnRuVmN.js → useDateFormatter-BSoGim-G.js} +2 -2
- package/dist/{useDeepCompareMemoize-nJMtxhm4.js → useDeepCompareMemoize-J3MKRdA4.js} +1 -1
- package/dist/{useIframeCapabilities-DWIYvDh7.js → useIframeCapabilities-POcFXHbw.js} +1 -1
- package/dist/{useLifecycle-DegSo0lV.js → useLifecycle-DqPxHgAN.js} +3 -3
- package/dist/{useTheme-6eZ3GOTS.js → useTheme-XMq9mNf_.js} +65 -29
- package/dist/vb-De5hElus.js +4 -0
- package/dist/vbscript-Cypcpv4F.js +4 -0
- package/dist/{vega-component-DzyyM9fc.js → vega-component-CrFoZT1S.js} +225 -223
- package/dist/vega-embed-container-DAQAMjiO.js +22 -0
- package/dist/vega-loader.browser-DmpxCJqx.js +1353 -0
- package/dist/velocity-Di7l-yhe.js +4 -0
- package/dist/verilog-Bzi-S3g2.js +4 -0
- package/dist/vhdl-B0ZZITaW.js +4 -0
- package/dist/webidl-0sviiRcN.js +4 -0
- package/dist/xquery-B4qMVWaB.js +4 -0
- package/dist/{xychartDiagram-PRI3JC2R-BvwftqMA.js → xychartDiagram-PRI3JC2R-BSkNxYNw.js} +13 -13
- package/dist/yacas-Jt25Fuv8.js +4 -0
- package/dist/z80-CrcbYzmp.js +4 -0
- package/dist/{zod-CijjQh4u.js → zod-D0yOqoGe.js} +26 -26
- package/package.json +3 -1
- package/src/__mocks__/requests.ts +3 -0
- package/src/components/charts/lazy.tsx +3 -1
- package/src/components/charts/vega-embed-container.tsx +18 -0
- package/src/components/chat/__tests__/chat-utils.test.ts +244 -1
- package/src/components/chat/__tests__/message-queue.test.tsx +121 -0
- package/src/components/chat/chat-panel.tsx +196 -67
- package/src/components/chat/chat-utils.ts +111 -2
- package/src/components/editor/RecoveryButton.tsx +2 -2
- package/src/components/editor/SortableCell.tsx +6 -2
- package/src/components/editor/__tests__/output-persistence.test.tsx +241 -0
- package/src/components/editor/actions/__tests__/pair-with-agent-commands.test.ts +153 -0
- package/src/components/editor/actions/pair-with-agent-commands.ts +109 -0
- package/src/components/editor/actions/pair-with-agent-modal.tsx +20 -64
- package/src/components/editor/actions/useNotebookActions.tsx +8 -0
- package/src/components/editor/ai/add-cell-with-ai.tsx +14 -5
- package/src/components/editor/ai/ai-completion-editor.tsx +4 -1
- package/src/components/editor/cell/cell-context-menu.tsx +7 -0
- package/src/components/editor/chrome/components/__tests__/feedback-button.test.tsx +221 -0
- package/src/components/editor/chrome/components/feedback-button.tsx +308 -77
- package/src/components/editor/chrome/panels/packages-panel.tsx +11 -1
- package/src/components/editor/chrome/panels/write-secret-modal.tsx +3 -2
- package/src/components/editor/columns/__tests__/cell-column.test.tsx +105 -0
- package/src/components/editor/columns/cell-column.tsx +34 -4
- package/src/components/editor/columns/sortable-column.tsx +24 -4
- package/src/components/editor/connections/__tests__/secret-combobox.test.ts +134 -0
- package/src/components/editor/connections/database/schemas.ts +35 -27
- package/src/components/editor/connections/form-renderers.tsx +42 -110
- package/src/components/editor/connections/secret-combobox.tsx +253 -0
- package/src/components/editor/connections/storage/schemas.ts +12 -6
- package/src/components/editor/file-tree/download.ts +46 -0
- package/src/components/editor/file-tree/file-explorer.tsx +3 -21
- package/src/components/editor/file-tree/file-viewer.tsx +4 -27
- package/src/components/editor/navigation/__tests__/navigation.test.ts +33 -0
- package/src/components/editor/navigation/navigation.ts +8 -1
- package/src/components/editor/notebook-cell.tsx +203 -106
- package/src/components/editor/renderers/__tests__/cells-renderer.test.tsx +66 -0
- package/src/components/editor/renderers/cell-array.tsx +26 -13
- package/src/components/editor/renderers/cells-renderer.tsx +8 -2
- package/src/components/editor/renderers/slides-layout/__tests__/plugin.test.ts +29 -0
- package/src/components/editor/renderers/slides-layout/types.ts +4 -0
- package/src/components/editor/renderers/vertical-layout/vertical-layout.tsx +19 -19
- package/src/components/slides/reveal-component.tsx +37 -17
- package/src/components/slides/slide-form.tsx +72 -0
- package/src/components/ui/toast.tsx +11 -3
- package/src/components/ui/toaster.tsx +65 -9
- package/src/core/ai/context/providers/error.ts +6 -158
- package/src/core/cells/__tests__/utils.test.ts +59 -0
- package/src/core/cells/utils.ts +51 -0
- package/src/core/codemirror/completion/__tests__/signature-hint.test.ts +97 -3
- package/src/core/codemirror/completion/signature-hint.ts +78 -11
- package/src/core/constants.ts +8 -0
- package/src/core/diagnostics/__tests__/issue-details.test.ts +173 -0
- package/src/core/diagnostics/issue-details.ts +139 -0
- package/src/core/errors/__tests__/error-entries.test.ts +25 -0
- package/src/core/errors/error-entries.ts +176 -0
- package/src/core/islands/__tests__/bridge.test.ts +341 -46
- package/src/core/islands/__tests__/main.test.ts +176 -0
- package/src/core/islands/__tests__/parse.test.ts +105 -0
- package/src/core/islands/bootstrap.ts +8 -3
- package/src/core/islands/bridge.ts +117 -23
- package/src/core/islands/components/__tests__/web-components.test.tsx +214 -0
- package/src/core/islands/components/web-components.tsx +76 -15
- package/src/core/islands/constants.ts +1 -0
- package/src/core/islands/main.ts +69 -3
- package/src/core/islands/parse.ts +70 -23
- package/src/core/islands/worker/__tests__/controller.test.ts +173 -0
- package/src/core/islands/worker/worker.tsx +145 -57
- package/src/core/network/__tests__/requests-lazy.test.ts +18 -0
- package/src/core/network/__tests__/requests-network.test.ts +7 -0
- package/src/core/network/requests-lazy.ts +13 -1
- package/src/core/network/requests-network.ts +3 -0
- package/src/core/network/requests-static.ts +1 -0
- package/src/core/network/requests-toasting.tsx +1 -0
- package/src/core/network/types.ts +3 -0
- package/src/core/runtime/__tests__/runtime.test.ts +64 -0
- package/src/core/runtime/runtime.ts +30 -10
- package/src/core/wasm/bridge.ts +8 -0
- package/src/core/wasm/worker/bootstrap.ts +113 -20
- package/src/core/wasm/worker/types.ts +2 -0
- package/src/css/app/Cell.css +10 -0
- package/src/hooks/__tests__/useHotkey.test.tsx +88 -0
- package/src/hooks/useHotkey.ts +29 -4
- package/src/plugins/impl/anywidget/__tests__/host.test.ts +6 -9
- package/src/plugins/impl/anywidget/__tests__/registry.test.ts +3 -1
- package/src/plugins/impl/anywidget/__tests__/widget-binding.test.ts +32 -61
- package/src/plugins/impl/anywidget/model-proxy.ts +0 -13
- package/src/plugins/impl/anywidget/runtime.ts +1 -0
- package/src/plugins/impl/anywidget/widget-binding.ts +8 -34
- package/src/plugins/impl/image-comparison/ImageComparisonComponent.tsx +53 -2
- package/src/plugins/impl/image-comparison/__tests__/ImageComparisonComponent.test.tsx +71 -0
- package/src/plugins/impl/vega/__tests__/use-vega-container-remeasure.test.ts +102 -0
- package/src/plugins/impl/vega/use-vega-container-remeasure.ts +39 -0
- package/src/plugins/impl/vega/vega-component.tsx +5 -4
- package/src/theme/__tests__/useTheme.test.ts +68 -0
- package/src/theme/useTheme.ts +16 -1
- package/dist/apl-Bdc61P1y.js +0 -4
- package/dist/architecture-7HQA4BMR-Kyc44TmC.js +0 -6
- package/dist/asciiarmor-DVRHDGzT.js +0 -4
- package/dist/asn1-BmuKfkfu.js +0 -4
- package/dist/assets/__vite-browser-external-BQCLNwri.js +0 -1
- package/dist/assets/worker-DAWRHcPq.js +0 -73
- package/dist/brainfuck-DPrRpyTV.js +0 -4
- package/dist/classDiagram-2ON5EDUG-QjoAcuFE.js +0 -30
- package/dist/classDiagram-v2-WZHVMYZB-bUCv4gu2.js +0 -30
- package/dist/clojure-DEttQW5T.js +0 -4
- package/dist/cmake-jNlx_DaM.js +0 -4
- package/dist/cobol-BvvIm5MJ.js +0 -4
- package/dist/coffeescript-DTpBMyFU.js +0 -4
- package/dist/commonlisp-BmmUG8jb.js +0 -4
- package/dist/crystal-BxyqmEWC.js +0 -4
- package/dist/css-BGoCtuG3.js +0 -4
- package/dist/cypher-BmCbdl3u.js +0 -4
- package/dist/d-CFrlbjZt.js +0 -4
- package/dist/diff-D6XwL6P8.js +0 -4
- package/dist/dist-7QfXoMdB.js +0 -5
- package/dist/dist-BEXXyZig.js +0 -5
- package/dist/dist-BYj57OV4.js +0 -5
- package/dist/dist-BlSvQzNr.js +0 -5
- package/dist/dist-CCBlxAgS.js +0 -8
- package/dist/dist-CIDTVIUf.js +0 -5
- package/dist/dist-CqQyhAM8.js +0 -8
- package/dist/dist-CwRu2Xzh.js +0 -5
- package/dist/dist-D8CDTVgf.js +0 -6
- package/dist/dist-D8DNB0nO.js +0 -8
- package/dist/dist-DL6N_q-A.js +0 -5
- package/dist/dist-DOFbNV_b.js +0 -8
- package/dist/dist-DPrYzMY0.js +0 -6
- package/dist/dist-cdmMjgsn.js +0 -5
- package/dist/dtd-Bw0lRN0-.js +0 -4
- package/dist/dylan-B55eBHTt.js +0 -4
- package/dist/ecl-C8G4p0wn.js +0 -4
- package/dist/eiffel-BmH46VJl.js +0 -4
- package/dist/elm-DhzeFqkl.js +0 -4
- package/dist/erlang-CY-wdlsU.js +0 -4
- package/dist/esm-M837UxV5.js +0 -1171
- package/dist/factor-DWkgl0xw.js +0 -4
- package/dist/forth-Cij_ie2t.js +0 -4
- package/dist/fortran-Br3X9cfm.js +0 -4
- package/dist/gas-DYsGcMN2.js +0 -4
- package/dist/gherkin-eVgXQ0fQ.js +0 -4
- package/dist/groovy-_NFHIXG7.js +0 -4
- package/dist/haskell-D6xNG_bH.js +0 -4
- package/dist/haxe-sU_rzAwn.js +0 -5
- package/dist/idl-Ds_VbrUx.js +0 -4
- package/dist/infoDiagram-HS3SLOUP-CEnzWruK.js +0 -30
- package/dist/javascript-CztfIl0i.js +0 -4
- package/dist/julia-DDv40QMV.js +0 -4
- package/dist/livescript-BEOngLLc.js +0 -4
- package/dist/lua-9-7BhQ4Y.js +0 -4
- package/dist/mathematica-DDa0Pfxm.js +0 -4
- package/dist/mbox-iO03mmoE.js +0 -4
- package/dist/mirc-C9z5LT4X.js +0 -4
- package/dist/mllike-jGJbdm_C.js +0 -6
- package/dist/modelica-DzF7oIEL.js +0 -4
- package/dist/mscgen-DB-u125o.js +0 -6
- package/dist/mumps-CRTFHhzh.js +0 -4
- package/dist/nsis-C4NPTuox.js +0 -4
- package/dist/ntriples-BCOoGph1.js +0 -4
- package/dist/octave-DTwNlazz.js +0 -4
- package/dist/oz-DD38AzSz.js +0 -4
- package/dist/pascal-BohSp9jV.js +0 -4
- package/dist/perl-f5OutoPM.js +0 -4
- package/dist/pig-Dv7wSmHb.js +0 -4
- package/dist/powershell-rYgjKB39.js +0 -4
- package/dist/properties-BFUNLRDN.js +0 -4
- package/dist/protobuf-B9QJQPPv.js +0 -4
- package/dist/pug-DzvWpaMC.js +0 -4
- package/dist/puppet-B_K-n_xK.js +0 -4
- package/dist/purify.es-H92eMd9-.js +0 -557
- package/dist/python-CAiFcaA2.js +0 -4
- package/dist/q-cLeFIBLK.js +0 -4
- package/dist/r-04Y-Wco3.js +0 -4
- package/dist/react-vega-B6ncY2Tp.js +0 -9
- package/dist/rpm-FUdrIia9.js +0 -5
- package/dist/ruby-DMjFXuEW.js +0 -4
- package/dist/sas-DzHZxjXK.js +0 -4
- package/dist/scheme-DxHd_Rb9.js +0 -4
- package/dist/shell-C8Kwypgf.js +0 -4
- package/dist/sieve-DdyqOKXZ.js +0 -4
- package/dist/smalltalk-pB7X1D9y.js +0 -4
- package/dist/sparql-NhBO6oOa.js +0 -4
- package/dist/stateDiagram-v2-4FDKWEC3-E0RGjKsm.js +0 -29
- package/dist/stex-KfRnSHzF.js +0 -4
- package/dist/stylus-SfWSnzPv.js +0 -4
- package/dist/swift-jRPdq2zR.js +0 -4
- package/dist/tcl-_hpTHGX3.js +0 -4
- package/dist/textile-C9h8slqH.js +0 -4
- package/dist/toml-DWvtinD4.js +0 -4
- package/dist/troff-Dwo_A0y7.js +0 -4
- package/dist/ttcn-V--CPFKq.js +0 -4
- package/dist/ttcn-cfg-CPSMchTG.js +0 -4
- package/dist/turtle-B4rPGBWu.js +0 -4
- package/dist/vb-DaMBBd4j.js +0 -4
- package/dist/vbscript-BMJQqcE2.js +0 -4
- package/dist/vega-loader.browser-CZ-J8Py3.js +0 -1321
- package/dist/velocity-CGq2QRq2.js +0 -4
- package/dist/verilog-CUNo8F5u.js +0 -4
- package/dist/vhdl-CCzA0msW.js +0 -4
- package/dist/webidl-CqIMDIBL.js +0 -4
- package/dist/xquery-XC5Kbr-1.js +0 -4
- package/dist/yacas-CGOv7Dzy.js +0 -4
- package/dist/z80-CXhVmi-f.js +0 -4
- /package/dist/{Plot-CAYS29h9.js → Plot-YQOuVIei.js} +0 -0
- /package/dist/{apl-BCgCq9iM.js → apl-99A7dLQe.js} +0 -0
- /package/dist/{array-tvvEqPy7.js → array-O78LT16Y.js} +0 -0
- /package/dist/{asciiarmor-BtqU-KJQ.js → asciiarmor-DLEhpFDx.js} +0 -0
- /package/dist/{asn1-Dmb-dTMx.js → asn1-CMrcTsT4.js} +0 -0
- /package/dist/{asterisk-DaVJJDnV.js → asterisk-CqykImq7.js} +0 -0
- /package/dist/{brainfuck-C1HoZKlE.js → brainfuck-ChPt5yBe.js} +0 -0
- /package/dist/{chunk-DR5Q36YT-BflwErH1.js → chunk-DR5Q36YT-5Yp2GWwR.js} +0 -0
- /package/dist/{click-outside-container-BLPjMamz.js → click-outside-container-BSIeYt4y.js} +0 -0
- /package/dist/{clike-CdT0yHjt.js → clike-CE0fXfM_.js} +0 -0
- /package/dist/{clojure-CdyrCpUv.js → clojure-QkBEMU-g.js} +0 -0
- /package/dist/{cmake-BFlPxym7.js → cmake-CU1jX7Mo.js} +0 -0
- /package/dist/{cobol-CcJXewp8.js → cobol-DMOKzzky.js} +0 -0
- /package/dist/{coffeescript-DnKuIKRo.js → coffeescript-DjnjLyfk.js} +0 -0
- /package/dist/{colors-CQAOa8cK.js → colors-DmiH1bIH.js} +0 -0
- /package/dist/{common-keywords-FBrXPTcz.js → common-keywords-D3nPJNQP.js} +0 -0
- /package/dist/{commonlisp-B-kok83Z.js → commonlisp-CYd9iOSe.js} +0 -0
- /package/dist/{crystal-FYRYjI1I.js → crystal-Dy55yoYG.js} +0 -0
- /package/dist/{css-B45lc2V3.js → css-CNU8w3HJ.js} +0 -0
- /package/dist/{cypher-DZMLyVY_.js → cypher-q47DGzK7.js} +0 -0
- /package/dist/{cytoscape.esm-ayF70frT.js → cytoscape.esm-Dr8XzXWK.js} +0 -0
- /package/dist/{d-x-VVT4o9.js → d-jEkaLvxX.js} +0 -0
- /package/dist/{defaultLocale-u-3osm0P.js → defaultLocale-BpsHxBd7.js} +0 -0
- /package/dist/{defaultLocale-BoHTsDG6.js → defaultLocale-DoeErsX2.js} +0 -0
- /package/dist/{diff-Dxe2mpXk.js → diff-vb2-unFN.js} +0 -0
- /package/dist/{dist-BGdYVvOu.js → dist-DsoKosxi.js} +0 -0
- /package/dist/{dtd-C9VM_Wfu.js → dtd-C9kR-bXa.js} +0 -0
- /package/dist/{duckdb-keywords-CvJhR_Yd.js → duckdb-keywords-B6HYCMOT.js} +0 -0
- /package/dist/{dylan-DTSnEIFO.js → dylan-BLckrK-V.js} +0 -0
- /package/dist/{ebnf-2D4Ctp3y.js → ebnf-Cnp3L9jg.js} +0 -0
- /package/dist/{ecl-N04ptnRK.js → ecl-CEsf6XVg.js} +0 -0
- /package/dist/{eiffel-Dd8rpqr_.js → eiffel-2KGZNzx6.js} +0 -0
- /package/dist/{elm-GT2E866W.js → elm-D2s3K5wF.js} +0 -0
- /package/dist/{emotion-is-prop-valid.esm-DzSb5hsH.js → emotion-is-prop-valid.esm-DdVSF4FD.js} +0 -0
- /package/dist/{erlang-Cf0Bp5pY.js → erlang-0PMFOndk.js} +0 -0
- /package/dist/{esm-BaaaPNGl.js → esm-CuQHjs36.js} +0 -0
- /package/dist/{fcl-Ccj8Z5Xd.js → fcl-D9nccAWI.js} +0 -0
- /package/dist/{forth-wd_XzGTg.js → forth-DG89iUsu.js} +0 -0
- /package/dist/{fortran-DcwUTZFe.js → fortran-ytKsAVvu.js} +0 -0
- /package/dist/{gas-DeALIER3.js → gas-Cg2Fm0N2.js} +0 -0
- /package/dist/{gherkin-CKTqaJNX.js → gherkin-B87FEnZ-.js} +0 -0
- /package/dist/{groovy-Bwdp_d8D.js → groovy-Dcs08AWD.js} +0 -0
- /package/dist/{haskell-DCdCcPLK.js → haskell-cwkOuhx6.js} +0 -0
- /package/dist/{haxe-DAyktQWJ.js → haxe-DWEo4q10.js} +0 -0
- /package/dist/{http-_DVAYWoR.js → http-B8jdG64J.js} +0 -0
- /package/dist/{idl-CBuZiRYu.js → idl-WWQwDcRV.js} +0 -0
- /package/dist/{init-uv0kkh4g.js → init-DNBbYZd_.js} +0 -0
- /package/dist/{javascript-DzigE11c.js → javascript-BeR74dxD.js} +0 -0
- /package/dist/{julia-PwfB-0Cm.js → julia-UlvCUYGL.js} +0 -0
- /package/dist/{katex-C_XRmjAP.js → katex-Bld7b-fk.js} +0 -0
- /package/dist/{livescript-BJLz1EbT.js → livescript-GPmFcmYV.js} +0 -0
- /package/dist/{lua-ZC-XC2jf.js → lua-DYoT_0zM.js} +0 -0
- /package/dist/{main-Tj_-QTyF.js → main-B1Jo_8pC.js} +0 -0
- /package/dist/{math-DFcdCCU8.js → math-CBNc2Ib0.js} +0 -0
- /package/dist/{mathematica-DCYMx6qB.js → mathematica-DSFIQlbG.js} +0 -0
- /package/dist/{mbox-OxMK_9XI.js → mbox-ej8lFMdL.js} +0 -0
- /package/dist/{micromark-factory-space-DF2w36zS.js → micromark-factory-space-CwHmg6iz.js} +0 -0
- /package/dist/{mirc-nJVyhA0H.js → mirc-CAdIdvHQ.js} +0 -0
- /package/dist/{mllike-DRO89bsU.js → mllike-CjTB1lHF.js} +0 -0
- /package/dist/{modelica-Don3E6ZD.js → modelica-BB68FYMa.js} +0 -0
- /package/dist/{mscgen-DJfqD3bN.js → mscgen-BkbzgGGI.js} +0 -0
- /package/dist/{mumps-SjGTvDYL.js → mumps-Cu-28E9F.js} +0 -0
- /package/dist/{nginx-DasThI7R.js → nginx-C1ofKPst.js} +0 -0
- /package/dist/{node-sql-parser-B8nBD36q.js → node-sql-parser-DLl_zNw0.js} +0 -0
- /package/dist/{ntriples-CNBKRl3I.js → ntriples-D9cQiZxZ.js} +0 -0
- /package/dist/{octave-DdeVHNlx.js → octave-BvtAnPX0.js} +0 -0
- /package/dist/{once-DPuqGUeo.js → once-B60G2fuJ.js} +0 -0
- /package/dist/{oz-CcKSoNvN.js → oz-COaVHk2E.js} +0 -0
- /package/dist/{pascal-6leftwNj.js → pascal-BFpqVD2x.js} +0 -0
- /package/dist/{path-BGaWgPKg.js → path-DwWbhZFI.js} +0 -0
- /package/dist/{perl-BhJIwWzN.js → perl-DaiORxHP.js} +0 -0
- /package/dist/{pig-r-xDHqRf.js → pig-DFzRhmsF.js} +0 -0
- /package/dist/{powershell-D-BELeNi.js → powershell-BG2LQNKN.js} +0 -0
- /package/dist/{properties-CnuDhbll.js → properties-CqJJR5QY.js} +0 -0
- /package/dist/{protobuf-CO8RBhvX.js → protobuf-WwDYV1yY.js} +0 -0
- /package/dist/{puppet-NmXHjLy8.js → puppet-QNY3w_uN.js} +0 -0
- /package/dist/{python-DAQXi720.js → python-4QrQ3Ugi.js} +0 -0
- /package/dist/{q-DlikXfV0.js → q-DhwXuxE2.js} +0 -0
- /package/dist/{r-CuohilwT.js → r-Df-nkR25.js} +0 -0
- /package/dist/{range-C-rmrM1O.js → range-BOiA8qqU.js} +0 -0
- /package/dist/{rpm-0Pjwp0Pb.js → rpm-Cokue07s.js} +0 -0
- /package/dist/{ruby-Dq8NJTDG.js → ruby-DrYcL3qF.js} +0 -0
- /package/dist/{sas-CuwonyVP.js → sas-CoiPirA5.js} +0 -0
- /package/dist/{scheme-CYU-RRIf.js → scheme-CwFLjzHv.js} +0 -0
- /package/dist/{semaphore-CNDGTzkX.js → semaphore-C8rmHdhj.js} +0 -0
- /package/dist/{shell-COPmX2qE.js → shell-BFV-R24I.js} +0 -0
- /package/dist/{sieve-B_3zyLne.js → sieve-CxwXF5T9.js} +0 -0
- /package/dist/{simple-mode-DSBniks8.js → simple-mode-DTaJtKPt.js} +0 -0
- /package/dist/{smalltalk-DRft7iPv.js → smalltalk-QivVOCtX.js} +0 -0
- /package/dist/{solr-RZ9uTl59.js → solr-BLvysN-c.js} +0 -0
- /package/dist/{sparql-CN6qj55H.js → sparql-nKsFk8j7.js} +0 -0
- /package/dist/{spreadsheet-BNNUNXA2.js → spreadsheet-BWc8C2FT.js} +0 -0
- /package/dist/{sql-B4x8IkwU.js → sql-CWfUjlV1.js} +0 -0
- /package/dist/{stex-BIsgBmK4.js → stex-DtMAhV4-.js} +0 -0
- /package/dist/{stylus-Bn_ZjOQ3.js → stylus-BLKQAycn.js} +0 -0
- /package/dist/{swift-BLUJhMbz.js → swift-CJoKqiKj.js} +0 -0
- /package/dist/{tcl-C86fxecl.js → tcl-YTeYFNUc.js} +0 -0
- /package/dist/{textile-DmHh2rsK.js → textile-C6rKQqMQ.js} +0 -0
- /package/dist/{tiddlywiki-DI0mF2WJ.js → tiddlywiki-ZXwTHGNT.js} +0 -0
- /package/dist/{tiki-2HU6XLLn.js → tiki-C628O_u4.js} +0 -0
- /package/dist/{timer-YZl28NYN.js → timer-BpI_FKSA.js} +0 -0
- /package/dist/{toml-GWANRNAD.js → toml-DxlPGbRy.js} +0 -0
- /package/dist/{treemap-D-ka1hvx.js → treemap-DY3NBr79.js} +0 -0
- /package/dist/{troff-BHTsomIy.js → troff-DFCfH7Ku.js} +0 -0
- /package/dist/{ttcn-DQuhn5Mn.js → ttcn-DAW-ERVP.js} +0 -0
- /package/dist/{ttcn-cfg-HjFYtdB-.js → ttcn-cfg-CpJ8b7EN.js} +0 -0
- /package/dist/{turtle-nCay33Nv.js → turtle-BneV2f8L.js} +0 -0
- /package/dist/{vb-BG-XlqqJ.js → vb-D973Vxxh.js} +0 -0
- /package/dist/{vbscript-B6vyW0-D.js → vbscript-Dckaq3YO.js} +0 -0
- /package/dist/{velocity-CWegueqO.js → velocity-DKty-GUC.js} +0 -0
- /package/dist/{verilog-CzSQm4cG.js → verilog-aNaK_biA.js} +0 -0
- /package/dist/{vhdl-DqnNVL7r.js → vhdl-CQuehnQy.js} +0 -0
- /package/dist/{webidl-DXEUpDWH.js → webidl-Bhg8vaMr.js} +0 -0
- /package/dist/{xquery-Ba_NB5bD.js → xquery-D2q16GaM.js} +0 -0
- /package/dist/{yacas-HKQU6hyk.js → yacas-DHGOHnNa.js} +0 -0
- /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
|
-
|
|
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:
|
|
61
|
-
await
|
|
122
|
+
startSession: async (opts: SessionRequest) => {
|
|
123
|
+
await enqueueSession(() => startSession(opts, false));
|
|
124
|
+
},
|
|
62
125
|
|
|
63
|
-
|
|
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
|
-
|
|
66
|
-
|
|
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 (
|
|
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
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
/**
|