@marimo-team/islands 0.23.15-dev7 → 0.23.15-dev72
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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-i9MrZhpb.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-BQQIEJqn.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
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
import { render } from "@testing-library/react";
|
|
3
|
+
import { createStore, Provider } from "jotai";
|
|
4
|
+
import { beforeAll, describe, expect, it } from "vitest";
|
|
5
|
+
import { SetupMocks } from "@/__mocks__/common";
|
|
6
|
+
import { MockNotebook } from "@/__mocks__/notebook";
|
|
7
|
+
import { MockRequestClient } from "@/__mocks__/requests";
|
|
8
|
+
import { cellId } from "@/__tests__/branded";
|
|
9
|
+
import { TooltipProvider } from "@/components/ui/tooltip";
|
|
10
|
+
import { notebookAtom } from "@/core/cells/cells";
|
|
11
|
+
import type { CellRuntimeState } from "@/core/cells/types";
|
|
12
|
+
import { createCellRuntimeState } from "@/core/cells/types";
|
|
13
|
+
import { defaultUserConfig } from "@/core/config/config-schema";
|
|
14
|
+
import type { AppMode } from "@/core/mode";
|
|
15
|
+
import { requestClientAtom } from "@/core/network/requests";
|
|
16
|
+
import { Cell } from "../notebook-cell";
|
|
17
|
+
|
|
18
|
+
const cid = cellId("test");
|
|
19
|
+
|
|
20
|
+
function createTestWrapper() {
|
|
21
|
+
const store = createStore();
|
|
22
|
+
store.set(requestClientAtom, MockRequestClient.create());
|
|
23
|
+
const wrapper = ({ children }: { children: React.ReactNode }) => (
|
|
24
|
+
<Provider store={store}>{children}</Provider>
|
|
25
|
+
);
|
|
26
|
+
return { wrapper, store };
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function seedNotebook(
|
|
30
|
+
store: ReturnType<typeof createStore>,
|
|
31
|
+
runtimeOverrides: Partial<CellRuntimeState> = {},
|
|
32
|
+
) {
|
|
33
|
+
const notebook = MockNotebook.notebookState({
|
|
34
|
+
cellData: {
|
|
35
|
+
[cid]: {
|
|
36
|
+
code: "1 + 1",
|
|
37
|
+
name: "test_cell",
|
|
38
|
+
edited: false,
|
|
39
|
+
serializedEditorState: null,
|
|
40
|
+
config: {
|
|
41
|
+
disabled: false,
|
|
42
|
+
hide_code: false,
|
|
43
|
+
column: null,
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
notebook.cellRuntime[cid] = createCellRuntimeState({
|
|
49
|
+
status: "idle",
|
|
50
|
+
output: {
|
|
51
|
+
channel: "output",
|
|
52
|
+
mimetype: "text/html",
|
|
53
|
+
data: "<span>persist me</span>",
|
|
54
|
+
timestamp: 0,
|
|
55
|
+
},
|
|
56
|
+
...runtimeOverrides,
|
|
57
|
+
});
|
|
58
|
+
store.set(notebookAtom, notebook);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function renderCell(mode: AppMode) {
|
|
62
|
+
return (
|
|
63
|
+
<TooltipProvider>
|
|
64
|
+
<Cell
|
|
65
|
+
cellId={cid}
|
|
66
|
+
mode={mode}
|
|
67
|
+
canDelete={true}
|
|
68
|
+
userConfig={defaultUserConfig()}
|
|
69
|
+
isCollapsed={false}
|
|
70
|
+
collapseCount={0}
|
|
71
|
+
canMoveX={false}
|
|
72
|
+
theme="light"
|
|
73
|
+
showPlaceholder={false}
|
|
74
|
+
/>
|
|
75
|
+
</TooltipProvider>
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
beforeAll(() => {
|
|
80
|
+
SetupMocks.resizeObserver();
|
|
81
|
+
global.HTMLDivElement.prototype.scrollIntoView = () => {
|
|
82
|
+
// do nothing
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
describe("output persistence across mode changes", () => {
|
|
87
|
+
it("preserves the output DOM node when toggling edit <-> present", () => {
|
|
88
|
+
const { store, wrapper } = createTestWrapper();
|
|
89
|
+
seedNotebook(store);
|
|
90
|
+
|
|
91
|
+
const { container, rerender } = render(renderCell("edit"), { wrapper });
|
|
92
|
+
|
|
93
|
+
const outputNode = container.querySelector<HTMLElement>(
|
|
94
|
+
'[data-cell-role="output"]',
|
|
95
|
+
);
|
|
96
|
+
expect(outputNode).toBeTruthy();
|
|
97
|
+
// A property survives only if the exact DOM node instance survives.
|
|
98
|
+
(outputNode as HTMLElement & { __sentinel?: string }).__sentinel = "alive";
|
|
99
|
+
|
|
100
|
+
rerender(renderCell("present"));
|
|
101
|
+
const presentNode = container.querySelector<HTMLElement>(
|
|
102
|
+
'[data-cell-role="output"]',
|
|
103
|
+
);
|
|
104
|
+
expect(presentNode).toBe(outputNode);
|
|
105
|
+
expect(presentNode?.isConnected).toBe(true);
|
|
106
|
+
expect(
|
|
107
|
+
(presentNode as HTMLElement & { __sentinel?: string }).__sentinel,
|
|
108
|
+
).toBe("alive");
|
|
109
|
+
|
|
110
|
+
// Edit chrome is hidden but stays mounted while presenting
|
|
111
|
+
const tray = container.querySelector<HTMLElement>(
|
|
112
|
+
"[data-testid='cell-tray']",
|
|
113
|
+
);
|
|
114
|
+
expect(tray).toBeTruthy();
|
|
115
|
+
expect(tray?.hidden).toBe(true);
|
|
116
|
+
// Present styling is applied
|
|
117
|
+
expect(
|
|
118
|
+
container
|
|
119
|
+
.querySelector(`[data-cell-id="${cid}"]`)
|
|
120
|
+
?.classList.contains("published"),
|
|
121
|
+
).toBe(true);
|
|
122
|
+
|
|
123
|
+
rerender(renderCell("edit"));
|
|
124
|
+
expect(container.querySelector('[data-cell-role="output"]')).toBe(
|
|
125
|
+
outputNode,
|
|
126
|
+
);
|
|
127
|
+
expect(
|
|
128
|
+
container.querySelector<HTMLElement>("[data-testid='cell-tray']")?.hidden,
|
|
129
|
+
).toBe(false);
|
|
130
|
+
expect(
|
|
131
|
+
container
|
|
132
|
+
.querySelector(`[data-cell-id="${cid}"]`)
|
|
133
|
+
?.classList.contains("published"),
|
|
134
|
+
).toBe(false);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it("hides all edit chrome while presenting", () => {
|
|
138
|
+
const { store, wrapper } = createTestWrapper();
|
|
139
|
+
seedNotebook(store);
|
|
140
|
+
|
|
141
|
+
const { container, rerender } = render(renderCell("edit"), { wrapper });
|
|
142
|
+
|
|
143
|
+
// Returns true when the element is not visible: either gone from the DOM or
|
|
144
|
+
// inside a `hidden` ancestor. Edit chrome may unmount while presenting (only
|
|
145
|
+
// the cell *output* is contractually kept mounted — see the DOM-node test
|
|
146
|
+
// above); either way it must not be visible.
|
|
147
|
+
const isHidden = (testId: string) => {
|
|
148
|
+
const el = container.querySelector(`[data-testid='${testId}']`);
|
|
149
|
+
return el === null || el.closest("[hidden]") !== null;
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
// Everything visible in edit mode
|
|
153
|
+
const editChrome = [
|
|
154
|
+
"cell-tray",
|
|
155
|
+
"drag-button",
|
|
156
|
+
"cell-actions-button",
|
|
157
|
+
"delete-button",
|
|
158
|
+
"create-cell-button",
|
|
159
|
+
"console-output-area",
|
|
160
|
+
];
|
|
161
|
+
for (const testId of editChrome) {
|
|
162
|
+
expect({ testId, hidden: isHidden(testId) }).toEqual({
|
|
163
|
+
testId,
|
|
164
|
+
hidden: false,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
rerender(renderCell("present"));
|
|
169
|
+
for (const testId of editChrome) {
|
|
170
|
+
expect({ testId, hidden: isHidden(testId) }).toEqual({
|
|
171
|
+
testId,
|
|
172
|
+
hidden: true,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
rerender(renderCell("edit"));
|
|
177
|
+
for (const testId of editChrome) {
|
|
178
|
+
expect({ testId, hidden: isHidden(testId) }).toEqual({
|
|
179
|
+
testId,
|
|
180
|
+
hidden: false,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
it("does not dim edited-but-not-run outputs as stale while presenting", () => {
|
|
186
|
+
const { store, wrapper } = createTestWrapper();
|
|
187
|
+
seedNotebook(store);
|
|
188
|
+
// Mark the cell as edited without re-running it
|
|
189
|
+
const notebook = store.get(notebookAtom);
|
|
190
|
+
notebook.cellData[cid] = { ...notebook.cellData[cid], edited: true };
|
|
191
|
+
store.set(notebookAtom, { ...notebook });
|
|
192
|
+
|
|
193
|
+
const { container, rerender } = render(renderCell("edit"), { wrapper });
|
|
194
|
+
expect(container.querySelector(".marimo-output-stale")).toBeTruthy();
|
|
195
|
+
|
|
196
|
+
// The read view never dims pending edits; present mode matches it
|
|
197
|
+
rerender(renderCell("present"));
|
|
198
|
+
expect(container.querySelector(".marimo-output-stale")).toBeFalsy();
|
|
199
|
+
|
|
200
|
+
rerender(renderCell("edit"));
|
|
201
|
+
expect(container.querySelector(".marimo-output-stale")).toBeTruthy();
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
it("hides errored cells while presenting without unmounting them", () => {
|
|
205
|
+
const { store, wrapper } = createTestWrapper();
|
|
206
|
+
seedNotebook(store, {
|
|
207
|
+
errored: true,
|
|
208
|
+
output: {
|
|
209
|
+
channel: "marimo-error",
|
|
210
|
+
mimetype: "application/vnd.marimo+error",
|
|
211
|
+
data: [{ type: "exception", exception_type: "ValueError", msg: "!" }],
|
|
212
|
+
timestamp: 0,
|
|
213
|
+
},
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
const { container, rerender } = render(renderCell("edit"), { wrapper });
|
|
217
|
+
|
|
218
|
+
const outputNode = container.querySelector<HTMLElement>(
|
|
219
|
+
'[data-cell-role="output"]',
|
|
220
|
+
);
|
|
221
|
+
expect(outputNode).toBeTruthy();
|
|
222
|
+
|
|
223
|
+
const getSortableWrapper = () =>
|
|
224
|
+
container.querySelector<HTMLElement>(`[data-cell-id="${cid}"]`)
|
|
225
|
+
?.parentElement;
|
|
226
|
+
expect(getSortableWrapper()?.hidden).toBe(false);
|
|
227
|
+
|
|
228
|
+
rerender(renderCell("present"));
|
|
229
|
+
// Still mounted, but hidden
|
|
230
|
+
expect(container.querySelector('[data-cell-role="output"]')).toBe(
|
|
231
|
+
outputNode,
|
|
232
|
+
);
|
|
233
|
+
expect(getSortableWrapper()?.hidden).toBe(true);
|
|
234
|
+
|
|
235
|
+
rerender(renderCell("edit"));
|
|
236
|
+
expect(container.querySelector('[data-cell-role="output"]')).toBe(
|
|
237
|
+
outputNode,
|
|
238
|
+
);
|
|
239
|
+
expect(getSortableWrapper()?.hidden).toBe(false);
|
|
240
|
+
});
|
|
241
|
+
});
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
4
|
+
import {
|
|
5
|
+
type ConnectionInfo,
|
|
6
|
+
getMarimoCommand,
|
|
7
|
+
getRawPrompt,
|
|
8
|
+
getTerminalCommand,
|
|
9
|
+
maskToken,
|
|
10
|
+
shellQuote,
|
|
11
|
+
} from "../pair-with-agent-commands";
|
|
12
|
+
|
|
13
|
+
const CONNECTION: ConnectionInfo = {
|
|
14
|
+
url: "http://localhost:8000",
|
|
15
|
+
sessionId: "s_ab12cd",
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
describe("shellQuote", () => {
|
|
19
|
+
it("quotes an empty string", () => {
|
|
20
|
+
expect(shellQuote("")).toBe("''");
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("leaves shell-safe values untouched", () => {
|
|
24
|
+
expect(shellQuote("http://localhost:8000")).toBe("http://localhost:8000");
|
|
25
|
+
expect(shellQuote("s_ab12cd")).toBe("s_ab12cd");
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it("quotes values with shell metacharacters", () => {
|
|
29
|
+
expect(shellQuote("http://host:8000?a=1&b=2")).toBe(
|
|
30
|
+
"'http://host:8000?a=1&b=2'",
|
|
31
|
+
);
|
|
32
|
+
expect(shellQuote("has space")).toBe("'has space'");
|
|
33
|
+
expect(shellQuote("$(rm -rf /)")).toBe("'$(rm -rf /)'");
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("escapes embedded single quotes without breaking out", () => {
|
|
37
|
+
// Closes the quote, emits a literal ' via "'", then reopens: '"'"'
|
|
38
|
+
expect(shellQuote("a'b")).toBe(`'a'"'"'b'`);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
describe("getMarimoCommand", () => {
|
|
43
|
+
afterEach(() => {
|
|
44
|
+
vi.unstubAllEnvs();
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it("uses the local checkout in dev", () => {
|
|
48
|
+
vi.stubEnv("DEV", true);
|
|
49
|
+
expect(getMarimoCommand()).toBe("uv run marimo");
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("uses uvx outside of dev", () => {
|
|
53
|
+
vi.stubEnv("DEV", false);
|
|
54
|
+
expect(getMarimoCommand()).toBe("uvx marimo@latest");
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
describe("getTerminalCommand", () => {
|
|
59
|
+
it("includes the url and session for each agent", () => {
|
|
60
|
+
expect(getTerminalCommand("claude", CONNECTION, false)).toBe(
|
|
61
|
+
`claude "$(uv run marimo pair prompt --url http://localhost:8000 --session s_ab12cd --claude)"`,
|
|
62
|
+
);
|
|
63
|
+
expect(getTerminalCommand("codex", CONNECTION, false)).toBe(
|
|
64
|
+
`codex "$(uv run marimo pair prompt --url http://localhost:8000 --session s_ab12cd --codex)"`,
|
|
65
|
+
);
|
|
66
|
+
expect(getTerminalCommand("opencode", CONNECTION, false)).toBe(
|
|
67
|
+
`opencode --prompt "$(uv run marimo pair prompt --url http://localhost:8000 --session s_ab12cd --opencode)"`,
|
|
68
|
+
);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it("always targets the given session, not a random one", () => {
|
|
72
|
+
const command = getTerminalCommand("claude", CONNECTION, false);
|
|
73
|
+
expect(command).toContain("--session s_ab12cd");
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it("shell-escapes a url containing metacharacters", () => {
|
|
77
|
+
const command = getTerminalCommand(
|
|
78
|
+
"claude",
|
|
79
|
+
{ url: "http://host:8000?file=a&b", sessionId: "s_ab12cd" },
|
|
80
|
+
false,
|
|
81
|
+
);
|
|
82
|
+
expect(command).toContain("--url 'http://host:8000?file=a&b'");
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it("adds --with-token before the agent flag when requested", () => {
|
|
86
|
+
const command = getTerminalCommand("claude", CONNECTION, true);
|
|
87
|
+
expect(command).toContain("--with-token --claude");
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it("omits --with-token when not requested", () => {
|
|
91
|
+
expect(getTerminalCommand("claude", CONNECTION, false)).not.toContain(
|
|
92
|
+
"--with-token",
|
|
93
|
+
);
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
describe("getRawPrompt", () => {
|
|
98
|
+
it("references the session-scoped execute-code command", () => {
|
|
99
|
+
const prompt = getRawPrompt(CONNECTION, null);
|
|
100
|
+
expect(prompt).toContain(
|
|
101
|
+
"execute-code.sh --url http://localhost:8000 --session s_ab12cd",
|
|
102
|
+
);
|
|
103
|
+
expect(prompt).toContain(
|
|
104
|
+
"Connect to the notebook at: http://localhost:8000 (session s_ab12cd)",
|
|
105
|
+
);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it("omits the token hint when there is no token", () => {
|
|
109
|
+
const prompt = getRawPrompt(CONNECTION, null);
|
|
110
|
+
expect(prompt).not.toContain("--token");
|
|
111
|
+
expect(prompt).not.toContain("auth token");
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it("includes a session-scoped token hint when a token is present", () => {
|
|
115
|
+
const prompt = getRawPrompt(CONNECTION, "secret-token");
|
|
116
|
+
expect(prompt).toContain(
|
|
117
|
+
"execute-code.sh --url http://localhost:8000 --session s_ab12cd --token secret-token",
|
|
118
|
+
);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it("shell-escapes a token containing a single quote", () => {
|
|
122
|
+
const prompt = getRawPrompt(CONNECTION, "tok'en");
|
|
123
|
+
expect(prompt).toContain(`--token 'tok'"'"'en'`);
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it("matches the CLI prompt shape", () => {
|
|
127
|
+
const prompt = getRawPrompt(CONNECTION, null);
|
|
128
|
+
expect(prompt).toMatchInlineSnapshot(`
|
|
129
|
+
"Use the /marimo-pair skill to pair-program on a running marimo notebook.
|
|
130
|
+
|
|
131
|
+
Connect to the notebook at: http://localhost:8000 (session s_ab12cd)
|
|
132
|
+
|
|
133
|
+
Use \`execute-code.sh --url http://localhost:8000 --session s_ab12cd\` from the marimo-pair skill to execute code in the notebook.
|
|
134
|
+
|
|
135
|
+
Once you are connected, send a fun toast (mo.status.toast(...)) to the user inside marimo letting them know you're ready to pair."
|
|
136
|
+
`);
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
describe("maskToken", () => {
|
|
141
|
+
it("masks short tokens entirely", () => {
|
|
142
|
+
expect(maskToken("ab")).toBe("****");
|
|
143
|
+
expect(maskToken("abcd")).toBe("****");
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it("reveals only the last four characters", () => {
|
|
147
|
+
expect(maskToken("abcdefgh")).toBe("****efgh");
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it("caps the number of mask characters at eight", () => {
|
|
151
|
+
expect(maskToken("0123456789abcdef")).toBe("********cdef");
|
|
152
|
+
});
|
|
153
|
+
});
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { assertNever } from "@/utils/assertNever";
|
|
4
|
+
|
|
5
|
+
export type AgentTab = "claude" | "codex" | "opencode" | "prompt";
|
|
6
|
+
|
|
7
|
+
export const TERMINAL_TABS = ["claude", "codex", "opencode"] as const;
|
|
8
|
+
|
|
9
|
+
export const AGENT_TABS = ["claude", "codex", "opencode", "prompt"] as const;
|
|
10
|
+
|
|
11
|
+
export const AGENT_LABELS: Record<AgentTab, string> = {
|
|
12
|
+
claude: "Claude",
|
|
13
|
+
codex: "Codex",
|
|
14
|
+
opencode: "OpenCode",
|
|
15
|
+
prompt: "Prompt",
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export const SKILL_INSTALL = "npx skills add marimo-team/marimo-pair";
|
|
19
|
+
|
|
20
|
+
/** How to invoke marimo: from the local checkout in dev, else via uvx. */
|
|
21
|
+
export function getMarimoCommand(): string {
|
|
22
|
+
return import.meta.env.DEV ? "uv run marimo" : "uvx marimo@latest";
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* POSIX-quote a value for safe embedding in a shell command. These commands are
|
|
27
|
+
* meant to be copied into a terminal, so a url/token containing shell
|
|
28
|
+
* metacharacters (`'`, `&`, `$(...)`, ...) must not break out of its argument.
|
|
29
|
+
*
|
|
30
|
+
* Mirrors Python's `shlex.quote` (used on the CLI side in
|
|
31
|
+
* `marimo/_cli/pair/commands.py`) so both sides produce identical commands:
|
|
32
|
+
* values that are already shell-safe are left as-is for readability, and
|
|
33
|
+
* anything else is single-quoted with embedded quotes escaped as `'"'"'`.
|
|
34
|
+
*/
|
|
35
|
+
export function shellQuote(value: string): string {
|
|
36
|
+
if (value === "") {
|
|
37
|
+
return "''";
|
|
38
|
+
}
|
|
39
|
+
// Same "safe" character set as CPython's shlex.quote (ASCII \w plus a few).
|
|
40
|
+
if (/^[\w@%+=:,./-]+$/.test(value)) {
|
|
41
|
+
return value;
|
|
42
|
+
}
|
|
43
|
+
return `'${value.replaceAll("'", `'"'"'`)}'`;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Identifies the specific running notebook to pair on. */
|
|
47
|
+
export interface ConnectionInfo {
|
|
48
|
+
url: string;
|
|
49
|
+
/**
|
|
50
|
+
* The current session id, so agents connect to *this* notebook rather than
|
|
51
|
+
* guessing when multiple sessions are open on the same server.
|
|
52
|
+
*/
|
|
53
|
+
sessionId: string;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* The shell command that wraps an agent CLI, delegating prompt generation to
|
|
58
|
+
* `marimo pair prompt` so the terminal and CLI stay in sync.
|
|
59
|
+
*/
|
|
60
|
+
export function getTerminalCommand(
|
|
61
|
+
agent: Exclude<AgentTab, "prompt">,
|
|
62
|
+
{ url, sessionId }: ConnectionInfo,
|
|
63
|
+
withToken: boolean,
|
|
64
|
+
): string {
|
|
65
|
+
const tokenFlag = withToken ? " --with-token" : "";
|
|
66
|
+
const base = `${getMarimoCommand()} pair prompt --url ${shellQuote(url)} --session ${shellQuote(sessionId)}${tokenFlag}`;
|
|
67
|
+
switch (agent) {
|
|
68
|
+
case "claude":
|
|
69
|
+
return `claude "$(${base} --claude)"`;
|
|
70
|
+
case "codex":
|
|
71
|
+
return `codex "$(${base} --codex)"`;
|
|
72
|
+
case "opencode":
|
|
73
|
+
return `opencode --prompt "$(${base} --opencode)"`;
|
|
74
|
+
default:
|
|
75
|
+
assertNever(agent);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* The raw prompt for the "Prompt" tab. Mirrors the output of
|
|
81
|
+
* `marimo pair prompt` (see `marimo/_cli/pair/commands.py`) so pasting it into
|
|
82
|
+
* an agent behaves the same as the terminal commands.
|
|
83
|
+
*/
|
|
84
|
+
export function getRawPrompt(
|
|
85
|
+
{ url, sessionId }: ConnectionInfo,
|
|
86
|
+
token: string | null,
|
|
87
|
+
): string {
|
|
88
|
+
const executeCmd = `execute-code.sh --url ${shellQuote(url)} --session ${shellQuote(sessionId)}`;
|
|
89
|
+
const tokenHint = token
|
|
90
|
+
? `\n\nUse this auth token when calling \`execute-code.sh\`: \`${executeCmd} --token ${shellQuote(token)}\`.`
|
|
91
|
+
: "";
|
|
92
|
+
return [
|
|
93
|
+
"Use the /marimo-pair skill to pair-program on a running marimo notebook.",
|
|
94
|
+
"",
|
|
95
|
+
`Connect to the notebook at: ${url} (session ${sessionId})`,
|
|
96
|
+
"",
|
|
97
|
+
`Use \`${executeCmd}\` from the marimo-pair skill to execute code in the notebook.${tokenHint}`,
|
|
98
|
+
"",
|
|
99
|
+
"Once you are connected, send a fun toast (mo.status.toast(...)) to the user inside marimo letting them know you're ready to pair.",
|
|
100
|
+
].join("\n");
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Mask all but the last 4 chars of a token for display. */
|
|
104
|
+
export function maskToken(token: string): string {
|
|
105
|
+
if (token.length <= 4) {
|
|
106
|
+
return "****";
|
|
107
|
+
}
|
|
108
|
+
return `${"*".repeat(Math.min(token.length - 4, 8))}${token.slice(-4)}`;
|
|
109
|
+
}
|
|
@@ -14,67 +14,20 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
|
|
|
14
14
|
import { copyToClipboard } from "@/utils/copy";
|
|
15
15
|
import { Events } from "@/utils/events";
|
|
16
16
|
import { Tooltip } from "@/components/ui/tooltip";
|
|
17
|
-
import { assertNever } from "@/utils/assertNever";
|
|
18
17
|
import { asRemoteURL, useRuntimeManager } from "@/core/runtime/config";
|
|
19
18
|
import { API } from "@/core/network/api";
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
withToken: boolean,
|
|
33
|
-
): string {
|
|
34
|
-
const tokenFlag = withToken ? " --with-token" : "";
|
|
35
|
-
const base = `${getMarimoCommand()} pair prompt --url '${url}'${tokenFlag}`;
|
|
36
|
-
switch (agent) {
|
|
37
|
-
case "claude":
|
|
38
|
-
return `claude "$(${base} --claude)"`;
|
|
39
|
-
case "codex":
|
|
40
|
-
return `codex "$(${base} --codex)"`;
|
|
41
|
-
case "opencode":
|
|
42
|
-
return `opencode --prompt "$(${base} --opencode)"`;
|
|
43
|
-
default:
|
|
44
|
-
assertNever(agent);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
function getRawPrompt(url: string, token: string | null): string {
|
|
49
|
-
const tokenHint = token
|
|
50
|
-
? `\n\nUse this auth token when calling \`execute-code.sh\`: \`execute-code.sh --url '${url}' --token '${token}'\`.`
|
|
51
|
-
: "";
|
|
52
|
-
return [
|
|
53
|
-
"Use the /marimo-pair skill to pair-program on a running marimo notebook.",
|
|
54
|
-
"",
|
|
55
|
-
`Connect to the notebook at: ${url}`,
|
|
56
|
-
"",
|
|
57
|
-
`Use \`execute-code.sh --url ${url}\` from the marimo-pair skill to execute code in the notebook.${tokenHint}`,
|
|
58
|
-
"",
|
|
59
|
-
"Once you are connected, send a fun toast (mo.status.toast(...)) to the user inside marimo letting them know you're ready to pair.",
|
|
60
|
-
].join("\n");
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
function maskToken(token: string): string {
|
|
64
|
-
if (token.length <= 4) {
|
|
65
|
-
return "****";
|
|
66
|
-
}
|
|
67
|
-
return `${"*".repeat(Math.min(token.length - 4, 8))}${token.slice(-4)}`;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const SKILL_INSTALL = "npx skills add marimo-team/marimo-pair";
|
|
71
|
-
|
|
72
|
-
const AGENT_LABELS: Record<AgentTab, string> = {
|
|
73
|
-
claude: "Claude",
|
|
74
|
-
codex: "Codex",
|
|
75
|
-
opencode: "OpenCode",
|
|
76
|
-
prompt: "Prompt",
|
|
77
|
-
};
|
|
19
|
+
import { getSessionId } from "@/core/kernel/session";
|
|
20
|
+
import {
|
|
21
|
+
AGENT_LABELS,
|
|
22
|
+
AGENT_TABS,
|
|
23
|
+
type AgentTab,
|
|
24
|
+
type ConnectionInfo,
|
|
25
|
+
getRawPrompt,
|
|
26
|
+
getTerminalCommand,
|
|
27
|
+
maskToken,
|
|
28
|
+
SKILL_INSTALL,
|
|
29
|
+
TERMINAL_TABS,
|
|
30
|
+
} from "./pair-with-agent-commands";
|
|
78
31
|
|
|
79
32
|
function useAuthToken(): string | null {
|
|
80
33
|
const [token, setToken] = useState<string | null>(null);
|
|
@@ -98,7 +51,10 @@ export const PairWithAgentModal: React.FC<{
|
|
|
98
51
|
const runtimeManager = useRuntimeManager();
|
|
99
52
|
const authToken = useAuthToken();
|
|
100
53
|
const hasToken = Boolean(authToken);
|
|
101
|
-
const
|
|
54
|
+
const connection: ConnectionInfo = {
|
|
55
|
+
url: runtimeManager.httpURL.toString(),
|
|
56
|
+
sessionId: getSessionId(),
|
|
57
|
+
};
|
|
102
58
|
|
|
103
59
|
return (
|
|
104
60
|
<DialogContent className="sm:max-w-2xl">
|
|
@@ -125,7 +81,7 @@ export const PairWithAgentModal: React.FC<{
|
|
|
125
81
|
onValueChange={(v) => setActiveTab(v as AgentTab)}
|
|
126
82
|
>
|
|
127
83
|
<TabsList className="w-full">
|
|
128
|
-
{
|
|
84
|
+
{AGENT_TABS.map((tab) => (
|
|
129
85
|
<TabsTrigger key={tab} value={tab} className="flex-1">
|
|
130
86
|
{AGENT_LABELS[tab]}
|
|
131
87
|
</TabsTrigger>
|
|
@@ -147,7 +103,7 @@ export const PairWithAgentModal: React.FC<{
|
|
|
147
103
|
</Step>
|
|
148
104
|
<Step index={2} title="Run in your terminal">
|
|
149
105
|
<CommandBlock
|
|
150
|
-
command={getTerminalCommand(tab,
|
|
106
|
+
command={getTerminalCommand(tab, connection, hasToken)}
|
|
151
107
|
/>
|
|
152
108
|
</Step>
|
|
153
109
|
{hasToken && authToken && (
|
|
@@ -179,9 +135,9 @@ export const PairWithAgentModal: React.FC<{
|
|
|
179
135
|
}
|
|
180
136
|
>
|
|
181
137
|
<CommandBlock
|
|
182
|
-
command={getRawPrompt(
|
|
138
|
+
command={getRawPrompt(connection, authToken)}
|
|
183
139
|
display={getRawPrompt(
|
|
184
|
-
|
|
140
|
+
connection,
|
|
185
141
|
authToken ? maskToken(authToken) : null,
|
|
186
142
|
)}
|
|
187
143
|
multiline={true}
|
|
@@ -28,6 +28,7 @@ import {
|
|
|
28
28
|
KeyboardIcon,
|
|
29
29
|
LayoutTemplateIcon,
|
|
30
30
|
LinkIcon,
|
|
31
|
+
MessageCircleQuestionIcon,
|
|
31
32
|
MessagesSquareIcon,
|
|
32
33
|
NotebookIcon,
|
|
33
34
|
PanelLeftIcon,
|
|
@@ -44,6 +45,7 @@ import {
|
|
|
44
45
|
settingDialogAtom,
|
|
45
46
|
useOpenSettingsToTab,
|
|
46
47
|
} from "@/components/app-config/state";
|
|
48
|
+
import { FeedbackModal } from "@/components/editor/chrome/components/feedback-button";
|
|
47
49
|
import { MarkdownIcon } from "@/components/editor/cell/code/icons";
|
|
48
50
|
import { GitHubIcon } from "@/components/icons/github";
|
|
49
51
|
import { MarimoPlusIcon } from "@/components/icons/marimo-icons";
|
|
@@ -642,6 +644,12 @@ export function useNotebookActions() {
|
|
|
642
644
|
redundant: true,
|
|
643
645
|
additionalKeywords: ["preferences", "options", "configuration"],
|
|
644
646
|
},
|
|
647
|
+
{
|
|
648
|
+
icon: <MessageCircleQuestionIcon size={14} strokeWidth={1.5} />,
|
|
649
|
+
label: "Report an issue",
|
|
650
|
+
additionalKeywords: ["feedback", "bug", "issue", "report", "diagnostics"],
|
|
651
|
+
handle: () => openModal(<FeedbackModal onClose={closeModal} />),
|
|
652
|
+
},
|
|
645
653
|
{
|
|
646
654
|
icon: <ExternalLinkIcon size={14} strokeWidth={1.5} />,
|
|
647
655
|
label: "Resources",
|
|
@@ -231,6 +231,13 @@ export const AddCellWithAI: React.FC<{
|
|
|
231
231
|
|
|
232
232
|
const handleDeclineCompletion = () => {
|
|
233
233
|
deleteAllStagedCells();
|
|
234
|
+
// Focus the input so the user can refine the prompt.
|
|
235
|
+
inputRef.current?.view?.focus();
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
const handleClose = () => {
|
|
239
|
+
deleteAllStagedCells();
|
|
240
|
+
onClose();
|
|
234
241
|
};
|
|
235
242
|
|
|
236
243
|
const inputComponent = (
|
|
@@ -238,10 +245,7 @@ export const AddCellWithAI: React.FC<{
|
|
|
238
245
|
<SparklesIcon className="size-4 text-(--blue-11) mr-2" />
|
|
239
246
|
<PromptInput
|
|
240
247
|
inputRef={inputRef}
|
|
241
|
-
onClose={
|
|
242
|
-
deleteAllStagedCells();
|
|
243
|
-
onClose();
|
|
244
|
-
}}
|
|
248
|
+
onClose={handleClose}
|
|
245
249
|
value={input}
|
|
246
250
|
onChange={(newValue) => {
|
|
247
251
|
setInput(newValue);
|
|
@@ -254,7 +258,12 @@ export const AddCellWithAI: React.FC<{
|
|
|
254
258
|
hasCompletion,
|
|
255
259
|
})}
|
|
256
260
|
/>
|
|
257
|
-
<Button
|
|
261
|
+
<Button
|
|
262
|
+
variant="text"
|
|
263
|
+
size="sm"
|
|
264
|
+
className="mb-0 px-1"
|
|
265
|
+
onClick={handleClose}
|
|
266
|
+
>
|
|
258
267
|
<XIcon className="size-4" />
|
|
259
268
|
</Button>
|
|
260
269
|
</div>
|