@marimo-team/frontend 0.20.5-dev5 → 0.20.5-dev51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{CellStatus-DRjSVmK4.js → CellStatus-Ca1hP5DG.js} +1 -1
- package/dist/assets/{Combination-tjZP3FH6.js → Combination-DwGFeTHV.js} +1 -1
- package/dist/assets/{ConnectedDataExplorerComponent-BmYLGaEV.js → ConnectedDataExplorerComponent-Bwz_rRfP.js} +1 -1
- package/dist/assets/{ErrorBoundary-dVj6GVNE.js → ErrorBoundary-BfF3Lb5I.js} +1 -1
- package/dist/assets/{ImperativeModal-CRNJOvqT.js → ImperativeModal-D-MySjpQ.js} +1 -1
- package/dist/assets/{JsonOutput-BW2KjuuO.js → JsonOutput-k4IrWNdN.js} +1 -1
- package/dist/assets/{LazyAnyLanguageCodeMirror-BdX_Y5NA.js → LazyAnyLanguageCodeMirror-DdXhXqHo.js} +2 -2
- package/dist/assets/{MarimoErrorOutput-B0ZtYqUC.js → MarimoErrorOutput-DRIr_Q_Q.js} +1 -1
- package/dist/assets/{RenderHTML-qh-NzTWO.js → RenderHTML-Cd4FyS3e.js} +1 -1
- package/dist/assets/{add-cell-with-ai--4VOMvH8.js → add-cell-with-ai-MGYKaK6j.js} +28 -26
- package/dist/assets/add-connection-dialog-DcC53CRk.js +138 -0
- package/dist/assets/{agent-panel-Dcuv6ZGc.js → agent-panel-Cw7k_Vor.js} +15 -15
- package/dist/assets/ai-model-dropdown-CWIsr8AP.js +5 -0
- package/dist/assets/{alert-dialog-DsNfSYaw.js → alert-dialog-gkPQwL_j.js} +1 -1
- package/dist/assets/{any-language-editor-Drlg63ge.js → any-language-editor-OzhbvHaZ.js} +1 -1
- package/dist/assets/{app-config-button-bnipxY5L.js → app-config-button-CYw1Iska.js} +1 -1
- package/dist/assets/{architectureDiagram-VXUJARFQ-KOgWVxSC.js → architectureDiagram-VXUJARFQ-CwrCrSJf.js} +1 -1
- package/dist/assets/{assertNever-Dw9aFN4h.js → assertNever-Dg4AnA3p.js} +1 -1
- package/dist/assets/{azure-Ddr1pZpW.js → azure-pNN_h2Da.js} +1 -1
- package/dist/assets/{blockDiagram-VD42YOAC-DjazSe-Z.js → blockDiagram-VD42YOAC-Ct5uVfbx.js} +1 -1
- package/dist/assets/{button-BmOH9agK.js → button-BwamPDJi.js} +1 -1
- package/dist/assets/{c4Diagram-YG6GDRKO-CkwpyaIV.js → c4Diagram-YG6GDRKO-S9lnZags.js} +1 -1
- package/dist/assets/{cache-panel-DRhH4wqG.js → cache-panel-DBdmDStL.js} +1 -1
- package/dist/assets/{capabilities-CeYo4YI0.js → capabilities-yFZOze7r.js} +1 -1
- package/dist/assets/{capitalize-irHJCpFh.js → capitalize-DeCS9UqV.js} +1 -1
- package/dist/assets/{cell-editor-BYvliobE.js → cell-editor-DqAzDonn.js} +6 -6
- package/dist/assets/{cell-link-B59Kn5nL.js → cell-link-B3M3sB3h.js} +1 -1
- package/dist/assets/{cells-CCtxWKxf.js → cells-sajCpDTm.js} +4 -4
- package/dist/assets/channel-Ph-lUzX5.js +1 -0
- package/dist/assets/{chat-display-Co6iGNSx.js → chat-display-CtHU9zRu.js} +1 -1
- package/dist/assets/{chat-panel-70sjqZuy.js → chat-panel-z3mwMMS4.js} +1 -1
- package/dist/assets/{chunk-5FQGJX7Z-BJDu6jwt.js → chunk-5FQGJX7Z-CxUvnXIp.js} +2 -2
- package/dist/assets/{chunk-ABZYJK2D-B4uBM2QW.js → chunk-ABZYJK2D-BbkOOdOY.js} +3 -3
- package/dist/assets/{chunk-ATLVNIR6-Du2yaFpm.js → chunk-ATLVNIR6-OBqZNgnu.js} +1 -1
- package/dist/assets/{chunk-B4BG7PRW-CyuK4uRN.js → chunk-B4BG7PRW-CSEIK9Q4.js} +1 -1
- package/dist/assets/{chunk-DI55MBZ5-BwWd5dH1.js → chunk-DI55MBZ5-Dk9w4OMu.js} +1 -1
- package/dist/assets/{chunk-EXTU4WIE-KqUhNQvn.js → chunk-EXTU4WIE-CnJjAokB.js} +1 -1
- package/dist/assets/{chunk-JA3XYJ7Z-C-v9pa_-.js → chunk-JA3XYJ7Z-eAjzY7aA.js} +1 -1
- package/dist/assets/{chunk-JZLCHNYA-DNCs8LM0.js → chunk-JZLCHNYA-kmQ6ZBey.js} +1 -1
- package/dist/assets/{chunk-N4CR4FBY-CT58_cui.js → chunk-N4CR4FBY-Id4KvZIh.js} +2 -2
- package/dist/assets/{chunk-QN33PNHL-BboxAxJa.js → chunk-QN33PNHL-BPuXNwnv.js} +1 -1
- package/dist/assets/{chunk-QXUST7PY-BlINr7uS.js → chunk-QXUST7PY-DQJyPxzg.js} +1 -1
- package/dist/assets/{chunk-S3R3BYOJ-DI9xzpBm.js → chunk-S3R3BYOJ-Ds4u094r.js} +1 -1
- package/dist/assets/{chunk-TZMSLE5B-C4sxb3v-.js → chunk-TZMSLE5B-gAvFbCTg.js} +1 -1
- package/dist/assets/classDiagram-2ON5EDUG-D0DOYh6M.js +1 -0
- package/dist/assets/classDiagram-v2-WZHVMYZB-D_uMvsus.js +1 -0
- package/dist/assets/{code-block-37QAKDTI-Cl0NTdrS.js → code-block-37QAKDTI-BrNGyIm5.js} +1 -1
- package/dist/assets/{column-preview-Bd1U8JUS.js → column-preview-BMK4Ey6-.js} +1 -1
- package/dist/assets/command-4MXp8mZE.js +1 -0
- package/dist/assets/command-palette-D3rMc0xB.js +1 -0
- package/dist/assets/{common-CKAiz8xx.js → common-CJetJL3X.js} +1 -1
- package/dist/assets/{components-BZCdnYSp.js → components-ButU5ciW.js} +1 -1
- package/dist/assets/components-Dw1qsGKs.js +1 -0
- package/dist/assets/{config-D9X9QKiL.js → config-DPC-pWD_.js} +1 -1
- package/dist/assets/context-CIAP2NOh.js +1 -0
- package/dist/assets/context-aware-panel-DKhFsaDl.js +3 -0
- package/dist/assets/{copy-DMCkK2TI.js → copy-BV-TOnWw.js} +1 -1
- package/dist/assets/{copy-icon-6RnnFDPt.js → copy-icon-cuwSpt3D.js} +1 -1
- package/dist/assets/{createReducer-BcTiTw8T.js → createReducer-BrKCfm9t.js} +1 -1
- package/dist/assets/{dagre-6UL2VRFP-BrBSRtN5.js → dagre-6UL2VRFP-Ck_MBOZE.js} +1 -1
- package/dist/assets/{datasource-B2Fl6iYU.js → datasource-ej7nBVgG.js} +1 -1
- package/dist/assets/{dates-CzBDvj6R.js → dates-Bn5yLR20.js} +1 -1
- package/dist/assets/{dependency-graph-panel-Dk4iQGft.js → dependency-graph-panel-DtKdF1QY.js} +1 -1
- package/dist/assets/{diagram-PSM6KHXK-DPC85L-O.js → diagram-PSM6KHXK-KolOj00O.js} +1 -1
- package/dist/assets/{diagram-QEK2KX5R-CRPLkmdi.js → diagram-QEK2KX5R-D-eN_rZ-.js} +1 -1
- package/dist/assets/{diagram-S2PKOQOG-Bsc6mZUW.js → diagram-S2PKOQOG-DUI8YQgO.js} +1 -1
- package/dist/assets/{dialog-BXzvlof-.js → dialog-BDH0wAVp.js} +1 -1
- package/dist/assets/dist-303qfNXF.js +1 -0
- package/dist/assets/dist-B6vIO6Qr.js +1 -0
- package/dist/assets/{dist-CEQIJ2pn.js → dist-B7Qj0ClH.js} +1 -1
- package/dist/assets/{dist-CIU0Lack.js → dist-BEXlfh-0.js} +1 -1
- package/dist/assets/dist-BHV0ZwvR.js +1 -0
- package/dist/assets/{dist-C30-xTdI.js → dist-BIYYQefO.js} +1 -1
- package/dist/assets/{dist-Dq_iQ08e.js → dist-BKh0lnhr.js} +1 -1
- package/dist/assets/{dist-CU-Ty5ht.js → dist-BUr9VSV4.js} +1 -1
- package/dist/assets/{dist-DfBASypd.js → dist-B_Cajyw9.js} +1 -1
- package/dist/assets/dist-BbkZJt99.js +1 -0
- package/dist/assets/{dist-BjnzbwCx.js → dist-BfSn8-kc.js} +1 -1
- package/dist/assets/{dist-DQgu-tmt.js → dist-BhSY2wGF.js} +1 -1
- package/dist/assets/{dist-BTEPE6IB.js → dist-BosZYCjH.js} +1 -1
- package/dist/assets/dist-Br9y_e1t.js +1 -0
- package/dist/assets/{dist-Q0--6AMp.js → dist-BrDOLuMx.js} +1 -1
- package/dist/assets/dist-BvqRyXNf.js +1 -0
- package/dist/assets/dist-C-tYBacB.js +1 -0
- package/dist/assets/{dist-51xFOPFs.js → dist-C1HCH_0P.js} +1 -1
- package/dist/assets/{dist-DFv45CtW.js → dist-C1g0ZQqM.js} +1 -1
- package/dist/assets/dist-C88PeA-j.js +1 -0
- package/dist/assets/{dist-i0ilBbwP.js → dist-CJR8uxqq.js} +1 -1
- package/dist/assets/{dist-Dg61kQNR.js → dist-Cn9Q-NAM.js} +1 -1
- package/dist/assets/{dist-y6DTGoUH.js → dist-CsQrBXB1.js} +1 -1
- package/dist/assets/dist-DHn8amAr.js +1 -0
- package/dist/assets/{dist-CqnPIH_S.js → dist-DIR_AViv.js} +1 -1
- package/dist/assets/{dist-CIuh_TIk.js → dist-DJUbf5IV.js} +1 -1
- package/dist/assets/{dist-Bq1BhBMA.js → dist-DKPpxz2S.js} +1 -1
- package/dist/assets/{dist-Bbmd3uCi.js → dist-D_4TSZPK.js} +1 -1
- package/dist/assets/{dist-BjtLy-VA.js → dist-Da-vP8dl.js} +1 -1
- package/dist/assets/dist-Ddx3eonB.js +1 -0
- package/dist/assets/dist-Doi_61Lm.js +1 -0
- package/dist/assets/dist-Dr9qtoId.js +13 -0
- package/dist/assets/{dist-DwtQnQ8D.js → dist-DxETk19L.js} +1 -1
- package/dist/assets/dist-EtvDr9lo.js +1 -0
- package/dist/assets/dist-GR3Is1gt.js +1 -0
- package/dist/assets/dist-JYMkroTn.js +1 -0
- package/dist/assets/{dist-odxAaH5Z.js → dist-MzyXnvzy.js} +1 -1
- package/dist/assets/dist-QoV0fohO.js +1 -0
- package/dist/assets/dist-SDO5K7hA.js +3 -0
- package/dist/assets/dist-U5wHOgW5.js +1 -0
- package/dist/assets/{dist-DGPCoel5.js → dist-W-yb-STV.js} +1 -1
- package/dist/assets/dist-_p_c6cqQ.js +1 -0
- package/dist/assets/dist-bg6gyVcz.js +1 -0
- package/dist/assets/dist-doJt8agZ.js +1 -0
- package/dist/assets/{dist-DVh79TGS.js → dist-sN-Hs-ZP.js} +1 -1
- package/dist/assets/{dist-6QbI72oM.js → dist-wBVaU_K6.js} +1 -1
- package/dist/assets/{dist-C-_581uo.js → dist-ykiUNgjx.js} +1 -1
- package/dist/assets/{documentation-panel-DSqxsEBu.js → documentation-panel-DqdSQnFI.js} +1 -1
- package/dist/assets/download-CbJRMQgL.js +9 -0
- package/dist/assets/{dropdown-menu-CKhrfxsx.js → dropdown-menu-B9n5pFQo.js} +1 -1
- package/dist/assets/edit-page-PKuq51gy.js +13 -0
- package/dist/assets/{en-US-DBqDb4Nb.js → en-US-Cklu1TV7.js} +1 -1
- package/dist/assets/{erDiagram-Q2GNP2WA-B7kZxL-n.js → erDiagram-Q2GNP2WA-Da7rk8Zl.js} +1 -1
- package/dist/assets/{error-banner-R2OkQKR0.js → error-banner-C6jutgjJ.js} +1 -1
- package/dist/assets/{error-panel-CtyexAW6.js → error-panel-BYtDTl23.js} +1 -1
- package/dist/assets/{es-1hBRXVlM.js → es-DPbYTD70.js} +1 -1
- package/dist/assets/{esm-BQUzYly2.js → esm-ALGIkfiY.js} +1 -1
- package/dist/assets/{esm-BTyesPLl.js → esm-CzZMpkrw.js} +1 -1
- package/dist/assets/{field-DGtw6Lae.js → field-yBJIXwiI.js} +1 -1
- package/dist/assets/file-explorer-panel-DThRnP8y.js +26 -0
- package/dist/assets/{file-video-camera-Fa5c_iPb.js → file-headphone--dkf-Opf.js} +1 -1
- package/dist/assets/file-icons-D11ajeAb.js +1 -0
- package/dist/assets/{floating-outline-BWK_nLJy.js → floating-outline-CfXtjtdU.js} +1 -1
- package/dist/assets/{flowDiagram-NV44I4VS-DR-64sse.js → flowDiagram-NV44I4VS-CCFdO5FV.js} +1 -1
- package/dist/assets/{focus-ShrwcKIv.js → focus-BGRfO0DP.js} +1 -1
- package/dist/assets/{form-B7_NRa34.js → form-CTEi2k53.js} +1 -1
- package/dist/assets/{formats-C3K3rlAZ.js → formats-BR4SCgxc.js} +1 -1
- package/dist/assets/{formatting-8bP-RDnl.js → formatting-lD3DPwpf.js} +1 -1
- package/dist/assets/{gallery-page-DRBZRnaN.js → gallery-page-DOD9mSsH.js} +1 -1
- package/dist/assets/{ganttDiagram-JELNMOA3-BWuQMrGd.js → ganttDiagram-JELNMOA3-DWxOnZsV.js} +1 -1
- package/dist/assets/{gitGraphDiagram-V2S2FVAM-Mr5-PYgM.js → gitGraphDiagram-V2S2FVAM-DU44_-Xu.js} +1 -1
- package/dist/assets/{glide-data-editor-BurnHmgR.js → glide-data-editor-DRlmXGoQ.js} +1 -1
- package/dist/assets/{globals-BlB0Ba6E.js → globals-GeuFunZz.js} +1 -1
- package/dist/assets/home-page-B9y95YIB.js +4 -0
- package/dist/assets/{hooks-BllYlfDO.js → hooks-C5nZgXkJ.js} +1 -1
- package/dist/assets/html-to-image-DVYcIaht.js +2 -0
- package/dist/assets/image-BTHu7CJw.js +1 -0
- package/dist/assets/index-BVVET4VT.js +38 -0
- package/dist/assets/index-CDgqxTU8.css +2 -0
- package/dist/assets/{infoDiagram-HS3SLOUP-Bs8aKpuZ.js → infoDiagram-HS3SLOUP-Cj1UhRNa.js} +1 -1
- package/dist/assets/input-fga1V90B.js +1 -0
- package/dist/assets/{isValid-D3F4nmET.js → isValid-BMlg3JzV.js} +1 -1
- package/dist/assets/{journeyDiagram-XKPGCS4Q-aCZRxOHn.js → journeyDiagram-XKPGCS4Q-Bp2zIM8b.js} +1 -1
- package/dist/assets/{kanban-definition-3W4ZIXB7-BlOJJ-5B.js → kanban-definition-3W4ZIXB7-BO9Q_Cij.js} +1 -1
- package/dist/assets/katex-BalO4WMU.js +1 -0
- package/dist/assets/{kiosk-mode-BBqwMND1.js → kiosk-mode-DIRLRtqK.js} +1 -1
- package/dist/assets/{label-DmqkEXI4.js → label-CDwJXweF.js} +1 -1
- package/dist/assets/layout-CzqPAs7A.js +5 -0
- package/dist/assets/{links-syPBpTLO.js → links-BzXEG-CV.js} +1 -1
- package/dist/assets/{logs-panel-BHFI-jG1.js → logs-panel-BruxLxKQ.js} +1 -1
- package/dist/assets/{maps-8VTEe-0T.js → maps-BkFOprnj.js} +1 -1
- package/dist/assets/{marimo-icons-BDAuIiW5.js → marimo-icons-BmYE_Rrf.js} +1 -1
- package/dist/assets/{markdown-renderer-B6a5ZAwT.js → markdown-renderer-DzFSmPG9.js} +4 -4
- package/dist/assets/{menu-items-Bs2e3wuf.js → menu-items-BMC2ADBp.js} +1 -1
- package/dist/assets/mermaid-4DMBBIKO-DeLDp2wT.js +1 -0
- package/dist/assets/{mermaid-Cq8ttjss.js → mermaid-BIylv4-j.js} +3 -3
- package/dist/assets/{mhchem-BJZpIgRF.js → mhchem-DqNBdKjC.js} +1 -1
- package/dist/assets/{mindmap-definition-VGOIOE7T-Dt6ZRws3.js → mindmap-definition-VGOIOE7T-Bm7mGr7S.js} +1 -1
- package/dist/assets/{multi-map-kCmlVJ-5.js → multi-map-BfZ54ByO.js} +1 -1
- package/dist/assets/{name-cell-input-BRHlWy2Y.js → name-cell-input-CpRhYTIx.js} +1 -1
- package/dist/assets/{numbers-44Cj1Me-.js → numbers-CKtO-FK3.js} +1 -1
- package/dist/assets/{outline-panel-uyRmU3NX.js → outline-panel-BqrPSspB.js} +1 -1
- package/dist/assets/{packages-panel-D8d46YWc.js → packages-panel-BiajqQvB.js} +1 -1
- package/dist/assets/{panels-BN71Cgvz.js → panels-D3dh5STn.js} +1 -1
- package/dist/assets/{pieDiagram-ADFJNKIX-3GEmpmfg.js → pieDiagram-ADFJNKIX-B5etm5AZ.js} +1 -1
- package/dist/assets/{popover-Cvl9xY6R.js → popover-9andRQnP.js} +1 -1
- package/dist/assets/{process-output-4yip1nZE.js → process-output-BdIP7Zxk.js} +1 -1
- package/dist/assets/purify.es-ByGlPBcv.js +2 -0
- package/dist/assets/{quadrantDiagram-AYHSOK5B-Dela17qb.js → quadrantDiagram-AYHSOK5B-D0Rr2ZdK.js} +1 -1
- package/dist/assets/{readonly-python-code-DmjbJYSq.js → readonly-python-code-Cb4NuSjW.js} +1 -1
- package/dist/assets/{renderShortcut-BJEd-iA7.js → renderShortcut-rgxL53rN.js} +1 -1
- package/dist/assets/{requirementDiagram-UZGBJVZJ-CjimGyZ2.js → requirementDiagram-UZGBJVZJ-BEWon1Tt.js} +1 -1
- package/dist/assets/{run-page-aSmNe5eg.js → run-page-BOSNHthW.js} +1 -1
- package/dist/assets/{runs-BMpRKQKC.js → runs-B4QSIylk.js} +1 -1
- package/dist/assets/{sankeyDiagram-TZEHDZUN-CBE98yUR.js → sankeyDiagram-TZEHDZUN-CVIOA3fV.js} +1 -1
- package/dist/assets/{scratchpad-panel-B3K7MZ0B.js → scratchpad-panel-D3QZNdMZ.js} +1 -1
- package/dist/assets/{secrets-panel-C2n4dedt.js → secrets-panel-Cyl6d2pO.js} +1 -1
- package/dist/assets/{select-DygbgNTD.js → select-Dc75-Yj7.js} +1 -1
- package/dist/assets/{sequenceDiagram-WL72ISMW-DSgG0Zyn.js → sequenceDiagram-WL72ISMW-V72bggkN.js} +1 -1
- package/dist/assets/{session-DnMOyddG.js → session-DSf7Qrgn.js} +1 -1
- package/dist/assets/session-panel-Bhb6XXzp.js +1 -0
- package/dist/assets/{share-sD4fbzpH.js → share-BnVW-VUF.js} +1 -1
- package/dist/assets/{slides-component-B6-Jz3p0.js → slides-component-6o8TgsRv.js} +1 -1
- package/dist/assets/{snippets-panel-Bzz2M38q.js → snippets-panel-DiEtOai8.js} +1 -1
- package/dist/assets/{spec-Be-iRLAY.js → spec-C0oVDNlg.js} +1 -1
- package/dist/assets/{state-D2jTOQOG.js → state-CTm70Wwu.js} +1 -1
- package/dist/assets/{state-Xu6bDsJl.js → state-Cxaj2QUK.js} +1 -1
- package/dist/assets/state-D3wamK_H.js +1 -0
- package/dist/assets/{stateDiagram-FKZM4ZOC-By2PSLiJ.js → stateDiagram-FKZM4ZOC-BunlPmnb.js} +1 -1
- package/dist/assets/stateDiagram-v2-4FDKWEC3-DfBIf_A0.js +1 -0
- package/dist/assets/{switch-tdkZNn4k.js → switch-CS0hWCvD.js} +1 -1
- package/dist/assets/{terminal-CGmjeYqa.js → terminal-BbWefaub.js} +1 -1
- package/dist/assets/{timeline-definition-IT6M3QCI-rq80_nVa.js → timeline-definition-IT6M3QCI-05UkZ9r0.js} +1 -1
- package/dist/assets/{toggle-BhEcsHTu.js → toggle-DM8DJDvs.js} +1 -1
- package/dist/assets/{tooltip-DOQlecCr.js → tooltip-C8P6iW54.js} +1 -1
- package/dist/assets/{tooltip-D_HRHf_c.js → tooltip-Cm9o0BVX.js} +1 -1
- package/dist/assets/{tracing-BZx6nEPl.js → tracing-LTYgekaQ.js} +1 -1
- package/dist/assets/{tracing-panel-Dz9mRjXj.js → tracing-panel-D2BfFVsK.js} +2 -2
- package/dist/assets/{tree-D0AxVJ_I.js → tree-v_y-OV5p.js} +3 -3
- package/dist/assets/{useAddCell-BRlAqdmq.js → useAddCell-CT_muue_.js} +1 -1
- package/dist/assets/useBoolean-DnQsu6rx.js +1 -0
- package/dist/assets/useCellActionButton-CEVjt2wX.js +1 -0
- package/dist/assets/{useDateFormatter-CmtFqjqu.js → useDateFormatter-CpE7XQLs.js} +1 -1
- package/dist/assets/{useDeleteCell-BAfiIxKf.js → useDeleteCell-BrQJSycU.js} +1 -1
- package/dist/assets/{useDependencyPanelTab-jTu3L200.js → useDependencyPanelTab-BDafWVCa.js} +1 -1
- package/dist/assets/useEventListener-DP66hBzA.js +1 -0
- package/dist/assets/{useIframeCapabilities-T3alJPda.js → useIframeCapabilities-BhFmTPLk.js} +1 -1
- package/dist/assets/{useInstallPackage-jGxNsOWc.js → useInstallPackage-BzZRIkCo.js} +1 -1
- package/dist/assets/{useInterval-lamrIyKJ.js → useInterval-Ct4FP8Tw.js} +1 -1
- package/dist/assets/{useLifecycle-BDXC6oVR.js → useLifecycle-BRklGKFJ.js} +1 -1
- package/dist/assets/useNotebookActions-aZAKukNN.js +1 -0
- package/dist/assets/{useNumberFormatter-DMA_kIIZ.js → useNumberFormatter-DbDKSvEd.js} +1 -1
- package/dist/assets/usePress-F6Xaj1I9.js +7 -0
- package/dist/assets/{useSplitCell-CB32IpFa.js → useSplitCell-9AApJTMi.js} +1 -1
- package/dist/assets/{useTheme-CwdqVOYu.js → useTheme-CDtvl_DM.js} +1 -1
- package/dist/assets/{utils-CORJ8yYa.js → utils-C1ZciZbF.js} +1 -1
- package/dist/assets/{vega-component-BLW2fY7v.js → vega-component-XTQy2XUE.js} +1 -1
- package/dist/assets/{write-secret-modal-DuxmGjDn.js → write-secret-modal-CDf1k83O.js} +1 -1
- package/dist/assets/{xychartDiagram-PRI3JC2R-Bnjm0Q9u.js → xychartDiagram-PRI3JC2R-CwD62vJ-.js} +1 -1
- package/dist/index.html +113 -112
- package/package.json +9 -9
- package/src/__mocks__/requests.ts +1 -0
- package/src/components/app-config/ai-config.tsx +10 -0
- package/src/components/datasources/components.tsx +3 -6
- package/src/components/datasources/datasources.tsx +8 -21
- package/src/components/editor/actions/types.ts +6 -1
- package/src/components/editor/actions/useNotebookActions.tsx +50 -13
- package/src/components/editor/chrome/types.ts +17 -0
- package/src/components/editor/controls/command-palette.tsx +7 -0
- package/src/components/editor/controls/keyboard-shortcuts.tsx +3 -1
- package/src/components/editor/file-tree/file-explorer.tsx +48 -62
- package/src/components/editor/file-tree/file-icons.tsx +132 -0
- package/src/components/editor/file-tree/file-viewer.tsx +1 -1
- package/src/components/editor/file-tree/tree-actions.tsx +107 -0
- package/src/components/editor/file-tree/types.ts +2 -96
- package/src/components/editor/header/filename-input.tsx +4 -1
- package/src/components/icons/marimo-icons.tsx +2 -2
- package/src/components/pages/home-page.tsx +5 -5
- package/src/components/storage/__tests__/storage-snippets.test.ts +253 -0
- package/src/components/storage/components.tsx +0 -38
- package/src/components/storage/storage-file-viewer.tsx +1 -1
- package/src/components/storage/storage-inspector.tsx +65 -50
- package/src/components/storage/storage-snippets.ts +67 -0
- package/src/components/ui/command.tsx +2 -0
- package/src/components/ui/links.tsx +1 -0
- package/src/core/ai/tools/__tests__/run-cells-tool.test.ts +206 -0
- package/src/core/ai/tools/run-cells-tool.ts +75 -40
- package/src/core/hotkeys/__tests__/hotkeys.test.ts +64 -1
- package/src/core/hotkeys/hotkeys.ts +29 -3
- package/src/core/islands/bridge.ts +1 -0
- package/src/core/network/__tests__/requests-network.test.ts +17 -0
- package/src/core/network/requests-lazy.ts +1 -0
- package/src/core/network/requests-network.ts +9 -0
- package/src/core/network/requests-static.ts +1 -0
- package/src/core/network/requests-toasting.tsx +1 -0
- package/src/core/network/types.ts +1 -0
- package/src/core/storage/__tests__/state.test.ts +1 -0
- package/src/core/wasm/bridge.ts +1 -0
- package/src/plugins/impl/FileBrowserPlugin.tsx +4 -4
- package/src/plugins/impl/mpl-interactive/MplInteractivePlugin.tsx +309 -0
- package/src/plugins/impl/mpl-interactive/__tests__/mpl-websocket-shim.test.ts +110 -0
- package/src/plugins/impl/mpl-interactive/mpl-websocket-shim.ts +57 -0
- package/src/plugins/impl/plotly/PlotlyPlugin.tsx +8 -2
- package/src/plugins/plugins.ts +2 -0
- package/src/utils/__tests__/filenames.test.ts +7 -0
- package/src/utils/__tests__/smartMatch.test.ts +61 -0
- package/src/utils/filenames.ts +3 -0
- package/src/utils/smartMatch.ts +62 -0
- package/dist/assets/add-connection-dialog-9CzjZlY9.js +0 -138
- package/dist/assets/ai-model-dropdown-C3Y44M85.js +0 -5
- package/dist/assets/channel-k8gMdpPa.js +0 -1
- package/dist/assets/classDiagram-2ON5EDUG-DDFZaNDy.js +0 -1
- package/dist/assets/classDiagram-v2-WZHVMYZB-CEbmnHKU.js +0 -1
- package/dist/assets/command-DQqqP-WF.js +0 -1
- package/dist/assets/command-palette-CSEjt4e_.js +0 -1
- package/dist/assets/components-CF9x5raB.js +0 -1
- package/dist/assets/context-B1_BdDTF.js +0 -1
- package/dist/assets/context-aware-panel-C1uqjYZU.js +0 -3
- package/dist/assets/dist-B8osAFLA.js +0 -1
- package/dist/assets/dist-BYtATjzn.js +0 -1
- package/dist/assets/dist-Bb40mZM7.js +0 -1
- package/dist/assets/dist-C3z6pMsI.js +0 -1
- package/dist/assets/dist-CA6NQs25.js +0 -1
- package/dist/assets/dist-CCW85AP3.js +0 -1
- package/dist/assets/dist-CCnNQVp_.js +0 -1
- package/dist/assets/dist-CRVvx8nD.js +0 -1
- package/dist/assets/dist-CdZb2Grj.js +0 -1
- package/dist/assets/dist-ClLHDbNP.js +0 -1
- package/dist/assets/dist-CtKltiBh.js +0 -1
- package/dist/assets/dist-D-_c0KFz.js +0 -1
- package/dist/assets/dist-D6kWc2hF.js +0 -1
- package/dist/assets/dist-D89dID68.js +0 -1
- package/dist/assets/dist-DU2EJ7el.js +0 -3
- package/dist/assets/dist-DUY6xZX8.js +0 -13
- package/dist/assets/dist-DVHYieHl.js +0 -1
- package/dist/assets/dist-Q0mIwD1V.js +0 -1
- package/dist/assets/dist-aBuSkHFR.js +0 -1
- package/dist/assets/dist-gm5AeuIM.js +0 -1
- package/dist/assets/dist-p-IM2PMR.js +0 -1
- package/dist/assets/download-BTm4CTKr.js +0 -9
- package/dist/assets/edit-page-goj7Ea_b.js +0 -13
- package/dist/assets/file-code-D9wtWSiR.js +0 -1
- package/dist/assets/file-explorer-panel-UQLj2Iiw.js +0 -1
- package/dist/assets/home-page-BXQp6S6h.js +0 -4
- package/dist/assets/html-to-image-b9BimK8l.js +0 -2
- package/dist/assets/index-Dt_vPSmJ.js +0 -38
- package/dist/assets/index-Dzwe9vKA.css +0 -2
- package/dist/assets/input-BPldEXfy.js +0 -1
- package/dist/assets/katex-YDobqqVd.js +0 -1
- package/dist/assets/layout-DcfIrJXW.js +0 -5
- package/dist/assets/mermaid-4DMBBIKO-C0QemhGt.js +0 -1
- package/dist/assets/purify.es-CPplrWRQ.js +0 -2
- package/dist/assets/session-panel-B5JEvDHe.js +0 -1
- package/dist/assets/state-B_fNn_z_.js +0 -1
- package/dist/assets/stateDiagram-v2-4FDKWEC3-ct96_mle.js +0 -1
- package/dist/assets/types-DFiYrN2w.js +0 -17
- package/dist/assets/useBoolean-eWwLICkT.js +0 -1
- package/dist/assets/useCellActionButton-DFgACqVf.js +0 -1
- package/dist/assets/useEventListener-CjXriKgk.js +0 -1
- package/dist/assets/useNotebookActions-uvZlYyaW.js +0 -1
- package/dist/assets/usePress-DsLftN-x.js +0 -7
- /package/dist/assets/{alert-0YTlkh9P.js → alert-Bs8tbZo_.js} +0 -0
- /package/dist/assets/{bot-message-square-BzawfL5p.js → bot-message-square-B6Ribt4T.js} +0 -0
- /package/dist/assets/{chart-no-axes-column-F2DZENgf.js → chart-no-axes-column-lutwx354.js} +0 -0
- /package/dist/assets/{check-BnZGcuDh.js → check-CLyxVhzW.js} +0 -0
- /package/dist/assets/{chevron-right-_z3dkNFy.js → chevron-right-CerQ2vwn.js} +0 -0
- /package/dist/assets/{circle-check-CceJVe3L.js → circle-check-pDte1YCV.js} +0 -0
- /package/dist/assets/{circle-play-n0LbT9bZ.js → circle-play-BIB-Cffm.js} +0 -0
- /package/dist/assets/{circle-plus-DfyUnSPr.js → circle-plus-dmNAbVKB.js} +0 -0
- /package/dist/assets/{clipboard-paste-DVaOjTFK.js → clipboard-paste-BmDjmNT1.js} +0 -0
- /package/dist/assets/{code-xml-BMv1Dtd2.js → code-xml-BTXLGjZa.js} +0 -0
- /package/dist/assets/{copy-CAR4dOiD.js → copy-D9hWa8QN.js} +0 -0
- /package/dist/assets/{database-zap-B3efE3T2.js → database-zap-D0NXTAF_.js} +0 -0
- /package/dist/assets/{download-BG-iMGgV.js → download-DZkvg-PF.js} +0 -0
- /package/dist/assets/{ellipsis-CnEpKti0.js → ellipsis-DrLBOiKN.js} +0 -0
- /package/dist/assets/{ellipsis-vertical-CqcBoxmi.js → ellipsis-vertical-41ufYa9D.js} +0 -0
- /package/dist/assets/{eye-off-DgTL09j7.js → eye-off-L0XTXq09.js} +0 -0
- /package/dist/assets/{file-DVwc11C3.js → file-C9ICshU0.js} +0 -0
- /package/dist/assets/{file-plus-corner-BRwJx0yp.js → file-plus-corner-BxixWiXP.js} +0 -0
- /package/dist/assets/{katex-rvFxOCU-.js → katex-FSdXOW5Y.js} +0 -0
- /package/dist/assets/{kbd-CVbqSkT8.js → kbd-Rn7tWvNg.js} +0 -0
- /package/dist/assets/{links-BKV6zi_7.js → links-MkDbmF2p.js} +0 -0
- /package/dist/assets/{table-CeILsq6V.js → table-I8E-Bucv.js} +0 -0
- /package/dist/assets/{toDate-DDAiY7kz.js → toDate-QgjqxhRI.js} +0 -0
- /package/dist/assets/{useAsyncData-DVm0BCFt.js → useAsyncData-CI3ntihq.js} +0 -0
- /package/dist/assets/{x-yqLqiq5Q.js → x-Bz99Qj3l.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,29 +2,38 @@
|
|
|
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";
|
|
18
15
|
import React, { useCallback, useState } from "react";
|
|
19
16
|
import { useLocale } from "react-aria";
|
|
20
17
|
import { EngineVariable } from "@/components/databases/engine-variable";
|
|
18
|
+
import { useAddCodeToNewCell } from "@/components/editor/cell/useAddCell";
|
|
21
19
|
import { PanelEmptyState } from "@/components/editor/chrome/panels/empty-state";
|
|
22
20
|
import { AddConnectionDialog } from "@/components/editor/connections/add-connection-dialog";
|
|
21
|
+
import {
|
|
22
|
+
FILE_ICON_COLOR,
|
|
23
|
+
renderFileIcon,
|
|
24
|
+
} from "@/components/editor/file-tree/file-icons";
|
|
25
|
+
import {
|
|
26
|
+
MENU_ITEM_ICON_CLASS,
|
|
27
|
+
MoreActionsButton,
|
|
28
|
+
RefreshIconButton,
|
|
29
|
+
TreeChevron,
|
|
30
|
+
} from "@/components/editor/file-tree/tree-actions";
|
|
23
31
|
import { Command, CommandInput, CommandItem } from "@/components/ui/command";
|
|
24
32
|
import {
|
|
25
33
|
DropdownMenu,
|
|
26
34
|
DropdownMenuContent,
|
|
27
35
|
DropdownMenuItem,
|
|
36
|
+
DropdownMenuSeparator,
|
|
28
37
|
DropdownMenuTrigger,
|
|
29
38
|
} from "@/components/ui/dropdown-menu";
|
|
30
39
|
import { Tooltip } from "@/components/ui/tooltip";
|
|
@@ -40,7 +49,7 @@ import type {
|
|
|
40
49
|
StorageNamespace,
|
|
41
50
|
StoragePathKey,
|
|
42
51
|
} from "@/core/storage/types";
|
|
43
|
-
import { storagePathKey
|
|
52
|
+
import { storagePathKey } from "@/core/storage/types";
|
|
44
53
|
import type { VariableName } from "@/core/variables/types";
|
|
45
54
|
import { cn } from "@/utils/cn";
|
|
46
55
|
import { copyToClipboard } from "@/utils/copy";
|
|
@@ -49,8 +58,9 @@ import { formatBytes } from "@/utils/formatting";
|
|
|
49
58
|
import { Logger } from "@/utils/Logger";
|
|
50
59
|
import { ErrorState } from "../datasources/components";
|
|
51
60
|
import { Button } from "../ui/button";
|
|
52
|
-
import { ProtocolIcon
|
|
61
|
+
import { ProtocolIcon } from "./components";
|
|
53
62
|
import { StorageFileViewer } from "./storage-file-viewer";
|
|
63
|
+
import { STORAGE_SNIPPETS } from "./storage-snippets";
|
|
54
64
|
|
|
55
65
|
interface OpenFileInfo {
|
|
56
66
|
entry: StorageEntry;
|
|
@@ -138,6 +148,7 @@ const StorageEntryChildren: React.FC<{
|
|
|
138
148
|
namespace: string;
|
|
139
149
|
protocol: string;
|
|
140
150
|
rootPath: string;
|
|
151
|
+
backendType: StorageNamespace["backendType"];
|
|
141
152
|
prefix: string;
|
|
142
153
|
depth: number;
|
|
143
154
|
locale: string;
|
|
@@ -147,6 +158,7 @@ const StorageEntryChildren: React.FC<{
|
|
|
147
158
|
namespace,
|
|
148
159
|
protocol,
|
|
149
160
|
rootPath,
|
|
161
|
+
backendType,
|
|
150
162
|
prefix,
|
|
151
163
|
depth,
|
|
152
164
|
locale,
|
|
@@ -207,6 +219,7 @@ const StorageEntryChildren: React.FC<{
|
|
|
207
219
|
namespace={namespace}
|
|
208
220
|
protocol={protocol}
|
|
209
221
|
rootPath={rootPath}
|
|
222
|
+
backendType={backendType}
|
|
210
223
|
depth={depth}
|
|
211
224
|
locale={locale}
|
|
212
225
|
searchValue={searchValue}
|
|
@@ -222,6 +235,7 @@ const StorageEntryRow: React.FC<{
|
|
|
222
235
|
namespace: string;
|
|
223
236
|
protocol: string;
|
|
224
237
|
rootPath: string;
|
|
238
|
+
backendType: StorageNamespace["backendType"];
|
|
225
239
|
depth: number;
|
|
226
240
|
locale: string;
|
|
227
241
|
searchValue: string;
|
|
@@ -231,6 +245,7 @@ const StorageEntryRow: React.FC<{
|
|
|
231
245
|
namespace,
|
|
232
246
|
protocol,
|
|
233
247
|
rootPath,
|
|
248
|
+
backendType,
|
|
234
249
|
depth,
|
|
235
250
|
locale,
|
|
236
251
|
searchValue,
|
|
@@ -238,6 +253,7 @@ const StorageEntryRow: React.FC<{
|
|
|
238
253
|
}) => {
|
|
239
254
|
const [isExpanded, setIsExpanded] = useState(false);
|
|
240
255
|
const { entriesByPath } = useStorage();
|
|
256
|
+
const addCodeToNewCell = useAddCodeToNewCell();
|
|
241
257
|
const isDir = entry.kind === "directory";
|
|
242
258
|
const name = displayName(entry.path);
|
|
243
259
|
const hasSearch = !!searchValue.trim();
|
|
@@ -305,17 +321,14 @@ const StorageEntryRow: React.FC<{
|
|
|
305
321
|
}}
|
|
306
322
|
>
|
|
307
323
|
{isDir ? (
|
|
308
|
-
<
|
|
309
|
-
className={cn(
|
|
310
|
-
"h-3 w-3 shrink-0 transition-transform",
|
|
311
|
-
effectiveExpanded && "rotate-90",
|
|
312
|
-
)}
|
|
313
|
-
/>
|
|
324
|
+
<TreeChevron isExpanded={effectiveExpanded} className="h-3 w-3" />
|
|
314
325
|
) : (
|
|
315
326
|
<span className="w-3 shrink-0" />
|
|
316
327
|
)}
|
|
317
328
|
{isDir ? (
|
|
318
|
-
<FolderIcon
|
|
329
|
+
<FolderIcon
|
|
330
|
+
className={cn("h-3.5 w-3.5 shrink-0", FILE_ICON_COLOR.directory)}
|
|
331
|
+
/>
|
|
319
332
|
) : (
|
|
320
333
|
renderFileIcon(name)
|
|
321
334
|
)}
|
|
@@ -337,14 +350,10 @@ const StorageEntryRow: React.FC<{
|
|
|
337
350
|
)}
|
|
338
351
|
<DropdownMenu>
|
|
339
352
|
<DropdownMenuTrigger asChild={true}>
|
|
340
|
-
<
|
|
341
|
-
|
|
342
|
-
size="icon"
|
|
343
|
-
className="opacity-0 group-hover:opacity-100 transition-opacity hover:shadow-none hover:text-link text-muted-foreground"
|
|
353
|
+
<MoreActionsButton
|
|
354
|
+
iconClassName="h-3 w-3"
|
|
344
355
|
onClick={(e) => e.stopPropagation()}
|
|
345
|
-
|
|
346
|
-
<MoreVerticalIcon className="h-3 w-3" />
|
|
347
|
-
</Button>
|
|
356
|
+
/>
|
|
348
357
|
</DropdownMenuTrigger>
|
|
349
358
|
<DropdownMenuContent
|
|
350
359
|
align="end"
|
|
@@ -355,26 +364,47 @@ const StorageEntryRow: React.FC<{
|
|
|
355
364
|
<DropdownMenuItem
|
|
356
365
|
onSelect={() => onOpenFile({ entry, namespace })}
|
|
357
366
|
>
|
|
358
|
-
<ViewIcon className=
|
|
367
|
+
<ViewIcon className={MENU_ITEM_ICON_CLASS} />
|
|
359
368
|
View
|
|
360
369
|
</DropdownMenuItem>
|
|
361
370
|
)}
|
|
362
371
|
<DropdownMenuItem
|
|
363
372
|
onSelect={async () => {
|
|
364
|
-
|
|
365
|
-
await copyToClipboard(url.toString());
|
|
373
|
+
await copyToClipboard(entry.path);
|
|
366
374
|
toast({ title: "Copied to clipboard" });
|
|
367
375
|
}}
|
|
368
376
|
>
|
|
369
|
-
<CopyIcon className=
|
|
370
|
-
Copy
|
|
377
|
+
<CopyIcon className={MENU_ITEM_ICON_CLASS} />
|
|
378
|
+
Copy path
|
|
371
379
|
</DropdownMenuItem>
|
|
372
380
|
{!isDir && (
|
|
373
381
|
<DropdownMenuItem onSelect={() => handleDownload()}>
|
|
374
|
-
<DownloadIcon className=
|
|
382
|
+
<DownloadIcon className={MENU_ITEM_ICON_CLASS} />
|
|
375
383
|
Download
|
|
376
384
|
</DropdownMenuItem>
|
|
377
385
|
)}
|
|
386
|
+
<DropdownMenuSeparator />
|
|
387
|
+
{STORAGE_SNIPPETS.map((snippet) => {
|
|
388
|
+
const code = snippet.getCode({
|
|
389
|
+
variableName: namespace,
|
|
390
|
+
protocol,
|
|
391
|
+
entry,
|
|
392
|
+
backendType,
|
|
393
|
+
});
|
|
394
|
+
if (code === null) {
|
|
395
|
+
return null;
|
|
396
|
+
}
|
|
397
|
+
const Icon = snippet.icon;
|
|
398
|
+
return (
|
|
399
|
+
<DropdownMenuItem
|
|
400
|
+
key={snippet.id}
|
|
401
|
+
onSelect={() => addCodeToNewCell(code)}
|
|
402
|
+
>
|
|
403
|
+
<Icon className={MENU_ITEM_ICON_CLASS} />
|
|
404
|
+
{snippet.label}
|
|
405
|
+
</DropdownMenuItem>
|
|
406
|
+
);
|
|
407
|
+
})}
|
|
378
408
|
</DropdownMenuContent>
|
|
379
409
|
</DropdownMenu>
|
|
380
410
|
</div>
|
|
@@ -384,6 +414,7 @@ const StorageEntryRow: React.FC<{
|
|
|
384
414
|
namespace={namespace}
|
|
385
415
|
protocol={protocol}
|
|
386
416
|
rootPath={rootPath}
|
|
417
|
+
backendType={backendType}
|
|
387
418
|
prefix={entry.path}
|
|
388
419
|
depth={depth + 1}
|
|
389
420
|
locale={locale}
|
|
@@ -402,7 +433,6 @@ const StorageNamespaceSection: React.FC<{
|
|
|
402
433
|
onOpenFile: (info: OpenFileInfo) => void;
|
|
403
434
|
}> = ({ namespace, locale, searchValue, onOpenFile }) => {
|
|
404
435
|
const [isExpanded, setIsExpanded] = useState(true);
|
|
405
|
-
const [isSpinning, setIsSpinning] = useState(false);
|
|
406
436
|
const { entriesByPath } = useStorage();
|
|
407
437
|
const { clearNamespaceCache } = useStorageActions();
|
|
408
438
|
const namespaceName = namespace.name ?? namespace.displayName;
|
|
@@ -417,10 +447,8 @@ const StorageNamespaceSection: React.FC<{
|
|
|
417
447
|
const handleRefresh = useCallback(
|
|
418
448
|
(e: React.MouseEvent) => {
|
|
419
449
|
e.stopPropagation();
|
|
420
|
-
setIsSpinning(true);
|
|
421
450
|
clearNamespaceCache(namespaceName);
|
|
422
451
|
refetch();
|
|
423
|
-
setTimeout(() => setIsSpinning(false), 500);
|
|
424
452
|
},
|
|
425
453
|
[namespaceName, clearNamespaceCache, refetch],
|
|
426
454
|
);
|
|
@@ -441,12 +469,7 @@ const StorageNamespaceSection: React.FC<{
|
|
|
441
469
|
onSelect={() => setIsExpanded(!isExpanded)}
|
|
442
470
|
className="flex flex-row font-semibold h-7 text-xs gap-1.5 bg-(--slate-2) text-muted-foreground rounded-none"
|
|
443
471
|
>
|
|
444
|
-
<
|
|
445
|
-
className={cn(
|
|
446
|
-
"h-3 w-3 shrink-0 transition-transform",
|
|
447
|
-
isExpanded && "rotate-90",
|
|
448
|
-
)}
|
|
449
|
-
/>
|
|
472
|
+
<TreeChevron isExpanded={isExpanded} className="h-3 w-3" />
|
|
450
473
|
<ProtocolIcon protocol={namespace.protocol} />
|
|
451
474
|
<span>{namespace.displayName}</span>
|
|
452
475
|
{namespace.name && (
|
|
@@ -454,21 +477,12 @@ const StorageNamespaceSection: React.FC<{
|
|
|
454
477
|
(<EngineVariable variableName={namespace.name as VariableName} />)
|
|
455
478
|
</span>
|
|
456
479
|
)}
|
|
457
|
-
<
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
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>
|
|
480
|
+
<RefreshIconButton
|
|
481
|
+
onClick={handleRefresh}
|
|
482
|
+
tooltip="Refresh storage connection"
|
|
483
|
+
className="p-0"
|
|
484
|
+
iconClassName="h-3 w-3"
|
|
485
|
+
/>
|
|
472
486
|
<span className="text-[10px] text-muted-foreground font-normal tabular-nums ml-auto">
|
|
473
487
|
{namespace.rootPath || "(root)"}
|
|
474
488
|
</span>
|
|
@@ -488,7 +502,7 @@ const StorageNamespaceSection: React.FC<{
|
|
|
488
502
|
<ErrorState
|
|
489
503
|
error={error}
|
|
490
504
|
style={indentStyle(1)}
|
|
491
|
-
className="py-1 text-xs h-auto"
|
|
505
|
+
className="py-1 text-xs h-auto overflow-auto max-h-32 items-start"
|
|
492
506
|
showIcon={false}
|
|
493
507
|
/>
|
|
494
508
|
)}
|
|
@@ -515,6 +529,7 @@ const StorageNamespaceSection: React.FC<{
|
|
|
515
529
|
namespace={namespaceName}
|
|
516
530
|
protocol={namespace.protocol}
|
|
517
531
|
rootPath={namespace.rootPath}
|
|
532
|
+
backendType={namespace.backendType}
|
|
518
533
|
depth={1}
|
|
519
534
|
locale={locale}
|
|
520
535
|
searchValue={searchValue}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import type { LucideIcon } from "lucide-react";
|
|
4
|
+
import { BookOpenIcon, LinkIcon } from "lucide-react";
|
|
5
|
+
import type { StorageEntry, StorageNamespace } from "@/core/storage/types";
|
|
6
|
+
|
|
7
|
+
type BackendType = StorageNamespace["backendType"];
|
|
8
|
+
|
|
9
|
+
export interface StorageSnippetContext {
|
|
10
|
+
variableName: string;
|
|
11
|
+
protocol: string;
|
|
12
|
+
entry: StorageEntry;
|
|
13
|
+
backendType: BackendType;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface StorageSnippet {
|
|
17
|
+
id: string;
|
|
18
|
+
label: string;
|
|
19
|
+
icon: LucideIcon;
|
|
20
|
+
/** Return the code string, or null to hide the snippet for this context. */
|
|
21
|
+
getCode: (ctx: StorageSnippetContext) => string | null;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const NOT_SIGNABLE_PROTOCOLS = new Set(["http", "file", "in-memory"]);
|
|
25
|
+
|
|
26
|
+
function escapeForPythonString(value: string): string {
|
|
27
|
+
return JSON.stringify(value).slice(1, -1);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export const STORAGE_SNIPPETS: StorageSnippet[] = [
|
|
31
|
+
{
|
|
32
|
+
id: "read-file",
|
|
33
|
+
label: "Insert read snippet",
|
|
34
|
+
icon: BookOpenIcon,
|
|
35
|
+
getCode: (ctx) => {
|
|
36
|
+
if (ctx.entry.kind === "directory") {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
const path = escapeForPythonString(ctx.entry.path);
|
|
40
|
+
if (ctx.backendType === "obstore") {
|
|
41
|
+
return `_data = ${ctx.variableName}.get("${path}").bytes()\n_data`;
|
|
42
|
+
}
|
|
43
|
+
return `_data = ${ctx.variableName}.cat_file("${path}")\n_data`;
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
id: "download-file",
|
|
48
|
+
label: "Insert download snippet",
|
|
49
|
+
icon: LinkIcon,
|
|
50
|
+
getCode: (ctx) => {
|
|
51
|
+
if (ctx.entry.kind === "directory") {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
const path = escapeForPythonString(ctx.entry.path);
|
|
55
|
+
if (ctx.backendType === "obstore") {
|
|
56
|
+
if (NOT_SIGNABLE_PROTOCOLS.has(ctx.protocol)) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
return `from datetime import timedelta\nfrom obstore import sign\n\nsigned_url = sign(\n ${ctx.variableName}, "GET", "${path}",\n expires_in=timedelta(hours=1),\n)\nsigned_url`;
|
|
60
|
+
}
|
|
61
|
+
const filename = escapeForPythonString(
|
|
62
|
+
ctx.entry.path.split("/").pop() || "download",
|
|
63
|
+
);
|
|
64
|
+
return `${ctx.variableName}.get("${path}", "${filename}")`;
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
];
|
|
@@ -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,212 @@ 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
|
+
it("should omit output for cells that exceed total output budget", async () => {
|
|
493
|
+
const cellIds = Array.from(
|
|
494
|
+
{ length: 25 },
|
|
495
|
+
(_, i) => `budget-cell-${i}` as CellId,
|
|
496
|
+
);
|
|
497
|
+
const cellData: Record<string, { code: string; edited: boolean }> = {};
|
|
498
|
+
for (const id of cellIds) {
|
|
499
|
+
cellData[id] = { code: "x = 1", edited: true };
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
const notebook = MockNotebook.notebookState({ cellData });
|
|
503
|
+
store.set(notebookAtom, notebook);
|
|
504
|
+
|
|
505
|
+
vi.mocked(runCells).mockImplementation(async () => {
|
|
506
|
+
const updatedNotebook = store.get(notebookAtom);
|
|
507
|
+
for (const id of cellIds) {
|
|
508
|
+
updatedNotebook.cellRuntime[id] = {
|
|
509
|
+
...updatedNotebook.cellRuntime[id],
|
|
510
|
+
status: "idle",
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
store.set(notebookAtom, updatedNotebook);
|
|
514
|
+
});
|
|
515
|
+
|
|
516
|
+
// Each cell produces ~2008 chars of formatted output ("Output:\n" + 2000 chars).
|
|
517
|
+
// After 20 cells the running total exceeds MAX_TOOL_OUTPUT_CHARS (40,000).
|
|
518
|
+
const content = "a".repeat(2000);
|
|
519
|
+
vi.mocked(getCellContextData).mockReturnValue({
|
|
520
|
+
cellOutput: {
|
|
521
|
+
outputType: "text",
|
|
522
|
+
processedContent: content,
|
|
523
|
+
imageUrl: null,
|
|
524
|
+
output: { mimetype: "text/plain", data: content },
|
|
525
|
+
},
|
|
526
|
+
consoleOutputs: null,
|
|
527
|
+
cellName: "cell",
|
|
528
|
+
} as never);
|
|
529
|
+
|
|
530
|
+
const result = await tool.handler({}, toolContext as never);
|
|
531
|
+
|
|
532
|
+
expect(result.cellsToOutput?.[cellIds[0]]?.cellOutput).toContain(
|
|
533
|
+
"Output:",
|
|
534
|
+
);
|
|
535
|
+
expect(result.cellsToOutput?.[cellIds[24]]?.cellOutput).toBe(
|
|
536
|
+
"Cell executed (output omitted due to context limits).",
|
|
537
|
+
);
|
|
538
|
+
});
|
|
539
|
+
|
|
540
|
+
it("should use higher truncation limit for error outputs", async () => {
|
|
541
|
+
const notebook = MockNotebook.notebookState({
|
|
542
|
+
cellData: {
|
|
543
|
+
[cellId1]: { code: "raise Exception()", edited: true },
|
|
544
|
+
},
|
|
545
|
+
});
|
|
546
|
+
store.set(notebookAtom, notebook);
|
|
547
|
+
|
|
548
|
+
vi.mocked(runCells).mockImplementation(async () => {
|
|
549
|
+
const updatedNotebook = store.get(notebookAtom);
|
|
550
|
+
updatedNotebook.cellRuntime[cellId1] = {
|
|
551
|
+
...updatedNotebook.cellRuntime[cellId1],
|
|
552
|
+
status: "idle",
|
|
553
|
+
};
|
|
554
|
+
store.set(notebookAtom, updatedNotebook);
|
|
555
|
+
});
|
|
556
|
+
|
|
557
|
+
// 2500 chars sits between MAX_TEXT_OUTPUT_CHARS (2000) and MAX_ERROR_OUTPUT_CHARS (3000)
|
|
558
|
+
const errorContent = "E".repeat(2500);
|
|
559
|
+
vi.mocked(getCellContextData).mockReturnValue({
|
|
560
|
+
cellOutput: {
|
|
561
|
+
outputType: "text",
|
|
562
|
+
processedContent: errorContent,
|
|
563
|
+
imageUrl: null,
|
|
564
|
+
output: {
|
|
565
|
+
mimetype: "application/vnd.marimo+error",
|
|
566
|
+
data: errorContent,
|
|
567
|
+
},
|
|
568
|
+
},
|
|
569
|
+
consoleOutputs: null,
|
|
570
|
+
cellName: "cell1",
|
|
571
|
+
} as never);
|
|
572
|
+
|
|
573
|
+
const result = await tool.handler({}, toolContext as never);
|
|
574
|
+
|
|
575
|
+
const output = result.cellsToOutput?.[cellId1]?.cellOutput ?? "";
|
|
576
|
+
expect(output).not.toContain("[TRUNCATED:");
|
|
577
|
+
expect(output).toContain(errorContent);
|
|
578
|
+
});
|
|
579
|
+
|
|
580
|
+
it("should truncate large console output", async () => {
|
|
581
|
+
const notebook = MockNotebook.notebookState({
|
|
582
|
+
cellData: {
|
|
583
|
+
[cellId1]: { code: 'print("x" * 10000)', edited: true },
|
|
584
|
+
},
|
|
585
|
+
});
|
|
586
|
+
store.set(notebookAtom, notebook);
|
|
587
|
+
|
|
588
|
+
vi.mocked(runCells).mockImplementation(async () => {
|
|
589
|
+
const updatedNotebook = store.get(notebookAtom);
|
|
590
|
+
updatedNotebook.cellRuntime[cellId1] = {
|
|
591
|
+
...updatedNotebook.cellRuntime[cellId1],
|
|
592
|
+
status: "idle",
|
|
593
|
+
};
|
|
594
|
+
store.set(notebookAtom, updatedNotebook);
|
|
595
|
+
});
|
|
596
|
+
|
|
597
|
+
const largeConsoleText = "x".repeat(10_000);
|
|
598
|
+
vi.mocked(getCellContextData).mockReturnValue({
|
|
599
|
+
cellOutput: null,
|
|
600
|
+
consoleOutputs: [
|
|
601
|
+
{
|
|
602
|
+
outputType: "text",
|
|
603
|
+
processedContent: largeConsoleText,
|
|
604
|
+
imageUrl: null,
|
|
605
|
+
output: { mimetype: "text/plain", data: largeConsoleText },
|
|
606
|
+
},
|
|
607
|
+
],
|
|
608
|
+
cellName: "cell1",
|
|
609
|
+
} as never);
|
|
610
|
+
|
|
611
|
+
const result = await tool.handler({}, toolContext as never);
|
|
612
|
+
|
|
613
|
+
const consoleOutput =
|
|
614
|
+
result.cellsToOutput?.[cellId1]?.consoleOutput ?? "";
|
|
615
|
+
expect(consoleOutput).toContain("[TRUNCATED:");
|
|
616
|
+
expect(consoleOutput.length).toBeLessThan(2200);
|
|
617
|
+
});
|
|
618
|
+
});
|
|
619
|
+
|
|
414
620
|
describe("cell execution completion", () => {
|
|
415
621
|
it("should complete immediately if cells are already idle", async () => {
|
|
416
622
|
const notebook = MockNotebook.notebookState({
|