@marimo-team/frontend 0.25.3-dev82 → 0.25.3-dev85

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.
Files changed (82) hide show
  1. package/dist/assets/{CellStatus-DXroYLOP.js → CellStatus-DYRvLOiP.js} +1 -1
  2. package/dist/assets/{ErrorBoundary-DaQ9THH_.js → ErrorBoundary-BKQo68Df.js} +2 -2
  3. package/dist/assets/{JsonOutput-VxzHyItt.js → JsonOutput-3NheuQEt.js} +1 -1
  4. package/dist/assets/{MarimoErrorOutput-D-hLaDA-.js → MarimoErrorOutput-XrTcOYTI.js} +1 -1
  5. package/dist/assets/{RenderHTML-DjOEZL25.js → RenderHTML-DaVbCAsb.js} +1 -1
  6. package/dist/assets/{RunButton-CuhNTo5_.js → RunButton-D3ScLvwb.js} +1 -1
  7. package/dist/assets/{add-cell-with-ai-BbVntTh7.js → add-cell-with-ai-BKk0pvon.js} +1 -1
  8. package/dist/assets/{add-connection-dialog-Qf63aKV6.js → add-connection-dialog-CNIwGJVL.js} +1 -1
  9. package/dist/assets/{agent-panel-DMOfF3qF.js → agent-panel-BCCe7-0m.js} +1 -1
  10. package/dist/assets/{ai-model-dropdown-B15l0R62.js → ai-model-dropdown-prnCk5hq.js} +1 -1
  11. package/dist/assets/{app-config-button-BIMB8qjD.js → app-config-button-O_yI5nzB.js} +1 -1
  12. package/dist/assets/{blob-De9GR2s6.js → blob-FjxwDE1i.js} +1 -1
  13. package/dist/assets/{cell-editor-Di0cSFhC.js → cell-editor-B6Wvf232.js} +1 -1
  14. package/dist/assets/{cell-link-DR3W2HC7.js → cell-link-D8EbRFJJ.js} +1 -1
  15. package/dist/assets/{cells-styV7IX8.js → cells-DfF1DLV_.js} +1 -1
  16. package/dist/assets/{chat-display-BzdYdN39.js → chat-display-BtQI9LeB.js} +1 -1
  17. package/dist/assets/{chat-panel-De3YzkSF.js → chat-panel-tuUN0wet.js} +1 -1
  18. package/dist/assets/{chat-ui-NTNapdtP.js → chat-ui-Bb-HxAv4.js} +1 -1
  19. package/dist/assets/{code-visibility-csc3tgA0.js → code-visibility-ny5n3-GH.js} +1 -1
  20. package/dist/assets/{column-preview-DkH-oD8f.js → column-preview-BNPxoRnw.js} +1 -1
  21. package/dist/assets/{command-palette-Dg_xstl0.js → command-palette-CFLLUKbE.js} +1 -1
  22. package/dist/assets/{common-D7VAS6rd.js → common-D2oGA09G.js} +1 -1
  23. package/dist/assets/{components-CNmvC781.js → components-1zsrzJ_K.js} +1 -1
  24. package/dist/assets/config-BWKfkUWA.js +1 -0
  25. package/dist/assets/{config-BbRbT9Ww.js → config-CP8Y8_R0.js} +1 -1
  26. package/dist/assets/{datasource-C3yfeDa2.js → datasource-rV_-mqbc.js} +1 -1
  27. package/dist/assets/{dependency-graph-panel-CjoA6L0w.js → dependency-graph-panel-By-cv0Nw.js} +1 -1
  28. package/dist/assets/{documentation-panel-DHWFOiG1.js → documentation-panel-DHMjvOPt.js} +1 -1
  29. package/dist/assets/{download-BrCpRZKN.js → download-CMTzX3rG.js} +1 -1
  30. package/dist/assets/{edit-page-BPMo_x-T.js → edit-page-Bh44QoBu.js} +4 -4
  31. package/dist/assets/{error-entries-BkEAmmnD.js → error-entries-BGCjRkVy.js} +1 -1
  32. package/dist/assets/{error-panel-BhTfPA_i.js → error-panel-BDTFHLEt.js} +1 -1
  33. package/dist/assets/{feedback-button-D9InK87G.js → feedback-button-C-ScLxY2.js} +1 -1
  34. package/dist/assets/feedback-button-CLRAP9DE.js +1 -0
  35. package/dist/assets/{file-explorer-panel-BSd_ZbUC.js → file-explorer-panel-CAq2LZFc.js} +1 -1
  36. package/dist/assets/{file-name-input-RHURglL_.js → file-name-input-DIvrcC82.js} +1 -1
  37. package/dist/assets/{floating-outline-Cm49rYYe.js → floating-outline-DJnZ45VA.js} +1 -1
  38. package/dist/assets/{gallery-page-DdMdOtdv.js → gallery-page-CHJD1mdU.js} +1 -1
  39. package/dist/assets/{glide-data-editor-eiSlEUyR.js → glide-data-editor-BsE9Em-a.js} +1 -1
  40. package/dist/assets/{home-page-DwWvBB0R.js → home-page-CCbdig5p.js} +1 -1
  41. package/dist/assets/{hooks-CHeUZHPp.js → hooks-BPw6SVXo.js} +1 -1
  42. package/dist/assets/{index-DckSn2w6.js → index-D2O1B6ZY.js} +5 -5
  43. package/dist/assets/{layout-_lp06T0C.js → layout-NkCTvSyj.js} +3 -3
  44. package/dist/assets/{logs-panel-CAAk72Gb.js → logs-panel-B34vxRV7.js} +1 -1
  45. package/dist/assets/{markdown-renderer-CAyCgogC.js → markdown-renderer-CkN_xAjW.js} +1 -1
  46. package/dist/assets/{name-cell-input-DA8hU9XT.js → name-cell-input-eyYneuGK.js} +1 -1
  47. package/dist/assets/{outline-panel-Cc5oQ4LL.js → outline-panel-rpjpMDYX.js} +1 -1
  48. package/dist/assets/{packages-panel-DTfKez6I.js → packages-panel-gXdFgCro.js} +1 -1
  49. package/dist/assets/{panel-accordion-state-BZHex38W.js → panel-accordion-state-CImIsdc8.js} +1 -1
  50. package/dist/assets/{panels-DU-SaRHy.js → panels-CiR0Zzhg.js} +1 -1
  51. package/dist/assets/{process-output-CrDc_O1D.js → process-output-BClx23Jv.js} +1 -1
  52. package/dist/assets/{readonly-code-display-BR-_jUj8.js → readonly-code-display-JC_YsLL_.js} +1 -1
  53. package/dist/assets/{readonly-python-code-D7jcy9ds.js → readonly-python-code-DeBED4OB.js} +1 -1
  54. package/dist/assets/{reveal-component-eLftBwOe.js → reveal-component-D2xhcDzw.js} +1 -1
  55. package/dist/assets/{run-page-mURyATDJ.js → run-page-B9Jb5LMt.js} +1 -1
  56. package/dist/assets/{runtime-details-state-hb7A1jgR.js → runtime-details-state-7JHj3efu.js} +1 -1
  57. package/dist/assets/{scratchpad-panel-B_gEnoqj.js → scratchpad-panel-B_xrdEvJ.js} +1 -1
  58. package/dist/assets/{session-panel-DmDjaPsN.js → session-panel-DwuCGJU1.js} +1 -1
  59. package/dist/assets/{snippets-panel-o9KL5jMi.js → snippets-panel-BNjtDbnR.js} +1 -1
  60. package/dist/assets/{state-BkAqJoW7.js → state-DUP4ToPd.js} +1 -1
  61. package/dist/assets/{state-Os7LSUUZ.js → state-DhaPGGBO.js} +1 -1
  62. package/dist/assets/{terminal-BI85khrS.js → terminal-BwLC9HS5.js} +1 -1
  63. package/dist/assets/{tracing-AsNGuDsh.js → tracing-Ch4LR62-.js} +1 -1
  64. package/dist/assets/{tracing-panel-CBcmea6L.js → tracing-panel-B8fX4PhX.js} +2 -2
  65. package/dist/assets/{tree-actions-Cx5EDpA6.js → tree-actions-Zg3Ycse4.js} +1 -1
  66. package/dist/assets/{useAddCell-uJJYtgwa.js → useAddCell-BX9lq_0J.js} +1 -1
  67. package/dist/assets/{useBoolean-8wlrTeus.js → useBoolean-WABMLM83.js} +1 -1
  68. package/dist/assets/{useCellActionButton-CmQ-OcPa.js → useCellActionButton-D7Ruyes-.js} +1 -1
  69. package/dist/assets/{useDeleteCell-CXgOCDqY.js → useDeleteCell-AbkQI6-c.js} +1 -1
  70. package/dist/assets/{useDependencyPanelTab-Ch6gm7uM.js → useDependencyPanelTab-B0b2KkvS.js} +1 -1
  71. package/dist/assets/{useInstallPackage-CYQoMdMQ.js → useInstallPackage-CWcPxSLP.js} +1 -1
  72. package/dist/assets/{useNotebookActions-DGShHZ_1.js → useNotebookActions-DNuGk3m2.js} +1 -1
  73. package/dist/assets/{useRunCells-DAfDmOMC.js → useRunCells-CV81rge-.js} +1 -1
  74. package/dist/assets/{useSplitCell-NLULgcq7.js → useSplitCell-BTwCB3JS.js} +1 -1
  75. package/dist/assets/{vega-component-BKJU3uaB.js → vega-component-CY6HmM06.js} +1 -1
  76. package/dist/index.html +24 -24
  77. package/package.json +1 -1
  78. package/src/core/runtime/__tests__/createWsUrl.test.ts +77 -7
  79. package/src/core/runtime/__tests__/runtime.test.ts +13 -5
  80. package/src/core/runtime/runtime.ts +23 -27
  81. package/dist/assets/config-BQT0uYUo.js +0 -1
  82. package/dist/assets/feedback-button-BAcClv7c.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-DckSn2w6.js"></script>
69
+ <script type="module" crossorigin src="./assets/index-D2O1B6ZY.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">
@@ -86,7 +86,7 @@
86
86
  <link rel="modulepreload" crossorigin href="./assets/utils-B4K466FK.js">
87
87
  <link rel="modulepreload" crossorigin href="./assets/session-B8Y-GJnS.js">
88
88
  <link rel="modulepreload" crossorigin href="./assets/Deferred-CrTnjj37.js">
89
- <link rel="modulepreload" crossorigin href="./assets/config-BQT0uYUo.js">
89
+ <link rel="modulepreload" crossorigin href="./assets/config-BWKfkUWA.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">
@@ -139,7 +139,7 @@
139
139
  <link rel="modulepreload" crossorigin href="./assets/useTheme-DLtPc-39.js">
140
140
  <link rel="modulepreload" crossorigin href="./assets/useAsyncData-DhhdOGGd.js">
141
141
  <link rel="modulepreload" crossorigin href="./assets/purify.es--06brOip.js">
142
- <link rel="modulepreload" crossorigin href="./assets/cells-styV7IX8.js">
142
+ <link rel="modulepreload" crossorigin href="./assets/cells-DfF1DLV_.js">
143
143
  <link rel="modulepreload" crossorigin href="./assets/coerce-DWjFeXOY.js">
144
144
  <link rel="modulepreload" crossorigin href="./assets/get-DjNf4SIX.js">
145
145
  <link rel="modulepreload" crossorigin href="./assets/_hasPath-BmRQipI0.js">
@@ -147,47 +147,47 @@
147
147
  <link rel="modulepreload" crossorigin href="./assets/_baseSet-Bpdo9AvU.js">
148
148
  <link rel="modulepreload" crossorigin href="./assets/pick-DKIID_Mo.js">
149
149
  <link rel="modulepreload" crossorigin href="./assets/errors-CNsgAw6m.js">
150
- <link rel="modulepreload" crossorigin href="./assets/config-BbRbT9Ww.js">
150
+ <link rel="modulepreload" crossorigin href="./assets/config-CP8Y8_R0.js">
151
151
  <link rel="modulepreload" crossorigin href="./assets/state-C0irhlOZ.js">
152
152
  <link rel="modulepreload" crossorigin href="./assets/state-DaWgt-rn.js">
153
153
  <link rel="modulepreload" crossorigin href="./assets/LazyAnyLanguageCodeMirror-BPYE76jR.js">
154
154
  <link rel="modulepreload" crossorigin href="./assets/copy-KlhazlhB.js">
155
155
  <link rel="modulepreload" crossorigin href="./assets/micromark-factory-space-D9Dr-k4J.js">
156
156
  <link rel="modulepreload" crossorigin href="./assets/chunk-YOKDWASO-BIpRENEC.js">
157
- <link rel="modulepreload" crossorigin href="./assets/markdown-renderer-CAyCgogC.js">
157
+ <link rel="modulepreload" crossorigin href="./assets/markdown-renderer-CkN_xAjW.js">
158
158
  <link rel="modulepreload" crossorigin href="./assets/copy-Djr5m5ac.js">
159
159
  <link rel="modulepreload" crossorigin href="./assets/copy-icon-8-a5vovc.js">
160
- <link rel="modulepreload" crossorigin href="./assets/useRunCells-DAfDmOMC.js">
161
- <link rel="modulepreload" crossorigin href="./assets/RenderHTML-DjOEZL25.js">
162
- <link rel="modulepreload" crossorigin href="./assets/blob-De9GR2s6.js">
160
+ <link rel="modulepreload" crossorigin href="./assets/useRunCells-CV81rge-.js">
161
+ <link rel="modulepreload" crossorigin href="./assets/RenderHTML-DaVbCAsb.js">
162
+ <link rel="modulepreload" crossorigin href="./assets/blob-FjxwDE1i.js">
163
163
  <link rel="modulepreload" crossorigin href="./assets/kbd-pdKBv96t.js">
164
- <link rel="modulepreload" crossorigin href="./assets/useInstallPackage-CYQoMdMQ.js">
164
+ <link rel="modulepreload" crossorigin href="./assets/useInstallPackage-CWcPxSLP.js">
165
165
  <link rel="modulepreload" crossorigin href="./assets/share-BZW3tzEX.js">
166
166
  <link rel="modulepreload" crossorigin href="./assets/events-CbeVJ6OD.js">
167
- <link rel="modulepreload" crossorigin href="./assets/state-BkAqJoW7.js">
168
- <link rel="modulepreload" crossorigin href="./assets/ErrorBoundary-DaQ9THH_.js">
167
+ <link rel="modulepreload" crossorigin href="./assets/state-DUP4ToPd.js">
168
+ <link rel="modulepreload" crossorigin href="./assets/ErrorBoundary-BKQo68Df.js">
169
169
  <link rel="modulepreload" crossorigin href="./assets/chevron-right-eAtVhbNZ.js">
170
170
  <link rel="modulepreload" crossorigin href="./assets/dropdown-menu-DS6umAnH.js">
171
171
  <link rel="modulepreload" crossorigin href="./assets/html-to-image-D_0rd3_B.js">
172
- <link rel="modulepreload" crossorigin href="./assets/download-BrCpRZKN.js">
172
+ <link rel="modulepreload" crossorigin href="./assets/download-CMTzX3rG.js">
173
173
  <link rel="modulepreload" crossorigin href="./assets/switch-IoWE8PbW.js">
174
174
  <link rel="modulepreload" crossorigin href="./assets/tabs-CY8E4r9U.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-Cx5EDpA6.js">
178
+ <link rel="modulepreload" crossorigin href="./assets/tree-actions-Zg3Ycse4.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-C3yfeDa2.js">
186
- <link rel="modulepreload" crossorigin href="./assets/error-entries-BkEAmmnD.js">
185
+ <link rel="modulepreload" crossorigin href="./assets/datasource-rV_-mqbc.js">
186
+ <link rel="modulepreload" crossorigin href="./assets/error-entries-BGCjRkVy.js">
187
187
  <link rel="modulepreload" crossorigin href="./assets/alert-DTaqCu_d.js">
188
- <link rel="modulepreload" crossorigin href="./assets/state-Os7LSUUZ.js">
189
- <link rel="modulepreload" crossorigin href="./assets/cell-link-DR3W2HC7.js">
190
- <link rel="modulepreload" crossorigin href="./assets/MarimoErrorOutput-D-hLaDA-.js">
188
+ <link rel="modulepreload" crossorigin href="./assets/state-DhaPGGBO.js">
189
+ <link rel="modulepreload" crossorigin href="./assets/cell-link-D8EbRFJJ.js">
190
+ <link rel="modulepreload" crossorigin href="./assets/MarimoErrorOutput-XrTcOYTI.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">
@@ -207,13 +207,13 @@
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-VxzHyItt.js">
210
+ <link rel="modulepreload" crossorigin href="./assets/JsonOutput-3NheuQEt.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
213
  <link rel="modulepreload" crossorigin href="./assets/spec-uCpVvaAR.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-8wlrTeus.js">
216
+ <link rel="modulepreload" crossorigin href="./assets/useBoolean-WABMLM83.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,11 +221,11 @@
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-uJJYtgwa.js">
225
- <link rel="modulepreload" crossorigin href="./assets/readonly-python-code-D7jcy9ds.js">
224
+ <link rel="modulepreload" crossorigin href="./assets/useAddCell-BX9lq_0J.js">
225
+ <link rel="modulepreload" crossorigin href="./assets/readonly-python-code-DeBED4OB.js">
226
226
  <link rel="modulepreload" crossorigin href="./assets/data-grid-types-DgHVN_Zz.js">
227
227
  <link rel="modulepreload" crossorigin href="./assets/glide-utils-HFqhvWHI.js">
228
- <link rel="modulepreload" crossorigin href="./assets/column-preview-DkH-oD8f.js">
228
+ <link rel="modulepreload" crossorigin href="./assets/column-preview-BNPxoRnw.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">
@@ -238,7 +238,7 @@
238
238
  <link rel="modulepreload" crossorigin href="./assets/useDeepCompareMemoize-DFIVN9dn.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-Cm49rYYe.js">
241
+ <link rel="modulepreload" crossorigin href="./assets/floating-outline-DJnZ45VA.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-dev82",
3
+ "version": "0.25.3-dev85",
4
4
  "main": "dist/main.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",
@@ -13,7 +13,9 @@ describe("RuntimeManager.getWsURL", () => {
13
13
  });
14
14
  const sessionId = "1234" as SessionId;
15
15
  const url = runtime.getWsURL(sessionId);
16
- expect(url.toString()).toBe("wss://marimo.app/ws?session_id=1234");
16
+ expect(url.toString()).toBe(
17
+ "wss://marimo.app/ws?query_params=&session_id=1234",
18
+ );
17
19
  expect(url.searchParams.get(KnownQueryParams.sessionId)).toBe(sessionId);
18
20
  });
19
21
 
@@ -24,7 +26,9 @@ describe("RuntimeManager.getWsURL", () => {
24
26
  });
25
27
  const sessionId = "1234" as SessionId;
26
28
  const url = runtime.getWsURL(sessionId);
27
- expect(url.toString()).toBe("ws://marimo.app/ws?session_id=1234");
29
+ expect(url.toString()).toBe(
30
+ "ws://marimo.app/ws?query_params=&session_id=1234",
31
+ );
28
32
  expect(url.searchParams.get(KnownQueryParams.sessionId)).toBe(sessionId);
29
33
  });
30
34
 
@@ -35,7 +39,9 @@ describe("RuntimeManager.getWsURL", () => {
35
39
  });
36
40
  const sessionId = "1234" as SessionId;
37
41
  const url = runtime.getWsURL(sessionId);
38
- expect(url.toString()).toBe("ws://marimo.app/nested/ws?session_id=1234");
42
+ expect(url.toString()).toBe(
43
+ "ws://marimo.app/nested/ws?query_params=&session_id=1234",
44
+ );
39
45
  expect(url.searchParams.get(KnownQueryParams.sessionId)).toBe(sessionId);
40
46
  });
41
47
 
@@ -48,7 +54,7 @@ describe("RuntimeManager.getWsURL", () => {
48
54
  const sessionId = "1234" as SessionId;
49
55
  const url = runtime.getWsURL(sessionId);
50
56
  expect(url.toString()).toBe(
51
- "ws://marimo.app/nested/ws?foo=bar&file=test.py&session_id=1234",
57
+ "ws://marimo.app/nested/ws?foo=bar&file=test.py&query_params=foo%3Dbar%26file%3Dtest.py&session_id=1234",
52
58
  );
53
59
  expect(url.searchParams.get(KnownQueryParams.sessionId)).toBe(sessionId);
54
60
  });
@@ -62,11 +68,75 @@ describe("RuntimeManager.getWsURL", () => {
62
68
  const sessionId = "1234" as SessionId;
63
69
  const url = runtime.getWsURL(sessionId);
64
70
  expect(url.toString()).toBe(
65
- "ws://marimo.app/ws?file=test.py&search=test&other=last&session_id=1234",
71
+ "ws://marimo.app/ws?file=test.py&query_params=file%3Dtest.py%26search%3Dtest%26other%3Dlast&session_id=1234",
66
72
  );
67
73
  expect(url.searchParams.get("file")).toBe("test.py");
68
- expect(url.searchParams.get("search")).toBe("test");
69
- expect(url.searchParams.get("other")).toBe("last");
74
+ expect(url.searchParams.get("query_params")).toBe(
75
+ "file=test.py&search=test&other=last",
76
+ );
70
77
  expect(url.searchParams.get(KnownQueryParams.sessionId)).toBe(sessionId);
71
78
  });
72
79
  });
80
+
81
+ describe.each(["getWsURL", "getSseURL"] as const)(
82
+ "RuntimeManager.%s",
83
+ (method) => {
84
+ it("preserves runtime parameters and repeated page values", () => {
85
+ window.history.pushState({}, "", "/?tag=page-one&tag=page-two");
86
+ const runtime = new RuntimeManager(
87
+ {
88
+ url: `${window.location.origin}/nested?proxy_token=secret&tag=base&base=one&base=two`,
89
+ lazy: true,
90
+ },
91
+ true,
92
+ );
93
+ const url = runtime[method]("session" as SessionId);
94
+ expect([...url.searchParams]).toEqual([
95
+ ["proxy_token", "secret"],
96
+ ["tag", "base"],
97
+ ["base", "one"],
98
+ ["base", "two"],
99
+ [
100
+ "query_params",
101
+ "proxy_token=secret&base=one&base=two&tag=page-one&tag=page-two",
102
+ ],
103
+ ["session_id", "session"],
104
+ ]);
105
+ });
106
+
107
+ it("keeps notebook parameters out of the stream options", () => {
108
+ const notebookParams = new URLSearchParams([
109
+ ["types", "scatter"],
110
+ ["cursor", "page-2"],
111
+ ["run_id", "experiment"],
112
+ ["query_params", "nested=value&other=1"],
113
+ ["tag", "one"],
114
+ ["tag", "two"],
115
+ ["empty", ""],
116
+ ["text", "a+b & café"],
117
+ ["file", "test.py"],
118
+ ["kiosk", "true"],
119
+ ]);
120
+ window.history.pushState(
121
+ {},
122
+ "",
123
+ `/?${notebookParams}&session_id=page-session`,
124
+ );
125
+ const runtime = new RuntimeManager(
126
+ { url: window.location.origin, lazy: true },
127
+ true,
128
+ );
129
+ const url = runtime[method]("actual-session" as SessionId);
130
+
131
+ expect(Object.fromEntries(url.searchParams)).toEqual({
132
+ file: "test.py",
133
+ kiosk: "true",
134
+ session_id: "actual-session",
135
+ query_params: notebookParams.toString(),
136
+ });
137
+ expect([
138
+ ...new URLSearchParams(url.searchParams.get("query_params") ?? ""),
139
+ ]).toEqual([...notebookParams]);
140
+ });
141
+ },
142
+ );
@@ -249,7 +249,8 @@ describe("RuntimeManager", () => {
249
249
  const url = runtime.getSseURL("s_123" as SessionId);
250
250
 
251
251
  expect(url.searchParams.get("access_token")).toBeNull();
252
- expect(url.searchParams.get("foo")).toBe("bar");
252
+ expect(url.searchParams.get("query_params")).toBe("foo=bar");
253
+ expect(url.toString()).not.toContain("page-token");
253
254
  } finally {
254
255
  window.history.pushState({}, "", original);
255
256
  }
@@ -669,9 +670,16 @@ describe("RuntimeManager", () => {
669
670
  expect(httpUrl.searchParams.get("base_param")).toBe("existing");
670
671
 
671
672
  // Should preserve all window-level query params (including custom ones)
672
- expect(wsUrl.searchParams.get("custom_param")).toBe("value123");
673
- expect(wsUrl.searchParams.get("user_token")).toBe("abc");
674
- expect(wsUrl.searchParams.get("theme")).toBe("dark");
673
+ expect(
674
+ Object.fromEntries(
675
+ new URLSearchParams(wsUrl.searchParams.get("query_params") ?? ""),
676
+ ),
677
+ ).toEqual({
678
+ base_param: "existing",
679
+ custom_param: "value123",
680
+ user_token: "abc",
681
+ theme: "dark",
682
+ });
675
683
  expect(httpUrl.searchParams.get("custom_param")).toBe("value123");
676
684
  expect(httpUrl.searchParams.get("user_token")).toBe("abc");
677
685
  expect(httpUrl.searchParams.get("theme")).toBe("dark");
@@ -738,7 +746,7 @@ describe("RuntimeManager", () => {
738
746
  const sessionId = "test" as SessionId;
739
747
 
740
748
  expect(runtime.getWsURL(sessionId).toString()).toMatchInlineSnapshot(
741
- `"blob:https://example.com/12345678-1234-1234-1234-123456789abc?session_id=test"`,
749
+ `"blob:https://example.com/12345678-1234-1234-1234-123456789abc?query_params=&session_id=test"`,
742
750
  );
743
751
  expect(Logger.warn).toHaveBeenCalledOnce();
744
752
  });
@@ -128,33 +128,32 @@ export class RuntimeManager {
128
128
  return asWsUrl(this.appendCrossOriginAuth(url).toString());
129
129
  }
130
130
 
131
- /**
132
- * Search params for a session connection: the base URL's params, merged
133
- * with the current page's, plus the session id.
134
- */
135
- private getSessionSearchParams(sessionId: SessionId): URLSearchParams {
136
- const baseUrl = new URL(this.config.url);
137
- const searchParams = new URLSearchParams(baseUrl.search);
138
-
139
- // Merge in current page's query parameters
140
- const currentParams = new URLSearchParams(window.location.search);
141
- currentParams.forEach((value, key) => {
142
- // Don't override base URL params
143
- if (!searchParams.has(key)) {
144
- searchParams.set(key, value);
145
- }
146
- });
147
-
148
- searchParams.set(KnownQueryParams.sessionId, sessionId);
149
- return searchParams;
131
+ /** Keep notebook page parameters separate from connection options. */
132
+ private getSessionURL(path: string, sessionId: SessionId): URL {
133
+ const url = this.formatHttpURL({ path });
134
+ const notebookParams = new URLSearchParams(this.httpURL.search);
135
+ const pageParams = new URLSearchParams(window.location.search);
136
+ for (const key of pageParams.keys()) {
137
+ notebookParams.delete(key);
138
+ }
139
+ for (const [key, value] of pageParams) {
140
+ notebookParams.append(key, value);
141
+ }
142
+ // These parameters are internal and are not exposed by mo.query_params().
143
+ notebookParams.delete(KnownQueryParams.accessToken);
144
+ notebookParams.delete("refresh_token");
145
+ notebookParams.delete(KnownQueryParams.sessionId);
146
+ url.searchParams.set("query_params", notebookParams.toString());
147
+ url.searchParams.set(KnownQueryParams.sessionId, sessionId);
148
+ return url;
150
149
  }
151
150
 
152
151
  /**
153
152
  * The WebSocket URL of the runtime.
154
153
  */
155
154
  public getWsURL(sessionId: SessionId): URL {
156
- const searchParams = this.getSessionSearchParams(sessionId);
157
- return this.formatWsURL("/ws", searchParams);
155
+ const url = this.getSessionURL("/ws", sessionId);
156
+ return asWsUrl(this.appendCrossOriginAuth(url).toString());
158
157
  }
159
158
 
160
159
  /**
@@ -164,11 +163,7 @@ export class RuntimeManager {
164
163
  * (see `headers()`) instead of the URL.
165
164
  */
166
165
  public getSseURL(sessionId: SessionId): URL {
167
- const url = this.formatHttpURL({
168
- path: "/sse",
169
- searchParams: this.getSessionSearchParams(sessionId),
170
- restrictToKnownQueryParams: false,
171
- });
166
+ const url = this.getSessionURL("/sse", sessionId);
172
167
  // The page URL can still carry access_token (merged in from the
173
168
  // current page's params, before auth cleanup strips it); never
174
169
  // forward it — a token in the URL leaks into proxy/server logs.
@@ -180,7 +175,8 @@ export class RuntimeManager {
180
175
  * The WebSocket Sync URL of the runtime, for real-time updates.
181
176
  */
182
177
  public getWsSyncURL(sessionId: SessionId): URL {
183
- return this.formatWsURL("/ws_sync", this.getSessionSearchParams(sessionId));
178
+ const url = this.getSessionURL("/ws_sync", sessionId);
179
+ return asWsUrl(this.appendCrossOriginAuth(url).toString());
184
180
  }
185
181
 
186
182
  /**
@@ -1 +0,0 @@
1
- import{a as e,c as t,f as n,l as r,r as i,t as a}from"./useEvent-Dfcbgjhg.js";import{t as o}from"./compiler-runtime-BrajqUja.js";import{g as s}from"./useEventListener-CjDeLqFC.js";import{t as c}from"./invariant-Ci2dTZ72.js";import{i as l,t as u}from"./utils-B4K466FK.js";import{p as d,t as f}from"./session-B8Y-GJnS.js";import{t as p}from"./Deferred-CrTnjj37.js";var m=o();function h(){return typeof document<`u`&&document.querySelector(`marimo-wasm`)!==null}var g=Symbol(``);function _(e,t){return n(e,function(e,n,r){n(this,t(e(this),r))})}function ee(e,t){let n=null,r=new Map,i=new Set,a=i=>{let s;if(t===void 0)s=r.get(i);else for(let[e,n]of r)if(t(e,i)){s=n;break}if(s!==void 0){if(n?.(s[1],i))a.remove(i);else return s[0]}let c=e(i);return r.set(i,[c,Date.now()]),o(`CREATE`,i,c),c},o=(e,t,n)=>{for(let r of i)r({type:e,param:t,atom:n})};return a.unstable_listen=e=>(i.add(e),()=>{i.delete(e)}),a.getParams=()=>r.keys(),a.remove=e=>{if(t===void 0){if(!r.has(e))return;let[t]=r.get(e);r.delete(e),o(`REMOVE`,e,t)}else for(let[n,[i]]of r)if(t(n,e)){r.delete(n),o(`REMOVE`,n,i);break}},a.setShouldRemove=e=>{if(n=e,n)for(let[e,[t,i]]of r)n(i,e)&&(r.delete(e),o(`REMOVE`,e,t))},a}var v=(e,t,n)=>(t.has(n)?t:t.set(n,e())).get(n),y=new WeakMap,te=(e,t,n,r)=>v(e,v(()=>new WeakMap,v(()=>new WeakMap,y,t),n),r);function b(e,t,r=Object.is){return te(()=>{let i=Symbol(),a=([e,n])=>{if(n===i)return t(e);let a=t(e,n);return r(n,a)?n:a},o=n(t=>{let n=t(o),r=t(e);return a([r,n])});return o.init=i,o},e,t,r)}var x=(e,t,n)=>(t.has(n)?t:t.set(n,e())).get(n),ne=new WeakMap,S=(e,t,n)=>x(e,x(()=>new WeakMap,ne,t),n),C={},w=e=>!!e.write,T=e=>typeof e==`function`;function E(e,t){return S(()=>{let r=new WeakMap,i=(o,s)=>{let c=r.get(o);if(c)return c;let l=s&&r.get(s),u=[],d=[];return o.forEach((r,s)=>{let c=t?t(r):s;d[s]=c;let f=l&&l.atomList[l.keyList.indexOf(c)];if(f){u[s]=f;return}let p=t=>{let n=t(a),r=t(e),s=i(r,n?.arr).keyList.indexOf(c);if(s<0||s>=r.length){let e=o[i(o).keyList.indexOf(c)];if(e)return e;throw Error(`splitAtom: index out of bounds for read`)}return r[s]};u[s]=w(e)?n(p,(t,n,r)=>{let o=t(a),s=t(e),l=i(s,o?.arr).keyList.indexOf(c);if(l<0||l>=s.length)throw Error(`splitAtom: index out of bounds for write`);let u=T(r)?r(s[l]):r;Object.is(s[l],u)||n(e,[...s.slice(0,l),u,...s.slice(l+1)])}):n(p)}),c=l&&l.keyList.length===d.length&&l.keyList.every((e,t)=>e===d[t])?l:{arr:o,atomList:u,keyList:d},r.set(o,c),c},a=n(t=>{let n=t(a),r=t(e);return i(r,n?.arr)});a.init=void 0;let o=w(e)?n(e=>e(a).atomList,(t,n,r)=>{switch(r.type){case`remove`:{let i=t(o).indexOf(r.atom);if(i>=0){let r=t(e);n(e,[...r.slice(0,i),...r.slice(i+1)])}break}case`insert`:{let i=r.before?t(o).indexOf(r.before):t(o).length;if(i>=0){let a=t(e);n(e,[...a.slice(0,i),r.value,...a.slice(i)])}break}case`move`:{let i=t(o).indexOf(r.atom),a=r.before?t(o).indexOf(r.before):t(o).length;if(i>=0&&a>=0){let r=t(e);i<a?n(e,[...r.slice(0,i),...r.slice(i+1,a),r[i],...r.slice(a)]):n(e,[...r.slice(0,a),r[i],...r.slice(a,i),...r.slice(i+1)])}break}}}):n(e=>e(a).atomList);return o},e,t||C)}var D=e=>typeof e?.then==`function`;function O(e=()=>{try{return window.localStorage}catch{return}},t){let n,r,i={getItem:(i,a)=>{let o=e=>{if(e||=``,n!==e){try{r=JSON.parse(e,t?.reviver)}catch{return a}n=e}return r},s=e()?.getItem(i)??null;return D(s)?s.then(o):o(s)},setItem:(n,r)=>e()?.setItem(n,JSON.stringify(r,t?.replacer)),removeItem:t=>e()?.removeItem(t)},a=e=>(n,r,i)=>e(n,e=>{let n;try{n=JSON.parse(e||``,t?.reviver)}catch{n=i}r(n)}),o;try{o=e()?.subscribe}catch{}return!o&&typeof window<`u`&&typeof window.addEventListener==`function`&&window.Storage&&(o=(t,n)=>{if(!(e()instanceof window.Storage))return()=>{};let r=r=>{r.storageArea===e()&&r.key===t&&n(r.newValue)};return window.addEventListener(`storage`,r),()=>{window.removeEventListener(`storage`,r)}}),o&&(i.subscribe=a(o)),i}var re=O();function ie(e,t,r=re,i){let a=i?.getOnInit,o=n(a?r.getItem(e,t):t);return o.onMount=n=>(n(r.getItem(e,t)),r.subscribe?.call(r,e,n,t)),n(e=>e(o),(n,i,a)=>{let s=typeof a==`function`?a(n(o)):a;return s===g?(i(o,t),r.removeItem(e)):D(s)?s.then(t=>(i(o,t),r.setItem(e,t))):(i(o,s),r.setItem(e,s))})}var k={NOT_STARTED:`NOT_STARTED`,CONNECTING:`CONNECTING`,OPEN:`OPEN`,CLOSING:`CLOSING`,CLOSED:`CLOSED`},A={KERNEL_DISCONNECTED:`KERNEL_DISCONNECTED`,KERNEL_STARTUP_ERROR:`KERNEL_STARTUP_ERROR`},j=n({state:k.NOT_STARTED}),M=_(null,(e,t)=>t===null?null:{phase:t.phase,logs:t.log_mode===`append`&&e?.phase===t.phase?e.logs+t.logs:t.logs});function N(){return e(j,e=>e.state===k.OPEN)}function P(){return d()?N():Promise.resolve()}var F=n(e=>e(j).state===k.CONNECTING),I=n(e=>e(j).state===k.OPEN),L=n(e=>{let t=e(j);return t.state===k.OPEN||t.state===k.NOT_STARTED});n(e=>e(j).state===k.CLOSED);var R=n(e=>e(j).state===k.NOT_STARTED);function z(e){return e===k.CONNECTING}function B(e){return e===k.OPEN}function V(e){return e===k.CLOSING}function H(e){return e===k.NOT_STARTED}function U(e){return e===k.CLOSED||e===k.CLOSING||e===k.CONNECTING}function ae(e){switch(e){case k.CLOSED:return`App disconnected`;case k.CONNECTING:return`Connecting to a runtime ...`;case k.CLOSING:return`App disconnecting...`;case k.OPEN:return``;case k.NOT_STARTED:return`Click to connect to a runtime`;default:return``}}function W(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;for(let t of Object.values(e))if(typeof t!=`string`)return!1;return!0}function G(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=e;return!(!W(t.files)||t.modelNotifications!==void 0&&!Array.isArray(t.modelNotifications))}function K(){let e=typeof window>`u`?void 0:window.__MARIMO_STATIC__;return G(e)?e:void 0}function q(){return K()!==void 0}function J(){let e=K();return c(e!==void 0,`Not a static notebook`),e.files}function oe(){return K()?.modelNotifications}var se=new Set(Object.values(l)),ce=class{initialHealthyCheck=new p;config;lazy;constructor(e,t=!1){this.config=e,this.lazy=t;try{new URL(this.config.url)}catch(e){throw Error(`Invalid runtime URL: ${this.config.url}. ${e instanceof Error?e.message:`Unknown error`}`,{cause:e})}this.lazy||this.init()}get isLazy(){return this.lazy}get httpURL(){return new URL(this.config.url)}get isSameOrigin(){return this.httpURL.origin===window.location.origin}get isServerless(){return h()||u()||q()}formatHttpURL({path:e=``,searchParams:t,restrictToKnownQueryParams:n=!0}){let r=this.httpURL,i=new URLSearchParams(window.location.search);if(t)for(let[e,n]of t.entries())r.searchParams.set(e,n);for(let[e,t]of i.entries())n&&!se.has(e)||r.searchParams.set(e,t);return r.pathname=`${r.pathname.replace(/\/$/,``)}/${e.replace(/^\//,``)}`,r.hash=``,r}appendCrossOriginAuth(e){return!this.isSameOrigin&&this.config.authToken&&e.searchParams.set(l.accessToken,this.config.authToken),e}formatNavigableHttpURL(e,t){let n=this.formatHttpURL({path:e,searchParams:t});return n.searchParams.delete(l.accessToken),this.appendCrossOriginAuth(n)}formatWsURL(e,t){let n=this.formatHttpURL({path:e,searchParams:t,restrictToKnownQueryParams:!1});return le(this.appendCrossOriginAuth(n).toString())}getSessionSearchParams(e){let t=new URL(this.config.url),n=new URLSearchParams(t.search);return new URLSearchParams(window.location.search).forEach((e,t)=>{n.has(t)||n.set(t,e)}),n.set(l.sessionId,e),n}getWsURL(e){let t=this.getSessionSearchParams(e);return this.formatWsURL(`/ws`,t)}getSseURL(e){let t=this.formatHttpURL({path:`/sse`,searchParams:this.getSessionSearchParams(e),restrictToKnownQueryParams:!1});return t.searchParams.delete(l.accessToken),t}getWsSyncURL(e){return this.formatWsURL(`/ws_sync`,this.getSessionSearchParams(e))}getTerminalWsURL(e){let t=this.formatWsURL(`/terminal/ws`);return e&&(t.searchParams.set(`rows`,String(e.rows)),t.searchParams.set(`cols`,String(e.cols))),t}getLSPURL(e){if(e===`copilot`){let t=this.formatWsURL(`/lsp/${e}`),n=t.searchParams.get(l.accessToken);return t.search=``,n&&t.searchParams.set(l.accessToken,n),t}return this.formatWsURL(`/lsp/${e}`)}getAiURL(e){return this.formatHttpURL({path:`/api/ai/${e}`})}healthURL(){return this.formatHttpURL({path:`/health`})}async fetchHealth(){try{return await fetch(this.healthURL().toString())}catch(e){return s.error(`Failed to check health: ${e instanceof Error?e.message:`Unknown error`}`,{cause:e}),null}}async reconcileFromHealth(){if(this.isServerless)return!0;let e=await this.fetchHealth();if(!e)return!1;if(e.redirected){s.debug(`Runtime redirected to ${e.url}`);let t=new URL(e.url);t.pathname=t.pathname.replace(/\/health$/,``),this.config.url=t.toString()}return e.ok&&this.setDOMBaseUri(this.config.url),e.ok}async probeHealth(){return this.isServerless?!0:(await this.fetchHealth())?.ok??!1}setDOMBaseUri(e){e=e.split(`?`,1)[0],e.endsWith(`/`)||(e+=`/`);let t=document.querySelector(`base`);t?t.setAttribute(`href`,e):(t=document.createElement(`base`),t.setAttribute(`href`,e),document.head.append(t))}async init(e){s.debug(`Initializing runtime...`);let t=0;for(;!await this.reconcileFromHealth();){if(t>=25){s.error(`Failed to connect after 25 retries`),this.initialHealthyCheck.reject(Error(`Failed to connect after 25 retries`));return}if(!e?.disableRetryDelay){let e=Math.min(100*1.2**t,2e3);await new Promise(t=>setTimeout(t,e))}t++}s.debug(`Runtime is healthy`),this.initialHealthyCheck.resolve()}async waitForHealthy(){return this.initialHealthyCheck.promise}headers(){let e={"Marimo-Session-Id":f(),"Marimo-Server-Token":this.config.serverToken??``,"x-runtime-url":this.httpURL.toString()};return this.config.authToken&&(e.Authorization=`Bearer ${this.config.authToken}`),e}sessionHeaders(){return{"Marimo-Session-Id":f()}}};function le(e){if(!e.startsWith(`http`)){s.warn(`URL must start with http: ${e}`);let t=new URL(e);return t.protocol=`ws`,t}return new URL(e.replace(/^http/,`ws`))}function ue(){let e=new URL(document.baseURI);return e.search=``,e.hash=``,e.toString()}var Y={lazy:!0,url:ue()},X=n(Y),Z=n(e=>{let t=e(X);return new ce(t,t.lazy)});function Q(){return r(Z)}function de(){let e=(0,m.c)(4),n=Q(),[r,i]=t(j),o;return e[0]!==r.state||e[1]!==n||e[2]!==i?(o=async()=>{H(r.state)?(i({state:k.CONNECTING}),await n.init()):s.log(`Runtime already started or starting...`)},e[0]=r.state,e[1]=n,e[2]=i,e[3]=o):o=e[3],a(o)}function $(){return i.get(Z)}function fe(e){if(e.startsWith(`http`))return new URL(e);let t=$().httpURL.toString();return t.startsWith(`blob:`)&&(t=t.replace(`blob:`,``)),new URL(e,t)}export{b as A,P as C,_ as D,ee as E,h as M,ie as O,N as S,k as T,j as _,de as a,R as b,J as c,V as d,B as f,L as g,H as h,X as i,E as j,O as k,q as l,U as m,fe as n,Q as o,z as p,$ as r,oe as s,Y as t,ae as u,I as v,A as w,M as x,F as y};
@@ -1 +0,0 @@
1
- import{n as e}from"./feedback-button-D9InK87G.js";export{e as FeedbackModal};