@marimo-team/frontend 0.25.3-dev125 → 0.25.3-dev129
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 → CellStatus-6xDEj3Hs.js} +1 -1
- package/dist/assets/{ConnectedDataExplorerComponent-BRgqbAsc.js → ConnectedDataExplorerComponent-DCcLAktu.js} +1 -1
- package/dist/assets/{ErrorBoundary-DxSzjvbx.js → ErrorBoundary-98Xo04DS.js} +2 -2
- package/dist/assets/{JsonOutput-B7pGj79O.js → JsonOutput-V47aiTIK.js} +5 -5
- package/dist/assets/{LazyAnyLanguageCodeMirror-BPYE76jR.js → LazyAnyLanguageCodeMirror-DoxWX_Wp.js} +2 -2
- package/dist/assets/{MarimoErrorOutput-Bzo6Bkp5.js → MarimoErrorOutput-DeWZNBgL.js} +1 -1
- package/dist/assets/{RenderHTML-D6AC0IhC.js → RenderHTML-Bjvcs70-.js} +1 -1
- package/dist/assets/{RunButton-BjYsPiKa.js → RunButton-CnvvXD9d.js} +1 -1
- package/dist/assets/{add-cell-with-ai-CFrR1iW4.js → add-cell-with-ai-BbuqzITi.js} +1 -1
- package/dist/assets/{add-connection-dialog-CyNAB_W2.js → add-connection-dialog-DIC7owvZ.js} +1 -1
- package/dist/assets/{agent-panel-VOrccb5q.js → agent-panel-D8hO2P1x.js} +1 -1
- package/dist/assets/{ai-model-dropdown-Bfxv_zvu.js → ai-model-dropdown-DgmiG_5j.js} +1 -1
- package/dist/assets/alert-dialog-8YiYLrfr.js +1 -0
- package/dist/assets/{any-language-editor-DUMe1UCk.js → any-language-editor-BWmz0P_C.js} +1 -1
- package/dist/assets/{app-config-button-BRcjv8A_.js → app-config-button-UZHv1Iim.js} +1 -1
- package/dist/assets/{blob-DTYOX-m5.js → blob-BPknzzkY.js} +1 -1
- package/dist/assets/{button-D8gVKwe-.js → button-Cl7haVNh.js} +1 -1
- package/dist/assets/{cache-panel-BV-c7ed0.js → cache-panel-DuBsA6oO.js} +1 -1
- package/dist/assets/{capabilities-Pq1YNPlK.js → capabilities-DcB-Dd0T.js} +1 -1
- package/dist/assets/{cell-editor-eKgYK8Bd.js → cell-editor-CM-K1_wq.js} +1 -1
- package/dist/assets/{cell-link-D3rkqgbU.js → cell-link-CAjuFcLK.js} +1 -1
- package/dist/assets/cells-BypTg035.js +220 -0
- package/dist/assets/{chat-display-BrT4VJJK.js → chat-display-BRLNOoTF.js} +1 -1
- package/dist/assets/chat-panel-D02Rk9we.js +4 -0
- package/dist/assets/{chat-ui-SAdJxg-k.js → chat-ui-DFN_RwxF.js} +1 -1
- package/dist/assets/circle-B0vOU-Dh.js +1 -0
- package/dist/assets/{code-visibility-DYDagVy7.js → code-visibility-D1Wf7-vD.js} +1 -1
- package/dist/assets/{column-preview-yI7-INkZ.js → column-preview-85ORMhfB.js} +1 -1
- package/dist/assets/{command-palette-DF-B_YpW.js → command-palette-CtyjjdsA.js} +1 -1
- package/dist/assets/{common-DgXKwblm.js → common-J265II7i.js} +1 -1
- package/dist/assets/{components-DCo7mAWO.js → components-9p_w2C6e.js} +1 -1
- package/dist/assets/{components-CBE8cOLK.js → components-B6gDDccL.js} +1 -1
- package/dist/assets/{components-CuMhY4Sf.js → components-Bd3Dpi92.js} +1 -1
- package/dist/assets/{config-CD1IuZFJ.js → config-7IjqNuVp.js} +1 -1
- package/dist/assets/config-BC32AAdw.js +1 -0
- package/dist/assets/{config-DpY86_Yq.js → config-CXnC3MRv.js} +1 -1
- package/dist/assets/{copy-KlhazlhB.js → copy-74EjuZso.js} +1 -1
- package/dist/assets/{copy-icon-8-a5vovc.js → copy-icon-Craaocbu.js} +1 -1
- package/dist/assets/{createReducer-CaI_Oa0v.js → createReducer-B04CIO-e.js} +1 -1
- package/dist/assets/{datasource-D9JMcEAP.js → datasource-Dy4rzzSP.js} +1 -1
- package/dist/assets/{dates-CQMwFko2.js → dates-CaPZVGtm.js} +1 -1
- package/dist/assets/{dependency-graph-panel-BVJWPCvw.js → dependency-graph-panel-ByGFFT4E.js} +1 -1
- package/dist/assets/dist-gaK_BThd.js +1 -0
- package/dist/assets/{documentation-panel--wI4XHso.js → documentation-panel-LxuJCY3M.js} +1 -1
- package/dist/assets/download-BsBJWH_j.js +9 -0
- package/dist/assets/dropdown-menu-Cwi17BoX.js +1 -0
- package/dist/assets/{edit-page-Uj9YSRMX.js → edit-page--d6X-OO9.js} +4 -4
- package/dist/assets/{error-banner-B5kzVf_0.js → error-banner-m3mastc-.js} +1 -1
- package/dist/assets/{error-entries-D00nWhWE.js → error-entries-0wTSSuK9.js} +1 -1
- package/dist/assets/{error-panel-CcN_1PWf.js → error-panel-ZNdbE3Fo.js} +1 -1
- package/dist/assets/{es-N9SHpmG7.js → es-Rg27gAEy.js} +1 -1
- package/dist/assets/feedback-button-Bt89tGG2.js +1 -0
- package/dist/assets/{feedback-button-ByGgqUsX.js → feedback-button-C6asPmsh.js} +1 -1
- package/dist/assets/{file-explorer-panel-eTEqtMPW.js → file-explorer-panel-0fUP_ptL.js} +1 -1
- package/dist/assets/{file-name-input-D5SfTNWh.js → file-name-input-B8lzI5iS.js} +1 -1
- package/dist/assets/{floating-outline-B-k3P_AO.js → floating-outline-CRpmOv32.js} +1 -1
- package/dist/assets/{formats-zylfwejq.js → formats-CYyvbiZA.js} +1 -1
- package/dist/assets/{formatting-uom1es4b.js → formatting-DW2u7HXI.js} +1 -1
- package/dist/assets/fullscreen-D-ldV-19.js +41 -0
- package/dist/assets/{gallery-page-BzbMhDHi.js → gallery-page-ClR8U-km.js} +1 -1
- package/dist/assets/{glide-data-editor-BMqhUrHI.js → glide-data-editor-B6QQBQwS.js} +1 -1
- package/dist/assets/{glide-utils-HFqhvWHI.js → glide-utils-DsTeJ7WA.js} +1 -1
- package/dist/assets/{home-page-DJcYWiga.js → home-page-CJnqDcT9.js} +1 -1
- package/dist/assets/{hooks-CGLb_CCz.js → hooks-CCek4i9f.js} +1 -1
- package/dist/assets/{html-to-image-D_0rd3_B.js → html-to-image-BW0fcUS8.js} +1 -1
- package/dist/assets/{index-bSIORW11.js → index-B5pWkt7a.js} +18 -18
- package/dist/assets/{input-DmHMEZGh.js → input-DLA5Dhn3.js} +2 -2
- package/dist/assets/{kiosk-mode-DFS6HopF.js → kiosk-mode-Cbxffiz9.js} +1 -1
- package/dist/assets/{layout-C2XnLAfO.js → layout-66Urh4Zg.js} +3 -3
- package/dist/assets/links-UwsB2RA1.js +1 -0
- package/dist/assets/{logs-panel-B3T1GFBk.js → logs-panel-DFhkIcge.js} +1 -1
- package/dist/assets/{markdown-renderer-BhiTvxtL.js → markdown-renderer-mYYQYD2m.js} +1 -1
- package/dist/assets/menu-items-yD7IV3V4.js +1 -0
- package/dist/assets/{mermaid-BKXlWk4F.js → mermaid-DmekSy8J.js} +1 -1
- package/dist/assets/{name-cell-input-CgAObR6N.js → name-cell-input-Crcu3i2z.js} +1 -1
- package/dist/assets/{numbers-CsZVw3Dc.js → numbers-DJK15_4S.js} +1 -1
- package/dist/assets/{outline-panel-BhBb7Vqw.js → outline-panel-BFIPK0H_.js} +1 -1
- package/dist/assets/{packages-panel-Bt0xNpFl.js → packages-panel-B4KtjgkF.js} +1 -1
- package/dist/assets/{panel-accordion-state-ZsUdpAYn.js → panel-accordion-state-D6KtwSF8.js} +1 -1
- package/dist/assets/panels-DiwGKPzK.js +1 -0
- package/dist/assets/process-output-DDvMd6Jh.js +1 -0
- package/dist/assets/{readonly-code-display-TvOC7ESE.js → readonly-code-display-VDqYn2d0.js} +1 -1
- package/dist/assets/{readonly-python-code-Cqkfdeyo.js → readonly-python-code-CZUKLXJ4.js} +1 -1
- package/dist/assets/{renderShortcut-rUwGqKgC.js → renderShortcut-Bxv9ZLnD.js} +1 -1
- package/dist/assets/{reveal-component-CwE6U9oJ.js → reveal-component-BMmDU1uN.js} +1 -1
- package/dist/assets/{run-page-CtonWTtJ.js → run-page-BmOPPh2Y.js} +1 -1
- package/dist/assets/{runs-C49hleBy.js → runs-C8uOPNAW.js} +1 -1
- package/dist/assets/{runtime-details-state-CKqJSfSR.js → runtime-details-state-CipqynUD.js} +1 -1
- package/dist/assets/{scratchpad-panel-CwVBedfZ.js → scratchpad-panel-Drr_kuwb.js} +1 -1
- package/dist/assets/{scroll-to-bottom-button-CIkON2WJ.js → scroll-to-bottom-button-CidjyqiH.js} +1 -1
- package/dist/assets/{secrets-panel-bcfEKxRx.js → secrets-panel-D-W1PL76.js} +1 -1
- package/dist/assets/select-CgWQvW1F.js +1 -0
- package/dist/assets/{session-CMLIzZKw.js → session-BHgGkjDm.js} +1 -1
- package/dist/assets/{session-panel-CdHdKUCF.js → session-panel-W7JOcog_.js} +1 -1
- package/dist/assets/{snippets-panel-DYLWOLYw.js → snippets-panel-cUPEdm66.js} +1 -1
- package/dist/assets/{spec-DlH4Mp7d.js → spec-DFtwOyXT.js} +1 -1
- package/dist/assets/{state-DgECPVFs.js → state-BLGvzMB6.js} +3 -3
- package/dist/assets/{state-B_MCKzBL.js → state-BYETGwDZ.js} +1 -1
- package/dist/assets/{state-3mcyTS9q.js → state-CZu2E2Lb.js} +1 -1
- package/dist/assets/{state-C5WAeuTu.js → state-ClBFtZxn.js} +1 -1
- package/dist/assets/{state-Cv2JW3l9.js → state-CrLrURYG.js} +1 -1
- package/dist/assets/{state-DZN9vZ6z.js → state-QfGh3m2G.js} +1 -1
- package/dist/assets/{strings-C25fhMR_.js → strings-3lNX212T.js} +1 -1
- package/dist/assets/{swiper-component-CRGRy5_O.js → swiper-component-BwGv-Pu1.js} +1 -1
- package/dist/assets/switch-D2gdC_ep.js +1 -0
- package/dist/assets/tabs-BLczoY3k.js +1 -0
- package/dist/assets/{terminal-Ca-kubKb.js → terminal-DLgGyFIP.js} +1 -1
- package/dist/assets/toast-trUlkvx3.js +1 -0
- package/dist/assets/tooltip-B5lAA_jn.js +1 -0
- package/dist/assets/{tooltip-Brya4Ghn.js → tooltip-BiQdpXA0.js} +1 -1
- package/dist/assets/{tracing-B0J2ctTm.js → tracing-BNFynaTu.js} +1 -1
- package/dist/assets/{tracing-panel-C1OCpoeE.js → tracing-panel-CsHuzRGP.js} +2 -2
- package/dist/assets/{tree-actions-sjBxIglc.js → tree-actions-BQw_utcj.js} +1 -1
- package/dist/assets/use-restore-focus-DMSzeuUr.js +1 -0
- package/dist/assets/{useAddCell-CaXnFGki.js → useAddCell-_b8InOZC.js} +1 -1
- package/dist/assets/{useBoolean-Dd2nWXFJ.js → useBoolean-BkeUcn1n.js} +1 -1
- package/dist/assets/{useCellActionButton-CJ90CMEj.js → useCellActionButton-BbgMzBdk.js} +1 -1
- package/dist/assets/{useDeleteCell-D9N85822.js → useDeleteCell-DhoFbEkU.js} +1 -1
- package/dist/assets/{useDependencyPanelTab-CzAE0cm-.js → useDependencyPanelTab-COTULhoH.js} +1 -1
- package/dist/assets/{useEventListener-CjDeLqFC.js → useEventListener-DPOTkksd.js} +1 -1
- package/dist/assets/{useIframeCapabilities-Czr9e4uG.js → useIframeCapabilities-sHeZt_EA.js} +1 -1
- package/dist/assets/{useInstallPackage-wcDq9hYT.js → useInstallPackage-BfNKN33w.js} +1 -1
- package/dist/assets/{useInterval-DJdQmXnq.js → useInterval-BcdwHHB5.js} +1 -1
- package/dist/assets/{useNotebookActions-CAMEQ38y.js → useNotebookActions-xnA_l3nY.js} +1 -1
- package/dist/assets/{useRunCells-DGakx8hj.js → useRunCells-VBCe6CLn.js} +1 -1
- package/dist/assets/{useSplitCell-AK5BKPGM.js → useSplitCell-AvSpVAmq.js} +1 -1
- package/dist/assets/{useTheme-BAA27lh7.js → useTheme-C2dnh2vM.js} +1 -1
- package/dist/assets/{vega-component-BeyxAJad.js → vega-component-DJf6ho22.js} +1 -1
- package/dist/assets/{write-secret-modal-BEx-EUlh.js → write-secret-modal-CBi2vNK_.js} +1 -1
- package/dist/index.html +62 -62
- package/package.json +3 -3
- package/src/core/host/__tests__/notebook-client.test.ts +18 -6
- package/src/core/host/__tests__/static.test.ts +4 -2
- package/src/core/host/__tests__/wasm.test.ts +12 -10
- package/src/core/host/backend.ts +8 -3
- package/src/core/host/notebook-client.ts +15 -15
- package/src/core/host/static.ts +2 -2
- package/src/core/host/wasm.ts +4 -3
- package/src/core/runtime/__tests__/runtime.test.ts +17 -0
- package/src/core/runtime/runtime.ts +13 -0
- package/src/core/websocket/__tests__/backend.test.ts +111 -0
- package/src/core/websocket/__tests__/useNotebookClient.hook.test.tsx +32 -27
- package/src/core/websocket/__tests__/useNotebookSession.hook.test.tsx +7 -4
- package/src/core/websocket/backend.ts +68 -0
- package/src/core/websocket/transports/__tests__/notebook.test.ts +9 -56
- package/src/core/websocket/transports/notebook.ts +15 -38
- package/src/core/websocket/useNotebookClient.ts +6 -6
- package/src/core/websocket/useNotebookSession.tsx +3 -2
- package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +66 -66
- package/dist/assets/alert-dialog-C-sWmKva.js +0 -1
- package/dist/assets/cells-2HETnlvE.js +0 -220
- package/dist/assets/chat-panel-qpPNEwxV.js +0 -4
- package/dist/assets/circle-B6D_6D8w.js +0 -1
- package/dist/assets/config-DMz7oN0r.js +0 -1
- package/dist/assets/dist-jlhMTKo_.js +0 -1
- package/dist/assets/download-Dod42wfD.js +0 -9
- package/dist/assets/dropdown-menu-DS6umAnH.js +0 -1
- package/dist/assets/feedback-button-tbWwJ_t6.js +0 -1
- package/dist/assets/fullscreen-BWTs8pYZ.js +0 -41
- package/dist/assets/links-DX2w97N9.js +0 -1
- package/dist/assets/menu-items-BgUyNUpu.js +0 -1
- package/dist/assets/panels-DJghvIKo.js +0 -1
- package/dist/assets/process-output-CeOMwE17.js +0 -1
- package/dist/assets/select-3CVGlYrC.js +0 -1
- package/dist/assets/switch-DYjBfpNJ.js +0 -1
- package/dist/assets/tabs-CY8E4r9U.js +0 -1
- package/dist/assets/toast-Gzxi-le_.js +0 -1
- package/dist/assets/tooltip-CkGm8X7m.js +0 -1
- package/dist/assets/use-restore-focus-DdS7Tl0F.js +0 -1
package/dist/index.html
CHANGED
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
<marimo-server-token data-token="{{ server_token }}" hidden></marimo-server-token>
|
|
67
67
|
<!-- /TODO -->
|
|
68
68
|
<title>{{ title }}</title>
|
|
69
|
-
<script type="module" crossorigin src="./assets/index-
|
|
69
|
+
<script type="module" crossorigin src="./assets/index-B5pWkt7a.js"></script>
|
|
70
70
|
<link rel="modulepreload" crossorigin href="./assets/rolldown-runtime-B0Z9INg1.js">
|
|
71
71
|
<link rel="modulepreload" crossorigin href="./assets/react-DVplv7_D.js">
|
|
72
72
|
<link rel="modulepreload" crossorigin href="./assets/compiler-runtime-BrajqUja.js">
|
|
@@ -80,54 +80,54 @@
|
|
|
80
80
|
<link rel="modulepreload" crossorigin href="./assets/isArrayLikeObject-DnwgSs_Z.js">
|
|
81
81
|
<link rel="modulepreload" crossorigin href="./assets/_baseMerge-CQpUq7ep.js">
|
|
82
82
|
<link rel="modulepreload" crossorigin href="./assets/objects-rLPlQ3X_.js">
|
|
83
|
-
<link rel="modulepreload" crossorigin href="./assets/useEventListener-
|
|
83
|
+
<link rel="modulepreload" crossorigin href="./assets/useEventListener-DPOTkksd.js">
|
|
84
84
|
<link rel="modulepreload" crossorigin href="./assets/invariant-Ci2dTZ72.js">
|
|
85
|
-
<link rel="modulepreload" crossorigin href="./assets/config-
|
|
85
|
+
<link rel="modulepreload" crossorigin href="./assets/config-CXnC3MRv.js">
|
|
86
86
|
<link rel="modulepreload" crossorigin href="./assets/utils-B4K466FK.js">
|
|
87
|
-
<link rel="modulepreload" crossorigin href="./assets/session-
|
|
87
|
+
<link rel="modulepreload" crossorigin href="./assets/session-BHgGkjDm.js">
|
|
88
88
|
<link rel="modulepreload" crossorigin href="./assets/Deferred-CrTnjj37.js">
|
|
89
|
-
<link rel="modulepreload" crossorigin href="./assets/config-
|
|
89
|
+
<link rel="modulepreload" crossorigin href="./assets/config-7IjqNuVp.js">
|
|
90
90
|
<link rel="modulepreload" crossorigin href="./assets/clsx-DB0hHKMi.js">
|
|
91
91
|
<link rel="modulepreload" crossorigin href="./assets/cn-ldLVeaqm.js">
|
|
92
92
|
<link rel="modulepreload" crossorigin href="./assets/jsx-runtime-B74pBk57.js">
|
|
93
|
-
<link rel="modulepreload" crossorigin href="./assets/fullscreen-
|
|
94
|
-
<link rel="modulepreload" crossorigin href="./assets/dist-
|
|
95
|
-
<link rel="modulepreload" crossorigin href="./assets/menu-items-
|
|
96
|
-
<link rel="modulepreload" crossorigin href="./assets/use-restore-focus-
|
|
93
|
+
<link rel="modulepreload" crossorigin href="./assets/fullscreen-D-ldV-19.js">
|
|
94
|
+
<link rel="modulepreload" crossorigin href="./assets/dist-gaK_BThd.js">
|
|
95
|
+
<link rel="modulepreload" crossorigin href="./assets/menu-items-yD7IV3V4.js">
|
|
96
|
+
<link rel="modulepreload" crossorigin href="./assets/use-restore-focus-DMSzeuUr.js">
|
|
97
97
|
<link rel="modulepreload" crossorigin href="./assets/createLucideIcon-DfJ2oMlA.js">
|
|
98
|
-
<link rel="modulepreload" crossorigin href="./assets/circle-
|
|
99
|
-
<link rel="modulepreload" crossorigin href="./assets/button-
|
|
98
|
+
<link rel="modulepreload" crossorigin href="./assets/circle-B0vOU-Dh.js">
|
|
99
|
+
<link rel="modulepreload" crossorigin href="./assets/button-Cl7haVNh.js">
|
|
100
100
|
<link rel="modulepreload" crossorigin href="./assets/check-BQNapYaf.js">
|
|
101
101
|
<link rel="modulepreload" crossorigin href="./assets/I18nProvider-Cg2I_s1_.js">
|
|
102
102
|
<link rel="modulepreload" crossorigin href="./assets/useNumberFormatter-D7O_26UI.js">
|
|
103
|
-
<link rel="modulepreload" crossorigin href="./assets/select-
|
|
104
|
-
<link rel="modulepreload" crossorigin href="./assets/toast-
|
|
105
|
-
<link rel="modulepreload" crossorigin href="./assets/tooltip-
|
|
103
|
+
<link rel="modulepreload" crossorigin href="./assets/select-CgWQvW1F.js">
|
|
104
|
+
<link rel="modulepreload" crossorigin href="./assets/toast-trUlkvx3.js">
|
|
105
|
+
<link rel="modulepreload" crossorigin href="./assets/tooltip-B5lAA_jn.js">
|
|
106
106
|
<link rel="modulepreload" crossorigin href="./assets/paths-bkIFVj8h.js">
|
|
107
107
|
<link rel="modulepreload" crossorigin href="./assets/useLifecycle-Mq4gc5kS.js">
|
|
108
108
|
<link rel="modulepreload" crossorigin href="./assets/toDate-DOj9Q6uC.js">
|
|
109
109
|
<link rel="modulepreload" crossorigin href="./assets/database-zap-B_PMVg8T.js">
|
|
110
|
-
<link rel="modulepreload" crossorigin href="./assets/alert-dialog-
|
|
110
|
+
<link rel="modulepreload" crossorigin href="./assets/alert-dialog-8YiYLrfr.js">
|
|
111
111
|
<link rel="modulepreload" crossorigin href="./assets/arrays-0R2reF2y.js">
|
|
112
112
|
<link rel="modulepreload" crossorigin href="./assets/once-6KNTRW0u.js">
|
|
113
|
-
<link rel="modulepreload" crossorigin href="./assets/numbers-
|
|
113
|
+
<link rel="modulepreload" crossorigin href="./assets/numbers-DJK15_4S.js">
|
|
114
114
|
<link rel="modulepreload" crossorigin href="./assets/useDebounce-DwTQ_1Pu.js">
|
|
115
|
-
<link rel="modulepreload" crossorigin href="./assets/input-
|
|
115
|
+
<link rel="modulepreload" crossorigin href="./assets/input-DLA5Dhn3.js">
|
|
116
116
|
<link rel="modulepreload" crossorigin href="./assets/use-toast-Wu434mLr.js">
|
|
117
117
|
<link rel="modulepreload" crossorigin href="./assets/requests-BIFR-h4M.js">
|
|
118
118
|
<link rel="modulepreload" crossorigin href="./assets/uuid-k9DpjH68.js">
|
|
119
|
-
<link rel="modulepreload" crossorigin href="./assets/write-secret-modal-
|
|
119
|
+
<link rel="modulepreload" crossorigin href="./assets/write-secret-modal-CBi2vNK_.js">
|
|
120
120
|
<link rel="modulepreload" crossorigin href="./assets/plus-C5silF6g.js">
|
|
121
121
|
<link rel="modulepreload" crossorigin href="./assets/trash-2-DcgaW8fn.js">
|
|
122
122
|
<link rel="modulepreload" crossorigin href="./assets/preload-helper-uBIymjUX.js">
|
|
123
123
|
<link rel="modulepreload" crossorigin href="./assets/dist-Cny7_yZb.js">
|
|
124
124
|
<link rel="modulepreload" crossorigin href="./assets/dist-DBMV4gqt.js">
|
|
125
|
-
<link rel="modulepreload" crossorigin href="./assets/capabilities-
|
|
125
|
+
<link rel="modulepreload" crossorigin href="./assets/capabilities-DcB-Dd0T.js">
|
|
126
126
|
<link rel="modulepreload" crossorigin href="./assets/cjs-C49f7GXV.js">
|
|
127
|
-
<link rel="modulepreload" crossorigin href="./assets/createReducer-
|
|
127
|
+
<link rel="modulepreload" crossorigin href="./assets/createReducer-B04CIO-e.js">
|
|
128
128
|
<link rel="modulepreload" crossorigin href="./assets/dist-qhAY4L2r.js">
|
|
129
129
|
<link rel="modulepreload" crossorigin href="./assets/marked.esm-B_3iMIUq.js">
|
|
130
|
-
<link rel="modulepreload" crossorigin href="./assets/strings-
|
|
130
|
+
<link rel="modulepreload" crossorigin href="./assets/strings-3lNX212T.js">
|
|
131
131
|
<link rel="modulepreload" crossorigin href="./assets/dist-BOfh4hMd.js">
|
|
132
132
|
<link rel="modulepreload" crossorigin href="./assets/badge-crT3E0Rm.js">
|
|
133
133
|
<link rel="modulepreload" crossorigin href="./assets/dist-DtH-7lot.js">
|
|
@@ -136,84 +136,84 @@
|
|
|
136
136
|
<link rel="modulepreload" crossorigin href="./assets/dist-LSsCJjA3.js">
|
|
137
137
|
<link rel="modulepreload" crossorigin href="./assets/dist-DusFODSa.js">
|
|
138
138
|
<link rel="modulepreload" crossorigin href="./assets/stex-Dc5bKD4z.js">
|
|
139
|
-
<link rel="modulepreload" crossorigin href="./assets/useTheme-
|
|
139
|
+
<link rel="modulepreload" crossorigin href="./assets/useTheme-C2dnh2vM.js">
|
|
140
140
|
<link rel="modulepreload" crossorigin href="./assets/useAsyncData-qvoPYHtx.js">
|
|
141
141
|
<link rel="modulepreload" crossorigin href="./assets/purify.es--06brOip.js">
|
|
142
|
-
<link rel="modulepreload" crossorigin href="./assets/cells-
|
|
142
|
+
<link rel="modulepreload" crossorigin href="./assets/cells-BypTg035.js">
|
|
143
143
|
<link rel="modulepreload" crossorigin href="./assets/get-DjNf4SIX.js">
|
|
144
144
|
<link rel="modulepreload" crossorigin href="./assets/_baseSet-Bpdo9AvU.js">
|
|
145
145
|
<link rel="modulepreload" crossorigin href="./assets/errors-CNsgAw6m.js">
|
|
146
|
-
<link rel="modulepreload" crossorigin href="./assets/config-
|
|
147
|
-
<link rel="modulepreload" crossorigin href="./assets/state-
|
|
148
|
-
<link rel="modulepreload" crossorigin href="./assets/state-
|
|
149
|
-
<link rel="modulepreload" crossorigin href="./assets/LazyAnyLanguageCodeMirror-
|
|
150
|
-
<link rel="modulepreload" crossorigin href="./assets/copy-
|
|
146
|
+
<link rel="modulepreload" crossorigin href="./assets/config-BC32AAdw.js">
|
|
147
|
+
<link rel="modulepreload" crossorigin href="./assets/state-BYETGwDZ.js">
|
|
148
|
+
<link rel="modulepreload" crossorigin href="./assets/state-ClBFtZxn.js">
|
|
149
|
+
<link rel="modulepreload" crossorigin href="./assets/LazyAnyLanguageCodeMirror-DoxWX_Wp.js">
|
|
150
|
+
<link rel="modulepreload" crossorigin href="./assets/copy-74EjuZso.js">
|
|
151
151
|
<link rel="modulepreload" crossorigin href="./assets/micromark-factory-space-D9Dr-k4J.js">
|
|
152
152
|
<link rel="modulepreload" crossorigin href="./assets/chunk-YOKDWASO-BIpRENEC.js">
|
|
153
|
-
<link rel="modulepreload" crossorigin href="./assets/markdown-renderer-
|
|
153
|
+
<link rel="modulepreload" crossorigin href="./assets/markdown-renderer-mYYQYD2m.js">
|
|
154
154
|
<link rel="modulepreload" crossorigin href="./assets/copy-Djr5m5ac.js">
|
|
155
|
-
<link rel="modulepreload" crossorigin href="./assets/copy-icon-
|
|
156
|
-
<link rel="modulepreload" crossorigin href="./assets/useRunCells-
|
|
157
|
-
<link rel="modulepreload" crossorigin href="./assets/RenderHTML-
|
|
158
|
-
<link rel="modulepreload" crossorigin href="./assets/blob-
|
|
155
|
+
<link rel="modulepreload" crossorigin href="./assets/copy-icon-Craaocbu.js">
|
|
156
|
+
<link rel="modulepreload" crossorigin href="./assets/useRunCells-VBCe6CLn.js">
|
|
157
|
+
<link rel="modulepreload" crossorigin href="./assets/RenderHTML-Bjvcs70-.js">
|
|
158
|
+
<link rel="modulepreload" crossorigin href="./assets/blob-BPknzzkY.js">
|
|
159
159
|
<link rel="modulepreload" crossorigin href="./assets/kbd-pdKBv96t.js">
|
|
160
|
-
<link rel="modulepreload" crossorigin href="./assets/useInstallPackage-
|
|
160
|
+
<link rel="modulepreload" crossorigin href="./assets/useInstallPackage-BfNKN33w.js">
|
|
161
161
|
<link rel="modulepreload" crossorigin href="./assets/share-BZW3tzEX.js">
|
|
162
162
|
<link rel="modulepreload" crossorigin href="./assets/events-CbeVJ6OD.js">
|
|
163
|
-
<link rel="modulepreload" crossorigin href="./assets/state-
|
|
163
|
+
<link rel="modulepreload" crossorigin href="./assets/state-BLGvzMB6.js">
|
|
164
164
|
<link rel="modulepreload" crossorigin href="./assets/coerce-DWjFeXOY.js">
|
|
165
165
|
<link rel="modulepreload" crossorigin href="./assets/_hasPath-BmRQipI0.js">
|
|
166
166
|
<link rel="modulepreload" crossorigin href="./assets/hasIn-yw4sIeJR.js">
|
|
167
167
|
<link rel="modulepreload" crossorigin href="./assets/pick-DKIID_Mo.js">
|
|
168
|
-
<link rel="modulepreload" crossorigin href="./assets/ErrorBoundary-
|
|
168
|
+
<link rel="modulepreload" crossorigin href="./assets/ErrorBoundary-98Xo04DS.js">
|
|
169
169
|
<link rel="modulepreload" crossorigin href="./assets/chevron-right-eAtVhbNZ.js">
|
|
170
|
-
<link rel="modulepreload" crossorigin href="./assets/dropdown-menu-
|
|
171
|
-
<link rel="modulepreload" crossorigin href="./assets/html-to-image-
|
|
172
|
-
<link rel="modulepreload" crossorigin href="./assets/download-
|
|
173
|
-
<link rel="modulepreload" crossorigin href="./assets/switch-
|
|
174
|
-
<link rel="modulepreload" crossorigin href="./assets/tabs-
|
|
170
|
+
<link rel="modulepreload" crossorigin href="./assets/dropdown-menu-Cwi17BoX.js">
|
|
171
|
+
<link rel="modulepreload" crossorigin href="./assets/html-to-image-BW0fcUS8.js">
|
|
172
|
+
<link rel="modulepreload" crossorigin href="./assets/download-BsBJWH_j.js">
|
|
173
|
+
<link rel="modulepreload" crossorigin href="./assets/switch-D2gdC_ep.js">
|
|
174
|
+
<link rel="modulepreload" crossorigin href="./assets/tabs-BLczoY3k.js">
|
|
175
175
|
<link rel="modulepreload" crossorigin href="./assets/table-DG7Ap4H4.js">
|
|
176
176
|
<link rel="modulepreload" crossorigin href="./assets/eye-off-CxVozGAC.js">
|
|
177
177
|
<link rel="modulepreload" crossorigin href="./assets/refresh-cw-Qw1f8Jhy.js">
|
|
178
|
-
<link rel="modulepreload" crossorigin href="./assets/tree-actions-
|
|
178
|
+
<link rel="modulepreload" crossorigin href="./assets/tree-actions-BQw_utcj.js">
|
|
179
179
|
<link rel="modulepreload" crossorigin href="./assets/ellipsis-63DyBLHQ.js">
|
|
180
180
|
<link rel="modulepreload" crossorigin href="./assets/external-link-UrX9KO36.js">
|
|
181
181
|
<link rel="modulepreload" crossorigin href="./assets/spinner-DyNE-o8o.js">
|
|
182
182
|
<link rel="modulepreload" crossorigin href="./assets/message-circle-C3rKm8_a.js">
|
|
183
183
|
<link rel="modulepreload" crossorigin href="./assets/hat-glasses-C8RhSVii.js">
|
|
184
184
|
<link rel="modulepreload" crossorigin href="./assets/package-GSoSTiIK.js">
|
|
185
|
-
<link rel="modulepreload" crossorigin href="./assets/datasource-
|
|
186
|
-
<link rel="modulepreload" crossorigin href="./assets/error-entries-
|
|
185
|
+
<link rel="modulepreload" crossorigin href="./assets/datasource-Dy4rzzSP.js">
|
|
186
|
+
<link rel="modulepreload" crossorigin href="./assets/error-entries-0wTSSuK9.js">
|
|
187
187
|
<link rel="modulepreload" crossorigin href="./assets/alert-DTaqCu_d.js">
|
|
188
|
-
<link rel="modulepreload" crossorigin href="./assets/state-
|
|
189
|
-
<link rel="modulepreload" crossorigin href="./assets/cell-link-
|
|
190
|
-
<link rel="modulepreload" crossorigin href="./assets/MarimoErrorOutput-
|
|
188
|
+
<link rel="modulepreload" crossorigin href="./assets/state-QfGh3m2G.js">
|
|
189
|
+
<link rel="modulepreload" crossorigin href="./assets/cell-link-CAjuFcLK.js">
|
|
190
|
+
<link rel="modulepreload" crossorigin href="./assets/MarimoErrorOutput-DeWZNBgL.js">
|
|
191
191
|
<link rel="modulepreload" crossorigin href="./assets/useDateFormatter-DA-62E-Y.js">
|
|
192
192
|
<link rel="modulepreload" crossorigin href="./assets/en-US-Buu61juQ.js">
|
|
193
193
|
<link rel="modulepreload" crossorigin href="./assets/isValid-q_Ad80ug.js">
|
|
194
|
-
<link rel="modulepreload" crossorigin href="./assets/dates-
|
|
194
|
+
<link rel="modulepreload" crossorigin href="./assets/dates-CaPZVGtm.js">
|
|
195
195
|
<link rel="modulepreload" crossorigin href="./assets/defaultLocale-CNPGWpMu.js">
|
|
196
196
|
<link rel="modulepreload" crossorigin href="./assets/precisionRound-BxlUs8G4.js">
|
|
197
197
|
<link rel="modulepreload" crossorigin href="./assets/defaultLocale-D5bOh7g6.js">
|
|
198
198
|
<link rel="modulepreload" crossorigin href="./assets/vega-loader.browser-Bu25TKax.js">
|
|
199
|
-
<link rel="modulepreload" crossorigin href="./assets/tooltip-
|
|
199
|
+
<link rel="modulepreload" crossorigin href="./assets/tooltip-BiQdpXA0.js">
|
|
200
200
|
<link rel="modulepreload" crossorigin href="./assets/react-icons.esm-D6tfmvq8.js">
|
|
201
201
|
<link rel="modulepreload" crossorigin href="./assets/extends-CvVTau-c.js">
|
|
202
202
|
<link rel="modulepreload" crossorigin href="./assets/objectWithoutPropertiesLoose-Do6ywDBO.js">
|
|
203
|
-
<link rel="modulepreload" crossorigin href="./assets/useIframeCapabilities-
|
|
204
|
-
<link rel="modulepreload" crossorigin href="./assets/error-banner-
|
|
203
|
+
<link rel="modulepreload" crossorigin href="./assets/useIframeCapabilities-sHeZt_EA.js">
|
|
204
|
+
<link rel="modulepreload" crossorigin href="./assets/error-banner-m3mastc-.js">
|
|
205
205
|
<link rel="modulepreload" crossorigin href="./assets/utils-DfElfBpz.js">
|
|
206
|
-
<link rel="modulepreload" crossorigin href="./assets/formats-
|
|
206
|
+
<link rel="modulepreload" crossorigin href="./assets/formats-CYyvbiZA.js">
|
|
207
207
|
<link rel="modulepreload" crossorigin href="./assets/table-vrvqpuKJ.js">
|
|
208
208
|
<link rel="modulepreload" crossorigin href="./assets/react-resizable-panels.browser.esm-Dbe0MrFr.js">
|
|
209
209
|
<link rel="modulepreload" crossorigin href="./assets/useStateForKey-CGMJQT8x.js">
|
|
210
|
-
<link rel="modulepreload" crossorigin href="./assets/JsonOutput-
|
|
210
|
+
<link rel="modulepreload" crossorigin href="./assets/JsonOutput-V47aiTIK.js">
|
|
211
211
|
<link rel="modulepreload" crossorigin href="./assets/chart-no-axes-column-C4_v6fQW.js">
|
|
212
212
|
<link rel="modulepreload" crossorigin href="./assets/square-function-_W_Lo0P4.js">
|
|
213
|
-
<link rel="modulepreload" crossorigin href="./assets/spec-
|
|
213
|
+
<link rel="modulepreload" crossorigin href="./assets/spec-DFtwOyXT.js">
|
|
214
214
|
<link rel="modulepreload" crossorigin href="./assets/semaphore-BjoL5P0h.js">
|
|
215
215
|
<link rel="modulepreload" crossorigin href="./assets/fileToBase64-BgBraYAr.js">
|
|
216
|
-
<link rel="modulepreload" crossorigin href="./assets/useBoolean-
|
|
216
|
+
<link rel="modulepreload" crossorigin href="./assets/useBoolean-BkeUcn1n.js">
|
|
217
217
|
<link rel="modulepreload" crossorigin href="./assets/code-xml-SQaZqvcO.js">
|
|
218
218
|
<link rel="modulepreload" crossorigin href="./assets/file-headphone-Dl35U6h3.js">
|
|
219
219
|
<link rel="modulepreload" crossorigin href="./assets/file-BPBVl9pl.js">
|
|
@@ -221,24 +221,24 @@
|
|
|
221
221
|
<link rel="modulepreload" crossorigin href="./assets/file-icons-CdJgUy-I.js">
|
|
222
222
|
<link rel="modulepreload" crossorigin href="./assets/globe-UdPdIbF7.js">
|
|
223
223
|
<link rel="modulepreload" crossorigin href="./assets/esm-CI_o7NhW.js">
|
|
224
|
-
<link rel="modulepreload" crossorigin href="./assets/useAddCell-
|
|
225
|
-
<link rel="modulepreload" crossorigin href="./assets/readonly-python-code-
|
|
224
|
+
<link rel="modulepreload" crossorigin href="./assets/useAddCell-_b8InOZC.js">
|
|
225
|
+
<link rel="modulepreload" crossorigin href="./assets/readonly-python-code-CZUKLXJ4.js">
|
|
226
226
|
<link rel="modulepreload" crossorigin href="./assets/data-grid-types-DgHVN_Zz.js">
|
|
227
|
-
<link rel="modulepreload" crossorigin href="./assets/glide-utils-
|
|
228
|
-
<link rel="modulepreload" crossorigin href="./assets/column-preview-
|
|
227
|
+
<link rel="modulepreload" crossorigin href="./assets/glide-utils-DsTeJ7WA.js">
|
|
228
|
+
<link rel="modulepreload" crossorigin href="./assets/column-preview-85ORMhfB.js">
|
|
229
229
|
<link rel="modulepreload" crossorigin href="./assets/square-BPmgQFnh.js">
|
|
230
230
|
<link rel="modulepreload" crossorigin href="./assets/triangle-alert-DmIqR8sY.js">
|
|
231
231
|
<link rel="modulepreload" crossorigin href="./assets/prop-types-Djf4O40e.js">
|
|
232
|
-
<link rel="modulepreload" crossorigin href="./assets/es-
|
|
232
|
+
<link rel="modulepreload" crossorigin href="./assets/es-Rg27gAEy.js">
|
|
233
233
|
<link rel="modulepreload" crossorigin href="./assets/package-data-CKPmBDtg.js">
|
|
234
234
|
<link rel="modulepreload" crossorigin href="./assets/markdown-export-DzhB1FrN.js">
|
|
235
|
-
<link rel="modulepreload" crossorigin href="./assets/renderShortcut-
|
|
235
|
+
<link rel="modulepreload" crossorigin href="./assets/renderShortcut-Bxv9ZLnD.js">
|
|
236
236
|
<link rel="modulepreload" crossorigin href="./assets/bundle.esm-D3tw5rqW.js">
|
|
237
237
|
<link rel="modulepreload" crossorigin href="./assets/icons-CiZ_8zS-.js">
|
|
238
238
|
<link rel="modulepreload" crossorigin href="./assets/useDeepCompareMemoize-B2DVK2De.js">
|
|
239
239
|
<link rel="modulepreload" crossorigin href="./assets/useDelayElapsed-BlsDT4TV.js">
|
|
240
240
|
<link rel="modulepreload" crossorigin href="./assets/pathUtils-DPmlLd-r.js">
|
|
241
|
-
<link rel="modulepreload" crossorigin href="./assets/floating-outline-
|
|
241
|
+
<link rel="modulepreload" crossorigin href="./assets/floating-outline-CRpmOv32.js">
|
|
242
242
|
<link rel="stylesheet" crossorigin href="./assets/cells-0PFKL3SH.css">
|
|
243
243
|
<link rel="stylesheet" crossorigin href="./assets/markdown-renderer-DjIHoF9Z.css">
|
|
244
244
|
<link rel="stylesheet" crossorigin href="./assets/JsonOutput-B0GmlMnR.css">
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@marimo-team/frontend",
|
|
3
|
-
"version": "0.25.3-
|
|
3
|
+
"version": "0.25.3-dev129",
|
|
4
4
|
"main": "dist/main.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"type": "module",
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"@paralleldrive/cuid2": "^2.3.1",
|
|
65
65
|
"@radix-ui/colors": "^3.0.0",
|
|
66
66
|
"@radix-ui/react-icons": "~1.3.2",
|
|
67
|
-
"@radix-ui/react-use-controllable-state": "~1.
|
|
67
|
+
"@radix-ui/react-use-controllable-state": "~1.3.0",
|
|
68
68
|
"@replit/codemirror-vim": "^6.4.0",
|
|
69
69
|
"@revealjs/react": "^0.2.2",
|
|
70
70
|
"@streamdown/math": "^1.0.2",
|
|
@@ -121,7 +121,7 @@
|
|
|
121
121
|
"path-to-regexp": "^8.4.2",
|
|
122
122
|
"plotly.js": "^3.7.0",
|
|
123
123
|
"pyodide": "314.0.0",
|
|
124
|
-
"radix-ui": "1.
|
|
124
|
+
"radix-ui": "1.8.1",
|
|
125
125
|
"react-arborist": "^3.16.0",
|
|
126
126
|
"react-aria": "3.52.1",
|
|
127
127
|
"react-aria-components": "1.21.1",
|
|
@@ -6,8 +6,9 @@ import { createStore } from "jotai";
|
|
|
6
6
|
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
7
7
|
import { Deferred } from "@/utils/Deferred";
|
|
8
8
|
import { ConnectionState } from "../../websocket/types";
|
|
9
|
+
import type { NotebookBackend } from "../backend";
|
|
9
10
|
import type { ConnectionStatus } from "../connection";
|
|
10
|
-
import { createNotebookClient
|
|
11
|
+
import { createNotebookClient } from "../notebook-client";
|
|
11
12
|
import { fixtureEvents, fixtureMessages } from "./fixtures";
|
|
12
13
|
|
|
13
14
|
/** One connection the fake transport opened. */
|
|
@@ -22,7 +23,14 @@ interface Attempt {
|
|
|
22
23
|
stop(status?: ConnectionStatus): void;
|
|
23
24
|
}
|
|
24
25
|
|
|
25
|
-
|
|
26
|
+
type Commands = ReturnType<NotebookBackend["notebook"]>;
|
|
27
|
+
/** A backend edit with the notebook it was sent to. */
|
|
28
|
+
type Edit = (
|
|
29
|
+
id: string,
|
|
30
|
+
...args: Parameters<Commands["edit"]>
|
|
31
|
+
) => ReturnType<Commands["edit"]>;
|
|
32
|
+
|
|
33
|
+
function setup(edit = vi.fn<Edit>()) {
|
|
26
34
|
const attempts: Attempt[] = [];
|
|
27
35
|
const transport: NotebookTransport = ({ cursor, signal }, handlers) =>
|
|
28
36
|
new Promise((resolve, reject) => {
|
|
@@ -40,11 +48,15 @@ function setup(edit?: NotebookClient["edit"]) {
|
|
|
40
48
|
const onNotification = vi.fn();
|
|
41
49
|
const checkHealth = vi.fn(async () => true);
|
|
42
50
|
const store = createStore();
|
|
43
|
-
const
|
|
51
|
+
const backend: NotebookBackend = {
|
|
52
|
+
transport,
|
|
53
|
+
notebook: (id) => ({ edit: (...args) => edit(id, ...args) }),
|
|
54
|
+
};
|
|
55
|
+
const controller = createNotebookClient(store);
|
|
44
56
|
const client = controller.client;
|
|
45
57
|
const connect = (signal: AbortSignal) =>
|
|
46
58
|
controller.connect({
|
|
47
|
-
|
|
59
|
+
backend,
|
|
48
60
|
signal,
|
|
49
61
|
checkHealth,
|
|
50
62
|
onNotification: (notification) => onNotification({ data: notification }),
|
|
@@ -99,7 +111,7 @@ const notebook = {
|
|
|
99
111
|
|
|
100
112
|
describe("NotebookClient lifetime", () => {
|
|
101
113
|
it("keeps an edit's target and request identity across a stream reset", async () => {
|
|
102
|
-
const edit = vi.fn<
|
|
114
|
+
const edit = vi.fn<Edit>().mockResolvedValue({
|
|
103
115
|
ok: false,
|
|
104
116
|
status: 409,
|
|
105
117
|
problem: { type: "conflict", title: "conflict", status: 409 },
|
|
@@ -127,7 +139,7 @@ describe("NotebookClient lifetime", () => {
|
|
|
127
139
|
expect(edit).toHaveBeenCalledTimes(2);
|
|
128
140
|
});
|
|
129
141
|
|
|
130
|
-
it("rejects aborted edits and reports
|
|
142
|
+
it("rejects aborted edits and reports edits before connecting", async () => {
|
|
131
143
|
const { client } = setup();
|
|
132
144
|
const controller = lifetime();
|
|
133
145
|
await expect(
|
|
@@ -129,7 +129,7 @@ describe("static notebook backend", () => {
|
|
|
129
129
|
|
|
130
130
|
it("advertises no mutations and returns a protocol failure for direct edits", async () => {
|
|
131
131
|
const backend = createStaticNotebookBackend(snapshot());
|
|
132
|
-
expect(await backend.
|
|
132
|
+
expect(await backend.notebook(snapshot().notebook.id).edit([])).toEqual({
|
|
133
133
|
ok: false,
|
|
134
134
|
status: 501,
|
|
135
135
|
problem: {
|
|
@@ -154,7 +154,9 @@ describe("static notebook backend", () => {
|
|
|
154
154
|
expect(open).not.toHaveBeenCalled();
|
|
155
155
|
expect(message).not.toHaveBeenCalled();
|
|
156
156
|
await expect(
|
|
157
|
-
backend
|
|
157
|
+
backend
|
|
158
|
+
.notebook(snapshot().notebook.id)
|
|
159
|
+
.edit([], { signal: before.signal }),
|
|
158
160
|
).rejects.toBe(before.signal.reason);
|
|
159
161
|
const during = new AbortController();
|
|
160
162
|
message.mockImplementation(() => during.abort());
|
|
@@ -102,9 +102,9 @@ describe("WASM notebook backend", () => {
|
|
|
102
102
|
it("sends edits as calls with the retry key and validates replies", async () => {
|
|
103
103
|
const { bridge, reply } = worker();
|
|
104
104
|
const backend = createWasmNotebookBackend(bridge);
|
|
105
|
-
expect(
|
|
106
|
-
|
|
107
|
-
);
|
|
105
|
+
expect(
|
|
106
|
+
await backend.notebook("n1").edit([], { idempotencyKey: "edit-7" }),
|
|
107
|
+
).toEqual(reply);
|
|
108
108
|
expect(bridge.call).toHaveBeenCalledWith({
|
|
109
109
|
operation: "notebook.edit",
|
|
110
110
|
params: { notebook_id: "n1" },
|
|
@@ -117,13 +117,15 @@ describe("WASM notebook backend", () => {
|
|
|
117
117
|
status: 403,
|
|
118
118
|
};
|
|
119
119
|
bridge.call.mockResolvedValue({ status: 403, body: problem });
|
|
120
|
-
expect(await backend.
|
|
120
|
+
expect(await backend.notebook("n1").edit([])).toEqual({
|
|
121
121
|
ok: false,
|
|
122
122
|
status: 403,
|
|
123
123
|
problem,
|
|
124
124
|
});
|
|
125
125
|
bridge.call.mockResolvedValue({ status: 200, body: {} });
|
|
126
|
-
await expect(backend.
|
|
126
|
+
await expect(backend.notebook("n1").edit([])).rejects.toThrow(
|
|
127
|
+
/Invalid input/,
|
|
128
|
+
);
|
|
127
129
|
});
|
|
128
130
|
|
|
129
131
|
it("cancels waiting for an accepted edit and permits retry with the same key", async () => {
|
|
@@ -132,7 +134,7 @@ describe("WASM notebook backend", () => {
|
|
|
132
134
|
bridge.call.mockReturnValue(pending.promise);
|
|
133
135
|
const backend = createWasmNotebookBackend(bridge);
|
|
134
136
|
const controller = new AbortController();
|
|
135
|
-
const editing = backend.
|
|
137
|
+
const editing = backend.notebook("n1").edit([], {
|
|
136
138
|
signal: controller.signal,
|
|
137
139
|
idempotencyKey: "edit-8",
|
|
138
140
|
});
|
|
@@ -140,12 +142,12 @@ describe("WASM notebook backend", () => {
|
|
|
140
142
|
controller.abort();
|
|
141
143
|
await expect(editing).rejects.toBe(controller.signal.reason);
|
|
142
144
|
pending.resolve(wire);
|
|
143
|
-
expect(
|
|
144
|
-
|
|
145
|
-
);
|
|
145
|
+
expect(
|
|
146
|
+
await backend.notebook("n1").edit([], { idempotencyKey: "edit-8" }),
|
|
147
|
+
).toEqual(reply);
|
|
146
148
|
expect(bridge.call.mock.calls[0]).toEqual(bridge.call.mock.calls[1]);
|
|
147
149
|
await expect(
|
|
148
|
-
backend.
|
|
150
|
+
backend.notebook("n1").edit([], { signal: controller.signal }),
|
|
149
151
|
).rejects.toBe(controller.signal.reason);
|
|
150
152
|
expect(bridge.call).toHaveBeenCalledTimes(2);
|
|
151
153
|
});
|
package/src/core/host/backend.ts
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
3
|
import type { NotebookClient, NotebookTransport } from "@marimo-team/client";
|
|
4
|
+
import type { NotebookId } from "@marimo-team/client/protocol";
|
|
4
5
|
|
|
5
|
-
/** Events and commands for
|
|
6
|
+
/** Events and commands for a notebook, independent of React or a replica. */
|
|
6
7
|
export interface NotebookBackend {
|
|
7
8
|
readonly transport: NotebookTransport;
|
|
8
|
-
/**
|
|
9
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Commands for a notebook the transport reported.
|
|
11
|
+
*
|
|
12
|
+
* Method presence is not permission. The notebook advertises its operations.
|
|
13
|
+
*/
|
|
14
|
+
notebook(id: NotebookId): Pick<NotebookClient, "edit">;
|
|
10
15
|
}
|
|
@@ -5,7 +5,6 @@ import {
|
|
|
5
5
|
createNotebookReducer,
|
|
6
6
|
type NotebookEvent,
|
|
7
7
|
NotebookEvents,
|
|
8
|
-
type NotebookTransport,
|
|
9
8
|
type Result,
|
|
10
9
|
StreamStopped,
|
|
11
10
|
} from "@marimo-team/client";
|
|
@@ -18,6 +17,7 @@ import type {
|
|
|
18
17
|
} from "@marimo-team/client/protocol";
|
|
19
18
|
import { type Atom, atom, type createStore } from "jotai/vanilla";
|
|
20
19
|
import { z } from "zod";
|
|
20
|
+
import type { NotebookBackend } from "./backend";
|
|
21
21
|
import {
|
|
22
22
|
ConnectionClosedReason,
|
|
23
23
|
ConnectionState,
|
|
@@ -60,10 +60,10 @@ export interface NotebookClient {
|
|
|
60
60
|
reconnect(): Promise<void>;
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
/** The
|
|
63
|
+
/** The backend and application callbacks needed to follow a notebook. */
|
|
64
64
|
export interface NotebookConnection {
|
|
65
|
-
/**
|
|
66
|
-
|
|
65
|
+
/** Follows the notebook's stream and sends its commands. */
|
|
66
|
+
backend: NotebookBackend;
|
|
67
67
|
/** Abort to close the stream and clear the client's state. */
|
|
68
68
|
signal: AbortSignal;
|
|
69
69
|
/** Check whether the host is reachable before an explicit reconnect. */
|
|
@@ -103,14 +103,8 @@ function statusAfter(error: unknown): ConnectionStatus {
|
|
|
103
103
|
return disconnected;
|
|
104
104
|
}
|
|
105
105
|
|
|
106
|
-
/**
|
|
107
|
-
|
|
108
|
-
* The session supplies edits authenticated for the same host as its stream.
|
|
109
|
-
*/
|
|
110
|
-
export function createNotebookClient(
|
|
111
|
-
store: ReturnType<typeof createStore>,
|
|
112
|
-
{ edit }: { edit?: NotebookClient["edit"] } = {},
|
|
113
|
-
) {
|
|
106
|
+
/** Create a client without opening a connection. */
|
|
107
|
+
export function createNotebookClient(store: ReturnType<typeof createStore>) {
|
|
114
108
|
// `useNotebookSession` copies this into the editor's shared `connectionAtom`,
|
|
115
109
|
// which gates features until MO-8051 derives availability separately.
|
|
116
110
|
const connectionAtom = atom<ConnectionStatus>({
|
|
@@ -137,6 +131,7 @@ export function createNotebookClient(
|
|
|
137
131
|
: attachments.initial,
|
|
138
132
|
);
|
|
139
133
|
let reconnect: (() => Promise<void>) | undefined;
|
|
134
|
+
let backend: NotebookBackend | undefined;
|
|
140
135
|
const client: NotebookClient = {
|
|
141
136
|
connectionAtom,
|
|
142
137
|
notebookAtom,
|
|
@@ -147,7 +142,7 @@ export function createNotebookClient(
|
|
|
147
142
|
if (currentId !== null && currentId !== notebookId) {
|
|
148
143
|
throw new Error("The notebook changed before the edit was sent");
|
|
149
144
|
}
|
|
150
|
-
if (
|
|
145
|
+
if (backend === undefined) {
|
|
151
146
|
return {
|
|
152
147
|
ok: false,
|
|
153
148
|
status: 501,
|
|
@@ -158,7 +153,7 @@ export function createNotebookClient(
|
|
|
158
153
|
},
|
|
159
154
|
};
|
|
160
155
|
}
|
|
161
|
-
return edit(
|
|
156
|
+
return backend.notebook(notebookId).edit(changes, options);
|
|
162
157
|
},
|
|
163
158
|
attachmentsAtom,
|
|
164
159
|
reconnect: async () => reconnect?.(),
|
|
@@ -170,7 +165,7 @@ export function createNotebookClient(
|
|
|
170
165
|
}
|
|
171
166
|
|
|
172
167
|
function connect({
|
|
173
|
-
|
|
168
|
+
backend: connected,
|
|
174
169
|
signal,
|
|
175
170
|
checkHealth,
|
|
176
171
|
onNotification,
|
|
@@ -178,6 +173,8 @@ export function createNotebookClient(
|
|
|
178
173
|
if (signal.aborted) {
|
|
179
174
|
return;
|
|
180
175
|
}
|
|
176
|
+
backend = connected;
|
|
177
|
+
const { transport } = connected;
|
|
181
178
|
let events: NotebookEvents<(typeof TYPES)[number]> | undefined;
|
|
182
179
|
let checkingHealth = false;
|
|
183
180
|
// Whether the replica still holds the state the last cursor describes.
|
|
@@ -283,6 +280,9 @@ export function createNotebookClient(
|
|
|
283
280
|
"abort",
|
|
284
281
|
() => {
|
|
285
282
|
reconnect = undefined;
|
|
283
|
+
if (backend === connected) {
|
|
284
|
+
backend = undefined;
|
|
285
|
+
}
|
|
286
286
|
store.set(streamAtom, reducer.initial);
|
|
287
287
|
setStatus({ state: ConnectionState.NOT_STARTED });
|
|
288
288
|
},
|
package/src/core/host/static.ts
CHANGED
|
@@ -51,7 +51,7 @@ export function createStaticNotebookBackend(
|
|
|
51
51
|
message(frame);
|
|
52
52
|
}
|
|
53
53
|
}),
|
|
54
|
-
|
|
54
|
+
notebook: () => ({
|
|
55
55
|
edit: async (_changes, options) => {
|
|
56
56
|
options?.signal?.throwIfAborted();
|
|
57
57
|
return {
|
|
@@ -65,6 +65,6 @@ export function createStaticNotebookBackend(
|
|
|
65
65
|
},
|
|
66
66
|
};
|
|
67
67
|
},
|
|
68
|
-
},
|
|
68
|
+
}),
|
|
69
69
|
};
|
|
70
70
|
}
|
package/src/core/host/wasm.ts
CHANGED
|
@@ -39,6 +39,9 @@ function abortable<T>(
|
|
|
39
39
|
export function createWasmNotebookBackend(
|
|
40
40
|
bridge: WasmNotebookBridge,
|
|
41
41
|
): NotebookBackend {
|
|
42
|
+
const client = NotebookClient.unstable_over((call) => bridge.call(call), {
|
|
43
|
+
notebookId: bridge.notebookId,
|
|
44
|
+
});
|
|
42
45
|
return {
|
|
43
46
|
transport: async ({ cursor, signal }, { open, message }) => {
|
|
44
47
|
if (signal.aborted) {
|
|
@@ -85,8 +88,6 @@ export function createWasmNotebookBackend(
|
|
|
85
88
|
signal.removeEventListener("abort", abort);
|
|
86
89
|
}
|
|
87
90
|
},
|
|
88
|
-
|
|
89
|
-
notebookId: bridge.notebookId,
|
|
90
|
-
}),
|
|
91
|
+
notebook: () => client,
|
|
91
92
|
};
|
|
92
93
|
}
|
|
@@ -220,6 +220,23 @@ describe("RuntimeManager", () => {
|
|
|
220
220
|
});
|
|
221
221
|
});
|
|
222
222
|
|
|
223
|
+
describe("getNotebookURL", () => {
|
|
224
|
+
it("addresses the notebook below the host API without the auth token", () => {
|
|
225
|
+
const runtime = new RuntimeManager(
|
|
226
|
+
{
|
|
227
|
+
url: "https://sandbox.example.com/base",
|
|
228
|
+
lazy: true,
|
|
229
|
+
authToken: "my-secret-token",
|
|
230
|
+
},
|
|
231
|
+
true,
|
|
232
|
+
);
|
|
233
|
+
const url = runtime.getNotebookURL("n/1");
|
|
234
|
+
|
|
235
|
+
expect(url.pathname).toBe("/base/api/marimo/v1/notebooks/n%2F1");
|
|
236
|
+
expect(url.toString()).not.toContain("my-secret-token");
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
|
|
223
240
|
describe("getSseURL", () => {
|
|
224
241
|
it("should never put the auth token in the URL, even cross-origin", () => {
|
|
225
242
|
// SSE requests can send headers, so auth travels in the
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
|
+
import type { NotebookId } from "@marimo-team/client/protocol";
|
|
3
4
|
import { Deferred } from "@/utils/Deferred";
|
|
4
5
|
import { Logger } from "@/utils/Logger";
|
|
5
6
|
import { KnownQueryParams } from "../constants";
|
|
@@ -171,6 +172,18 @@ export class RuntimeManager {
|
|
|
171
172
|
return url;
|
|
172
173
|
}
|
|
173
174
|
|
|
175
|
+
/**
|
|
176
|
+
* The host API URL of a notebook, below which its operations are served.
|
|
177
|
+
* Requests send auth in headers (see `headers()`), never in the URL.
|
|
178
|
+
*/
|
|
179
|
+
public getNotebookURL(notebookId: NotebookId): URL {
|
|
180
|
+
const url = this.formatHttpURL({
|
|
181
|
+
path: `/api/marimo/v1/notebooks/${encodeURIComponent(notebookId)}`,
|
|
182
|
+
});
|
|
183
|
+
url.searchParams.delete(KnownQueryParams.accessToken);
|
|
184
|
+
return url;
|
|
185
|
+
}
|
|
186
|
+
|
|
174
187
|
/**
|
|
175
188
|
* The WebSocket Sync URL of the runtime, for real-time updates.
|
|
176
189
|
*/
|