@marimo-team/islands 0.22.1-dev4 → 0.22.1-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/{ConnectedDataExplorerComponent-Dl1grr8z.js → ConnectedDataExplorerComponent-DuD8BVl6.js} +54 -54
- package/dist/{Plot-WhbJAbBh.js → Plot-BxlSHo0G.js} +47 -38
- package/dist/_basePickBy-Sow3pJjS.js +41 -0
- package/dist/{_baseUniq-B4eL5sTC.js → _baseUniq-C87CckHL.js} +15 -54
- package/dist/{any-language-editor-CT_9yBde.js → any-language-editor-BHH_pQ6M.js} +21 -21
- package/dist/architecture-7HQA4BMR-BHdkAMvZ.js +6 -0
- package/dist/{architectureDiagram-VXUJARFQ-vxgYGIMP.js → architectureDiagram-VXUJARFQ-B3YQo9At.js} +15 -15
- package/dist/{arrays-Du-jRBAy.js → arrays-beUWo8RF.js} +1 -1
- package/dist/assets/__vite-browser-external-WSlCcXn_.js +1 -0
- package/dist/assets/{worker-D10K3OOz.js → worker-DUYMdbtA.js} +2 -2
- package/dist/{blockDiagram-VD42YOAC-C7x6YTH7.js → blockDiagram-VD42YOAC-CpQ3TKEN.js} +7 -7
- package/dist/{button-qsiIHncQ.js → button-DNlNlZY_.js} +82 -84
- package/dist/{c4Diagram-YG6GDRKO-Cx4oseGg.js → c4Diagram-YG6GDRKO-CZSU4uqU.js} +4 -4
- package/dist/{capabilities-26mwv03y.js → capabilities-Coe9eM9T.js} +2 -2
- package/dist/{channel-C_50jIAn.js → channel-X3JKk8gE.js} +1 -1
- package/dist/{chat-ui-CtqUthFR.js → chat-ui-Cel1kBfc.js} +147 -146
- package/dist/{check-D_YwHEgY.js → check-CWUkiHmb.js} +1 -1
- package/dist/{chunk-4F5CHEZ2-Dvo_CFnR.js → chunk-4F5CHEZ2-D5mClyDv.js} +1 -1
- package/dist/{chunk-ABZYJK2D-D5YIs71w.js → chunk-ABZYJK2D-CZYCCtLy.js} +1 -1
- package/dist/{chunk-ATLVNIR6-CyOjzOcf.js → chunk-ATLVNIR6-DaOzLLgN.js} +1 -1
- package/dist/{chunk-B2363JML-BzZqINRO.js → chunk-B2363JML-Br0eA2T3.js} +1 -1
- package/dist/{chunk-B4BG7PRW-ZJeV3KdD.js → chunk-B4BG7PRW-4BjV11Br.js} +4 -4
- package/dist/{chunk-DI55MBZ5-Dx_wwX6l.js → chunk-DI55MBZ5-DITY3EyP.js} +4 -4
- package/dist/{chunk-EXTU4WIE-CgefpSXQ.js → chunk-EXTU4WIE-jUPSAk3i.js} +1 -1
- package/dist/{chunk-FRFDVMJY-Derq8UzY.js → chunk-FRFDVMJY-DnEvEFRR.js} +1 -1
- package/dist/{chunk-JA3XYJ7Z-CcIOIFpc.js → chunk-JA3XYJ7Z-BcPEfxk_.js} +2 -2
- package/dist/{chunk-JZLCHNYA-CgO0GG1p.js → chunk-JZLCHNYA-2bnLL3xL.js} +4 -4
- package/dist/{chunk-N4CR4FBY-2qzGzAxT.js → chunk-N4CR4FBY-CpZSuGSU.js} +5 -5
- package/dist/{chunk-PL6DKKU2-KoG71Zin.js → chunk-PL6DKKU2-DnId6G-x.js} +1 -1
- package/dist/{chunk-QN33PNHL-Dp1qBo28.js → chunk-QN33PNHL-B9p5ojHB.js} +1 -1
- package/dist/{chunk-QXUST7PY-BxmmeIwf.js → chunk-QXUST7PY-Ch6F5Obl.js} +5 -5
- package/dist/{chunk-S3R3BYOJ-D3Rys9ZW.js → chunk-S3R3BYOJ-B0UOFJwq.js} +3 -3
- package/dist/{chunk-SJTYNZTY-Co-DhKAG.js → chunk-SJTYNZTY-BsBZnJUj.js} +1 -1
- package/dist/{chunk-TCCFYFTB-BAhzIqBO.js → chunk-TCCFYFTB-Clbl-fTg.js} +8 -7
- package/dist/{chunk-TQ3KTPDO-DxYI735Z.js → chunk-TQ3KTPDO-CFkSQ30e.js} +1 -1
- package/dist/{chunk-TZMSLE5B-Dxumt0wv.js → chunk-TZMSLE5B-D45397J2.js} +1 -1
- package/dist/{chunk-UMXZTB3W-CuahpKin.js → chunk-UMXZTB3W-D-A834Bq.js} +1 -1
- package/dist/{classDiagram-v2-WZHVMYZB-CYoFMQKE.js → classDiagram-2ON5EDUG-C8-zE3Zv.js} +10 -10
- package/dist/{classDiagram-2ON5EDUG-DkOvXRlx.js → classDiagram-v2-WZHVMYZB-DrmbGANl.js} +10 -10
- package/dist/{clone-DDndUqI0.js → clone-DZFQCtFJ.js} +1 -1
- package/dist/{constants-D1Am36hX.js → constants-CvyfaCvs.js} +3 -3
- package/dist/{copy-CBo9JcJW.js → copy-B7781WJ3.js} +2 -2
- package/dist/{dagre-6UL2VRFP-BXBaU8PB.js → dagre-6UL2VRFP-OMItEBnY.js} +12 -12
- package/dist/{dagre-D3dlYz-r.js → dagre-QVd-lCXU.js} +13 -23
- package/dist/{data-grid-overlay-editor-nZux6_d2.js → data-grid-overlay-editor-lKF301ME.js} +1 -1
- package/dist/{diagram-PSM6KHXK-CJxjk4LG.js → diagram-PSM6KHXK-CkKbohWI.js} +16 -16
- package/dist/{diagram-QEK2KX5R-IMILPh_p.js → diagram-QEK2KX5R-DjUMpVcx.js} +14 -14
- package/dist/{diagram-S2PKOQOG-6O0g6Boj.js → diagram-S2PKOQOG-b-c0d-wZ.js} +14 -14
- package/dist/{dist-BkXs8bw0.js → dist--6TSlp8H.js} +1 -1
- package/dist/dist-7K5doRvB.js +6 -0
- package/dist/{dist-CQidOwep.js → dist-B43sbpd0.js} +3 -3
- package/dist/dist-B6I_A2-E.js +8 -0
- package/dist/dist-BEQsmaZY.js +5 -0
- package/dist/dist-BasY2RHp.js +8 -0
- package/dist/{dist-BemtTYzN.js → dist-Bfp1XXWt.js} +5 -5
- package/dist/{dist-v-1kgqZ3.js → dist-BjDuO5JW.js} +1 -1
- package/dist/dist-Bosc00dY.js +5 -0
- package/dist/{dist-DLNKBPsk.js → dist-BrxqmS9Q.js} +4 -4
- package/dist/{dist-DBYL08Lu.js → dist-BvhGByxL.js} +4 -4
- package/dist/{dist-CVqlhD3M.js → dist-C4bq5Ioy.js} +2 -2
- package/dist/{dist-DwmxBUOe.js → dist-CFKdzOIu.js} +2 -2
- package/dist/{dist-5nTQE2yt.js → dist-CIB8w0Fl.js} +2 -2
- package/dist/{dist-C-EcLtO9.js → dist-CNF0QBLR.js} +1 -1
- package/dist/dist-CQMZOn-_.js +8 -0
- package/dist/dist-CViQhWZ8.js +5 -0
- package/dist/{dist-Dg65j0em.js → dist-CcMfr7jD.js} +1 -1
- package/dist/{dist-C0XYIHKJ.js → dist-Ci0CXEFt.js} +1 -1
- package/dist/dist-Cz6rLfwY.js +5 -0
- package/dist/dist-D8eq8st3.js +6 -0
- package/dist/{dist-qoCY8giM.js → dist-DAfcmt-d.js} +2 -2
- package/dist/{dist-B6Op2ogv.js → dist-DD_cYHOl.js} +2 -2
- package/dist/{dist-BUSLKXcu.js → dist-DFK94vuS.js} +2 -2
- package/dist/{dist-DBXPlQ0D.js → dist-DGNtjMZu.js} +1 -1
- package/dist/{dist-C9qF7MRB.js → dist-DJ9F1eHs.js} +2 -2
- package/dist/{dist-Ci_jEudG.js → dist-DJKubHDd.js} +1 -1
- package/dist/{dist-CnFp2Kcl.js → dist-DLafRu9s.js} +2 -2
- package/dist/dist-DM1UDXdl.js +5 -0
- package/dist/dist-DNrtWPgS.js +5 -0
- package/dist/dist-D_UjpfOY.js +1381 -0
- package/dist/{dist-DmFS6KZW.js → dist-DbnBiLNH.js} +3 -3
- package/dist/{dist-BiZZAo22.js → dist-DlSUOIm9.js} +1 -1
- package/dist/{dist-DStU8He1.js → dist-Doy0mQDg.js} +2 -2
- package/dist/{dist-CxAX99oC.js → dist-DpkJHKB8.js} +2 -2
- package/dist/{dist-DjaZNkZ7.js → dist-LhQNUe5A.js} +3 -3
- package/dist/dist-V7q2qnpA.js +5 -0
- package/dist/{dist-BJ3fhRYu.js → dist-VqF3W_ue.js} +2 -2
- package/dist/dist-a5_hPgu2.js +8 -0
- package/dist/{dist-B9KLrfoh.js → dist-ej6AQKaS.js} +1 -1
- package/dist/{dist-Brb6VNc4.js → dist-m9tsXsFf.js} +2 -2
- package/dist/{dist-CBwMSFDu.js → dist-tGk0aZ--.js} +2 -2
- package/dist/dist-uVyZcV1-.js +5 -0
- package/dist/{erDiagram-Q2GNP2WA-sho7Cl9f.js → erDiagram-Q2GNP2WA-CDhLaOZ1.js} +10 -10
- package/dist/{error-banner-Bx9kIgrs.js → error-banner-Cjf0RU9I.js} +79 -79
- package/dist/{esm-CMg2ABu6.js → esm-4wmsH2lp.js} +6 -6
- package/dist/{esm-cqK9POGH.js → esm-CD1iby2n.js} +23 -23
- package/dist/{flowDiagram-NV44I4VS-C4nY4Fbz.js → flowDiagram-NV44I4VS-BDi4O4CL.js} +10 -10
- package/dist/{ganttDiagram-JELNMOA3-CtxNcCM2.js → ganttDiagram-JELNMOA3-BpZE6kVp.js} +3 -3
- package/dist/{gitGraph-G5XIXVHT-SL6TDof6.js → gitGraph-G5XIXVHT-B_c6xFJv.js} +3 -3
- package/dist/{gitGraphDiagram-V2S2FVAM-D9885mxd.js → gitGraphDiagram-V2S2FVAM-iQnXzbPM.js} +13 -13
- package/dist/{glide-data-editor-CkVEV-Gk.js → glide-data-editor-BqnvTmDo.js} +1739 -1708
- package/dist/{graphlib-CxWdvYQt.js → graphlib-BV1_gi0C.js} +4 -3
- package/dist/hasIn-DnfJcYpY.js +108 -0
- package/dist/{info-VBDWY6EO-6MXPTSmi.js → info-VBDWY6EO-BTyzxmhr.js} +3 -3
- package/dist/{infoDiagram-HS3SLOUP-Bw2FlRwF.js → infoDiagram-HS3SLOUP-OYrX6uO3.js} +13 -13
- package/dist/{input-BSde8uV4.js → input-CFY9gApZ.js} +5055 -5055
- package/dist/{isEmpty-BQtUinxJ.js → isEmpty-B7FX9wKt.js} +1 -1
- package/dist/{isSymbol-DFp8040B.js → isSymbol-DCbjQG_U.js} +1 -1
- package/dist/{journeyDiagram-XKPGCS4Q-BXlCEth8.js → journeyDiagram-XKPGCS4Q-ClPC94aN.js} +3 -3
- package/dist/{kanban-definition-3W4ZIXB7-CorxzSYm.js → kanban-definition-3W4ZIXB7-DHEAKdZt.js} +7 -7
- package/dist/{label-DTNqw9tv.js → label-DbZGAoCH.js} +538 -569
- package/dist/{loader-3c9hT4kT.js → loader-Bd1kgLn7.js} +19 -16
- package/dist/main.js +3203 -3105
- package/dist/{memoize-CuHciEBb.js → memoize-CSTI9eOX.js} +1 -1
- package/dist/{merge-CA_buyY3.js → merge-CVhG7q_o.js} +1 -1
- package/dist/{mermaid-CEKslOkI.js → mermaid-B2HDLx2g.js} +54 -54
- package/dist/{mermaid-parser.core-cq4YDee-.js → mermaid-parser.core-ntCgyx0x.js} +8 -8
- package/dist/min-Ds3gG0Ff.js +96 -0
- package/dist/{mindmap-definition-VGOIOE7T-DRsT8UaN.js → mindmap-definition-VGOIOE7T-CxEUZZvY.js} +9 -9
- package/dist/{now-CXAdKY5k.js → now-nrrrOr01.js} +1 -1
- package/dist/{once-CZno0h-b.js → once-C_TIu-kR.js} +1 -1
- package/dist/{packet-DYOGHKS2-Dw08gMaZ.js → packet-DYOGHKS2-BhvnpoGi.js} +3 -3
- package/dist/{pie-VRWISCQL-C5SPSvT8.js → pie-VRWISCQL-dILuA3iG.js} +3 -3
- package/dist/{pieDiagram-ADFJNKIX-DhJ1Cx2O.js → pieDiagram-ADFJNKIX-U3LrUqAS.js} +14 -14
- package/dist/{process-output-KyzWazB-.js → process-output-DC1TOnIl.js} +3184 -3207
- package/dist/{quadrantDiagram-AYHSOK5B-DXUFIWlz.js → quadrantDiagram-AYHSOK5B-BVWuq-3R.js} +2 -2
- package/dist/{radar-ZZBFDIW7-BvY0bgSg.js → radar-ZZBFDIW7-DwFrOJDj.js} +3 -3
- package/dist/range-fJeId9Ri.js +30 -0
- package/dist/{requirementDiagram-UZGBJVZJ-DO_gtQIb.js → requirementDiagram-UZGBJVZJ-D0zpQnKC.js} +9 -9
- package/dist/{sankeyDiagram-TZEHDZUN-OZzXEkuG.js → sankeyDiagram-TZEHDZUN-CExy1joT.js} +2 -2
- package/dist/{sequenceDiagram-WL72ISMW-K7nZRifV.js → sequenceDiagram-WL72ISMW-D1BJxLjH.js} +4 -4
- package/dist/{slides-component-CIcSvFh7.js → slides-component-CX2JC-Ws.js} +2 -2
- package/dist/{spec-DYaR1rJh.js → spec-CD7QaCV-.js} +3 -3
- package/dist/{stateDiagram-FKZM4ZOC-DzXJZAq7.js → stateDiagram-FKZM4ZOC-B1S8jGMn.js} +12 -12
- package/dist/{stateDiagram-v2-4FDKWEC3-BZBPUmyF.js → stateDiagram-v2-4FDKWEC3-BH5ozUbc.js} +10 -10
- package/dist/stex-CQDv3aS8.js +4 -0
- package/dist/style.css +1 -1
- package/dist/{timeline-definition-IT6M3QCI-DNoLAh-i.js → timeline-definition-IT6M3QCI-BDT9JAmn.js} +2 -2
- package/dist/{toDate-D6VXexnV.js → toDate-CUqpEbBS.js} +5 -5
- package/dist/{toNumber-xFPoy1OI.js → toNumber-55tjPCWr.js} +2 -2
- package/dist/tooltip-BXEpXV3R.js +404 -0
- package/dist/{treemap-GDKQZRPO-C5OoxpmV.js → treemap-GDKQZRPO-bx2ngsgN.js} +3 -3
- package/dist/{types-CQ-RbYxp.js → types-D_ntCXg0.js} +3 -3
- package/dist/{useAsyncData-Cd4Urlww.js → useAsyncData-rN1nzPaS.js} +2 -2
- package/dist/{useDeepCompareMemoize-X7clcrcQ.js → useDeepCompareMemoize-Ch-7Rk2x.js} +4 -4
- package/dist/{useIframeCapabilities-BVQrlRBd.js → useIframeCapabilities-CqhrVue6.js} +1 -1
- package/dist/useLifecycle-4fA1pHoh.js +177 -0
- package/dist/{useTheme-Dm1WaAGy.js → useTheme-MWfxn4oz.js} +4 -5
- package/dist/{vega-component-A6unyUJS.js → vega-component-CPhNLfZZ.js} +25 -25
- package/dist/{xychartDiagram-PRI3JC2R-ehVeySMW.js → xychartDiagram-PRI3JC2R-CuAZiqHS.js} +5 -5
- package/dist/{Combination-B--d1_LV.js → zod-C6UGQ3fz.js} +8085 -8151
- package/package.json +8 -41
- package/src/__mocks__/common.ts +4 -4
- package/src/__tests__/main.test.tsx +12 -14
- package/src/components/ai/ai-provider-icon.tsx +3 -2
- package/src/components/app-config/user-config-form.tsx +0 -27
- package/src/components/chat/acp/agent-docs.tsx +3 -3
- package/src/components/chat/acp/agent-panel.tsx +71 -24
- package/src/components/chat/acp/agent-selector.tsx +2 -11
- package/src/components/chat/acp/state.ts +15 -3
- package/src/components/chat/chat-history-popover.tsx +1 -1
- package/src/components/chat/chat-panel.tsx +2 -1
- package/src/components/data-table/TableBottomBar.tsx +12 -1
- package/src/components/data-table/TableTopBar.tsx +31 -35
- package/src/components/data-table/__tests__/columns.test.tsx +7 -7
- package/src/components/data-table/cell-hover-template/types.ts +1 -1
- package/src/components/data-table/cell-hover-text/types.ts +1 -1
- package/src/components/data-table/cell-selection/__tests__/feature.test.ts +1 -1
- package/src/components/data-table/cell-selection/types.ts +4 -3
- package/src/components/data-table/cell-styling/types.ts +1 -1
- package/src/components/data-table/charts/chart-spec/altair-generator.ts +2 -2
- package/src/components/data-table/charts/charts.tsx +42 -13
- package/src/components/data-table/charts/components/chart-items.tsx +1 -1
- package/src/components/data-table/column-explorer-panel/column-explorer.tsx +1 -1
- package/src/components/data-table/column-formatting/types.ts +5 -4
- package/src/components/data-table/column-header.tsx +4 -2
- package/src/components/data-table/column-summary/legacy-chart-spec.ts +1 -1
- package/src/components/data-table/column-wrapping/types.ts +4 -3
- package/src/components/data-table/columns.tsx +4 -1
- package/src/components/data-table/copy-column/types.ts +4 -3
- package/src/components/data-table/data-table.tsx +16 -11
- package/src/components/data-table/focus-row/types.ts +4 -3
- package/src/components/data-table/loading-table.tsx +5 -2
- package/src/components/data-table/pagination.tsx +1 -1
- package/src/components/data-table/range-focus/__tests__/atoms.test.ts +13 -13
- package/src/components/data-table/range-focus/__tests__/use-cell-range-selection.test.ts +9 -11
- package/src/components/data-table/range-focus/atoms.ts +2 -2
- package/src/components/data-table/range-focus/cell-selection-stats.tsx +3 -1
- package/src/components/data-table/row-viewer-panel/row-viewer.tsx +1 -1
- package/src/components/data-table/table-explorer-panel/table-explorer-panel.tsx +2 -2
- package/src/components/dependency-graph/dependency-graph-tree.tsx +1 -1
- package/src/components/editor/__tests__/data-attributes.test.tsx +93 -94
- package/src/components/editor/__tests__/dynamic-favicon.test.tsx +1 -1
- package/src/components/editor/actions/name-cell-input.tsx +4 -2
- package/src/components/editor/actions/pair-with-agent-modal.tsx +142 -0
- package/src/components/editor/actions/useCellActionButton.tsx +4 -2
- package/src/components/editor/actions/useNotebookActions.tsx +10 -0
- package/src/components/editor/ai/add-cell-with-ai.tsx +2 -1
- package/src/components/editor/ai/ai-completion-editor.tsx +1 -1
- package/src/components/editor/app-container.tsx +1 -1
- package/src/components/editor/cell/CellStatus.tsx +4 -5
- package/src/components/editor/cell/cell-context-menu.tsx +4 -2
- package/src/components/editor/cell/code/cell-editor.tsx +3 -2
- package/src/components/editor/cell/toolbar.tsx +2 -1
- package/src/components/editor/chrome/components/contribute-snippet-button.tsx +4 -1
- package/src/components/editor/chrome/components/feedback-button.tsx +4 -1
- package/src/components/editor/chrome/panels/context-aware-panel/context-aware-panel.tsx +1 -1
- package/src/components/editor/chrome/panels/empty-state.tsx +1 -0
- package/src/components/editor/chrome/panels/file-explorer-panel.tsx +0 -10
- package/src/components/editor/chrome/panels/snippets-panel.tsx +1 -1
- package/src/components/editor/chrome/panels/write-secret-modal.tsx +1 -1
- package/src/components/editor/chrome/wrapper/app-chrome.tsx +4 -1
- package/src/components/editor/chrome/wrapper/footer-items/lsp-status.tsx +2 -1
- package/src/components/editor/chrome/wrapper/storage.ts +2 -2
- package/src/components/editor/connections/database/as-code.ts +1 -1
- package/src/components/editor/connections/form-renderers.tsx +1 -1
- package/src/components/editor/connections/storage/as-code.ts +1 -1
- package/src/components/editor/controls/keyboard-shortcuts.tsx +1 -1
- package/src/components/editor/header/filename-input.tsx +4 -1
- package/src/components/editor/links/cell-link-list.tsx +1 -1
- package/src/components/editor/navigation/__tests__/navigation.test.ts +1 -1
- package/src/components/editor/navigation/clipboard.ts +1 -1
- package/src/components/editor/navigation/multi-cell-action-toolbar.tsx +2 -2
- package/src/components/editor/navigation/navigation.ts +3 -3
- package/src/components/editor/notebook-cell.tsx +1 -1
- package/src/components/editor/output/JsonOutput.tsx +6 -6
- package/src/components/editor/output/ansi-reduce.ts +2 -2
- package/src/components/editor/output/console/ConsoleOutput.tsx +2 -2
- package/src/components/editor/renderers/cells-renderer.tsx +1 -1
- package/src/components/editor/renderers/grid-layout/grid-layout.tsx +1 -1
- package/src/components/editor/renderers/plugins.ts +1 -1
- package/src/components/editor/renderers/slides-layout/types.ts +2 -2
- package/src/components/editor/renderers/vertical-layout/__tests__/useFocusFirstEditor.test.ts +2 -2
- package/src/components/editor/renderers/vertical-layout/__tests__/vertical-layout.test.ts +1 -1
- package/src/components/editor/renderers/vertical-layout/vertical-layout.tsx +12 -13
- package/src/components/find-replace/find-replace.tsx +3 -1
- package/src/components/forms/form.tsx +1 -1
- package/src/components/forms/options.ts +1 -1
- package/src/components/pages/gallery-page.tsx +1 -1
- package/src/components/static-html/static-banner.tsx +2 -2
- package/src/components/storage/__tests__/storage-snippets.test.ts +4 -6
- package/src/components/terminal/terminal.tsx +4 -4
- package/src/components/tracing/tracing.test.tsx +30 -30
- package/src/components/ui/accordion.tsx +1 -1
- package/src/components/ui/alert-dialog.tsx +1 -1
- package/src/components/ui/badge.tsx +2 -1
- package/src/components/ui/button.tsx +5 -4
- package/src/components/ui/calendar.tsx +3 -2
- package/src/components/ui/checkbox.tsx +1 -1
- package/src/components/ui/combobox.tsx +2 -1
- package/src/components/ui/command.tsx +5 -2
- package/src/components/ui/context-menu.tsx +1 -1
- package/src/components/ui/date-input.tsx +7 -6
- package/src/components/ui/date-picker.tsx +6 -4
- package/src/components/ui/dialog.tsx +1 -1
- package/src/components/ui/draggable-popover.tsx +1 -1
- package/src/components/ui/dropdown-menu.tsx +2 -1
- package/src/components/ui/field.tsx +1 -2
- package/src/components/ui/form.tsx +4 -5
- package/src/components/ui/fullscreen.tsx +4 -1
- package/src/components/ui/label.tsx +1 -1
- package/src/components/ui/navigation.tsx +1 -1
- package/src/components/ui/popover.tsx +1 -1
- package/src/components/ui/progress.tsx +4 -3
- package/src/components/ui/query-param-preserving-link.tsx +4 -2
- package/src/components/ui/radio-group.tsx +1 -1
- package/src/components/ui/range-slider.tsx +1 -1
- package/src/components/ui/scroll-area.tsx +1 -1
- package/src/components/ui/select.tsx +1 -1
- package/src/components/ui/sheet.tsx +3 -2
- package/src/components/ui/slider.tsx +1 -1
- package/src/components/ui/switch.tsx +1 -1
- package/src/components/ui/tabs.tsx +1 -1
- package/src/components/ui/textarea.tsx +1 -2
- package/src/components/ui/toast.tsx +1 -1
- package/src/components/ui/toggle.tsx +1 -1
- package/src/components/ui/tooltip.tsx +1 -1
- package/src/components/variables/variables-table.tsx +1 -1
- package/src/core/ai/context/providers/__tests__/datasource.test.ts +1 -1
- package/src/core/ai/context/providers/__tests__/error.test.ts +1 -1
- package/src/core/ai/context/providers/__tests__/variable.test.ts +1 -1
- package/src/core/ai/context/providers/cell-output.ts +1 -2
- package/src/core/ai/context/registry.ts +2 -2
- package/src/core/ai/tools/edit-notebook-tool.ts +4 -3
- package/src/core/ai/tools/registry.ts +1 -1
- package/src/core/ai/tools/run-cells-tool.ts +4 -3
- package/src/core/cells/__tests__/add-missing-import.test.ts +23 -22
- package/src/core/cells/__tests__/cell.test.ts +14 -13
- package/src/core/cells/__tests__/cells.test.ts +2 -2
- package/src/core/cells/__tests__/scrollCellIntoView.test.ts +1 -1
- package/src/core/cells/__tests__/session.test.ts +1 -1
- package/src/core/cells/__tests__/utils.test.ts +1 -1
- package/src/core/cells/cells.ts +2 -2
- package/src/core/cells/ids.ts +1 -1
- package/src/core/cells/logs.ts +1 -1
- package/src/core/codemirror/ai/request.ts +1 -1
- package/src/core/codemirror/cells/__tests__/extensions.test.ts +15 -17
- package/src/core/codemirror/cells/traceback-decorations.ts +1 -1
- package/src/core/codemirror/copilot/__tests__/language-server.test.ts +1 -1
- package/src/core/codemirror/copilot/__tests__/transport.test.ts +129 -3
- package/src/core/codemirror/copilot/client.ts +9 -2
- package/src/core/codemirror/copilot/getCodes.ts +1 -1
- package/src/core/codemirror/copilot/language-server.ts +12 -1
- package/src/core/codemirror/copilot/transport.ts +34 -8
- package/src/core/codemirror/copilot/types.ts +1 -1
- package/src/core/codemirror/facet.ts +1 -1
- package/src/core/codemirror/language/__tests__/sql.test.ts +4 -4
- package/src/core/codemirror/language/languages/markdown.ts +1 -3
- package/src/core/codemirror/language/languages/python.ts +4 -0
- package/src/core/codemirror/language/languages/sql/completion-builder.ts +1 -1
- package/src/core/codemirror/language/languages/sql/completion-sources.tsx +4 -6
- package/src/core/codemirror/language/languages/sql/sql.ts +1 -3
- package/src/core/codemirror/language/metadata.ts +1 -1
- package/src/core/codemirror/language/panel/sql.tsx +4 -1
- package/src/core/codemirror/language/types.ts +1 -1
- package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +1 -1
- package/src/core/codemirror/lsp/notebook-lsp.ts +1 -1
- package/src/core/codemirror/misc/__tests__/dnd.test.ts +1 -1
- package/src/core/codemirror/reactive-references/__tests__/analyzer.test.ts +28 -42
- package/src/core/codemirror/rtc/loro/awareness.ts +1 -1
- package/src/core/config/__tests__/config-schema.test.ts +2 -6
- package/src/core/config/config-schema.ts +0 -1
- package/src/core/config/feature-flag.tsx +1 -3
- package/src/core/datasets/data-source-connections.ts +4 -2
- package/src/core/datasets/state.ts +1 -1
- package/src/core/dom/__tests__/htmlUtils.test.ts +8 -14
- package/src/core/dom/__tests__/outline.test.ts +2 -3
- package/src/core/dom/outline.ts +1 -1
- package/src/core/edit-app.tsx +4 -1
- package/src/core/export/__tests__/hooks.test.ts +1 -1
- package/src/core/hotkeys/__tests__/hotkeys.test.ts +1 -1
- package/src/core/hotkeys/shortcuts.ts +1 -1
- package/src/core/islands/__tests__/bridge.test.ts +2 -2
- package/src/core/islands/__tests__/parse.test.ts +8 -7
- package/src/core/islands/bridge.ts +2 -2
- package/src/core/islands/components/output-wrapper.tsx +1 -1
- package/src/core/islands/parse.ts +1 -1
- package/src/core/lsp/__tests__/transport.test.ts +1 -1
- package/src/core/network/CachingRequestRegistry.ts +1 -1
- package/src/core/network/DeferredRequestRegistry.ts +1 -1
- package/src/core/network/__tests__/requests-network.test.ts +1 -1
- package/src/core/network/api.ts +2 -2
- package/src/core/network/requests-lazy.ts +1 -1
- package/src/core/network/requests-toasting.tsx +1 -1
- package/src/core/runtime/runtime.ts +1 -0
- package/src/core/saving/__tests__/filename.test.ts +7 -6
- package/src/core/static/__tests__/download-html.test.ts +16 -15
- package/src/core/static/__tests__/files.test.ts +30 -28
- package/src/core/static/files.ts +1 -1
- package/src/core/vscode/vscode-bindings.ts +1 -1
- package/src/core/wasm/bridge.ts +3 -3
- package/src/core/wasm/worker/tracer.ts +1 -1
- package/src/core/websocket/useWebSocket.tsx +5 -3
- package/src/css/app/Cell.css +25 -1
- package/src/css/globals.css +18 -16
- package/src/css/table.css +17 -0
- package/src/custom.d.ts +1 -1
- package/src/hooks/__tests__/useDuplicateShortcuts.test.ts +3 -3
- package/src/hooks/debug.ts +3 -3
- package/src/hooks/useDebounce.ts +1 -1
- package/src/hooks/useEventListener.ts +1 -1
- package/src/hooks/useHotkey.ts +1 -1
- package/src/hooks/useLifecycle.ts +2 -2
- package/src/hooks/useNonce.ts +1 -1
- package/src/hooks/useResizeObserver.ts +2 -2
- package/src/main.tsx +1 -1
- package/src/plugins/core/BadPlugin.tsx +7 -6
- package/src/plugins/core/RenderHTML.tsx +3 -3
- package/src/plugins/core/__test__/registerReactComponent.test.ts +1 -1
- package/src/plugins/core/registerReactComponent.tsx +4 -4
- package/src/plugins/core/rpc.ts +1 -1
- package/src/plugins/impl/CheckboxPlugin.tsx +4 -1
- package/src/plugins/impl/DataEditorPlugin.tsx +8 -3
- package/src/plugins/impl/DataTablePlugin.tsx +6 -2
- package/src/plugins/impl/FileBrowserPlugin.tsx +1 -1
- package/src/plugins/impl/FormPlugin.tsx +2 -3
- package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +4 -1
- package/src/plugins/impl/__tests__/MatrixPlugin.test.tsx +1 -1
- package/src/plugins/impl/__tests__/SliderPlugin.test.tsx +43 -15
- package/src/plugins/impl/anywidget/AnyWidgetPlugin.tsx +3 -12
- package/src/plugins/impl/anywidget/__tests__/model.test.ts +2 -2
- package/src/plugins/impl/anywidget/model.ts +1 -1
- package/src/plugins/impl/anywidget/types.ts +2 -2
- package/src/plugins/impl/anywidget/widget-binding.ts +1 -1
- package/src/plugins/impl/chat/ChatPlugin.tsx +1 -1
- package/src/plugins/impl/chat/chat-ui.tsx +5 -2
- package/src/plugins/impl/data-editor/glide-data-editor.tsx +2 -2
- package/src/plugins/impl/data-explorer/ConnectedDataExplorerComponent.tsx +2 -2
- package/src/plugins/impl/data-explorer/components/query-form.tsx +1 -1
- package/src/plugins/impl/data-explorer/functions/function.ts +1 -1
- package/src/plugins/impl/data-explorer/queries/types.ts +1 -1
- package/src/plugins/impl/data-frames/DataFramePlugin.tsx +1 -1
- package/src/plugins/impl/data-frames/forms/__tests__/form.test.tsx +7 -9
- package/src/plugins/impl/data-frames/forms/renderers.tsx +1 -1
- package/src/plugins/impl/data-frames/utils/operators.ts +1 -1
- package/src/plugins/impl/matplotlib/MatplotlibPlugin.tsx +1 -1
- package/src/plugins/impl/mpl-interactive/MplInteractivePlugin.tsx +1 -1
- package/src/plugins/impl/panel/PanelPlugin.tsx +2 -2
- package/src/plugins/impl/plotly/Plot.tsx +3 -3
- package/src/plugins/impl/plotly/PlotlyPlugin.tsx +65 -103
- package/src/plugins/impl/plotly/__tests__/PlotlyPlugin.test.tsx +114 -0
- package/src/plugins/impl/plotly/__tests__/selection.test.ts +199 -0
- package/src/plugins/impl/plotly/selection.ts +333 -0
- package/src/plugins/impl/vega/__tests__/make-selectable.test.ts +13 -14
- package/src/plugins/impl/vega/__tests__/utils.test.ts +68 -0
- package/src/plugins/impl/vega/batched.ts +1 -1
- package/src/plugins/impl/vega/make-selectable.ts +3 -3
- package/src/plugins/impl/vega/types.ts +1 -1
- package/src/plugins/impl/vega/utils.ts +14 -5
- package/src/plugins/impl/vega/vega.css +2 -1
- package/src/plugins/layout/DownloadPlugin.tsx +1 -1
- package/src/plugins/layout/ImageComparisonPlugin.tsx +1 -3
- package/src/plugins/layout/LazyPlugin.tsx +1 -1
- package/src/plugins/layout/RoutesPlugin.tsx +1 -1
- package/src/plugins/layout/mermaid/mermaid.tsx +1 -1
- package/src/plugins/plugins.ts +1 -1
- package/src/plugins/stateless-plugin.ts +4 -2
- package/src/stories/data-explorer.stories.tsx +1 -1
- package/src/stories/dataframe.stories.tsx +1 -1
- package/src/stories/editor.stories.tsx +1 -1
- package/src/stories/select.stories.tsx +1 -1
- package/src/stories/switchable-multi-select.stories.tsx +1 -1
- package/src/utils/Logger.ts +1 -1
- package/src/utils/__tests__/arrays.test.ts +1 -1
- package/src/utils/__tests__/blob.test.ts +1 -1
- package/src/utils/__tests__/cell-urls.test.ts +24 -21
- package/src/utils/__tests__/dates.test.ts +1 -1
- package/src/utils/__tests__/errors.test.ts +1 -1
- package/src/utils/__tests__/filenames.test.ts +15 -14
- package/src/utils/__tests__/json-parser.test.ts +14 -21
- package/src/utils/__tests__/multi-map.test.ts +3 -3
- package/src/utils/__tests__/objects.test.ts +3 -3
- package/src/utils/__tests__/path.test.ts +34 -31
- package/src/utils/__tests__/urls.test.ts +19 -18
- package/src/utils/__tests__/versions.test.ts +5 -5
- package/src/utils/__tests__/waitForWs.test.ts +1 -1
- package/src/utils/arrays.ts +2 -2
- package/src/utils/assertNever.ts +1 -1
- package/src/utils/batch-requests.ts +2 -2
- package/src/utils/createReducer.ts +2 -2
- package/src/utils/id-tree.tsx +2 -2
- package/src/utils/idle.ts +1 -1
- package/src/utils/invariant.ts +1 -2
- package/src/utils/json/base64.ts +2 -5
- package/src/utils/maps.ts +1 -1
- package/src/utils/math.ts +0 -1
- package/src/utils/mime-types.ts +1 -1
- package/src/utils/multi-map.ts +1 -1
- package/src/utils/objects.ts +1 -1
- package/src/utils/once.ts +2 -2
- package/src/utils/staticImplements.ts +1 -1
- package/src/utils/storage/jotai.ts +1 -1
- package/src/utils/tracer.ts +3 -2
- package/dist/_basePickBy-QjOmBDRE.js +0 -110
- package/dist/_baseSet-xgn1IbGV.js +0 -27
- package/dist/architecture-7HQA4BMR-BRyVh_Za.js +0 -6
- package/dist/assets/__vite-browser-external-Us1ds95c.js +0 -1
- package/dist/dist-B0R_ZM4-.js +0 -6
- package/dist/dist-B4a9_9pj.js +0 -5
- package/dist/dist-BCSUKEwO.js +0 -5
- package/dist/dist-BONIDQq6.js +0 -5
- package/dist/dist-BYeRx2hb.js +0 -5
- package/dist/dist-D2Rk1j4R.js +0 -1381
- package/dist/dist-DZjX5TYv.js +0 -5
- package/dist/dist-Dkw9x6kc.js +0 -5
- package/dist/dist-Ds6UaXGR.js +0 -6
- package/dist/dist-KuEJ1Q53.js +0 -8
- package/dist/dist-S72WNyTZ.js +0 -5
- package/dist/dist-bTG-yssT.js +0 -5
- package/dist/dist-diF0sguc.js +0 -8
- package/dist/dist-mJ84BIgu.js +0 -8
- package/dist/dist-wSIhFWQz.js +0 -8
- package/dist/get-CqrzlV1v.js +0 -68
- package/dist/range-CYz5jI--.js +0 -17
- package/dist/stex-CZyTRGVB.js +0 -4
- package/dist/tooltip-DGHTbHl5.js +0 -404
- package/dist/useLifecycle-Dids8BPm.js +0 -173
- /package/dist/{dist-KZI_BHqV.js → dist-CxZvoNao.js} +0 -0
- /package/dist/{invariant-D4hPsZFI.js → invariant-e8eBgdux.js} +0 -0
- /package/dist/{isArrayLikeObject-C-hFPChh.js → isArrayLikeObject-LXbTYiBa.js} +0 -0
- /package/dist/{main-CvkAPtaq.js → main-XimWhSi_.js} +0 -0
- /package/dist/{purify.es-ukiMXY-F.js → purify.es-hTCfRGdl.js} +0 -0
- /package/dist/{react-dom-BKwCWYPW.js → react-dom-BSUuJjCR.js} +0 -0
- /package/dist/{stex-Ze8D4R_5.js → stex-D887Ylhf.js} +0 -0
package/src/core/cells/cells.ts
CHANGED
|
@@ -80,7 +80,7 @@ export interface NotebookState {
|
|
|
80
80
|
*/
|
|
81
81
|
history: {
|
|
82
82
|
name: string;
|
|
83
|
-
//
|
|
83
|
+
// oxlint-disable-next-line typescript/no-explicit-any
|
|
84
84
|
serializedEditorState: any;
|
|
85
85
|
column: CellColumnId;
|
|
86
86
|
index: CellIndex;
|
|
@@ -1226,7 +1226,7 @@ const {
|
|
|
1226
1226
|
i--;
|
|
1227
1227
|
}
|
|
1228
1228
|
|
|
1229
|
-
const collapseRanges = reversedCollapseRanges.
|
|
1229
|
+
const collapseRanges = reversedCollapseRanges.toReversed();
|
|
1230
1230
|
return column.collapseAll(collapseRanges);
|
|
1231
1231
|
}),
|
|
1232
1232
|
};
|
package/src/core/cells/ids.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
-
/*
|
|
2
|
+
/* oxlint-disable typescript/no-redeclare */
|
|
3
3
|
|
|
4
4
|
import type { components } from "@marimo-team/marimo-api";
|
|
5
5
|
import { OBJECT_ID_ATTR } from "@/core/dom/ui-element-constants";
|
package/src/core/cells/logs.ts
CHANGED
|
@@ -98,7 +98,7 @@ const CellLogLogger = {
|
|
|
98
98
|
? "red"
|
|
99
99
|
: "orange";
|
|
100
100
|
const status = payload.level.toUpperCase();
|
|
101
|
-
|
|
101
|
+
// oxlint-disable-next-line no-console -- intentional debug logging
|
|
102
102
|
console.log(
|
|
103
103
|
`%c[${status}]`,
|
|
104
104
|
`color:${color}; padding:2px 0; border-radius:2px; font-weight:bold`,
|
|
@@ -18,24 +18,22 @@ function createTransaction(spec: TransactionSpec) {
|
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
describe("shouldAutorunMarkdownUpdate", () => {
|
|
21
|
-
it.each([
|
|
22
|
-
"
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
changes: { from: 0, insert: "#" },
|
|
29
|
-
annotations: [Transaction.userEvent.of(userEvent)],
|
|
30
|
-
});
|
|
21
|
+
it.each(["input.type", "delete.backward", "undo", "redo"])(
|
|
22
|
+
"accepts local %s transactions",
|
|
23
|
+
(userEvent) => {
|
|
24
|
+
const transaction = createTransaction({
|
|
25
|
+
changes: { from: 0, insert: "#" },
|
|
26
|
+
annotations: [Transaction.userEvent.of(userEvent)],
|
|
27
|
+
});
|
|
31
28
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
29
|
+
expect(
|
|
30
|
+
shouldAutorunMarkdownUpdate({
|
|
31
|
+
docChanged: transaction.docChanged,
|
|
32
|
+
transactions: [transaction],
|
|
33
|
+
}),
|
|
34
|
+
).toBe(true);
|
|
35
|
+
},
|
|
36
|
+
);
|
|
39
37
|
|
|
40
38
|
it("ignores formatting changes", () => {
|
|
41
39
|
const transaction = createTransaction({
|
|
@@ -32,7 +32,7 @@ function createErrorDecorations(state: EditorState, errors: TracebackInfos) {
|
|
|
32
32
|
// Filter and sort errors by line number to ensure they're added in order
|
|
33
33
|
const relevantErrors = errors
|
|
34
34
|
.filter((error) => error.kind === "cell" && error.cellId === cellId)
|
|
35
|
-
.
|
|
35
|
+
.toSorted((a, b) => a.lineNumber - b.lineNumber);
|
|
36
36
|
|
|
37
37
|
for (const error of relevantErrors) {
|
|
38
38
|
try {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
-
/*
|
|
2
|
+
/* oxlint-disable typescript/no-explicit-any */
|
|
3
3
|
|
|
4
4
|
import { Transport } from "@open-rpc/client-js/build/transports/Transport";
|
|
5
5
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
-
/*
|
|
2
|
+
/* oxlint-disable typescript/no-explicit-any */
|
|
3
3
|
|
|
4
4
|
import { WebSocketTransport } from "@open-rpc/client-js";
|
|
5
5
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
@@ -365,7 +365,7 @@ describe("LazyWebsocketTransport", () => {
|
|
|
365
365
|
expect(delegate.connect).toHaveBeenCalled();
|
|
366
366
|
});
|
|
367
367
|
|
|
368
|
-
it("should
|
|
368
|
+
it("should use maxTimeoutMs as default when no timeout is provided", async () => {
|
|
369
369
|
const transport = new LazyWebsocketTransport({
|
|
370
370
|
getWsUrl: mockGetWsUrl,
|
|
371
371
|
waitForReady: mockWaitForReady,
|
|
@@ -376,12 +376,29 @@ describe("LazyWebsocketTransport", () => {
|
|
|
376
376
|
await transport.connect();
|
|
377
377
|
|
|
378
378
|
const data: any = { method: "test", params: [] };
|
|
379
|
-
await transport.sendData(data,
|
|
379
|
+
await transport.sendData(data, undefined);
|
|
380
380
|
|
|
381
381
|
const delegate = (transport as any).delegate;
|
|
382
382
|
expect(delegate.sendData).toHaveBeenCalledWith(data, 5000);
|
|
383
383
|
});
|
|
384
384
|
|
|
385
|
+
it("should respect caller-provided timeout without clamping", async () => {
|
|
386
|
+
const transport = new LazyWebsocketTransport({
|
|
387
|
+
getWsUrl: mockGetWsUrl,
|
|
388
|
+
waitForReady: mockWaitForReady,
|
|
389
|
+
showError: mockShowError,
|
|
390
|
+
maxTimeoutMs: 5000,
|
|
391
|
+
});
|
|
392
|
+
|
|
393
|
+
await transport.connect();
|
|
394
|
+
|
|
395
|
+
const data: any = { method: "test", params: [] };
|
|
396
|
+
await transport.sendData(data, 30_000);
|
|
397
|
+
|
|
398
|
+
const delegate = (transport as any).delegate;
|
|
399
|
+
expect(delegate.sendData).toHaveBeenCalledWith(data, 30_000);
|
|
400
|
+
});
|
|
401
|
+
|
|
385
402
|
it("should throw error if reconnection fails", async () => {
|
|
386
403
|
const connectionError = new Error("Connection failed");
|
|
387
404
|
(WebSocketTransport as any).mockImplementation(function (this: any) {
|
|
@@ -407,6 +424,115 @@ describe("LazyWebsocketTransport", () => {
|
|
|
407
424
|
});
|
|
408
425
|
});
|
|
409
426
|
|
|
427
|
+
describe("onReconnect", () => {
|
|
428
|
+
it("should call onReconnect after close + sendData reconnection", async () => {
|
|
429
|
+
const transport = new LazyWebsocketTransport({
|
|
430
|
+
getWsUrl: mockGetWsUrl,
|
|
431
|
+
waitForReady: mockWaitForReady,
|
|
432
|
+
showError: mockShowError,
|
|
433
|
+
});
|
|
434
|
+
|
|
435
|
+
const onReconnect = vi.fn().mockResolvedValue(undefined);
|
|
436
|
+
transport.onReconnect = onReconnect;
|
|
437
|
+
|
|
438
|
+
// Initial connect
|
|
439
|
+
await transport.connect();
|
|
440
|
+
expect(onReconnect).not.toHaveBeenCalled();
|
|
441
|
+
|
|
442
|
+
// Close the transport (simulates failure handling)
|
|
443
|
+
transport.close();
|
|
444
|
+
|
|
445
|
+
// sendData should reconnect and call onReconnect
|
|
446
|
+
const data: any = { method: "test", params: [] };
|
|
447
|
+
await transport.sendData(data, 5000);
|
|
448
|
+
|
|
449
|
+
expect(onReconnect).toHaveBeenCalledTimes(1);
|
|
450
|
+
});
|
|
451
|
+
|
|
452
|
+
it("should NOT call onReconnect on initial sendData connection", async () => {
|
|
453
|
+
const transport = new LazyWebsocketTransport({
|
|
454
|
+
getWsUrl: mockGetWsUrl,
|
|
455
|
+
waitForReady: mockWaitForReady,
|
|
456
|
+
showError: mockShowError,
|
|
457
|
+
});
|
|
458
|
+
|
|
459
|
+
const onReconnect = vi.fn().mockResolvedValue(undefined);
|
|
460
|
+
transport.onReconnect = onReconnect;
|
|
461
|
+
|
|
462
|
+
// sendData without prior connect — this is the initial connection
|
|
463
|
+
const data: any = { method: "test", params: [] };
|
|
464
|
+
await transport.sendData(data, 5000);
|
|
465
|
+
|
|
466
|
+
expect(onReconnect).not.toHaveBeenCalled();
|
|
467
|
+
});
|
|
468
|
+
|
|
469
|
+
it("should call onReconnect after tryConnect failure + retry via sendData", async () => {
|
|
470
|
+
let connectAttempt = 0;
|
|
471
|
+
(WebSocketTransport as any).mockImplementation(function (this: any) {
|
|
472
|
+
this.connect = vi.fn().mockImplementation(() => {
|
|
473
|
+
connectAttempt++;
|
|
474
|
+
// First 2 attempts fail (retries=2 exhausted), then succeed on next sendData
|
|
475
|
+
if (connectAttempt <= 2) {
|
|
476
|
+
return Promise.reject(new Error("Connection failed"));
|
|
477
|
+
}
|
|
478
|
+
return Promise.resolve(undefined);
|
|
479
|
+
});
|
|
480
|
+
this.close = vi.fn();
|
|
481
|
+
this.sendData = vi.fn().mockResolvedValue({ result: "success" });
|
|
482
|
+
this.subscribe = vi.fn();
|
|
483
|
+
this.unsubscribe = vi.fn();
|
|
484
|
+
});
|
|
485
|
+
|
|
486
|
+
const transport = new LazyWebsocketTransport({
|
|
487
|
+
getWsUrl: mockGetWsUrl,
|
|
488
|
+
waitForReady: mockWaitForReady,
|
|
489
|
+
showError: mockShowError,
|
|
490
|
+
retries: 2,
|
|
491
|
+
retryDelayMs: 10,
|
|
492
|
+
});
|
|
493
|
+
|
|
494
|
+
const onReconnect = vi.fn().mockResolvedValue(undefined);
|
|
495
|
+
transport.onReconnect = onReconnect;
|
|
496
|
+
|
|
497
|
+
// Initial connect fails (all retries exhausted)
|
|
498
|
+
await expect(transport.connect()).rejects.toThrow("Connection failed");
|
|
499
|
+
expect(onReconnect).not.toHaveBeenCalled();
|
|
500
|
+
|
|
501
|
+
// Now sendData reconnects successfully
|
|
502
|
+
const data: any = { method: "test", params: [] };
|
|
503
|
+
await transport.sendData(data, 5000);
|
|
504
|
+
|
|
505
|
+
expect(onReconnect).toHaveBeenCalledTimes(1);
|
|
506
|
+
});
|
|
507
|
+
|
|
508
|
+
it("should propagate onReconnect rejection and allow retry", async () => {
|
|
509
|
+
const transport = new LazyWebsocketTransport({
|
|
510
|
+
getWsUrl: mockGetWsUrl,
|
|
511
|
+
waitForReady: mockWaitForReady,
|
|
512
|
+
showError: mockShowError,
|
|
513
|
+
});
|
|
514
|
+
|
|
515
|
+
const reconnectError = new Error("Re-initialization failed");
|
|
516
|
+
const onReconnect = vi.fn().mockRejectedValueOnce(reconnectError);
|
|
517
|
+
transport.onReconnect = onReconnect;
|
|
518
|
+
|
|
519
|
+
await transport.connect();
|
|
520
|
+
transport.close();
|
|
521
|
+
|
|
522
|
+
const data: any = { method: "test", params: [] };
|
|
523
|
+
await expect(transport.sendData(data, 5000)).rejects.toThrow(
|
|
524
|
+
"Re-initialization failed",
|
|
525
|
+
);
|
|
526
|
+
expect(onReconnect).toHaveBeenCalledTimes(1);
|
|
527
|
+
|
|
528
|
+
// needsReInitialization should still be true, so a subsequent retry
|
|
529
|
+
// will attempt onReconnect again
|
|
530
|
+
onReconnect.mockResolvedValueOnce(undefined);
|
|
531
|
+
await transport.sendData(data, 5000);
|
|
532
|
+
expect(onReconnect).toHaveBeenCalledTimes(2);
|
|
533
|
+
});
|
|
534
|
+
});
|
|
535
|
+
|
|
410
536
|
describe("close", () => {
|
|
411
537
|
it("should close delegate and clear it", async () => {
|
|
412
538
|
const transport = new LazyWebsocketTransport({
|
|
@@ -37,13 +37,20 @@ export const createWSTransport = once(() => {
|
|
|
37
37
|
export const getCopilotClient = once(() => {
|
|
38
38
|
const userConfig = store.get(resolvedMarimoConfigAtom);
|
|
39
39
|
const copilotSettings = userConfig.ai?.github?.copilot_settings ?? {};
|
|
40
|
+
const transport = createWSTransport();
|
|
40
41
|
|
|
41
|
-
|
|
42
|
+
const client = new CopilotLanguageServerClient({
|
|
42
43
|
rootUri: FILE_URI,
|
|
43
44
|
workspaceFolders: null,
|
|
44
|
-
transport
|
|
45
|
+
transport,
|
|
45
46
|
copilotSettings,
|
|
46
47
|
});
|
|
48
|
+
|
|
49
|
+
// Re-run the LSP initialize handshake when the transport reconnects
|
|
50
|
+
// after a close or connection failure.
|
|
51
|
+
transport.onReconnect = () => client.reInitialize();
|
|
52
|
+
|
|
53
|
+
return client;
|
|
47
54
|
});
|
|
48
55
|
|
|
49
56
|
export function copilotServer() {
|
|
@@ -86,6 +86,17 @@ export class CopilotLanguageServerClient extends LanguageServerClient {
|
|
|
86
86
|
});
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
+
/**
|
|
90
|
+
* Re-run the LSP initialize handshake and send configuration.
|
|
91
|
+
* Called by the transport's onReconnect callback after reconnecting.
|
|
92
|
+
*/
|
|
93
|
+
async reInitialize(): Promise<void> {
|
|
94
|
+
logger.log("#reInitialize: Re-initializing LSP connection");
|
|
95
|
+
this.initializePromise = this.initialize();
|
|
96
|
+
await this.initializePromise;
|
|
97
|
+
await this.sendConfiguration();
|
|
98
|
+
}
|
|
99
|
+
|
|
89
100
|
private async sendConfiguration() {
|
|
90
101
|
const settings = this.copilotSettings;
|
|
91
102
|
// Skip if no settings are provided
|
|
@@ -110,7 +121,7 @@ export class CopilotLanguageServerClient extends LanguageServerClient {
|
|
|
110
121
|
).request(method, params);
|
|
111
122
|
}
|
|
112
123
|
|
|
113
|
-
//
|
|
124
|
+
// oxlint-disable-next-line typescript/no-explicit-any
|
|
114
125
|
override async notify(method: any, params: any): Promise<any> {
|
|
115
126
|
logger.debug("#notify", method, params);
|
|
116
127
|
return super.notify(method, params);
|
|
@@ -36,7 +36,8 @@ export interface LazyWebsocketTransportOptions {
|
|
|
36
36
|
retryDelayMs?: number;
|
|
37
37
|
|
|
38
38
|
/**
|
|
39
|
-
*
|
|
39
|
+
* Default timeout for sendData operations in milliseconds.
|
|
40
|
+
* Used when the caller does not provide an explicit timeout.
|
|
40
41
|
* @default 5000
|
|
41
42
|
*/
|
|
42
43
|
maxTimeoutMs?: number;
|
|
@@ -60,6 +61,13 @@ export class LazyWebsocketTransport extends Transport {
|
|
|
60
61
|
private delegate: WebSocketTransport | undefined;
|
|
61
62
|
private pendingSubscriptions: Subscription[] = [];
|
|
62
63
|
private readonly options: Required<LazyWebsocketTransportOptions>;
|
|
64
|
+
private needsReInitialization = false;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Callback invoked after the transport reconnects following a close or connection failure.
|
|
68
|
+
* Used by the LSP client to re-run the initialize handshake on the new connection.
|
|
69
|
+
*/
|
|
70
|
+
onReconnect?: () => Promise<void>;
|
|
63
71
|
|
|
64
72
|
constructor(options: LazyWebsocketTransportOptions) {
|
|
65
73
|
super();
|
|
@@ -157,11 +165,11 @@ export class LazyWebsocketTransport extends Transport {
|
|
|
157
165
|
);
|
|
158
166
|
if (attempt === this.options.retries) {
|
|
159
167
|
this.delegate = undefined;
|
|
168
|
+
this.needsReInitialization = true;
|
|
160
169
|
// Show error toast on final retry
|
|
161
170
|
this.options.showError(
|
|
162
171
|
"GitHub Copilot Connection Error",
|
|
163
|
-
|
|
164
|
-
prettyError(error),
|
|
172
|
+
`Failed to connect to GitHub Copilot. Please check your settings and try again.\n\n${prettyError(error)}`,
|
|
165
173
|
);
|
|
166
174
|
throw error;
|
|
167
175
|
}
|
|
@@ -183,6 +191,7 @@ export class LazyWebsocketTransport extends Transport {
|
|
|
183
191
|
override close(): void {
|
|
184
192
|
this.delegate?.close();
|
|
185
193
|
this.delegate = undefined;
|
|
194
|
+
this.needsReInitialization = true;
|
|
186
195
|
}
|
|
187
196
|
|
|
188
197
|
override async sendData(
|
|
@@ -200,8 +209,28 @@ export class LazyWebsocketTransport extends Transport {
|
|
|
200
209
|
Logger.error("Copilot#sendData: Failed to reconnect transport", error);
|
|
201
210
|
throw new Error(
|
|
202
211
|
"Unable to connect to GitHub Copilot. Please check your settings and try again.",
|
|
212
|
+
{ cause: error },
|
|
203
213
|
);
|
|
204
214
|
}
|
|
215
|
+
|
|
216
|
+
// Re-run LSP initialization handshake after reconnecting
|
|
217
|
+
if (this.needsReInitialization && this.onReconnect) {
|
|
218
|
+
Logger.log(
|
|
219
|
+
"Copilot#sendData: Re-initializing LSP after reconnection...",
|
|
220
|
+
);
|
|
221
|
+
try {
|
|
222
|
+
await this.onReconnect();
|
|
223
|
+
this.needsReInitialization = false;
|
|
224
|
+
} catch (error) {
|
|
225
|
+
// Close the uninitialized connection so the next attempt starts fresh
|
|
226
|
+
this.close();
|
|
227
|
+
Logger.error(
|
|
228
|
+
"Copilot#sendData: LSP re-initialization after reconnection failed",
|
|
229
|
+
error,
|
|
230
|
+
);
|
|
231
|
+
throw error;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
205
234
|
}
|
|
206
235
|
|
|
207
236
|
// After reconnection, delegate should be initialized
|
|
@@ -211,11 +240,8 @@ export class LazyWebsocketTransport extends Transport {
|
|
|
211
240
|
);
|
|
212
241
|
}
|
|
213
242
|
|
|
214
|
-
//
|
|
215
|
-
timeout =
|
|
216
|
-
timeout ?? this.options.maxTimeoutMs,
|
|
217
|
-
this.options.maxTimeoutMs,
|
|
218
|
-
);
|
|
243
|
+
// Use maxTimeoutMs as default when no timeout is provided
|
|
244
|
+
timeout = timeout ?? this.options.maxTimeoutMs;
|
|
219
245
|
return this.delegate.sendData(data, timeout);
|
|
220
246
|
}
|
|
221
247
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
-
/*
|
|
2
|
+
/* oxlint-disable typescript/no-empty-object-type */
|
|
3
3
|
|
|
4
4
|
export interface GitHubCopilotSignInInitiateResult {
|
|
5
5
|
verificationUri: string; // https://github.com/login/device
|
|
@@ -15,7 +15,7 @@ import { Facet } from "@codemirror/state";
|
|
|
15
15
|
export function singleFacet<T>() {
|
|
16
16
|
return Facet.define<T, T>({
|
|
17
17
|
combine: (values) => {
|
|
18
|
-
//
|
|
18
|
+
// oxlint-disable-next-line typescript/no-non-null-assertion
|
|
19
19
|
return values.find((v) => v !== undefined)!;
|
|
20
20
|
},
|
|
21
21
|
});
|
|
@@ -1722,9 +1722,9 @@ describe("tablesCompletionSource", () => {
|
|
|
1722
1722
|
};
|
|
1723
1723
|
|
|
1724
1724
|
const getCompletion = (extensions: Extension[]) => {
|
|
1725
|
-
//
|
|
1725
|
+
// oxlint-disable-next-line typescript/no-explicit-any
|
|
1726
1726
|
const ext = extensions.find((ext) => (ext as any).facet === undefined);
|
|
1727
|
-
//
|
|
1727
|
+
// oxlint-disable-next-line typescript/no-explicit-any
|
|
1728
1728
|
return (ext as any)?.value?.override?.[0];
|
|
1729
1729
|
};
|
|
1730
1730
|
|
|
@@ -2140,7 +2140,7 @@ describe("tablesCompletionSource", () => {
|
|
|
2140
2140
|
...mockStore.get(dataSourceConnectionsAtom),
|
|
2141
2141
|
connectionsMap: new Map([
|
|
2142
2142
|
[TEST_ENGINE, newConnection],
|
|
2143
|
-
//
|
|
2143
|
+
// oxlint-disable-next-line typescript/no-explicit-any
|
|
2144
2144
|
]) as any,
|
|
2145
2145
|
latestEngineSelected: TEST_ENGINE,
|
|
2146
2146
|
});
|
|
@@ -2153,7 +2153,7 @@ describe("tablesCompletionSource", () => {
|
|
|
2153
2153
|
mockStore.set(dataSourceConnectionsAtom, {
|
|
2154
2154
|
connectionsMap: new Map([
|
|
2155
2155
|
[TEST_ENGINE, mockConnection],
|
|
2156
|
-
//
|
|
2156
|
+
// oxlint-disable-next-line typescript/no-explicit-any
|
|
2157
2157
|
]) as any,
|
|
2158
2158
|
latestEngineSelected: TEST_ENGINE,
|
|
2159
2159
|
});
|
|
@@ -38,9 +38,7 @@ export const MARKDOWN_INITIAL_HIDE_CODE = true;
|
|
|
38
38
|
/**
|
|
39
39
|
* Language adapter for Markdown.
|
|
40
40
|
*/
|
|
41
|
-
export class MarkdownLanguageAdapter
|
|
42
|
-
implements LanguageAdapter<MarkdownLanguageAdapterMetadata>
|
|
43
|
-
{
|
|
41
|
+
export class MarkdownLanguageAdapter implements LanguageAdapter<MarkdownLanguageAdapterMetadata> {
|
|
44
42
|
private parser = new MarkdownParser();
|
|
45
43
|
|
|
46
44
|
readonly type = "markdown";
|
|
@@ -45,6 +45,7 @@ import type { LanguageAdapter } from "../types";
|
|
|
45
45
|
|
|
46
46
|
const pylspClient = once((lspConfig: LSPConfig) => {
|
|
47
47
|
// Create a mutable reference for the resync callback
|
|
48
|
+
// oxlint-disable-next-line prefer-const -- reassigned after closure capture
|
|
48
49
|
let resyncCallback: (() => Promise<void>) | undefined;
|
|
49
50
|
|
|
50
51
|
const transport = createTransport("pylsp", async () => {
|
|
@@ -151,6 +152,7 @@ const pylspClient = once((lspConfig: LSPConfig) => {
|
|
|
151
152
|
});
|
|
152
153
|
|
|
153
154
|
const tyLspClient = once((_: LSPConfig) => {
|
|
155
|
+
// oxlint-disable-next-line prefer-const -- reassigned after closure capture
|
|
154
156
|
let resyncCallback: (() => Promise<void>) | undefined;
|
|
155
157
|
|
|
156
158
|
const transport = createTransport("ty", async () => {
|
|
@@ -181,6 +183,7 @@ const tyLspClient = once((_: LSPConfig) => {
|
|
|
181
183
|
|
|
182
184
|
const pyreflyClient = once(
|
|
183
185
|
(lspConfig: LSPConfig & { diagnostics: DiagnosticsConfig }) => {
|
|
186
|
+
// oxlint-disable-next-line prefer-const -- reassigned after closure capture
|
|
184
187
|
let resyncCallback: (() => Promise<void>) | undefined;
|
|
185
188
|
|
|
186
189
|
const transport = createTransport("pyrefly", async () => {
|
|
@@ -218,6 +221,7 @@ const pyreflyClient = once(
|
|
|
218
221
|
);
|
|
219
222
|
|
|
220
223
|
const pyrightClient = once((_: LSPConfig) => {
|
|
224
|
+
// oxlint-disable-next-line prefer-const -- reassigned after closure capture
|
|
221
225
|
let resyncCallback: (() => Promise<void>) | undefined;
|
|
222
226
|
|
|
223
227
|
const transport = createTransport("basedpyright", async () => {
|
|
@@ -76,7 +76,7 @@ export class CompletionBuilder {
|
|
|
76
76
|
* Set a value at a nested path, creating intermediate objects as needed
|
|
77
77
|
*/
|
|
78
78
|
private setAt(path: string[], value: SQLNamespace): void {
|
|
79
|
-
//
|
|
79
|
+
// oxlint-disable-next-line typescript/no-explicit-any
|
|
80
80
|
let current: any = this.schema;
|
|
81
81
|
for (const key of path.slice(0, -1)) {
|
|
82
82
|
if (!current[key]) {
|
|
@@ -91,13 +91,11 @@ export function customKeywordCompletionSource(): CompletionSource {
|
|
|
91
91
|
|
|
92
92
|
// e.g. lazily load keyword docs
|
|
93
93
|
const getKeywordDocs = once(async (): Promise<Record<string, unknown>> => {
|
|
94
|
-
const keywords =
|
|
95
|
-
"@marimo-team/codemirror-sql/data/common-keywords.json"
|
|
96
|
-
);
|
|
94
|
+
const keywords =
|
|
95
|
+
await import("@marimo-team/codemirror-sql/data/common-keywords.json");
|
|
97
96
|
// Include DuckDB for now, but we can remove this once we have a better way to handle dialect-specific keywords
|
|
98
|
-
const duckdbKeywords =
|
|
99
|
-
"@marimo-team/codemirror-sql/data/duckdb-keywords.json"
|
|
100
|
-
);
|
|
97
|
+
const duckdbKeywords =
|
|
98
|
+
await import("@marimo-team/codemirror-sql/data/duckdb-keywords.json");
|
|
101
99
|
return {
|
|
102
100
|
...keywords.default.keywords,
|
|
103
101
|
...duckdbKeywords.default.keywords,
|
|
@@ -77,9 +77,7 @@ function getLatestEngine(): ConnectionName {
|
|
|
77
77
|
/**
|
|
78
78
|
* Language adapter for SQL.
|
|
79
79
|
*/
|
|
80
|
-
export class SQLLanguageAdapter
|
|
81
|
-
implements LanguageAdapter<SQLLanguageAdapterMetadata>
|
|
82
|
-
{
|
|
80
|
+
export class SQLLanguageAdapter implements LanguageAdapter<SQLLanguageAdapterMetadata> {
|
|
83
81
|
private parser = new SQLParser();
|
|
84
82
|
readonly type = "sql";
|
|
85
83
|
sqlModeEnabled: boolean;
|
|
@@ -5,7 +5,7 @@ import type { EditorView } from "@codemirror/view";
|
|
|
5
5
|
/**
|
|
6
6
|
* Metadata for language adapters
|
|
7
7
|
*/
|
|
8
|
-
//
|
|
8
|
+
// oxlint-disable-next-line typescript/no-explicit-any
|
|
9
9
|
export type LanguageMetadata = Record<string, any>;
|
|
10
10
|
|
|
11
11
|
/**
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
|
-
import type {
|
|
3
|
+
import type { Select as SelectPrimitive } from "radix-ui";
|
|
4
|
+
|
|
5
|
+
type SelectTriggerProps = SelectPrimitive.SelectTriggerProps;
|
|
6
|
+
|
|
4
7
|
import { useAtomValue } from "jotai";
|
|
5
8
|
import {
|
|
6
9
|
AlertCircle,
|
|
@@ -815,7 +815,7 @@ export class NotebookLanguageServerClient implements ILanguageServerClient {
|
|
|
815
815
|
...diag,
|
|
816
816
|
range: lens.reverseRange(diag.range, cellId),
|
|
817
817
|
};
|
|
818
|
-
//
|
|
818
|
+
// oxlint-disable-next-line typescript/no-non-null-assertion
|
|
819
819
|
diagnosticsByCellId.get(cellId)!.push(cellDiag);
|
|
820
820
|
break; // Exit inner loop once we find the matching cell
|
|
821
821
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
-
/*
|
|
2
|
+
/* oxlint-disable typescript/no-explicit-any */
|
|
3
3
|
import { EditorView } from "@codemirror/view";
|
|
4
4
|
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
5
5
|
import { dndBundle } from "../dnd";
|