@marimo-team/islands 0.23.15-dev7 → 0.23.15-dev71
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-DltVXDv7.js +1 -0
- package/dist/assets/worker-CDEKsBgX.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-B8b6lh5X.js → code-visibility-CjiY9v4i.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 +2439 -2199
- 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-D0fwa0Mk.js → reveal-component-Bnwl3rVE.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__/bootstrap.test.ts +61 -0
- package/src/core/islands/__tests__/bridge.test.ts +373 -47
- 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 +28 -5
- package/src/core/islands/bridge.ts +140 -39
- package/src/core/islands/components/__tests__/web-components.test.tsx +248 -0
- package/src/core/islands/components/output-wrapper.tsx +4 -1
- 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/state.ts +9 -0
- package/src/core/islands/worker/__tests__/controller.test.ts +173 -0
- package/src/core/islands/worker/worker.tsx +159 -63
- 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/AnyWidgetPlugin.tsx +7 -1
- package/src/plugins/impl/anywidget/__tests__/AnyWidgetPlugin.test.tsx +26 -1
- 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/plugins/layout/NavigationMenuPlugin.tsx +156 -25
- 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
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
ISLAND_DATA_ATTRIBUTES,
|
|
5
|
+
ISLAND_SOURCE_CHANGED_EVENT,
|
|
5
6
|
ISLAND_TAG_NAMES,
|
|
6
7
|
ISLANDS_JSON_SCRIPT_TYPE,
|
|
7
8
|
} from "@/core/islands/constants";
|
|
@@ -74,12 +75,15 @@ interface MarimoIslandPayloadCell {
|
|
|
74
75
|
displayOutput: boolean;
|
|
75
76
|
}
|
|
76
77
|
|
|
78
|
+
const retainedPayloadCellIds = new WeakMap<HTMLElement, string>();
|
|
79
|
+
|
|
77
80
|
/**
|
|
78
81
|
* Parses marimo island apps from the DOM
|
|
79
82
|
* @param root - Root element to search within (defaults to document)
|
|
80
83
|
*/
|
|
81
84
|
export function parseMarimoIslandApps(
|
|
82
85
|
root: Document | Element = document,
|
|
86
|
+
options: { materialize?: boolean } = {},
|
|
83
87
|
): MarimoIslandApp[] {
|
|
84
88
|
const embeds = [
|
|
85
89
|
...root.querySelectorAll<HTMLElement>(ISLAND_TAG_NAMES.ISLAND),
|
|
@@ -90,11 +94,12 @@ export function parseMarimoIslandApps(
|
|
|
90
94
|
return [];
|
|
91
95
|
}
|
|
92
96
|
|
|
97
|
+
const materialize = options.materialize ?? true;
|
|
93
98
|
if (payloads.length > 0) {
|
|
94
|
-
return parsePayloadBackedApps(embeds, payloads);
|
|
99
|
+
return parsePayloadBackedApps({ embeds, materialize, payloads });
|
|
95
100
|
}
|
|
96
101
|
|
|
97
|
-
return parseIslandElementsIntoApps(embeds);
|
|
102
|
+
return parseIslandElementsIntoApps(embeds, materialize);
|
|
98
103
|
}
|
|
99
104
|
|
|
100
105
|
/**
|
|
@@ -103,6 +108,7 @@ export function parseMarimoIslandApps(
|
|
|
103
108
|
*/
|
|
104
109
|
export function parseIslandElementsIntoApps(
|
|
105
110
|
embeds: HTMLElement[],
|
|
111
|
+
materialize = true,
|
|
106
112
|
): MarimoIslandApp[] {
|
|
107
113
|
const apps = new Map<string, MarimoIslandApp>();
|
|
108
114
|
|
|
@@ -140,16 +146,24 @@ export function parseIslandElementsIntoApps(
|
|
|
140
146
|
});
|
|
141
147
|
|
|
142
148
|
// Add data-cell-idx attribute to the island element
|
|
143
|
-
|
|
149
|
+
if (materialize) {
|
|
150
|
+
embed.setAttribute(ISLAND_DATA_ATTRIBUTES.CELL_IDX, idx.toString());
|
|
151
|
+
embed.dispatchEvent(new Event(ISLAND_SOURCE_CHANGED_EVENT));
|
|
152
|
+
}
|
|
144
153
|
}
|
|
145
154
|
|
|
146
155
|
return [...apps.values()];
|
|
147
156
|
}
|
|
148
157
|
|
|
149
|
-
function parsePayloadBackedApps(
|
|
150
|
-
embeds
|
|
151
|
-
|
|
152
|
-
|
|
158
|
+
function parsePayloadBackedApps({
|
|
159
|
+
embeds,
|
|
160
|
+
materialize,
|
|
161
|
+
payloads,
|
|
162
|
+
}: {
|
|
163
|
+
embeds: HTMLElement[];
|
|
164
|
+
materialize: boolean;
|
|
165
|
+
payloads: MarimoIslandPayload[];
|
|
166
|
+
}): MarimoIslandApp[] {
|
|
153
167
|
const apps = new Map<string, MarimoIslandApp>();
|
|
154
168
|
const matchedPayloadCells = new Map<MarimoIslandPayloadCell, HTMLElement>();
|
|
155
169
|
const consumedEmbeds = new Set<HTMLElement>();
|
|
@@ -169,7 +183,9 @@ function parsePayloadBackedApps(
|
|
|
169
183
|
}
|
|
170
184
|
consumedEmbeds.add(embed);
|
|
171
185
|
matchedPayloadCells.set(cell, embed);
|
|
172
|
-
|
|
186
|
+
if (materialize) {
|
|
187
|
+
materializeIslandPayload(embed, cell);
|
|
188
|
+
}
|
|
173
189
|
hasMatchedIsland = true;
|
|
174
190
|
}
|
|
175
191
|
// Only payloads matched to island anchors can start runtime apps.
|
|
@@ -215,7 +231,7 @@ function parsePayloadBackedApps(
|
|
|
215
231
|
appCell.disabled = true;
|
|
216
232
|
}
|
|
217
233
|
app.cells.push(appCell);
|
|
218
|
-
if (cell.reactive) {
|
|
234
|
+
if (materialize && cell.reactive) {
|
|
219
235
|
embed?.setAttribute(ISLAND_DATA_ATTRIBUTES.CELL_IDX, idx.toString());
|
|
220
236
|
}
|
|
221
237
|
}
|
|
@@ -223,12 +239,15 @@ function parsePayloadBackedApps(
|
|
|
223
239
|
|
|
224
240
|
// A supported payload is the runtime source for its app. Extra same-app DOM
|
|
225
241
|
// islands are disconnected from runtime binding.
|
|
226
|
-
|
|
227
|
-
const
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
242
|
+
if (materialize) {
|
|
243
|
+
for (const embed of embeds) {
|
|
244
|
+
const appId = embed.getAttribute(ISLAND_DATA_ATTRIBUTES.APP_ID);
|
|
245
|
+
if (appId && payloadAppIds.has(appId) && !consumedEmbeds.has(embed)) {
|
|
246
|
+
embed.removeAttribute(ISLAND_DATA_ATTRIBUTES.CELL_ID);
|
|
247
|
+
embed.removeAttribute(ISLAND_DATA_ATTRIBUTES.CELL_IDX);
|
|
248
|
+
embed.setAttribute(ISLAND_DATA_ATTRIBUTES.REACTIVE, "false");
|
|
249
|
+
consumedEmbeds.add(embed);
|
|
250
|
+
}
|
|
232
251
|
}
|
|
233
252
|
}
|
|
234
253
|
|
|
@@ -237,7 +256,16 @@ function parsePayloadBackedApps(
|
|
|
237
256
|
return !appId || !payloadAppIds.has(appId);
|
|
238
257
|
});
|
|
239
258
|
|
|
240
|
-
|
|
259
|
+
if (materialize) {
|
|
260
|
+
for (const embed of consumedEmbeds) {
|
|
261
|
+
embed.dispatchEvent(new Event(ISLAND_SOURCE_CHANGED_EVENT));
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
return [
|
|
266
|
+
...apps.values(),
|
|
267
|
+
...parseIslandElementsIntoApps(domOnlyEmbeds, materialize),
|
|
268
|
+
];
|
|
241
269
|
}
|
|
242
270
|
|
|
243
271
|
function findMatchingIsland({
|
|
@@ -257,7 +285,8 @@ function findMatchingIsland({
|
|
|
257
285
|
}
|
|
258
286
|
return (
|
|
259
287
|
embed.getAttribute(ISLAND_DATA_ATTRIBUTES.APP_ID) === appId &&
|
|
260
|
-
embed.getAttribute(ISLAND_DATA_ATTRIBUTES.CELL_ID)
|
|
288
|
+
(embed.getAttribute(ISLAND_DATA_ATTRIBUTES.CELL_ID) ??
|
|
289
|
+
retainedPayloadCellIds.get(embed)) === cell.cellId
|
|
261
290
|
);
|
|
262
291
|
});
|
|
263
292
|
}
|
|
@@ -266,6 +295,7 @@ function materializeIslandPayload(
|
|
|
266
295
|
embed: HTMLElement,
|
|
267
296
|
cell: MarimoIslandPayloadCell,
|
|
268
297
|
): void {
|
|
298
|
+
retainedPayloadCellIds.set(embed, cell.cellId);
|
|
269
299
|
embed.setAttribute(
|
|
270
300
|
ISLAND_DATA_ATTRIBUTES.REACTIVE,
|
|
271
301
|
JSON.stringify(cell.reactive),
|
|
@@ -304,6 +334,22 @@ function ensureIslandChild(embed: HTMLElement, tagName: string): HTMLElement {
|
|
|
304
334
|
* @param embed - The island HTML element
|
|
305
335
|
* @returns Cell data or null if invalid
|
|
306
336
|
*/
|
|
337
|
+
const retainedIslandSources = new WeakMap<
|
|
338
|
+
HTMLElement,
|
|
339
|
+
{ output: string; code: string }
|
|
340
|
+
>();
|
|
341
|
+
|
|
342
|
+
export function retainIslandSource(
|
|
343
|
+
embed: HTMLElement,
|
|
344
|
+
source: { output: string; code: string },
|
|
345
|
+
): void {
|
|
346
|
+
if (source.code) {
|
|
347
|
+
retainedIslandSources.set(embed, source);
|
|
348
|
+
} else {
|
|
349
|
+
retainedIslandSources.delete(embed);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
307
353
|
export function parseIslandElement(
|
|
308
354
|
embed: HTMLElement,
|
|
309
355
|
): { output: string; code: string } | null {
|
|
@@ -312,14 +358,15 @@ export function parseIslandElement(
|
|
|
312
358
|
);
|
|
313
359
|
const code = extractIslandCodeFromEmbed(embed);
|
|
314
360
|
|
|
315
|
-
if (
|
|
316
|
-
return
|
|
361
|
+
if (cellOutput && code) {
|
|
362
|
+
return {
|
|
363
|
+
output: cellOutput.innerHTML,
|
|
364
|
+
code: code,
|
|
365
|
+
};
|
|
317
366
|
}
|
|
318
367
|
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
code: code,
|
|
322
|
-
};
|
|
368
|
+
const retained = retainedIslandSources.get(embed);
|
|
369
|
+
return retained?.code ? retained : null;
|
|
323
370
|
}
|
|
324
371
|
|
|
325
372
|
export function createMarimoFile(app: {
|
|
@@ -11,6 +11,15 @@ import { atom } from "jotai";
|
|
|
11
11
|
*/
|
|
12
12
|
export const islandsInitializedAtom = atom<boolean | string>(false);
|
|
13
13
|
|
|
14
|
+
/** Pending initial session generations. Null waits for a session to start. */
|
|
15
|
+
export const islandsPendingInitialRunsAtom = atom<ReadonlySet<number> | null>(
|
|
16
|
+
new Set<number>(),
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
export const islandsHydratedAtom = atom(
|
|
20
|
+
(get) => get(islandsPendingInitialRunsAtom)?.size === 0,
|
|
21
|
+
);
|
|
22
|
+
|
|
14
23
|
/**
|
|
15
24
|
* Whether the user has tried to interact with the islands.
|
|
16
25
|
*/
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import type { PyodideInterface } from "pyodide";
|
|
4
|
+
import { describe, expect, it, vi } from "vitest";
|
|
5
|
+
import { ReadonlyWasmController } from "../controller";
|
|
6
|
+
|
|
7
|
+
class TestController extends ReadonlyWasmController {
|
|
8
|
+
setPyodide(pyodide: PyodideInterface) {
|
|
9
|
+
this.pyodide = pyodide;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function createSessionResources(
|
|
14
|
+
stopImplementation: () => Promise<void> = () => Promise.resolve(),
|
|
15
|
+
) {
|
|
16
|
+
const bridge = { destroy: vi.fn() };
|
|
17
|
+
const init = Object.assign(vi.fn(), { destroy: vi.fn() });
|
|
18
|
+
const stop = Object.assign(vi.fn(stopImplementation), {
|
|
19
|
+
destroy: vi.fn(),
|
|
20
|
+
});
|
|
21
|
+
const packages = { destroy: vi.fn(), toJs: () => [] };
|
|
22
|
+
const sessionResources = Object.assign([bridge, init, packages, stop], {
|
|
23
|
+
destroy: vi.fn(),
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
return { bridge, init, packages, sessionResources, stop };
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function createPyodideStub(
|
|
30
|
+
sessions = Array.from({ length: 4 }, () => createSessionResources()),
|
|
31
|
+
) {
|
|
32
|
+
const [first] = sessions;
|
|
33
|
+
if (!first) {
|
|
34
|
+
throw new Error("At least one session is required");
|
|
35
|
+
}
|
|
36
|
+
const loadPackagesFromImports = vi.fn().mockResolvedValue(undefined);
|
|
37
|
+
const pyodide = {
|
|
38
|
+
runPython: vi
|
|
39
|
+
.fn()
|
|
40
|
+
.mockImplementation(() => sessions.shift()?.sessionResources),
|
|
41
|
+
loadPackagesFromImports,
|
|
42
|
+
loadedPackages: {},
|
|
43
|
+
runPythonAsync: vi.fn(),
|
|
44
|
+
} as unknown as PyodideInterface;
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
...first,
|
|
48
|
+
loadPackagesFromImports,
|
|
49
|
+
pyodide,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function startSession(controller: TestController, code: string) {
|
|
54
|
+
return controller.startSession({
|
|
55
|
+
code,
|
|
56
|
+
filename: `${code}.py`,
|
|
57
|
+
onMessage: vi.fn(),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
describe("WASM controller session lifecycle", () => {
|
|
62
|
+
it("stops and releases the active session", async () => {
|
|
63
|
+
const { init, packages, pyodide, sessionResources, stop } =
|
|
64
|
+
createPyodideStub();
|
|
65
|
+
const controller = new TestController();
|
|
66
|
+
controller.setPyodide(pyodide);
|
|
67
|
+
|
|
68
|
+
await startSession(controller, "current");
|
|
69
|
+
await vi.waitFor(() => expect(init).toHaveBeenCalledOnce());
|
|
70
|
+
await controller.stopSession();
|
|
71
|
+
|
|
72
|
+
expect(stop).toHaveBeenCalledOnce();
|
|
73
|
+
expect(stop.destroy).toHaveBeenCalledOnce();
|
|
74
|
+
expect(sessionResources.destroy).toHaveBeenCalledOnce();
|
|
75
|
+
expect(packages.destroy).toHaveBeenCalledOnce();
|
|
76
|
+
expect(init.destroy).toHaveBeenCalledOnce();
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it("loads dependencies serially and skips superseded sessions", async () => {
|
|
80
|
+
let finishFirstLoad!: () => void;
|
|
81
|
+
const { loadPackagesFromImports, pyodide } = createPyodideStub();
|
|
82
|
+
loadPackagesFromImports
|
|
83
|
+
.mockReturnValueOnce(
|
|
84
|
+
new Promise<void>((resolve) => {
|
|
85
|
+
finishFirstLoad = resolve;
|
|
86
|
+
}),
|
|
87
|
+
)
|
|
88
|
+
.mockResolvedValueOnce(undefined);
|
|
89
|
+
const controller = new TestController();
|
|
90
|
+
controller.setPyodide(pyodide);
|
|
91
|
+
|
|
92
|
+
await startSession(controller, "first_dependency");
|
|
93
|
+
await startSession(controller, "superseded_dependency");
|
|
94
|
+
await controller.stopSession();
|
|
95
|
+
await startSession(controller, "current_dependency");
|
|
96
|
+
|
|
97
|
+
expect(loadPackagesFromImports).toHaveBeenCalledOnce();
|
|
98
|
+
finishFirstLoad();
|
|
99
|
+
await vi.waitFor(() =>
|
|
100
|
+
expect(loadPackagesFromImports).toHaveBeenCalledTimes(2),
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
const loadedSources = loadPackagesFromImports.mock.calls.map(
|
|
104
|
+
([source]) => source as string,
|
|
105
|
+
);
|
|
106
|
+
expect(loadedSources[1]).toContain("current_dependency");
|
|
107
|
+
expect(loadedSources.join("\n")).not.toContain("superseded_dependency");
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it("stops every session created for a multi-app page", async () => {
|
|
111
|
+
const first = createSessionResources();
|
|
112
|
+
const second = createSessionResources();
|
|
113
|
+
const { pyodide } = createPyodideStub([first, second]);
|
|
114
|
+
const controller = new TestController();
|
|
115
|
+
controller.setPyodide(pyodide);
|
|
116
|
+
|
|
117
|
+
await startSession(controller, "first");
|
|
118
|
+
await startSession(controller, "second");
|
|
119
|
+
second.bridge.destroy();
|
|
120
|
+
|
|
121
|
+
expect(first.stop.destroy).not.toHaveBeenCalled();
|
|
122
|
+
|
|
123
|
+
await controller.stopSession();
|
|
124
|
+
|
|
125
|
+
expect(first.stop).toHaveBeenCalledOnce();
|
|
126
|
+
expect(second.stop).toHaveBeenCalledOnce();
|
|
127
|
+
expect(first.stop.destroy).toHaveBeenCalledOnce();
|
|
128
|
+
expect(second.stop.destroy).toHaveBeenCalledOnce();
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it("continues stopping sessions after one stop fails", async () => {
|
|
132
|
+
const failure = new Error("stop failed");
|
|
133
|
+
const first = createSessionResources(() => Promise.reject(failure));
|
|
134
|
+
const second = createSessionResources();
|
|
135
|
+
const { pyodide } = createPyodideStub([first, second]);
|
|
136
|
+
const controller = new TestController();
|
|
137
|
+
controller.setPyodide(pyodide);
|
|
138
|
+
|
|
139
|
+
await startSession(controller, "first");
|
|
140
|
+
await startSession(controller, "second");
|
|
141
|
+
|
|
142
|
+
await expect(controller.stopSession()).rejects.toThrow("stop failed");
|
|
143
|
+
expect(first.stop).toHaveBeenCalledOnce();
|
|
144
|
+
expect(second.stop).toHaveBeenCalledOnce();
|
|
145
|
+
expect(first.stop.destroy).not.toHaveBeenCalled();
|
|
146
|
+
expect(second.stop.destroy).toHaveBeenCalledOnce();
|
|
147
|
+
|
|
148
|
+
first.stop.mockResolvedValueOnce(undefined);
|
|
149
|
+
await controller.stopSession();
|
|
150
|
+
|
|
151
|
+
expect(first.stop).toHaveBeenCalledTimes(2);
|
|
152
|
+
expect(first.stop.destroy).toHaveBeenCalledOnce();
|
|
153
|
+
expect(second.stop).toHaveBeenCalledOnce();
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it("reports and retries a falsy stop failure", async () => {
|
|
157
|
+
const session = createSessionResources(() => Promise.reject(false));
|
|
158
|
+
const { pyodide } = createPyodideStub([session]);
|
|
159
|
+
const controller = new TestController();
|
|
160
|
+
controller.setPyodide(pyodide);
|
|
161
|
+
|
|
162
|
+
await startSession(controller, "current");
|
|
163
|
+
|
|
164
|
+
await expect(controller.stopSession()).rejects.toBe(false);
|
|
165
|
+
expect(session.stop.destroy).not.toHaveBeenCalled();
|
|
166
|
+
|
|
167
|
+
session.stop.mockResolvedValueOnce(undefined);
|
|
168
|
+
await controller.stopSession();
|
|
169
|
+
|
|
170
|
+
expect(session.stop).toHaveBeenCalledTimes(2);
|
|
171
|
+
expect(session.stop.destroy).toHaveBeenCalledOnce();
|
|
172
|
+
});
|
|
173
|
+
});
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
3
|
import type { PyodideInterface } from "pyodide";
|
|
4
|
+
import type { PyProxy } from "pyodide/ffi";
|
|
4
5
|
import {
|
|
5
6
|
createRPC,
|
|
6
7
|
createRPCRequestHandler,
|
|
@@ -16,7 +17,6 @@ import { MessageBuffer } from "@/core/wasm/worker/message-buffer";
|
|
|
16
17
|
import type { RawBridge, SerializedBridge } from "@/core/wasm/worker/types";
|
|
17
18
|
import type { JsonString } from "@/utils/json/base64";
|
|
18
19
|
import { Logger } from "@/utils/Logger";
|
|
19
|
-
import { Deferred } from "../../../utils/Deferred";
|
|
20
20
|
import { prettyError } from "../../../utils/errors";
|
|
21
21
|
import { invariant } from "../../../utils/invariant";
|
|
22
22
|
import { ReadonlyWasmController } from "./controller";
|
|
@@ -45,64 +45,141 @@ async function loadPyodideAndPackages() {
|
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
const pyodideReadyPromise = loadPyodideAndPackages();
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const
|
|
48
|
+
export interface IslandsKernelMessage {
|
|
49
|
+
message: JsonString<NotificationPayload>;
|
|
50
|
+
sessionGeneration: number;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const messageBuffer = new MessageBuffer<IslandsKernelMessage>((payload) => {
|
|
54
|
+
rpc.send.kernelMessage(payload);
|
|
55
|
+
});
|
|
56
|
+
interface SessionRequest {
|
|
57
|
+
code: string;
|
|
58
|
+
appId: string;
|
|
59
|
+
sessionGeneration: number;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
let activeSession:
|
|
63
|
+
| (Omit<SessionRequest, "code"> & { bridge: SerializedBridge })
|
|
64
|
+
| undefined;
|
|
65
|
+
let sessionQueue = Promise.resolve();
|
|
66
|
+
|
|
67
|
+
async function startSession(
|
|
68
|
+
opts: SessionRequest,
|
|
69
|
+
replace: boolean,
|
|
70
|
+
): Promise<void> {
|
|
71
|
+
await pyodideReadyPromise;
|
|
72
|
+
|
|
73
|
+
try {
|
|
74
|
+
invariant(self.controller, "Controller not loaded");
|
|
75
|
+
if (replace) {
|
|
76
|
+
await stopActiveSession();
|
|
77
|
+
}
|
|
78
|
+
const notebook = await self.controller.mountFilesystem({
|
|
79
|
+
code: opts.code,
|
|
80
|
+
filename: `app-${opts.appId}.py`,
|
|
81
|
+
});
|
|
82
|
+
const nextBridge = await self.controller.startSession({
|
|
83
|
+
...notebook,
|
|
84
|
+
onMessage: (message) => {
|
|
85
|
+
messageBuffer.push({
|
|
86
|
+
message,
|
|
87
|
+
sessionGeneration: opts.sessionGeneration,
|
|
88
|
+
});
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
if (activeSession) {
|
|
92
|
+
(nextBridge as unknown as PyProxy).destroy();
|
|
93
|
+
} else {
|
|
94
|
+
activeSession = {
|
|
95
|
+
appId: opts.appId,
|
|
96
|
+
bridge: nextBridge,
|
|
97
|
+
sessionGeneration: opts.sessionGeneration,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
rpc.send.initialized({});
|
|
101
|
+
} catch (error) {
|
|
102
|
+
rpc.send.initializedError({
|
|
103
|
+
error: prettyError(error),
|
|
104
|
+
});
|
|
105
|
+
throw error;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
async function stopActiveSession(): Promise<void> {
|
|
110
|
+
const session = activeSession;
|
|
111
|
+
await self.controller.stopSession();
|
|
112
|
+
activeSession = undefined;
|
|
113
|
+
(session?.bridge as unknown as PyProxy | undefined)?.destroy();
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function enqueueSession<T>(operation: () => Promise<T>): Promise<T> {
|
|
117
|
+
const result = sessionQueue.then(operation);
|
|
118
|
+
sessionQueue = result.then(
|
|
119
|
+
() => undefined,
|
|
120
|
+
() => undefined,
|
|
121
|
+
);
|
|
122
|
+
return result;
|
|
123
|
+
}
|
|
54
124
|
|
|
55
125
|
// Handle RPC requests
|
|
56
126
|
const requestHandler = createRPCRequestHandler({
|
|
57
127
|
/**
|
|
58
128
|
* Start the session
|
|
59
129
|
*/
|
|
60
|
-
startSession: async (opts:
|
|
61
|
-
await
|
|
130
|
+
startSession: async (opts: SessionRequest) => {
|
|
131
|
+
await enqueueSession(() => startSession(opts, false));
|
|
132
|
+
},
|
|
133
|
+
|
|
134
|
+
replaceSession: async (opts: SessionRequest) => {
|
|
135
|
+
await enqueueSession(() => startSession(opts, true));
|
|
136
|
+
},
|
|
62
137
|
|
|
63
|
-
|
|
138
|
+
stopSession: async (opts: { appId: string; sessionGeneration: number }) => {
|
|
139
|
+
await enqueueSession(async () => {
|
|
140
|
+
if (
|
|
141
|
+
activeSession?.appId !== opts.appId ||
|
|
142
|
+
activeSession?.sessionGeneration !== opts.sessionGeneration
|
|
143
|
+
) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
64
146
|
invariant(self.controller, "Controller not loaded");
|
|
65
|
-
|
|
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;
|
|
147
|
+
await stopActiveSession();
|
|
148
|
+
});
|
|
81
149
|
},
|
|
82
150
|
|
|
83
151
|
/**
|
|
84
152
|
* Load packages
|
|
85
153
|
*/
|
|
86
|
-
loadPackages: async (
|
|
154
|
+
loadPackages: async (opts: {
|
|
155
|
+
appId: string;
|
|
156
|
+
code: string;
|
|
157
|
+
sessionGeneration: number;
|
|
158
|
+
}) => {
|
|
87
159
|
await pyodideReadyPromise; // Make sure loading is done
|
|
160
|
+
await enqueueSession(async () => {
|
|
161
|
+
requireActiveBridge(opts);
|
|
88
162
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
code
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
163
|
+
let { code } = opts;
|
|
164
|
+
|
|
165
|
+
if (shouldLoadDuckDBPackages(code)) {
|
|
166
|
+
// Add pandas and duckdb to the code for mo.sql and for remote duckdb sources
|
|
167
|
+
code = `import pandas\n${code}`;
|
|
168
|
+
code = `import duckdb\n${code}`;
|
|
169
|
+
code = `import sqlglot\n${code}`;
|
|
170
|
+
|
|
171
|
+
// Polars + SQL requires pyarrow, and installing
|
|
172
|
+
// after notebook load does not work. As a heuristic,
|
|
173
|
+
// if it appears that the notebook uses polars, add pyarrow.
|
|
174
|
+
if (code.includes("polars")) {
|
|
175
|
+
code = `import pyarrow\n${code}`;
|
|
176
|
+
}
|
|
100
177
|
}
|
|
101
|
-
}
|
|
102
178
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
179
|
+
await self.pyodide.loadPackagesFromImports(code, {
|
|
180
|
+
messageCallback: Logger.log,
|
|
181
|
+
errorCallback: Logger.error,
|
|
182
|
+
});
|
|
106
183
|
});
|
|
107
184
|
},
|
|
108
185
|
|
|
@@ -110,37 +187,56 @@ const requestHandler = createRPCRequestHandler({
|
|
|
110
187
|
* Call a function on the bridge
|
|
111
188
|
*/
|
|
112
189
|
bridge: async (opts: {
|
|
190
|
+
appId: string;
|
|
113
191
|
functionName: keyof RawBridge;
|
|
114
192
|
payload: {} | undefined | null;
|
|
193
|
+
sessionGeneration: number;
|
|
115
194
|
}) => {
|
|
116
195
|
await pyodideReadyPromise; // Make sure loading is done
|
|
117
196
|
|
|
118
197
|
const { functionName, payload } = opts;
|
|
119
198
|
|
|
120
199
|
// Perform the function call to the Python bridge
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
200
|
+
return enqueueSession(async () => {
|
|
201
|
+
const bridge = requireActiveBridge(opts);
|
|
202
|
+
|
|
203
|
+
// Serialize the payload
|
|
204
|
+
const payloadString =
|
|
205
|
+
payload == null
|
|
206
|
+
? null
|
|
207
|
+
: typeof payload === "string"
|
|
208
|
+
? payload
|
|
209
|
+
: JSON.stringify(payload);
|
|
210
|
+
|
|
211
|
+
// Make the request
|
|
212
|
+
const response =
|
|
213
|
+
payloadString == null
|
|
214
|
+
? // @ts-expect-error ehh TypeScript
|
|
215
|
+
await bridge[functionName]()
|
|
216
|
+
: // @ts-expect-error ehh TypeScript
|
|
217
|
+
await bridge[functionName](payloadString);
|
|
218
|
+
|
|
219
|
+
// Post the response back to the main thread
|
|
220
|
+
return typeof response === "string" ? JSON.parse(response) : response;
|
|
221
|
+
});
|
|
141
222
|
},
|
|
142
223
|
});
|
|
143
224
|
|
|
225
|
+
function requireActiveBridge(opts: {
|
|
226
|
+
appId: string;
|
|
227
|
+
sessionGeneration: number;
|
|
228
|
+
}): SerializedBridge {
|
|
229
|
+
const session = activeSession;
|
|
230
|
+
if (
|
|
231
|
+
!session ||
|
|
232
|
+
opts.appId !== session.appId ||
|
|
233
|
+
opts.sessionGeneration !== session.sessionGeneration
|
|
234
|
+
) {
|
|
235
|
+
throw new Error("The marimo app session is no longer active.");
|
|
236
|
+
}
|
|
237
|
+
return session.bridge;
|
|
238
|
+
}
|
|
239
|
+
|
|
144
240
|
// create the iframe's schema
|
|
145
241
|
export type WorkerSchema = RPCSchema<
|
|
146
242
|
{
|
|
@@ -148,7 +244,7 @@ export type WorkerSchema = RPCSchema<
|
|
|
148
244
|
// Emitted when the worker is ready
|
|
149
245
|
ready: {};
|
|
150
246
|
// Emitted when the kernel sends a message
|
|
151
|
-
kernelMessage:
|
|
247
|
+
kernelMessage: IslandsKernelMessage;
|
|
152
248
|
// Emitted when the Pyodide is initialized
|
|
153
249
|
initialized: {};
|
|
154
250
|
// Emitted when the Pyodide fails to initialize
|
|
@@ -54,6 +54,24 @@ describe("createLazyRequests", () => {
|
|
|
54
54
|
} as unknown as EditRequests & RunRequests;
|
|
55
55
|
});
|
|
56
56
|
|
|
57
|
+
it("passes server-only requests through without starting a kernel", async () => {
|
|
58
|
+
const environment = { marimo: "1.2.3" };
|
|
59
|
+
mockDelegate.getEnvironmentInfo = vi
|
|
60
|
+
.fn()
|
|
61
|
+
.mockResolvedValue(environment) as EditRequests["getEnvironmentInfo"];
|
|
62
|
+
|
|
63
|
+
const lazyRequests = createLazyRequests(
|
|
64
|
+
mockDelegate,
|
|
65
|
+
mockGetRuntimeManager,
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
await expect(lazyRequests.getEnvironmentInfo()).resolves.toEqual(
|
|
69
|
+
environment,
|
|
70
|
+
);
|
|
71
|
+
expect(mockInit).not.toHaveBeenCalled();
|
|
72
|
+
expect(mockDelegate.getEnvironmentInfo).toHaveBeenCalledOnce();
|
|
73
|
+
});
|
|
74
|
+
|
|
57
75
|
it("should call init once before first request", async () => {
|
|
58
76
|
const lazyRequests = createLazyRequests(
|
|
59
77
|
mockDelegate,
|