@marimo-team/frontend 0.20.5-dev3 → 0.20.5-dev33

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 (381) hide show
  1. package/dist/assets/{CellStatus-DRjSVmK4.js → CellStatus-rawm41sF.js} +1 -1
  2. package/dist/assets/{Combination-tjZP3FH6.js → Combination-lAuBMOg4.js} +1 -1
  3. package/dist/assets/{ConnectedDataExplorerComponent-BmYLGaEV.js → ConnectedDataExplorerComponent-BmrDShEI.js} +1 -1
  4. package/dist/assets/{DeferredRequestRegistry-CMZsNx4R.js → DeferredRequestRegistry-TekxUirp.js} +1 -1
  5. package/dist/assets/{ErrorBoundary-dVj6GVNE.js → ErrorBoundary-BfF3Lb5I.js} +1 -1
  6. package/dist/assets/{ImperativeModal-CRNJOvqT.js → ImperativeModal-BvRpI5NU.js} +1 -1
  7. package/dist/assets/{JsonOutput-GlMQ3aLA.js → JsonOutput-D8vxudTc.js} +11 -11
  8. package/dist/assets/{LazyAnyLanguageCodeMirror-BdX_Y5NA.js → LazyAnyLanguageCodeMirror-BpSKccWW.js} +2 -2
  9. package/dist/assets/{MarimoErrorOutput-B0ZtYqUC.js → MarimoErrorOutput-ThxhEC9x.js} +1 -1
  10. package/dist/assets/{RenderHTML-qh-NzTWO.js → RenderHTML-Ci0Pb1aU.js} +1 -1
  11. package/dist/assets/{add-cell-with-ai--4VOMvH8.js → add-cell-with-ai-C9Xp-2Lu.js} +28 -26
  12. package/dist/assets/add-connection-dialog-C0_z2T_b.js +138 -0
  13. package/dist/assets/{agent-panel-BX_iKZeN.js → agent-panel-CFmSkdtw.js} +15 -15
  14. package/dist/assets/ai-model-dropdown-DJoBltN-.js +5 -0
  15. package/dist/assets/{alert-dialog-DsNfSYaw.js → alert-dialog-CfirwkMl.js} +1 -1
  16. package/dist/assets/{any-language-editor-Drlg63ge.js → any-language-editor-C_73jLC-.js} +1 -1
  17. package/dist/assets/{app-config-button-bnipxY5L.js → app-config-button-Cw2wXNR2.js} +1 -1
  18. package/dist/assets/{architectureDiagram-VXUJARFQ-KOgWVxSC.js → architectureDiagram-VXUJARFQ-PitjPG8V.js} +1 -1
  19. package/dist/assets/{assertNever-Dw9aFN4h.js → assertNever-Dg4AnA3p.js} +1 -1
  20. package/dist/assets/{azure-Ddr1pZpW.js → azure-V83ZU8Sp.js} +1 -1
  21. package/dist/assets/{blockDiagram-VD42YOAC-DjazSe-Z.js → blockDiagram-VD42YOAC-BIJ4EhZR.js} +1 -1
  22. package/dist/assets/{button-BmOH9agK.js → button-BwamPDJi.js} +1 -1
  23. package/dist/assets/{c4Diagram-YG6GDRKO-CkwpyaIV.js → c4Diagram-YG6GDRKO-DM49Cvfe.js} +1 -1
  24. package/dist/assets/{cache-panel-DRhH4wqG.js → cache-panel-B4TWdLE9.js} +1 -1
  25. package/dist/assets/{capabilities-CeYo4YI0.js → capabilities-yFZOze7r.js} +1 -1
  26. package/dist/assets/{capitalize-irHJCpFh.js → capitalize-DeCS9UqV.js} +1 -1
  27. package/dist/assets/{cell-editor-B1x4zkBp.js → cell-editor-BoDTqwYs.js} +6 -6
  28. package/dist/assets/{cell-link-B59Kn5nL.js → cell-link-TWNu2IkO.js} +1 -1
  29. package/dist/assets/{cells-CCtxWKxf.js → cells-DJj8ja0V.js} +4 -4
  30. package/dist/assets/channel-DNdp-eCE.js +1 -0
  31. package/dist/assets/{chat-display-Co6iGNSx.js → chat-display-Dwlgqtli.js} +1 -1
  32. package/dist/assets/{chat-panel-70sjqZuy.js → chat-panel-DP052nQF.js} +1 -1
  33. package/dist/assets/{chunk-5FQGJX7Z-BJDu6jwt.js → chunk-5FQGJX7Z-Cyze_Wbx.js} +3 -3
  34. package/dist/assets/{chunk-ABZYJK2D-B4uBM2QW.js → chunk-ABZYJK2D-CIP2m5SK.js} +3 -3
  35. package/dist/assets/{chunk-ATLVNIR6-Du2yaFpm.js → chunk-ATLVNIR6-dCnEfemD.js} +1 -1
  36. package/dist/assets/{chunk-B4BG7PRW-CyuK4uRN.js → chunk-B4BG7PRW-sXSaKV4v.js} +1 -1
  37. package/dist/assets/{chunk-DI55MBZ5-BwWd5dH1.js → chunk-DI55MBZ5-DjV-ScSc.js} +1 -1
  38. package/dist/assets/{chunk-EXTU4WIE-KqUhNQvn.js → chunk-EXTU4WIE-PLvknOI8.js} +1 -1
  39. package/dist/assets/{chunk-JA3XYJ7Z-C-v9pa_-.js → chunk-JA3XYJ7Z-BM9i2UKq.js} +1 -1
  40. package/dist/assets/{chunk-JZLCHNYA-DNCs8LM0.js → chunk-JZLCHNYA-m6YUUy9x.js} +1 -1
  41. package/dist/assets/{chunk-N4CR4FBY-CT58_cui.js → chunk-N4CR4FBY-C1lKPnWl.js} +2 -2
  42. package/dist/assets/{chunk-QN33PNHL-BboxAxJa.js → chunk-QN33PNHL-Czx-c7tW.js} +1 -1
  43. package/dist/assets/{chunk-QXUST7PY-BlINr7uS.js → chunk-QXUST7PY-CcYtOR78.js} +1 -1
  44. package/dist/assets/{chunk-S3R3BYOJ-DI9xzpBm.js → chunk-S3R3BYOJ-JNQMgAH6.js} +1 -1
  45. package/dist/assets/{chunk-TZMSLE5B-C4sxb3v-.js → chunk-TZMSLE5B-C9T1sILA.js} +1 -1
  46. package/dist/assets/classDiagram-2ON5EDUG-BqtRsi1m.js +1 -0
  47. package/dist/assets/classDiagram-v2-WZHVMYZB-CVoqYiM8.js +1 -0
  48. package/dist/assets/{code-block-37QAKDTI-Cl0NTdrS.js → code-block-37QAKDTI-BeUkwW5f.js} +1 -1
  49. package/dist/assets/{column-preview-BhU5Ow0e.js → column-preview-CPJFpq_q.js} +1 -1
  50. package/dist/assets/command-DQqPawJf.js +1 -0
  51. package/dist/assets/command-palette-BM1QAZTW.js +1 -0
  52. package/dist/assets/{common-CKAiz8xx.js → common-Df9UcCs1.js} +1 -1
  53. package/dist/assets/components-CwZhf0Ag.js +1 -0
  54. package/dist/assets/{components-BZCdnYSp.js → components-D8LTuNe_.js} +1 -1
  55. package/dist/assets/{config-D9X9QKiL.js → config-BH98g9qk.js} +1 -1
  56. package/dist/assets/context-CRmPPhx9.js +1 -0
  57. package/dist/assets/context-aware-panel-Bs4Vepkp.js +3 -0
  58. package/dist/assets/{copy-DMCkK2TI.js → copy-ICN7wGy0.js} +1 -1
  59. package/dist/assets/{copy-icon-6RnnFDPt.js → copy-icon-DNppAsmd.js} +1 -1
  60. package/dist/assets/{createReducer-BcTiTw8T.js → createReducer-BrKCfm9t.js} +1 -1
  61. package/dist/assets/{dagre-6UL2VRFP-BrBSRtN5.js → dagre-6UL2VRFP-D-I1QR9s.js} +1 -1
  62. package/dist/assets/{data-grid-overlay-editor-NBBEPhQq.js → data-grid-overlay-editor-DXzdnLZF.js} +1 -1
  63. package/dist/assets/{datasource-B2Fl6iYU.js → datasource-MEu_GjcC.js} +1 -1
  64. package/dist/assets/{dates-CzBDvj6R.js → dates-BFWtdOCb.js} +1 -1
  65. package/dist/assets/{dependency-graph-panel-Dk4iQGft.js → dependency-graph-panel-DddysMUS.js} +1 -1
  66. package/dist/assets/{diagram-PSM6KHXK-DPC85L-O.js → diagram-PSM6KHXK-DcjdxOTC.js} +1 -1
  67. package/dist/assets/{diagram-QEK2KX5R-CRPLkmdi.js → diagram-QEK2KX5R-Dx1WtjkT.js} +1 -1
  68. package/dist/assets/{diagram-S2PKOQOG-Bsc6mZUW.js → diagram-S2PKOQOG-CXJzGs3_.js} +1 -1
  69. package/dist/assets/{dialog-BXzvlof-.js → dialog-ChkDhlMQ.js} +1 -1
  70. package/dist/assets/{dist-i0ilBbwP.js → dist-0PMxXIr6.js} +1 -1
  71. package/dist/assets/{dist-DGPCoel5.js → dist-6HEOc3hy.js} +1 -1
  72. package/dist/assets/{dist-CEQIJ2pn.js → dist-B7Qj0ClH.js} +1 -1
  73. package/dist/assets/{dist-C30-xTdI.js → dist-BIYYQefO.js} +1 -1
  74. package/dist/assets/{dist-Dg61kQNR.js → dist-BQ7MrVoG.js} +1 -1
  75. package/dist/assets/{dist-CU-Ty5ht.js → dist-BUr9VSV4.js} +1 -1
  76. package/dist/assets/{dist-BjtLy-VA.js → dist-Bagw3W9X.js} +1 -1
  77. package/dist/assets/dist-BbkZJt99.js +1 -0
  78. package/dist/assets/{dist-BTEPE6IB.js → dist-BosZYCjH.js} +1 -1
  79. package/dist/assets/{dist-Q0--6AMp.js → dist-BrDOLuMx.js} +1 -1
  80. package/dist/assets/dist-BvqRyXNf.js +1 -0
  81. package/dist/assets/{dist-DFv45CtW.js → dist-C1g0ZQqM.js} +1 -1
  82. package/dist/assets/dist-C88PeA-j.js +1 -0
  83. package/dist/assets/{dist-DQgu-tmt.js → dist-C8DU7LS7.js} +1 -1
  84. package/dist/assets/dist-CT29HpLU.js +1 -0
  85. package/dist/assets/dist-CaN3pnGY.js +1 -0
  86. package/dist/assets/dist-CdZrtzmM.js +1 -0
  87. package/dist/assets/{dist-Dq_iQ08e.js → dist-Cf47zp7b.js} +1 -1
  88. package/dist/assets/dist-CiBv1uBX.js +1 -0
  89. package/dist/assets/dist-Cn-s3n4_.js +1 -0
  90. package/dist/assets/{dist-DVh79TGS.js → dist-CrFxmtyb.js} +1 -1
  91. package/dist/assets/{dist-y6DTGoUH.js → dist-CsQrBXB1.js} +1 -1
  92. package/dist/assets/{dist-BjnzbwCx.js → dist-D-tCQoCo.js} +1 -1
  93. package/dist/assets/{dist-51xFOPFs.js → dist-D3OoaVQX.js} +1 -1
  94. package/dist/assets/dist-DHmVMXm2.js +1 -0
  95. package/dist/assets/dist-DHn8amAr.js +1 -0
  96. package/dist/assets/dist-DK2oA8K0.js +1 -0
  97. package/dist/assets/{dist-Bq1BhBMA.js → dist-DKPpxz2S.js} +1 -1
  98. package/dist/assets/{dist-DwtQnQ8D.js → dist-DPW-YadP.js} +1 -1
  99. package/dist/assets/{dist-Bbmd3uCi.js → dist-D_4TSZPK.js} +1 -1
  100. package/dist/assets/dist-Ddx3eonB.js +1 -0
  101. package/dist/assets/dist-DnPN36vC.js +1 -0
  102. package/dist/assets/dist-Doi_61Lm.js +1 -0
  103. package/dist/assets/{dist-Dy5EHuDu.js → dist-Dq1aTs7B.js} +1 -1
  104. package/dist/assets/dist-Dr9qtoId.js +13 -0
  105. package/dist/assets/dist-EtvDr9lo.js +1 -0
  106. package/dist/assets/dist-JYMkroTn.js +1 -0
  107. package/dist/assets/{dist-DfBASypd.js → dist-Jp_4M-Ei.js} +1 -1
  108. package/dist/assets/dist-QoV0fohO.js +1 -0
  109. package/dist/assets/dist-SDO5K7hA.js +3 -0
  110. package/dist/assets/dist-TtVOJU5I.js +1 -0
  111. package/dist/assets/dist-doJt8agZ.js +1 -0
  112. package/dist/assets/{dist-CIuh_TIk.js → dist-etSPFHi_.js} +1 -1
  113. package/dist/assets/{dist-CqnPIH_S.js → dist-f-ru44Xm.js} +1 -1
  114. package/dist/assets/{dist-CIU0Lack.js → dist-qkIhd7iG.js} +1 -1
  115. package/dist/assets/{dist-odxAaH5Z.js → dist-t1vdhOX_.js} +1 -1
  116. package/dist/assets/{dist-6QbI72oM.js → dist-wBVaU_K6.js} +1 -1
  117. package/dist/assets/{dist-C-_581uo.js → dist-ykiUNgjx.js} +1 -1
  118. package/dist/assets/{documentation-panel-DSqxsEBu.js → documentation-panel-Bs1zlxdM.js} +1 -1
  119. package/dist/assets/download-C06P9lnP.js +9 -0
  120. package/dist/assets/{dropdown-menu-CKhrfxsx.js → dropdown-menu-Bc2d7Nej.js} +1 -1
  121. package/dist/assets/edit-page-D7VD6LD4.js +13 -0
  122. package/dist/assets/{erDiagram-Q2GNP2WA-B7kZxL-n.js → erDiagram-Q2GNP2WA-BQUYpiEQ.js} +1 -1
  123. package/dist/assets/{error-banner-R2OkQKR0.js → error-banner-C2nW22mN.js} +1 -1
  124. package/dist/assets/{error-panel-CtyexAW6.js → error-panel-B_vII0VN.js} +1 -1
  125. package/dist/assets/{es-1hBRXVlM.js → es-EPBuIa5m.js} +1 -1
  126. package/dist/assets/{esm-BQUzYly2.js → esm-Hlfcqnf0.js} +1 -1
  127. package/dist/assets/{esm-BTyesPLl.js → esm-MvMf2P5n.js} +1 -1
  128. package/dist/assets/{field-DGtw6Lae.js → field-D-izY3ud.js} +1 -1
  129. package/dist/assets/file-explorer-panel-BIzyNOVs.js +17 -0
  130. package/dist/assets/{file-video-camera-Fa5c_iPb.js → file-headphone-daOQzJg0.js} +1 -1
  131. package/dist/assets/file-icons-C-oatBuk.js +1 -0
  132. package/dist/assets/{floating-outline-BWK_nLJy.js → floating-outline-BPmtgKWs.js} +1 -1
  133. package/dist/assets/{flowDiagram-NV44I4VS-DR-64sse.js → flowDiagram-NV44I4VS-xMIxed1s.js} +1 -1
  134. package/dist/assets/{focus-ShrwcKIv.js → focus-j9zawi1p.js} +1 -1
  135. package/dist/assets/{form-B7_NRa34.js → form-DrpSpDea.js} +1 -1
  136. package/dist/assets/{formats-C3K3rlAZ.js → formats-CkafgGfe.js} +1 -1
  137. package/dist/assets/{formatting-8bP-RDnl.js → formatting-By3b5Lx8.js} +1 -1
  138. package/dist/assets/{gallery-page-DRBZRnaN.js → gallery-page-BrljeBFe.js} +1 -1
  139. package/dist/assets/{ganttDiagram-JELNMOA3-BWuQMrGd.js → ganttDiagram-JELNMOA3-Be16Pv8U.js} +1 -1
  140. package/dist/assets/{gitGraphDiagram-V2S2FVAM-Mr5-PYgM.js → gitGraphDiagram-V2S2FVAM-DQ4scp6S.js} +1 -1
  141. package/dist/assets/{glide-data-editor-BurnHmgR.js → glide-data-editor-8kdd_nPE.js} +4 -4
  142. package/dist/assets/{globals-BlB0Ba6E.js → globals-D2ulvntX.js} +1 -1
  143. package/dist/assets/home-page-O_c6IiAp.js +4 -0
  144. package/dist/assets/{hooks-BY6oGAlX.js → hooks-Z1j4FmRH.js} +1 -1
  145. package/dist/assets/html-to-image-D-FY7miL.js +2 -0
  146. package/dist/assets/image-CBwHq93J.js +1 -0
  147. package/dist/assets/index-B7vfm6Sw.js +38 -0
  148. package/dist/assets/{index-Dzwe9vKA.css → index-fYvRsNGP.css} +1 -1
  149. package/dist/assets/{infoDiagram-HS3SLOUP-Bs8aKpuZ.js → infoDiagram-HS3SLOUP-DzsICEl9.js} +1 -1
  150. package/dist/assets/input-GLbHj4DF.js +1 -0
  151. package/dist/assets/{journeyDiagram-XKPGCS4Q-aCZRxOHn.js → journeyDiagram-XKPGCS4Q-Dt4UItaM.js} +1 -1
  152. package/dist/assets/{kanban-definition-3W4ZIXB7-BlOJJ-5B.js → kanban-definition-3W4ZIXB7-Do_8fQeU.js} +1 -1
  153. package/dist/assets/katex-BalO4WMU.js +1 -0
  154. package/dist/assets/{kiosk-mode-BBqwMND1.js → kiosk-mode-BuLLP9k3.js} +1 -1
  155. package/dist/assets/{label-DmqkEXI4.js → label-CDwJXweF.js} +1 -1
  156. package/dist/assets/layout-DQhzfSJn.js +5 -0
  157. package/dist/assets/{linear-2A1iDmqT.js → linear-c4WCYuol.js} +1 -1
  158. package/dist/assets/{links-syPBpTLO.js → links-C9QsxOBC.js} +1 -1
  159. package/dist/assets/{logs-panel-BHFI-jG1.js → logs-panel-BKhNdCxG.js} +1 -1
  160. package/dist/assets/{maps-8VTEe-0T.js → maps-CTMzJkSk.js} +1 -1
  161. package/dist/assets/{marimo-icons-BDAuIiW5.js → marimo-icons-BmYE_Rrf.js} +1 -1
  162. package/dist/assets/{markdown-renderer-B6a5ZAwT.js → markdown-renderer-D02U2W2X.js} +4 -4
  163. package/dist/assets/{menu-items-Bs2e3wuf.js → menu-items-CRjHRaiu.js} +1 -1
  164. package/dist/assets/mermaid-4DMBBIKO-C2MO8Ayk.js +1 -0
  165. package/dist/assets/{mermaid-Cq8ttjss.js → mermaid-DJfb-vZs.js} +3 -3
  166. package/dist/assets/{mermaid-parser.core-DbGD2gKa.js → mermaid-parser.core-C-MdXFgl.js} +1 -1
  167. package/dist/assets/{mhchem-BJZpIgRF.js → mhchem-DqNBdKjC.js} +1 -1
  168. package/dist/assets/{mindmap-definition-VGOIOE7T-Dt6ZRws3.js → mindmap-definition-VGOIOE7T-YOE4okXd.js} +1 -1
  169. package/dist/assets/{multi-map-kCmlVJ-5.js → multi-map-BubyGH4K.js} +1 -1
  170. package/dist/assets/{name-cell-input-BRHlWy2Y.js → name-cell-input-DOyCua0o.js} +1 -1
  171. package/dist/assets/{number-overlay-editor-BDnI-mwa.js → number-overlay-editor-zZDGu9D2.js} +1 -1
  172. package/dist/assets/{numbers-44Cj1Me-.js → numbers-Eb1pfDec.js} +1 -1
  173. package/dist/assets/{outline-panel-uyRmU3NX.js → outline-panel-CgQ2GmbX.js} +1 -1
  174. package/dist/assets/{packages-panel-D8d46YWc.js → packages-panel-n8Ssm9M8.js} +1 -1
  175. package/dist/assets/{panels-Do1_ry1k.js → panels-B4wExe_l.js} +1 -1
  176. package/dist/assets/{pieDiagram-ADFJNKIX-3GEmpmfg.js → pieDiagram-ADFJNKIX-CjRyNR5b.js} +1 -1
  177. package/dist/assets/{popover-Cvl9xY6R.js → popover-XNIX-rv1.js} +1 -1
  178. package/dist/assets/{precisionRound-BOmLQIKI.js → precisionRound-CCOoIlcP.js} +1 -1
  179. package/dist/assets/{process-output-4yip1nZE.js → process-output-BwkCApeo.js} +1 -1
  180. package/dist/assets/purify.es-BBn8CPhf.js +2 -0
  181. package/dist/assets/{quadrantDiagram-AYHSOK5B-Dela17qb.js → quadrantDiagram-AYHSOK5B-ZvWY20UO.js} +1 -1
  182. package/dist/assets/{react-vega-C6zUovDg.js → react-vega-DzWik59S.js} +1 -1
  183. package/dist/assets/react-vega-plcnUXVG.js +1 -0
  184. package/dist/assets/{readonly-python-code-DmjbJYSq.js → readonly-python-code-BFyASvPB.js} +1 -1
  185. package/dist/assets/{renderShortcut-BJEd-iA7.js → renderShortcut-BjTUrvc5.js} +1 -1
  186. package/dist/assets/{request-registry-CN4oD1xn.js → request-registry-LM8kl4Xv.js} +1 -1
  187. package/dist/assets/{requirementDiagram-UZGBJVZJ-CjimGyZ2.js → requirementDiagram-UZGBJVZJ-4LJ2QyR9.js} +1 -1
  188. package/dist/assets/{run-page-BGijCqbR.js → run-page-BYEyHIaG.js} +1 -1
  189. package/dist/assets/{runs-BMpRKQKC.js → runs-B4QSIylk.js} +1 -1
  190. package/dist/assets/{sankeyDiagram-TZEHDZUN-CBE98yUR.js → sankeyDiagram-TZEHDZUN-7OqUpHYR.js} +1 -1
  191. package/dist/assets/{scratchpad-panel-ByOWj9u_.js → scratchpad-panel-BRTSBHvd.js} +1 -1
  192. package/dist/assets/{secrets-panel-C2n4dedt.js → secrets-panel-DAnccD-S.js} +1 -1
  193. package/dist/assets/{select-DygbgNTD.js → select-DMX8tcVe.js} +1 -1
  194. package/dist/assets/{sequenceDiagram-WL72ISMW-DSgG0Zyn.js → sequenceDiagram-WL72ISMW-C4sGREOt.js} +1 -1
  195. package/dist/assets/{session-DnMOyddG.js → session-iz9BPeTp.js} +1 -1
  196. package/dist/assets/session-panel-k6_Gni4X.js +1 -0
  197. package/dist/assets/{share-sD4fbzpH.js → share-BWMZuJWY.js} +1 -1
  198. package/dist/assets/{slides-component-B6-Jz3p0.js → slides-component-6o8TgsRv.js} +1 -1
  199. package/dist/assets/{snippets-panel-Bzz2M38q.js → snippets-panel-mGo3M47p.js} +1 -1
  200. package/dist/assets/{spec-Be-iRLAY.js → spec-BQ0QuStT.js} +1 -1
  201. package/dist/assets/{state-Xu6bDsJl.js → state-CGR3DB1q.js} +1 -1
  202. package/dist/assets/{state-D2jTOQOG.js → state-CsNC_7dZ.js} +1 -1
  203. package/dist/assets/{state-B_fNn_z_.js → state-Dj88xOmZ.js} +1 -1
  204. package/dist/assets/{stateDiagram-FKZM4ZOC-By2PSLiJ.js → stateDiagram-FKZM4ZOC-4PvEH0nH.js} +1 -1
  205. package/dist/assets/stateDiagram-v2-4FDKWEC3-CpKgwrjU.js +1 -0
  206. package/dist/assets/stex-BBWVYm-R.js +1 -0
  207. package/dist/assets/{switch-tdkZNn4k.js → switch-BMqCO9bm.js} +1 -1
  208. package/dist/assets/{terminal-CGmjeYqa.js → terminal-qMuurRSM.js} +1 -1
  209. package/dist/assets/{time-BLCpKsnL.js → time-BuGE4zW4.js} +1 -1
  210. package/dist/assets/{timeline-definition-IT6M3QCI-rq80_nVa.js → timeline-definition-IT6M3QCI-D9wk3zrs.js} +1 -1
  211. package/dist/assets/{toggle-BhEcsHTu.js → toggle-BYx0fN9n.js} +1 -1
  212. package/dist/assets/{tooltip-DOQlecCr.js → tooltip-CKZGcDDd.js} +1 -1
  213. package/dist/assets/{tooltip-D_HRHf_c.js → tooltip-CQeE9o7x.js} +1 -1
  214. package/dist/assets/{tracing-BZx6nEPl.js → tracing-DTCuFbVV.js} +1 -1
  215. package/dist/assets/tracing-panel-B1EJu6-W.js +2 -0
  216. package/dist/assets/{tree-D0AxVJ_I.js → tree-82qhH45u.js} +1 -1
  217. package/dist/assets/{useAddCell-BRlAqdmq.js → useAddCell-BdUpg_Ta.js} +1 -1
  218. package/dist/assets/useBoolean-2eWc7NX-.js +1 -0
  219. package/dist/assets/useCellActionButton-CJ_LAoma.js +1 -0
  220. package/dist/assets/{useDateFormatter-CmtFqjqu.js → useDateFormatter-DOoVZUts.js} +1 -1
  221. package/dist/assets/{useDeleteCell-BAfiIxKf.js → useDeleteCell-C1uMlYZu.js} +1 -1
  222. package/dist/assets/{useDependencyPanelTab-jTu3L200.js → useDependencyPanelTab-nuk9kUr_.js} +1 -1
  223. package/dist/assets/useEventListener-DP66hBzA.js +1 -0
  224. package/dist/assets/{useIframeCapabilities-T3alJPda.js → useIframeCapabilities-BhFmTPLk.js} +1 -1
  225. package/dist/assets/{useInstallPackage-jGxNsOWc.js → useInstallPackage-CyTwCrsi.js} +1 -1
  226. package/dist/assets/{useInterval-lamrIyKJ.js → useInterval-Ct4FP8Tw.js} +1 -1
  227. package/dist/assets/{useLifecycle-BDXC6oVR.js → useLifecycle-BRklGKFJ.js} +1 -1
  228. package/dist/assets/useNotebookActions-Bh8YMrlo.js +1 -0
  229. package/dist/assets/{useNumberFormatter-DMA_kIIZ.js → useNumberFormatter-BXZcbTzH.js} +1 -1
  230. package/dist/assets/usePress-G817DpBk.js +7 -0
  231. package/dist/assets/{useSplitCell-CB32IpFa.js → useSplitCell-D7EHwIIE.js} +1 -1
  232. package/dist/assets/{useTheme-CwdqVOYu.js → useTheme-Co8bbxoC.js} +1 -1
  233. package/dist/assets/{utils-CORJ8yYa.js → utils-C1ZciZbF.js} +1 -1
  234. package/dist/assets/{vega-component-BLW2fY7v.js → vega-component-CoUjMYqz.js} +1 -1
  235. package/dist/assets/{vega-loader.browser-CZV6_g2i.js → vega-loader.browser-BJ9oKrvH.js} +1 -1
  236. package/dist/assets/{write-secret-modal-DuxmGjDn.js → write-secret-modal-DOyKonZB.js} +1 -1
  237. package/dist/assets/{xychartDiagram-PRI3JC2R-Bnjm0Q9u.js → xychartDiagram-PRI3JC2R-CTDFOoiw.js} +1 -1
  238. package/dist/index.html +131 -130
  239. package/package.json +9 -9
  240. package/src/__mocks__/requests.ts +1 -0
  241. package/src/components/app-config/ai-config.tsx +10 -0
  242. package/src/components/data-table/pagination.tsx +36 -30
  243. package/src/components/datasources/components.tsx +3 -6
  244. package/src/components/datasources/datasources.tsx +8 -21
  245. package/src/components/editor/actions/types.ts +6 -1
  246. package/src/components/editor/actions/useNotebookActions.tsx +50 -13
  247. package/src/components/editor/chrome/types.ts +17 -0
  248. package/src/components/editor/controls/command-palette.tsx +7 -0
  249. package/src/components/editor/controls/keyboard-shortcuts.tsx +3 -1
  250. package/src/components/editor/file-tree/file-explorer.tsx +48 -62
  251. package/src/components/editor/file-tree/file-icons.tsx +132 -0
  252. package/src/components/editor/file-tree/file-viewer.tsx +1 -1
  253. package/src/components/editor/file-tree/tree-actions.tsx +107 -0
  254. package/src/components/editor/file-tree/types.ts +2 -96
  255. package/src/components/editor/header/filename-input.tsx +4 -1
  256. package/src/components/icons/marimo-icons.tsx +2 -2
  257. package/src/components/pages/home-page.tsx +5 -5
  258. package/src/components/storage/components.tsx +0 -38
  259. package/src/components/storage/storage-file-viewer.tsx +1 -1
  260. package/src/components/storage/storage-inspector.tsx +28 -45
  261. package/src/components/ui/command.tsx +2 -0
  262. package/src/components/ui/links.tsx +1 -0
  263. package/src/core/ai/tools/__tests__/run-cells-tool.test.ts +79 -0
  264. package/src/core/ai/tools/run-cells-tool.ts +63 -17
  265. package/src/core/hotkeys/__tests__/hotkeys.test.ts +64 -1
  266. package/src/core/hotkeys/hotkeys.ts +29 -3
  267. package/src/core/islands/bridge.ts +1 -0
  268. package/src/core/network/__tests__/requests-network.test.ts +17 -0
  269. package/src/core/network/requests-lazy.ts +1 -0
  270. package/src/core/network/requests-network.ts +9 -0
  271. package/src/core/network/requests-static.ts +1 -0
  272. package/src/core/network/requests-toasting.tsx +1 -0
  273. package/src/core/network/types.ts +1 -0
  274. package/src/core/wasm/bridge.ts +1 -0
  275. package/src/plugins/impl/FileBrowserPlugin.tsx +4 -4
  276. package/src/plugins/impl/mpl-interactive/MplInteractivePlugin.tsx +309 -0
  277. package/src/plugins/impl/mpl-interactive/__tests__/mpl-websocket-shim.test.ts +110 -0
  278. package/src/plugins/impl/mpl-interactive/mpl-websocket-shim.ts +57 -0
  279. package/src/plugins/plugins.ts +2 -0
  280. package/src/utils/__tests__/filenames.test.ts +7 -0
  281. package/src/utils/__tests__/smartMatch.test.ts +61 -0
  282. package/src/utils/filenames.ts +3 -0
  283. package/src/utils/smartMatch.ts +62 -0
  284. package/dist/assets/add-connection-dialog-9CzjZlY9.js +0 -138
  285. package/dist/assets/ai-model-dropdown-C3Y44M85.js +0 -5
  286. package/dist/assets/channel-k8gMdpPa.js +0 -1
  287. package/dist/assets/classDiagram-2ON5EDUG-DDFZaNDy.js +0 -1
  288. package/dist/assets/classDiagram-v2-WZHVMYZB-CEbmnHKU.js +0 -1
  289. package/dist/assets/command-DQqqP-WF.js +0 -1
  290. package/dist/assets/command-palette-BSS73m03.js +0 -1
  291. package/dist/assets/components-CF9x5raB.js +0 -1
  292. package/dist/assets/context-B1_BdDTF.js +0 -1
  293. package/dist/assets/context-aware-panel-HnyO4-L2.js +0 -3
  294. package/dist/assets/dist-B8osAFLA.js +0 -1
  295. package/dist/assets/dist-BYtATjzn.js +0 -1
  296. package/dist/assets/dist-Bb40mZM7.js +0 -1
  297. package/dist/assets/dist-C3z6pMsI.js +0 -1
  298. package/dist/assets/dist-CA6NQs25.js +0 -1
  299. package/dist/assets/dist-CCW85AP3.js +0 -1
  300. package/dist/assets/dist-CCnNQVp_.js +0 -1
  301. package/dist/assets/dist-CRVvx8nD.js +0 -1
  302. package/dist/assets/dist-CdZb2Grj.js +0 -1
  303. package/dist/assets/dist-ClLHDbNP.js +0 -1
  304. package/dist/assets/dist-CtKltiBh.js +0 -1
  305. package/dist/assets/dist-D-_c0KFz.js +0 -1
  306. package/dist/assets/dist-D6kWc2hF.js +0 -1
  307. package/dist/assets/dist-D89dID68.js +0 -1
  308. package/dist/assets/dist-DU2EJ7el.js +0 -3
  309. package/dist/assets/dist-DUY6xZX8.js +0 -13
  310. package/dist/assets/dist-DVHYieHl.js +0 -1
  311. package/dist/assets/dist-Q0mIwD1V.js +0 -1
  312. package/dist/assets/dist-aBuSkHFR.js +0 -1
  313. package/dist/assets/dist-gm5AeuIM.js +0 -1
  314. package/dist/assets/dist-p-IM2PMR.js +0 -1
  315. package/dist/assets/download-BTm4CTKr.js +0 -9
  316. package/dist/assets/edit-page-26-lDVMB.js +0 -13
  317. package/dist/assets/file-code-D9wtWSiR.js +0 -1
  318. package/dist/assets/file-explorer-panel-Bv8lRdKl.js +0 -1
  319. package/dist/assets/home-page-BXQp6S6h.js +0 -4
  320. package/dist/assets/html-to-image-b9BimK8l.js +0 -2
  321. package/dist/assets/index-B8ImLAg8.js +0 -38
  322. package/dist/assets/input-BPldEXfy.js +0 -1
  323. package/dist/assets/katex-YDobqqVd.js +0 -1
  324. package/dist/assets/layout-DVAA7kHH.js +0 -5
  325. package/dist/assets/mermaid-4DMBBIKO-C0QemhGt.js +0 -1
  326. package/dist/assets/purify.es-CPplrWRQ.js +0 -2
  327. package/dist/assets/react-vega-1nuO-sn0.js +0 -1
  328. package/dist/assets/session-panel-B_8ny7jh.js +0 -1
  329. package/dist/assets/stateDiagram-v2-4FDKWEC3-ct96_mle.js +0 -1
  330. package/dist/assets/stex-pjf-hOob.js +0 -1
  331. package/dist/assets/tracing-panel-Dz9mRjXj.js +0 -2
  332. package/dist/assets/types-DFiYrN2w.js +0 -17
  333. package/dist/assets/useBoolean-eWwLICkT.js +0 -1
  334. package/dist/assets/useCellActionButton-DFgACqVf.js +0 -1
  335. package/dist/assets/useEventListener-CjXriKgk.js +0 -1
  336. package/dist/assets/useNotebookActions-XGX8NzaB.js +0 -1
  337. package/dist/assets/usePress-DsLftN-x.js +0 -7
  338. /package/dist/assets/{Deferred-D2igisxY.js → Deferred-BMfCOLaw.js} +0 -0
  339. /package/dist/assets/{SSRProvider-DC7ElCZZ.js → SSRProvider-CwqN9FWV.js} +0 -0
  340. /package/dist/assets/{alert-0YTlkh9P.js → alert-Bs8tbZo_.js} +0 -0
  341. /package/dist/assets/{badge-CNBv2dAU.js → badge-BUFDGZ04.js} +0 -0
  342. /package/dist/assets/{blob-CObhN-9g.js → blob-DgooIGjS.js} +0 -0
  343. /package/dist/assets/{defaultLocale-DK1MWd7f.js → defaultLocale-CGfP-Ye3.js} +0 -0
  344. /package/dist/assets/{defaultLocale-OkOxlkkM.js → defaultLocale-CuYNS33t.js} +0 -0
  345. /package/dist/assets/{emotion-is-prop-valid.esm-D7FeWASw.js → emotion-is-prop-valid.esm-lG8j6oqk.js} +0 -0
  346. /package/dist/assets/{en-US-DBqDb4Nb.js → en-US-k6sS5Nab.js} +0 -0
  347. /package/dist/assets/{errors-Bfogio62.js → errors-0IrrdfSG.js} +0 -0
  348. /package/dist/assets/{extends-aq1t6BkR.js → extends-B9D0JO9U.js} +0 -0
  349. /package/dist/assets/{github-BrsjF9dp.js → github-BY6XM4ej.js} +0 -0
  350. /package/dist/assets/{isValid-D3F4nmET.js → isValid-CUXKlcrM.js} +0 -0
  351. /package/dist/assets/{katex-rvFxOCU-.js → katex-FSdXOW5Y.js} +0 -0
  352. /package/dist/assets/{kbd-CVbqSkT8.js → kbd-Rn7tWvNg.js} +0 -0
  353. /package/dist/assets/{link-Cpo6yhBB.js → link-BmtFffTv.js} +0 -0
  354. /package/dist/assets/{links-BKV6zi_7.js → links-MkDbmF2p.js} +0 -0
  355. /package/dist/assets/{objectWithoutPropertiesLoose-Dxmp_Bd_.js → objectWithoutPropertiesLoose-CboCOq4o.js} +0 -0
  356. /package/dist/assets/{ordinal-BEKpVWu-.js → ordinal-DMIExrUm.js} +0 -0
  357. /package/dist/assets/{paths-bMgYkaP2.js → paths-D2lG83Oh.js} +0 -0
  358. /package/dist/assets/{play-D4Tdvkms.js → play-CkqWG85-.js} +0 -0
  359. /package/dist/assets/{plus-B-s-VRHt.js → plus-C9B_qWUi.js} +0 -0
  360. /package/dist/assets/{preload-helper-TXkS1QI3.js → preload-helper-BW0IMuFq.js} +0 -0
  361. /package/dist/assets/{prop-types-DRf51_gT.js → prop-types-C638SUfx.js} +0 -0
  362. /package/dist/assets/{range-DNqFcYmr.js → range-ClqUI25v.js} +0 -0
  363. /package/dist/assets/{refresh-ccw-BOzRCrXK.js → refresh-ccw-B3lGEyQm.js} +0 -0
  364. /package/dist/assets/{refresh-cw-DeCFDX1B.js → refresh-cw-fLeDriQe.js} +0 -0
  365. /package/dist/assets/{rotate-ccw-BG5BZyzw.js → rotate-ccw-DgH8qERb.js} +0 -0
  366. /package/dist/assets/{save-I_RGv5p0.js → save-C91FTnFa.js} +0 -0
  367. /package/dist/assets/{settings-DD8FJvQ_.js → settings-DRfuuLRT.js} +0 -0
  368. /package/dist/assets/{spinner-DCSoZZhh.js → spinner-Dt4SmUsI.js} +0 -0
  369. /package/dist/assets/{square-oV8Csj8Y.js → square-DZpWT_hp.js} +0 -0
  370. /package/dist/assets/{square-function-4zY5Dv0P.js → square-function-DEp1ozoA.js} +0 -0
  371. /package/dist/assets/{stex-FMMSUPAS.js → stex-0ac7Aukl.js} +0 -0
  372. /package/dist/assets/{trash-2-DtQaB9NM.js → trash-2-CrA4LwJ2.js} +0 -0
  373. /package/dist/assets/{trash-Basz0Kvc.js → trash-ZGxZ3QGq.js} +0 -0
  374. /package/dist/assets/{triangle-alert-n1-FF7zs.js → triangle-alert-CzmxsxFO.js} +0 -0
  375. /package/dist/assets/{types-BhvWC48z.js → types-CswNghXe.js} +0 -0
  376. /package/dist/assets/{use-toast-BhMe50aT.js → use-toast-Hc8CXlvz.js} +0 -0
  377. /package/dist/assets/{useAsyncData-DVm0BCFt.js → useAsyncData-CI3ntihq.js} +0 -0
  378. /package/dist/assets/{useDebounce-BUC67G8E.js → useDebounce-S9zaMzrr.js} +0 -0
  379. /package/dist/assets/{uuid-ImXS-885.js → uuid-ClFZlR7U.js} +0 -0
  380. /package/dist/assets/{workflow-CU6kAL_h.js → workflow-DgZ_19fF.js} +0 -0
  381. /package/dist/assets/{youtube-fKFch587.js → youtube-DfMgNU9-.js} +0 -0
@@ -8,15 +8,9 @@ import CoreweaveIcon from "@marimo-team/llm-info/icons/coreweave.svg?inline";
8
8
  import CoreweaveDarkIcon from "@marimo-team/llm-info/icons/coreweave-dark.svg?inline";
9
9
  import {
10
10
  DatabaseZapIcon,
11
- FileCodeIcon,
12
- FileIcon,
13
- FileSpreadsheetIcon,
14
- FileTextIcon,
15
- FileVideoIcon,
16
11
  GithubIcon,
17
12
  GlobeIcon,
18
13
  HardDriveIcon,
19
- ImageIcon,
20
14
  } from "lucide-react";
21
15
  import GoogleCloudIcon from "@/components/databases/icons/google-cloud-storage.svg?inline";
22
16
  import GoogleDriveIcon from "@/components/databases/icons/google-drive.svg?inline";
@@ -24,38 +18,6 @@ import type { KnownStorageProtocol } from "@/core/storage/types";
24
18
  import { useTheme } from "@/theme/useTheme";
25
19
  import { cn } from "@/utils/cn";
26
20
 
27
- export function renderFileIcon(name: string): React.ReactNode {
28
- const ext = name.split(".").pop()?.toLowerCase();
29
- switch (ext) {
30
- case "png":
31
- case "jpg":
32
- case "jpeg":
33
- case "gif":
34
- case "svg":
35
- case "webp":
36
- return <ImageIcon className="h-3.5 w-3.5 text-purple-500" />;
37
- case "csv":
38
- case "parquet":
39
- case "arrow":
40
- case "xlsx":
41
- return <FileSpreadsheetIcon className="h-3.5 w-3.5 text-green-500" />;
42
- case "py":
43
- case "js":
44
- case "ts":
45
- case "json":
46
- return <FileCodeIcon className="h-3.5 w-3.5 text-blue-500" />;
47
- case "mp4":
48
- case "mpeg":
49
- return <FileVideoIcon className="h-3.5 w-3.5 text-orange-500" />;
50
- case "txt":
51
- case "md":
52
- case "log":
53
- return <FileTextIcon className="h-3.5 w-3.5 text-muted-foreground" />;
54
- default:
55
- return <FileIcon className="h-3.5 w-3.5 text-muted-foreground" />;
56
- }
57
- }
58
-
59
21
  type IconEntry =
60
22
  | { src: string; dark?: string }
61
23
  | React.ComponentType<{ className?: string }>;
@@ -5,6 +5,7 @@ import type React from "react";
5
5
  import { useCallback } from "react";
6
6
  import { useLocale } from "react-aria";
7
7
  import { FilePreviewHeader } from "@/components/editor/file-tree/file-header";
8
+ import { renderFileIcon } from "@/components/editor/file-tree/file-icons";
8
9
  import {
9
10
  FileContentRenderer,
10
11
  isMediaMime,
@@ -18,7 +19,6 @@ import { formatBytes } from "@/utils/formatting";
18
19
  import { Logger } from "@/utils/Logger";
19
20
  import { CopyClipboardIcon } from "../icons/copy-icon";
20
21
  import { Button } from "../ui/button";
21
- import { renderFileIcon } from "./components";
22
22
 
23
23
  const MAX_MEDIA_PREVIEW_SIZE = 100 * 1024 * 1024; // 100 MB
24
24
 
@@ -2,16 +2,13 @@
2
2
 
3
3
  import { CommandList } from "cmdk";
4
4
  import {
5
- ChevronRightIcon,
6
5
  CopyIcon,
7
6
  DownloadIcon,
8
7
  FolderIcon,
9
8
  HardDriveIcon,
10
9
  HelpCircleIcon,
11
10
  LoaderCircle,
12
- MoreVerticalIcon,
13
11
  PlusIcon,
14
- RefreshCwIcon,
15
12
  ViewIcon,
16
13
  XIcon,
17
14
  } from "lucide-react";
@@ -20,6 +17,16 @@ import { useLocale } from "react-aria";
20
17
  import { EngineVariable } from "@/components/databases/engine-variable";
21
18
  import { PanelEmptyState } from "@/components/editor/chrome/panels/empty-state";
22
19
  import { AddConnectionDialog } from "@/components/editor/connections/add-connection-dialog";
20
+ import {
21
+ FILE_ICON_COLOR,
22
+ renderFileIcon,
23
+ } from "@/components/editor/file-tree/file-icons";
24
+ import {
25
+ MENU_ITEM_ICON_CLASS,
26
+ MoreActionsButton,
27
+ RefreshIconButton,
28
+ TreeChevron,
29
+ } from "@/components/editor/file-tree/tree-actions";
23
30
  import { Command, CommandInput, CommandItem } from "@/components/ui/command";
24
31
  import {
25
32
  DropdownMenu,
@@ -49,7 +56,7 @@ import { formatBytes } from "@/utils/formatting";
49
56
  import { Logger } from "@/utils/Logger";
50
57
  import { ErrorState } from "../datasources/components";
51
58
  import { Button } from "../ui/button";
52
- import { ProtocolIcon, renderFileIcon } from "./components";
59
+ import { ProtocolIcon } from "./components";
53
60
  import { StorageFileViewer } from "./storage-file-viewer";
54
61
 
55
62
  interface OpenFileInfo {
@@ -305,17 +312,14 @@ const StorageEntryRow: React.FC<{
305
312
  }}
306
313
  >
307
314
  {isDir ? (
308
- <ChevronRightIcon
309
- className={cn(
310
- "h-3 w-3 shrink-0 transition-transform",
311
- effectiveExpanded && "rotate-90",
312
- )}
313
- />
315
+ <TreeChevron isExpanded={effectiveExpanded} className="h-3 w-3" />
314
316
  ) : (
315
317
  <span className="w-3 shrink-0" />
316
318
  )}
317
319
  {isDir ? (
318
- <FolderIcon className="h-3.5 w-3.5 text-amber-500 shrink-0" />
320
+ <FolderIcon
321
+ className={cn("h-3.5 w-3.5 shrink-0", FILE_ICON_COLOR.directory)}
322
+ />
319
323
  ) : (
320
324
  renderFileIcon(name)
321
325
  )}
@@ -337,14 +341,10 @@ const StorageEntryRow: React.FC<{
337
341
  )}
338
342
  <DropdownMenu>
339
343
  <DropdownMenuTrigger asChild={true}>
340
- <Button
341
- variant="text"
342
- size="icon"
343
- className="opacity-0 group-hover:opacity-100 transition-opacity hover:shadow-none hover:text-link text-muted-foreground"
344
+ <MoreActionsButton
345
+ iconClassName="h-3 w-3"
344
346
  onClick={(e) => e.stopPropagation()}
345
- >
346
- <MoreVerticalIcon className="h-3 w-3" />
347
- </Button>
347
+ />
348
348
  </DropdownMenuTrigger>
349
349
  <DropdownMenuContent
350
350
  align="end"
@@ -355,7 +355,7 @@ const StorageEntryRow: React.FC<{
355
355
  <DropdownMenuItem
356
356
  onSelect={() => onOpenFile({ entry, namespace })}
357
357
  >
358
- <ViewIcon className="h-3.5 w-3.5 mr-2" />
358
+ <ViewIcon className={MENU_ITEM_ICON_CLASS} />
359
359
  View
360
360
  </DropdownMenuItem>
361
361
  )}
@@ -366,12 +366,12 @@ const StorageEntryRow: React.FC<{
366
366
  toast({ title: "Copied to clipboard" });
367
367
  }}
368
368
  >
369
- <CopyIcon className="h-3.5 w-3.5 mr-2" />
369
+ <CopyIcon className={MENU_ITEM_ICON_CLASS} />
370
370
  Copy URL
371
371
  </DropdownMenuItem>
372
372
  {!isDir && (
373
373
  <DropdownMenuItem onSelect={() => handleDownload()}>
374
- <DownloadIcon className="h-3.5 w-3.5 mr-2" />
374
+ <DownloadIcon className={MENU_ITEM_ICON_CLASS} />
375
375
  Download
376
376
  </DropdownMenuItem>
377
377
  )}
@@ -402,7 +402,6 @@ const StorageNamespaceSection: React.FC<{
402
402
  onOpenFile: (info: OpenFileInfo) => void;
403
403
  }> = ({ namespace, locale, searchValue, onOpenFile }) => {
404
404
  const [isExpanded, setIsExpanded] = useState(true);
405
- const [isSpinning, setIsSpinning] = useState(false);
406
405
  const { entriesByPath } = useStorage();
407
406
  const { clearNamespaceCache } = useStorageActions();
408
407
  const namespaceName = namespace.name ?? namespace.displayName;
@@ -417,10 +416,8 @@ const StorageNamespaceSection: React.FC<{
417
416
  const handleRefresh = useCallback(
418
417
  (e: React.MouseEvent) => {
419
418
  e.stopPropagation();
420
- setIsSpinning(true);
421
419
  clearNamespaceCache(namespaceName);
422
420
  refetch();
423
- setTimeout(() => setIsSpinning(false), 500);
424
421
  },
425
422
  [namespaceName, clearNamespaceCache, refetch],
426
423
  );
@@ -441,12 +438,7 @@ const StorageNamespaceSection: React.FC<{
441
438
  onSelect={() => setIsExpanded(!isExpanded)}
442
439
  className="flex flex-row font-semibold h-7 text-xs gap-1.5 bg-(--slate-2) text-muted-foreground rounded-none"
443
440
  >
444
- <ChevronRightIcon
445
- className={cn(
446
- "h-3 w-3 shrink-0 transition-transform",
447
- isExpanded && "rotate-90",
448
- )}
449
- />
441
+ <TreeChevron isExpanded={isExpanded} className="h-3 w-3" />
450
442
  <ProtocolIcon protocol={namespace.protocol} />
451
443
  <span>{namespace.displayName}</span>
452
444
  {namespace.name && (
@@ -454,21 +446,12 @@ const StorageNamespaceSection: React.FC<{
454
446
  (<EngineVariable variableName={namespace.name as VariableName} />)
455
447
  </span>
456
448
  )}
457
- <Tooltip content="Refresh storage connection">
458
- <Button
459
- variant="ghost"
460
- size="icon"
461
- className="hover:bg-transparent hover:shadow-none"
462
- onClick={handleRefresh}
463
- >
464
- <RefreshCwIcon
465
- className={cn(
466
- "h-3 w-3 text-muted-foreground hover:text-foreground",
467
- isSpinning && "animate-[spin_0.5s]",
468
- )}
469
- />
470
- </Button>
471
- </Tooltip>
449
+ <RefreshIconButton
450
+ onClick={handleRefresh}
451
+ tooltip="Refresh storage connection"
452
+ className="p-0"
453
+ iconClassName="h-3 w-3"
454
+ />
472
455
  <span className="text-[10px] text-muted-foreground font-normal tabular-nums ml-auto">
473
456
  {namespace.rootPath || "(root)"}
474
457
  </span>
@@ -7,6 +7,7 @@ import { Search } from "lucide-react";
7
7
  import * as React from "react";
8
8
  import { Dialog, DialogContent } from "@/components/ui/dialog";
9
9
  import { cn } from "@/utils/cn";
10
+ import { smartMatchFilter } from "@/utils/smartMatch";
10
11
  import { Strings } from "@/utils/strings";
11
12
  import {
12
13
  MENU_ITEM_DISABLED,
@@ -21,6 +22,7 @@ const Command = React.forwardRef<
21
22
  >(({ className, ...props }, ref) => (
22
23
  <CommandPrimitive
23
24
  ref={ref}
25
+ filter={smartMatchFilter}
24
26
  className={cn(
25
27
  "flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground",
26
28
  className,
@@ -8,6 +8,7 @@ export const ExternalLink = ({
8
8
  | `https://console.anthropic.com/${string}`
9
9
  | `https://aistudio.google.com/${string}`
10
10
  | `https://github.com/${string}`
11
+ | `https://docs.github.com/${string}`
11
12
  | `https://openrouter.ai/${string}`
12
13
  | `https://docs.marimo.io/${string}`
13
14
  | `https://docs.python.org/${string}`
@@ -411,6 +411,85 @@ describe("RunStaleCellsTool", () => {
411
411
  });
412
412
  });
413
413
 
414
+ describe("output truncation", () => {
415
+ it("should summarize text/html output instead of dumping raw content", async () => {
416
+ const notebook = MockNotebook.notebookState({
417
+ cellData: {
418
+ [cellId1]: { code: "fig.show()", edited: true },
419
+ },
420
+ });
421
+ store.set(notebookAtom, notebook);
422
+
423
+ vi.mocked(runCells).mockImplementation(async () => {
424
+ const updatedNotebook = store.get(notebookAtom);
425
+ updatedNotebook.cellRuntime[cellId1] = {
426
+ ...updatedNotebook.cellRuntime[cellId1],
427
+ status: "idle",
428
+ };
429
+ store.set(notebookAtom, updatedNotebook);
430
+ });
431
+
432
+ const largeHtml = `<div>${"x".repeat(2_000_000)}</div>`;
433
+ vi.mocked(getCellContextData).mockReturnValue({
434
+ cellOutput: {
435
+ outputType: "text",
436
+ processedContent: null,
437
+ imageUrl: null,
438
+ output: { mimetype: "text/html", data: largeHtml },
439
+ },
440
+ consoleOutputs: null,
441
+ cellName: "cell1",
442
+ } as never);
443
+
444
+ const result = await tool.handler({}, toolContext as never);
445
+
446
+ expect(result.status).toBe("success");
447
+ const output = result.cellsToOutput?.[cellId1]?.cellOutput ?? "";
448
+ expect(output).toContain("HTML Output:");
449
+ expect(output).toContain("text/html");
450
+ expect(output.length).toBeLessThan(200);
451
+ expect(output).not.toContain(largeHtml);
452
+ });
453
+
454
+ it("should truncate large text output to MAX_TEXT_OUTPUT_CHARS", async () => {
455
+ const notebook = MockNotebook.notebookState({
456
+ cellData: {
457
+ [cellId1]: { code: "print(big_string)", edited: true },
458
+ },
459
+ });
460
+ store.set(notebookAtom, notebook);
461
+
462
+ vi.mocked(runCells).mockImplementation(async () => {
463
+ const updatedNotebook = store.get(notebookAtom);
464
+ updatedNotebook.cellRuntime[cellId1] = {
465
+ ...updatedNotebook.cellRuntime[cellId1],
466
+ status: "idle",
467
+ };
468
+ store.set(notebookAtom, updatedNotebook);
469
+ });
470
+
471
+ const largeText = "a".repeat(10_000);
472
+ vi.mocked(getCellContextData).mockReturnValue({
473
+ cellOutput: {
474
+ outputType: "text",
475
+ processedContent: largeText,
476
+ imageUrl: null,
477
+ output: { mimetype: "text/plain", data: largeText },
478
+ },
479
+ consoleOutputs: null,
480
+ cellName: "cell1",
481
+ } as never);
482
+
483
+ const result = await tool.handler({}, toolContext as never);
484
+
485
+ const output = result.cellsToOutput?.[cellId1]?.cellOutput ?? "";
486
+ expect(output).toContain("[TRUNCATED:");
487
+ expect(output).toContain("Full output visible in the notebook UI.");
488
+ // Output should be capped (2000 chars content + "Output:\n" prefix + truncation message)
489
+ expect(output.length).toBeLessThan(2200);
490
+ });
491
+ });
492
+
414
493
  describe("cell execution completion", () => {
415
494
  it("should complete immediately if cells are already idle", async () => {
416
495
  const notebook = MockNotebook.notebookState({
@@ -24,6 +24,11 @@ import type { CopilotMode } from "./registry";
24
24
  const POST_EXECUTION_DELAY = 200;
25
25
  const WAIT_FOR_CELLS_TIMEOUT = 30_000;
26
26
 
27
+ // Output size limits to prevent exceeding LLM token limits.
28
+ const MAX_TEXT_OUTPUT_CHARS = 2000;
29
+ const MAX_ERROR_OUTPUT_CHARS = 3000;
30
+ const MAX_TOOL_OUTPUT_CHARS = 40_000;
31
+
27
32
  interface CellOutput {
28
33
  consoleOutput?: string;
29
34
  cellOutput?: string;
@@ -118,42 +123,60 @@ export class RunStaleCellsTool
118
123
  const cellsToOutput = new Map<CellId, CellOutput | null>();
119
124
  let resultMessage = "";
120
125
  let outputHasErrors = false;
126
+ let totalOutputChars = 0;
121
127
 
122
128
  for (const cellId of staleCells) {
123
129
  const cellContextData = getCellContextData(cellId, updatedNotebook, {
124
130
  includeConsoleOutput: true,
125
131
  });
126
132
 
127
- let cellOutputString: string | undefined;
128
- let consoleOutputString: string | undefined;
129
-
130
133
  const cellOutput = cellContextData.cellOutput;
131
134
  const consoleOutputs = cellContextData.consoleOutputs;
132
135
  const hasConsoleOutput = consoleOutputs && consoleOutputs.length > 0;
133
136
 
137
+ // Track errors regardless of budget
138
+ if (cellOutput && this.outputHasErrors(cellOutput)) {
139
+ outputHasErrors = true;
140
+ }
141
+ if (
142
+ hasConsoleOutput &&
143
+ consoleOutputs.some((output) => this.outputHasErrors(output))
144
+ ) {
145
+ outputHasErrors = true;
146
+ }
147
+
134
148
  if (!cellOutput && !hasConsoleOutput) {
135
- // Set null to show no output
136
149
  cellsToOutput.set(cellId, null);
137
150
  continue;
138
151
  }
139
152
 
153
+ // If total budget exceeded, summarize remaining cells
154
+ if (totalOutputChars >= MAX_TOOL_OUTPUT_CHARS) {
155
+ cellsToOutput.set(cellId, {
156
+ cellOutput: "Cell executed (output omitted due to context limits).",
157
+ });
158
+ continue;
159
+ }
160
+
161
+ let cellOutputString: string | undefined;
162
+ let consoleOutputString: string | undefined;
163
+
140
164
  if (cellOutput) {
141
165
  cellOutputString = this.formatOutputString(cellOutput);
142
- if (this.outputHasErrors(cellOutput)) {
143
- outputHasErrors = true;
144
- }
166
+ totalOutputChars += cellOutputString.length;
145
167
  }
146
168
 
147
169
  if (hasConsoleOutput) {
148
170
  consoleOutputString = consoleOutputs
149
171
  .map((output) => this.formatOutputString(output))
150
172
  .join("\n");
173
+ consoleOutputString = this.truncateString(
174
+ consoleOutputString,
175
+ MAX_TEXT_OUTPUT_CHARS,
176
+ );
177
+ totalOutputChars += consoleOutputString.length;
151
178
  resultMessage +=
152
179
  "Console output represents the stdout or stderr of the cell (eg. print statements).";
153
-
154
- if (consoleOutputs.some((output) => this.outputHasErrors(output))) {
155
- outputHasErrors = true;
156
- }
157
180
  }
158
181
 
159
182
  cellsToOutput.set(cellId, {
@@ -199,13 +222,29 @@ export class RunStaleCellsTool
199
222
  let outputString = "";
200
223
  const { outputType, processedContent, imageUrl, output } = cellOutput;
201
224
  if (outputType === "text") {
202
- outputString += "Output:\n";
203
- if (processedContent) {
204
- outputString += processedContent;
205
- } else if (typeof output.data === "string") {
206
- outputString += output.data;
225
+ if (output.mimetype === "text/html") {
226
+ // text/html (e.g. plotly figures, rich dataframes) can be millions of
227
+ // chars and is not interpretable by LLMs — summarize instead
228
+ const dataLength =
229
+ typeof output.data === "string"
230
+ ? output.data.length
231
+ : JSON.stringify(output.data).length;
232
+ outputString += `HTML Output: text/html content (${dataLength.toLocaleString()} chars). Full output visible in notebook UI.`;
207
233
  } else {
208
- outputString += JSON.stringify(output.data);
234
+ const isError = this.outputHasErrors(cellOutput);
235
+ const maxChars = isError
236
+ ? MAX_ERROR_OUTPUT_CHARS
237
+ : MAX_TEXT_OUTPUT_CHARS;
238
+ outputString += "Output:\n";
239
+ let content: string;
240
+ if (processedContent) {
241
+ content = processedContent;
242
+ } else if (typeof output.data === "string") {
243
+ content = output.data;
244
+ } else {
245
+ content = JSON.stringify(output.data);
246
+ }
247
+ outputString += this.truncateString(content, maxChars);
209
248
  }
210
249
  } else if (outputType === "media") {
211
250
  outputString += `Media Output: Contains ${output.mimetype} content`;
@@ -216,6 +255,13 @@ export class RunStaleCellsTool
216
255
  return outputString;
217
256
  }
218
257
 
258
+ private truncateString(str: string, maxLength: number): string {
259
+ if (str.length <= maxLength) {
260
+ return str;
261
+ }
262
+ return `${str.slice(0, maxLength)}\n\n[TRUNCATED: ${str.length.toLocaleString()} → ${maxLength.toLocaleString()} chars. Full output visible in the notebook UI.]`;
263
+ }
264
+
219
265
  /**
220
266
  * Wait for cells to finish executing (status becomes "idle")
221
267
  * Returns true if all cells finished executing, false if the timeout was reached
@@ -1,6 +1,12 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
  import { describe, expect, it } from "vitest";
3
- import { type Hotkey, type HotkeyAction, HotkeyProvider } from "../hotkeys";
3
+ import {
4
+ type Hotkey,
5
+ type HotkeyAction,
6
+ HotkeyProvider,
7
+ normalizeKeyString,
8
+ OverridingHotkeyProvider,
9
+ } from "../hotkeys";
4
10
 
5
11
  /**
6
12
  * Just a helper.
@@ -72,3 +78,60 @@ describe("HotkeyProvider platform separation", () => {
72
78
  expect(linux.getHotkey("cell.format").key).toBe("Ctrl-Shift-L");
73
79
  });
74
80
  });
81
+
82
+ describe("normalizeKeyString", () => {
83
+ it("should capitalize multi-character base key names", () => {
84
+ expect(normalizeKeyString("Shift-enter")).toBe("Shift-Enter");
85
+ expect(normalizeKeyString("Cmd-enter")).toBe("Cmd-Enter");
86
+ expect(normalizeKeyString("Ctrl-backspace")).toBe("Ctrl-Backspace");
87
+ expect(normalizeKeyString("Alt-tab")).toBe("Alt-Tab");
88
+ expect(normalizeKeyString("Cmd-Shift-arrowUp")).toBe("Cmd-Shift-ArrowUp");
89
+ });
90
+
91
+ it("should leave already-correct key names unchanged", () => {
92
+ expect(normalizeKeyString("Shift-Enter")).toBe("Shift-Enter");
93
+ expect(normalizeKeyString("Cmd-Enter")).toBe("Cmd-Enter");
94
+ expect(normalizeKeyString("Mod-Shift-Enter")).toBe("Mod-Shift-Enter");
95
+ });
96
+
97
+ it("should leave single-character keys unchanged", () => {
98
+ expect(normalizeKeyString("Cmd-a")).toBe("Cmd-a");
99
+ expect(normalizeKeyString("Ctrl-Shift-z")).toBe("Ctrl-Shift-z");
100
+ expect(normalizeKeyString("a")).toBe("a");
101
+ });
102
+
103
+ it("should handle keys without modifiers", () => {
104
+ expect(normalizeKeyString("enter")).toBe("Enter");
105
+ expect(normalizeKeyString("Escape")).toBe("Escape");
106
+ expect(normalizeKeyString("F12")).toBe("F12");
107
+ });
108
+ });
109
+
110
+ describe("OverridingHotkeyProvider", () => {
111
+ it("should normalize lowercase key overrides", () => {
112
+ const provider = new OverridingHotkeyProvider(
113
+ {
114
+ "cell.run": "Shift-enter",
115
+ "cell.runAndNewBelow": "Cmd-enter",
116
+ },
117
+ { platform: "mac" },
118
+ );
119
+
120
+ expect(provider.getHotkey("cell.run").key).toBe("Shift-Enter");
121
+ expect(provider.getHotkey("cell.runAndNewBelow").key).toBe("Cmd-Enter");
122
+ });
123
+
124
+ it("should return defaults when no override is set", () => {
125
+ const provider = new OverridingHotkeyProvider({}, { platform: "mac" });
126
+ expect(provider.getHotkey("cell.run").key).toBe("Cmd-Enter");
127
+ expect(provider.getHotkey("cell.runAndNewBelow").key).toBe("Shift-Enter");
128
+ });
129
+
130
+ it("should pass through correctly-cased overrides unchanged", () => {
131
+ const provider = new OverridingHotkeyProvider(
132
+ { "cell.run": "Shift-Enter" },
133
+ { platform: "mac" },
134
+ );
135
+ expect(provider.getHotkey("cell.run").key).toBe("Shift-Enter");
136
+ });
137
+ });
@@ -27,11 +27,13 @@ export interface Hotkey {
27
27
  * @default true
28
28
  */
29
29
  editable?: boolean;
30
+ additionalKeywords?: string[];
30
31
  }
31
32
 
32
33
  interface ResolvedHotkey {
33
34
  name: string;
34
35
  key: string;
36
+ additionalKeywords?: string[];
35
37
  }
36
38
 
37
39
  type ModKey = "Cmd" | "Ctrl";
@@ -110,6 +112,7 @@ const DEFAULT_HOT_KEY = {
110
112
  name: "Run",
111
113
  group: "Running Cells",
112
114
  key: "Mod-Enter",
115
+ additionalKeywords: ["execute", "submit"],
113
116
  },
114
117
  "cell.runAndNewBelow": {
115
118
  name: "Run and new below",
@@ -132,6 +135,7 @@ const DEFAULT_HOT_KEY = {
132
135
  name: "Format cell",
133
136
  group: "Editing",
134
137
  key: "Mod-b",
138
+ additionalKeywords: ["lint"],
135
139
  },
136
140
  "cell.viewAsMarkdown": {
137
141
  name: "View as Markdown",
@@ -201,6 +205,7 @@ const DEFAULT_HOT_KEY = {
201
205
  name: "Delete cell",
202
206
  group: "Editing",
203
207
  key: "Shift-Backspace",
208
+ additionalKeywords: ["remove"],
204
209
  },
205
210
  "cell.hideCode": {
206
211
  name: "Hide cell code",
@@ -320,6 +325,7 @@ const DEFAULT_HOT_KEY = {
320
325
  name: "Save file",
321
326
  group: "Other",
322
327
  key: "Mod-s",
328
+ additionalKeywords: ["write", "persist"],
323
329
  },
324
330
  "global.commandPalette": {
325
331
  name: "Show command palette",
@@ -485,23 +491,26 @@ export class HotkeyProvider implements IHotkeyProvider {
485
491
  }
486
492
 
487
493
  getHotkey(action: HotkeyAction): ResolvedHotkey {
488
- const { name, key } = this.hotkeys[action];
494
+ const { name, key, additionalKeywords } = this.hotkeys[action];
489
495
  if (typeof key === "string") {
490
496
  return {
491
497
  name,
492
498
  key: key.replace("Mod", this.mod),
499
+ additionalKeywords,
493
500
  };
494
501
  }
495
502
  if (key === NOT_SET) {
496
503
  return {
497
504
  name,
498
505
  key: "",
506
+ additionalKeywords,
499
507
  };
500
508
  }
501
509
  const platformKey = key[this.platform] || key.main;
502
510
  return {
503
511
  name,
504
512
  key: platformKey.replace("Mod", this.mod),
513
+ additionalKeywords,
505
514
  };
506
515
  }
507
516
 
@@ -535,10 +544,27 @@ export class OverridingHotkeyProvider extends HotkeyProvider {
535
544
 
536
545
  override getHotkey(action: HotkeyAction): ResolvedHotkey {
537
546
  const base = super.getHotkey(action);
538
- const key = this.overrides[action] || base.key;
547
+ const override = this.overrides[action];
539
548
  return {
540
549
  name: base.name,
541
- key,
550
+ key: override ? normalizeKeyString(override) : base.key,
551
+ additionalKeywords: base.additionalKeywords,
542
552
  };
543
553
  }
544
554
  }
555
+
556
+ const MODIFIER_RE = /^(cmd|ctrl|alt|shift|meta|mod)$/i;
557
+
558
+ /**
559
+ * Capitalize multi-character base key names so they match the
560
+ * casing that KeyboardEvent.key (and therefore CodeMirror) uses.
561
+ * e.g. "Shift-enter" → "Shift-Enter", "Cmd-backspace" → "Cmd-Backspace"
562
+ */
563
+ export function normalizeKeyString(key: string): string {
564
+ const parts = key.split("-");
565
+ const last = parts[parts.length - 1];
566
+ if (last.length > 1 && !MODIFIER_RE.test(last)) {
567
+ parts[parts.length - 1] = last.charAt(0).toUpperCase() + last.slice(1);
568
+ }
569
+ return parts.join("-");
570
+ }
@@ -181,6 +181,7 @@ export class IslandsPyodideBridge implements RunRequests, EditRequests {
181
181
  sendFileDetails = throwNotImplemented;
182
182
  openTutorial = throwNotImplemented;
183
183
  exportAsHTML = throwNotImplemented;
184
+ exportAsIPYNB = throwNotImplemented;
184
185
  exportAsMarkdown = throwNotImplemented;
185
186
  exportAsPDF = throwNotImplemented;
186
187
  autoExportAsHTML = throwNotImplemented;