@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,715 @@
1
+ /* Copyright 2024 Marimo. All rights reserved. */
2
+
3
+ import { useAtom } from "jotai";
4
+ import { capitalize } from "lodash-es";
5
+ import {
6
+ BotMessageSquareIcon,
7
+ RefreshCwIcon,
8
+ StopCircleIcon,
9
+ } from "lucide-react";
10
+ import React, { memo, useEffect, useRef, useState } from "react";
11
+ import useEvent from "react-use-event-hook";
12
+ import { useAcpClient } from "use-acp";
13
+ import {
14
+ ConnectionStatus,
15
+ PermissionRequest,
16
+ } from "@/components/chat/acp/common";
17
+ import { PromptInput } from "@/components/editor/ai/add-cell-with-ai";
18
+ import { PanelEmptyState } from "@/components/editor/chrome/panels/empty-state";
19
+ import { Spinner } from "@/components/icons/spinner";
20
+ import { Button } from "@/components/ui/button";
21
+ import { cn } from "@/utils/cn";
22
+ import { Logger } from "@/utils/Logger";
23
+ import { AgentDocs } from "./agent-docs";
24
+ import { AgentSelector } from "./agent-selector";
25
+ import ScrollToBottomButton from "./scroll-to-bottom-button";
26
+ import { SessionTabs } from "./session-tabs";
27
+ import {
28
+ agentSessionStateAtom,
29
+ type ExternalAgentId,
30
+ getAgentWebSocketUrl,
31
+ selectedTabAtom,
32
+ updateSessionExternalAgentSessionId,
33
+ updateSessionTitle,
34
+ } from "./state";
35
+ import { AgentThread } from "./thread";
36
+ import "./agent-panel.css";
37
+ import type {
38
+ ReadTextFileResponse,
39
+ RequestPermissionResponse,
40
+ WriteTextFileResponse,
41
+ } from "@zed-industries/agent-client-protocol";
42
+ import { toast } from "@/components/ui/use-toast";
43
+ import { useRequestClient } from "@/core/network/requests";
44
+ import { filenameAtom } from "@/core/saving/file-state";
45
+ import { store } from "@/core/state/jotai";
46
+ import { Functions } from "@/utils/functions";
47
+ import { Paths } from "@/utils/paths";
48
+ import { getAgentPrompt } from "./prompt";
49
+ import type {
50
+ AgentConnectionState,
51
+ AgentPendingPermission,
52
+ ExternalAgentSessionId,
53
+ NotificationEvent,
54
+ } from "./types";
55
+
56
+ const logger = Logger.get("agents");
57
+
58
+ interface AgentTitleProps {
59
+ currentAgentId?: ExternalAgentId;
60
+ }
61
+
62
+ const AgentTitle = memo<AgentTitleProps>(({ currentAgentId }) => (
63
+ <span className="text-sm font-medium">
64
+ {currentAgentId ? capitalize(currentAgentId) : "Agents"}
65
+ </span>
66
+ ));
67
+ AgentTitle.displayName = "AgentTitle";
68
+
69
+ interface ConnectionControlProps {
70
+ connectionState: AgentConnectionState;
71
+ onConnect: () => void;
72
+ onDisconnect: () => void;
73
+ }
74
+
75
+ const ConnectionControl = memo<ConnectionControlProps>(
76
+ ({ connectionState, onConnect, onDisconnect }) => {
77
+ const isConnected = connectionState.status === "connected";
78
+
79
+ return (
80
+ <Button
81
+ variant="outline"
82
+ size="xs"
83
+ onClick={isConnected ? onDisconnect : onConnect}
84
+ disabled={connectionState.status === "connecting"}
85
+ >
86
+ {isConnected ? "Disconnect" : "Connect"}
87
+ </Button>
88
+ );
89
+ },
90
+ );
91
+ ConnectionControl.displayName = "ConnectionControl";
92
+
93
+ interface HeaderInfoProps {
94
+ currentAgentId?: ExternalAgentId;
95
+ connectionStatus: string;
96
+ shouldShowConnectionControl?: boolean;
97
+ }
98
+
99
+ const HeaderInfo = memo<HeaderInfoProps>(
100
+ ({ currentAgentId, connectionStatus, shouldShowConnectionControl }) => (
101
+ <div className="flex items-center gap-2">
102
+ <BotMessageSquareIcon className="h-4 w-4 text-muted-foreground" />
103
+ <AgentTitle currentAgentId={currentAgentId} />
104
+ {shouldShowConnectionControl && (
105
+ <ConnectionStatus status={connectionStatus} />
106
+ )}
107
+ </div>
108
+ ),
109
+ );
110
+ HeaderInfo.displayName = "HeaderInfo";
111
+
112
+ interface AgentPanelHeaderProps {
113
+ connectionState: AgentConnectionState;
114
+ currentAgentId?: ExternalAgentId;
115
+ onConnect: () => void;
116
+ onDisconnect: () => void;
117
+ onRestartThread?: () => void;
118
+ hasActiveSession?: boolean;
119
+ shouldShowConnectionControl?: boolean;
120
+ }
121
+
122
+ const AgentPanelHeader = memo<AgentPanelHeaderProps>(
123
+ ({
124
+ connectionState,
125
+ currentAgentId,
126
+ onConnect,
127
+ onDisconnect,
128
+ onRestartThread,
129
+ hasActiveSession,
130
+ shouldShowConnectionControl,
131
+ }) => (
132
+ <div className="flex border-b px-3 py-2 justify-between shrink-0 items-center">
133
+ <HeaderInfo
134
+ currentAgentId={currentAgentId}
135
+ connectionStatus={connectionState.status}
136
+ shouldShowConnectionControl={shouldShowConnectionControl}
137
+ />
138
+ <div className="flex items-center gap-2">
139
+ {hasActiveSession &&
140
+ connectionState.status === "connected" &&
141
+ onRestartThread && (
142
+ <Button
143
+ variant="outline"
144
+ size="xs"
145
+ onClick={onRestartThread}
146
+ title="Restart thread (create new session)"
147
+ >
148
+ <RefreshCwIcon className="h-3 w-3 mr-1" />
149
+ Restart
150
+ </Button>
151
+ )}
152
+
153
+ {shouldShowConnectionControl && (
154
+ <ConnectionControl
155
+ connectionState={connectionState}
156
+ onConnect={onConnect}
157
+ onDisconnect={onDisconnect}
158
+ />
159
+ )}
160
+ </div>
161
+ </div>
162
+ ),
163
+ );
164
+ AgentPanelHeader.displayName = "AgentPanelHeader";
165
+
166
+ interface EmptyStateProps {
167
+ currentAgentId?: ExternalAgentId;
168
+ connectionState: AgentConnectionState;
169
+ onConnect: () => void;
170
+ onDisconnect: () => void;
171
+ }
172
+
173
+ const EmptyState = memo<EmptyStateProps>(
174
+ ({ currentAgentId, connectionState, onConnect, onDisconnect }) => (
175
+ <div className="flex flex-col h-full">
176
+ <AgentPanelHeader
177
+ connectionState={connectionState}
178
+ currentAgentId={currentAgentId}
179
+ onConnect={onConnect}
180
+ onDisconnect={onDisconnect}
181
+ hasActiveSession={false}
182
+ />
183
+ <SessionTabs />
184
+ <div className="flex-1 flex items-center justify-center p-6">
185
+ <div className="max-w-md w-full space-y-6">
186
+ <PanelEmptyState
187
+ title="No Agent Sessions"
188
+ description="Create a new session to start a conversation"
189
+ action={<AgentSelector className="border-y-1 rounded" />}
190
+ icon={<BotMessageSquareIcon />}
191
+ />
192
+ {connectionState.status === "disconnected" && (
193
+ <AgentDocs
194
+ className="border-t pt-6"
195
+ title="Connect to an agent"
196
+ description="Start agents by running these commands in your terminal:"
197
+ />
198
+ )}
199
+ </div>
200
+ </div>
201
+ </div>
202
+ ),
203
+ );
204
+ EmptyState.displayName = "EmptyState";
205
+
206
+ interface LoadingIndicatorProps {
207
+ isLoading: boolean;
208
+ isRequestingPermission: boolean;
209
+ onStop: () => void;
210
+ }
211
+
212
+ const LoadingIndicator = memo<LoadingIndicatorProps>(
213
+ ({ isLoading, isRequestingPermission, onStop }) => {
214
+ if (!isLoading) {
215
+ return null;
216
+ }
217
+
218
+ return (
219
+ <div className="px-3 py-2 border-t bg-muted/30 flex-shrink-0">
220
+ <div className="flex items-center justify-between text-xs text-muted-foreground">
221
+ <div className="flex items-center gap-2">
222
+ <Spinner size="small" className="text-primary" />
223
+ {isRequestingPermission ? (
224
+ <span>Waiting for permission to continue...</span>
225
+ ) : (
226
+ <span>Agent is working...</span>
227
+ )}
228
+ </div>
229
+ <div className="flex items-center gap-2">
230
+ <Button
231
+ size="sm"
232
+ variant="outline"
233
+ onClick={onStop}
234
+ className="h-6 px-2"
235
+ >
236
+ <StopCircleIcon className="h-3 w-3 mr-1" />
237
+ <span className="text-xs">Stop</span>
238
+ </Button>
239
+ </div>
240
+ </div>
241
+ </div>
242
+ );
243
+ },
244
+ );
245
+ LoadingIndicator.displayName = "LoadingIndicator";
246
+
247
+ interface PromptAreaProps {
248
+ isLoading: boolean;
249
+ activeSessionId: ExternalAgentSessionId | null;
250
+ promptValue: string;
251
+ onPromptValueChange: (value: string) => void;
252
+ onPromptSubmit: (e: KeyboardEvent | undefined, prompt: string) => void;
253
+ }
254
+
255
+ const PromptArea = memo<PromptAreaProps>(
256
+ ({
257
+ isLoading,
258
+ activeSessionId,
259
+ promptValue,
260
+ onPromptValueChange,
261
+ onPromptSubmit,
262
+ }) => (
263
+ <div
264
+ className={cn(
265
+ "px-3 py-2 border-t bg-background flex-shrink-0 min-h-[80px]",
266
+ (isLoading || !activeSessionId) && "opacity-50 pointer-events-none",
267
+ )}
268
+ >
269
+ <PromptInput
270
+ value={promptValue}
271
+ onChange={isLoading ? Functions.NOOP : onPromptValueChange}
272
+ onSubmit={onPromptSubmit}
273
+ onClose={Functions.NOOP}
274
+ placeholder={isLoading ? "Processing..." : "Ask your AI agent..."}
275
+ className={isLoading ? "opacity-50 pointer-events-none" : ""}
276
+ maxHeight="120px"
277
+ />
278
+ </div>
279
+ ),
280
+ );
281
+ PromptArea.displayName = "PromptArea";
282
+
283
+ interface ChatContentProps {
284
+ hasNotifications: boolean;
285
+ connectionState: AgentConnectionState;
286
+ sessionId: ExternalAgentSessionId | null;
287
+ notifications: NotificationEvent[];
288
+ pendingPermission: AgentPendingPermission;
289
+ onResolvePermission: (option: unknown) => void;
290
+ onRetryConnection?: () => void;
291
+ onRetryLastAction?: () => void;
292
+ onDismissError?: (errorId: string) => void;
293
+ }
294
+
295
+ const ChatContent = memo<ChatContentProps>(
296
+ ({
297
+ hasNotifications,
298
+ connectionState,
299
+ notifications,
300
+ pendingPermission,
301
+ onResolvePermission,
302
+ onRetryConnection,
303
+ onRetryLastAction,
304
+ onDismissError,
305
+ sessionId,
306
+ }) => {
307
+ const [isScrolledToBottom, setIsScrolledToBottom] = useState(true);
308
+ const scrollContainerRef = useRef<HTMLDivElement>(null);
309
+
310
+ // Scroll handler to determine if we're at the bottom of the chat
311
+ const handleScroll = useEvent(() => {
312
+ const container = scrollContainerRef.current;
313
+ if (!container) {
314
+ return;
315
+ }
316
+
317
+ const { scrollTop, scrollHeight, clientHeight } = container;
318
+ const hasOverflow = scrollHeight > clientHeight;
319
+ const isAtBottom = hasOverflow
320
+ ? Math.abs(scrollHeight - clientHeight - scrollTop) < 5
321
+ : true; // 5px threshold
322
+ setIsScrolledToBottom(isAtBottom);
323
+ });
324
+
325
+ const scrollToBottom = useEvent(() => {
326
+ const container = scrollContainerRef.current;
327
+ if (!container) {
328
+ return;
329
+ }
330
+
331
+ container.scrollTo({
332
+ top: container.scrollHeight,
333
+ behavior: "smooth",
334
+ });
335
+ });
336
+
337
+ // Auto-scroll to bottom when new notifications arrive (if already at bottom)
338
+ useEffect(() => {
339
+ if (isScrolledToBottom && notifications.length > 0) {
340
+ // Use setTimeout to ensure DOM is updated before scrolling
341
+ const timeout = setTimeout(scrollToBottom, 100);
342
+ return () => clearTimeout(timeout);
343
+ }
344
+ }, [notifications.length, isScrolledToBottom, scrollToBottom]);
345
+
346
+ return (
347
+ <div className="flex-1 flex flex-col overflow-hidden flex-shrink-0 relative">
348
+ {pendingPermission && (
349
+ <div className="p-3 border-b">
350
+ <PermissionRequest
351
+ permission={pendingPermission}
352
+ onResolve={onResolvePermission}
353
+ />
354
+ </div>
355
+ )}
356
+
357
+ <div
358
+ ref={scrollContainerRef}
359
+ className="flex-1 bg-muted/20 w-full flex flex-col overflow-y-auto p-2"
360
+ onScroll={handleScroll}
361
+ >
362
+ {sessionId && (
363
+ <div className="text-xs text-muted-foreground mb-2 px-2">
364
+ Session ID: {sessionId}
365
+ </div>
366
+ )}
367
+ {hasNotifications ? (
368
+ <div className="space-y-2">
369
+ <AgentThread
370
+ isConnected={connectionState.status === "connected"}
371
+ notifications={notifications}
372
+ onRetryConnection={onRetryConnection}
373
+ onRetryLastAction={onRetryLastAction}
374
+ onDismissError={onDismissError}
375
+ />
376
+ </div>
377
+ ) : (
378
+ <div className="flex items-center justify-center h-full min-h-[200px]">
379
+ <PanelEmptyState
380
+ title="Waiting for agent"
381
+ description="Your AI agent will appear here when active"
382
+ icon={<BotMessageSquareIcon />}
383
+ />
384
+ </div>
385
+ )}
386
+ </div>
387
+
388
+ <ScrollToBottomButton
389
+ isVisible={!isScrolledToBottom && hasNotifications}
390
+ onScrollToBottom={scrollToBottom}
391
+ />
392
+ </div>
393
+ );
394
+ },
395
+ );
396
+ ChatContent.displayName = "ChatContent";
397
+
398
+ const NO_WS_SET = "_skip_auto_connect_";
399
+
400
+ function getCwd() {
401
+ const filename = store.get(filenameAtom);
402
+ if (!filename) {
403
+ return "";
404
+ }
405
+ return Paths.dirname(filename);
406
+ }
407
+
408
+ const AgentPanel: React.FC = () => {
409
+ const [isLoading, setIsLoading] = useState(false);
410
+ const [promptValue, setPromptValue] = useState("");
411
+
412
+ const [selectedTab] = useAtom(selectedTabAtom);
413
+ const [sessionState, setSessionState] = useAtom(agentSessionStateAtom);
414
+
415
+ const wsUrl = selectedTab
416
+ ? getAgentWebSocketUrl(selectedTab.agentId)
417
+ : NO_WS_SET;
418
+ const { sendUpdateFile, sendFileDetails } = useRequestClient();
419
+ const isCreatingNewSession = useRef(false);
420
+
421
+ const acpClient = useAcpClient({
422
+ wsUrl,
423
+ clientOptions: {
424
+ readTextFile: (request): Promise<ReadTextFileResponse> => {
425
+ logger.debug("Agent requesting file read", {
426
+ path: request.path,
427
+ });
428
+ return sendFileDetails({ path: request.path }).then((response) => ({
429
+ content: response.contents || "",
430
+ }));
431
+ },
432
+ writeTextFile: (request): Promise<WriteTextFileResponse> => {
433
+ logger.debug("Agent requesting file write", {
434
+ path: request.path,
435
+ contentLength: request.content.length,
436
+ });
437
+ return sendUpdateFile({
438
+ path: request.path,
439
+ contents: request.content,
440
+ }).then(() => null);
441
+ },
442
+ },
443
+ autoConnect: false, // We'll manage connection manually based on active session
444
+ });
445
+
446
+ const {
447
+ connect,
448
+ disconnect,
449
+ connectionState,
450
+ notifications,
451
+ pendingPermission,
452
+ resolvePermission,
453
+ activeSessionId,
454
+ agent,
455
+ } = acpClient;
456
+
457
+ // Auto-connect to agent when we have an active session, but only once per session
458
+ useEffect(() => {
459
+ if (wsUrl === NO_WS_SET) {
460
+ return;
461
+ }
462
+
463
+ logger.debug("Auto-connecting to agent", {
464
+ sessionId: activeSessionId,
465
+ });
466
+ connect();
467
+
468
+ return () => {
469
+ // We don't want to disconnect so users can switch between different
470
+ // panels without losing their session
471
+ };
472
+ // eslint-disable-next-line react-hooks/exhaustive-deps
473
+ }, [wsUrl]);
474
+
475
+ const handleNewSession = useEvent(async () => {
476
+ if (isCreatingNewSession.current) {
477
+ return;
478
+ }
479
+ if (!agent) {
480
+ return;
481
+ }
482
+
483
+ // If there is an active session, we should stop it
484
+ if (activeSessionId) {
485
+ await agent.cancel({ sessionId: activeSessionId }).catch((error) => {
486
+ logger.error("Failed to cancel active session", { error });
487
+ });
488
+ }
489
+
490
+ logger.debug("Creating new agent session", {});
491
+ isCreatingNewSession.current = true;
492
+ const newSession = await agent
493
+ .newSession({
494
+ cwd: getCwd(),
495
+ mcpServers: [],
496
+ })
497
+ .finally(() => {
498
+ isCreatingNewSession.current = false;
499
+ });
500
+ setSessionState((prev) =>
501
+ updateSessionExternalAgentSessionId(
502
+ prev,
503
+ newSession.sessionId as ExternalAgentSessionId,
504
+ ),
505
+ );
506
+ });
507
+
508
+ const handleResumeSession = useEvent(
509
+ async (previousSessionId: ExternalAgentSessionId) => {
510
+ if (!agent) {
511
+ return;
512
+ }
513
+ logger.debug("Resuming agent session", {
514
+ sessionId: previousSessionId,
515
+ });
516
+ if (!agent.loadSession) {
517
+ throw new Error("Agent does not support loading sessions");
518
+ }
519
+ await agent.loadSession({
520
+ sessionId: previousSessionId,
521
+ cwd: getCwd(),
522
+ mcpServers: [],
523
+ });
524
+ setSessionState((prev) =>
525
+ updateSessionExternalAgentSessionId(prev, previousSessionId),
526
+ );
527
+ },
528
+ );
529
+
530
+ // Create or resume a session when successfully connected
531
+ const isConnected = connectionState.status === "connected";
532
+ const tabLastActiveSessionId = selectedTab?.externalAgentSessionId;
533
+ useEffect(() => {
534
+ // No need to do anything if we're not connected, don't have an agent, or don't have a selected tab
535
+ if (!isConnected || !selectedTab || !agent) {
536
+ return;
537
+ }
538
+
539
+ // Already have an active session
540
+ if (activeSessionId && tabLastActiveSessionId) {
541
+ return;
542
+ }
543
+
544
+ const createOrResumeSession = async () => {
545
+ try {
546
+ // Check if we need to create a new session
547
+ if (tabLastActiveSessionId) {
548
+ // Try to resume existing session
549
+ try {
550
+ await handleResumeSession(tabLastActiveSessionId);
551
+ } catch (resumeError) {
552
+ logger.debug("Failed to resume session, creating new session", {
553
+ externalSessionId: tabLastActiveSessionId,
554
+ error: resumeError,
555
+ });
556
+ // Fall back to creating new session
557
+ await handleNewSession();
558
+ }
559
+ } else {
560
+ // No existing session, create new one
561
+ await handleNewSession();
562
+ }
563
+ } catch (error) {
564
+ logger.error("Failed to create or resume session:", error);
565
+ }
566
+ };
567
+
568
+ createOrResumeSession();
569
+ // eslint-disable-next-line react-hooks/exhaustive-deps
570
+ }, [isConnected, agent, tabLastActiveSessionId, activeSessionId]);
571
+
572
+ // Handler for prompt submission
573
+ const handlePromptSubmit = useEvent(
574
+ async (_e: KeyboardEvent | undefined, prompt: string) => {
575
+ if (!activeSessionId || !agent || isLoading) {
576
+ return;
577
+ }
578
+
579
+ logger.debug("Submitting prompt to agent", {
580
+ sessionId: activeSessionId,
581
+ });
582
+ setIsLoading(true);
583
+ setPromptValue("");
584
+
585
+ // Update session title with first message if it's still the default
586
+ if (selectedTab?.title.startsWith("New ")) {
587
+ setSessionState((prev) => updateSessionTitle(prev, prompt));
588
+ }
589
+
590
+ const filename = store.get(filenameAtom);
591
+ if (!filename) {
592
+ toast({
593
+ title: "Notebook must be named",
594
+ description: "Please name the notebook to use the agent",
595
+ variant: "danger",
596
+ });
597
+ return;
598
+ }
599
+
600
+ try {
601
+ await agent.prompt({
602
+ sessionId: activeSessionId,
603
+ prompt: [
604
+ { type: "text", text: prompt },
605
+ {
606
+ type: "resource_link",
607
+ uri: filename,
608
+ mimeType: "text/x-python",
609
+ name: filename,
610
+ },
611
+ {
612
+ type: "resource",
613
+ resource: {
614
+ uri: "marimo_rules.md",
615
+ mimeType: "text/markdown",
616
+ text: getAgentPrompt(filename),
617
+ },
618
+ },
619
+ ],
620
+ });
621
+ } catch (error) {
622
+ logger.error("Failed to send prompt", { error });
623
+ } finally {
624
+ setIsLoading(false);
625
+ }
626
+ },
627
+ );
628
+
629
+ // Handler for stopping the current operation
630
+ const handleStop = useEvent(async () => {
631
+ if (!activeSessionId || !agent) {
632
+ return;
633
+ }
634
+ await agent.cancel({ sessionId: activeSessionId });
635
+ setIsLoading(false);
636
+ });
637
+
638
+ // Handler for manual connect
639
+ const handleManualConnect = useEvent(() => {
640
+ logger.debug("Manual connect requested", {
641
+ currentStatus: connectionState.status,
642
+ });
643
+ connect();
644
+ });
645
+
646
+ // Handler for manual disconnect
647
+ const handleManualDisconnect = useEvent(() => {
648
+ logger.debug("Manual disconnect requested", {
649
+ sessionId: activeSessionId,
650
+ currentStatus: connectionState.status,
651
+ });
652
+ disconnect();
653
+ });
654
+
655
+ const hasNotifications = notifications.length > 0;
656
+ const hasActiveSessions = sessionState.sessions.length > 0;
657
+
658
+ if (!hasActiveSessions) {
659
+ return (
660
+ <EmptyState
661
+ currentAgentId={selectedTab?.agentId}
662
+ connectionState={connectionState}
663
+ onConnect={handleManualConnect}
664
+ onDisconnect={handleManualDisconnect}
665
+ />
666
+ );
667
+ }
668
+
669
+ return (
670
+ <div className="flex flex-col flex-1 overflow-hidden mo-agent-panel">
671
+ <AgentPanelHeader
672
+ connectionState={connectionState}
673
+ currentAgentId={selectedTab?.agentId}
674
+ onConnect={handleManualConnect}
675
+ onDisconnect={handleManualDisconnect}
676
+ onRestartThread={handleNewSession}
677
+ hasActiveSession={true}
678
+ shouldShowConnectionControl={wsUrl !== NO_WS_SET}
679
+ />
680
+ <SessionTabs />
681
+
682
+ <ChatContent
683
+ sessionId={activeSessionId}
684
+ hasNotifications={hasNotifications}
685
+ connectionState={connectionState}
686
+ notifications={notifications}
687
+ pendingPermission={pendingPermission}
688
+ onResolvePermission={(option) => {
689
+ logger.debug("Resolving permission request", {
690
+ sessionId: activeSessionId,
691
+ option,
692
+ });
693
+ resolvePermission(option as RequestPermissionResponse);
694
+ }}
695
+ onRetryConnection={handleManualConnect}
696
+ />
697
+
698
+ <LoadingIndicator
699
+ isLoading={isLoading}
700
+ isRequestingPermission={!!pendingPermission}
701
+ onStop={handleStop}
702
+ />
703
+
704
+ <PromptArea
705
+ isLoading={isLoading}
706
+ activeSessionId={activeSessionId}
707
+ promptValue={promptValue}
708
+ onPromptValueChange={setPromptValue}
709
+ onPromptSubmit={handlePromptSubmit}
710
+ />
711
+ </div>
712
+ );
713
+ };
714
+
715
+ export default AgentPanel;