@marimo-team/frontend 0.23.7-dev55 → 0.23.7-dev57

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 (116) hide show
  1. package/dist/assets/{CellStatus-DXNmZJpi.js → CellStatus-DGBvmSvq.js} +1 -1
  2. package/dist/assets/JsonOutput-BEbyS3oG.js +53 -0
  3. package/dist/assets/{LazyAnyLanguageCodeMirror-B2pl_WA3.js → LazyAnyLanguageCodeMirror-GdhQ07zA.js} +2 -2
  4. package/dist/assets/{MarimoErrorOutput-YGhIA85d.js → MarimoErrorOutput-XWqnhvJ6.js} +1 -1
  5. package/dist/assets/{RenderHTML-Dz1OIbOh.js → RenderHTML-B5r25cP5.js} +1 -1
  6. package/dist/assets/{RunButton-D1IZ1Yr0.js → RunButton-Dbak5hfa.js} +1 -1
  7. package/dist/assets/{add-cell-with-ai-hIPYl46r.js → add-cell-with-ai-BbZkMqv2.js} +1 -1
  8. package/dist/assets/{add-connection-dialog-CMR-c9XE.js → add-connection-dialog-Cw6_iYno.js} +1 -1
  9. package/dist/assets/{agent-panel-DnBAoLsM.js → agent-panel-StLA6gDR.js} +1 -1
  10. package/dist/assets/{ai-model-dropdown-zvokTxf_.js → ai-model-dropdown-CjhUqXgj.js} +1 -1
  11. package/dist/assets/{any-language-editor-BgxVFHQ8.js → any-language-editor-Bdhmwznp.js} +1 -1
  12. package/dist/assets/{app-config-button-BjFAqaTN.js → app-config-button-CCs8Jepz.js} +1 -1
  13. package/dist/assets/{cell-editor-Dak_jwhB.js → cell-editor-Cgyoqdi5.js} +1 -1
  14. package/dist/assets/{cell-link-pRI-YfIp.js → cell-link-PQYiMZw1.js} +1 -1
  15. package/dist/assets/{cells-DbE28H1u.js → cells-Dnu4nDoy.js} +1 -1
  16. package/dist/assets/{chat-display-D_nDPZek.js → chat-display-DetTBnqK.js} +1 -1
  17. package/dist/assets/{chat-panel-BktSpl2P.js → chat-panel-CEgw_vg0.js} +1 -1
  18. package/dist/assets/{chat-ui-C0_KcXrv.js → chat-ui-D-Y7p_cT.js} +1 -1
  19. package/dist/assets/{chunk-5FQGJX7Z-DILIU9Rm.js → chunk-5FQGJX7Z-BSzccEgu.js} +3 -3
  20. package/dist/assets/{code-block-37QAKDTI-Bgm-HPiB.js → code-block-37QAKDTI-U2R1jyOo.js} +1 -1
  21. package/dist/assets/{column-preview-CNeXQtKn.js → column-preview-DA6nf5_Q.js} +1 -1
  22. package/dist/assets/{command-palette-CcjZs_TG.js → command-palette-n_e11WBA.js} +1 -1
  23. package/dist/assets/{common-CWRr25jC.js → common-BaBE_ygg.js} +1 -1
  24. package/dist/assets/{components-DUd0ki0p.js → components-CvGaLA5d.js} +1 -1
  25. package/dist/assets/{components-Cj3Al1Y6.js → components-zB5yT_R8.js} +1 -1
  26. package/dist/assets/config-C2lTvbuU.js +1 -0
  27. package/dist/assets/{datasource-Prn_GWOB.js → datasource-I-LOgxeP.js} +1 -1
  28. package/dist/assets/{dependency-graph-panel-DUUCij85.js → dependency-graph-panel-BjOeXp74.js} +1 -1
  29. package/dist/assets/{dist-DxnNQmQo.js → dist-CW3rweKM.js} +1 -1
  30. package/dist/assets/{documentation-panel-CB8xalFX.js → documentation-panel-DMdFXuBf.js} +1 -1
  31. package/dist/assets/{download-DEJbA1IY.js → download-BO6T2USS.js} +1 -1
  32. package/dist/assets/{edit-page-BkHYt2if.js → edit-page-Dos8zz_9.js} +6 -6
  33. package/dist/assets/{error-panel-DG6AtqLR.js → error-panel-iXznkJZ1.js} +1 -1
  34. package/dist/assets/{file-explorer-panel-Co6MlwYD.js → file-explorer-panel-_77UepGi.js} +3 -3
  35. package/dist/assets/{file-icons-BjTIuMQg.js → file-icons-B6DaZdP0.js} +1 -1
  36. package/dist/assets/{file-name-input-CQVbWhL8.js → file-name-input-g2H2sY2h.js} +1 -1
  37. package/dist/assets/{floating-outline-uy6dAsIe.js → floating-outline-DbOtUfo-.js} +1 -1
  38. package/dist/assets/{focus-0RBjdtZw.js → focus-BaOnnMs-.js} +1 -1
  39. package/dist/assets/{form-DNa2VnwU.js → form-CM8vYbSt.js} +1 -1
  40. package/dist/assets/{globals-DI5QlXvl.js → globals-CpVAcN9Z.js} +1 -1
  41. package/dist/assets/{home-page-BSuXANlw.js → home-page-De1W6q6f.js} +1 -1
  42. package/dist/assets/{hooks-B7pYZHjF.js → hooks-7OHHugrQ.js} +1 -1
  43. package/dist/assets/{html-to-image-CIu-0LbU.js → html-to-image-D6SgvARi.js} +1 -1
  44. package/dist/assets/index-1EIgCVR_.js +38 -0
  45. package/dist/assets/{kiosk-mode-Ch75k65P.js → kiosk-mode-Czvj3vmL.js} +1 -1
  46. package/dist/assets/{layout-DFhJt7oJ.js → layout-DQGNHEpb.js} +5 -5
  47. package/dist/assets/{logs-panel-DR-1BC0S.js → logs-panel-BMAfoMJg.js} +1 -1
  48. package/dist/assets/{markdown-renderer-DGqYztXR.js → markdown-renderer-BQ-BQLiJ.js} +3 -3
  49. package/dist/assets/mermaid-4DMBBIKO-C0OyyVdo.js +1 -0
  50. package/dist/assets/{name-cell-input-DwfyLq31.js → name-cell-input-bwfAyC0i.js} +1 -1
  51. package/dist/assets/{outline-panel-CWunrooQ.js → outline-panel-CkZUQcZ1.js} +1 -1
  52. package/dist/assets/{packages-panel-BdcXUFQJ.js → packages-panel-B3dRYuRM.js} +1 -1
  53. package/dist/assets/panels-DvIOAb34.js +1 -0
  54. package/dist/assets/{process-output-CS4QGJvL.js → process-output-9W-JyYdE.js} +1 -1
  55. package/dist/assets/{radio-group-BS2PIEzV.js → radio-group-rsi1ibXY.js} +1 -1
  56. package/dist/assets/{readonly-python-code-C5JNX2fu.js → readonly-python-code-BKYj8PNf.js} +1 -1
  57. package/dist/assets/{reveal-component-PiSHIrbA.js → reveal-component-ClM8W-TD.js} +1 -1
  58. package/dist/assets/{run-page-BovrPK0f.js → run-page-DJOwAe2z.js} +1 -1
  59. package/dist/assets/{scratchpad-panel-CAWFveBD.js → scratchpad-panel-CpM3jVv7.js} +1 -1
  60. package/dist/assets/{secrets-panel-CEh4Wjfn.js → secrets-panel-DqHGq3V8.js} +1 -1
  61. package/dist/assets/{session-panel-BR9h5w96.js → session-panel-jVcSUURP.js} +1 -1
  62. package/dist/assets/{snippets-panel-Y2etH9Qg.js → snippets-panel-DFJd1ui5.js} +1 -1
  63. package/dist/assets/{state-Fa6RzVTL.js → state-BXNNuw9g.js} +1 -1
  64. package/dist/assets/{state-1SbOXCLX.js → state-D9EoHCkz.js} +1 -1
  65. package/dist/assets/{switch-CTn-kJzM.js → switch-BtkQp293.js} +1 -1
  66. package/dist/assets/{terminal-DI2XRUUH.js → terminal-BSE1Vg5d.js} +1 -1
  67. package/dist/assets/{textarea-wgoQLrBS.js → textarea-BBTcSr-i.js} +1 -1
  68. package/dist/assets/{tracing-C9PZ0Pr1.js → tracing-BQU8fBDM.js} +1 -1
  69. package/dist/assets/{tracing-panel-C20Rk6hU.js → tracing-panel-DEVpyGX3.js} +2 -2
  70. package/dist/assets/useBoolean-B8LMGUHl.js +1 -0
  71. package/dist/assets/{useCellActionButton-D_-iAhme.js → useCellActionButton-CpNJthj4.js} +1 -1
  72. package/dist/assets/{useDeleteCell-41mvwiyA.js → useDeleteCell-DFahVcdW.js} +1 -1
  73. package/dist/assets/{useDependencyPanelTab-ELdrL73c.js → useDependencyPanelTab-BNbEyT1o.js} +1 -1
  74. package/dist/assets/{useNotebookActions-CgN-58GN.js → useNotebookActions-DqlAe4Ea.js} +1 -1
  75. package/dist/assets/{useRunCells-CfHlqXY6.js → useRunCells-C0BPo9m1.js} +1 -1
  76. package/dist/assets/{useSplitCell-gHtyz873.js → useSplitCell-BN53wD86.js} +1 -1
  77. package/dist/assets/{vega-component-BPU1T-x7.js → vega-component-C9fDGx86.js} +1 -1
  78. package/dist/assets/{write-secret-modal-DjVzKit_.js → write-secret-modal-Liv_9MXS.js} +1 -1
  79. package/dist/index.html +40 -40
  80. package/package.json +1 -1
  81. package/src/components/data-table/__tests__/column-header.test.tsx +106 -1
  82. package/src/components/data-table/__tests__/filter-pill-editor.test.tsx +88 -2
  83. package/src/components/data-table/__tests__/filters.test.ts +84 -13
  84. package/src/components/data-table/column-header.tsx +152 -26
  85. package/src/components/data-table/date-filter-inputs.tsx +325 -0
  86. package/src/components/data-table/filter-pill-editor.tsx +139 -30
  87. package/src/components/data-table/filter-pills.tsx +31 -57
  88. package/src/components/data-table/filters.ts +88 -66
  89. package/src/components/editor/chrome/wrapper/footer-items/backend-status.tsx +1 -1
  90. package/src/core/runtime/__tests__/runtime.test.ts +38 -17
  91. package/src/core/runtime/runtime.ts +57 -34
  92. package/src/core/websocket/__tests__/useMarimoKernelConnection.hook.test.tsx +5 -4
  93. package/src/core/websocket/__tests__/useMarimoKernelConnection.test.ts +18 -54
  94. package/src/core/websocket/transports/__tests__/ws.test.ts +125 -0
  95. package/src/core/websocket/transports/basic.ts +1 -3
  96. package/src/core/websocket/transports/transport.ts +0 -1
  97. package/src/core/websocket/transports/ws.ts +96 -0
  98. package/src/core/websocket/useMarimoKernelConnection.tsx +30 -26
  99. package/src/core/websocket/useWebSocket.tsx +3 -18
  100. package/dist/assets/JsonOutput-Dxol3ZtH.js +0 -49
  101. package/dist/assets/config-DGudsRYK.js +0 -1
  102. package/dist/assets/index-DySiGerD.js +0 -42
  103. package/dist/assets/mermaid-4DMBBIKO-B-uFGNnk.js +0 -1
  104. package/dist/assets/panels-CJ1t18_z.js +0 -1
  105. package/dist/assets/useBoolean-DP3412N2.js +0 -1
  106. /package/dist/assets/{bundle.esm-DjhGJy4I.js → bundle.esm-BXIlAZ6T.js} +0 -0
  107. /package/dist/assets/{esm-DLYpPRvw.js → esm-Cb2bnV6o.js} +0 -0
  108. /package/dist/assets/{field-CQGpbXj3.js → field-DNlzfMKW.js} +0 -0
  109. /package/dist/assets/{formats-CJQ67TPE.js → formats-BRq458WH.js} +0 -0
  110. /package/dist/assets/{icons-Ol38nIbL.js → icons-8tfAri2V.js} +0 -0
  111. /package/dist/assets/{micromark-factory-space-P--XWZhg.js → micromark-factory-space-BUQpMdx2.js} +0 -0
  112. /package/dist/assets/{react-resizable-panels.browser.esm-CgWOEYeG.js → react-resizable-panels.browser.esm-Ce2ksurd.js} +0 -0
  113. /package/dist/assets/{renderShortcut-D7FYCtYQ.js → renderShortcut-DK-VjfaX.js} +0 -0
  114. /package/dist/assets/{table-DUSsaCYD.js → table-DQE9hQzM.js} +0 -0
  115. /package/dist/assets/{tree-actions-D9i3o3Zk.js → tree-actions-DY8FUp3V.js} +0 -0
  116. /package/dist/assets/{useDeepCompareMemoize-zUHU--0D.js → useDeepCompareMemoize-CWcgQCbT.js} +0 -0
@@ -11,10 +11,8 @@ import type {
11
11
  NotificationMessageData,
12
12
  NotificationPayload,
13
13
  } from "@/core/kernel/messages";
14
- import {
15
- MAX_RETRIES,
16
- useConnectionTransport,
17
- } from "@/core/websocket/useWebSocket";
14
+ import { TRANSPORT_EXHAUSTED_REASON } from "@/core/websocket/transports/ws";
15
+ import { useConnectionTransport } from "@/core/websocket/useWebSocket";
18
16
  import { renderHTML } from "@/plugins/core/RenderHTML";
19
17
  import {
20
18
  handleWidgetMessage,
@@ -80,16 +78,27 @@ import {
80
78
 
81
79
  const SUPPORTS_LAZY_KERNELS = true;
82
80
 
81
+ // All MARIMO_* reasons except TRANSPORT_EXHAUSTED are emitted by the backend
82
+ // (marimo/_server/api/endpoints/ws_endpoint.py and ws/*.py). Keep in sync with
83
+ // the backend literals.
84
+ export type CloseReason =
85
+ | "MARIMO_ALREADY_CONNECTED"
86
+ | "MARIMO_WRONG_KERNEL_ID"
87
+ | "MARIMO_NO_FILE_KEY"
88
+ | "MARIMO_NO_SESSION_ID"
89
+ | "MARIMO_NO_SESSION"
90
+ | "MARIMO_SHUTDOWN"
91
+ | "MARIMO_MALFORMED_QUERY"
92
+ | "MARIMO_KERNEL_STARTUP_ERROR"
93
+ | typeof TRANSPORT_EXHAUSTED_REASON;
94
+
83
95
  export type CloseDecision =
84
96
  | { kind: "terminal"; status: ConnectionStatus; closeTransport: boolean }
85
97
  | { kind: "gave-up"; status: ConnectionStatus }
86
98
  | { kind: "retry"; status: ConnectionStatus };
87
99
 
88
- export function classifyCloseEvent(
89
- event: { reason?: string },
90
- context: { retryCount: number; maxRetries: number },
91
- ): CloseDecision {
92
- switch (event.reason) {
100
+ export function classifyCloseEvent(event: { reason?: string }): CloseDecision {
101
+ switch (event.reason as CloseReason | undefined) {
93
102
  case "MARIMO_ALREADY_CONNECTED":
94
103
  return {
95
104
  kind: "terminal",
@@ -101,6 +110,15 @@ export function classifyCloseEvent(
101
110
  },
102
111
  closeTransport: true,
103
112
  };
113
+ case TRANSPORT_EXHAUSTED_REASON:
114
+ return {
115
+ kind: "gave-up",
116
+ status: {
117
+ state: WebSocketState.CLOSED,
118
+ code: WebSocketClosedReason.KERNEL_DISCONNECTED,
119
+ reason: "kernel not found",
120
+ },
121
+ };
104
122
  case "MARIMO_WRONG_KERNEL_ID":
105
123
  case "MARIMO_NO_FILE_KEY":
106
124
  case "MARIMO_NO_SESSION_ID":
@@ -144,18 +162,7 @@ export function classifyCloseEvent(
144
162
  logNever(event.reason as never);
145
163
  }
146
164
  }
147
- // partysocket stops retrying silently once `maxRetries` is hit; surface
148
- // CLOSED so callers can detect the give-up.
149
- if (context.retryCount >= context.maxRetries) {
150
- return {
151
- kind: "gave-up",
152
- status: {
153
- state: WebSocketState.CLOSED,
154
- code: WebSocketClosedReason.KERNEL_DISCONNECTED,
155
- reason: "kernel not found",
156
- },
157
- };
158
- }
165
+
159
166
  return {
160
167
  kind: "retry",
161
168
  status: { state: WebSocketState.CONNECTING },
@@ -440,7 +447,7 @@ export function useMarimoKernelConnection(opts: {
440
447
  }
441
448
  shouldTryReconnecting.current = true;
442
449
  setConnection({ state: WebSocketState.CONNECTING });
443
- const healthy = await runtimeManager.isHealthy();
450
+ const healthy = await runtimeManager.reconcileFromHealth();
444
451
  if (!healthy) {
445
452
  shouldTryReconnecting.current = false;
446
453
  setConnection({
@@ -512,10 +519,7 @@ export function useMarimoKernelConnection(opts: {
512
519
  */
513
520
  onClose: (e) => {
514
521
  Logger.warn("WebSocket closed", e.code, e.reason);
515
- const decision = classifyCloseEvent(e, {
516
- retryCount: ws.retryCount,
517
- maxRetries: MAX_RETRIES,
518
- });
522
+ const decision = classifyCloseEvent(e);
519
523
  setConnection(decision.status);
520
524
  if (decision.kind === "terminal" && decision.closeTransport) {
521
525
  ws.close(); // close to prevent reconnecting
@@ -1,11 +1,11 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
- import ReconnectingWebSocket from "partysocket/ws";
4
3
  import { useEffect, useState } from "react";
5
4
  import { Logger } from "@/utils/Logger";
6
5
  import { createPyodideConnection } from "../wasm/bridge";
7
6
  import { isWasm } from "../wasm/utils";
8
7
  import { BasicTransport } from "./transports/basic";
8
+ import { WsTransport } from "./transports/ws";
9
9
  import type { IConnectionTransport } from "./transports/transport";
10
10
 
11
11
  interface UseConnectionTransportOptions {
@@ -18,10 +18,6 @@ interface UseConnectionTransportOptions {
18
18
  onError: (event: WebSocketEventMap["error"]) => void;
19
19
  }
20
20
 
21
- // Per-`reconnect()` retry budget for partysocket. After exhaustion, partysocket
22
- // stops silently; treat `retryCount >= MAX_RETRIES` as the give-up signal.
23
- export const MAX_RETRIES = 10;
24
-
25
21
  function createConnectionTransport(
26
22
  options: Pick<UseConnectionTransportOptions, "url" | "static">,
27
23
  ): IConnectionTransport {
@@ -31,19 +27,8 @@ function createConnectionTransport(
31
27
  if (isWasm()) {
32
28
  return createPyodideConnection();
33
29
  }
34
- // Create a connection transport using the ReconnectingWebSocket from partysocket
35
- // This handles reconnecting when the connection is lost.
36
- const urlProvider = options.url; // We don't call the URL provider now since it may change (i.e. if the runtime redirects)
37
- // Cast needed: ReconnectingWebSocket types readyState as `number`
38
- // but IConnectionTransport expects `0 | 1 | 2 | 3`
39
- return new ReconnectingWebSocket(urlProvider, undefined, {
40
- maxRetries: MAX_RETRIES,
41
- debug: false,
42
- startClosed: true,
43
- // long timeout -- the server can become slow when many notebooks
44
- // are open.
45
- connectionTimeout: 10_000,
46
- }) as unknown as IConnectionTransport;
30
+ // urlProvider is passed lazily; it may change after a runtime redirect.
31
+ return new WsTransport(options.url);
47
32
  }
48
33
 
49
34
  /**