@marimo-team/frontend 0.15.3 → 0.15.5

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.
Files changed (474) hide show
  1. package/dist/assets/{ConnectedDataExplorerComponent-D-5E8ink.js → ConnectedDataExplorerComponent-Cn5-l2X1.js} +2 -2
  2. package/dist/assets/{ImageComparisonComponent-lZA6EaZ7.js → ImageComparisonComponent-CEXMKKA4.js} +1 -1
  3. package/dist/assets/{VegaLite-C80SZuda.js → VegaLite-Bt14Ds9k.js} +6 -6
  4. package/dist/assets/_baseEach-C1FLm7WW.js +1 -0
  5. package/dist/assets/_baseMap-DBVArUYD.js +1 -0
  6. package/dist/assets/_baseUniq-Dk7ZPJ3N.js +1 -0
  7. package/dist/assets/_createAggregator-Bn38fDd3.js +1 -0
  8. package/dist/assets/abap-DnJxzdy9.js +1 -0
  9. package/dist/assets/actionscript-3-CKUqbIUM.js +1 -0
  10. package/dist/assets/ada-iG1FnIvR.js +1 -0
  11. package/dist/assets/agent-panel-COUYnuIK.js +475 -0
  12. package/dist/assets/agent-panel-DpQ6muj-.css +1 -0
  13. package/dist/assets/andromeeda-C-Jbm3Hp.js +1 -0
  14. package/dist/assets/angular-html-BZhSV2-l.js +1 -0
  15. package/dist/assets/angular-ts-DRQ-j7PL.js +1 -0
  16. package/dist/assets/{any-language-editor-Cn0Ju0SA.js → any-language-editor-DiwNT6zp.js} +1 -1
  17. package/dist/assets/apache-CdTKWnKT.js +1 -0
  18. package/dist/assets/apex-3xxtq2mv.js +1 -0
  19. package/dist/assets/apl-BnBkWLuz.js +1 -0
  20. package/dist/assets/applescript-BlLNmGTp.js +1 -0
  21. package/dist/assets/ara-Ba3fhlsS.js +1 -0
  22. package/dist/assets/arc-Cuwikxov.js +1 -0
  23. package/dist/assets/architectureDiagram-W76B3OCA-DBzWQKKu.js +36 -0
  24. package/dist/assets/asciidoc-XTVL4-GN.js +1 -0
  25. package/dist/assets/asm-CHX6lpGW.js +1 -0
  26. package/dist/assets/astro-CXYfh229.js +1 -0
  27. package/dist/assets/aurora-x-D-2ljcwZ.js +1 -0
  28. package/dist/assets/awk-XRrwoikR.js +1 -0
  29. package/dist/assets/ayu-dark-Cv9koXgw.js +1 -0
  30. package/dist/assets/ballerina-Dh0JsEtz.js +1 -0
  31. package/dist/assets/bat-BVu0TwaT.js +1 -0
  32. package/dist/assets/beancount-BuQJKJpV.js +1 -0
  33. package/dist/assets/berry-D4qT7XM1.js +1 -0
  34. package/dist/assets/{between-horizontal-start-BrmUizGs.js → between-horizontal-start-FyewyCGn.js} +1 -1
  35. package/dist/assets/bibtex-CGjxJ4Zd.js +1 -0
  36. package/dist/assets/bicep-DysT5qaJ.js +1 -0
  37. package/dist/assets/blade-CkGRa-l8.js +1 -0
  38. package/dist/assets/{blockDiagram-QIGZ2CNN-D08JxTYL.js → blockDiagram-QIGZ2CNN-BrOkAf_c.js} +4 -4
  39. package/dist/assets/bsl-DGicdwC0.js +1 -0
  40. package/dist/assets/c-BmJt9k-y.js +1 -0
  41. package/dist/assets/{c4Diagram-FPNF74CW-B5Ki5s6c.js → c4Diagram-FPNF74CW-BHPzDxE2.js} +1 -1
  42. package/dist/assets/cadence-CWn_mfEc.js +1 -0
  43. package/dist/assets/cairo-Dz8fl918.js +1 -0
  44. package/dist/assets/catppuccin-frappe-BBxmzUt6.js +1 -0
  45. package/dist/assets/catppuccin-latte-Jep7L2Wt.js +1 -0
  46. package/dist/assets/catppuccin-macchiato-CIUZ1G5V.js +1 -0
  47. package/dist/assets/catppuccin-mocha-NBseiqgx.js +1 -0
  48. package/dist/assets/channel-CjhbjOv4.js +1 -0
  49. package/dist/assets/chat-panel-BPXKoTnZ.js +7 -0
  50. package/dist/assets/chunk-4BX2VUAB-DLxaCNYh.js +1 -0
  51. package/dist/assets/chunk-55IACEB6-DdzvO3HR.js +1 -0
  52. package/dist/assets/{chunk-FMBD7UC4-CPtXh_Tc.js → chunk-FMBD7UC4-R5o-nSiG.js} +1 -1
  53. package/dist/assets/{chunk-K7UQS3LO-H1GayBnp.js → chunk-K7UQS3LO-DxaMrGgG.js} +1 -1
  54. package/dist/assets/chunk-QN33PNHL-DqS9-FYm.js +1 -0
  55. package/dist/assets/chunk-QZHKN3VN-BZ-TzajS.js +1 -0
  56. package/dist/assets/{chunk-TVAH2DTR-CKpRI29L.js → chunk-TVAH2DTR-BsgP2dyv.js} +5 -5
  57. package/dist/assets/{chunk-TZMSLE5B-CnU05RC1.js → chunk-TZMSLE5B-D-h3ahXI.js} +1 -1
  58. package/dist/assets/{circle-play-Dizu3hR4.js → circle-play-CQtRZ-rT.js} +1 -1
  59. package/dist/assets/clarity-DF5_RAtY.js +1 -0
  60. package/dist/assets/classDiagram-KNZD7YFC-DHs5cFzy.js +1 -0
  61. package/dist/assets/classDiagram-v2-RKCZMP56-DHs5cFzy.js +1 -0
  62. package/dist/assets/{clear-button-BASAgaZM.js → clear-button-BY6Z_ViL.js} +1 -1
  63. package/dist/assets/clojure-BjI0Knrv.js +1 -0
  64. package/dist/assets/clone-DM1YNjEn.js +1 -0
  65. package/dist/assets/cmake-BYiqpiH1.js +1 -0
  66. package/dist/assets/cobol-Dt3m7Jkx.js +1 -0
  67. package/dist/assets/codeowners-L91meNbn.js +1 -0
  68. package/dist/assets/codeql-Cd-JFsJB.js +1 -0
  69. package/dist/assets/coffee-DgxxYT5L.js +1 -0
  70. package/dist/assets/{command-palette-6abbxoUb.js → command-palette-S0bzQp7v.js} +1 -1
  71. package/dist/assets/{common-BxprsFNA.js → common-B8U9k2Ly.js} +1 -1
  72. package/dist/assets/common-lisp-DOi1njVG.js +1 -0
  73. package/dist/assets/{compile-BGXIlCMz.js → compile-Ct_jzdKr.js} +1 -1
  74. package/dist/assets/coq-BfbrVLCY.js +1 -0
  75. package/dist/assets/cose-bilkent-S5V4N54A-wz1Sfx7j.js +1 -0
  76. package/dist/assets/cpp-BmKY377x.js +1 -0
  77. package/dist/assets/crystal-DB6V90z1.js +1 -0
  78. package/dist/assets/csharp-yFVQ185C.js +1 -0
  79. package/dist/assets/css-l46fsARh.js +1 -0
  80. package/dist/assets/csv-DXKU4rRd.js +1 -0
  81. package/dist/assets/cue-zmT78Agv.js +1 -0
  82. package/dist/assets/cypher-bkHSskm3.js +1 -0
  83. package/dist/assets/d-vs9xsbRV.js +1 -0
  84. package/dist/assets/dagre-5GWH7T2D-BfpcVBgq.js +4 -0
  85. package/dist/assets/dark-plus-C3mMm8J8.js +1 -0
  86. package/dist/assets/dart-BMkYYGiN.js +1 -0
  87. package/dist/assets/{data-grid-overlay-editor-CJkpT222.js → data-grid-overlay-editor-BN_wulc3.js} +1 -1
  88. package/dist/assets/{datasources-panel-HITG8eye.js → datasources-panel-DfuURLJw.js} +1 -1
  89. package/dist/assets/dax-D135z3aS.js +1 -0
  90. package/dist/assets/{dependency-graph-panel-D9np9LSb.js → dependency-graph-panel-BOmSCZf7.js} +4 -4
  91. package/dist/assets/desktop-CigPEpQ5.js +1 -0
  92. package/dist/assets/diagram-N5W7TBWH-Bf0oqqQh.js +24 -0
  93. package/dist/assets/diagram-QEK2KX5R-ZTc3qikh.js +43 -0
  94. package/dist/assets/diagram-S2PKOQOG-tLScBy7Z.js +24 -0
  95. package/dist/assets/diff-Beq1YlA8.js +1 -0
  96. package/dist/assets/docker-V5Al5bpF.js +1 -0
  97. package/dist/assets/{documentation-panel-bTy-gCid.js → documentation-panel-BxjJO_Gw.js} +1 -1
  98. package/dist/assets/dotenv-D9G8sA2m.js +1 -0
  99. package/dist/assets/dracula-BzJJZx-M.js +1 -0
  100. package/dist/assets/dracula-soft-BXkSAIEj.js +1 -0
  101. package/dist/assets/dream-maker-BsoKROiO.js +1 -0
  102. package/dist/assets/edge-Brl-y200.js +1 -0
  103. package/dist/assets/{edit-page-DVsJ5OUI.js → edit-page-DJ8kJZ9w.js} +35 -35
  104. package/dist/assets/elixir-CGzfkNtR.js +1 -0
  105. package/dist/assets/{ellipsis-vertical-GW_YrU8C.js → ellipsis-vertical-UHbmjI2n.js} +1 -1
  106. package/dist/assets/elm-DmpuOW2E.js +1 -0
  107. package/dist/assets/emacs-lisp-BcpYGiHp.js +1 -0
  108. package/dist/assets/empty-state-BIBXzY_0.js +1 -0
  109. package/dist/assets/{erDiagram-AWTI2OKA-lCwUhmIf.js → erDiagram-AWTI2OKA-E84mAle_.js} +1 -1
  110. package/dist/assets/erb-BNAqOH5i.js +1 -0
  111. package/dist/assets/erlang-DAw79KxH.js +1 -0
  112. package/dist/assets/{error-panel-Cnlgqo61.js → error-panel-MEvQ6K7h.js} +2 -2
  113. package/dist/assets/everforest-dark-BgDCqdQA.js +1 -0
  114. package/dist/assets/everforest-light-C8M2exoo.js +1 -0
  115. package/dist/assets/fennel-qzPJJAAI.js +1 -0
  116. package/dist/assets/file-explorer-panel-CzNUJ63G.js +1 -0
  117. package/dist/assets/fish-BTv9qkVe.js +1 -0
  118. package/dist/assets/{flowDiagram-PVAE7QVJ-DnG1jaGB.js → flowDiagram-PVAE7QVJ-DfbIRSAW.js} +1 -1
  119. package/dist/assets/fluent-BsukS3Co.js +1 -0
  120. package/dist/assets/fortran-fixed-form-D_2otJTs.js +1 -0
  121. package/dist/assets/fortran-free-form-Ix_0F1Zz.js +1 -0
  122. package/dist/assets/fsharp-DmSnwM-W.js +1 -0
  123. package/dist/assets/{ganttDiagram-OWAHRB6G-CX39q7PN.js → ganttDiagram-OWAHRB6G-DR4HZ1z_.js} +3 -3
  124. package/dist/assets/gdresource-BLuZCTp3.js +1 -0
  125. package/dist/assets/gdscript-fffAh1pn.js +1 -0
  126. package/dist/assets/gdshader-BC7WJXp9.js +1 -0
  127. package/dist/assets/genie-IZOju1hG.js +1 -0
  128. package/dist/assets/gherkin-DUpgZfGr.js +1 -0
  129. package/dist/assets/git-commit-Bptnmh-c.js +1 -0
  130. package/dist/assets/git-rebase-CqNhyBhE.js +1 -0
  131. package/dist/assets/gitGraphDiagram-NY62KEGX-C1t6QtVa.js +65 -0
  132. package/dist/assets/github-dark-DHJKELXO.js +1 -0
  133. package/dist/assets/github-dark-default-Cuk6v7N8.js +1 -0
  134. package/dist/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
  135. package/dist/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
  136. package/dist/assets/github-light-DAi9KRSo.js +1 -0
  137. package/dist/assets/github-light-default-D7oLnXFd.js +1 -0
  138. package/dist/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
  139. package/dist/assets/gleam-CCCEh_av.js +1 -0
  140. package/dist/assets/{glide-data-editor-l-bMUJyX.js → glide-data-editor-nNmo1lPq.js} +11 -11
  141. package/dist/assets/glimmer-js-CamsSOgS.js +1 -0
  142. package/dist/assets/glimmer-ts-DpQMos9P.js +1 -0
  143. package/dist/assets/glsl-BDbjGBhJ.js +1 -0
  144. package/dist/assets/gnuplot-D0FoiB-W.js +1 -0
  145. package/dist/assets/go-BR7YH85S.js +1 -0
  146. package/dist/assets/graph-CssCVWIq.js +1 -0
  147. package/dist/assets/graphql-DMns_A3G.js +1 -0
  148. package/dist/assets/groovy-D9sPn4Z-.js +1 -0
  149. package/dist/assets/gruvbox-dark-hard-D1uDOp7C.js +1 -0
  150. package/dist/assets/gruvbox-dark-medium-DkhsQLT2.js +1 -0
  151. package/dist/assets/gruvbox-dark-soft-CcyOm34o.js +1 -0
  152. package/dist/assets/gruvbox-light-hard-DKzvysjW.js +1 -0
  153. package/dist/assets/gruvbox-light-medium-DPcUKYIF.js +1 -0
  154. package/dist/assets/gruvbox-light-soft-CGqH5EJj.js +1 -0
  155. package/dist/assets/hack-CXH7pT2m.js +1 -0
  156. package/dist/assets/haml-DiuhmbKg.js +1 -0
  157. package/dist/assets/handlebars-PuluTGUb.js +1 -0
  158. package/dist/assets/haskell-Cp0NQEkn.js +1 -0
  159. package/dist/assets/haxe-D-PmAGDa.js +1 -0
  160. package/dist/assets/hcl-DRMo6eis.js +1 -0
  161. package/dist/assets/hjson-BPEpXUFQ.js +1 -0
  162. package/dist/assets/hlsl-B-PjNM4a.js +1 -0
  163. package/dist/assets/{home-page-B1kjvR5n.js → home-page-9eW6qida.js} +3 -3
  164. package/dist/assets/houston-DnULxvSX.js +1 -0
  165. package/dist/assets/html-ReiWYoHo.js +1 -0
  166. package/dist/assets/html-derivative-BEFkAAPd.js +1 -0
  167. package/dist/assets/http-BPFbEDC3.js +1 -0
  168. package/dist/assets/hxml-DB3_nACV.js +1 -0
  169. package/dist/assets/hy-CLIvbAhW.js +1 -0
  170. package/dist/assets/imba-B-tO30Ge.js +1 -0
  171. package/dist/assets/{index-DXC6BC43.js → index-B1_GXGaP.js} +1 -1
  172. package/dist/assets/index-B7yXbrLa.js +1 -0
  173. package/dist/assets/{index-CuFO3AB8.js → index-B8llrTSo.js} +1 -1
  174. package/dist/assets/{index-Co5sPjJc.js → index-BAH034Ue.js} +1 -1
  175. package/dist/assets/{index-Dut0n0LK.js → index-BFSnz7iM.js} +1 -1
  176. package/dist/assets/{index-ByYzywJk.js → index-BLu5CX6z.js} +1 -1
  177. package/dist/assets/index-Bq516OmX.js +1 -0
  178. package/dist/assets/index-CB2pnVQG.js +1 -0
  179. package/dist/assets/{index-QpAlOfLT.js → index-CPN7TRA1.js} +1 -1
  180. package/dist/assets/{index-C5GV-DhP.js → index-CSgxTUzD.js} +1 -1
  181. package/dist/assets/index-CknhX2Vy.css +1 -0
  182. package/dist/assets/index-DMomwMcN.js +1 -0
  183. package/dist/assets/{index-OdZ649Ww.js → index-DSU75csX.js} +1 -1
  184. package/dist/assets/{index-DXqCSfYv.js → index-DWOaniGT.js} +1 -1
  185. package/dist/assets/index-DcCIe7np.js +28 -0
  186. package/dist/assets/index-DqzMPAC8.js +7 -0
  187. package/dist/assets/{index-BTeNT_Tt.js → index-Dt9UWeWn.js} +1 -1
  188. package/dist/assets/{index-CuVt_RTJ.js → index-DyLSuOH1.js} +1 -1
  189. package/dist/assets/{index-StZz2sD-.js → index-OC46250R.js} +175 -175
  190. package/dist/assets/{index-DAhZ64xY.js → index-VPWqq2Pg.js} +1 -1
  191. package/dist/assets/index-c6If577Q.js +1 -0
  192. package/dist/assets/{index-CiKUoc5G.js → index-uacyUula.js} +1 -1
  193. package/dist/assets/infoDiagram-STP46IZ2-CwiAoz9f.js +2 -0
  194. package/dist/assets/ini-Bpxu4Zsc.js +1 -0
  195. package/dist/assets/java-DtRXFtDl.js +1 -0
  196. package/dist/assets/javascript-CY0YvwoL.js +1 -0
  197. package/dist/assets/jinja-CXJbPSuL.js +1 -0
  198. package/dist/assets/jison-iRP-Iv-P.js +1 -0
  199. package/dist/assets/{journeyDiagram-BIP6EPQ6-Ducmkxc0.js → journeyDiagram-BIP6EPQ6-BBiFyygf.js} +1 -1
  200. package/dist/assets/json-LWN7Ml79.js +1 -0
  201. package/dist/assets/json5-CgCB487x.js +1 -0
  202. package/dist/assets/jsonc-BXrjvC_e.js +1 -0
  203. package/dist/assets/jsonl-D5dm1SHP.js +1 -0
  204. package/dist/assets/jsonnet-B60UklUs.js +1 -0
  205. package/dist/assets/jssm-CsqlGknB.js +1 -0
  206. package/dist/assets/jsx-g2NrEQII.js +1 -0
  207. package/dist/assets/julia-BabrhEml.js +1 -0
  208. package/dist/assets/kanagawa-dragon-CkXjmgJE.js +1 -0
  209. package/dist/assets/kanagawa-lotus-CfQXZHmo.js +1 -0
  210. package/dist/assets/kanagawa-wave-DWedfzmr.js +1 -0
  211. package/dist/assets/{kanban-definition-6OIFK2YF-Drd9VUQq.js → kanban-definition-6OIFK2YF-DhgA6Nt6.js} +5 -5
  212. package/dist/assets/kotlin-DiV2Dt9D.js +1 -0
  213. package/dist/assets/kusto-KSLuQd98.js +1 -0
  214. package/dist/assets/laserwave-DUszq2jm.js +1 -0
  215. package/dist/assets/latex-CCwiU5tQ.js +1 -0
  216. package/dist/assets/{layout-DYVxODOR.js → layout-DpQrxGW-.js} +1 -1
  217. package/dist/assets/lean-C20waPKk.js +1 -0
  218. package/dist/assets/less-DKKxO4Pm.js +1 -0
  219. package/dist/assets/light-plus-B7mTdjB0.js +1 -0
  220. package/dist/assets/linear-NsreOeBF.js +1 -0
  221. package/dist/assets/links-CbvGxbsJ.js +7 -0
  222. package/dist/assets/liquid-QTP3a8yd.js +1 -0
  223. package/dist/assets/llvm-CfjccL00.js +1 -0
  224. package/dist/assets/log-CnKjEmrw.js +1 -0
  225. package/dist/assets/logo-BmG1tMr6.js +1 -0
  226. package/dist/assets/{logs-panel-BdZwSU1-.js → logs-panel-B9SmTZAW.js} +1 -1
  227. package/dist/assets/lua-B09NiSMa.js +1 -0
  228. package/dist/assets/luau-C2pF66fA.js +1 -0
  229. package/dist/assets/make-Ccm3NI5i.js +1 -0
  230. package/dist/assets/markdown-DY93LJPj.js +1 -0
  231. package/dist/assets/marko-CgCapwG0.js +1 -0
  232. package/dist/assets/material-theme-D5KoaKCx.js +1 -0
  233. package/dist/assets/material-theme-darker-BfHTSMKl.js +1 -0
  234. package/dist/assets/material-theme-lighter-B0m2ddpp.js +1 -0
  235. package/dist/assets/material-theme-ocean-CyktbL80.js +1 -0
  236. package/dist/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
  237. package/dist/assets/matlab-nYX3zffi.js +1 -0
  238. package/dist/assets/mdc-CVidKc4b.js +1 -0
  239. package/dist/assets/mdx-C8C9IGe9.js +1 -0
  240. package/dist/assets/mermaid-DSt0r6IQ.js +1 -0
  241. package/dist/assets/mermaid-ZuTRVWig.js +1 -0
  242. package/dist/assets/{mermaid-JltzhJwZ.js → mermaid.core-4nVOEVX3.js} +44 -44
  243. package/dist/assets/min-D259kI3t.js +1 -0
  244. package/dist/assets/min-dark-CafNBF8u.js +1 -0
  245. package/dist/assets/min-light-CTRr51gU.js +1 -0
  246. package/dist/assets/{mindmap-definition-Q6HEUPPD-DVMI0DKx.js → mindmap-definition-Q6HEUPPD-CVLQNn1q.js} +1 -1
  247. package/dist/assets/mipsasm-BjAqecqh.js +1 -0
  248. package/dist/assets/mojo-gr1MWCNv.js +1 -0
  249. package/dist/assets/monokai-D4h5O-jR.js +1 -0
  250. package/dist/assets/move-BJN6DhLB.js +1 -0
  251. package/dist/assets/narrat-BTSicUR-.js +1 -0
  252. package/dist/assets/nextflow-CvZ2-N7x.js +1 -0
  253. package/dist/assets/nginx-CtwUG8yW.js +1 -0
  254. package/dist/assets/night-owl-C39BiMTA.js +1 -0
  255. package/dist/assets/nim-BCqJOqd2.js +1 -0
  256. package/dist/assets/nix-DiXPdoNa.js +1 -0
  257. package/dist/assets/nord-Ddv68eIx.js +1 -0
  258. package/dist/assets/{number-overlay-editor-BolEVFqu.js → number-overlay-editor-CzRzXLcd.js} +1 -1
  259. package/dist/assets/nushell-a9nsepcr.js +1 -0
  260. package/dist/assets/objective-c-DLT9zZoE.js +1 -0
  261. package/dist/assets/objective-cpp-DKXr-AK_.js +1 -0
  262. package/dist/assets/ocaml-DP9q6K5L.js +1 -0
  263. package/dist/assets/one-dark-pro-DVMEJ2y_.js +1 -0
  264. package/dist/assets/one-light-PoHY5YXO.js +1 -0
  265. package/dist/assets/{outline-panel-CmQbujCA.js → outline-panel-uvsS-YEQ.js} +1 -1
  266. package/dist/assets/packages-panel-xMz9W2hW.js +1 -0
  267. package/dist/assets/pascal-DjTTLVNS.js +1 -0
  268. package/dist/assets/perl-Da10OPbb.js +1 -0
  269. package/dist/assets/php-hSYFjEJr.js +1 -0
  270. package/dist/assets/pieDiagram-ADFJNKIX-C5IQ5DBZ.js +30 -0
  271. package/dist/assets/plastic-3e1v2bzS.js +1 -0
  272. package/dist/assets/plsql-CJrHCTnj.js +1 -0
  273. package/dist/assets/po-y5MdiEbo.js +1 -0
  274. package/dist/assets/poimandres-CS3Unz2-.js +1 -0
  275. package/dist/assets/polar-Bsx6RkUC.js +1 -0
  276. package/dist/assets/postcss-CeUBPB2S.js +1 -0
  277. package/dist/assets/powerquery-CW27I574.js +1 -0
  278. package/dist/assets/powershell-DSYJ6xcj.js +1 -0
  279. package/dist/assets/prisma-CLoN-gBj.js +1 -0
  280. package/dist/assets/prolog-Bgt5DHUA.js +1 -0
  281. package/dist/assets/proto-BVbLr_ub.js +1 -0
  282. package/dist/assets/pug-DYUvS0f2.js +1 -0
  283. package/dist/assets/puppet-TSkl_nn0.js +1 -0
  284. package/dist/assets/purescript-BrDje9qL.js +1 -0
  285. package/dist/assets/python-DlV7vnVD.js +1 -0
  286. package/dist/assets/qml-DiX3J200.js +1 -0
  287. package/dist/assets/qmldir-CSZk7E48.js +1 -0
  288. package/dist/assets/qss-DACx-k9g.js +1 -0
  289. package/dist/assets/{quadrantDiagram-LMRXKWRM-C3KUHV9E.js → quadrantDiagram-LMRXKWRM-CFXFnQxx.js} +2 -2
  290. package/dist/assets/r-C1kzXVmM.js +1 -0
  291. package/dist/assets/racket-D1nq-KeH.js +1 -0
  292. package/dist/assets/raku-DocPDKZq.js +1 -0
  293. package/dist/assets/razor-7Qmv-3mF.js +1 -0
  294. package/dist/assets/{react-plotly-D8t1Fm8s.js → react-plotly-mzdv02_Y.js} +1 -1
  295. package/dist/assets/red-bN70gL4F.js +1 -0
  296. package/dist/assets/reg-5ydmJHEw.js +1 -0
  297. package/dist/assets/regexp-CpyjTnFF.js +1 -0
  298. package/dist/assets/rel-D68lwU-3.js +1 -0
  299. package/dist/assets/{requirementDiagram-4UW4RH46-COaNtrVe.js → requirementDiagram-4UW4RH46-D9bPC89T.js} +3 -3
  300. package/dist/assets/riscv-Cl4WfXj6.js +1 -0
  301. package/dist/assets/rose-pine-BHrmToEH.js +1 -0
  302. package/dist/assets/rose-pine-dawn-CnK8MTSM.js +1 -0
  303. package/dist/assets/rose-pine-moon-NleAzG8P.js +1 -0
  304. package/dist/assets/rst-DU5WA_Li.js +1 -0
  305. package/dist/assets/ruby-DJftxM78.js +1 -0
  306. package/dist/assets/{run-page-k_GylS9j.js → run-page-Bb68qdhQ.js} +1 -1
  307. package/dist/assets/rust-DpWcZSqc.js +1 -0
  308. package/dist/assets/sankeyDiagram-GR3RE2ED-BSJOau8E.js +10 -0
  309. package/dist/assets/sas-BBCK0tAG.js +1 -0
  310. package/dist/assets/sass-DY_rGA2-.js +1 -0
  311. package/dist/assets/save-worker-B386kalt.js +1 -0
  312. package/dist/assets/scala-CYRsmRER.js +1 -0
  313. package/dist/assets/scheme-C45fPb3F.js +1 -0
  314. package/dist/assets/scratchpad-panel-BF4BO-U4.js +1 -0
  315. package/dist/assets/scss-CHxzYwli.js +1 -0
  316. package/dist/assets/sdbl-BpucmfEo.js +1 -0
  317. package/dist/assets/secrets-panel-CdIX44dQ.js +1 -0
  318. package/dist/assets/{sequenceDiagram-C3RYC4MD-BEe1Fsqh.js → sequenceDiagram-C3RYC4MD-6N7_hY4k.js} +1 -1
  319. package/dist/assets/shaderlab-DNyPh2Q6.js +1 -0
  320. package/dist/assets/shellscript-B8OHlvmy.js +1 -0
  321. package/dist/assets/shellsession-OATBsyRD.js +1 -0
  322. package/dist/assets/slack-dark-BthQWCQV.js +1 -0
  323. package/dist/assets/slack-ochin-DqwNpetd.js +1 -0
  324. package/dist/assets/{slides-component-CMKWJLfP.js → slides-component-EcjC8sDK.js} +1 -1
  325. package/dist/assets/smalltalk-CKvddXL8.js +1 -0
  326. package/dist/assets/snazzy-light-Bw305WKR.js +1 -0
  327. package/dist/assets/snippets-panel-Dco9h0rb.js +1 -0
  328. package/dist/assets/solarized-dark-DXbdFlpD.js +1 -0
  329. package/dist/assets/solarized-light-L9t79GZl.js +1 -0
  330. package/dist/assets/solidity-NK5CeKHG.js +1 -0
  331. package/dist/assets/{sortBy-4KXyROF_.js → sortBy-aLGA-PGK.js} +1 -1
  332. package/dist/assets/soy-BjzVbqVk.js +1 -0
  333. package/dist/assets/sparql-CLNNOQQI.js +1 -0
  334. package/dist/assets/splunk-CFtInczE.js +1 -0
  335. package/dist/assets/sql-BhJCBb_s.js +1 -0
  336. package/dist/assets/ssh-config-Dqsr-I88.js +1 -0
  337. package/dist/assets/stata-G4GYNNPE.js +1 -0
  338. package/dist/assets/stateDiagram-KXAO66HF-Bd68WT3b.js +1 -0
  339. package/dist/assets/stateDiagram-v2-UMBNRL4Z-BXz_GSwb.js +1 -0
  340. package/dist/assets/{storage-VLG_EHzh.js → storage-CGlP4lCF.js} +3 -3
  341. package/dist/assets/stylus-BeJftkpb.js +1 -0
  342. package/dist/assets/svelte-Dg-n8Id4.js +1 -0
  343. package/dist/assets/swift-CvVgI3Em.js +1 -0
  344. package/dist/assets/synthwave-84-ChtBzv_y.js +1 -0
  345. package/dist/assets/system-verilog-B3nElewZ.js +1 -0
  346. package/dist/assets/systemd-B7SlkmfE.js +1 -0
  347. package/dist/assets/talonscript-BrsbXmRy.js +1 -0
  348. package/dist/assets/tasl-CMkPZNj1.js +1 -0
  349. package/dist/assets/tcl-CiyEbZSK.js +1 -0
  350. package/dist/assets/templ-C0tOEwaA.js +1 -0
  351. package/dist/assets/{terminal-Wdc0-Jlz.js → terminal-CxkHubcu.js} +1 -1
  352. package/dist/assets/terraform-BUB-_BlF.js +1 -0
  353. package/dist/assets/tex-BGsfIjRo.js +1 -0
  354. package/dist/assets/{time-C5Wary3f.js → time-D2nr1UgQ.js} +1 -1
  355. package/dist/assets/{timeline-definition-XQNQX7LJ-D0VlQxOo.js → timeline-definition-XQNQX7LJ-BEaynAiY.js} +6 -6
  356. package/dist/assets/tokyo-night-hegEt444.js +1 -0
  357. package/dist/assets/toml-VldhK7iW.js +1 -0
  358. package/dist/assets/{tracing-DBzGH-b_.js → tracing-kTqHxa7q.js} +2 -2
  359. package/dist/assets/tracing-panel-BmuHLPrY.js +2 -0
  360. package/dist/assets/{trash-UWzp31DZ.js → trash-UBqfK4mR.js} +1 -1
  361. package/dist/assets/{tree-DPr9DmVF.js → tree-XiEycetl.js} +1 -1
  362. package/dist/assets/{treemap-75Q7IDZK-BpyhzZ5o.js → treemap-75Q7IDZK-CnuVFbBG.js} +1 -1
  363. package/dist/assets/ts-tags-CloPe9IY.js +1 -0
  364. package/dist/assets/tsv-BQ9ptESM.js +1 -0
  365. package/dist/assets/tsx-DYwE5ssU.js +1 -0
  366. package/dist/assets/turtle-BVy4HXn4.js +1 -0
  367. package/dist/assets/twig-D8xgA4Ji.js +1 -0
  368. package/dist/assets/typescript-C6YI4KwS.js +1 -0
  369. package/dist/assets/typespec-DDqafzeT.js +1 -0
  370. package/dist/assets/typst-JIZTSUoJ.js +1 -0
  371. package/dist/assets/v-CfE8ItaL.js +1 -0
  372. package/dist/assets/vala-p2PL1w-1.js +1 -0
  373. package/dist/assets/{variable-panel-DjFf6P8t.js → variable-panel-noTnH-AQ.js} +1 -1
  374. package/dist/assets/vb-Dv-GCw1m.js +1 -0
  375. package/dist/assets/vega-component-DsTH4tuX.js +1 -0
  376. package/dist/assets/verilog-DKP7kpC6.js +1 -0
  377. package/dist/assets/vesper-DU1UobuO.js +1 -0
  378. package/dist/assets/vhdl-Cog-DhcW.js +1 -0
  379. package/dist/assets/viml-0AN1aqkP.js +1 -0
  380. package/dist/assets/vitesse-black-Bkuqu6BP.js +1 -0
  381. package/dist/assets/vitesse-dark-D0r3Knsf.js +1 -0
  382. package/dist/assets/vitesse-light-CVO1_9PV.js +1 -0
  383. package/dist/assets/vue-ChwqA4lT.js +1 -0
  384. package/dist/assets/vue-html-DP_EF96N.js +1 -0
  385. package/dist/assets/vue-vine-K4R7Z1Ei.js +1 -0
  386. package/dist/assets/vyper-sB2l1MOO.js +1 -0
  387. package/dist/assets/wasm--yL7jHw-.js +1 -0
  388. package/dist/assets/wasm-CSAWeJiV.js +1 -0
  389. package/dist/assets/wenyan-CLHHXU5e.js +1 -0
  390. package/dist/assets/wgsl-DiTcYanS.js +1 -0
  391. package/dist/assets/wikitext-DT8E9qe0.js +1 -0
  392. package/dist/assets/wit-CtjT-RdY.js +1 -0
  393. package/dist/assets/wolfram-1xJNnwe2.js +1 -0
  394. package/dist/assets/worker-X5rxzQGQ.js +1 -0
  395. package/dist/assets/xml-BsgRw6d1.js +1 -0
  396. package/dist/assets/xsl-DCNnPbrB.js +1 -0
  397. package/dist/assets/{xychartDiagram-6GGTOJPD-E4W1u4ej.js → xychartDiagram-6GGTOJPD-Dcz3O-A3.js} +1 -1
  398. package/dist/assets/yaml-c2-Vhxho.js +1 -0
  399. package/dist/assets/zenscript-ChP1MlQf.js +1 -0
  400. package/dist/assets/zig-rivS3YQG.js +1 -0
  401. package/dist/index.html +2 -2
  402. package/package.json +6 -3
  403. package/src/components/ai/ai-provider-icon.tsx +5 -1
  404. package/src/components/chat/acp/__tests__/__snapshots__/prompt.test.ts.snap +304 -0
  405. package/src/components/chat/acp/__tests__/atoms.test.ts +56 -0
  406. package/src/components/chat/acp/__tests__/prompt.test.ts +12 -0
  407. package/src/components/chat/acp/__tests__/state.test.ts +621 -0
  408. package/src/components/chat/acp/agent-docs.tsx +78 -0
  409. package/src/components/chat/acp/agent-panel.css +23 -0
  410. package/src/components/chat/acp/agent-panel.tsx +715 -0
  411. package/src/components/chat/acp/agent-selector.tsx +138 -0
  412. package/src/components/chat/acp/blocks.tsx +664 -0
  413. package/src/components/chat/acp/common.tsx +198 -0
  414. package/src/components/chat/acp/prompt.ts +284 -0
  415. package/src/components/chat/acp/scroll-to-bottom-button.tsx +50 -0
  416. package/src/components/chat/acp/session-tabs.tsx +138 -0
  417. package/src/components/chat/acp/state.ts +263 -0
  418. package/src/components/chat/acp/thread.tsx +121 -0
  419. package/src/components/chat/acp/types.ts +63 -0
  420. package/src/components/chat/acp/utils.ts +45 -0
  421. package/src/components/chat/tool-call-accordion.tsx +1 -1
  422. package/src/components/editor/chrome/types.ts +10 -0
  423. package/src/components/editor/chrome/wrapper/app-chrome.tsx +17 -3
  424. package/src/core/config/feature-flag.tsx +2 -0
  425. package/src/plugins/impl/vega/vega.css +121 -0
  426. package/src/utils/Logger.ts +5 -6
  427. package/dist/assets/_baseEach-b7jKF32j.js +0 -1
  428. package/dist/assets/_baseMap-DACTv_oG.js +0 -1
  429. package/dist/assets/_baseUniq-DARYnBeS.js +0 -1
  430. package/dist/assets/_createAggregator-D2w-TTce.js +0 -1
  431. package/dist/assets/arc-ZB5pDULS.js +0 -1
  432. package/dist/assets/architectureDiagram-W76B3OCA-C3JRQ7yL.js +0 -36
  433. package/dist/assets/channel-BX-eVUbR.js +0 -1
  434. package/dist/assets/chat-panel-CFCVImGh.js +0 -34
  435. package/dist/assets/chunk-4BX2VUAB-BSBD21Hr.js +0 -1
  436. package/dist/assets/chunk-55IACEB6-C-pI4fDn.js +0 -1
  437. package/dist/assets/chunk-QN33PNHL-BaU4TJ76.js +0 -1
  438. package/dist/assets/chunk-QZHKN3VN-ChHKlyCz.js +0 -1
  439. package/dist/assets/classDiagram-KNZD7YFC-CXSeERCZ.js +0 -1
  440. package/dist/assets/classDiagram-v2-RKCZMP56-CXSeERCZ.js +0 -1
  441. package/dist/assets/clone-B0GDon06.js +0 -1
  442. package/dist/assets/cose-bilkent-S5V4N54A-BhnFxMKY.js +0 -1
  443. package/dist/assets/dagre-5GWH7T2D-BcbHFxhs.js +0 -4
  444. package/dist/assets/diagram-N5W7TBWH-CXogdFBb.js +0 -24
  445. package/dist/assets/diagram-QEK2KX5R-BpNMo7fW.js +0 -43
  446. package/dist/assets/diagram-S2PKOQOG-CWI07XEW.js +0 -24
  447. package/dist/assets/empty-state-BihAqBDu.js +0 -1
  448. package/dist/assets/file-explorer-panel-42yshMSG.js +0 -1
  449. package/dist/assets/gitGraphDiagram-NY62KEGX-Ce1EEDpB.js +0 -65
  450. package/dist/assets/graph-n-eoL6DT.js +0 -1
  451. package/dist/assets/index-0ZBpRFZW.js +0 -1
  452. package/dist/assets/index-Bm5j99kK.js +0 -7
  453. package/dist/assets/index-CMLEU4vI.js +0 -1
  454. package/dist/assets/index-CgtzsYeY.js +0 -1
  455. package/dist/assets/index-PsA_OWtk.js +0 -1
  456. package/dist/assets/index-a0QzZKmG.css +0 -1
  457. package/dist/assets/index-zdTab9tW.js +0 -1
  458. package/dist/assets/infoDiagram-STP46IZ2-BErnpd6u.js +0 -2
  459. package/dist/assets/linear-fPFwSU0H.js +0 -1
  460. package/dist/assets/links-xiQ_O8X2.js +0 -7
  461. package/dist/assets/min-ClQWkzzs.js +0 -1
  462. package/dist/assets/packages-panel-BeNG3M96.js +0 -1
  463. package/dist/assets/pieDiagram-ADFJNKIX-DbNp00N2.js +0 -30
  464. package/dist/assets/sankeyDiagram-GR3RE2ED-D7rChvzY.js +0 -10
  465. package/dist/assets/save-worker-IRA-wdDF.js +0 -1
  466. package/dist/assets/scratchpad-panel-qj2Bbf2w.js +0 -1
  467. package/dist/assets/secrets-panel-DxB6ux_Z.js +0 -1
  468. package/dist/assets/snippets-panel-CaclRXMo.js +0 -1
  469. package/dist/assets/stateDiagram-KXAO66HF-WnDNanSf.js +0 -1
  470. package/dist/assets/stateDiagram-v2-UMBNRL4Z-B2b4NZKb.js +0 -1
  471. package/dist/assets/tracing-panel-D839Di_w.js +0 -2
  472. package/dist/assets/vega-component-xHtaYq3O.js +0 -1
  473. package/dist/assets/worker-PaVjsxkz.js +0 -1
  474. /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 my-4"
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, { type PropsWithChildren, Suspense, useEffect } from "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="helper"
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="terminal"
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>(