@marimo-team/islands 0.16.5 → 0.17.0
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-D96i9G-X.js → ConnectedDataExplorerComponent-DJEUH6Bb.js} +78 -100
- package/dist/{_baseIsEqual-oN7pRNcM.js → _baseIsEqual-CN4oFUZ4.js} +20 -20
- package/dist/{_basePickBy-CYvzhRjy.js → _basePickBy-CzSvE_-f.js} +3 -3
- package/dist/{_baseProperty-DGUdIBuu.js → _baseProperty-DbbUiyUD.js} +5 -5
- package/dist/{_baseUniq-B5gfSl8S.js → _baseUniq-DwoC-LVO.js} +4 -4
- package/dist/any-language-editor-CEXn1vFs.js +156 -0
- package/dist/apl-DuVfHsPc.js +4 -0
- package/dist/architecture-O4VJ6CD3-lp-opOaL.js +21 -0
- package/dist/{architectureDiagram-W76B3OCA-DkEhipkW.js → architectureDiagram-W76B3OCA-CoBORy6u.js} +34 -34
- package/dist/asciiarmor-qIVWsi4F.js +4 -0
- package/dist/asn1-BjPqARr7.js +4 -0
- package/dist/assets/__vite-browser-external-lX-sn9m2.js +1 -0
- package/dist/assets/worker-vPn7gxWj.js +54 -0
- package/dist/{blockDiagram-QIGZ2CNN-DZOqLMYa.js → blockDiagram-QIGZ2CNN-0yzoLIar.js} +75 -86
- package/dist/brainfuck-DPGTVfkE.js +4 -0
- package/dist/{button-CEcjneWG.js → button-DcnBVpVa.js} +11 -14
- package/dist/{c4Diagram-FPNF74CW-DVaR7c9q.js → c4Diagram-FPNF74CW-CKsIA_DD.js} +27 -51
- package/dist/{channel-Uh0KpgGW.js → channel-3LVvQZcD.js} +1 -1
- package/dist/{check-BK9zDfQk.js → check-D7ifz5op.js} +1 -1
- package/dist/{chunk-3AY6CYHV-Dk2R2-S1.js → chunk-3AY6CYHV-B2C-aVc3.js} +35 -35
- package/dist/{chunk-4BX2VUAB-CqO6zUIz.js → chunk-4BX2VUAB-DEd4VI9L.js} +1 -1
- package/dist/{chunk-4KMFLZZN-CloTfTwP.js → chunk-4KMFLZZN-DnvP3O4K.js} +216 -325
- package/dist/{chunk-55IACEB6-I0rmqTua.js → chunk-55IACEB6-BcCzwOOl.js} +1 -1
- package/dist/{chunk-6OXUPJBA-BuROSTmo.js → chunk-6OXUPJBA-eNAAfJ3Q.js} +7 -7
- package/dist/{chunk-7GE3RBXV-B1-tsIPP.js → chunk-7GE3RBXV-CSAeQvLz.js} +1 -1
- package/dist/{chunk-ABZYJK2D-CLlso8tj.js → chunk-ABZYJK2D-CZcb_1iM.js} +16 -20
- package/dist/{chunk-BN7GFLIU-Db2-FjLn.js → chunk-BN7GFLIU-pBc5O5Rh.js} +1 -1
- package/dist/{chunk-CVBHYZKI-BONeiloK.js → chunk-CVBHYZKI-CivHZg9P.js} +3 -3
- package/dist/{chunk-CXMOBAN2-U9GJSP1d.js → chunk-CXMOBAN2-Dd0E6qb0.js} +46 -54
- package/dist/chunk-EXTU4WIE-GQ2ZWfJo.js +10 -0
- package/dist/{chunk-FMBD7UC4-DyV3BR_I.js → chunk-FMBD7UC4-C6YcisV6.js} +1 -1
- package/dist/{chunk-JA3XYJ7Z-C9A1076P.js → chunk-JA3XYJ7Z-DYeQaT57.js} +21 -25
- package/dist/{chunk-JEIROHC2-BGnFkSVq.js → chunk-JEIROHC2-B-EZMP4V.js} +1 -1
- package/dist/{chunk-K7UQS3LO-033LOsjK.js → chunk-K7UQS3LO-DENzlS-M.js} +7 -7
- package/dist/{chunk-KMC2YHZD-DT4Sq4Ld.js → chunk-KMC2YHZD-SckhHdEh.js} +1 -1
- package/dist/{chunk-QN33PNHL-gs44MZla.js → chunk-QN33PNHL-Cjq5b604.js} +2 -2
- package/dist/{chunk-QYVHNE3D-B8BO1AnT.js → chunk-QYVHNE3D-CNUuivie.js} +3 -4
- package/dist/{chunk-QZHKN3VN-CeN_GkU6.js → chunk-QZHKN3VN-DugEU_bA.js} +1 -1
- package/dist/chunk-S3R3BYOJ-itCT6Vif.js +380 -0
- package/dist/{chunk-T44TD3VJ-BwzD6YE0.js → chunk-T44TD3VJ-BLdfTX8J.js} +1 -1
- package/dist/{chunk-TVAH2DTR-Bi6jpQJQ.js → chunk-TVAH2DTR-BOnwF9d8.js} +7 -8
- package/dist/{chunk-TZMSLE5B-D8klz2H_.js → chunk-TZMSLE5B-DGs66AlL.js} +4 -5
- package/dist/{chunk-WFRQ32O7-CzSwSlN0.js → chunk-WFRQ32O7-CPsipkmJ.js} +1 -1
- package/dist/{chunk-WFWHJNB7-DN_cavM6.js → chunk-WFWHJNB7-Cmed18Pk.js} +1 -1
- package/dist/{chunk-XRWGC2XP-Bb5eGNM2.js → chunk-XRWGC2XP-DH5GDaY8.js} +1 -1
- package/dist/{chunk-ZPAFE4SF-S5UYNb0V.js → chunk-ZPAFE4SF-DPDwaqZm.js} +22 -22
- package/dist/classDiagram-KNZD7YFC-azuS_99k.js +39 -0
- package/dist/classDiagram-v2-RKCZMP56-CQpyQQOR.js +39 -0
- package/dist/{click-outside-container-DE4e7p1p.js → click-outside-container-CL_FkgGY.js} +7 -12
- package/dist/{clike-CxAz4p9E.js → clike-DYfRWWXk.js} +1 -1
- package/dist/{clike-Cg_DBrJ0.js → clike-bzZTreP4.js} +1 -1
- package/dist/clojure-ATksAecl.js +4 -0
- package/dist/{clone-Dk4FkKH0.js → clone-Msbhmn2a.js} +1 -1
- package/dist/cmake-CWylaz2C.js +4 -0
- package/dist/cobol-BiLLCZIQ.js +4 -0
- package/dist/coffeescript-Ca4jipi8.js +4 -0
- package/dist/commonlisp-BwFjyEC7.js +4 -0
- package/dist/{constants-Cjd_3kwd.js → constants-BCOEQoEQ.js} +3 -3
- package/dist/{copy-C5RFg7ok.js → copy-BkZ8PkBM.js} +6 -2
- package/dist/{cose-bilkent-S5V4N54A-B3iOTGu5.js → cose-bilkent-S5V4N54A-BZnbwyVD.js} +20 -20
- package/dist/crystal-BhUsQHbh.js +4 -0
- package/dist/css-Cf4wlIyV.js +5 -0
- package/dist/cypher-Dj8Hzgxa.js +4 -0
- package/dist/{cytoscape.esm-DTDV0Nbj.js → cytoscape.esm-BTpRoPd2.js} +586 -661
- package/dist/d-DZI7tbTy.js +4 -0
- package/dist/{dagre-5GWH7T2D-KM4Z11yT.js → dagre-5GWH7T2D-BGaiSZZO.js} +32 -37
- package/dist/{dagre-B0u1urxE.js → dagre-pyfDIOWJ.js} +57 -76
- package/dist/data-grid-overlay-editor-867aBz0Y.js +133 -0
- package/dist/{diagram-N5W7TBWH-CtO7az4G.js → diagram-N5W7TBWH-CzLE0jZB.js} +35 -51
- package/dist/diagram-QEK2KX5R-AGS60xEZ.js +245 -0
- package/dist/{diagram-S2PKOQOG-CiXElLNQ.js → diagram-S2PKOQOG-BxRoG6yW.js} +28 -28
- package/dist/diff-WQISUHG5.js +4 -0
- package/dist/{dist-CdE2C2In.js → dist-2Ne-33Xy.js} +15 -20
- package/dist/{dist-DKFaZRVk.js → dist-B0YD1aXi.js} +2 -2
- package/dist/{dist-DBhzmFyH.js → dist-B1Dv8Sdk.js} +3 -3
- package/dist/{dist-CGIZPq3J.js → dist-BFkr6kAQ.js} +2 -2
- package/dist/{dist-DL_ci7Yc.js → dist-BL2DSY0P.js} +1 -1
- package/dist/dist-BawZu0ix.js +10 -0
- package/dist/{dist-Bar1QnNM.js → dist-BhVFggab.js} +3 -3
- package/dist/{textile-Cy55fYGC.js → dist-BiOF7987.js} +4 -2
- package/dist/{dist-BQmQQqFH.js → dist-BpzZrRd6.js} +1 -1
- package/dist/{dist-CxD5E6Sh.js → dist-C7zhQ7K0.js} +24 -22
- package/dist/{dist-BqgkUnEN.js → dist-CBhnQKQ4.js} +3 -3
- package/dist/{dist-Dzk1C8l5.js → dist-CId4IPXu.js} +10 -13
- package/dist/{dist-CUnh_3Ii.js → dist-CYhQCVru.js} +2 -2
- package/dist/{dist-BBlFk9ki.js → dist-CZq5-ZyD.js} +1 -1
- package/dist/{dist-elblfNXO.js → dist-Cacac5HV.js} +2 -2
- package/dist/{dist-CChOkSUg.js → dist-CfQHSIQC.js} +3 -3
- package/dist/{dist-JCAky9ND.js → dist-CkvGMBAS.js} +17 -22
- package/dist/dist-Cs3McXEj.js +6 -0
- package/dist/{dist-o7fhJC7U.js → dist-CvyfRaIr.js} +3 -3
- package/dist/{dist-CZfRM7pE.js → dist-D-3fICwh.js} +2 -2
- package/dist/dist-D3aaithT.js +6 -0
- package/dist/{dist-CutXTm8t.js → dist-DBhEu3-F.js} +1 -1
- package/dist/dist-DELcMSpJ.js +6 -0
- package/dist/{dist-C7ASiFxI.js → dist-DMxl6Qbu.js} +273 -263
- package/dist/{dist-CLvpViod.js → dist-DS6nuHYK.js} +2 -3
- package/dist/dist-Dgts3WXd.js +6 -0
- package/dist/{dist--I6Htnlv.js → dist-DlHkZUnY.js} +5 -5
- package/dist/dist-Doiq_KIP.js +15 -0
- package/dist/dist-DtpUiDG_.js +6 -0
- package/dist/{dist-DzOpMdwb.js → dist-NUdHX0XE.js} +4 -4
- package/dist/{dist-C3WYsf4K.js → dist-PGgOcwbF.js} +4 -10
- package/dist/{dist-DNnYAdRE.js → dist-RdxOJbBw.js} +2 -2
- package/dist/{dist-BEvIw5Nh.js → dist-RwqAqkpG.js} +1 -1
- package/dist/dist-ZjnJq_jD.js +10 -0
- package/dist/{dist-CbRkrKrP.js → dist-biZ846D9.js} +5 -5
- package/dist/{dist-DW9er3Zq.js → dist-d5NxvX2s.js} +44 -23
- package/dist/{dist-C3QUag__.js → dist-ivwkJchV.js} +3 -3
- package/dist/dist-mof3iuBu.js +12 -0
- package/dist/{dist-Cib4sGDA.js → dist-reo2kYlN.js} +2 -2
- package/dist/{dist-BZBitvuL.js → dist-wHVprCkn.js} +1 -1
- package/dist/{dist-C5zMs_n5.js → dist-y8uoXYaE.js} +3 -3
- package/dist/{dist-DPF5TTUg.js → dist-z_iuDES7.js} +126 -115
- package/dist/{dockerfile-Dum_1b-5.js → dockerfile-sZMPcXVY.js} +1 -1
- package/dist/dtd-B2M8dhfC.js +4 -0
- package/dist/dylan-CU3Vt8SC.js +4 -0
- package/dist/ecl-B8ESAVq4.js +4 -0
- package/dist/eiffel-DDfMIKeA.js +4 -0
- package/dist/elm-Bj6rj8jf.js +4 -0
- package/dist/{erDiagram-AWTI2OKA-ZTIl9iQO.js → erDiagram-AWTI2OKA-CTxzb-U8.js} +20 -20
- package/dist/erlang-BxyshZUq.js +4 -0
- package/dist/{error-banner-OQIGTqFR.js → error-banner-npbEfanI.js} +13 -13
- package/dist/{esm-DxFkg7a6.js → esm-BdiY4QsX.js} +1528 -1492
- package/dist/{esm-d0g2RsOH.js → esm-CAWW9sum.js} +6 -8
- package/dist/{esm-1_Mp6VD2.js → esm-YY5zh7KV.js} +324 -395
- package/dist/{esm-BO9n_s6u.js → esm-svAVli9f.js} +5 -5
- package/dist/{factor-CdgiDGiu.js → factor-CRFTmP_a.js} +1 -1
- package/dist/factor-CYk6XT8r.js +5 -0
- package/dist/{flowDiagram-PVAE7QVJ-DsbofOzu.js → flowDiagram-PVAE7QVJ-Dck2hiJe.js} +22 -22
- package/dist/{formats-ChrNdVdJ.js → formats-BnqXUb1V.js} +13 -17
- package/dist/forth-fcoJkd-f.js +4 -0
- package/dist/fortran-IxZHu4wc.js +4 -0
- package/dist/{fullscreen-D1yTiBlu.js → fullscreen-blsKUrtN.js} +741 -744
- package/dist/{ganttDiagram-OWAHRB6G-FnCH1Yj3.js → ganttDiagram-OWAHRB6G-AWzfzpup.js} +9 -9
- package/dist/gas-B8rmKcim.js +4 -0
- package/dist/gherkin-BTm-jIdJ.js +4 -0
- package/dist/gitGraph-ZV4HHKMB-DFg_OLQb.js +21 -0
- package/dist/{gitGraphDiagram-NY62KEGX-B0wvMNqU.js → gitGraphDiagram-NY62KEGX-GyNboWSV.js} +31 -34
- package/dist/{glide-data-editor-D_kEsT07.js → glide-data-editor-DHuN8kQ8.js} +1650 -1720
- package/dist/{graphlib-BGmr7CYF.js → graphlib-hb3zmtVD.js} +5 -5
- package/dist/groovy-01kRHFMD.js +4 -0
- package/dist/haskell-B3PhE05w.js +4 -0
- package/dist/haxe-DEoAm8oA.js +5 -0
- package/dist/{hotkeys-yFrUwyJK.js → hotkeys-Ct2T3e9O.js} +4 -7
- package/dist/idl-DsDJU9cV.js +4 -0
- package/dist/info-63CPKGFF-D3DZmDBa.js +21 -0
- package/dist/infoDiagram-STP46IZ2-ec08vi_U.js +44 -0
- package/dist/{isArrayLikeObject-DiDsNamC.js → isArrayLikeObject-BlvK28do.js} +3 -5
- package/dist/{isEmpty-BBG-u1GM.js → isEmpty--odfYjh1.js} +2 -2
- package/dist/{isSymbol-BxF-_8BA.js → isSymbol-Cb1f2HgO.js} +1 -1
- package/dist/{javascript-Dfq1qI35.js → javascript-BfCTmOnk.js} +2 -2
- package/dist/javascript-gwczVhuU.js +5 -0
- package/dist/jinja2-AkZRdFk3.js +4 -0
- package/dist/{journeyDiagram-BIP6EPQ6-B3PotfAW.js → journeyDiagram-BIP6EPQ6-TmXYCUbT.js} +23 -24
- package/dist/julia-_s6qe3bf.js +4 -0
- package/dist/{kanban-definition-6OIFK2YF-BTrQZ3LN.js → kanban-definition-6OIFK2YF-B6ozleHo.js} +15 -15
- package/dist/{katex-dN__NFdn.js → katex-mPzRsXEy.js} +1 -1
- package/dist/{katex-BE4xflfm.js → katex-mkWmhPUh.js} +149 -173
- package/dist/{label-BinTsX-u.js → label-VVRKZmrP.js} +21 -24
- package/dist/{linear-DyTdUIqX.js → linear-iebAbJVD.js} +1 -1
- package/dist/livescript-CwPHQdv5.js +4 -0
- package/dist/{loader-Dijti3y4.js → loader-CM0VALo9.js} +19 -26
- package/dist/lua-s7nRxkCP.js +4 -0
- package/dist/main.js +8161 -8431
- package/dist/{marked.esm-3RjvXPoO.js → marked.esm-DJM8la36.js} +5 -5
- package/dist/mathematica-Ci36yd1q.js +4 -0
- package/dist/mbox-DbOYMNCO.js +4 -0
- package/dist/{memoize-Dq87l1O_.js → memoize-DYoRBSLn.js} +1 -1
- package/dist/{merge-BPDCIm8P.js → merge-BjuR6j_w.js} +1 -1
- package/dist/{mermaid-MWiyXDcI.js → mermaid-YPPMBmhk.js} +58 -76
- package/dist/{mermaid-parser.core-CSFx6MQ7.js → mermaid-parser.core-BLkyTSZj.js} +8 -8
- package/dist/{mhchem-DZ68WS0G.js → mhchem-Dw7wvXtr.js} +1 -1
- package/dist/{min-BzhKOmZo.js → min-B_i2ahn4.js} +7 -7
- package/dist/{mindmap-definition-Q6HEUPPD-9hhnrO1k.js → mindmap-definition-Q6HEUPPD-F6-JnXwq.js} +17 -17
- package/dist/mirc-VmNe8AwF.js +4 -0
- package/dist/mllike-BdD7SJEa.js +6 -0
- package/dist/modelica-BA4VqzC3.js +4 -0
- package/dist/mscgen-DF-5WHJm.js +6 -0
- package/dist/mumps-c_Uia_QN.js +4 -0
- package/dist/{node-sql-parser-13oju30e.js → node-sql-parser-BqKV-TpL.js} +14343 -14351
- package/dist/{now-DVBcRCoE.js → now-CwRqw0nS.js} +1 -1
- package/dist/nsis-BAANGODV.js +5 -0
- package/dist/{nsis-BW6_XagK.js → nsis-BWJEeUyS.js} +1 -1
- package/dist/ntriples-Bslqh2Ki.js +4 -0
- package/dist/{number-overlay-editor-D1YdiOrm.js → number-overlay-editor-CeyruAX4.js} +17 -23
- package/dist/octave-DYn5ltia.js +4 -0
- package/dist/oz-B_N-StZq.js +4 -0
- package/dist/packet-HUATNLJX-CkqjFdAv.js +21 -0
- package/dist/pascal-DU4CtAUu.js +4 -0
- package/dist/perl-Bae6k32u.js +4 -0
- package/dist/pie-WTHONI2E-D0rWwX5P.js +21 -0
- package/dist/{pieDiagram-ADFJNKIX-CSBC0ZgF.js → pieDiagram-ADFJNKIX-C5dSQVCn.js} +28 -28
- package/dist/pig-DSIxUEgX.js +4 -0
- package/dist/powershell-31lcPgIF.js +4 -0
- package/dist/powershell-BZx53Ujw.js +236 -0
- package/dist/properties-lmYbntDG.js +4 -0
- package/dist/protobuf-BTYoCEpV.js +4 -0
- package/dist/pug-DMFM7zzO.js +5 -0
- package/dist/{pug-Bmups_z0.js → pug-PJh82u1M.js} +1 -1
- package/dist/puppet-B0ub07d-.js +4 -0
- package/dist/python-C4jT87Nt.js +5 -0
- package/dist/{q-BzWcnVri.js → q-CMoUHJ5Q.js} +3 -2
- package/dist/q-YbPYlqRI.js +4 -0
- package/dist/{quadrantDiagram-LMRXKWRM-h7nHf8xG.js → quadrantDiagram-LMRXKWRM-DlahxNiy.js} +7 -7
- package/dist/r-OfNu6HAI.js +4 -0
- package/dist/radar-NJJJXTRR-Bxqv4O5a.js +21 -0
- package/dist/{range-CgK0-PEw.js → range-DxfkexCE.js} +3 -3
- package/dist/{react-plotly-BZakcxdv.js → react-plotly-D_IAfR8f.js} +4364 -4705
- package/dist/{requirementDiagram-4UW4RH46-BGEurQYq.js → requirementDiagram-4UW4RH46-DTkinyvU.js} +17 -17
- package/dist/rpm-D_3b5peD.js +5 -0
- package/dist/ruby-CehsJy_T.js +4 -0
- package/dist/{sankeyDiagram-GR3RE2ED-CxeJ_jfl.js → sankeyDiagram-GR3RE2ED-CsLnEnnq.js} +3 -3
- package/dist/sas-DwQHzPoF.js +4 -0
- package/dist/scheme-B6ArxiQu.js +4 -0
- package/dist/{sequenceDiagram-C3RYC4MD-CbFxwyr_.js → sequenceDiagram-C3RYC4MD-BdEOR6SC.js} +20 -30
- package/dist/shell-AHmQgDfc.js +4 -0
- package/dist/sieve-CgodKOcx.js +4 -0
- package/dist/{simple-mode-Cgyya8F-.js → simple-mode-BP3Jd4vf.js} +1 -1
- package/dist/{slides-component-BEyG25AH.js → slides-component-2bbal1YJ.js} +24 -46
- package/dist/smalltalk-BeFzDkbo.js +4 -0
- package/dist/sparql-BWxq-Lnx.js +4 -0
- package/dist/{src-BNNJRxz3.js → src-DZkaBUmt.js} +6 -6
- package/dist/{stateDiagram-KXAO66HF-A61bMf29.js → stateDiagram-KXAO66HF-DQLH2jhP.js} +39 -41
- package/dist/stateDiagram-v2-UMBNRL4Z-D9v8fKjF.js +38 -0
- package/dist/stex-Dvaq0qsm.js +5 -0
- package/dist/style.css +1 -1
- package/dist/stylus-Ge0ofWlZ.js +4 -0
- package/dist/swift-CjQfbVxV.js +4 -0
- package/dist/tcl-CAGDF11K.js +4 -0
- package/dist/textile-CrXreJtf.js +4 -0
- package/dist/{time-D3tzCqJ6.js → time-CFkXkVrt.js} +1 -1
- package/dist/{timeline-definition-XQNQX7LJ-BwdsB7CR.js → timeline-definition-XQNQX7LJ-bToVq14i.js} +4 -5
- package/dist/{timer-D3Zlu9ow.js → timer-CzOhIJuk.js} +2 -2
- package/dist/{toNumber-efKT08hh.js → toNumber-EFF1Z9T1.js} +2 -2
- package/dist/{toString-BvCd3yJc.js → toString-C2mCkasT.js} +2 -2
- package/dist/toml-AdLXKwEi.js +4 -0
- package/dist/{toml-CIUkU1CP.js → toml-eSl4PUAH.js} +6 -2
- package/dist/treemap-75Q7IDZK-Da9Jv6a_.js +21 -0
- package/dist/troff-C-LaM2ex.js +4 -0
- package/dist/ttcn-DTclUi6T.js +4 -0
- package/dist/ttcn-cfg-BtBPbmLX.js +4 -0
- package/dist/turtle-BODDDg5O.js +4 -0
- package/dist/{types-1X1uZB4y.js → types-CRXV0KD5.js} +84 -95
- package/dist/{useAsyncData-C4IqQK0g.js → useAsyncData-uMVTsDI9.js} +1 -1
- package/dist/{useDateFormatter-BCsBqetx.js → useDateFormatter-Dcz7jstn.js} +6 -6
- package/dist/{useTheme-C2pgJzDH.js → useTheme-NbEx-ZNV.js} +13 -10
- package/dist/vb-Cb1HQHii.js +4 -0
- package/dist/vbscript-CpXOP4wZ.js +4 -0
- package/dist/{vega-component-Cv4J8CHz.js → vega-component-hegVmfuS.js} +21 -21
- package/dist/{vega-loader.browser.module-Bi3ttvdj.js → vega-loader.browser.module-DcW8jnKp.js} +1 -2
- package/dist/velocity-Dz0rBQIk.js +4 -0
- package/dist/verilog-6Di9aLKw.js +4 -0
- package/dist/vhdl-BRNesXYc.js +4 -0
- package/dist/webidl-BpRNYIYn.js +4 -0
- package/dist/xquery-DXWcJ7b6.js +4 -0
- package/dist/{xychartDiagram-6GGTOJPD-BJRRi5HC.js → xychartDiagram-6GGTOJPD-C7Bhm_yt.js} +12 -13
- package/dist/yacas-DbSARPz4.js +4 -0
- package/dist/z80-DzslPj_l.js +4 -0
- package/dist/{zod-UPQf9SGn.js → zod-ChY6miG5.js} +71 -81
- package/package.json +12 -12
- package/src/__mocks__/requests.ts +2 -0
- package/src/components/app-config/user-config-form.tsx +29 -25
- package/src/components/chat/chat-utils.ts +11 -4
- package/src/components/data-table/__tests__/header-items.test.tsx +117 -0
- package/src/components/data-table/column-header.tsx +4 -2
- package/src/components/data-table/columns.tsx +2 -1
- package/src/components/data-table/data-table.tsx +7 -2
- package/src/components/data-table/header-items.tsx +63 -10
- package/src/components/dependency-graph/custom-node.tsx +11 -11
- package/src/components/dependency-graph/elements.ts +9 -4
- package/src/components/dependency-graph/panels.tsx +6 -4
- package/src/components/editor/Output.tsx +6 -1
- package/src/components/editor/ai/ai-completion-editor.tsx +135 -5
- package/src/components/editor/ai/completion-handlers.tsx +106 -22
- package/src/components/editor/cell/code/cell-editor.tsx +5 -0
- package/src/components/editor/chrome/panels/cache-panel.tsx +216 -0
- package/src/components/editor/chrome/panels/empty-state.tsx +3 -1
- package/src/components/editor/chrome/types.ts +66 -22
- package/src/components/editor/chrome/wrapper/app-chrome.tsx +2 -0
- package/src/components/editor/errors/auto-fix.tsx +138 -32
- package/src/components/editor/errors/fix-mode.ts +15 -0
- package/src/components/editor/navigation/__tests__/clipboard.test.ts +0 -5
- package/src/components/editor/navigation/clipboard.ts +2 -1
- package/src/components/editor/notebook-cell.tsx +20 -7
- package/src/components/editor/output/ConsoleOutput.tsx +27 -33
- package/src/components/editor/output/JsonOutput.tsx +9 -0
- package/src/components/editor/output/MarimoTracebackOutput.tsx +10 -7
- package/src/components/editor/output/__tests__/json-output.test.ts +43 -0
- package/src/components/editor/package-alert.tsx +3 -0
- package/src/components/forms/__tests__/form-utils.test.ts +4 -2
- package/src/components/icons/copy-icon.tsx +11 -5
- package/src/components/shortcuts/renderShortcut.tsx +3 -1
- package/src/components/ui/button.tsx +2 -0
- package/src/components/ui/confirmation-button.tsx +85 -0
- package/src/components/ui/switch.tsx +2 -0
- package/src/core/ai/context/providers/__tests__/datasource.test.ts +9 -1
- package/src/core/ai/context/providers/datasource.ts +25 -1
- package/src/core/ai/state.ts +6 -3
- package/src/core/ai/tools/__tests__/registry.test.ts +33 -8
- package/src/core/ai/tools/base.ts +81 -1
- package/src/core/ai/tools/registry.ts +36 -10
- package/src/core/ai/tools/sample-tool.ts +44 -8
- package/src/core/cache/requests.ts +5 -0
- package/src/core/cells/cells.ts +1 -1
- package/src/core/codemirror/__tests__/__snapshots__/setup.test.ts.snap +2 -0
- package/src/core/codemirror/__tests__/replace-editor-content.test.ts +336 -0
- package/src/core/codemirror/find-replace/navigate.ts +2 -2
- package/src/core/codemirror/format.ts +2 -9
- package/src/core/codemirror/language/__tests__/sql.test.ts +24 -6
- package/src/core/codemirror/language/languages/python.ts +1 -3
- package/src/core/codemirror/language/languages/sql/sql.ts +23 -13
- package/src/core/codemirror/language/panel/panel.tsx +1 -6
- package/src/core/codemirror/language/utils.ts +3 -8
- package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +21 -14
- package/src/core/codemirror/lsp/federated-lsp.ts +20 -9
- package/src/core/codemirror/lsp/notebook-lsp.ts +35 -29
- package/src/core/codemirror/lsp/types.ts +0 -13
- package/src/core/codemirror/replace-editor-content.ts +87 -0
- package/src/core/config/__tests__/config-schema.test.ts +3 -0
- package/src/core/config/config-schema.ts +8 -0
- package/src/core/config/feature-flag.tsx +2 -4
- package/src/core/errors/__tests__/errors.test.ts +1 -0
- package/src/core/errors/errors.ts +20 -6
- package/src/core/islands/bridge.ts +2 -0
- package/src/core/islands/main.ts +4 -0
- package/src/core/kernel/messages.ts +1 -0
- package/src/core/network/requests-network.ts +14 -0
- package/src/core/network/requests-static.ts +2 -0
- package/src/core/network/requests-toasting.ts +2 -0
- package/src/core/network/types.ts +5 -0
- package/src/core/saving/save-component.tsx +43 -36
- package/src/core/wasm/bridge.ts +2 -0
- package/src/core/websocket/useMarimoWebSocket.tsx +8 -0
- package/src/css/app/codemirror-completions.css +1 -1
- package/src/custom.d.ts +2 -0
- package/src/plugins/core/registerReactComponent.tsx +5 -1
- package/src/plugins/impl/DataTablePlugin.tsx +19 -19
- package/src/plugins/impl/__tests__/DateTimePickerPlugin.test.tsx +32 -0
- package/src/plugins/impl/chat/ChatPlugin.tsx +1 -1
- package/src/plugins/impl/chat/chat-ui.tsx +17 -2
- package/src/plugins/impl/chat/types.ts +1 -1
- package/src/plugins/impl/data-frames/DataFramePlugin.tsx +7 -2
- package/src/plugins/impl/plotly/__tests__/parse-from-template.test.ts +17 -0
- package/src/plugins/impl/plotly/parse-from-template.ts +2 -1
- package/src/utils/__tests__/formatting.test.ts +107 -0
- package/src/utils/__tests__/json-parser.test.ts +13 -0
- package/src/utils/copy.ts +6 -0
- package/src/utils/formatting.ts +51 -0
- package/src/utils/json/json-parser.ts +28 -3
- package/dist/any-language-editor-CVFQlioK.js +0 -156
- package/dist/apl-ChlaBfxB.js +0 -4
- package/dist/architecture-O4VJ6CD3-BVeaxUcM.js +0 -21
- package/dist/asciiarmor-CcJmm3l_.js +0 -4
- package/dist/asn1-ThRYxoBE.js +0 -4
- package/dist/assets/__vite-browser-external-Dv_SHu1h.js +0 -1
- package/dist/assets/worker-DVOR9oZG.js +0 -54
- package/dist/brainfuck-CEM0JgDn.js +0 -4
- package/dist/chunk-EXTU4WIE-DECT9AAK.js +0 -14
- package/dist/chunk-S3R3BYOJ-DMQ1yeyq.js +0 -386
- package/dist/classDiagram-KNZD7YFC-BG53O6Jt.js +0 -39
- package/dist/classDiagram-v2-RKCZMP56-BmKILsGU.js +0 -39
- package/dist/clojure-B7RHyE9t.js +0 -4
- package/dist/cmake-TeTMP4I5.js +0 -4
- package/dist/cobol-DI-mxUER.js +0 -4
- package/dist/coffeescript-DHUFLqWp.js +0 -4
- package/dist/commonlisp-SLiUrh1m.js +0 -4
- package/dist/crystal-B4fY1ZfJ.js +0 -4
- package/dist/css-Bdoq3TzK.js +0 -5
- package/dist/cypher-CBU182fp.js +0 -4
- package/dist/d-D8myDZeH.js +0 -4
- package/dist/data-grid-overlay-editor-qNmJk2x0.js +0 -135
- package/dist/diagram-QEK2KX5R-fu8Noi3H.js +0 -245
- package/dist/diff-DJF_UB7H.js +0 -4
- package/dist/dist-52-_pKoy.js +0 -6
- package/dist/dist-6DOMStFn.js +0 -6
- package/dist/dist-B334aW7p.js +0 -10
- package/dist/dist-BOI9lUz-.js +0 -12
- package/dist/dist-C06uhBzF.js +0 -6
- package/dist/dist-CGkpguCB.js +0 -6
- package/dist/dist-CrApzUED.js +0 -6
- package/dist/dist-Dp2GLdCl.js +0 -14
- package/dist/dist-WHFsbMDr.js +0 -6
- package/dist/dist-hyKcTPG9.js +0 -10
- package/dist/dtd-DY8q65lC.js +0 -4
- package/dist/dylan-CBLcjWCi.js +0 -4
- package/dist/ecl-BSXPNfOw.js +0 -4
- package/dist/eiffel-BJf0PQX-.js +0 -4
- package/dist/elm-DWQwPCZS.js +0 -4
- package/dist/erlang-BWBaGZ5e.js +0 -4
- package/dist/factor-DT1-MBPl.js +0 -5
- package/dist/forth-D9GDt3FB.js +0 -4
- package/dist/fortran-DHkRhDWw.js +0 -4
- package/dist/gas-7lQEOM0H.js +0 -4
- package/dist/gherkin-BLLyroYi.js +0 -4
- package/dist/gitGraph-ZV4HHKMB-z2v_cInC.js +0 -21
- package/dist/groovy-C-wabwj0.js +0 -4
- package/dist/haskell-DaxVQ_d1.js +0 -4
- package/dist/haxe-C2yLoC7h.js +0 -5
- package/dist/idl-DQBP8i7k.js +0 -4
- package/dist/info-63CPKGFF-GS4w6pCB.js +0 -21
- package/dist/infoDiagram-STP46IZ2-DE9YYPFg.js +0 -44
- package/dist/javascript-DRwFV9r5.js +0 -5
- package/dist/jinja2-CNoIpVmN.js +0 -4
- package/dist/julia-DXDf-GhP.js +0 -4
- package/dist/livescript-S2uhJQx7.js +0 -4
- package/dist/lua-Bvgs0y2G.js +0 -4
- package/dist/mathematica-D2zqfwIg.js +0 -4
- package/dist/mbox-SBcPaDuZ.js +0 -4
- package/dist/mirc-hkQc7sVF.js +0 -4
- package/dist/mllike-DRWPBlr9.js +0 -6
- package/dist/modelica-CO2ROGlP.js +0 -4
- package/dist/mscgen-BpX61bO6.js +0 -6
- package/dist/mumps-BCnFeIn6.js +0 -4
- package/dist/nsis-BaTOxlD1.js +0 -5
- package/dist/ntriples-zEo5BWjr.js +0 -4
- package/dist/octave-BE0RnCM9.js +0 -4
- package/dist/oz-C4_2Ttul.js +0 -4
- package/dist/packet-HUATNLJX-CjHqJIqk.js +0 -21
- package/dist/pascal-Q3jJucpw.js +0 -4
- package/dist/perl-DkXZIWHF.js +0 -4
- package/dist/pie-WTHONI2E-D67gLWtR.js +0 -21
- package/dist/pig-DCgEHdsu.js +0 -4
- package/dist/powershell-3rK_nRRJ.js +0 -236
- package/dist/powershell-Eo2-7MoM.js +0 -4
- package/dist/properties-C0IOX8WR.js +0 -4
- package/dist/protobuf--lGQUSRO.js +0 -4
- package/dist/pug-Cf8AQHMJ.js +0 -5
- package/dist/puppet-D7Z3dTJn.js +0 -4
- package/dist/python-FHIx_i8Y.js +0 -5
- package/dist/q-B7UA1feM.js +0 -4
- package/dist/r-Cc9R2A7N.js +0 -4
- package/dist/radar-NJJJXTRR-C-AZP_Te.js +0 -21
- package/dist/rpm-vhJNlrQ6.js +0 -5
- package/dist/ruby-CVluPY0M.js +0 -4
- package/dist/sas-A8DL8oy3.js +0 -4
- package/dist/scheme-6xHHcSXC.js +0 -4
- package/dist/shell-DHN-e5rf.js +0 -4
- package/dist/sieve-BuQwLY02.js +0 -4
- package/dist/smalltalk-BA4HPg2H.js +0 -4
- package/dist/sparql-Bf4yCuy3.js +0 -4
- package/dist/stateDiagram-v2-UMBNRL4Z-C_0FUzzk.js +0 -38
- package/dist/stex-D-I1cYeE.js +0 -5
- package/dist/stylus-BMeped2l.js +0 -4
- package/dist/swift-lwEdlZoC.js +0 -4
- package/dist/tcl-B03ipeqv.js +0 -4
- package/dist/toml-BLgrVtfu.js +0 -4
- package/dist/treemap-75Q7IDZK-DTvwfpWt.js +0 -21
- package/dist/troff-g6EjN2O2.js +0 -4
- package/dist/ttcn-Dzvba8jK.js +0 -4
- package/dist/ttcn-cfg-CadG0p1K.js +0 -4
- package/dist/turtle-DkXAMWo9.js +0 -4
- package/dist/vb-C5dCiel8.js +0 -4
- package/dist/vbscript-I4bDEQln.js +0 -4
- package/dist/velocity-mt0fDwFH.js +0 -4
- package/dist/verilog-Dxq3KJkc.js +0 -4
- package/dist/vhdl-Km0QUlV-.js +0 -4
- package/dist/webidl-B3lJ2MRL.js +0 -4
- package/dist/xquery-CcIxNPEe.js +0 -4
- package/dist/yacas-oMa-f-tN.js +0 -4
- package/dist/z80-D03Nvn6l.js +0 -4
- /package/dist/{apl-DZqo8Elt.js → apl-CEHentF4.js} +0 -0
- /package/dist/{asciiarmor-DTzHAIeX.js → asciiarmor-DURYiCS0.js} +0 -0
- /package/dist/{asn1-DrAXKsZH.js → asn1-ETAiEoXY.js} +0 -0
- /package/dist/{asterisk-oF4U3h48.js → asterisk-DTpbbXPb.js} +0 -0
- /package/dist/{brainfuck-BYgLey30.js → brainfuck-BWQep-SA.js} +0 -0
- /package/dist/{clojure-Bs2M3OUY.js → clojure-BzFapDkA.js} +0 -0
- /package/dist/{cmake-DpI8vxJN.js → cmake-DvlbIC8x.js} +0 -0
- /package/dist/{cobol-BQyrWo72.js → cobol-BrEI4cPR.js} +0 -0
- /package/dist/{coffeescript-9ke9UHmw.js → coffeescript-B6cvu8mO.js} +0 -0
- /package/dist/{common-keywords-BzgeAvH1.js → common-keywords-WqQm7W8t.js} +0 -0
- /package/dist/{commonlisp-DghUdrUH.js → commonlisp-BIT8PQqi.js} +0 -0
- /package/dist/{crystal-DEf_SInh.js → crystal-B_UcPArT.js} +0 -0
- /package/dist/{css-BzTU9lNO.js → css-dHbnt_zl.js} +0 -0
- /package/dist/{cypher-a2v0c11S.js → cypher-Dh3FOpL7.js} +0 -0
- /package/dist/{d-SAswny-M.js → d-CQD1IHee.js} +0 -0
- /package/dist/{diff-OJ-xLXcG.js → diff-CpF_IDx0.js} +0 -0
- /package/dist/{dtd-BsUf-rer.js → dtd-DYoNpy6c.js} +0 -0
- /package/dist/{duckdb-keywords-B0NOra5o.js → duckdb-keywords-CdIsl9L0.js} +0 -0
- /package/dist/{dylan-C0ZYngjn.js → dylan-Bc_2G1E-.js} +0 -0
- /package/dist/{ebnf-DF1xx0b_.js → ebnf-jGVT_YpN.js} +0 -0
- /package/dist/{ecl-Bsuvoouq.js → ecl-UIU-P-Ar.js} +0 -0
- /package/dist/{eiffel-DgfSpLi-.js → eiffel-C90Oyuix.js} +0 -0
- /package/dist/{elm-GNxDj-5E.js → elm-B9fWSySj.js} +0 -0
- /package/dist/{erlang-Ds3uY1kL.js → erlang-Ccff0UAn.js} +0 -0
- /package/dist/{fcl-CqBgSioc.js → fcl-CGR8NxAg.js} +0 -0
- /package/dist/{forth-JCaLysGk.js → forth-U1ROGcBY.js} +0 -0
- /package/dist/{fortran-Dc2AoKAl.js → fortran-3nOkjDmc.js} +0 -0
- /package/dist/{gas-Q4Uz82YW.js → gas-B_4H5FzV.js} +0 -0
- /package/dist/{gherkin-Dpxe49sQ.js → gherkin-B0eru5Uz.js} +0 -0
- /package/dist/{groovy-D8mTRCu6.js → groovy-dqjtZUVf.js} +0 -0
- /package/dist/{haskell-2_8cC4wY.js → haskell-DFzCCQzo.js} +0 -0
- /package/dist/{haxe-Bl9zkZlz.js → haxe-Da8Pj5RT.js} +0 -0
- /package/dist/{http-DKCqY6yS.js → http-1HACL_9s.js} +0 -0
- /package/dist/{idl-Dn-HNfGW.js → idl-D3NXs5iM.js} +0 -0
- /package/dist/{jinja2-JjFiAGKk.js → jinja2-gBHAxUdF.js} +0 -0
- /package/dist/{julia-R5wne8eu.js → julia-bG-6nJ-_.js} +0 -0
- /package/dist/{livescript-DSwokrYj.js → livescript-BlsRC8UJ.js} +0 -0
- /package/dist/{lua-CgXfrp2-.js → lua-BbDC0_5w.js} +0 -0
- /package/dist/{mathematica-BVli92MR.js → mathematica-YZTe3-PF.js} +0 -0
- /package/dist/{mbox-CMFlocdS.js → mbox-CY5idp08.js} +0 -0
- /package/dist/{mirc-BkW04Zpc.js → mirc-CbQuFZKk.js} +0 -0
- /package/dist/{mllike-DEjvHvNV.js → mllike-DsbHMX-5.js} +0 -0
- /package/dist/{modelica-CxDn-oje.js → modelica-CQuvsOQk.js} +0 -0
- /package/dist/{mscgen-D78wmE-w.js → mscgen-LIpBP9VR.js} +0 -0
- /package/dist/{mumps-Bi0IvPOV.js → mumps-Ct5NXoaG.js} +0 -0
- /package/dist/{nginx-DErPZFhX.js → nginx-Dvc62C8z.js} +0 -0
- /package/dist/{ntriples-Btyp6wRL.js → ntriples-jVkxWUuv.js} +0 -0
- /package/dist/{octave-CZA6-2F8.js → octave-jGOImUB0.js} +0 -0
- /package/dist/{oz-Bm6LSNfE.js → oz-Y0FKDMS2.js} +0 -0
- /package/dist/{pascal-B4J6a9BH.js → pascal-BaLtPWWB.js} +0 -0
- /package/dist/{perl-CzVqxS08.js → perl-CjfE0JLo.js} +0 -0
- /package/dist/{pig-Clh03cnn.js → pig-DE4epV99.js} +0 -0
- /package/dist/{properties-D7ch1Wyb.js → properties-CLyCG5C-.js} +0 -0
- /package/dist/{protobuf-DrkdrMPK.js → protobuf-BjBBs_V4.js} +0 -0
- /package/dist/{puppet-BtZG8zdO.js → puppet-ZImLuomA.js} +0 -0
- /package/dist/{python-B6FKOVIv.js → python-C9YN71pR.js} +0 -0
- /package/dist/{r-Dnvo5-96.js → r-DILmKWWW.js} +0 -0
- /package/dist/{rpm-B1DrgfnX.js → rpm-fpIsm1Kr.js} +0 -0
- /package/dist/{ruby-CelfUg17.js → ruby-BuiQI41h.js} +0 -0
- /package/dist/{sas-DfSQFMWG.js → sas-C76sJ1zF.js} +0 -0
- /package/dist/{scheme-BplhaWuO.js → scheme-DHjM-txv.js} +0 -0
- /package/dist/{shell-DqU5OS2c.js → shell--7NmGJ9p.js} +0 -0
- /package/dist/{sieve-BE4_IyGa.js → sieve-DaPvBv1M.js} +0 -0
- /package/dist/{smalltalk-B_WPL8Nx.js → smalltalk-KPvwrjCs.js} +0 -0
- /package/dist/{solr-DlJFg7H5.js → solr-PvZUtEDb.js} +0 -0
- /package/dist/{sparql-7XIlcOgW.js → sparql-CXSUIQer.js} +0 -0
- /package/dist/{spreadsheet-BdZSVwVp.js → spreadsheet-DPJdGPkx.js} +0 -0
- /package/dist/{sql-CCrq7lfJ.js → sql-Dp4ZLSIa.js} +0 -0
- /package/dist/{stex-BiFc8QAu.js → stex-CeXW4zzk.js} +0 -0
- /package/dist/{stylus-DlSH9xpH.js → stylus-BXcmrg9w.js} +0 -0
- /package/dist/{swift-e3tMTZgJ.js → swift-DD8I7hKP.js} +0 -0
- /package/dist/{tcl-DfZMC20G.js → tcl-B9Lp4GtA.js} +0 -0
- /package/dist/{textile-DaSeca5U.js → textile-qdiY0teq.js} +0 -0
- /package/dist/{tiddlywiki-dfoiz8pS.js → tiddlywiki-t32lkubq.js} +0 -0
- /package/dist/{tiki-yJbQzhma.js → tiki-B0qKrSMl.js} +0 -0
- /package/dist/{troff-FN_FrCXR.js → troff-105XJOEu.js} +0 -0
- /package/dist/{ttcn-7_i4HlyB.js → ttcn-1_BxDcM8.js} +0 -0
- /package/dist/{ttcn-cfg-B46AlBUV.js → ttcn-cfg-Cn_XgXiw.js} +0 -0
- /package/dist/{turtle-QQfeFveR.js → turtle-BI6LyfEu.js} +0 -0
- /package/dist/{vb-DToPVnLa.js → vb-BecoBfmr.js} +0 -0
- /package/dist/{vbscript-CtsNaTz4.js → vbscript-De-zpA4i.js} +0 -0
- /package/dist/{velocity-CAoNe6ns.js → velocity-DhlYJTrD.js} +0 -0
- /package/dist/{verilog-DrDOMiJq.js → verilog-BDZgxDOW.js} +0 -0
- /package/dist/{vhdl-DnO0OEPh.js → vhdl-CV0OKTbp.js} +0 -0
- /package/dist/{webidl-Or6d1ZfA.js → webidl-BOM1Fs0O.js} +0 -0
- /package/dist/{xquery-CEp_Mcpr.js → xquery-CltP_CGh.js} +0 -0
- /package/dist/{yacas-DgnYrSlp.js → yacas-Dch4E2Dg.js} +0 -0
- /package/dist/{z80-DlG_kyeB.js → z80-B5Yly27o.js} +0 -0
|
@@ -218,6 +218,49 @@ describe("getCopyValue", () => {
|
|
|
218
218
|
`,
|
|
219
219
|
);
|
|
220
220
|
});
|
|
221
|
+
|
|
222
|
+
it("should handle bigint", () => {
|
|
223
|
+
const bigint = String(BigInt(2 ** 64));
|
|
224
|
+
const value = `text/plain+bigint:${bigint}`;
|
|
225
|
+
const result = getCopyValue(value);
|
|
226
|
+
expect(result).toMatchInlineSnapshot(`"18446744073709551616"`);
|
|
227
|
+
|
|
228
|
+
const nestedBigInt = {
|
|
229
|
+
key1: bigint, // this will be just a string
|
|
230
|
+
key2: `text/plain+bigint:${bigint}`, // this will convert to number
|
|
231
|
+
key3: true,
|
|
232
|
+
};
|
|
233
|
+
const nestedResult = getCopyValue(nestedBigInt);
|
|
234
|
+
expect(nestedResult).toMatchInlineSnapshot(
|
|
235
|
+
`
|
|
236
|
+
"{
|
|
237
|
+
"key1": "18446744073709551616",
|
|
238
|
+
"key2": 18446744073709551616,
|
|
239
|
+
"key3": True
|
|
240
|
+
}"
|
|
241
|
+
`,
|
|
242
|
+
);
|
|
243
|
+
|
|
244
|
+
const bigintRaw = BigInt(2 ** 64);
|
|
245
|
+
const bigintRawResult = getCopyValue(bigintRaw);
|
|
246
|
+
expect(bigintRawResult).toMatchInlineSnapshot(`"18446744073709551616"`);
|
|
247
|
+
|
|
248
|
+
const nestedBigIntRaw = {
|
|
249
|
+
key1: bigintRaw, // raw number
|
|
250
|
+
key2: `text/plain+bigint:${bigintRaw}`,
|
|
251
|
+
key3: true,
|
|
252
|
+
};
|
|
253
|
+
const nestedBigIntRawResult = getCopyValue(nestedBigIntRaw);
|
|
254
|
+
expect(nestedBigIntRawResult).toMatchInlineSnapshot(
|
|
255
|
+
`
|
|
256
|
+
"{
|
|
257
|
+
"key1": 18446744073709551616,
|
|
258
|
+
"key2": 18446744073709551616,
|
|
259
|
+
"key3": True
|
|
260
|
+
}"
|
|
261
|
+
`,
|
|
262
|
+
);
|
|
263
|
+
});
|
|
221
264
|
});
|
|
222
265
|
|
|
223
266
|
describe("determineMaxDisplayLength", () => {
|
|
@@ -463,6 +463,7 @@ const ExtrasSelector: React.FC<ExtrasSelectorProps> = ({
|
|
|
463
463
|
<button
|
|
464
464
|
className="hover:bg-muted/50 rounded text-sm px-1 transition-colors border border-muted-foreground/30 hover:border-muted-foreground/60 min-w-0 flex-1 truncate text-left"
|
|
465
465
|
title={`Selected extras: ${selectedExtras.join(", ")}`}
|
|
466
|
+
type="button"
|
|
466
467
|
>
|
|
467
468
|
{selectedExtras.join(",")}
|
|
468
469
|
</button>
|
|
@@ -523,6 +524,7 @@ const ExtrasSelector: React.FC<ExtrasSelectorProps> = ({
|
|
|
523
524
|
!canSelectExtras && "opacity-50 cursor-not-allowed",
|
|
524
525
|
)}
|
|
525
526
|
title={canSelectExtras ? "Add extras" : "Loading extras..."}
|
|
527
|
+
type="button"
|
|
526
528
|
>
|
|
527
529
|
<PlusIcon className="w-3 h-3 shrink-0" />
|
|
528
530
|
</button>
|
|
@@ -619,6 +621,7 @@ const StreamingLogsViewer: React.FC<StreamingLogsViewerProps> = ({
|
|
|
619
621
|
<button
|
|
620
622
|
onClick={() => setIsExpanded(!isExpanded)}
|
|
621
623
|
className="flex items-center gap-2 text-sm font-medium text-muted-foreground hover:text-foreground transition-colors"
|
|
624
|
+
type="button"
|
|
622
625
|
>
|
|
623
626
|
{isExpanded ? (
|
|
624
627
|
<ChevronDownIcon className="w-4 h-4" />
|
|
@@ -189,7 +189,8 @@ describe("getDefaults", () => {
|
|
|
189
189
|
const schema = z.object({
|
|
190
190
|
map: z.map(z.string(), z.number()).default(new Map([["a", 1]])),
|
|
191
191
|
});
|
|
192
|
-
const
|
|
192
|
+
const defaults = getDefaults(schema);
|
|
193
|
+
const result = defaults as { map: Map<string, number> };
|
|
193
194
|
expect(result.map instanceof Map).toBe(true);
|
|
194
195
|
expect([...result.map.entries()]).toEqual([["a", 1]]);
|
|
195
196
|
});
|
|
@@ -198,7 +199,8 @@ describe("getDefaults", () => {
|
|
|
198
199
|
const schema = z.object({
|
|
199
200
|
set: z.set(z.string()).default(new Set(["a", "b"])),
|
|
200
201
|
});
|
|
201
|
-
const
|
|
202
|
+
const defaults = getDefaults(schema);
|
|
203
|
+
const result = defaults as { set: Set<string> };
|
|
202
204
|
expect(result.set instanceof Set).toBe(true);
|
|
203
205
|
expect([...result.set]).toEqual(["a", "b"]);
|
|
204
206
|
});
|
|
@@ -9,10 +9,11 @@ import { Tooltip } from "../ui/tooltip";
|
|
|
9
9
|
import { toast } from "../ui/use-toast";
|
|
10
10
|
|
|
11
11
|
interface Props {
|
|
12
|
-
value: string | (() => string);
|
|
12
|
+
value: string | ((event: React.MouseEvent) => string);
|
|
13
13
|
className?: string;
|
|
14
|
-
tooltip?:
|
|
14
|
+
tooltip?: React.ReactNode | false;
|
|
15
15
|
toastTitle?: string;
|
|
16
|
+
ariaLabel?: string;
|
|
16
17
|
}
|
|
17
18
|
|
|
18
19
|
export const CopyClipboardIcon: React.FC<Props> = ({
|
|
@@ -20,11 +21,12 @@ export const CopyClipboardIcon: React.FC<Props> = ({
|
|
|
20
21
|
className,
|
|
21
22
|
tooltip,
|
|
22
23
|
toastTitle,
|
|
24
|
+
ariaLabel,
|
|
23
25
|
}) => {
|
|
24
26
|
const [isCopied, setIsCopied] = useState(false);
|
|
25
27
|
|
|
26
|
-
const handleCopy = Events.stopPropagation(async () => {
|
|
27
|
-
const valueToCopy = typeof value === "function" ? value() : value;
|
|
28
|
+
const handleCopy = Events.stopPropagation(async (event: React.MouseEvent) => {
|
|
29
|
+
const valueToCopy = typeof value === "function" ? value(event) : value;
|
|
28
30
|
await copyToClipboard(valueToCopy).then(() => {
|
|
29
31
|
setIsCopied(true);
|
|
30
32
|
setTimeout(() => setIsCopied(false), 2000);
|
|
@@ -35,7 +37,11 @@ export const CopyClipboardIcon: React.FC<Props> = ({
|
|
|
35
37
|
});
|
|
36
38
|
|
|
37
39
|
const button = (
|
|
38
|
-
<button
|
|
40
|
+
<button
|
|
41
|
+
type="button"
|
|
42
|
+
onClick={handleCopy}
|
|
43
|
+
aria-label={ariaLabel ?? "Copy to clipboard"}
|
|
44
|
+
>
|
|
39
45
|
{isCopied ? (
|
|
40
46
|
<CheckIcon className={cn(className, "text-(--grass-11)")} />
|
|
41
47
|
) : (
|
|
@@ -102,7 +102,9 @@ export const MinimalHotkeys: React.FC<{
|
|
|
102
102
|
);
|
|
103
103
|
};
|
|
104
104
|
|
|
105
|
-
function prettyPrintHotkey(
|
|
105
|
+
export function prettyPrintHotkey(
|
|
106
|
+
key: string,
|
|
107
|
+
): [label: string, symbol?: string] {
|
|
106
108
|
const platform = isPlatformMac() ? "mac" : "default";
|
|
107
109
|
|
|
108
110
|
const lowerKey = key.toLowerCase();
|
|
@@ -70,6 +70,8 @@ const buttonVariants = cva(
|
|
|
70
70
|
link: "underline-offset-4 hover:underline text-link",
|
|
71
71
|
linkDestructive:
|
|
72
72
|
"underline-offset-4 hover:underline text-destructive underline-destructive",
|
|
73
|
+
outlineDestructive:
|
|
74
|
+
"border border-destructive text-destructive hover:bg-destructive/10",
|
|
73
75
|
},
|
|
74
76
|
size: {
|
|
75
77
|
default: "h-10 py-2 px-4",
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import React from "react";
|
|
4
|
+
import {
|
|
5
|
+
AlertDialog,
|
|
6
|
+
AlertDialogAction,
|
|
7
|
+
AlertDialogCancel,
|
|
8
|
+
AlertDialogContent,
|
|
9
|
+
AlertDialogDescription,
|
|
10
|
+
AlertDialogDestructiveAction,
|
|
11
|
+
AlertDialogFooter,
|
|
12
|
+
AlertDialogHeader,
|
|
13
|
+
AlertDialogTitle,
|
|
14
|
+
AlertDialogTrigger,
|
|
15
|
+
} from "./alert-dialog";
|
|
16
|
+
|
|
17
|
+
interface ConfirmationButtonProps {
|
|
18
|
+
/**
|
|
19
|
+
* The button element to trigger the confirmation dialog
|
|
20
|
+
*/
|
|
21
|
+
children: React.ReactElement;
|
|
22
|
+
/**
|
|
23
|
+
* Title of the confirmation dialog
|
|
24
|
+
*/
|
|
25
|
+
title: string;
|
|
26
|
+
/**
|
|
27
|
+
* Description/message of the confirmation dialog
|
|
28
|
+
*/
|
|
29
|
+
description: string;
|
|
30
|
+
/**
|
|
31
|
+
* Callback when the user confirms the action
|
|
32
|
+
*/
|
|
33
|
+
onConfirm: () => void;
|
|
34
|
+
/**
|
|
35
|
+
* Text for the confirm button (default: "Continue")
|
|
36
|
+
*/
|
|
37
|
+
confirmText?: string;
|
|
38
|
+
/**
|
|
39
|
+
* Text for the cancel button (default: "Cancel")
|
|
40
|
+
*/
|
|
41
|
+
cancelText?: string;
|
|
42
|
+
/**
|
|
43
|
+
* Whether to use destructive styling for the confirm button
|
|
44
|
+
*/
|
|
45
|
+
destructive?: boolean;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export const ConfirmationButton: React.FC<ConfirmationButtonProps> = ({
|
|
49
|
+
children,
|
|
50
|
+
title,
|
|
51
|
+
description,
|
|
52
|
+
onConfirm,
|
|
53
|
+
confirmText = "Continue",
|
|
54
|
+
cancelText = "Cancel",
|
|
55
|
+
destructive = false,
|
|
56
|
+
}) => {
|
|
57
|
+
const [open, setOpen] = React.useState(false);
|
|
58
|
+
|
|
59
|
+
const handleConfirm = () => {
|
|
60
|
+
onConfirm();
|
|
61
|
+
setOpen(false);
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const ActionComponent = destructive
|
|
65
|
+
? AlertDialogDestructiveAction
|
|
66
|
+
: AlertDialogAction;
|
|
67
|
+
|
|
68
|
+
return (
|
|
69
|
+
<AlertDialog open={open} onOpenChange={setOpen}>
|
|
70
|
+
<AlertDialogTrigger asChild>{children}</AlertDialogTrigger>
|
|
71
|
+
<AlertDialogContent>
|
|
72
|
+
<AlertDialogHeader>
|
|
73
|
+
<AlertDialogTitle>{title}</AlertDialogTitle>
|
|
74
|
+
<AlertDialogDescription>{description}</AlertDialogDescription>
|
|
75
|
+
</AlertDialogHeader>
|
|
76
|
+
<AlertDialogFooter>
|
|
77
|
+
<AlertDialogCancel>{cancelText}</AlertDialogCancel>
|
|
78
|
+
<ActionComponent onClick={handleConfirm}>
|
|
79
|
+
{confirmText}
|
|
80
|
+
</ActionComponent>
|
|
81
|
+
</AlertDialogFooter>
|
|
82
|
+
</AlertDialogContent>
|
|
83
|
+
</AlertDialog>
|
|
84
|
+
);
|
|
85
|
+
};
|
|
@@ -12,6 +12,7 @@ const switchVariants = cva(
|
|
|
12
12
|
size: {
|
|
13
13
|
default: "h-6 w-11 mb-1",
|
|
14
14
|
sm: "h-4.5 w-8.5",
|
|
15
|
+
xs: "h-4 w-7",
|
|
15
16
|
},
|
|
16
17
|
},
|
|
17
18
|
defaultVariants: {
|
|
@@ -28,6 +29,7 @@ const switchThumbVariants = cva(
|
|
|
28
29
|
default:
|
|
29
30
|
"h-5 w-5 data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0",
|
|
30
31
|
sm: "h-3.5 w-3.5 data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0",
|
|
32
|
+
xs: "h-3 w-3 data-[state=checked]:translate-x-3 data-[state=unchecked]:translate-x-0",
|
|
31
33
|
},
|
|
32
34
|
},
|
|
33
35
|
defaultVariants: {
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
3
|
|
|
4
4
|
import { beforeEach, describe, expect, it } from "vitest";
|
|
5
|
+
import type { CellId } from "@/core/cells/ids";
|
|
5
6
|
import type {
|
|
6
7
|
ConnectionsMap,
|
|
7
8
|
DatasetTablesMap,
|
|
@@ -9,7 +10,7 @@ import type {
|
|
|
9
10
|
import { DUCKDB_ENGINE } from "@/core/datasets/engines";
|
|
10
11
|
import type { DataSourceConnection, DataTable } from "@/core/kernel/messages";
|
|
11
12
|
import { Boosts, Sections } from "../common";
|
|
12
|
-
import { DatasourceContextProvider } from "../datasource";
|
|
13
|
+
import { DatasourceContextProvider, getDatasourceContext } from "../datasource";
|
|
13
14
|
|
|
14
15
|
// Mock data for testing
|
|
15
16
|
const createMockDataSourceConnection = (
|
|
@@ -630,3 +631,10 @@ describe("DatasourceContextProvider", () => {
|
|
|
630
631
|
});
|
|
631
632
|
});
|
|
632
633
|
});
|
|
634
|
+
|
|
635
|
+
describe("getDatasourceContext", () => {
|
|
636
|
+
it("should return null if no cell ID is found", () => {
|
|
637
|
+
const context = getDatasourceContext("1" as CellId);
|
|
638
|
+
expect(context).toBeNull();
|
|
639
|
+
});
|
|
640
|
+
});
|
|
@@ -3,10 +3,14 @@
|
|
|
3
3
|
import type { Completion } from "@codemirror/autocomplete";
|
|
4
4
|
import { createRoot } from "react-dom/client";
|
|
5
5
|
import { dbDisplayName } from "@/components/databases/display";
|
|
6
|
+
import { cellDataAtom } from "@/core/cells/cells";
|
|
7
|
+
import type { CellId } from "@/core/cells/ids";
|
|
8
|
+
import { LanguageAdapters } from "@/core/codemirror/language/LanguageAdapters";
|
|
6
9
|
import { renderDatasourceInfo } from "@/core/codemirror/language/languages/sql/renderers";
|
|
7
10
|
import {
|
|
8
11
|
type ConnectionsMap,
|
|
9
12
|
type DatasetTablesMap,
|
|
13
|
+
dataSourceConnectionsAtom,
|
|
10
14
|
getTableType,
|
|
11
15
|
} from "@/core/datasets/data-source-connections";
|
|
12
16
|
import {
|
|
@@ -14,6 +18,7 @@ import {
|
|
|
14
18
|
INTERNAL_SQL_ENGINES,
|
|
15
19
|
} from "@/core/datasets/engines";
|
|
16
20
|
import type { DataSourceConnection, DataTable } from "@/core/kernel/messages";
|
|
21
|
+
import { store } from "@/core/state/jotai";
|
|
17
22
|
import type { AIContextItem } from "../registry";
|
|
18
23
|
import { AIContextProvider } from "../registry";
|
|
19
24
|
import { contextToXml } from "../utils";
|
|
@@ -37,10 +42,12 @@ export interface DatasourceContextItem extends AIContextItem {
|
|
|
37
42
|
};
|
|
38
43
|
}
|
|
39
44
|
|
|
45
|
+
const CONTEXT_TYPE = "datasource";
|
|
46
|
+
|
|
40
47
|
export class DatasourceContextProvider extends AIContextProvider<DatasourceContextItem> {
|
|
41
48
|
readonly title = "Datasource";
|
|
42
49
|
readonly mentionPrefix = "@";
|
|
43
|
-
readonly contextType =
|
|
50
|
+
readonly contextType = CONTEXT_TYPE;
|
|
44
51
|
private connectionsMap: ConnectionsMap;
|
|
45
52
|
private dataframes: DataTable[];
|
|
46
53
|
|
|
@@ -140,3 +147,20 @@ export class DatasourceContextProvider extends AIContextProvider<DatasourceConte
|
|
|
140
147
|
};
|
|
141
148
|
}
|
|
142
149
|
}
|
|
150
|
+
|
|
151
|
+
export function getDatasourceContext(cellId: CellId): string | null {
|
|
152
|
+
const cellData = store.get(cellDataAtom(cellId));
|
|
153
|
+
const code = cellData?.code;
|
|
154
|
+
if (!code || code.trim() === "") {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const [_sqlStatement, _, metadata] = LanguageAdapters.sql.transformIn(code);
|
|
159
|
+
const datasourceSchema = store
|
|
160
|
+
.get(dataSourceConnectionsAtom)
|
|
161
|
+
.connectionsMap.get(metadata.engine);
|
|
162
|
+
if (datasourceSchema) {
|
|
163
|
+
return `@${CONTEXT_TYPE}://${datasourceSchema.name}`;
|
|
164
|
+
}
|
|
165
|
+
return null;
|
|
166
|
+
}
|
package/src/core/ai/state.ts
CHANGED
|
@@ -13,10 +13,13 @@ const KEY = "marimo:ai:chatState:v5";
|
|
|
13
13
|
|
|
14
14
|
export type ChatId = TypedString<"ChatId">;
|
|
15
15
|
|
|
16
|
-
export
|
|
16
|
+
export interface AiCompletionCell {
|
|
17
17
|
cellId: CellId;
|
|
18
18
|
initialPrompt?: string;
|
|
19
|
-
|
|
19
|
+
triggerImmediately?: boolean;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export const aiCompletionCellAtom = atom<AiCompletionCell | null>(null);
|
|
20
23
|
|
|
21
24
|
const INCLUDE_OTHER_CELLS_KEY = "marimo:ai:includeOtherCells";
|
|
22
25
|
export const includeOtherCellsAtom = atomWithStorage<boolean>(
|
|
@@ -86,7 +89,7 @@ export const activeChatAtom = atom(
|
|
|
86
89
|
}
|
|
87
90
|
return state.chats.get(state.activeChatId);
|
|
88
91
|
},
|
|
89
|
-
(
|
|
92
|
+
(_get, set, chatId: ChatId | null) => {
|
|
90
93
|
set(chatStateAtom, (prev) => ({
|
|
91
94
|
...prev,
|
|
92
95
|
activeChatId: chatId,
|
|
@@ -13,18 +13,43 @@ describe("FrontendToolRegistry", () => {
|
|
|
13
13
|
|
|
14
14
|
it("invokes a tool with valid args and validates input/output", async () => {
|
|
15
15
|
const registry = new FrontendToolRegistry([new TestFrontendTool()]);
|
|
16
|
-
const
|
|
17
|
-
|
|
16
|
+
const response = await registry.invoke("test_frontend_tool", {
|
|
17
|
+
name: "Alice",
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
// Check InvokeResult wrapper
|
|
21
|
+
expect(response.tool_name).toBe("test_frontend_tool");
|
|
22
|
+
expect(response.error).toBeNull();
|
|
23
|
+
|
|
24
|
+
// Check the actual tool output
|
|
25
|
+
expect(response.result).toMatchObject({
|
|
26
|
+
status: "success",
|
|
27
|
+
data: {
|
|
28
|
+
greeting: "Hello: Alice",
|
|
29
|
+
},
|
|
30
|
+
next_steps: expect.arrayContaining([expect.any(String)]),
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
// Verify timestamp is present and valid
|
|
34
|
+
const output = response.result as { data: { timestamp: string } };
|
|
35
|
+
expect(output.data.timestamp).toBeDefined();
|
|
36
|
+
expect(typeof output.data.timestamp).toBe("string");
|
|
18
37
|
});
|
|
19
38
|
|
|
20
39
|
it("returns a structured error on invalid args", async () => {
|
|
21
40
|
const registry = new FrontendToolRegistry([new TestFrontendTool()]);
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
expect(
|
|
27
|
-
expect(
|
|
41
|
+
const response = await registry.invoke("test_frontend_tool", {});
|
|
42
|
+
|
|
43
|
+
// Check InvokeResult wrapper
|
|
44
|
+
expect(response.tool_name).toBe("test_frontend_tool");
|
|
45
|
+
expect(response.result).toBeNull();
|
|
46
|
+
expect(response.error).toBeDefined();
|
|
47
|
+
expect(typeof response.error).toBe("string");
|
|
48
|
+
|
|
49
|
+
// Verify error message contains expected prefix
|
|
50
|
+
expect(response.error).toContain("Error invoking tool ToolExecutionError:");
|
|
51
|
+
expect(response.error).toContain('"code":"TOOL_ERROR"');
|
|
52
|
+
expect(response.error).toContain('"is_retryable":false');
|
|
28
53
|
});
|
|
29
54
|
|
|
30
55
|
it("returns tool schemas with expected shape and memoizes the result", () => {
|
|
@@ -1,8 +1,88 @@
|
|
|
1
1
|
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import { z } from "zod";
|
|
4
4
|
import type { CopilotMode } from "./registry";
|
|
5
5
|
|
|
6
|
+
/**
|
|
7
|
+
* Status value for tool responses, mirroring status value in marimo/_ai/_tools/types.py
|
|
8
|
+
*/
|
|
9
|
+
export type StatusValue = "success" | "error" | "warning";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Structured error for tool execution failures.
|
|
13
|
+
* Mirrors the ToolExecutionError dataclass from marimo/_ai/_tools/utils/exceptions.py
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* throw new ToolExecutionError(
|
|
17
|
+
* "Failed to fetch data",
|
|
18
|
+
* "FETCH_ERROR",
|
|
19
|
+
* true,
|
|
20
|
+
* "Check your network connection"
|
|
21
|
+
* );
|
|
22
|
+
*/
|
|
23
|
+
export class ToolExecutionError extends Error {
|
|
24
|
+
readonly code: string;
|
|
25
|
+
readonly isRetryable: boolean;
|
|
26
|
+
readonly suggestedFix?: string;
|
|
27
|
+
readonly meta?: Record<string, unknown>;
|
|
28
|
+
|
|
29
|
+
constructor(
|
|
30
|
+
message: string,
|
|
31
|
+
code = "TOOL_ERROR",
|
|
32
|
+
isRetryable = false,
|
|
33
|
+
suggestedFix?: string,
|
|
34
|
+
meta?: Record<string, unknown>,
|
|
35
|
+
) {
|
|
36
|
+
super(message);
|
|
37
|
+
this.name = "ToolExecutionError";
|
|
38
|
+
this.code = code;
|
|
39
|
+
this.isRetryable = isRetryable;
|
|
40
|
+
this.suggestedFix = suggestedFix;
|
|
41
|
+
this.meta = meta;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
toStructuredString(): string {
|
|
45
|
+
const stringError = JSON.stringify({
|
|
46
|
+
message: this.message,
|
|
47
|
+
code: this.code,
|
|
48
|
+
is_retryable: this.isRetryable,
|
|
49
|
+
suggested_fix: this.suggestedFix,
|
|
50
|
+
meta: this.meta ?? {},
|
|
51
|
+
});
|
|
52
|
+
return `Error invoking tool ${this.name}: ${stringError}`;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Base interface for tool output responses.
|
|
58
|
+
* Mirrors the SuccessResult dataclass from marimo/_ai/_tools/types.py
|
|
59
|
+
*
|
|
60
|
+
* Tool outputs should extend this interface to include standardized
|
|
61
|
+
* metadata like next_steps, messages, and status information.
|
|
62
|
+
*/
|
|
63
|
+
export interface ToolOutputBase {
|
|
64
|
+
status?: StatusValue;
|
|
65
|
+
auth_required?: boolean;
|
|
66
|
+
next_steps?: string[];
|
|
67
|
+
action_url?: string;
|
|
68
|
+
message?: string;
|
|
69
|
+
meta?: Record<string, unknown>;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Base Zod schema for tool outputs.
|
|
74
|
+
*
|
|
75
|
+
* Tool output schemas should extend this using .extend() to add their specific fields.
|
|
76
|
+
*/
|
|
77
|
+
export const toolOutputBaseSchema = z.object({
|
|
78
|
+
status: z.enum(["success", "error", "warning"]).optional(),
|
|
79
|
+
auth_required: z.boolean().optional(),
|
|
80
|
+
next_steps: z.array(z.string()).optional(),
|
|
81
|
+
action_url: z.string().optional(),
|
|
82
|
+
message: z.string().optional(),
|
|
83
|
+
meta: z.record(z.string(), z.unknown()).optional(),
|
|
84
|
+
});
|
|
85
|
+
|
|
6
86
|
/**
|
|
7
87
|
* Contract for a frontend tool.
|
|
8
88
|
*
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import type { components } from "@marimo-team/marimo-api";
|
|
4
4
|
import { Memoize } from "typescript-memoize";
|
|
5
5
|
import { type ZodObject, z } from "zod";
|
|
6
|
-
import type
|
|
6
|
+
import { type AiTool, ToolExecutionError } from "./base";
|
|
7
7
|
import { TestFrontendTool } from "./sample-tool";
|
|
8
8
|
|
|
9
9
|
export type AnyZodObject = ZodObject<z.ZodRawShape>;
|
|
@@ -11,6 +11,12 @@ export type AnyZodObject = ZodObject<z.ZodRawShape>;
|
|
|
11
11
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
12
|
type StoredTool = AiTool<any, any>;
|
|
13
13
|
|
|
14
|
+
interface InvokeResult<TName> {
|
|
15
|
+
tool_name: TName;
|
|
16
|
+
result: unknown;
|
|
17
|
+
error: string | null;
|
|
18
|
+
}
|
|
19
|
+
|
|
14
20
|
/** should be the same as marimo/_config/config.py > CopilotMode */
|
|
15
21
|
|
|
16
22
|
type ToolDefinition = components["schemas"]["ToolDefinition"];
|
|
@@ -43,7 +49,7 @@ export class FrontendToolRegistry {
|
|
|
43
49
|
async invoke<TName extends string>(
|
|
44
50
|
toolName: TName,
|
|
45
51
|
rawArgs: unknown,
|
|
46
|
-
): Promise<
|
|
52
|
+
): Promise<InvokeResult<TName>> {
|
|
47
53
|
const tool = this.getToolOrThrow(toolName);
|
|
48
54
|
const handler = tool.handler;
|
|
49
55
|
const inputSchema = tool.schema;
|
|
@@ -69,17 +75,37 @@ export class FrontendToolRegistry {
|
|
|
69
75
|
`Tool ${toolName} returned invalid output: ${strError}`,
|
|
70
76
|
);
|
|
71
77
|
}
|
|
72
|
-
const
|
|
73
|
-
return output;
|
|
74
|
-
} catch (error) {
|
|
78
|
+
const result = response.data;
|
|
75
79
|
return {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
80
|
+
tool_name: toolName,
|
|
81
|
+
result,
|
|
82
|
+
error: null,
|
|
83
|
+
};
|
|
84
|
+
} catch (error) {
|
|
85
|
+
// Handle structured errors
|
|
86
|
+
if (error instanceof ToolExecutionError) {
|
|
87
|
+
return {
|
|
88
|
+
tool_name: toolName,
|
|
89
|
+
result: null,
|
|
90
|
+
error: error.toStructuredString(),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Handle unknown/generic errors
|
|
95
|
+
const genericError = new ToolExecutionError(
|
|
96
|
+
error instanceof Error ? error.message : String(error),
|
|
97
|
+
"TOOL_ERROR",
|
|
98
|
+
false,
|
|
99
|
+
"Check the error message and try again with valid arguments.",
|
|
100
|
+
{
|
|
81
101
|
args: rawArgs,
|
|
102
|
+
errorType: error?.constructor?.name ?? typeof error,
|
|
82
103
|
},
|
|
104
|
+
);
|
|
105
|
+
return {
|
|
106
|
+
tool_name: toolName,
|
|
107
|
+
result: null,
|
|
108
|
+
error: genericError.toStructuredString(),
|
|
83
109
|
};
|
|
84
110
|
}
|
|
85
111
|
}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
3
|
import { z } from "zod";
|
|
4
|
-
import
|
|
4
|
+
import {
|
|
5
|
+
type AiTool,
|
|
6
|
+
ToolExecutionError,
|
|
7
|
+
type ToolOutputBase,
|
|
8
|
+
toolOutputBaseSchema,
|
|
9
|
+
} from "./base";
|
|
5
10
|
import type { CopilotMode } from "./registry";
|
|
6
11
|
|
|
7
12
|
const description = `
|
|
@@ -11,26 +16,57 @@ Args:
|
|
|
11
16
|
- name (string): The name to include in the greeting.
|
|
12
17
|
|
|
13
18
|
Returns:
|
|
14
|
-
-
|
|
19
|
+
- Output with data containing the greeting message.
|
|
15
20
|
`;
|
|
16
21
|
|
|
17
22
|
interface Input {
|
|
18
23
|
name: string;
|
|
19
24
|
}
|
|
20
25
|
|
|
21
|
-
interface
|
|
22
|
-
|
|
26
|
+
interface GreetingData {
|
|
27
|
+
greeting: string;
|
|
28
|
+
timestamp: string;
|
|
23
29
|
}
|
|
24
30
|
|
|
25
|
-
|
|
31
|
+
interface Output extends ToolOutputBase {
|
|
32
|
+
data: GreetingData;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** A sample frontend tool that demonstrates real tool output structure */
|
|
26
36
|
export class TestFrontendTool implements AiTool<Input, Output> {
|
|
27
37
|
readonly name = "test_frontend_tool";
|
|
28
38
|
readonly description = description;
|
|
29
39
|
readonly schema = z.object({ name: z.string() });
|
|
30
|
-
readonly outputSchema =
|
|
40
|
+
readonly outputSchema = toolOutputBaseSchema.extend({
|
|
41
|
+
data: z.object({
|
|
42
|
+
greeting: z.string(),
|
|
43
|
+
timestamp: z.string(),
|
|
44
|
+
}),
|
|
45
|
+
});
|
|
31
46
|
readonly mode: CopilotMode[] = ["ask"];
|
|
32
47
|
|
|
33
|
-
async handler({ name }: Input) {
|
|
34
|
-
|
|
48
|
+
async handler({ name }: Input): Promise<Output> {
|
|
49
|
+
// Example: Validate input and throw ToolExecutionError on invalid data
|
|
50
|
+
if (!name.trim()) {
|
|
51
|
+
throw new ToolExecutionError(
|
|
52
|
+
"Name cannot be empty",
|
|
53
|
+
"INVALID_INPUT",
|
|
54
|
+
false,
|
|
55
|
+
"Please provide a non-empty name",
|
|
56
|
+
{ field: "name", received: name },
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
status: "success",
|
|
62
|
+
data: {
|
|
63
|
+
greeting: `Hello: ${name}`,
|
|
64
|
+
timestamp: new Date().toISOString(),
|
|
65
|
+
},
|
|
66
|
+
next_steps: [
|
|
67
|
+
"You can now proceed with your next task",
|
|
68
|
+
"Try calling another tool if needed",
|
|
69
|
+
],
|
|
70
|
+
};
|
|
35
71
|
}
|
|
36
72
|
}
|