@marimo-team/frontend 0.15.3 → 0.15.4
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/assets/{ConnectedDataExplorerComponent-D-5E8ink.js → ConnectedDataExplorerComponent-Cn5-l2X1.js} +2 -2
- package/dist/assets/{ImageComparisonComponent-lZA6EaZ7.js → ImageComparisonComponent-CEXMKKA4.js} +1 -1
- package/dist/assets/{VegaLite-C80SZuda.js → VegaLite-Bt14Ds9k.js} +6 -6
- package/dist/assets/_baseEach-C1FLm7WW.js +1 -0
- package/dist/assets/_baseMap-DBVArUYD.js +1 -0
- package/dist/assets/_baseUniq-Dk7ZPJ3N.js +1 -0
- package/dist/assets/_createAggregator-Bn38fDd3.js +1 -0
- package/dist/assets/abap-DnJxzdy9.js +1 -0
- package/dist/assets/actionscript-3-CKUqbIUM.js +1 -0
- package/dist/assets/ada-iG1FnIvR.js +1 -0
- package/dist/assets/agent-panel-COUYnuIK.js +475 -0
- package/dist/assets/agent-panel-DpQ6muj-.css +1 -0
- package/dist/assets/andromeeda-C-Jbm3Hp.js +1 -0
- package/dist/assets/angular-html-BZhSV2-l.js +1 -0
- package/dist/assets/angular-ts-DRQ-j7PL.js +1 -0
- package/dist/assets/{any-language-editor-Cn0Ju0SA.js → any-language-editor-DiwNT6zp.js} +1 -1
- package/dist/assets/apache-CdTKWnKT.js +1 -0
- package/dist/assets/apex-3xxtq2mv.js +1 -0
- package/dist/assets/apl-BnBkWLuz.js +1 -0
- package/dist/assets/applescript-BlLNmGTp.js +1 -0
- package/dist/assets/ara-Ba3fhlsS.js +1 -0
- package/dist/assets/arc-Cuwikxov.js +1 -0
- package/dist/assets/architectureDiagram-W76B3OCA-DBzWQKKu.js +36 -0
- package/dist/assets/asciidoc-XTVL4-GN.js +1 -0
- package/dist/assets/asm-CHX6lpGW.js +1 -0
- package/dist/assets/astro-CXYfh229.js +1 -0
- package/dist/assets/aurora-x-D-2ljcwZ.js +1 -0
- package/dist/assets/awk-XRrwoikR.js +1 -0
- package/dist/assets/ayu-dark-Cv9koXgw.js +1 -0
- package/dist/assets/ballerina-Dh0JsEtz.js +1 -0
- package/dist/assets/bat-BVu0TwaT.js +1 -0
- package/dist/assets/beancount-BuQJKJpV.js +1 -0
- package/dist/assets/berry-D4qT7XM1.js +1 -0
- package/dist/assets/{between-horizontal-start-BrmUizGs.js → between-horizontal-start-FyewyCGn.js} +1 -1
- package/dist/assets/bibtex-CGjxJ4Zd.js +1 -0
- package/dist/assets/bicep-DysT5qaJ.js +1 -0
- package/dist/assets/blade-CkGRa-l8.js +1 -0
- package/dist/assets/{blockDiagram-QIGZ2CNN-D08JxTYL.js → blockDiagram-QIGZ2CNN-BrOkAf_c.js} +4 -4
- package/dist/assets/bsl-DGicdwC0.js +1 -0
- package/dist/assets/c-BmJt9k-y.js +1 -0
- package/dist/assets/{c4Diagram-FPNF74CW-B5Ki5s6c.js → c4Diagram-FPNF74CW-BHPzDxE2.js} +1 -1
- package/dist/assets/cadence-CWn_mfEc.js +1 -0
- package/dist/assets/cairo-Dz8fl918.js +1 -0
- package/dist/assets/catppuccin-frappe-BBxmzUt6.js +1 -0
- package/dist/assets/catppuccin-latte-Jep7L2Wt.js +1 -0
- package/dist/assets/catppuccin-macchiato-CIUZ1G5V.js +1 -0
- package/dist/assets/catppuccin-mocha-NBseiqgx.js +1 -0
- package/dist/assets/channel-CjhbjOv4.js +1 -0
- package/dist/assets/chat-panel-BPXKoTnZ.js +7 -0
- package/dist/assets/chunk-4BX2VUAB-DLxaCNYh.js +1 -0
- package/dist/assets/chunk-55IACEB6-DdzvO3HR.js +1 -0
- package/dist/assets/{chunk-FMBD7UC4-CPtXh_Tc.js → chunk-FMBD7UC4-R5o-nSiG.js} +1 -1
- package/dist/assets/{chunk-K7UQS3LO-H1GayBnp.js → chunk-K7UQS3LO-DxaMrGgG.js} +1 -1
- package/dist/assets/chunk-QN33PNHL-DqS9-FYm.js +1 -0
- package/dist/assets/chunk-QZHKN3VN-BZ-TzajS.js +1 -0
- package/dist/assets/{chunk-TVAH2DTR-CKpRI29L.js → chunk-TVAH2DTR-BsgP2dyv.js} +5 -5
- package/dist/assets/{chunk-TZMSLE5B-CnU05RC1.js → chunk-TZMSLE5B-D-h3ahXI.js} +1 -1
- package/dist/assets/{circle-play-Dizu3hR4.js → circle-play-CQtRZ-rT.js} +1 -1
- package/dist/assets/clarity-DF5_RAtY.js +1 -0
- package/dist/assets/classDiagram-KNZD7YFC-DHs5cFzy.js +1 -0
- package/dist/assets/classDiagram-v2-RKCZMP56-DHs5cFzy.js +1 -0
- package/dist/assets/{clear-button-BASAgaZM.js → clear-button-BY6Z_ViL.js} +1 -1
- package/dist/assets/clojure-BjI0Knrv.js +1 -0
- package/dist/assets/clone-DM1YNjEn.js +1 -0
- package/dist/assets/cmake-BYiqpiH1.js +1 -0
- package/dist/assets/cobol-Dt3m7Jkx.js +1 -0
- package/dist/assets/codeowners-L91meNbn.js +1 -0
- package/dist/assets/codeql-Cd-JFsJB.js +1 -0
- package/dist/assets/coffee-DgxxYT5L.js +1 -0
- package/dist/assets/{command-palette-6abbxoUb.js → command-palette-S0bzQp7v.js} +1 -1
- package/dist/assets/{common-BxprsFNA.js → common-B8U9k2Ly.js} +1 -1
- package/dist/assets/common-lisp-DOi1njVG.js +1 -0
- package/dist/assets/{compile-BGXIlCMz.js → compile-Ct_jzdKr.js} +1 -1
- package/dist/assets/coq-BfbrVLCY.js +1 -0
- package/dist/assets/cose-bilkent-S5V4N54A-wz1Sfx7j.js +1 -0
- package/dist/assets/cpp-BmKY377x.js +1 -0
- package/dist/assets/crystal-DB6V90z1.js +1 -0
- package/dist/assets/csharp-yFVQ185C.js +1 -0
- package/dist/assets/css-l46fsARh.js +1 -0
- package/dist/assets/csv-DXKU4rRd.js +1 -0
- package/dist/assets/cue-zmT78Agv.js +1 -0
- package/dist/assets/cypher-bkHSskm3.js +1 -0
- package/dist/assets/d-vs9xsbRV.js +1 -0
- package/dist/assets/dagre-5GWH7T2D-BfpcVBgq.js +4 -0
- package/dist/assets/dark-plus-C3mMm8J8.js +1 -0
- package/dist/assets/dart-BMkYYGiN.js +1 -0
- package/dist/assets/{data-grid-overlay-editor-CJkpT222.js → data-grid-overlay-editor-BN_wulc3.js} +1 -1
- package/dist/assets/{datasources-panel-HITG8eye.js → datasources-panel-DfuURLJw.js} +1 -1
- package/dist/assets/dax-D135z3aS.js +1 -0
- package/dist/assets/{dependency-graph-panel-D9np9LSb.js → dependency-graph-panel-BOmSCZf7.js} +4 -4
- package/dist/assets/desktop-CigPEpQ5.js +1 -0
- package/dist/assets/diagram-N5W7TBWH-Bf0oqqQh.js +24 -0
- package/dist/assets/diagram-QEK2KX5R-ZTc3qikh.js +43 -0
- package/dist/assets/diagram-S2PKOQOG-tLScBy7Z.js +24 -0
- package/dist/assets/diff-Beq1YlA8.js +1 -0
- package/dist/assets/docker-V5Al5bpF.js +1 -0
- package/dist/assets/{documentation-panel-bTy-gCid.js → documentation-panel-BxjJO_Gw.js} +1 -1
- package/dist/assets/dotenv-D9G8sA2m.js +1 -0
- package/dist/assets/dracula-BzJJZx-M.js +1 -0
- package/dist/assets/dracula-soft-BXkSAIEj.js +1 -0
- package/dist/assets/dream-maker-BsoKROiO.js +1 -0
- package/dist/assets/edge-Brl-y200.js +1 -0
- package/dist/assets/{edit-page-DVsJ5OUI.js → edit-page-DJ8kJZ9w.js} +35 -35
- package/dist/assets/elixir-CGzfkNtR.js +1 -0
- package/dist/assets/{ellipsis-vertical-GW_YrU8C.js → ellipsis-vertical-UHbmjI2n.js} +1 -1
- package/dist/assets/elm-DmpuOW2E.js +1 -0
- package/dist/assets/emacs-lisp-BcpYGiHp.js +1 -0
- package/dist/assets/empty-state-BIBXzY_0.js +1 -0
- package/dist/assets/{erDiagram-AWTI2OKA-lCwUhmIf.js → erDiagram-AWTI2OKA-E84mAle_.js} +1 -1
- package/dist/assets/erb-BNAqOH5i.js +1 -0
- package/dist/assets/erlang-DAw79KxH.js +1 -0
- package/dist/assets/{error-panel-Cnlgqo61.js → error-panel-MEvQ6K7h.js} +2 -2
- package/dist/assets/everforest-dark-BgDCqdQA.js +1 -0
- package/dist/assets/everforest-light-C8M2exoo.js +1 -0
- package/dist/assets/fennel-qzPJJAAI.js +1 -0
- package/dist/assets/file-explorer-panel-CzNUJ63G.js +1 -0
- package/dist/assets/fish-BTv9qkVe.js +1 -0
- package/dist/assets/{flowDiagram-PVAE7QVJ-DnG1jaGB.js → flowDiagram-PVAE7QVJ-DfbIRSAW.js} +1 -1
- package/dist/assets/fluent-BsukS3Co.js +1 -0
- package/dist/assets/fortran-fixed-form-D_2otJTs.js +1 -0
- package/dist/assets/fortran-free-form-Ix_0F1Zz.js +1 -0
- package/dist/assets/fsharp-DmSnwM-W.js +1 -0
- package/dist/assets/{ganttDiagram-OWAHRB6G-CX39q7PN.js → ganttDiagram-OWAHRB6G-DR4HZ1z_.js} +3 -3
- package/dist/assets/gdresource-BLuZCTp3.js +1 -0
- package/dist/assets/gdscript-fffAh1pn.js +1 -0
- package/dist/assets/gdshader-BC7WJXp9.js +1 -0
- package/dist/assets/genie-IZOju1hG.js +1 -0
- package/dist/assets/gherkin-DUpgZfGr.js +1 -0
- package/dist/assets/git-commit-Bptnmh-c.js +1 -0
- package/dist/assets/git-rebase-CqNhyBhE.js +1 -0
- package/dist/assets/gitGraphDiagram-NY62KEGX-C1t6QtVa.js +65 -0
- package/dist/assets/github-dark-DHJKELXO.js +1 -0
- package/dist/assets/github-dark-default-Cuk6v7N8.js +1 -0
- package/dist/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
- package/dist/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
- package/dist/assets/github-light-DAi9KRSo.js +1 -0
- package/dist/assets/github-light-default-D7oLnXFd.js +1 -0
- package/dist/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
- package/dist/assets/gleam-CCCEh_av.js +1 -0
- package/dist/assets/{glide-data-editor-l-bMUJyX.js → glide-data-editor-nNmo1lPq.js} +11 -11
- package/dist/assets/glimmer-js-CamsSOgS.js +1 -0
- package/dist/assets/glimmer-ts-DpQMos9P.js +1 -0
- package/dist/assets/glsl-BDbjGBhJ.js +1 -0
- package/dist/assets/gnuplot-D0FoiB-W.js +1 -0
- package/dist/assets/go-BR7YH85S.js +1 -0
- package/dist/assets/graph-CssCVWIq.js +1 -0
- package/dist/assets/graphql-DMns_A3G.js +1 -0
- package/dist/assets/groovy-D9sPn4Z-.js +1 -0
- package/dist/assets/gruvbox-dark-hard-D1uDOp7C.js +1 -0
- package/dist/assets/gruvbox-dark-medium-DkhsQLT2.js +1 -0
- package/dist/assets/gruvbox-dark-soft-CcyOm34o.js +1 -0
- package/dist/assets/gruvbox-light-hard-DKzvysjW.js +1 -0
- package/dist/assets/gruvbox-light-medium-DPcUKYIF.js +1 -0
- package/dist/assets/gruvbox-light-soft-CGqH5EJj.js +1 -0
- package/dist/assets/hack-CXH7pT2m.js +1 -0
- package/dist/assets/haml-DiuhmbKg.js +1 -0
- package/dist/assets/handlebars-PuluTGUb.js +1 -0
- package/dist/assets/haskell-Cp0NQEkn.js +1 -0
- package/dist/assets/haxe-D-PmAGDa.js +1 -0
- package/dist/assets/hcl-DRMo6eis.js +1 -0
- package/dist/assets/hjson-BPEpXUFQ.js +1 -0
- package/dist/assets/hlsl-B-PjNM4a.js +1 -0
- package/dist/assets/{home-page-B1kjvR5n.js → home-page-9eW6qida.js} +3 -3
- package/dist/assets/houston-DnULxvSX.js +1 -0
- package/dist/assets/html-ReiWYoHo.js +1 -0
- package/dist/assets/html-derivative-BEFkAAPd.js +1 -0
- package/dist/assets/http-BPFbEDC3.js +1 -0
- package/dist/assets/hxml-DB3_nACV.js +1 -0
- package/dist/assets/hy-CLIvbAhW.js +1 -0
- package/dist/assets/imba-B-tO30Ge.js +1 -0
- package/dist/assets/{index-DXC6BC43.js → index-B1_GXGaP.js} +1 -1
- package/dist/assets/index-B7yXbrLa.js +1 -0
- package/dist/assets/{index-CuFO3AB8.js → index-B8llrTSo.js} +1 -1
- package/dist/assets/{index-Co5sPjJc.js → index-BAH034Ue.js} +1 -1
- package/dist/assets/{index-Dut0n0LK.js → index-BFSnz7iM.js} +1 -1
- package/dist/assets/{index-ByYzywJk.js → index-BLu5CX6z.js} +1 -1
- package/dist/assets/index-Bq516OmX.js +1 -0
- package/dist/assets/index-CB2pnVQG.js +1 -0
- package/dist/assets/{index-QpAlOfLT.js → index-CPN7TRA1.js} +1 -1
- package/dist/assets/{index-C5GV-DhP.js → index-CSgxTUzD.js} +1 -1
- package/dist/assets/index-CknhX2Vy.css +1 -0
- package/dist/assets/index-DMomwMcN.js +1 -0
- package/dist/assets/{index-OdZ649Ww.js → index-DSU75csX.js} +1 -1
- package/dist/assets/{index-DXqCSfYv.js → index-DWOaniGT.js} +1 -1
- package/dist/assets/index-DcCIe7np.js +28 -0
- package/dist/assets/index-DqzMPAC8.js +7 -0
- package/dist/assets/{index-BTeNT_Tt.js → index-Dt9UWeWn.js} +1 -1
- package/dist/assets/{index-CuVt_RTJ.js → index-DyLSuOH1.js} +1 -1
- package/dist/assets/{index-StZz2sD-.js → index-OC46250R.js} +175 -175
- package/dist/assets/{index-DAhZ64xY.js → index-VPWqq2Pg.js} +1 -1
- package/dist/assets/index-c6If577Q.js +1 -0
- package/dist/assets/{index-CiKUoc5G.js → index-uacyUula.js} +1 -1
- package/dist/assets/infoDiagram-STP46IZ2-CwiAoz9f.js +2 -0
- package/dist/assets/ini-Bpxu4Zsc.js +1 -0
- package/dist/assets/java-DtRXFtDl.js +1 -0
- package/dist/assets/javascript-CY0YvwoL.js +1 -0
- package/dist/assets/jinja-CXJbPSuL.js +1 -0
- package/dist/assets/jison-iRP-Iv-P.js +1 -0
- package/dist/assets/{journeyDiagram-BIP6EPQ6-Ducmkxc0.js → journeyDiagram-BIP6EPQ6-BBiFyygf.js} +1 -1
- package/dist/assets/json-LWN7Ml79.js +1 -0
- package/dist/assets/json5-CgCB487x.js +1 -0
- package/dist/assets/jsonc-BXrjvC_e.js +1 -0
- package/dist/assets/jsonl-D5dm1SHP.js +1 -0
- package/dist/assets/jsonnet-B60UklUs.js +1 -0
- package/dist/assets/jssm-CsqlGknB.js +1 -0
- package/dist/assets/jsx-g2NrEQII.js +1 -0
- package/dist/assets/julia-BabrhEml.js +1 -0
- package/dist/assets/kanagawa-dragon-CkXjmgJE.js +1 -0
- package/dist/assets/kanagawa-lotus-CfQXZHmo.js +1 -0
- package/dist/assets/kanagawa-wave-DWedfzmr.js +1 -0
- package/dist/assets/{kanban-definition-6OIFK2YF-Drd9VUQq.js → kanban-definition-6OIFK2YF-DhgA6Nt6.js} +5 -5
- package/dist/assets/kotlin-DiV2Dt9D.js +1 -0
- package/dist/assets/kusto-KSLuQd98.js +1 -0
- package/dist/assets/laserwave-DUszq2jm.js +1 -0
- package/dist/assets/latex-CCwiU5tQ.js +1 -0
- package/dist/assets/{layout-DYVxODOR.js → layout-DpQrxGW-.js} +1 -1
- package/dist/assets/lean-C20waPKk.js +1 -0
- package/dist/assets/less-DKKxO4Pm.js +1 -0
- package/dist/assets/light-plus-B7mTdjB0.js +1 -0
- package/dist/assets/linear-NsreOeBF.js +1 -0
- package/dist/assets/links-CbvGxbsJ.js +7 -0
- package/dist/assets/liquid-QTP3a8yd.js +1 -0
- package/dist/assets/llvm-CfjccL00.js +1 -0
- package/dist/assets/log-CnKjEmrw.js +1 -0
- package/dist/assets/logo-BmG1tMr6.js +1 -0
- package/dist/assets/{logs-panel-BdZwSU1-.js → logs-panel-B9SmTZAW.js} +1 -1
- package/dist/assets/lua-B09NiSMa.js +1 -0
- package/dist/assets/luau-C2pF66fA.js +1 -0
- package/dist/assets/make-Ccm3NI5i.js +1 -0
- package/dist/assets/markdown-DY93LJPj.js +1 -0
- package/dist/assets/marko-CgCapwG0.js +1 -0
- package/dist/assets/material-theme-D5KoaKCx.js +1 -0
- package/dist/assets/material-theme-darker-BfHTSMKl.js +1 -0
- package/dist/assets/material-theme-lighter-B0m2ddpp.js +1 -0
- package/dist/assets/material-theme-ocean-CyktbL80.js +1 -0
- package/dist/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
- package/dist/assets/matlab-nYX3zffi.js +1 -0
- package/dist/assets/mdc-CVidKc4b.js +1 -0
- package/dist/assets/mdx-C8C9IGe9.js +1 -0
- package/dist/assets/mermaid-DSt0r6IQ.js +1 -0
- package/dist/assets/mermaid-ZuTRVWig.js +1 -0
- package/dist/assets/{mermaid-JltzhJwZ.js → mermaid.core-4nVOEVX3.js} +44 -44
- package/dist/assets/min-D259kI3t.js +1 -0
- package/dist/assets/min-dark-CafNBF8u.js +1 -0
- package/dist/assets/min-light-CTRr51gU.js +1 -0
- package/dist/assets/{mindmap-definition-Q6HEUPPD-DVMI0DKx.js → mindmap-definition-Q6HEUPPD-CVLQNn1q.js} +1 -1
- package/dist/assets/mipsasm-BjAqecqh.js +1 -0
- package/dist/assets/mojo-gr1MWCNv.js +1 -0
- package/dist/assets/monokai-D4h5O-jR.js +1 -0
- package/dist/assets/move-BJN6DhLB.js +1 -0
- package/dist/assets/narrat-BTSicUR-.js +1 -0
- package/dist/assets/nextflow-CvZ2-N7x.js +1 -0
- package/dist/assets/nginx-CtwUG8yW.js +1 -0
- package/dist/assets/night-owl-C39BiMTA.js +1 -0
- package/dist/assets/nim-BCqJOqd2.js +1 -0
- package/dist/assets/nix-DiXPdoNa.js +1 -0
- package/dist/assets/nord-Ddv68eIx.js +1 -0
- package/dist/assets/{number-overlay-editor-BolEVFqu.js → number-overlay-editor-CzRzXLcd.js} +1 -1
- package/dist/assets/nushell-a9nsepcr.js +1 -0
- package/dist/assets/objective-c-DLT9zZoE.js +1 -0
- package/dist/assets/objective-cpp-DKXr-AK_.js +1 -0
- package/dist/assets/ocaml-DP9q6K5L.js +1 -0
- package/dist/assets/one-dark-pro-DVMEJ2y_.js +1 -0
- package/dist/assets/one-light-PoHY5YXO.js +1 -0
- package/dist/assets/{outline-panel-CmQbujCA.js → outline-panel-uvsS-YEQ.js} +1 -1
- package/dist/assets/packages-panel-xMz9W2hW.js +1 -0
- package/dist/assets/pascal-DjTTLVNS.js +1 -0
- package/dist/assets/perl-Da10OPbb.js +1 -0
- package/dist/assets/php-hSYFjEJr.js +1 -0
- package/dist/assets/pieDiagram-ADFJNKIX-C5IQ5DBZ.js +30 -0
- package/dist/assets/plastic-3e1v2bzS.js +1 -0
- package/dist/assets/plsql-CJrHCTnj.js +1 -0
- package/dist/assets/po-y5MdiEbo.js +1 -0
- package/dist/assets/poimandres-CS3Unz2-.js +1 -0
- package/dist/assets/polar-Bsx6RkUC.js +1 -0
- package/dist/assets/postcss-CeUBPB2S.js +1 -0
- package/dist/assets/powerquery-CW27I574.js +1 -0
- package/dist/assets/powershell-DSYJ6xcj.js +1 -0
- package/dist/assets/prisma-CLoN-gBj.js +1 -0
- package/dist/assets/prolog-Bgt5DHUA.js +1 -0
- package/dist/assets/proto-BVbLr_ub.js +1 -0
- package/dist/assets/pug-DYUvS0f2.js +1 -0
- package/dist/assets/puppet-TSkl_nn0.js +1 -0
- package/dist/assets/purescript-BrDje9qL.js +1 -0
- package/dist/assets/python-DlV7vnVD.js +1 -0
- package/dist/assets/qml-DiX3J200.js +1 -0
- package/dist/assets/qmldir-CSZk7E48.js +1 -0
- package/dist/assets/qss-DACx-k9g.js +1 -0
- package/dist/assets/{quadrantDiagram-LMRXKWRM-C3KUHV9E.js → quadrantDiagram-LMRXKWRM-CFXFnQxx.js} +2 -2
- package/dist/assets/r-C1kzXVmM.js +1 -0
- package/dist/assets/racket-D1nq-KeH.js +1 -0
- package/dist/assets/raku-DocPDKZq.js +1 -0
- package/dist/assets/razor-7Qmv-3mF.js +1 -0
- package/dist/assets/{react-plotly-D8t1Fm8s.js → react-plotly-mzdv02_Y.js} +1 -1
- package/dist/assets/red-bN70gL4F.js +1 -0
- package/dist/assets/reg-5ydmJHEw.js +1 -0
- package/dist/assets/regexp-CpyjTnFF.js +1 -0
- package/dist/assets/rel-D68lwU-3.js +1 -0
- package/dist/assets/{requirementDiagram-4UW4RH46-COaNtrVe.js → requirementDiagram-4UW4RH46-D9bPC89T.js} +3 -3
- package/dist/assets/riscv-Cl4WfXj6.js +1 -0
- package/dist/assets/rose-pine-BHrmToEH.js +1 -0
- package/dist/assets/rose-pine-dawn-CnK8MTSM.js +1 -0
- package/dist/assets/rose-pine-moon-NleAzG8P.js +1 -0
- package/dist/assets/rst-DU5WA_Li.js +1 -0
- package/dist/assets/ruby-DJftxM78.js +1 -0
- package/dist/assets/{run-page-k_GylS9j.js → run-page-Bb68qdhQ.js} +1 -1
- package/dist/assets/rust-DpWcZSqc.js +1 -0
- package/dist/assets/sankeyDiagram-GR3RE2ED-BSJOau8E.js +10 -0
- package/dist/assets/sas-BBCK0tAG.js +1 -0
- package/dist/assets/sass-DY_rGA2-.js +1 -0
- package/dist/assets/save-worker-B386kalt.js +1 -0
- package/dist/assets/scala-CYRsmRER.js +1 -0
- package/dist/assets/scheme-C45fPb3F.js +1 -0
- package/dist/assets/scratchpad-panel-BF4BO-U4.js +1 -0
- package/dist/assets/scss-CHxzYwli.js +1 -0
- package/dist/assets/sdbl-BpucmfEo.js +1 -0
- package/dist/assets/secrets-panel-CdIX44dQ.js +1 -0
- package/dist/assets/{sequenceDiagram-C3RYC4MD-BEe1Fsqh.js → sequenceDiagram-C3RYC4MD-6N7_hY4k.js} +1 -1
- package/dist/assets/shaderlab-DNyPh2Q6.js +1 -0
- package/dist/assets/shellscript-B8OHlvmy.js +1 -0
- package/dist/assets/shellsession-OATBsyRD.js +1 -0
- package/dist/assets/slack-dark-BthQWCQV.js +1 -0
- package/dist/assets/slack-ochin-DqwNpetd.js +1 -0
- package/dist/assets/{slides-component-CMKWJLfP.js → slides-component-EcjC8sDK.js} +1 -1
- package/dist/assets/smalltalk-CKvddXL8.js +1 -0
- package/dist/assets/snazzy-light-Bw305WKR.js +1 -0
- package/dist/assets/snippets-panel-Dco9h0rb.js +1 -0
- package/dist/assets/solarized-dark-DXbdFlpD.js +1 -0
- package/dist/assets/solarized-light-L9t79GZl.js +1 -0
- package/dist/assets/solidity-NK5CeKHG.js +1 -0
- package/dist/assets/{sortBy-4KXyROF_.js → sortBy-aLGA-PGK.js} +1 -1
- package/dist/assets/soy-BjzVbqVk.js +1 -0
- package/dist/assets/sparql-CLNNOQQI.js +1 -0
- package/dist/assets/splunk-CFtInczE.js +1 -0
- package/dist/assets/sql-BhJCBb_s.js +1 -0
- package/dist/assets/ssh-config-Dqsr-I88.js +1 -0
- package/dist/assets/stata-G4GYNNPE.js +1 -0
- package/dist/assets/stateDiagram-KXAO66HF-Bd68WT3b.js +1 -0
- package/dist/assets/stateDiagram-v2-UMBNRL4Z-BXz_GSwb.js +1 -0
- package/dist/assets/{storage-VLG_EHzh.js → storage-CGlP4lCF.js} +3 -3
- package/dist/assets/stylus-BeJftkpb.js +1 -0
- package/dist/assets/svelte-Dg-n8Id4.js +1 -0
- package/dist/assets/swift-CvVgI3Em.js +1 -0
- package/dist/assets/synthwave-84-ChtBzv_y.js +1 -0
- package/dist/assets/system-verilog-B3nElewZ.js +1 -0
- package/dist/assets/systemd-B7SlkmfE.js +1 -0
- package/dist/assets/talonscript-BrsbXmRy.js +1 -0
- package/dist/assets/tasl-CMkPZNj1.js +1 -0
- package/dist/assets/tcl-CiyEbZSK.js +1 -0
- package/dist/assets/templ-C0tOEwaA.js +1 -0
- package/dist/assets/{terminal-Wdc0-Jlz.js → terminal-CxkHubcu.js} +1 -1
- package/dist/assets/terraform-BUB-_BlF.js +1 -0
- package/dist/assets/tex-BGsfIjRo.js +1 -0
- package/dist/assets/{time-C5Wary3f.js → time-D2nr1UgQ.js} +1 -1
- package/dist/assets/{timeline-definition-XQNQX7LJ-D0VlQxOo.js → timeline-definition-XQNQX7LJ-BEaynAiY.js} +6 -6
- package/dist/assets/tokyo-night-hegEt444.js +1 -0
- package/dist/assets/toml-VldhK7iW.js +1 -0
- package/dist/assets/{tracing-DBzGH-b_.js → tracing-kTqHxa7q.js} +2 -2
- package/dist/assets/tracing-panel-BmuHLPrY.js +2 -0
- package/dist/assets/{trash-UWzp31DZ.js → trash-UBqfK4mR.js} +1 -1
- package/dist/assets/{tree-DPr9DmVF.js → tree-XiEycetl.js} +1 -1
- package/dist/assets/{treemap-75Q7IDZK-BpyhzZ5o.js → treemap-75Q7IDZK-CnuVFbBG.js} +1 -1
- package/dist/assets/ts-tags-CloPe9IY.js +1 -0
- package/dist/assets/tsv-BQ9ptESM.js +1 -0
- package/dist/assets/tsx-DYwE5ssU.js +1 -0
- package/dist/assets/turtle-BVy4HXn4.js +1 -0
- package/dist/assets/twig-D8xgA4Ji.js +1 -0
- package/dist/assets/typescript-C6YI4KwS.js +1 -0
- package/dist/assets/typespec-DDqafzeT.js +1 -0
- package/dist/assets/typst-JIZTSUoJ.js +1 -0
- package/dist/assets/v-CfE8ItaL.js +1 -0
- package/dist/assets/vala-p2PL1w-1.js +1 -0
- package/dist/assets/{variable-panel-DjFf6P8t.js → variable-panel-noTnH-AQ.js} +1 -1
- package/dist/assets/vb-Dv-GCw1m.js +1 -0
- package/dist/assets/vega-component-DsTH4tuX.js +1 -0
- package/dist/assets/verilog-DKP7kpC6.js +1 -0
- package/dist/assets/vesper-DU1UobuO.js +1 -0
- package/dist/assets/vhdl-Cog-DhcW.js +1 -0
- package/dist/assets/viml-0AN1aqkP.js +1 -0
- package/dist/assets/vitesse-black-Bkuqu6BP.js +1 -0
- package/dist/assets/vitesse-dark-D0r3Knsf.js +1 -0
- package/dist/assets/vitesse-light-CVO1_9PV.js +1 -0
- package/dist/assets/vue-ChwqA4lT.js +1 -0
- package/dist/assets/vue-html-DP_EF96N.js +1 -0
- package/dist/assets/vue-vine-K4R7Z1Ei.js +1 -0
- package/dist/assets/vyper-sB2l1MOO.js +1 -0
- package/dist/assets/wasm--yL7jHw-.js +1 -0
- package/dist/assets/wasm-CSAWeJiV.js +1 -0
- package/dist/assets/wenyan-CLHHXU5e.js +1 -0
- package/dist/assets/wgsl-DiTcYanS.js +1 -0
- package/dist/assets/wikitext-DT8E9qe0.js +1 -0
- package/dist/assets/wit-CtjT-RdY.js +1 -0
- package/dist/assets/wolfram-1xJNnwe2.js +1 -0
- package/dist/assets/worker-X5rxzQGQ.js +1 -0
- package/dist/assets/xml-BsgRw6d1.js +1 -0
- package/dist/assets/xsl-DCNnPbrB.js +1 -0
- package/dist/assets/{xychartDiagram-6GGTOJPD-E4W1u4ej.js → xychartDiagram-6GGTOJPD-Dcz3O-A3.js} +1 -1
- package/dist/assets/yaml-c2-Vhxho.js +1 -0
- package/dist/assets/zenscript-ChP1MlQf.js +1 -0
- package/dist/assets/zig-rivS3YQG.js +1 -0
- package/dist/index.html +2 -2
- package/package.json +6 -3
- package/src/components/ai/ai-provider-icon.tsx +5 -1
- package/src/components/chat/acp/__tests__/__snapshots__/prompt.test.ts.snap +304 -0
- package/src/components/chat/acp/__tests__/atoms.test.ts +56 -0
- package/src/components/chat/acp/__tests__/prompt.test.ts +12 -0
- package/src/components/chat/acp/__tests__/state.test.ts +621 -0
- package/src/components/chat/acp/agent-docs.tsx +78 -0
- package/src/components/chat/acp/agent-panel.css +23 -0
- package/src/components/chat/acp/agent-panel.tsx +715 -0
- package/src/components/chat/acp/agent-selector.tsx +138 -0
- package/src/components/chat/acp/blocks.tsx +664 -0
- package/src/components/chat/acp/common.tsx +198 -0
- package/src/components/chat/acp/prompt.ts +284 -0
- package/src/components/chat/acp/scroll-to-bottom-button.tsx +50 -0
- package/src/components/chat/acp/session-tabs.tsx +138 -0
- package/src/components/chat/acp/state.ts +263 -0
- package/src/components/chat/acp/thread.tsx +121 -0
- package/src/components/chat/acp/types.ts +63 -0
- package/src/components/chat/acp/utils.ts +45 -0
- package/src/components/chat/tool-call-accordion.tsx +1 -1
- package/src/components/editor/chrome/types.ts +10 -0
- package/src/components/editor/chrome/wrapper/app-chrome.tsx +17 -3
- package/src/core/config/feature-flag.tsx +2 -0
- package/src/plugins/impl/vega/vega.css +121 -0
- package/src/utils/Logger.ts +5 -6
- package/dist/assets/_baseEach-b7jKF32j.js +0 -1
- package/dist/assets/_baseMap-DACTv_oG.js +0 -1
- package/dist/assets/_baseUniq-DARYnBeS.js +0 -1
- package/dist/assets/_createAggregator-D2w-TTce.js +0 -1
- package/dist/assets/arc-ZB5pDULS.js +0 -1
- package/dist/assets/architectureDiagram-W76B3OCA-C3JRQ7yL.js +0 -36
- package/dist/assets/channel-BX-eVUbR.js +0 -1
- package/dist/assets/chat-panel-CFCVImGh.js +0 -34
- package/dist/assets/chunk-4BX2VUAB-BSBD21Hr.js +0 -1
- package/dist/assets/chunk-55IACEB6-C-pI4fDn.js +0 -1
- package/dist/assets/chunk-QN33PNHL-BaU4TJ76.js +0 -1
- package/dist/assets/chunk-QZHKN3VN-ChHKlyCz.js +0 -1
- package/dist/assets/classDiagram-KNZD7YFC-CXSeERCZ.js +0 -1
- package/dist/assets/classDiagram-v2-RKCZMP56-CXSeERCZ.js +0 -1
- package/dist/assets/clone-B0GDon06.js +0 -1
- package/dist/assets/cose-bilkent-S5V4N54A-BhnFxMKY.js +0 -1
- package/dist/assets/dagre-5GWH7T2D-BcbHFxhs.js +0 -4
- package/dist/assets/diagram-N5W7TBWH-CXogdFBb.js +0 -24
- package/dist/assets/diagram-QEK2KX5R-BpNMo7fW.js +0 -43
- package/dist/assets/diagram-S2PKOQOG-CWI07XEW.js +0 -24
- package/dist/assets/empty-state-BihAqBDu.js +0 -1
- package/dist/assets/file-explorer-panel-42yshMSG.js +0 -1
- package/dist/assets/gitGraphDiagram-NY62KEGX-Ce1EEDpB.js +0 -65
- package/dist/assets/graph-n-eoL6DT.js +0 -1
- package/dist/assets/index-0ZBpRFZW.js +0 -1
- package/dist/assets/index-Bm5j99kK.js +0 -7
- package/dist/assets/index-CMLEU4vI.js +0 -1
- package/dist/assets/index-CgtzsYeY.js +0 -1
- package/dist/assets/index-PsA_OWtk.js +0 -1
- package/dist/assets/index-a0QzZKmG.css +0 -1
- package/dist/assets/index-zdTab9tW.js +0 -1
- package/dist/assets/infoDiagram-STP46IZ2-BErnpd6u.js +0 -2
- package/dist/assets/linear-fPFwSU0H.js +0 -1
- package/dist/assets/links-xiQ_O8X2.js +0 -7
- package/dist/assets/min-ClQWkzzs.js +0 -1
- package/dist/assets/packages-panel-BeNG3M96.js +0 -1
- package/dist/assets/pieDiagram-ADFJNKIX-DbNp00N2.js +0 -30
- package/dist/assets/sankeyDiagram-GR3RE2ED-D7rChvzY.js +0 -10
- package/dist/assets/save-worker-IRA-wdDF.js +0 -1
- package/dist/assets/scratchpad-panel-qj2Bbf2w.js +0 -1
- package/dist/assets/secrets-panel-DxB6ux_Z.js +0 -1
- package/dist/assets/snippets-panel-CaclRXMo.js +0 -1
- package/dist/assets/stateDiagram-KXAO66HF-WnDNanSf.js +0 -1
- package/dist/assets/stateDiagram-v2-UMBNRL4Z-B2b4NZKb.js +0 -1
- package/dist/assets/tracing-panel-D839Di_w.js +0 -2
- package/dist/assets/vega-component-xHtaYq3O.js +0 -1
- package/dist/assets/worker-PaVjsxkz.js +0 -1
- /package/dist/assets/{transform-CDNfLgV5.js → transform-D9VCJYws.js} +0 -0
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { atom } from "jotai";
|
|
4
|
+
import { atomWithStorage } from "jotai/utils";
|
|
5
|
+
import { capitalize } from "lodash-es";
|
|
6
|
+
import type { TypedString } from "@/utils/typed";
|
|
7
|
+
import { generateUUID } from "@/utils/uuid";
|
|
8
|
+
import type { ExternalAgentSessionId, SessionSupportType } from "./types";
|
|
9
|
+
|
|
10
|
+
// Types
|
|
11
|
+
export type TabId = TypedString<"TabId">;
|
|
12
|
+
export type ExternalAgentId = "claude" | "gemini";
|
|
13
|
+
|
|
14
|
+
// No agents support loading sessions, so we limit to 1, otherwise
|
|
15
|
+
// this is confusing to the user when switching between sessions
|
|
16
|
+
const MAX_SESSIONS = 1;
|
|
17
|
+
|
|
18
|
+
export interface AgentSession {
|
|
19
|
+
tabId: TabId;
|
|
20
|
+
agentId: ExternalAgentId;
|
|
21
|
+
title: string;
|
|
22
|
+
createdAt: number;
|
|
23
|
+
lastUsedAt: number;
|
|
24
|
+
// Store the actual agent session ID for resumption
|
|
25
|
+
externalAgentSessionId: ExternalAgentSessionId | null;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface AgentSessionState {
|
|
29
|
+
sessions: AgentSession[];
|
|
30
|
+
activeTabId: TabId | null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Constants
|
|
34
|
+
const STORAGE_KEY = "marimo:acp:sessions:v1";
|
|
35
|
+
|
|
36
|
+
// Atoms
|
|
37
|
+
export const agentSessionStateAtom = atomWithStorage<AgentSessionState>(
|
|
38
|
+
STORAGE_KEY,
|
|
39
|
+
{
|
|
40
|
+
sessions: [],
|
|
41
|
+
activeTabId: null,
|
|
42
|
+
},
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
export const selectedTabAtom = atom(
|
|
46
|
+
(get) => {
|
|
47
|
+
const state = get(agentSessionStateAtom);
|
|
48
|
+
if (!state.activeTabId) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
return (
|
|
52
|
+
state.sessions.find((session) => session.tabId === state.activeTabId) ||
|
|
53
|
+
null
|
|
54
|
+
);
|
|
55
|
+
},
|
|
56
|
+
(_get, set, activeTabId: TabId | null) => {
|
|
57
|
+
set(agentSessionStateAtom, (prev) => ({
|
|
58
|
+
...prev,
|
|
59
|
+
activeTabId: activeTabId,
|
|
60
|
+
}));
|
|
61
|
+
},
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
// Utilities
|
|
65
|
+
function generateTabId(): TabId {
|
|
66
|
+
// Our tab ID for internal session management
|
|
67
|
+
return `tab_${generateUUID()}` as TabId;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function truncateTitle(title: string, maxLength = 20): string {
|
|
71
|
+
if (title.length <= maxLength) {
|
|
72
|
+
return title;
|
|
73
|
+
}
|
|
74
|
+
return `${title.slice(0, maxLength - 3)}...`;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function addSession(
|
|
78
|
+
state: AgentSessionState,
|
|
79
|
+
session: {
|
|
80
|
+
agentId: ExternalAgentId;
|
|
81
|
+
firstMessage?: string;
|
|
82
|
+
},
|
|
83
|
+
): AgentSessionState {
|
|
84
|
+
const sessionSupport = getAgentSessionSupport(session.agentId);
|
|
85
|
+
|
|
86
|
+
const now = Date.now();
|
|
87
|
+
const title = session.firstMessage
|
|
88
|
+
? truncateTitle(session.firstMessage.trim())
|
|
89
|
+
: `New ${session.agentId} session`;
|
|
90
|
+
const tabId = generateTabId();
|
|
91
|
+
|
|
92
|
+
if (sessionSupport === "single") {
|
|
93
|
+
// For single session agents, replace any existing session for this agent
|
|
94
|
+
const existingSessions = state.sessions.filter(
|
|
95
|
+
(s) => s.agentId === session.agentId,
|
|
96
|
+
);
|
|
97
|
+
const otherSessions = state.sessions.filter(
|
|
98
|
+
(s) => s.agentId !== session.agentId,
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
if (existingSessions.length > 0) {
|
|
102
|
+
// Replace the existing session (overwrite it)
|
|
103
|
+
const existingSession = existingSessions[0];
|
|
104
|
+
const updatedSession: AgentSession = {
|
|
105
|
+
agentId: session.agentId,
|
|
106
|
+
title,
|
|
107
|
+
createdAt: now,
|
|
108
|
+
lastUsedAt: now,
|
|
109
|
+
tabId: existingSession.tabId, // Keep the same ID to maintain tab reference
|
|
110
|
+
externalAgentSessionId: null, // Clear the external session ID
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
return {
|
|
114
|
+
...state,
|
|
115
|
+
sessions: [...otherSessions.slice(0, MAX_SESSIONS - 1), updatedSession],
|
|
116
|
+
activeTabId: updatedSession.tabId,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// For multiple session agents or when no existing session exists
|
|
122
|
+
return {
|
|
123
|
+
...state,
|
|
124
|
+
sessions: [
|
|
125
|
+
...state.sessions.slice(0, MAX_SESSIONS - 1),
|
|
126
|
+
{
|
|
127
|
+
agentId: session.agentId,
|
|
128
|
+
tabId,
|
|
129
|
+
title,
|
|
130
|
+
createdAt: now,
|
|
131
|
+
lastUsedAt: now,
|
|
132
|
+
externalAgentSessionId: null,
|
|
133
|
+
},
|
|
134
|
+
],
|
|
135
|
+
activeTabId: tabId,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export function removeSession(
|
|
140
|
+
state: AgentSessionState,
|
|
141
|
+
sessionId: TabId,
|
|
142
|
+
): AgentSessionState {
|
|
143
|
+
const filteredSessions = state.sessions.filter((s) => s.tabId !== sessionId);
|
|
144
|
+
const newActiveTabId =
|
|
145
|
+
state.activeTabId === sessionId
|
|
146
|
+
? filteredSessions.length > 0
|
|
147
|
+
? filteredSessions[filteredSessions.length - 1].tabId
|
|
148
|
+
: null
|
|
149
|
+
: state.activeTabId;
|
|
150
|
+
|
|
151
|
+
return {
|
|
152
|
+
sessions: filteredSessions,
|
|
153
|
+
activeTabId: newActiveTabId,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export function updateSessionTitle(
|
|
158
|
+
state: AgentSessionState,
|
|
159
|
+
title: string,
|
|
160
|
+
): AgentSessionState {
|
|
161
|
+
const selectedTab = state.activeTabId;
|
|
162
|
+
if (!selectedTab) {
|
|
163
|
+
return state;
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
...state,
|
|
167
|
+
sessions: state.sessions.map((session) =>
|
|
168
|
+
session.tabId === selectedTab
|
|
169
|
+
? { ...session, title: truncateTitle(title) }
|
|
170
|
+
: session,
|
|
171
|
+
),
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export function updateSessionLastUsed(
|
|
176
|
+
state: AgentSessionState,
|
|
177
|
+
sessionId: TabId,
|
|
178
|
+
): AgentSessionState {
|
|
179
|
+
return {
|
|
180
|
+
...state,
|
|
181
|
+
sessions: state.sessions.map((session) =>
|
|
182
|
+
session.tabId === sessionId
|
|
183
|
+
? { ...session, lastUsedAt: Date.now() }
|
|
184
|
+
: session,
|
|
185
|
+
),
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Update the sessionId for the current;y selected tab
|
|
191
|
+
*/
|
|
192
|
+
export function updateSessionExternalAgentSessionId(
|
|
193
|
+
state: AgentSessionState,
|
|
194
|
+
externalAgentSessionId: ExternalAgentSessionId,
|
|
195
|
+
): AgentSessionState {
|
|
196
|
+
const selectedTab = state.activeTabId;
|
|
197
|
+
if (!selectedTab) {
|
|
198
|
+
return state;
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
...state,
|
|
202
|
+
sessions: state.sessions.map((session) =>
|
|
203
|
+
session.tabId === selectedTab
|
|
204
|
+
? { ...session, externalAgentSessionId, lastUsedAt: Date.now() }
|
|
205
|
+
: session,
|
|
206
|
+
),
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
export function getSessionsByAgent(
|
|
211
|
+
sessions: AgentSession[],
|
|
212
|
+
agentId: ExternalAgentId,
|
|
213
|
+
): AgentSession[] {
|
|
214
|
+
return sessions
|
|
215
|
+
.filter((session) => session.agentId === agentId)
|
|
216
|
+
.sort((a, b) => b.lastUsedAt - a.lastUsedAt);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
export function getAllAgentIds(): ExternalAgentId[] {
|
|
220
|
+
return ["claude", "gemini"];
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
export function getAgentDisplayName(agentId: ExternalAgentId): string {
|
|
224
|
+
return capitalize(agentId);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
export function getAgentWebSocketUrl(agentId: ExternalAgentId): string {
|
|
228
|
+
return AGENT_CONFIG[agentId].webSocketUrl;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
interface AgentConfig {
|
|
232
|
+
port: number;
|
|
233
|
+
command: string;
|
|
234
|
+
webSocketUrl: string;
|
|
235
|
+
sessionSupport: SessionSupportType;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
const AGENT_CONFIG: Record<ExternalAgentId, AgentConfig> = {
|
|
239
|
+
claude: {
|
|
240
|
+
port: 3017,
|
|
241
|
+
command: "npx @zed-industries/claude-code-acp",
|
|
242
|
+
webSocketUrl: "ws://localhost:3017/message",
|
|
243
|
+
sessionSupport: "single",
|
|
244
|
+
},
|
|
245
|
+
gemini: {
|
|
246
|
+
port: 3019,
|
|
247
|
+
command: "npx @google/gemini-cli --experimental-acp",
|
|
248
|
+
webSocketUrl: "ws://localhost:3019/message",
|
|
249
|
+
sessionSupport: "single",
|
|
250
|
+
},
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
export function getAgentSessionSupport(
|
|
254
|
+
agentId: ExternalAgentId,
|
|
255
|
+
): SessionSupportType {
|
|
256
|
+
return AGENT_CONFIG[agentId].sessionSupport;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
export function getAgentConnectionCommand(agentId: ExternalAgentId): string {
|
|
260
|
+
const port = AGENT_CONFIG[agentId].port;
|
|
261
|
+
const command = AGENT_CONFIG[agentId].command;
|
|
262
|
+
return `npx supergateway --stdio\\\n "${command}" \\\n --outputTransport ws --port ${port} `;
|
|
263
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import React from "react";
|
|
4
|
+
import { groupNotifications } from "use-acp";
|
|
5
|
+
import {
|
|
6
|
+
ConnectionChangeBlock,
|
|
7
|
+
ErrorBlock,
|
|
8
|
+
SessionNotificationsBlock,
|
|
9
|
+
} from "./blocks";
|
|
10
|
+
|
|
11
|
+
type NotificationEvent = Awaited<
|
|
12
|
+
ReturnType<typeof groupNotifications>
|
|
13
|
+
>[number][number];
|
|
14
|
+
|
|
15
|
+
interface AgentThreadProps {
|
|
16
|
+
notifications: NotificationEvent[];
|
|
17
|
+
isConnected: boolean;
|
|
18
|
+
onRetryConnection?: () => void;
|
|
19
|
+
onRetryLastAction?: () => void;
|
|
20
|
+
onDismissError?: (errorId: string) => void;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export const AgentThread = ({
|
|
24
|
+
notifications,
|
|
25
|
+
isConnected,
|
|
26
|
+
onRetryConnection,
|
|
27
|
+
onRetryLastAction,
|
|
28
|
+
onDismissError,
|
|
29
|
+
}: AgentThreadProps) => {
|
|
30
|
+
let combinedNotifications = groupNotifications(notifications);
|
|
31
|
+
|
|
32
|
+
// Filter out all connection changes unless it is the last one
|
|
33
|
+
combinedNotifications = combinedNotifications.filter((group, index) => {
|
|
34
|
+
const isLast = index === combinedNotifications.length - 1;
|
|
35
|
+
if (isLast) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
if (isConnectionChangeGroup(group)) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
return true;
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
const renderNotification = (group: NotificationEvent[]) => {
|
|
45
|
+
if (group.length === 0) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (isErrorGroup(group)) {
|
|
50
|
+
const lastError = group[group.length - 1];
|
|
51
|
+
return (
|
|
52
|
+
<ErrorBlock
|
|
53
|
+
key={lastError.id}
|
|
54
|
+
data={lastError.data}
|
|
55
|
+
onRetry={onRetryLastAction}
|
|
56
|
+
onDismiss={
|
|
57
|
+
onDismissError ? () => onDismissError(lastError.id) : undefined
|
|
58
|
+
}
|
|
59
|
+
/>
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
if (isConnectionChangeGroup(group)) {
|
|
63
|
+
const lastConnectionChange = group[group.length - 1];
|
|
64
|
+
return (
|
|
65
|
+
<ConnectionChangeBlock
|
|
66
|
+
key={lastConnectionChange.id}
|
|
67
|
+
data={lastConnectionChange.data}
|
|
68
|
+
isConnected={isConnected}
|
|
69
|
+
onRetry={onRetryConnection}
|
|
70
|
+
timestamp={lastConnectionChange.timestamp}
|
|
71
|
+
/>
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
if (isSessionNotificationGroup(group)) {
|
|
75
|
+
const startTimestamp = group[0].timestamp;
|
|
76
|
+
const endTimestamp = group[group.length - 1].timestamp;
|
|
77
|
+
const data = group.map((item) => item.data.update);
|
|
78
|
+
return (
|
|
79
|
+
<SessionNotificationsBlock
|
|
80
|
+
data={data}
|
|
81
|
+
startTimestamp={startTimestamp}
|
|
82
|
+
endTimestamp={endTimestamp}
|
|
83
|
+
/>
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
return "Unknown notification type";
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
return (
|
|
90
|
+
<div className="flex flex-col gap-4 px-2 pb-10">
|
|
91
|
+
{combinedNotifications.map((notification) => (
|
|
92
|
+
<React.Fragment key={notification[0].id}>
|
|
93
|
+
{renderNotification(notification)}
|
|
94
|
+
</React.Fragment>
|
|
95
|
+
))}
|
|
96
|
+
</div>
|
|
97
|
+
);
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
function isErrorGroup(
|
|
101
|
+
group: NotificationEvent[],
|
|
102
|
+
): group is Array<Extract<NotificationEvent, { type: "error" }>> {
|
|
103
|
+
// We only check the first since we know the group is the same type
|
|
104
|
+
return group[0].type === "error";
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function isConnectionChangeGroup(
|
|
108
|
+
group: NotificationEvent[],
|
|
109
|
+
): group is Array<Extract<NotificationEvent, { type: "connection_change" }>> {
|
|
110
|
+
// We only check the first since we know the group is the same type
|
|
111
|
+
return group[0].type === "connection_change";
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function isSessionNotificationGroup(
|
|
115
|
+
group: NotificationEvent[],
|
|
116
|
+
): group is Array<
|
|
117
|
+
Extract<NotificationEvent, { type: "session_notification" }>
|
|
118
|
+
> {
|
|
119
|
+
// We only check the first since we know the group is the same type
|
|
120
|
+
return group[0].type === "session_notification";
|
|
121
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
|
+
import type { ContentBlock } from "@zed-industries/agent-client-protocol";
|
|
3
|
+
import type { groupNotifications, useAcpClient } from "use-acp";
|
|
4
|
+
|
|
5
|
+
export type NotificationEvent = Awaited<
|
|
6
|
+
ReturnType<typeof groupNotifications>
|
|
7
|
+
>[number][number];
|
|
8
|
+
|
|
9
|
+
export type AgentConnectionState = ReturnType<
|
|
10
|
+
typeof useAcpClient
|
|
11
|
+
>["connectionState"];
|
|
12
|
+
|
|
13
|
+
export type AgentPendingPermission = ReturnType<
|
|
14
|
+
typeof useAcpClient
|
|
15
|
+
>["pendingPermission"];
|
|
16
|
+
|
|
17
|
+
// Notification events
|
|
18
|
+
|
|
19
|
+
export type ErrorNotificationEvent = Extract<
|
|
20
|
+
NotificationEvent,
|
|
21
|
+
{ type: "error" }
|
|
22
|
+
>;
|
|
23
|
+
export type ConnectionChangeNotificationEvent = Extract<
|
|
24
|
+
NotificationEvent,
|
|
25
|
+
{ type: "connection_change" }
|
|
26
|
+
>;
|
|
27
|
+
export type SessionNotificationEvent = Extract<
|
|
28
|
+
NotificationEvent,
|
|
29
|
+
{ type: "session_notification" }
|
|
30
|
+
>;
|
|
31
|
+
|
|
32
|
+
// Session notification events
|
|
33
|
+
|
|
34
|
+
export type SessionNotificationEventData =
|
|
35
|
+
SessionNotificationEvent["data"]["update"];
|
|
36
|
+
export type SessionNotificationEventType =
|
|
37
|
+
SessionNotificationEventData["sessionUpdate"];
|
|
38
|
+
|
|
39
|
+
export type NotificationDataOf<T extends SessionNotificationEventType> =
|
|
40
|
+
Extract<SessionNotificationEventData, { sessionUpdate: T }>;
|
|
41
|
+
|
|
42
|
+
// Session notification event data
|
|
43
|
+
|
|
44
|
+
export type UserNotificationEvent = NotificationDataOf<"user_message_chunk">;
|
|
45
|
+
export type AgentNotificationEvent = NotificationDataOf<"agent_message_chunk">;
|
|
46
|
+
export type AgentThoughtNotificationEvent =
|
|
47
|
+
NotificationDataOf<"agent_thought_chunk">;
|
|
48
|
+
export type ToolCallNotificationEvent = NotificationDataOf<"tool_call">;
|
|
49
|
+
export type ToolCallUpdateNotificationEvent =
|
|
50
|
+
NotificationDataOf<"tool_call_update">;
|
|
51
|
+
export type PlanNotificationEvent = NotificationDataOf<"plan">;
|
|
52
|
+
|
|
53
|
+
export type ContentBlockType = ContentBlock["type"];
|
|
54
|
+
export type ContentBlockOf<T extends ContentBlockType> = Extract<
|
|
55
|
+
ContentBlock,
|
|
56
|
+
{ type: T }
|
|
57
|
+
>;
|
|
58
|
+
|
|
59
|
+
// Agent session support types
|
|
60
|
+
export type SessionSupportType = "single" | "multiple";
|
|
61
|
+
export type ExternalAgentSessionId = NonNullable<
|
|
62
|
+
ReturnType<typeof useAcpClient>["activeSessionId"]
|
|
63
|
+
>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
|
+
import type { NotificationDataOf, SessionNotificationEventData } from "./types";
|
|
3
|
+
|
|
4
|
+
export function isToolCalls(
|
|
5
|
+
group: SessionNotificationEventData[],
|
|
6
|
+
): group is Array<NotificationDataOf<"tool_call" | "tool_call_update">> {
|
|
7
|
+
// We only check the first since we know the group is the same type
|
|
8
|
+
const first = group[0];
|
|
9
|
+
return (
|
|
10
|
+
first.sessionUpdate === "tool_call" ||
|
|
11
|
+
first.sessionUpdate === "tool_call_update"
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function isAgentThoughts(
|
|
16
|
+
group: SessionNotificationEventData[],
|
|
17
|
+
): group is Array<NotificationDataOf<"agent_thought_chunk">> {
|
|
18
|
+
// We only check the first since we know the group is the same type
|
|
19
|
+
const first = group[0];
|
|
20
|
+
return first.sessionUpdate === "agent_thought_chunk";
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function isUserMessages(
|
|
24
|
+
group: SessionNotificationEventData[],
|
|
25
|
+
): group is Array<NotificationDataOf<"user_message_chunk">> {
|
|
26
|
+
// We only check the first since we know the group is the same type
|
|
27
|
+
const first = group[0];
|
|
28
|
+
return first.sessionUpdate === "user_message_chunk";
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function isAgentMessages(
|
|
32
|
+
group: SessionNotificationEventData[],
|
|
33
|
+
): group is Array<NotificationDataOf<"agent_message_chunk">> {
|
|
34
|
+
// We only check the first since we know the group is the same type
|
|
35
|
+
const first = group[0];
|
|
36
|
+
return first.sessionUpdate === "agent_message_chunk";
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function isPlans(
|
|
40
|
+
group: SessionNotificationEventData[],
|
|
41
|
+
): group is Array<NotificationDataOf<"plan">> {
|
|
42
|
+
// We only check the first since we know the group is the same type
|
|
43
|
+
const first = group[0];
|
|
44
|
+
return first.sessionUpdate === "plan";
|
|
45
|
+
}
|
|
@@ -65,7 +65,7 @@ export const ToolCallAccordion: React.FC<ToolCallAccordionProps> = ({
|
|
|
65
65
|
key={`tool-${index}`}
|
|
66
66
|
type="single"
|
|
67
67
|
collapsible={true}
|
|
68
|
-
className="w-full
|
|
68
|
+
className="w-full"
|
|
69
69
|
>
|
|
70
70
|
<AccordionItem value="tool-call" className="border-0">
|
|
71
71
|
<AccordionTrigger
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
FileTextIcon,
|
|
9
9
|
FolderTreeIcon,
|
|
10
10
|
FunctionSquareIcon,
|
|
11
|
+
HatGlassesIcon,
|
|
11
12
|
KeyRoundIcon,
|
|
12
13
|
type LucideIcon,
|
|
13
14
|
NetworkIcon,
|
|
@@ -17,6 +18,7 @@ import {
|
|
|
17
18
|
TextSearchIcon,
|
|
18
19
|
XCircleIcon,
|
|
19
20
|
} from "lucide-react";
|
|
21
|
+
import { getFeatureFlag } from "@/core/config/feature-flag";
|
|
20
22
|
import { isWasm } from "@/core/wasm/utils";
|
|
21
23
|
|
|
22
24
|
export type PanelType =
|
|
@@ -32,6 +34,7 @@ export type PanelType =
|
|
|
32
34
|
| "datasources"
|
|
33
35
|
| "scratchpad"
|
|
34
36
|
| "chat"
|
|
37
|
+
| "agents"
|
|
35
38
|
| "secrets"
|
|
36
39
|
| "logs";
|
|
37
40
|
|
|
@@ -86,6 +89,13 @@ export const PANELS: PanelDescriptor[] = [
|
|
|
86
89
|
tooltip: "Chat with AI",
|
|
87
90
|
position: "sidebar",
|
|
88
91
|
},
|
|
92
|
+
{
|
|
93
|
+
type: "agents",
|
|
94
|
+
Icon: HatGlassesIcon,
|
|
95
|
+
tooltip: "Agents",
|
|
96
|
+
position: "sidebar",
|
|
97
|
+
hidden: !getFeatureFlag("external_agents"),
|
|
98
|
+
},
|
|
89
99
|
{
|
|
90
100
|
type: "documentation",
|
|
91
101
|
Icon: TextSearchIcon,
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
|
-
import React, {
|
|
2
|
+
import React, {
|
|
3
|
+
type PropsWithChildren,
|
|
4
|
+
Suspense,
|
|
5
|
+
useEffect,
|
|
6
|
+
useId,
|
|
7
|
+
} from "react";
|
|
3
8
|
import {
|
|
4
9
|
type ImperativePanelHandle,
|
|
5
10
|
Panel,
|
|
@@ -25,6 +30,9 @@ import { handleDragging } from "./utils";
|
|
|
25
30
|
|
|
26
31
|
const LazyTerminal = React.lazy(() => import("@/components/terminal/terminal"));
|
|
27
32
|
const LazyChatPanel = React.lazy(() => import("@/components/chat/chat-panel"));
|
|
33
|
+
const LazyAgentPanel = React.lazy(
|
|
34
|
+
() => import("@/components/chat/acp/agent-panel"),
|
|
35
|
+
);
|
|
28
36
|
const LazyDependencyGraphPanel = React.lazy(
|
|
29
37
|
() => import("@/components/editor/chrome/panels/dependency-graph-panel"),
|
|
30
38
|
);
|
|
@@ -55,6 +63,9 @@ export const AppChrome: React.FC<PropsWithChildren> = ({ children }) => {
|
|
|
55
63
|
const sidebarRef = React.useRef<ImperativePanelHandle>(null);
|
|
56
64
|
const terminalRef = React.useRef<ImperativePanelHandle>(null);
|
|
57
65
|
|
|
66
|
+
const helperPanelId = useId();
|
|
67
|
+
const terminalPanelId = useId();
|
|
68
|
+
|
|
58
69
|
// sync sidebar
|
|
59
70
|
useEffect(() => {
|
|
60
71
|
if (!sidebarRef.current) {
|
|
@@ -161,6 +172,7 @@ export const AppChrome: React.FC<PropsWithChildren> = ({ children }) => {
|
|
|
161
172
|
{selectedPanel === "snippets" && <LazySnippetsPanel />}
|
|
162
173
|
{selectedPanel === "scratchpad" && <LazyScratchpadPanel />}
|
|
163
174
|
{selectedPanel === "chat" && <LazyChatPanel />}
|
|
175
|
+
{selectedPanel === "agents" && <LazyAgentPanel />}
|
|
164
176
|
{selectedPanel === "logs" && <LazyLogsPanel />}
|
|
165
177
|
{selectedPanel === "tracing" && <LazyTracingPanel />}
|
|
166
178
|
{selectedPanel === "secrets" && <LazySecretsPanel />}
|
|
@@ -173,7 +185,8 @@ export const AppChrome: React.FC<PropsWithChildren> = ({ children }) => {
|
|
|
173
185
|
const helperPanel = (
|
|
174
186
|
<Panel
|
|
175
187
|
ref={sidebarRef}
|
|
176
|
-
id=
|
|
188
|
+
id={`helper-${helperPanelId}`}
|
|
189
|
+
data-testid="helper"
|
|
177
190
|
key={"helper"}
|
|
178
191
|
collapsedSize={0}
|
|
179
192
|
collapsible={true}
|
|
@@ -203,7 +216,8 @@ export const AppChrome: React.FC<PropsWithChildren> = ({ children }) => {
|
|
|
203
216
|
const terminalPanel = (
|
|
204
217
|
<Panel
|
|
205
218
|
ref={terminalRef}
|
|
206
|
-
id=
|
|
219
|
+
id={`terminal-${terminalPanelId}`}
|
|
220
|
+
data-testid="terminal"
|
|
207
221
|
key={"terminal"}
|
|
208
222
|
collapsedSize={0}
|
|
209
223
|
collapsible={true}
|
|
@@ -13,6 +13,7 @@ export interface ExperimentalFeatures {
|
|
|
13
13
|
performant_table_charts: boolean;
|
|
14
14
|
mcp_docs: boolean;
|
|
15
15
|
sql_linter: boolean;
|
|
16
|
+
external_agents: boolean;
|
|
16
17
|
// Add new feature flags here
|
|
17
18
|
}
|
|
18
19
|
|
|
@@ -24,6 +25,7 @@ const defaultValues: ExperimentalFeatures = {
|
|
|
24
25
|
performant_table_charts: false,
|
|
25
26
|
mcp_docs: false,
|
|
26
27
|
sql_linter: false,
|
|
28
|
+
external_agents: import.meta.env.DEV,
|
|
27
29
|
};
|
|
28
30
|
|
|
29
31
|
export function getFeatureFlag<T extends keyof ExperimentalFeatures>(
|