@marimo-team/frontend 0.25.3-dev12 → 0.25.3-dev121
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-_Aw9_foI.js +1 -0
- package/dist/assets/{ConnectedDataExplorerComponent-TprnxZeJ.js → ConnectedDataExplorerComponent-BRgqbAsc.js} +1 -1
- package/dist/assets/{ErrorBoundary-CM13wrd8.js → ErrorBoundary-DxSzjvbx.js} +2 -2
- package/dist/assets/JsonOutput-B7pGj79O.js +11 -0
- package/dist/assets/{LazyAnyLanguageCodeMirror-B4fCknq1.js → LazyAnyLanguageCodeMirror-BPYE76jR.js} +2 -2
- package/dist/assets/MarimoErrorOutput-Bzo6Bkp5.js +10 -0
- package/dist/assets/{RenderHTML-DX6i99Op.js → RenderHTML-D6AC0IhC.js} +1 -1
- package/dist/assets/RunButton-BjYsPiKa.js +1 -0
- package/dist/assets/__vite-browser-external-BynxqS4w.js +1 -0
- package/dist/assets/__vite-browser-external-DTOT9NDN.js +1 -0
- package/dist/assets/{add-cell-with-ai-BpD_790A.js → add-cell-with-ai-CFrR1iW4.js} +6 -6
- package/dist/assets/{add-connection-dialog-B1BXCjex.js → add-connection-dialog-CyNAB_W2.js} +1 -1
- package/dist/assets/{agent-panel-CDFUc1uu.js → agent-panel-VOrccb5q.js} +3 -3
- package/dist/assets/ai-model-dropdown-Bfxv_zvu.js +13 -0
- package/dist/assets/{alert-dialog-BaPGzeOK.js → alert-dialog-C-sWmKva.js} +1 -1
- package/dist/assets/any-language-editor-DUMe1UCk.js +1 -0
- package/dist/assets/{app-config-button-AdV-QDD7.js → app-config-button-BRcjv8A_.js} +1 -1
- package/dist/assets/arrays-0R2reF2y.js +1 -0
- package/dist/assets/{blob-BG8yoQmx.js → blob-DTYOX-m5.js} +1 -1
- package/dist/assets/{button-COI-NGrx.js → button-D8gVKwe-.js} +1 -1
- package/dist/assets/{cache-panel-DTY1dqvi.js → cache-panel-BV-c7ed0.js} +1 -1
- package/dist/assets/{capabilities-BJvf-MD4.js → capabilities-Pq1YNPlK.js} +1 -1
- package/dist/assets/cell-editor-eKgYK8Bd.js +42 -0
- package/dist/assets/{cell-link-8Auigi8P.js → cell-link-D3rkqgbU.js} +1 -1
- package/dist/assets/{cells-C6YGYGdi.js → cells-2HETnlvE.js} +18 -18
- package/dist/assets/{chat-display-DhgI2MS9.js → chat-display-BrT4VJJK.js} +1 -1
- package/dist/assets/chat-panel-qpPNEwxV.js +4 -0
- package/dist/assets/chat-ui-SAdJxg-k.js +4 -0
- package/dist/assets/{circle-DXf-VWZG.js → circle-B6D_6D8w.js} +1 -1
- package/dist/assets/{code-visibility-BJImdpDi.js → code-visibility-DYDagVy7.js} +1 -1
- package/dist/assets/column-preview-yI7-INkZ.js +1 -0
- package/dist/assets/command-palette-DF-B_YpW.js +1 -0
- package/dist/assets/{common-Sl3uthjg.js → common-DgXKwblm.js} +1 -1
- package/dist/assets/components-CBE8cOLK.js +1 -0
- package/dist/assets/{components-3cou6Mka.js → components-CuMhY4Sf.js} +1 -1
- package/dist/assets/{components-CskjK6xZ.js → components-DCo7mAWO.js} +1 -1
- package/dist/assets/config-CD1IuZFJ.js +1 -0
- package/dist/assets/{config-DRIpOKqh.js → config-DMz7oN0r.js} +1 -1
- package/dist/assets/{config-CA1V-wjh.js → config-DpY86_Yq.js} +1 -1
- package/dist/assets/{copy-D8O_CYCG.js → copy-KlhazlhB.js} +1 -1
- package/dist/assets/{copy-icon-BIiRXh_3.js → copy-icon-8-a5vovc.js} +1 -1
- package/dist/assets/{createReducer-DgRODTW6.js → createReducer-CaI_Oa0v.js} +1 -1
- package/dist/assets/{datasource-DfbNb83e.js → datasource-D9JMcEAP.js} +1 -1
- package/dist/assets/{dates-CfmdTL6B.js → dates-CQMwFko2.js} +1 -1
- package/dist/assets/{dependency-graph-panel-L5cBE5sl.js → dependency-graph-panel-BVJWPCvw.js} +3 -3
- package/dist/assets/{dist-iaThVDkA.js → dist-jlhMTKo_.js} +1 -1
- package/dist/assets/{documentation-panel-D7S8JIc2.js → documentation-panel--wI4XHso.js} +1 -1
- package/dist/assets/{download-C03FOElq.js → download-Dod42wfD.js} +1 -1
- package/dist/assets/{dropdown-menu-C1rnl-0o.js → dropdown-menu-DS6umAnH.js} +1 -1
- package/dist/assets/edit-page-Uj9YSRMX.js +9 -0
- package/dist/assets/{error-banner-COZ7SfYV.js → error-banner-B5kzVf_0.js} +1 -1
- package/dist/assets/{error-entries-CLnPDv7b.js → error-entries-D00nWhWE.js} +1 -1
- package/dist/assets/{error-panel-D2xrYLue.js → error-panel-CcN_1PWf.js} +1 -1
- package/dist/assets/{es-Cqst59WX.js → es-N9SHpmG7.js} +1 -1
- package/dist/assets/{feedback-button-DzPunIqU.js → feedback-button-ByGgqUsX.js} +1 -1
- package/dist/assets/feedback-button-tbWwJ_t6.js +1 -0
- package/dist/assets/file-explorer-panel-eTEqtMPW.js +1 -0
- package/dist/assets/{file-name-input-B4fRaQkI.js → file-name-input-D5SfTNWh.js} +1 -1
- package/dist/assets/{floating-outline-B5MaM1JS.js → floating-outline-B-k3P_AO.js} +1 -1
- package/dist/assets/{formats-yZ06h1Pl.js → formats-zylfwejq.js} +1 -1
- package/dist/assets/{formatting-BqrP-n49.js → formatting-uom1es4b.js} +1 -1
- package/dist/assets/{fullscreen-B9tHcfpV.js → fullscreen-BWTs8pYZ.js} +1 -1
- package/dist/assets/{gallery-page-BefvdsM7.js → gallery-page-BzbMhDHi.js} +1 -1
- package/dist/assets/{ganttDiagram-EL5Y4UJY-2n7Ig5Jm.js → ganttDiagram-EL5Y4UJY-CYqkCfFG.js} +1 -1
- package/dist/assets/{glide-data-editor-C3eaYlXg.js → glide-data-editor-BMqhUrHI.js} +2 -2
- package/dist/assets/{glide-utils-CIrAxdjv.js → glide-utils-HFqhvWHI.js} +2 -2
- package/dist/assets/home-page-DJcYWiga.js +1 -0
- package/dist/assets/{hooks-DzML9nez.js → hooks-CGLb_CCz.js} +1 -1
- package/dist/assets/{html-to-image-DK9Zl1lU.js → html-to-image-D_0rd3_B.js} +1 -1
- package/dist/assets/index-BnhSnwvB.css +2 -0
- package/dist/assets/index-bSIORW11.js +30 -0
- package/dist/assets/{input-BoBxR50a.js → input-DmHMEZGh.js} +1 -1
- package/dist/assets/kiosk-mode-DFS6HopF.js +1 -0
- package/dist/assets/{layout-Ck1RoL1B.js → layout-C2XnLAfO.js} +5 -5
- package/dist/assets/linear-Bma8J3iM.js +1 -0
- package/dist/assets/links-DX2w97N9.js +1 -0
- package/dist/assets/{logs-panel-BRytaWaO.js → logs-panel-B3T1GFBk.js} +1 -1
- package/dist/assets/{markdown-renderer-DX0Xrrfy.js → markdown-renderer-BhiTvxtL.js} +1 -1
- package/dist/assets/{menu-items-BrwnTgyK.js → menu-items-BgUyNUpu.js} +1 -1
- package/dist/assets/{mermaid-C4EiVqcd.js → mermaid-BKXlWk4F.js} +2 -2
- package/dist/assets/{name-cell-input-DlpTvPLa.js → name-cell-input-CgAObR6N.js} +1 -1
- package/dist/assets/numbers-CsZVw3Dc.js +1 -0
- package/dist/assets/{objects-snlMn4yk.js → objects-rLPlQ3X_.js} +1 -1
- package/dist/assets/{once-Haz_uxEL.js → once-6KNTRW0u.js} +1 -1
- package/dist/assets/{outline-panel-B2WIpz-1.js → outline-panel-BhBb7Vqw.js} +1 -1
- package/dist/assets/{package-data-dv4FBHxR.js → package-data-CKPmBDtg.js} +1 -1
- package/dist/assets/packages-panel-Bt0xNpFl.js +1 -0
- package/dist/assets/{panel-accordion-state-BqSH5ttk.js → panel-accordion-state-ZsUdpAYn.js} +1 -1
- package/dist/assets/panels-DJghvIKo.js +1 -0
- package/dist/assets/precisionRound-BxlUs8G4.js +1 -0
- package/dist/assets/process-output-CeOMwE17.js +1 -0
- package/dist/assets/{quadrantDiagram-AXDQQJYC-yBhCDI7E.js → quadrantDiagram-AXDQQJYC-D9KH5Zge.js} +1 -1
- package/dist/assets/react-vega-BTNeboR2.js +189 -0
- package/dist/assets/{readonly-code-display-MnMEoYW5.js → readonly-code-display-TvOC7ESE.js} +1 -1
- package/dist/assets/{readonly-python-code-ggs4hAzC.js → readonly-python-code-Cqkfdeyo.js} +1 -1
- package/dist/assets/{renderShortcut-C1JwYcqW.js → renderShortcut-rUwGqKgC.js} +1 -1
- package/dist/assets/{requests-lt0JK8Jt.js → requests-BIFR-h4M.js} +1 -1
- package/dist/assets/requests-DuLJN9Tf.js +1 -0
- package/dist/assets/{reveal-component-PiV1eQk9.js → reveal-component-CwE6U9oJ.js} +37 -37
- package/dist/assets/run-page-CtonWTtJ.js +1 -0
- package/dist/assets/{runs-BLp5jezv.js → runs-C49hleBy.js} +1 -1
- package/dist/assets/{runtime-details-state-CoL-p0MC.js → runtime-details-state-CKqJSfSR.js} +1 -1
- package/dist/assets/{save-worker-BbUSwZRG.js → save-worker-UwdGcNK5.js} +2 -1
- package/dist/assets/scratchpad-panel-CwVBedfZ.js +1 -0
- package/dist/assets/{scroll-to-bottom-button-1FyowpWV.js → scroll-to-bottom-button-CIkON2WJ.js} +1 -1
- package/dist/assets/{secrets-panel-D7KN4tVs.js → secrets-panel-bcfEKxRx.js} +1 -1
- package/dist/assets/{select-DTBn5eTb.js → select-3CVGlYrC.js} +1 -1
- package/dist/assets/{session-DqoWmb7X.js → session-CMLIzZKw.js} +1 -1
- package/dist/assets/session-panel-CdHdKUCF.js +1 -0
- package/dist/assets/{snippets-panel-ClGHtEKQ.js → snippets-panel-DYLWOLYw.js} +1 -1
- package/dist/assets/{spec-BfSBcO5B.js → spec-DlH4Mp7d.js} +1 -1
- package/dist/assets/{state-uwRvJLb8.js → state-3mcyTS9q.js} +1 -1
- package/dist/assets/state-B_MCKzBL.js +1 -0
- package/dist/assets/{state-C3oDoyFe.js → state-C5WAeuTu.js} +1 -1
- package/dist/assets/{state-DxQnC_1I.js → state-Cv2JW3l9.js} +1 -1
- package/dist/assets/{state-DtGB7xeJ.js → state-DZN9vZ6z.js} +1 -1
- package/dist/assets/state-DgECPVFs.js +107 -0
- package/dist/assets/{strings-B2vv-ENv.js → strings-C25fhMR_.js} +1 -1
- package/dist/assets/{swiper-component-a07domrZ.js → swiper-component-CRGRy5_O.js} +1 -1
- package/dist/assets/{switch-CTaiAjrz.js → switch-DYjBfpNJ.js} +1 -1
- package/dist/assets/{tabs-BuQlZFbt.js → tabs-CY8E4r9U.js} +1 -1
- package/dist/assets/{terminal-wnSHYT8N.js → terminal-Ca-kubKb.js} +1 -1
- package/dist/assets/{time-MgToa8VM.js → time-DswSXBDk.js} +1 -1
- package/dist/assets/{toast-BGzLGnvw.js → toast-Gzxi-le_.js} +1 -1
- package/dist/assets/tooltip-Brya4Ghn.js +61 -0
- package/dist/assets/{tooltip-C9TuY18o.js → tooltip-CkGm8X7m.js} +1 -1
- package/dist/assets/tracing-B0J2ctTm.js +1 -0
- package/dist/assets/tracing-panel-C1OCpoeE.js +2 -0
- package/dist/assets/{tree-actions-DnUokmva.js → tree-actions-sjBxIglc.js} +1 -1
- package/dist/assets/{use-restore-focus-BxEGwIbk.js → use-restore-focus-DdS7Tl0F.js} +1 -1
- package/dist/assets/{useAddCell-IN24thff.js → useAddCell-CaXnFGki.js} +1 -1
- package/dist/assets/useAsyncData-qvoPYHtx.js +1 -0
- package/dist/assets/useBoolean-Dd2nWXFJ.js +1 -0
- package/dist/assets/useCellActionButton-CJ90CMEj.js +1 -0
- package/dist/assets/useDebounce-DwTQ_1Pu.js +1 -0
- package/dist/assets/{useDeepCompareMemoize-DFIVN9dn.js → useDeepCompareMemoize-B2DVK2De.js} +1 -1
- package/dist/assets/useDelayElapsed-BlsDT4TV.js +1 -0
- package/dist/assets/{useDeleteCell-fQlM46Y2.js → useDeleteCell-D9N85822.js} +1 -1
- package/dist/assets/{useDependencyPanelTab-ImXYINm_.js → useDependencyPanelTab-CzAE0cm-.js} +1 -1
- package/dist/assets/{useEvent-Dfcbgjhg.js → useEvent-BDjgaBtz.js} +1 -1
- package/dist/assets/{useEventListener-D9cftcHj.js → useEventListener-CjDeLqFC.js} +1 -1
- package/dist/assets/{useIframeCapabilities-CwTkczVN.js → useIframeCapabilities-Czr9e4uG.js} +1 -1
- package/dist/assets/{useInstallPackage-BW06eter.js → useInstallPackage-wcDq9hYT.js} +1 -1
- package/dist/assets/{useInterval--x3s1VpI.js → useInterval-DJdQmXnq.js} +1 -1
- package/dist/assets/useNotebookActions-CAMEQ38y.js +1 -0
- package/dist/assets/{useRunCells-DSJPXE-j.js → useRunCells-DGakx8hj.js} +1 -1
- package/dist/assets/{useSplitCell-DQyMF5gd.js → useSplitCell-AK5BKPGM.js} +1 -1
- package/dist/assets/useStateForKey-CGMJQT8x.js +1 -0
- package/dist/assets/{useTheme-n8Dj1zH7.js → useTheme-BAA27lh7.js} +1 -1
- package/dist/assets/{utils-CaQYvazl.js → utils-DfElfBpz.js} +1 -1
- package/dist/assets/vega-component-BeyxAJad.js +1 -0
- package/dist/assets/{vega-embed-container-DJPNkHPb.js → vega-embed-container-DtArSJz1.js} +1 -1
- package/dist/assets/vega-loader.browser-Bu25TKax.js +6 -0
- package/dist/assets/worker-jm2VC7pS.js +159 -0
- package/dist/assets/{write-secret-modal-DzKAInL2.js → write-secret-modal-BEx-EUlh.js} +1 -1
- package/dist/assets/{xychartDiagram-S5SC5T6Z-KbGzG6-u.js → xychartDiagram-S5SC5T6Z-CeRnBS5e.js} +1 -1
- package/dist/index.html +81 -79
- package/package.json +12 -12
- package/src/__tests__/host-imports.test.ts +1 -0
- package/src/__tests__/mount.test.ts +0 -20
- package/src/components/app-config/ai-config.tsx +7 -2
- package/src/components/chat/__tests__/message-queue.test.tsx +17 -0
- package/src/components/chat/acp/__tests__/state.test.ts +2 -2
- package/src/components/chat/acp/blocks.tsx +2 -2
- package/src/components/chat/chat-components.tsx +2 -0
- package/src/components/chat/chat-panel.tsx +9 -8
- package/src/components/chat/chat-utils.ts +4 -8
- package/src/components/data-table/__tests__/chart-spec-model.test.ts +195 -195
- package/src/components/data-table/__tests__/column-explorer.test.tsx +27 -1
- package/src/components/data-table/__tests__/columns.test.tsx +105 -0
- package/src/components/data-table/__tests__/context-menu-interaction.test.tsx +130 -0
- package/src/components/data-table/__tests__/date-popover.test.tsx +72 -0
- package/src/components/data-table/__tests__/export-actions.test.tsx +105 -0
- package/src/components/data-table/__tests__/search-highlight.test.tsx +109 -0
- package/src/components/data-table/__tests__/url-detector.test.tsx +74 -0
- package/src/components/data-table/cell-selection/feature.ts +2 -2
- package/src/components/data-table/cell-selection/types.ts +2 -2
- package/src/components/data-table/charts/__tests__/chart-panel.test.tsx +74 -1
- package/src/components/data-table/charts/__tests__/spec-snapshot.test.ts +20 -20
- package/src/components/data-table/charts/__tests__/spec.test.ts +78 -52
- package/src/components/data-table/charts/__tests__/storage.test.ts +4 -1
- package/src/components/data-table/charts/chart-spec/spec.ts +68 -43
- package/src/components/data-table/charts/charts.tsx +40 -30
- package/src/components/data-table/charts/storage.ts +16 -5
- package/src/components/data-table/column-explorer-panel/column-explorer.tsx +1 -1
- package/src/components/data-table/column-summary/chart-spec-model.tsx +23 -16
- package/src/components/data-table/column-summary/column-summary.tsx +2 -4
- package/src/components/data-table/column-visibility-dropdown.tsx +8 -13
- package/src/components/data-table/columns.tsx +45 -46
- package/src/components/data-table/context-menu.tsx +36 -20
- package/src/components/data-table/data-table.tsx +7 -1
- package/src/components/data-table/date-popover.tsx +6 -4
- package/src/components/data-table/export-actions.tsx +76 -48
- package/src/components/data-table/row-viewer-panel/row-viewer.tsx +2 -2
- package/src/components/data-table/search-highlight.tsx +79 -0
- package/src/components/data-table/types.ts +1 -0
- package/src/components/data-table/url-detector.tsx +49 -9
- package/src/components/datasources/__tests__/column-actions.test.tsx +97 -0
- package/src/components/datasources/__tests__/column-preview.test.tsx +63 -2
- package/src/components/datasources/__tests__/table-list.test.tsx +118 -0
- package/src/components/datasources/column-preview.tsx +8 -2
- package/src/components/datasources/datasources.tsx +47 -35
- package/src/components/debugger/debugger-code.tsx +5 -0
- package/src/components/dependency-graph/dependency-graph-tree.tsx +8 -8
- package/src/components/dependency-graph/elements.ts +24 -21
- package/src/components/dependency-graph/panels.tsx +2 -1
- package/src/components/dependency-graph/utils/__tests__/layout.test.ts +18 -11
- package/src/components/editor/SortableCell.tsx +1 -3
- package/src/components/editor/__tests__/dynamic-favicon.test.tsx +111 -18
- package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +24 -0
- package/src/components/editor/actions/pair-with-agent-modal.tsx +18 -15
- package/src/components/editor/ai/add-cell-with-ai.tsx +3 -3
- package/src/components/editor/ai/ai-completion-editor.tsx +1 -0
- package/src/components/editor/alerts/startup-logs-alert.tsx +1 -0
- package/src/components/editor/cell/CreateCellButton.tsx +8 -10
- package/src/components/editor/cell/DeleteButton.tsx +1 -0
- package/src/components/editor/cell/__tests__/useShouldShowInterrupt.test.ts +39 -0
- package/src/components/editor/cell/code/__tests__/language-toggle.test.tsx +54 -0
- package/src/components/editor/cell/code/cell-editor.tsx +1 -1
- package/src/components/editor/cell/code/language-toggle.tsx +8 -7
- package/src/components/editor/cell/useShouldShowInterrupt.ts +2 -12
- package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +30 -1
- package/src/components/editor/chrome/panels/cache-panel.tsx +1 -0
- package/src/components/editor/chrome/panels/packages-panel.tsx +4 -7
- package/src/components/editor/chrome/wrapper/__tests__/attachment-status.test.tsx +12 -18
- package/src/components/editor/chrome/wrapper/__tests__/pending-ai-cells.test.tsx +58 -1
- package/src/components/editor/chrome/wrapper/footer-items/runtime-settings.tsx +1 -7
- package/src/components/editor/chrome/wrapper/pending-ai-cells.tsx +12 -2
- package/src/components/editor/chrome/wrapper/storage.ts +1 -1
- package/src/components/editor/connections/components.tsx +1 -1
- package/src/components/editor/controls/__tests__/command-palette.test.tsx +53 -0
- package/src/components/editor/controls/command-palette.tsx +22 -10
- package/src/components/editor/dynamic-favicon.tsx +21 -40
- package/src/components/editor/errors/__tests__/send-error-report-button.test.tsx +12 -23
- package/src/components/editor/file-tree/__tests__/file-explorer-interactions.test.tsx +6 -0
- package/src/components/editor/file-tree/__tests__/use-file-search.test.tsx +91 -0
- package/src/components/editor/file-tree/file-explorer.tsx +10 -5
- package/src/components/editor/file-tree/file-viewer.tsx +4 -2
- package/src/components/editor/file-tree/use-file-search.ts +35 -21
- package/src/components/editor/notebook-banner.tsx +1 -0
- package/src/components/editor/output/MarimoTracebackOutput.tsx +2 -2
- package/src/components/editor/output/ansi-reduce.ts +33 -20
- package/src/components/editor/output/console/ConsoleOutput.tsx +19 -25
- package/src/components/editor/package-alert.tsx +6 -4
- package/src/components/editor/renderers/grid-layout/grid-layout.tsx +12 -6
- package/src/components/editor/renderers/vertical-layout/sidebar/toggle.tsx +7 -1
- package/src/components/home/components.tsx +17 -31
- package/src/components/icons/__tests__/large-spinner.test.tsx +39 -0
- package/src/components/icons/large-spinner.tsx +3 -14
- package/src/components/icons/spinner.tsx +1 -1
- package/src/components/mcp/mcp-status-indicator.tsx +1 -1
- package/src/components/pages/__tests__/home-page.test.tsx +116 -0
- package/src/components/pages/home-page.tsx +164 -91
- package/src/components/scratchpad/scratchpad.tsx +2 -2
- package/src/components/slides/reveal-component.tsx +4 -2
- package/src/components/slides/slide-cell-view.tsx +1 -1
- package/src/components/slides/slide-form.tsx +1 -0
- package/src/components/tracing/tracing.tsx +2 -2
- package/src/components/ui/alert-dialog.tsx +1 -1
- package/src/core/ai/context/providers/datasource.ts +6 -2
- package/src/core/ai/tools/base.ts +16 -7
- package/src/core/ai/tools/edit-notebook-tool.ts +47 -45
- package/src/core/ai/tools/registry.ts +13 -8
- package/src/core/ai/tools/sample-tool.ts +6 -7
- package/src/core/attachments/state.ts +5 -8
- package/src/core/cells/__tests__/__snapshots__/cells.test.ts.snap +4 -0
- package/src/core/cells/__tests__/cell.test.ts +39 -0
- package/src/core/cells/__tests__/cells.test.ts +3 -1
- package/src/core/cells/__tests__/collapseConsoleOutputs.test.ts +54 -0
- package/src/core/cells/__tests__/notebook-outline.test.ts +113 -0
- package/src/core/cells/__tests__/session.test.ts +117 -36
- package/src/core/cells/cell.ts +14 -3
- package/src/core/cells/cells.ts +3 -1
- package/src/core/cells/pending-delete-service.ts +2 -6
- package/src/core/cells/session.ts +1 -1
- package/src/core/cells/types.ts +10 -1
- package/src/core/codemirror/__tests__/setup.test.ts +29 -29
- package/src/core/codemirror/cells/__tests__/extensions.test.ts +15 -0
- package/src/core/codemirror/cells/extensions.ts +7 -3
- package/src/core/codemirror/keymaps/vim.ts +2 -6
- package/src/core/codemirror/language/__tests__/sql.test.ts +22 -20
- package/src/core/codemirror/language/extension.ts +8 -8
- package/src/core/codemirror/language/languages/markdown.ts +8 -6
- package/src/core/codemirror/language/languages/python.ts +16 -10
- package/src/core/codemirror/language/languages/sql/sql.ts +9 -7
- package/src/core/codemirror/language/panel/panel.tsx +1 -0
- package/src/core/codemirror/language/types.ts +7 -7
- package/src/core/codemirror/rtc/extension.ts +24 -12
- package/src/core/codemirror/rtc/loro/awareness.ts +34 -19
- package/src/core/codemirror/rtc/loro/sync.ts +1 -0
- package/src/core/codemirror/utils.ts +1 -0
- package/src/core/datasets/__tests__/data-source-discovery.test.ts +4 -4
- package/src/core/datasets/data-source-discovery.ts +4 -6
- package/src/core/document/__tests__/codemirror.test.ts +483 -0
- package/src/core/document/__tests__/draft.test.ts +322 -0
- package/src/core/document/__tests__/fixtures.ts +92 -0
- package/src/core/document/__tests__/hooks.test.tsx +386 -0
- package/src/core/document/__tests__/lifecycle-scenarios.test.ts +61 -0
- package/src/core/document/__tests__/model.test.ts +158 -0
- package/src/core/document/__tests__/protocol-fixtures.ts +38 -0
- package/src/core/document/__tests__/recovery-scenarios.test.ts +230 -0
- package/src/core/document/__tests__/scenario-fixture.ts +42 -0
- package/src/core/document/__tests__/scenarios.test.ts +205 -0
- package/src/core/document/__tests__/state.test.ts +438 -0
- package/src/core/document/__tests__/submission.test.ts +203 -0
- package/src/core/document/__tests__/test-host.test.ts +92 -0
- package/src/core/document/__tests__/test-host.ts +247 -0
- package/src/core/document/__tests__/test-notebook.ts +139 -0
- package/src/core/document/__tests__/user.ts +61 -0
- package/src/core/document/codemirror.ts +311 -0
- package/src/core/document/draft.ts +472 -0
- package/src/core/document/hooks.tsx +118 -0
- package/src/core/document/index.ts +22 -0
- package/src/core/document/model.ts +52 -0
- package/src/core/document/select.ts +41 -0
- package/src/core/document/state.ts +374 -0
- package/src/core/document/sync.ts +363 -0
- package/src/core/host/AGENTS.md +12 -2
- package/src/core/host/__tests__/attachments.test.ts +56 -0
- package/src/core/host/__tests__/document.test.ts +126 -0
- package/src/core/host/__tests__/fixtures.ts +41 -0
- package/src/core/host/__tests__/notebook-client.test.ts +511 -132
- package/src/core/host/__tests__/static.test.ts +167 -0
- package/src/core/host/__tests__/wasm.test.ts +152 -0
- package/src/core/host/backend.ts +10 -0
- package/src/core/host/connection.ts +1 -40
- package/src/core/host/notebook-client.ts +204 -133
- package/src/core/host/resources/attachments.ts +22 -0
- package/src/core/host/resources/document.ts +101 -0
- package/src/core/host/static.ts +70 -0
- package/src/core/host/wasm.ts +92 -0
- package/src/core/hotkeys/actions.ts +2 -4
- package/src/core/islands/__tests__/bootstrap.test.ts +0 -26
- package/src/core/islands/bootstrap.ts +0 -1
- package/src/core/islands/components/__tests__/IslandControls.test.tsx +7 -5
- package/src/core/kernel/__tests__/RuntimeState.test.ts +1 -1
- package/src/core/network/connection.ts +4 -2
- package/src/core/network/useConnectionNotice.ts +8 -2
- package/src/core/runtime/__tests__/createWsUrl.test.ts +77 -7
- package/src/core/runtime/__tests__/runtime.test.ts +15 -58
- package/src/core/runtime/runtime.ts +25 -42
- package/src/core/runtime/types.ts +0 -2
- package/src/core/state/__tests__/jotai.test.tsx +108 -0
- package/src/core/state/jotai.ts +1 -1
- package/src/core/static/__tests__/files.test.ts +38 -10
- package/src/core/static/files.ts +2 -0
- package/src/core/wasm/bridge.ts +38 -10
- package/src/core/wasm/store.ts +3 -3
- package/src/core/wasm/worker/bootstrap.ts +2 -1
- package/src/core/wasm/worker/getMarimoWheel.ts +1 -1
- package/src/core/wasm/worker/types.ts +11 -0
- package/src/core/wasm/worker/worker.ts +48 -0
- package/src/core/websocket/__tests__/connection-state.test.ts +0 -12
- package/src/core/websocket/__tests__/useNotebookClient.hook.test.tsx +153 -70
- package/src/core/websocket/__tests__/useNotebookSession.hook.test.tsx +151 -428
- package/src/core/websocket/connection-state.ts +0 -10
- package/src/core/websocket/state.ts +7 -0
- package/src/core/websocket/transports/__tests__/notebook.test.ts +502 -0
- package/src/core/websocket/transports/notebook.ts +213 -0
- package/src/core/websocket/useNotebookClient.ts +38 -29
- package/src/core/websocket/useNotebookSession.tsx +1 -14
- package/src/css/globals.css +5 -0
- package/src/hooks/__tests__/useAsyncData.test.tsx +148 -0
- package/src/hooks/__tests__/useDebounce.test.tsx +51 -0
- package/src/hooks/__tests__/useDeepCompareMemoize.test.tsx +39 -0
- package/src/hooks/__tests__/useDelayElapsed.test.tsx +28 -0
- package/src/hooks/__tests__/useInternalStateWithSync.test.tsx +20 -0
- package/src/hooks/__tests__/useScript.test.tsx +77 -0
- package/src/hooks/__tests__/useStateForKey.test.tsx +257 -0
- package/src/hooks/useAsyncData.ts +3 -3
- package/src/hooks/useDataSourceDiscovery.ts +6 -4
- package/src/hooks/useDebounce.ts +6 -10
- package/src/hooks/useDeepCompareMemoize.ts +1 -1
- package/src/hooks/useDelayElapsed.ts +14 -10
- package/src/hooks/useElapsedTime.ts +3 -3
- package/src/hooks/useEventListener.ts +1 -2
- package/src/hooks/useInputHistory.ts +4 -7
- package/src/hooks/useInternalStateWithSync.ts +6 -6
- package/src/hooks/useResizeObserver.ts +4 -7
- package/src/hooks/useScript.ts +67 -70
- package/src/hooks/useStateForKey.ts +93 -0
- package/src/mount.tsx +0 -4
- package/src/plugins/__tests__/plugin-object-schemas.test.ts +104 -0
- package/src/plugins/core/registerReactComponent.tsx +1 -1
- package/src/plugins/impl/CodeEditorPlugin.tsx +1 -1
- package/src/plugins/impl/DataEditorPlugin.tsx +1 -1
- package/src/plugins/impl/DataTablePlugin.tsx +29 -33
- package/src/plugins/impl/DropdownPlugin.tsx +2 -6
- package/src/plugins/impl/FileBrowserPlugin.tsx +4 -16
- package/src/plugins/impl/FormPlugin.tsx +1 -1
- package/src/plugins/impl/RangeSliderPlugin.tsx +0 -1
- package/src/plugins/impl/RefreshPlugin.tsx +1 -0
- package/src/plugins/impl/SliderPlugin.tsx +6 -8
- package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +117 -1
- package/src/plugins/impl/__tests__/FileBrowserPlugin.test.tsx +45 -0
- package/src/plugins/impl/__tests__/SliderPlugin.test.tsx +24 -3
- package/src/plugins/impl/anywidget/__tests__/registry.test.ts +2 -0
- package/src/plugins/impl/anywidget/__tests__/widget-binding.test.ts +241 -2
- package/src/plugins/impl/anywidget/runtime.ts +21 -9
- package/src/plugins/impl/anywidget/widget-binding.ts +160 -82
- package/src/plugins/impl/chat/__tests__/chat-prompts.test.tsx +93 -0
- package/src/plugins/impl/chat/chat-ui.tsx +12 -10
- package/src/plugins/impl/code/any-language-editor.tsx +2 -2
- package/src/plugins/impl/data-editor/glide-data-editor.tsx +8 -5
- package/src/plugins/impl/data-editor/glide-utils.ts +3 -1
- package/src/plugins/impl/data-explorer/ConnectedDataExplorerComponent.tsx +1 -1
- package/src/plugins/impl/data-explorer/state/reducer.ts +1 -1
- package/src/plugins/impl/data-frames/DataFramePlugin.tsx +1 -2
- package/src/plugins/impl/mpl-interactive/MplInteractivePlugin.tsx +5 -3
- package/src/plugins/impl/panel/PanelPlugin.tsx +16 -17
- package/src/plugins/impl/panel/__tests__/utils.test.ts +39 -1
- package/src/plugins/impl/panel/utils.ts +17 -0
- package/src/plugins/impl/plotly/PlotlyPlugin.tsx +2 -5
- package/src/plugins/impl/plotly/selection.ts +25 -19
- package/src/plugins/impl/vega/VegaPlugin.tsx +2 -3
- package/src/plugins/impl/vega/make-selectable.ts +4 -7
- package/src/plugins/layout/RoutesPlugin.tsx +1 -1
- package/src/stories/__tests__/editor-story.test.tsx +33 -0
- package/src/stories/button.stories.tsx +1 -0
- package/src/stories/editor.stories.tsx +24 -17
- package/src/stories/form-wrapper.stories.tsx +2 -2
- package/src/stories/select.stories.tsx +2 -2
- package/src/stories/switchable-multi-select.stories.tsx +1 -1
- package/src/utils/__tests__/arrays.test.ts +35 -0
- package/src/utils/__tests__/batch-requests.test.ts +3 -3
- package/src/utils/__tests__/numbers.test.ts +48 -1
- package/src/utils/__tests__/objects.test.ts +21 -0
- package/src/utils/arrays.ts +10 -0
- package/src/utils/blob.ts +1 -1
- package/src/utils/numbers.ts +28 -17
- package/src/utils/objects.ts +3 -7
- package/src/utils/once.ts +19 -19
- package/src/utils/tracer.ts +9 -5
- package/src/utils/zod-utils.ts +1 -3
- package/dist/assets/CellStatus-DVOHpdeJ.js +0 -1
- package/dist/assets/JsonOutput-Cx1iyibB.js +0 -11
- package/dist/assets/MarimoErrorOutput-s_5GOX8k.js +0 -10
- package/dist/assets/RunButton-BKoh0zYG.js +0 -1
- package/dist/assets/__vite-browser-external-CYO_P3S8.js +0 -1
- package/dist/assets/__vite-browser-external-FeDVGZU8.js +0 -1
- package/dist/assets/ai-model-dropdown-i1vfGeVi.js +0 -13
- package/dist/assets/any-language-editor-BdTWdMCI.js +0 -1
- package/dist/assets/arrays-BqUx5USx.js +0 -1
- package/dist/assets/cell-editor-BKJ06H5F.js +0 -21
- package/dist/assets/chat-panel-Cau71Ygr.js +0 -4
- package/dist/assets/chat-ui-C5ql1Up-.js +0 -4
- package/dist/assets/circle-play-CYIb0qT6.js +0 -1
- package/dist/assets/column-preview-BZ_iNhtJ.js +0 -1
- package/dist/assets/command-palette-DDC3kBet.js +0 -1
- package/dist/assets/components-YBmtV0p6.js +0 -1
- package/dist/assets/config-Dy28fDwn.js +0 -1
- package/dist/assets/edit-page-D_Rg0gQO.js +0 -9
- package/dist/assets/feedback-button-Kla7i5RT.js +0 -1
- package/dist/assets/file-explorer-panel-Uk4_QIJQ.js +0 -1
- package/dist/assets/home-page-hmvKlc1w.js +0 -4
- package/dist/assets/index-6b4mf8Ai.css +0 -2
- package/dist/assets/index-ptK1gxmo.js +0 -30
- package/dist/assets/kiosk-mode-BZECfg9k.js +0 -1
- package/dist/assets/linear-0eij_aAG.js +0 -1
- package/dist/assets/link-NuFVR7G9.js +0 -1
- package/dist/assets/links-DkkL9DVa.js +0 -1
- package/dist/assets/numbers-Mk3-CcoU.js +0 -1
- package/dist/assets/packages-panel-CI5ff9b-.js +0 -1
- package/dist/assets/panels-BCcZ_yLK.js +0 -107
- package/dist/assets/precisionRound-Bq_nmf5u.js +0 -1
- package/dist/assets/process-output-f3C3PD0Z.js +0 -1
- package/dist/assets/react-vega-C3rYGtP6.js +0 -189
- package/dist/assets/requests-CgSY1X4a.js +0 -1
- package/dist/assets/run-page-AfZhtEh1.js +0 -1
- package/dist/assets/scratchpad-panel-D2rWg4k8.js +0 -1
- package/dist/assets/session-panel-CnANhcTo.js +0 -1
- package/dist/assets/state-BAJYRhmO.js +0 -1
- package/dist/assets/state-CbjBtkdd.js +0 -3
- package/dist/assets/tooltip-mT3CGest.js +0 -61
- package/dist/assets/tracing-Dz2rYOFL.js +0 -1
- package/dist/assets/tracing-panel-DqQY9V91.js +0 -2
- package/dist/assets/useAsyncData-C7aJJz0Y.js +0 -1
- package/dist/assets/useBoolean-d0Tty94N.js +0 -1
- package/dist/assets/useCellActionButton-DmaFZ4oF.js +0 -1
- package/dist/assets/useDebounce-B_ccBZTp.js +0 -1
- package/dist/assets/useNotebookActions-DHt3s-ia.js +0 -1
- package/dist/assets/vega-component-IouMe13t.js +0 -1
- package/dist/assets/vega-loader.browser-CLRkNgm7.js +0 -6
- package/dist/assets/worker-DTQ7oH2A.js +0 -158
- package/dist/assets/ws-BXWY541V.js +0 -22
- package/src/core/host/__tests__/events.test.ts +0 -46
- package/src/core/host/__tests__/protocol.test.ts +0 -214
- package/src/core/host/events.ts +0 -60
- package/src/core/host/protocol.ts +0 -1943
- package/src/core/state/__tests__/jotai.test.ts +0 -25
- package/src/core/websocket/__tests__/createConnectionTransport.test.ts +0 -49
- package/src/core/websocket/transports/__tests__/basic.test.ts +0 -275
- package/src/core/websocket/transports/__tests__/sse.test.ts +0 -335
- package/src/core/websocket/transports/__tests__/transport.test.ts +0 -308
- package/src/core/websocket/transports/__tests__/ws.test.ts +0 -125
- package/src/core/websocket/transports/basic.ts +0 -102
- package/src/core/websocket/transports/create.ts +0 -31
- package/src/core/websocket/transports/sse.ts +0 -308
- package/src/core/websocket/transports/transport.ts +0 -50
- package/src/core/websocket/transports/ws.ts +0 -98
|
@@ -46,10 +46,17 @@ describe("notebookStateFromSession", () => {
|
|
|
46
46
|
|
|
47
47
|
const createNotebookCell = (
|
|
48
48
|
id: string,
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
49
|
+
{
|
|
50
|
+
code = null,
|
|
51
|
+
name = null,
|
|
52
|
+
config = null,
|
|
53
|
+
code_hash = null,
|
|
54
|
+
}: {
|
|
55
|
+
code?: string | null;
|
|
56
|
+
name?: string | null;
|
|
57
|
+
config?: NotebookCell["config"] | null;
|
|
58
|
+
code_hash?: string | null;
|
|
59
|
+
} = {},
|
|
53
60
|
): NotebookCell => ({
|
|
54
61
|
id,
|
|
55
62
|
code,
|
|
@@ -87,7 +94,7 @@ describe("notebookStateFromSession", () => {
|
|
|
87
94
|
|
|
88
95
|
it("logs error when session and notebook have different cells", () => {
|
|
89
96
|
const session = createSession([createSessionCell("cell-1")]);
|
|
90
|
-
const notebook = createNotebook([createNotebookCell("cell-2")]);
|
|
97
|
+
const notebook = createNotebook([createNotebookCell("cell-2", {})]);
|
|
91
98
|
|
|
92
99
|
const result = notebookStateFromSession(session, notebook);
|
|
93
100
|
|
|
@@ -328,7 +335,10 @@ describe("notebookStateFromSession", () => {
|
|
|
328
335
|
describe("notebook only scenarios", () => {
|
|
329
336
|
it("creates state from notebook with single cell", () => {
|
|
330
337
|
const notebook = createNotebook([
|
|
331
|
-
createNotebookCell("cell-1",
|
|
338
|
+
createNotebookCell("cell-1", {
|
|
339
|
+
code: "print('hello')",
|
|
340
|
+
name: "my_cell",
|
|
341
|
+
}),
|
|
332
342
|
]);
|
|
333
343
|
const result = notebookStateFromSession(null, notebook);
|
|
334
344
|
|
|
@@ -356,11 +366,15 @@ describe("notebookStateFromSession", () => {
|
|
|
356
366
|
|
|
357
367
|
it("creates state from notebook with custom config", () => {
|
|
358
368
|
const notebook = createNotebook([
|
|
359
|
-
createNotebookCell("cell-1",
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
369
|
+
createNotebookCell("cell-1", {
|
|
370
|
+
code: "code",
|
|
371
|
+
name: "name",
|
|
372
|
+
config: {
|
|
373
|
+
hide_code: true,
|
|
374
|
+
disabled: true,
|
|
375
|
+
column: 1,
|
|
376
|
+
expand_output: true,
|
|
377
|
+
},
|
|
364
378
|
}),
|
|
365
379
|
]);
|
|
366
380
|
const result = notebookStateFromSession(null, notebook);
|
|
@@ -464,7 +478,10 @@ describe("notebookStateFromSession", () => {
|
|
|
464
478
|
),
|
|
465
479
|
]);
|
|
466
480
|
const notebook = createNotebook([
|
|
467
|
-
createNotebookCell("cell-1",
|
|
481
|
+
createNotebookCell("cell-1", {
|
|
482
|
+
code: "print('hello')",
|
|
483
|
+
name: "my_cell",
|
|
484
|
+
}),
|
|
468
485
|
]);
|
|
469
486
|
const result = notebookStateFromSession(session, notebook);
|
|
470
487
|
|
|
@@ -495,8 +512,8 @@ describe("notebookStateFromSession", () => {
|
|
|
495
512
|
createSessionCell("cell-2"),
|
|
496
513
|
]);
|
|
497
514
|
const notebook = createNotebook([
|
|
498
|
-
createNotebookCell("cell-2"),
|
|
499
|
-
createNotebookCell("cell-1"),
|
|
515
|
+
createNotebookCell("cell-2", {}),
|
|
516
|
+
createNotebookCell("cell-1", {}),
|
|
500
517
|
]);
|
|
501
518
|
|
|
502
519
|
const result = notebookStateFromSession(session, notebook);
|
|
@@ -514,8 +531,8 @@ describe("notebookStateFromSession", () => {
|
|
|
514
531
|
createSessionCell("cell-2"),
|
|
515
532
|
]);
|
|
516
533
|
const notebook = createNotebook([
|
|
517
|
-
createNotebookCell("cell-1"),
|
|
518
|
-
createNotebookCell("cell-2"),
|
|
534
|
+
createNotebookCell("cell-1", {}),
|
|
535
|
+
createNotebookCell("cell-2", {}),
|
|
519
536
|
]);
|
|
520
537
|
|
|
521
538
|
const result = notebookStateFromSession(session, notebook);
|
|
@@ -669,12 +686,42 @@ describe("notebookStateFromSession", () => {
|
|
|
669
686
|
};
|
|
670
687
|
// Create notebook cells with code values 'a' through 'f'
|
|
671
688
|
const notebookCells = [
|
|
672
|
-
createNotebookCell("cell-a",
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
689
|
+
createNotebookCell("cell-a", {
|
|
690
|
+
code: "a",
|
|
691
|
+
name: null,
|
|
692
|
+
config: null,
|
|
693
|
+
code_hash: hashes.a,
|
|
694
|
+
}),
|
|
695
|
+
createNotebookCell("cell-b", {
|
|
696
|
+
code: "b",
|
|
697
|
+
name: null,
|
|
698
|
+
config: null,
|
|
699
|
+
code_hash: hashes.b,
|
|
700
|
+
}),
|
|
701
|
+
createNotebookCell("cell-c", {
|
|
702
|
+
code: "c",
|
|
703
|
+
name: null,
|
|
704
|
+
config: null,
|
|
705
|
+
code_hash: hashes.c,
|
|
706
|
+
}),
|
|
707
|
+
createNotebookCell("cell-d", {
|
|
708
|
+
code: "d",
|
|
709
|
+
name: null,
|
|
710
|
+
config: null,
|
|
711
|
+
code_hash: hashes.d,
|
|
712
|
+
}),
|
|
713
|
+
createNotebookCell("cell-e", {
|
|
714
|
+
code: "e",
|
|
715
|
+
name: null,
|
|
716
|
+
config: null,
|
|
717
|
+
code_hash: hashes.e,
|
|
718
|
+
}),
|
|
719
|
+
createNotebookCell("cell-f", {
|
|
720
|
+
code: "f",
|
|
721
|
+
name: null,
|
|
722
|
+
config: null,
|
|
723
|
+
code_hash: hashes.f,
|
|
724
|
+
}),
|
|
678
725
|
];
|
|
679
726
|
// Create session cells with matching code_hashes
|
|
680
727
|
const sessionCells = [
|
|
@@ -787,11 +834,36 @@ describe("notebookStateFromSession", () => {
|
|
|
787
834
|
|
|
788
835
|
// Notebook has cells with code 'a', 'c', 'z', 'e', 'g'
|
|
789
836
|
const notebookCells = [
|
|
790
|
-
createNotebookCell("cell-a",
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
837
|
+
createNotebookCell("cell-a", {
|
|
838
|
+
code: "a",
|
|
839
|
+
name: null,
|
|
840
|
+
config: null,
|
|
841
|
+
code_hash: hashes.a,
|
|
842
|
+
}),
|
|
843
|
+
createNotebookCell("cell-c", {
|
|
844
|
+
code: "c",
|
|
845
|
+
name: null,
|
|
846
|
+
config: null,
|
|
847
|
+
code_hash: hashes.c,
|
|
848
|
+
}),
|
|
849
|
+
createNotebookCell("cell-z", {
|
|
850
|
+
code: "z",
|
|
851
|
+
name: null,
|
|
852
|
+
config: null,
|
|
853
|
+
code_hash: hashes.z,
|
|
854
|
+
}),
|
|
855
|
+
createNotebookCell("cell-e", {
|
|
856
|
+
code: "e",
|
|
857
|
+
name: null,
|
|
858
|
+
config: null,
|
|
859
|
+
code_hash: hashes.e,
|
|
860
|
+
}),
|
|
861
|
+
createNotebookCell("cell-g", {
|
|
862
|
+
code: "g",
|
|
863
|
+
name: null,
|
|
864
|
+
config: null,
|
|
865
|
+
code_hash: hashes.g,
|
|
866
|
+
}),
|
|
795
867
|
];
|
|
796
868
|
|
|
797
869
|
const session = createSession(sessionCells);
|
|
@@ -908,15 +980,24 @@ describe("notebookStateFromSession", () => {
|
|
|
908
980
|
|
|
909
981
|
// Notebook has cells: cell-1 (1 / 0, no hash), cell-2 (mo.md("Hello"), hash=moMd), cell-3 (slider, hash=slider)
|
|
910
982
|
const notebookCells = [
|
|
911
|
-
createNotebookCell("cell-1",
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
983
|
+
createNotebookCell("cell-1", {
|
|
984
|
+
code: "1 / 0",
|
|
985
|
+
name: null,
|
|
986
|
+
config: null,
|
|
987
|
+
code_hash: null,
|
|
988
|
+
}), // no hash
|
|
989
|
+
createNotebookCell("cell-2", {
|
|
990
|
+
code: 'mo.md("Hello")',
|
|
991
|
+
name: null,
|
|
992
|
+
config: null,
|
|
993
|
+
code_hash: hashes.moMd,
|
|
994
|
+
}),
|
|
995
|
+
createNotebookCell("cell-3", {
|
|
996
|
+
code: "x = mo.ui.slider(0, 10)",
|
|
997
|
+
name: null,
|
|
998
|
+
config: null,
|
|
999
|
+
code_hash: hashes.slider,
|
|
1000
|
+
}),
|
|
920
1001
|
];
|
|
921
1002
|
|
|
922
1003
|
const session = createSession(sessionCells);
|
package/src/core/cells/cell.ts
CHANGED
|
@@ -7,7 +7,12 @@ import { parseOutline } from "../dom/outline";
|
|
|
7
7
|
import type { CellMessage, OutputMessage } from "../kernel/messages";
|
|
8
8
|
import type { RuntimeState } from "../network/types";
|
|
9
9
|
import { collapseConsoleOutputs } from "./collapseConsoleOutputs";
|
|
10
|
-
import type { CellRuntimeState } from "./types";
|
|
10
|
+
import type { CellRuntimeState, ConsoleOutputMessage } from "./types";
|
|
11
|
+
|
|
12
|
+
// Ids increase with position, so the last output holds the maximum.
|
|
13
|
+
function nextConsoleOutputId(outputs: ConsoleOutputMessage[]): number {
|
|
14
|
+
return (outputs.at(-1)?.id ?? 0) + 1;
|
|
15
|
+
}
|
|
11
16
|
|
|
12
17
|
export function transitionCell(
|
|
13
18
|
cell: CellRuntimeState,
|
|
@@ -133,6 +138,7 @@ export function transitionCell(
|
|
|
133
138
|
mimetype: output.mimetype,
|
|
134
139
|
data: output.data,
|
|
135
140
|
timestamp: output.timestamp,
|
|
141
|
+
id: output.id,
|
|
136
142
|
response: output.response ?? "",
|
|
137
143
|
};
|
|
138
144
|
}
|
|
@@ -146,8 +152,13 @@ export function transitionCell(
|
|
|
146
152
|
// messageConsole is an output that needs to be appended to the
|
|
147
153
|
// existing console outputs.
|
|
148
154
|
consoleOutputs = Array.isArray(messageConsole)
|
|
149
|
-
? collapseConsoleOutputs(
|
|
150
|
-
|
|
155
|
+
? collapseConsoleOutputs(
|
|
156
|
+
messageConsole.map((output, i) => ({ ...output, id: i + 1 })),
|
|
157
|
+
)
|
|
158
|
+
: collapseConsoleOutputs([
|
|
159
|
+
...consoleOutputs,
|
|
160
|
+
{ ...messageConsole, id: nextConsoleOutputId(consoleOutputs) },
|
|
161
|
+
]);
|
|
151
162
|
}
|
|
152
163
|
nextCell.consoleOutputs = consoleOutputs;
|
|
153
164
|
// Derive outline from output
|
package/src/core/cells/cells.ts
CHANGED
|
@@ -1114,6 +1114,7 @@ const {
|
|
|
1114
1114
|
mimetype: stdinOutput.mimetype,
|
|
1115
1115
|
data: stdinOutput.data,
|
|
1116
1116
|
timestamp: stdinOutput.timestamp,
|
|
1117
|
+
id: stdinOutput.id,
|
|
1117
1118
|
// An empty response resolves the prompt without retaining the secret.
|
|
1118
1119
|
response: stdinOutput.mimetype === "text/password" ? "" : response,
|
|
1119
1120
|
};
|
|
@@ -1761,7 +1762,8 @@ export const cellErrorsAtom = atom((get) => {
|
|
|
1761
1762
|
});
|
|
1762
1763
|
|
|
1763
1764
|
export const notebookOutline = atom((get) => {
|
|
1764
|
-
const
|
|
1765
|
+
const cellIds = get(cellIdsAtom);
|
|
1766
|
+
const cellRuntime = get(cellsRuntimeAtom);
|
|
1765
1767
|
const outlines = cellIds.inOrderIds.map(
|
|
1766
1768
|
(cellId) => cellRuntime[cellId].outline,
|
|
1767
1769
|
);
|
|
@@ -134,12 +134,8 @@ export function usePendingDeleteService() {
|
|
|
134
134
|
submit({ cellIds, deleteCell, deleteManyCells, store });
|
|
135
135
|
},
|
|
136
136
|
clear,
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
},
|
|
140
|
-
get shouldConfirmDelete() {
|
|
141
|
-
return entries.size > 1;
|
|
142
|
-
},
|
|
137
|
+
idle: entries.size === 0,
|
|
138
|
+
shouldConfirmDelete: entries.size > 1,
|
|
143
139
|
};
|
|
144
140
|
}
|
|
145
141
|
|
|
@@ -56,7 +56,7 @@ function mergeSessionAndNotebookCells(
|
|
|
56
56
|
return {
|
|
57
57
|
cellIds,
|
|
58
58
|
sessionCellData: new Map(
|
|
59
|
-
cellIds.map((id
|
|
59
|
+
cellIds.map((id) => [id, null] as [CellId, SessionCell | null]),
|
|
60
60
|
),
|
|
61
61
|
notebookCellData: new Map(
|
|
62
62
|
cellIds.map(
|
package/src/core/cells/types.ts
CHANGED
|
@@ -95,7 +95,7 @@ export interface CellRuntimeState {
|
|
|
95
95
|
/** TOC outline */
|
|
96
96
|
outline: Outline | null;
|
|
97
97
|
/** messages encoding the cell's console outputs. */
|
|
98
|
-
consoleOutputs:
|
|
98
|
+
consoleOutputs: ConsoleOutputMessage[];
|
|
99
99
|
/** current status of the cell */
|
|
100
100
|
status: RuntimeState;
|
|
101
101
|
/** whether the cell has stale inputs*/
|
|
@@ -130,3 +130,12 @@ export type WithResponse<T> = T & {
|
|
|
130
130
|
*/
|
|
131
131
|
response?: string;
|
|
132
132
|
};
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* A console output as held by the frontend. The id is assigned when the
|
|
136
|
+
* output arrives and never changes, so it can identify the output while
|
|
137
|
+
* neighboring outputs collapse, truncate, or receive a stdin response.
|
|
138
|
+
*/
|
|
139
|
+
export type ConsoleOutputMessage = WithResponse<OutputMessage> & {
|
|
140
|
+
id?: number;
|
|
141
|
+
};
|
|
@@ -100,7 +100,7 @@ function getDuplicateKeymaps(state: EditorState) {
|
|
|
100
100
|
(keymap) => keymap,
|
|
101
101
|
);
|
|
102
102
|
const duplicates = Objects.fromEntries(
|
|
103
|
-
Object.entries(groupBy).filter(([
|
|
103
|
+
Object.entries(groupBy).filter(([_key, value]) => value.length > 1),
|
|
104
104
|
);
|
|
105
105
|
return duplicates;
|
|
106
106
|
}
|
|
@@ -198,22 +198,22 @@ test("go to definition falls through to lower-priority LSP keymap", () => {
|
|
|
198
198
|
test("placeholder adds another extension", () => {
|
|
199
199
|
const opts = getOpts();
|
|
200
200
|
const withAI = new PythonLanguageAdapter()
|
|
201
|
-
.getExtension(
|
|
202
|
-
opts.cellId,
|
|
203
|
-
opts.completionConfig,
|
|
204
|
-
opts.hotkeys,
|
|
205
|
-
"marimo-import",
|
|
206
|
-
opts.lspConfig,
|
|
207
|
-
)
|
|
201
|
+
.getExtension({
|
|
202
|
+
cellId: opts.cellId,
|
|
203
|
+
completionConfig: opts.completionConfig,
|
|
204
|
+
hotkeys: opts.hotkeys,
|
|
205
|
+
placeholderType: "marimo-import",
|
|
206
|
+
lspConfig: opts.lspConfig,
|
|
207
|
+
})
|
|
208
208
|
.flat();
|
|
209
209
|
const withoutAI = new PythonLanguageAdapter()
|
|
210
|
-
.getExtension(
|
|
211
|
-
opts.cellId,
|
|
212
|
-
opts.completionConfig,
|
|
213
|
-
opts.hotkeys,
|
|
214
|
-
"none",
|
|
215
|
-
opts.lspConfig,
|
|
216
|
-
)
|
|
210
|
+
.getExtension({
|
|
211
|
+
cellId: opts.cellId,
|
|
212
|
+
completionConfig: opts.completionConfig,
|
|
213
|
+
hotkeys: opts.hotkeys,
|
|
214
|
+
placeholderType: "none",
|
|
215
|
+
lspConfig: opts.lspConfig,
|
|
216
|
+
})
|
|
217
217
|
.flat();
|
|
218
218
|
expect(withAI.length - 1).toBe(withoutAI.length);
|
|
219
219
|
});
|
|
@@ -221,22 +221,22 @@ test("placeholder adds another extension", () => {
|
|
|
221
221
|
test("ai adds more extensions", () => {
|
|
222
222
|
const opts = getOpts();
|
|
223
223
|
const withAI = new PythonLanguageAdapter()
|
|
224
|
-
.getExtension(
|
|
225
|
-
opts.cellId,
|
|
226
|
-
opts.completionConfig,
|
|
227
|
-
opts.hotkeys,
|
|
228
|
-
"ai",
|
|
229
|
-
opts.lspConfig,
|
|
230
|
-
)
|
|
224
|
+
.getExtension({
|
|
225
|
+
cellId: opts.cellId,
|
|
226
|
+
completionConfig: opts.completionConfig,
|
|
227
|
+
hotkeys: opts.hotkeys,
|
|
228
|
+
placeholderType: "ai",
|
|
229
|
+
lspConfig: opts.lspConfig,
|
|
230
|
+
})
|
|
231
231
|
.flat();
|
|
232
232
|
const withoutAI = new PythonLanguageAdapter()
|
|
233
|
-
.getExtension(
|
|
234
|
-
opts.cellId,
|
|
235
|
-
opts.completionConfig,
|
|
236
|
-
opts.hotkeys,
|
|
237
|
-
"none",
|
|
238
|
-
opts.lspConfig,
|
|
239
|
-
)
|
|
233
|
+
.getExtension({
|
|
234
|
+
cellId: opts.cellId,
|
|
235
|
+
completionConfig: opts.completionConfig,
|
|
236
|
+
hotkeys: opts.hotkeys,
|
|
237
|
+
placeholderType: "none",
|
|
238
|
+
lspConfig: opts.lspConfig,
|
|
239
|
+
})
|
|
240
240
|
.flat();
|
|
241
241
|
expect(withAI.length - 2).toBe(withoutAI.length);
|
|
242
242
|
});
|
|
@@ -68,6 +68,21 @@ describe("shouldAutorunMarkdownUpdate", () => {
|
|
|
68
68
|
).toBe(false);
|
|
69
69
|
});
|
|
70
70
|
|
|
71
|
+
it("ignores remote transactions while focused", () => {
|
|
72
|
+
const transaction = createTransaction({
|
|
73
|
+
changes: { from: 0, insert: "#" },
|
|
74
|
+
annotations: [Transaction.remote.of(true)],
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
expect(
|
|
78
|
+
shouldAutorunMarkdownUpdate({
|
|
79
|
+
docChanged: transaction.docChanged,
|
|
80
|
+
transactions: [transaction],
|
|
81
|
+
hasFocus: true,
|
|
82
|
+
}),
|
|
83
|
+
).toBe(false);
|
|
84
|
+
});
|
|
85
|
+
|
|
71
86
|
it("ignores programmatic doc changes without a user event", () => {
|
|
72
87
|
const transaction = createTransaction({
|
|
73
88
|
changes: { from: 0, insert: "#" },
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
3
|
import { closeCompletion, completionStatus } from "@codemirror/autocomplete";
|
|
4
|
-
import { type Extension, Prec } from "@codemirror/state";
|
|
4
|
+
import { type Extension, Prec, Transaction } from "@codemirror/state";
|
|
5
5
|
import {
|
|
6
6
|
EditorView,
|
|
7
7
|
type KeyBinding,
|
|
@@ -382,8 +382,12 @@ function shouldAutorunMarkdownUpdate({
|
|
|
382
382
|
}
|
|
383
383
|
|
|
384
384
|
return transactions.some((tr) => {
|
|
385
|
-
// Ignore
|
|
386
|
-
|
|
385
|
+
// Ignore remote changes to avoid duplicate runs. The client that made the
|
|
386
|
+
// edit runs it.
|
|
387
|
+
if (
|
|
388
|
+
tr.annotation(Transaction.remote) ||
|
|
389
|
+
tr.annotation(loroSyncAnnotation) !== undefined
|
|
390
|
+
) {
|
|
387
391
|
return false;
|
|
388
392
|
}
|
|
389
393
|
|
|
@@ -369,7 +369,7 @@ class CodeMirrorVimSync {
|
|
|
369
369
|
// We use onIdle to keep the focused editor snappy
|
|
370
370
|
onIdle(() => {
|
|
371
371
|
if (!skipBroadcast) {
|
|
372
|
-
this.broadcastModeChange(instance, e.mode
|
|
372
|
+
this.broadcastModeChange(instance, e.mode);
|
|
373
373
|
}
|
|
374
374
|
this.isBroadcasting = false;
|
|
375
375
|
});
|
|
@@ -380,11 +380,7 @@ class CodeMirrorVimSync {
|
|
|
380
380
|
this.instances.delete(instance);
|
|
381
381
|
}
|
|
382
382
|
|
|
383
|
-
public broadcastModeChange(
|
|
384
|
-
originInstance: EditorView,
|
|
385
|
-
mode: string,
|
|
386
|
-
subMode?: string,
|
|
387
|
-
) {
|
|
383
|
+
public broadcastModeChange(originInstance: EditorView, mode: string) {
|
|
388
384
|
invariant(
|
|
389
385
|
"exitInsertMode" in Vim,
|
|
390
386
|
"Vim does not have an exitInsertMode method",
|
|
@@ -42,12 +42,14 @@ const adapter = new SQLLanguageAdapter();
|
|
|
42
42
|
const TEST_ENGINE = "test_engine" as ConnectionName;
|
|
43
43
|
|
|
44
44
|
const TEST_EXTENSION_ARGS = [
|
|
45
|
-
{
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
45
|
+
{
|
|
46
|
+
cellId: {} as CellId,
|
|
47
|
+
completionConfig: {} as CompletionConfig,
|
|
48
|
+
hotkeys: {} as HotkeyProvider,
|
|
49
|
+
placeholderType: {} as PlaceholderType,
|
|
50
|
+
lspConfig: {} as LSPConfig & {
|
|
51
|
+
diagnostics: DiagnosticsConfig;
|
|
52
|
+
},
|
|
51
53
|
},
|
|
52
54
|
] as const;
|
|
53
55
|
|
|
@@ -930,15 +932,15 @@ describe("SQL analysis features", () => {
|
|
|
930
932
|
|
|
931
933
|
it("reports semantic diagnostics as warnings", async () => {
|
|
932
934
|
const adapter = new SQLLanguageAdapter();
|
|
933
|
-
const extensions = adapter.getExtension(
|
|
934
|
-
{} as CellId,
|
|
935
|
-
{} as CompletionConfig,
|
|
936
|
-
{} as HotkeyProvider,
|
|
937
|
-
{} as PlaceholderType,
|
|
938
|
-
{
|
|
935
|
+
const extensions = adapter.getExtension({
|
|
936
|
+
cellId: {} as CellId,
|
|
937
|
+
completionConfig: {} as CompletionConfig,
|
|
938
|
+
hotkeys: {} as HotkeyProvider,
|
|
939
|
+
placeholderType: {} as PlaceholderType,
|
|
940
|
+
lspConfig: {
|
|
939
941
|
diagnostics: { sql_linter: true },
|
|
940
942
|
} as LSPConfig & { diagnostics: DiagnosticsConfig },
|
|
941
|
-
);
|
|
943
|
+
});
|
|
942
944
|
const state = EditorState.create({
|
|
943
945
|
doc: "SELECT missing FROM users",
|
|
944
946
|
extensions: [languageMetadataField.init(() => metadata), ...extensions],
|
|
@@ -963,15 +965,15 @@ describe("SQL analysis features", () => {
|
|
|
963
965
|
|
|
964
966
|
it("does not report unknown tables", async () => {
|
|
965
967
|
const adapter = new SQLLanguageAdapter();
|
|
966
|
-
const extensions = adapter.getExtension(
|
|
967
|
-
{} as CellId,
|
|
968
|
-
{} as CompletionConfig,
|
|
969
|
-
{} as HotkeyProvider,
|
|
970
|
-
{} as PlaceholderType,
|
|
971
|
-
{
|
|
968
|
+
const extensions = adapter.getExtension({
|
|
969
|
+
cellId: {} as CellId,
|
|
970
|
+
completionConfig: {} as CompletionConfig,
|
|
971
|
+
hotkeys: {} as HotkeyProvider,
|
|
972
|
+
placeholderType: {} as PlaceholderType,
|
|
973
|
+
lspConfig: {
|
|
972
974
|
diagnostics: { sql_linter: true },
|
|
973
975
|
} as LSPConfig & { diagnostics: DiagnosticsConfig },
|
|
974
|
-
);
|
|
976
|
+
});
|
|
975
977
|
const state = EditorState.create({
|
|
976
978
|
doc: "SELECT missing FROM users; SELECT * FROM unknown_table",
|
|
977
979
|
extensions: [languageMetadataField.init(() => metadata), ...extensions],
|
|
@@ -167,13 +167,13 @@ function updateLanguageAdapterAndCode({
|
|
|
167
167
|
setLanguageAdapter.of(nextLanguage),
|
|
168
168
|
setLanguageMetadata.of(metadata),
|
|
169
169
|
languageCompartment.reconfigure(
|
|
170
|
-
nextLanguage.getExtension(
|
|
170
|
+
nextLanguage.getExtension({
|
|
171
171
|
cellId,
|
|
172
172
|
completionConfig,
|
|
173
|
-
hotkeysProvider,
|
|
173
|
+
hotkeys: hotkeysProvider,
|
|
174
174
|
placeholderType,
|
|
175
175
|
lspConfig,
|
|
176
|
-
),
|
|
176
|
+
}),
|
|
177
177
|
),
|
|
178
178
|
// Clear history
|
|
179
179
|
historyCompartment.reconfigure([]),
|
|
@@ -218,13 +218,13 @@ export function adaptiveLanguageConfiguration(opts: {
|
|
|
218
218
|
// Language adapter
|
|
219
219
|
languageToggleKeymaps(),
|
|
220
220
|
languageCompartment.of(
|
|
221
|
-
LanguageAdapters.python.getExtension(
|
|
221
|
+
LanguageAdapters.python.getExtension({
|
|
222
222
|
cellId,
|
|
223
223
|
completionConfig,
|
|
224
224
|
hotkeys,
|
|
225
225
|
placeholderType,
|
|
226
226
|
lspConfig,
|
|
227
|
-
),
|
|
227
|
+
}),
|
|
228
228
|
),
|
|
229
229
|
languageAdapterState,
|
|
230
230
|
languageMetadataField,
|
|
@@ -323,12 +323,12 @@ export function reconfigureLanguageEffect(
|
|
|
323
323
|
}
|
|
324
324
|
|
|
325
325
|
return languageCompartment.reconfigure(
|
|
326
|
-
language.getExtension(
|
|
326
|
+
language.getExtension({
|
|
327
327
|
cellId,
|
|
328
328
|
completionConfig,
|
|
329
|
-
hotkeysProvider,
|
|
329
|
+
hotkeys: hotkeysProvider,
|
|
330
330
|
placeholderType,
|
|
331
331
|
lspConfig,
|
|
332
|
-
),
|
|
332
|
+
}),
|
|
333
333
|
);
|
|
334
334
|
}
|
|
@@ -69,12 +69,14 @@ export class MarkdownLanguageAdapter implements LanguageAdapter<MarkdownLanguage
|
|
|
69
69
|
return this.parser.isSupported(pythonCode);
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
-
public getExtension(
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
72
|
+
public getExtension({
|
|
73
|
+
hotkeys,
|
|
74
|
+
}: {
|
|
75
|
+
cellId: CellId;
|
|
76
|
+
completionConfig: CompletionConfig;
|
|
77
|
+
hotkeys: HotkeyProvider;
|
|
78
|
+
placeholderType: PlaceholderType;
|
|
79
|
+
}): Extension[] {
|
|
78
80
|
const markdownLanguageData = markdown().language.data;
|
|
79
81
|
let view: EditorView | undefined;
|
|
80
82
|
|
|
@@ -157,7 +157,7 @@ const pylspClient = once((lspConfig: LSPConfig) => {
|
|
|
157
157
|
return notebookClient;
|
|
158
158
|
});
|
|
159
159
|
|
|
160
|
-
const tyLspClient = once((
|
|
160
|
+
const tyLspClient = once((_config: LSPConfig) => {
|
|
161
161
|
// oxlint-disable-next-line prefer-const -- reassigned after closure capture
|
|
162
162
|
let resyncCallback: (() => Promise<void>) | undefined;
|
|
163
163
|
|
|
@@ -176,7 +176,7 @@ const tyLspClient = once((_: LSPConfig) => {
|
|
|
176
176
|
const notebookClient = new NotebookLanguageServerClient(
|
|
177
177
|
new LanguageServerClient({
|
|
178
178
|
...lspClientOpts,
|
|
179
|
-
getWorkspaceConfiguration: (
|
|
179
|
+
getWorkspaceConfiguration: () => [{ disableLanguageServices: true }],
|
|
180
180
|
}),
|
|
181
181
|
{},
|
|
182
182
|
);
|
|
@@ -226,7 +226,7 @@ const pyreflyClient = once(
|
|
|
226
226
|
},
|
|
227
227
|
);
|
|
228
228
|
|
|
229
|
-
const pyrightClient = once((
|
|
229
|
+
const pyrightClient = once((_config: LSPConfig) => {
|
|
230
230
|
// oxlint-disable-next-line prefer-const -- reassigned after closure capture
|
|
231
231
|
let resyncCallback: (() => Promise<void>) | undefined;
|
|
232
232
|
|
|
@@ -279,13 +279,19 @@ export class PythonLanguageAdapter implements LanguageAdapter<{}> {
|
|
|
279
279
|
return this.parser.isSupported(code);
|
|
280
280
|
}
|
|
281
281
|
|
|
282
|
-
public getExtension(
|
|
283
|
-
cellId
|
|
284
|
-
completionConfig
|
|
285
|
-
hotkeys
|
|
286
|
-
placeholderType
|
|
287
|
-
lspConfig
|
|
288
|
-
|
|
282
|
+
public getExtension({
|
|
283
|
+
cellId,
|
|
284
|
+
completionConfig,
|
|
285
|
+
hotkeys,
|
|
286
|
+
placeholderType,
|
|
287
|
+
lspConfig,
|
|
288
|
+
}: {
|
|
289
|
+
cellId: CellId;
|
|
290
|
+
completionConfig: CompletionConfig;
|
|
291
|
+
hotkeys: HotkeyProvider;
|
|
292
|
+
placeholderType: PlaceholderType;
|
|
293
|
+
lspConfig: LSPConfig & { diagnostics: DiagnosticsConfig };
|
|
294
|
+
}): Extension[] {
|
|
289
295
|
const getCompletionsExtension = () => {
|
|
290
296
|
const autocompleteOptions = {
|
|
291
297
|
// We remove the default keymap because we use our own which
|