@marimo-team/frontend 0.20.5-dev4 → 0.20.5-dev41
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-rawm41sF.js} +1 -1
- package/dist/assets/{Combination-tjZP3FH6.js → Combination-lAuBMOg4.js} +1 -1
- package/dist/assets/{ConnectedDataExplorerComponent-BmYLGaEV.js → ConnectedDataExplorerComponent-BmrDShEI.js} +1 -1
- package/dist/assets/{DeferredRequestRegistry-CMZsNx4R.js → DeferredRequestRegistry-TekxUirp.js} +1 -1
- package/dist/assets/{ErrorBoundary-dVj6GVNE.js → ErrorBoundary-BfF3Lb5I.js} +1 -1
- package/dist/assets/{ImperativeModal-CRNJOvqT.js → ImperativeModal-BvRpI5NU.js} +1 -1
- package/dist/assets/{JsonOutput-GlMQ3aLA.js → JsonOutput-D8vxudTc.js} +11 -11
- package/dist/assets/{LazyAnyLanguageCodeMirror-BdX_Y5NA.js → LazyAnyLanguageCodeMirror-BpSKccWW.js} +2 -2
- package/dist/assets/{MarimoErrorOutput-B0ZtYqUC.js → MarimoErrorOutput-ThxhEC9x.js} +1 -1
- package/dist/assets/{RenderHTML-qh-NzTWO.js → RenderHTML-Ci0Pb1aU.js} +1 -1
- package/dist/assets/{add-cell-with-ai--4VOMvH8.js → add-cell-with-ai-BO7kWP2P.js} +28 -26
- package/dist/assets/add-connection-dialog-C0_z2T_b.js +138 -0
- package/dist/assets/{agent-panel-BX_iKZeN.js → agent-panel-C-OkUkue.js} +15 -15
- package/dist/assets/ai-model-dropdown-DJoBltN-.js +5 -0
- package/dist/assets/{alert-dialog-DsNfSYaw.js → alert-dialog-CfirwkMl.js} +1 -1
- package/dist/assets/{any-language-editor-Drlg63ge.js → any-language-editor-C_73jLC-.js} +1 -1
- package/dist/assets/{app-config-button-bnipxY5L.js → app-config-button-Cw2wXNR2.js} +1 -1
- package/dist/assets/{architectureDiagram-VXUJARFQ-KOgWVxSC.js → architectureDiagram-VXUJARFQ-PitjPG8V.js} +1 -1
- package/dist/assets/{assertNever-Dw9aFN4h.js → assertNever-Dg4AnA3p.js} +1 -1
- package/dist/assets/{azure-Ddr1pZpW.js → azure-V83ZU8Sp.js} +1 -1
- package/dist/assets/{blockDiagram-VD42YOAC-DjazSe-Z.js → blockDiagram-VD42YOAC-BIJ4EhZR.js} +1 -1
- package/dist/assets/{button-BmOH9agK.js → button-BwamPDJi.js} +1 -1
- package/dist/assets/{c4Diagram-YG6GDRKO-CkwpyaIV.js → c4Diagram-YG6GDRKO-DM49Cvfe.js} +1 -1
- package/dist/assets/{cache-panel-DRhH4wqG.js → cache-panel-B4TWdLE9.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-B1x4zkBp.js → cell-editor-DFeqwbDq.js} +6 -6
- package/dist/assets/{cell-link-B59Kn5nL.js → cell-link-TWNu2IkO.js} +1 -1
- package/dist/assets/{cells-CCtxWKxf.js → cells-DJj8ja0V.js} +4 -4
- package/dist/assets/channel-DNdp-eCE.js +1 -0
- package/dist/assets/{chat-display-Co6iGNSx.js → chat-display-COL62Kpv.js} +1 -1
- package/dist/assets/{chat-panel-70sjqZuy.js → chat-panel-CxYclPR7.js} +1 -1
- package/dist/assets/{chunk-5FQGJX7Z-BJDu6jwt.js → chunk-5FQGJX7Z-Cyze_Wbx.js} +3 -3
- package/dist/assets/{chunk-ABZYJK2D-B4uBM2QW.js → chunk-ABZYJK2D-CIP2m5SK.js} +3 -3
- package/dist/assets/{chunk-ATLVNIR6-Du2yaFpm.js → chunk-ATLVNIR6-dCnEfemD.js} +1 -1
- package/dist/assets/{chunk-B4BG7PRW-CyuK4uRN.js → chunk-B4BG7PRW-sXSaKV4v.js} +1 -1
- package/dist/assets/{chunk-DI55MBZ5-BwWd5dH1.js → chunk-DI55MBZ5-DjV-ScSc.js} +1 -1
- package/dist/assets/{chunk-EXTU4WIE-KqUhNQvn.js → chunk-EXTU4WIE-PLvknOI8.js} +1 -1
- package/dist/assets/{chunk-JA3XYJ7Z-C-v9pa_-.js → chunk-JA3XYJ7Z-BM9i2UKq.js} +1 -1
- package/dist/assets/{chunk-JZLCHNYA-DNCs8LM0.js → chunk-JZLCHNYA-m6YUUy9x.js} +1 -1
- package/dist/assets/{chunk-N4CR4FBY-CT58_cui.js → chunk-N4CR4FBY-C1lKPnWl.js} +2 -2
- package/dist/assets/{chunk-QN33PNHL-BboxAxJa.js → chunk-QN33PNHL-Czx-c7tW.js} +1 -1
- package/dist/assets/{chunk-QXUST7PY-BlINr7uS.js → chunk-QXUST7PY-CcYtOR78.js} +1 -1
- package/dist/assets/{chunk-S3R3BYOJ-DI9xzpBm.js → chunk-S3R3BYOJ-JNQMgAH6.js} +1 -1
- package/dist/assets/{chunk-TZMSLE5B-C4sxb3v-.js → chunk-TZMSLE5B-C9T1sILA.js} +1 -1
- package/dist/assets/classDiagram-2ON5EDUG-BqtRsi1m.js +1 -0
- package/dist/assets/classDiagram-v2-WZHVMYZB-CVoqYiM8.js +1 -0
- package/dist/assets/{code-block-37QAKDTI-Cl0NTdrS.js → code-block-37QAKDTI-BeUkwW5f.js} +1 -1
- package/dist/assets/{column-preview-BhU5Ow0e.js → column-preview-CPJFpq_q.js} +1 -1
- package/dist/assets/command-DQqPawJf.js +1 -0
- package/dist/assets/command-palette-BM1QAZTW.js +1 -0
- package/dist/assets/{common-CKAiz8xx.js → common-Df9UcCs1.js} +1 -1
- package/dist/assets/components-CwZhf0Ag.js +1 -0
- package/dist/assets/{components-BZCdnYSp.js → components-D8LTuNe_.js} +1 -1
- package/dist/assets/{config-D9X9QKiL.js → config-BH98g9qk.js} +1 -1
- package/dist/assets/context-CRmPPhx9.js +1 -0
- package/dist/assets/context-aware-panel-Bs4Vepkp.js +3 -0
- package/dist/assets/{copy-DMCkK2TI.js → copy-ICN7wGy0.js} +1 -1
- package/dist/assets/{copy-icon-6RnnFDPt.js → copy-icon-DNppAsmd.js} +1 -1
- package/dist/assets/{createReducer-BcTiTw8T.js → createReducer-BrKCfm9t.js} +1 -1
- package/dist/assets/{dagre-6UL2VRFP-BrBSRtN5.js → dagre-6UL2VRFP-D-I1QR9s.js} +1 -1
- package/dist/assets/{data-grid-overlay-editor-NBBEPhQq.js → data-grid-overlay-editor-DXzdnLZF.js} +1 -1
- package/dist/assets/{datasource-B2Fl6iYU.js → datasource-MEu_GjcC.js} +1 -1
- package/dist/assets/{dates-CzBDvj6R.js → dates-BFWtdOCb.js} +1 -1
- package/dist/assets/{dependency-graph-panel-Dk4iQGft.js → dependency-graph-panel-DddysMUS.js} +1 -1
- package/dist/assets/{diagram-PSM6KHXK-DPC85L-O.js → diagram-PSM6KHXK-DcjdxOTC.js} +1 -1
- package/dist/assets/{diagram-QEK2KX5R-CRPLkmdi.js → diagram-QEK2KX5R-Dx1WtjkT.js} +1 -1
- package/dist/assets/{diagram-S2PKOQOG-Bsc6mZUW.js → diagram-S2PKOQOG-CXJzGs3_.js} +1 -1
- package/dist/assets/{dialog-BXzvlof-.js → dialog-ChkDhlMQ.js} +1 -1
- package/dist/assets/{dist-i0ilBbwP.js → dist-0PMxXIr6.js} +1 -1
- package/dist/assets/{dist-DGPCoel5.js → dist-6HEOc3hy.js} +1 -1
- package/dist/assets/{dist-CEQIJ2pn.js → dist-B7Qj0ClH.js} +1 -1
- package/dist/assets/{dist-C30-xTdI.js → dist-BIYYQefO.js} +1 -1
- package/dist/assets/{dist-Dg61kQNR.js → dist-BQ7MrVoG.js} +1 -1
- package/dist/assets/{dist-CU-Ty5ht.js → dist-BUr9VSV4.js} +1 -1
- package/dist/assets/{dist-BjtLy-VA.js → dist-Bagw3W9X.js} +1 -1
- package/dist/assets/dist-BbkZJt99.js +1 -0
- package/dist/assets/{dist-BTEPE6IB.js → dist-BosZYCjH.js} +1 -1
- package/dist/assets/{dist-Q0--6AMp.js → dist-BrDOLuMx.js} +1 -1
- package/dist/assets/dist-BvqRyXNf.js +1 -0
- package/dist/assets/{dist-DFv45CtW.js → dist-C1g0ZQqM.js} +1 -1
- package/dist/assets/dist-C88PeA-j.js +1 -0
- package/dist/assets/{dist-DQgu-tmt.js → dist-C8DU7LS7.js} +1 -1
- package/dist/assets/dist-CT29HpLU.js +1 -0
- package/dist/assets/dist-CaN3pnGY.js +1 -0
- package/dist/assets/dist-CdZrtzmM.js +1 -0
- package/dist/assets/{dist-Dq_iQ08e.js → dist-Cf47zp7b.js} +1 -1
- package/dist/assets/dist-CiBv1uBX.js +1 -0
- package/dist/assets/dist-Cn-s3n4_.js +1 -0
- package/dist/assets/{dist-DVh79TGS.js → dist-CrFxmtyb.js} +1 -1
- package/dist/assets/{dist-y6DTGoUH.js → dist-CsQrBXB1.js} +1 -1
- package/dist/assets/{dist-BjnzbwCx.js → dist-D-tCQoCo.js} +1 -1
- package/dist/assets/{dist-51xFOPFs.js → dist-D3OoaVQX.js} +1 -1
- package/dist/assets/dist-DHmVMXm2.js +1 -0
- package/dist/assets/dist-DHn8amAr.js +1 -0
- package/dist/assets/dist-DK2oA8K0.js +1 -0
- package/dist/assets/{dist-Bq1BhBMA.js → dist-DKPpxz2S.js} +1 -1
- package/dist/assets/{dist-DwtQnQ8D.js → dist-DPW-YadP.js} +1 -1
- package/dist/assets/{dist-Bbmd3uCi.js → dist-D_4TSZPK.js} +1 -1
- package/dist/assets/dist-Ddx3eonB.js +1 -0
- package/dist/assets/dist-DnPN36vC.js +1 -0
- package/dist/assets/dist-Doi_61Lm.js +1 -0
- package/dist/assets/{dist-Dy5EHuDu.js → dist-Dq1aTs7B.js} +1 -1
- package/dist/assets/dist-Dr9qtoId.js +13 -0
- package/dist/assets/dist-EtvDr9lo.js +1 -0
- package/dist/assets/dist-JYMkroTn.js +1 -0
- package/dist/assets/{dist-DfBASypd.js → dist-Jp_4M-Ei.js} +1 -1
- package/dist/assets/dist-QoV0fohO.js +1 -0
- package/dist/assets/dist-SDO5K7hA.js +3 -0
- package/dist/assets/dist-TtVOJU5I.js +1 -0
- package/dist/assets/dist-doJt8agZ.js +1 -0
- package/dist/assets/{dist-CIuh_TIk.js → dist-etSPFHi_.js} +1 -1
- package/dist/assets/{dist-CqnPIH_S.js → dist-f-ru44Xm.js} +1 -1
- package/dist/assets/{dist-CIU0Lack.js → dist-qkIhd7iG.js} +1 -1
- package/dist/assets/{dist-odxAaH5Z.js → dist-t1vdhOX_.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-Bs1zlxdM.js} +1 -1
- package/dist/assets/download-C06P9lnP.js +9 -0
- package/dist/assets/{dropdown-menu-CKhrfxsx.js → dropdown-menu-Bc2d7Nej.js} +1 -1
- package/dist/assets/edit-page-Bld_fe39.js +13 -0
- package/dist/assets/{erDiagram-Q2GNP2WA-B7kZxL-n.js → erDiagram-Q2GNP2WA-BQUYpiEQ.js} +1 -1
- package/dist/assets/{error-banner-R2OkQKR0.js → error-banner-C2nW22mN.js} +1 -1
- package/dist/assets/{error-panel-CtyexAW6.js → error-panel-B_vII0VN.js} +1 -1
- package/dist/assets/{es-1hBRXVlM.js → es-EPBuIa5m.js} +1 -1
- package/dist/assets/{esm-BQUzYly2.js → esm-Hlfcqnf0.js} +1 -1
- package/dist/assets/{esm-BTyesPLl.js → esm-MvMf2P5n.js} +1 -1
- package/dist/assets/{field-DGtw6Lae.js → field-D-izY3ud.js} +1 -1
- package/dist/assets/file-explorer-panel-BIzyNOVs.js +17 -0
- package/dist/assets/{file-video-camera-Fa5c_iPb.js → file-headphone-daOQzJg0.js} +1 -1
- package/dist/assets/file-icons-C-oatBuk.js +1 -0
- package/dist/assets/{floating-outline-BWK_nLJy.js → floating-outline-BPmtgKWs.js} +1 -1
- package/dist/assets/{flowDiagram-NV44I4VS-DR-64sse.js → flowDiagram-NV44I4VS-xMIxed1s.js} +1 -1
- package/dist/assets/{focus-ShrwcKIv.js → focus-j9zawi1p.js} +1 -1
- package/dist/assets/{form-B7_NRa34.js → form-DrpSpDea.js} +1 -1
- package/dist/assets/{formats-C3K3rlAZ.js → formats-CkafgGfe.js} +1 -1
- package/dist/assets/{formatting-8bP-RDnl.js → formatting-By3b5Lx8.js} +1 -1
- package/dist/assets/{gallery-page-DRBZRnaN.js → gallery-page-BrljeBFe.js} +1 -1
- package/dist/assets/{ganttDiagram-JELNMOA3-BWuQMrGd.js → ganttDiagram-JELNMOA3-Be16Pv8U.js} +1 -1
- package/dist/assets/{gitGraphDiagram-V2S2FVAM-Mr5-PYgM.js → gitGraphDiagram-V2S2FVAM-DQ4scp6S.js} +1 -1
- package/dist/assets/{glide-data-editor-BurnHmgR.js → glide-data-editor-8kdd_nPE.js} +4 -4
- package/dist/assets/{globals-BlB0Ba6E.js → globals-D2ulvntX.js} +1 -1
- package/dist/assets/home-page-O_c6IiAp.js +4 -0
- package/dist/assets/{hooks-BY6oGAlX.js → hooks-Z1j4FmRH.js} +1 -1
- package/dist/assets/html-to-image-D-FY7miL.js +2 -0
- package/dist/assets/image-CBwHq93J.js +1 -0
- package/dist/assets/index-BMdbqayP.js +38 -0
- package/dist/assets/{index-Dzwe9vKA.css → index-fYvRsNGP.css} +1 -1
- package/dist/assets/{infoDiagram-HS3SLOUP-Bs8aKpuZ.js → infoDiagram-HS3SLOUP-DzsICEl9.js} +1 -1
- package/dist/assets/input-GLbHj4DF.js +1 -0
- package/dist/assets/{journeyDiagram-XKPGCS4Q-aCZRxOHn.js → journeyDiagram-XKPGCS4Q-Dt4UItaM.js} +1 -1
- package/dist/assets/{kanban-definition-3W4ZIXB7-BlOJJ-5B.js → kanban-definition-3W4ZIXB7-Do_8fQeU.js} +1 -1
- package/dist/assets/katex-BalO4WMU.js +1 -0
- package/dist/assets/{kiosk-mode-BBqwMND1.js → kiosk-mode-BuLLP9k3.js} +1 -1
- package/dist/assets/{label-DmqkEXI4.js → label-CDwJXweF.js} +1 -1
- package/dist/assets/layout-DQhzfSJn.js +5 -0
- package/dist/assets/{linear-2A1iDmqT.js → linear-c4WCYuol.js} +1 -1
- package/dist/assets/{links-syPBpTLO.js → links-C9QsxOBC.js} +1 -1
- package/dist/assets/{logs-panel-BHFI-jG1.js → logs-panel-BKhNdCxG.js} +1 -1
- package/dist/assets/{maps-8VTEe-0T.js → maps-CTMzJkSk.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-D02U2W2X.js} +4 -4
- package/dist/assets/{menu-items-Bs2e3wuf.js → menu-items-CRjHRaiu.js} +1 -1
- package/dist/assets/mermaid-4DMBBIKO-C2MO8Ayk.js +1 -0
- package/dist/assets/{mermaid-Cq8ttjss.js → mermaid-DJfb-vZs.js} +3 -3
- package/dist/assets/{mermaid-parser.core-DbGD2gKa.js → mermaid-parser.core-C-MdXFgl.js} +1 -1
- package/dist/assets/{mhchem-BJZpIgRF.js → mhchem-DqNBdKjC.js} +1 -1
- package/dist/assets/{mindmap-definition-VGOIOE7T-Dt6ZRws3.js → mindmap-definition-VGOIOE7T-YOE4okXd.js} +1 -1
- package/dist/assets/{multi-map-kCmlVJ-5.js → multi-map-BubyGH4K.js} +1 -1
- package/dist/assets/{name-cell-input-BRHlWy2Y.js → name-cell-input-DOyCua0o.js} +1 -1
- package/dist/assets/{number-overlay-editor-BDnI-mwa.js → number-overlay-editor-zZDGu9D2.js} +1 -1
- package/dist/assets/{numbers-44Cj1Me-.js → numbers-Eb1pfDec.js} +1 -1
- package/dist/assets/{outline-panel-uyRmU3NX.js → outline-panel-CgQ2GmbX.js} +1 -1
- package/dist/assets/{packages-panel-D8d46YWc.js → packages-panel-n8Ssm9M8.js} +1 -1
- package/dist/assets/{panels-Do1_ry1k.js → panels-B4wExe_l.js} +1 -1
- package/dist/assets/{pieDiagram-ADFJNKIX-3GEmpmfg.js → pieDiagram-ADFJNKIX-CjRyNR5b.js} +1 -1
- package/dist/assets/{popover-Cvl9xY6R.js → popover-XNIX-rv1.js} +1 -1
- package/dist/assets/{precisionRound-BOmLQIKI.js → precisionRound-CCOoIlcP.js} +1 -1
- package/dist/assets/{process-output-4yip1nZE.js → process-output-BwkCApeo.js} +1 -1
- package/dist/assets/purify.es-BBn8CPhf.js +2 -0
- package/dist/assets/{quadrantDiagram-AYHSOK5B-Dela17qb.js → quadrantDiagram-AYHSOK5B-ZvWY20UO.js} +1 -1
- package/dist/assets/{react-vega-C6zUovDg.js → react-vega-DzWik59S.js} +1 -1
- package/dist/assets/react-vega-plcnUXVG.js +1 -0
- package/dist/assets/{readonly-python-code-DmjbJYSq.js → readonly-python-code-BFyASvPB.js} +1 -1
- package/dist/assets/{renderShortcut-BJEd-iA7.js → renderShortcut-BjTUrvc5.js} +1 -1
- package/dist/assets/{request-registry-CN4oD1xn.js → request-registry-LM8kl4Xv.js} +1 -1
- package/dist/assets/{requirementDiagram-UZGBJVZJ-CjimGyZ2.js → requirementDiagram-UZGBJVZJ-4LJ2QyR9.js} +1 -1
- package/dist/assets/{run-page-BGijCqbR.js → run-page-BYEyHIaG.js} +1 -1
- package/dist/assets/{runs-BMpRKQKC.js → runs-B4QSIylk.js} +1 -1
- package/dist/assets/{sankeyDiagram-TZEHDZUN-CBE98yUR.js → sankeyDiagram-TZEHDZUN-7OqUpHYR.js} +1 -1
- package/dist/assets/{scratchpad-panel-ByOWj9u_.js → scratchpad-panel-w9Tu3fpH.js} +1 -1
- package/dist/assets/{secrets-panel-C2n4dedt.js → secrets-panel-DAnccD-S.js} +1 -1
- package/dist/assets/{select-DygbgNTD.js → select-DMX8tcVe.js} +1 -1
- package/dist/assets/{sequenceDiagram-WL72ISMW-DSgG0Zyn.js → sequenceDiagram-WL72ISMW-C4sGREOt.js} +1 -1
- package/dist/assets/{session-DnMOyddG.js → session-iz9BPeTp.js} +1 -1
- package/dist/assets/session-panel-k6_Gni4X.js +1 -0
- package/dist/assets/{share-sD4fbzpH.js → share-BWMZuJWY.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-mGo3M47p.js} +1 -1
- package/dist/assets/{spec-Be-iRLAY.js → spec-BQ0QuStT.js} +1 -1
- package/dist/assets/{state-Xu6bDsJl.js → state-CGR3DB1q.js} +1 -1
- package/dist/assets/{state-D2jTOQOG.js → state-CsNC_7dZ.js} +1 -1
- package/dist/assets/{state-B_fNn_z_.js → state-Dj88xOmZ.js} +1 -1
- package/dist/assets/{stateDiagram-FKZM4ZOC-By2PSLiJ.js → stateDiagram-FKZM4ZOC-4PvEH0nH.js} +1 -1
- package/dist/assets/stateDiagram-v2-4FDKWEC3-CpKgwrjU.js +1 -0
- package/dist/assets/stex-BBWVYm-R.js +1 -0
- package/dist/assets/{switch-tdkZNn4k.js → switch-BMqCO9bm.js} +1 -1
- package/dist/assets/{terminal-CGmjeYqa.js → terminal-qMuurRSM.js} +1 -1
- package/dist/assets/{time-BLCpKsnL.js → time-BuGE4zW4.js} +1 -1
- package/dist/assets/{timeline-definition-IT6M3QCI-rq80_nVa.js → timeline-definition-IT6M3QCI-D9wk3zrs.js} +1 -1
- package/dist/assets/{toggle-BhEcsHTu.js → toggle-BYx0fN9n.js} +1 -1
- package/dist/assets/{tooltip-DOQlecCr.js → tooltip-CKZGcDDd.js} +1 -1
- package/dist/assets/{tooltip-D_HRHf_c.js → tooltip-CQeE9o7x.js} +1 -1
- package/dist/assets/{tracing-BZx6nEPl.js → tracing-DTCuFbVV.js} +1 -1
- package/dist/assets/tracing-panel-B1EJu6-W.js +2 -0
- package/dist/assets/{tree-D0AxVJ_I.js → tree-82qhH45u.js} +1 -1
- package/dist/assets/{useAddCell-BRlAqdmq.js → useAddCell-BdUpg_Ta.js} +1 -1
- package/dist/assets/useBoolean-2eWc7NX-.js +1 -0
- package/dist/assets/useCellActionButton-CJ_LAoma.js +1 -0
- package/dist/assets/{useDateFormatter-CmtFqjqu.js → useDateFormatter-DOoVZUts.js} +1 -1
- package/dist/assets/{useDeleteCell-BAfiIxKf.js → useDeleteCell-C1uMlYZu.js} +1 -1
- package/dist/assets/{useDependencyPanelTab-jTu3L200.js → useDependencyPanelTab-nuk9kUr_.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-CyTwCrsi.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-Bh8YMrlo.js +1 -0
- package/dist/assets/{useNumberFormatter-DMA_kIIZ.js → useNumberFormatter-BXZcbTzH.js} +1 -1
- package/dist/assets/usePress-G817DpBk.js +7 -0
- package/dist/assets/{useSplitCell-CB32IpFa.js → useSplitCell-D7EHwIIE.js} +1 -1
- package/dist/assets/{useTheme-CwdqVOYu.js → useTheme-Co8bbxoC.js} +1 -1
- package/dist/assets/{utils-CORJ8yYa.js → utils-C1ZciZbF.js} +1 -1
- package/dist/assets/{vega-component-BLW2fY7v.js → vega-component-CoUjMYqz.js} +1 -1
- package/dist/assets/{vega-loader.browser-CZV6_g2i.js → vega-loader.browser-BJ9oKrvH.js} +1 -1
- package/dist/assets/{write-secret-modal-DuxmGjDn.js → write-secret-modal-DOyKonZB.js} +1 -1
- package/dist/assets/{xychartDiagram-PRI3JC2R-Bnjm0Q9u.js → xychartDiagram-PRI3JC2R-CTDFOoiw.js} +1 -1
- package/dist/index.html +131 -130
- 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/data-table/pagination.tsx +36 -30
- 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/components.tsx +0 -38
- package/src/components/storage/storage-file-viewer.tsx +1 -1
- package/src/components/storage/storage-inspector.tsx +28 -45
- 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/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-BSS73m03.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-HnyO4-L2.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-26-lDVMB.js +0 -13
- package/dist/assets/file-code-D9wtWSiR.js +0 -1
- package/dist/assets/file-explorer-panel-Bv8lRdKl.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-B8ImLAg8.js +0 -38
- package/dist/assets/input-BPldEXfy.js +0 -1
- package/dist/assets/katex-YDobqqVd.js +0 -1
- package/dist/assets/layout-DVAA7kHH.js +0 -5
- package/dist/assets/mermaid-4DMBBIKO-C0QemhGt.js +0 -1
- package/dist/assets/purify.es-CPplrWRQ.js +0 -2
- package/dist/assets/react-vega-1nuO-sn0.js +0 -1
- package/dist/assets/session-panel-B_8ny7jh.js +0 -1
- package/dist/assets/stateDiagram-v2-4FDKWEC3-ct96_mle.js +0 -1
- package/dist/assets/stex-pjf-hOob.js +0 -1
- package/dist/assets/tracing-panel-Dz9mRjXj.js +0 -2
- 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-XGX8NzaB.js +0 -1
- package/dist/assets/usePress-DsLftN-x.js +0 -7
- /package/dist/assets/{Deferred-D2igisxY.js → Deferred-BMfCOLaw.js} +0 -0
- /package/dist/assets/{SSRProvider-DC7ElCZZ.js → SSRProvider-CwqN9FWV.js} +0 -0
- /package/dist/assets/{alert-0YTlkh9P.js → alert-Bs8tbZo_.js} +0 -0
- /package/dist/assets/{badge-CNBv2dAU.js → badge-BUFDGZ04.js} +0 -0
- /package/dist/assets/{blob-CObhN-9g.js → blob-DgooIGjS.js} +0 -0
- /package/dist/assets/{defaultLocale-DK1MWd7f.js → defaultLocale-CGfP-Ye3.js} +0 -0
- /package/dist/assets/{defaultLocale-OkOxlkkM.js → defaultLocale-CuYNS33t.js} +0 -0
- /package/dist/assets/{emotion-is-prop-valid.esm-D7FeWASw.js → emotion-is-prop-valid.esm-lG8j6oqk.js} +0 -0
- /package/dist/assets/{en-US-DBqDb4Nb.js → en-US-k6sS5Nab.js} +0 -0
- /package/dist/assets/{errors-Bfogio62.js → errors-0IrrdfSG.js} +0 -0
- /package/dist/assets/{extends-aq1t6BkR.js → extends-B9D0JO9U.js} +0 -0
- /package/dist/assets/{github-BrsjF9dp.js → github-BY6XM4ej.js} +0 -0
- /package/dist/assets/{isValid-D3F4nmET.js → isValid-CUXKlcrM.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/{link-Cpo6yhBB.js → link-BmtFffTv.js} +0 -0
- /package/dist/assets/{links-BKV6zi_7.js → links-MkDbmF2p.js} +0 -0
- /package/dist/assets/{objectWithoutPropertiesLoose-Dxmp_Bd_.js → objectWithoutPropertiesLoose-CboCOq4o.js} +0 -0
- /package/dist/assets/{ordinal-BEKpVWu-.js → ordinal-DMIExrUm.js} +0 -0
- /package/dist/assets/{paths-bMgYkaP2.js → paths-D2lG83Oh.js} +0 -0
- /package/dist/assets/{play-D4Tdvkms.js → play-CkqWG85-.js} +0 -0
- /package/dist/assets/{plus-B-s-VRHt.js → plus-C9B_qWUi.js} +0 -0
- /package/dist/assets/{preload-helper-TXkS1QI3.js → preload-helper-BW0IMuFq.js} +0 -0
- /package/dist/assets/{prop-types-DRf51_gT.js → prop-types-C638SUfx.js} +0 -0
- /package/dist/assets/{range-DNqFcYmr.js → range-ClqUI25v.js} +0 -0
- /package/dist/assets/{refresh-ccw-BOzRCrXK.js → refresh-ccw-B3lGEyQm.js} +0 -0
- /package/dist/assets/{refresh-cw-DeCFDX1B.js → refresh-cw-fLeDriQe.js} +0 -0
- /package/dist/assets/{rotate-ccw-BG5BZyzw.js → rotate-ccw-DgH8qERb.js} +0 -0
- /package/dist/assets/{save-I_RGv5p0.js → save-C91FTnFa.js} +0 -0
- /package/dist/assets/{settings-DD8FJvQ_.js → settings-DRfuuLRT.js} +0 -0
- /package/dist/assets/{spinner-DCSoZZhh.js → spinner-Dt4SmUsI.js} +0 -0
- /package/dist/assets/{square-oV8Csj8Y.js → square-DZpWT_hp.js} +0 -0
- /package/dist/assets/{square-function-4zY5Dv0P.js → square-function-DEp1ozoA.js} +0 -0
- /package/dist/assets/{stex-FMMSUPAS.js → stex-0ac7Aukl.js} +0 -0
- /package/dist/assets/{trash-2-DtQaB9NM.js → trash-2-CrA4LwJ2.js} +0 -0
- /package/dist/assets/{trash-Basz0Kvc.js → trash-ZGxZ3QGq.js} +0 -0
- /package/dist/assets/{triangle-alert-n1-FF7zs.js → triangle-alert-CzmxsxFO.js} +0 -0
- /package/dist/assets/{types-BhvWC48z.js → types-CswNghXe.js} +0 -0
- /package/dist/assets/{use-toast-BhMe50aT.js → use-toast-Hc8CXlvz.js} +0 -0
- /package/dist/assets/{useAsyncData-DVm0BCFt.js → useAsyncData-CI3ntihq.js} +0 -0
- /package/dist/assets/{useDebounce-BUC67G8E.js → useDebounce-S9zaMzrr.js} +0 -0
- /package/dist/assets/{uuid-ImXS-885.js → uuid-ClFZlR7U.js} +0 -0
- /package/dist/assets/{workflow-CU6kAL_h.js → workflow-DgZ_19fF.js} +0 -0
- /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
|
|
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
|
-
<
|
|
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
|
|
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
|
-
<
|
|
341
|
-
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
-
<
|
|
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
|
-
<
|
|
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>
|
|
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,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({
|
|
@@ -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;
|
|
@@ -92,7 +97,7 @@ export class RunStaleCellsTool
|
|
|
92
97
|
|
|
93
98
|
await runCells({
|
|
94
99
|
cellIds: staleCells,
|
|
95
|
-
sendRun
|
|
100
|
+
sendRun,
|
|
96
101
|
prepareForRun,
|
|
97
102
|
notebook,
|
|
98
103
|
});
|
|
@@ -116,44 +121,59 @@ export class RunStaleCellsTool
|
|
|
116
121
|
const updatedNotebook = store.get(notebookAtom);
|
|
117
122
|
|
|
118
123
|
const cellsToOutput = new Map<CellId, CellOutput | null>();
|
|
119
|
-
let resultMessage = "";
|
|
120
124
|
let outputHasErrors = false;
|
|
125
|
+
let hasAnyConsoleOutput = 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 (
|
|
139
|
+
(cellOutput && this.outputHasErrors(cellOutput)) ||
|
|
140
|
+
(hasConsoleOutput &&
|
|
141
|
+
consoleOutputs.some((output) => this.outputHasErrors(output)))
|
|
142
|
+
) {
|
|
143
|
+
outputHasErrors = true;
|
|
144
|
+
}
|
|
145
|
+
|
|
134
146
|
if (!cellOutput && !hasConsoleOutput) {
|
|
135
|
-
// Set null to show no output
|
|
136
147
|
cellsToOutput.set(cellId, null);
|
|
137
148
|
continue;
|
|
138
149
|
}
|
|
139
150
|
|
|
151
|
+
// If total budget exceeded, summarize remaining cells
|
|
152
|
+
if (totalOutputChars >= MAX_TOOL_OUTPUT_CHARS) {
|
|
153
|
+
cellsToOutput.set(cellId, {
|
|
154
|
+
cellOutput: "Cell executed (output omitted due to context limits).",
|
|
155
|
+
});
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
let cellOutputString: string | undefined;
|
|
160
|
+
let consoleOutputString: string | undefined;
|
|
161
|
+
|
|
140
162
|
if (cellOutput) {
|
|
141
163
|
cellOutputString = this.formatOutputString(cellOutput);
|
|
142
|
-
|
|
143
|
-
outputHasErrors = true;
|
|
144
|
-
}
|
|
164
|
+
totalOutputChars += cellOutputString.length;
|
|
145
165
|
}
|
|
146
166
|
|
|
147
167
|
if (hasConsoleOutput) {
|
|
168
|
+
hasAnyConsoleOutput = true;
|
|
148
169
|
consoleOutputString = consoleOutputs
|
|
149
170
|
.map((output) => this.formatOutputString(output))
|
|
150
171
|
.join("\n");
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
}
|
|
172
|
+
consoleOutputString = this.truncateString(
|
|
173
|
+
consoleOutputString,
|
|
174
|
+
MAX_TEXT_OUTPUT_CHARS,
|
|
175
|
+
);
|
|
176
|
+
totalOutputChars += consoleOutputString.length;
|
|
157
177
|
}
|
|
158
178
|
|
|
159
179
|
cellsToOutput.set(cellId, {
|
|
@@ -179,43 +199,58 @@ export class RunStaleCellsTool
|
|
|
179
199
|
return {
|
|
180
200
|
status: "success",
|
|
181
201
|
cellsToOutput: Object.fromEntries(cellsToOutput),
|
|
182
|
-
message:
|
|
202
|
+
message: hasAnyConsoleOutput
|
|
203
|
+
? "Console output represents the stdout or stderr of the cell (eg. print statements)."
|
|
204
|
+
: undefined,
|
|
183
205
|
next_steps: nextSteps,
|
|
184
206
|
};
|
|
185
207
|
};
|
|
186
208
|
|
|
187
209
|
private outputHasErrors(cellOutput: BaseOutput): boolean {
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
output.mimetype === "application/vnd.marimo+
|
|
191
|
-
|
|
192
|
-
) {
|
|
193
|
-
return true;
|
|
194
|
-
}
|
|
195
|
-
return false;
|
|
210
|
+
return (
|
|
211
|
+
cellOutput.output.mimetype === "application/vnd.marimo+error" ||
|
|
212
|
+
cellOutput.output.mimetype === "application/vnd.marimo+traceback"
|
|
213
|
+
);
|
|
196
214
|
}
|
|
197
215
|
|
|
198
216
|
private formatOutputString(cellOutput: BaseOutput): string {
|
|
199
|
-
let outputString = "";
|
|
200
217
|
const { outputType, processedContent, imageUrl, output } = cellOutput;
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
} else if (typeof output.data === "string") {
|
|
206
|
-
outputString += output.data;
|
|
207
|
-
} else {
|
|
208
|
-
outputString += JSON.stringify(output.data);
|
|
209
|
-
}
|
|
210
|
-
} else if (outputType === "media") {
|
|
211
|
-
outputString += `Media Output: Contains ${output.mimetype} content`;
|
|
212
|
-
if (imageUrl) {
|
|
213
|
-
outputString += `\nImage URL: ${imageUrl}`;
|
|
214
|
-
}
|
|
218
|
+
|
|
219
|
+
if (outputType === "media") {
|
|
220
|
+
const base = `Media Output: Contains ${output.mimetype} content`;
|
|
221
|
+
return imageUrl ? `${base}\nImage URL: ${imageUrl}` : base;
|
|
215
222
|
}
|
|
216
|
-
|
|
223
|
+
|
|
224
|
+
if (output.mimetype === "text/html") {
|
|
225
|
+
// text/html (e.g. plotly figures, rich dataframes) can be millions of
|
|
226
|
+
// chars and is not interpretable by LLMs — summarize instead
|
|
227
|
+
const dataLength =
|
|
228
|
+
typeof output.data === "string"
|
|
229
|
+
? output.data.length
|
|
230
|
+
: JSON.stringify(output.data).length;
|
|
231
|
+
return `HTML Output: text/html content (${dataLength.toLocaleString()} chars). Full output visible in notebook UI.`;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
const maxChars = this.outputHasErrors(cellOutput)
|
|
235
|
+
? MAX_ERROR_OUTPUT_CHARS
|
|
236
|
+
: MAX_TEXT_OUTPUT_CHARS;
|
|
237
|
+
|
|
238
|
+
let content = processedContent;
|
|
239
|
+
if (!content) {
|
|
240
|
+
content =
|
|
241
|
+
typeof output.data === "string"
|
|
242
|
+
? output.data
|
|
243
|
+
: JSON.stringify(output.data);
|
|
244
|
+
}
|
|
245
|
+
return `Output:\n${this.truncateString(content, maxChars)}`;
|
|
217
246
|
}
|
|
218
247
|
|
|
248
|
+
private truncateString(str: string, maxLength: number): string {
|
|
249
|
+
if (str.length <= maxLength) {
|
|
250
|
+
return str;
|
|
251
|
+
}
|
|
252
|
+
return `${str.slice(0, maxLength)}\n\n[TRUNCATED: ${str.length.toLocaleString()} → ${maxLength.toLocaleString()} chars. Full output visible in the notebook UI.]`;
|
|
253
|
+
}
|
|
219
254
|
/**
|
|
220
255
|
* Wait for cells to finish executing (status becomes "idle")
|
|
221
256
|
* Returns true if all cells finished executing, false if the timeout was reached
|