@marimo-team/frontend 0.23.7-dev55 → 0.23.7-dev56
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-DXNmZJpi.js → CellStatus-DGBvmSvq.js} +1 -1
- package/dist/assets/{JsonOutput-Dxol3ZtH.js → JsonOutput-BPqXvbC7.js} +1 -1
- package/dist/assets/{MarimoErrorOutput-YGhIA85d.js → MarimoErrorOutput-XWqnhvJ6.js} +1 -1
- package/dist/assets/{RenderHTML-Dz1OIbOh.js → RenderHTML-B5r25cP5.js} +1 -1
- package/dist/assets/{RunButton-D1IZ1Yr0.js → RunButton-Cq4E1fUj.js} +1 -1
- package/dist/assets/{add-cell-with-ai-hIPYl46r.js → add-cell-with-ai-DXs7NQH8.js} +1 -1
- package/dist/assets/{add-connection-dialog-CMR-c9XE.js → add-connection-dialog-B7rzO6Bd.js} +1 -1
- package/dist/assets/{agent-panel-DnBAoLsM.js → agent-panel-BrZgfzbb.js} +1 -1
- package/dist/assets/{ai-model-dropdown-zvokTxf_.js → ai-model-dropdown-CfAujhNQ.js} +1 -1
- package/dist/assets/{app-config-button-BjFAqaTN.js → app-config-button-BauNrGJV.js} +1 -1
- package/dist/assets/{cell-editor-Dak_jwhB.js → cell-editor-BfL0GQm4.js} +1 -1
- package/dist/assets/{cell-link-pRI-YfIp.js → cell-link-PQYiMZw1.js} +1 -1
- package/dist/assets/{cells-DbE28H1u.js → cells-Dnu4nDoy.js} +1 -1
- package/dist/assets/{chat-display-D_nDPZek.js → chat-display-CpTxtOxb.js} +1 -1
- package/dist/assets/{chat-panel-BktSpl2P.js → chat-panel-B3nmnXWi.js} +1 -1
- package/dist/assets/{chat-ui-C0_KcXrv.js → chat-ui-BjxCdllv.js} +1 -1
- package/dist/assets/{column-preview-CNeXQtKn.js → column-preview-D_CJGSJp.js} +1 -1
- package/dist/assets/{command-palette-CcjZs_TG.js → command-palette-DxTYJO96.js} +1 -1
- package/dist/assets/{common-CWRr25jC.js → common-BaBE_ygg.js} +1 -1
- package/dist/assets/{components-DUd0ki0p.js → components-CvGaLA5d.js} +1 -1
- package/dist/assets/{components-Cj3Al1Y6.js → components-DDdymb5T.js} +1 -1
- package/dist/assets/config-C2lTvbuU.js +1 -0
- package/dist/assets/{datasource-Prn_GWOB.js → datasource-I-LOgxeP.js} +1 -1
- package/dist/assets/{dependency-graph-panel-DUUCij85.js → dependency-graph-panel-C9UUaBId.js} +1 -1
- package/dist/assets/{documentation-panel-CB8xalFX.js → documentation-panel-DMdFXuBf.js} +1 -1
- package/dist/assets/{download-DEJbA1IY.js → download-7bMr0q_N.js} +1 -1
- package/dist/assets/{edit-page-BkHYt2if.js → edit-page-Cyargy5N.js} +4 -4
- package/dist/assets/{error-panel-DG6AtqLR.js → error-panel-iXznkJZ1.js} +1 -1
- package/dist/assets/{file-explorer-panel-Co6MlwYD.js → file-explorer-panel-C_yDXl56.js} +1 -1
- package/dist/assets/{file-icons-BjTIuMQg.js → file-icons-B6DaZdP0.js} +1 -1
- package/dist/assets/{floating-outline-uy6dAsIe.js → floating-outline-DbOtUfo-.js} +1 -1
- package/dist/assets/{focus-0RBjdtZw.js → focus-lmUjuV78.js} +1 -1
- package/dist/assets/{form-DNa2VnwU.js → form-D4sbBaU7.js} +1 -1
- package/dist/assets/{globals-DI5QlXvl.js → globals-CpVAcN9Z.js} +1 -1
- package/dist/assets/{home-page-BSuXANlw.js → home-page-6lENki1m.js} +1 -1
- package/dist/assets/{hooks-B7pYZHjF.js → hooks-B26B49RX.js} +1 -1
- package/dist/assets/{html-to-image-CIu-0LbU.js → html-to-image-CPRGrFLO.js} +1 -1
- package/dist/assets/{index-DySiGerD.js → index-BhMdGN-p.js} +5 -5
- package/dist/assets/{kiosk-mode-Ch75k65P.js → kiosk-mode-Czvj3vmL.js} +1 -1
- package/dist/assets/{layout-DFhJt7oJ.js → layout-C50t7RQF.js} +3 -3
- package/dist/assets/{logs-panel-DR-1BC0S.js → logs-panel-BMAfoMJg.js} +1 -1
- package/dist/assets/{markdown-renderer-DGqYztXR.js → markdown-renderer-CKEFGuRo.js} +1 -1
- package/dist/assets/{name-cell-input-DwfyLq31.js → name-cell-input-Dn6uYwZh.js} +1 -1
- package/dist/assets/{outline-panel-CWunrooQ.js → outline-panel-CkZUQcZ1.js} +1 -1
- package/dist/assets/{packages-panel-BdcXUFQJ.js → packages-panel-CUqt7J6d.js} +1 -1
- package/dist/assets/panels-CbhLLxJW.js +1 -0
- package/dist/assets/{process-output-CS4QGJvL.js → process-output-9W-JyYdE.js} +1 -1
- package/dist/assets/{radio-group-BS2PIEzV.js → radio-group-CrX1YUJ8.js} +1 -1
- package/dist/assets/{readonly-python-code-C5JNX2fu.js → readonly-python-code-DqYAw8-1.js} +1 -1
- package/dist/assets/{reveal-component-PiSHIrbA.js → reveal-component-ll7qNbhl.js} +1 -1
- package/dist/assets/{run-page-BovrPK0f.js → run-page-JsNyhyM9.js} +1 -1
- package/dist/assets/{scratchpad-panel-CAWFveBD.js → scratchpad-panel-DS3OYn5P.js} +1 -1
- package/dist/assets/{session-panel-BR9h5w96.js → session-panel-BMqKXWPA.js} +1 -1
- package/dist/assets/{snippets-panel-Y2etH9Qg.js → snippets-panel-DJ63gDxT.js} +1 -1
- package/dist/assets/{state-1SbOXCLX.js → state-D9EoHCkz.js} +1 -1
- package/dist/assets/{state-Fa6RzVTL.js → state-NEwDS-mc.js} +1 -1
- package/dist/assets/{switch-CTn-kJzM.js → switch-BtkQp293.js} +1 -1
- package/dist/assets/{terminal-DI2XRUUH.js → terminal-CV-XivGh.js} +1 -1
- package/dist/assets/{textarea-wgoQLrBS.js → textarea-BBTcSr-i.js} +1 -1
- package/dist/assets/{tracing-C9PZ0Pr1.js → tracing-886qE50I.js} +1 -1
- package/dist/assets/{tracing-panel-C20Rk6hU.js → tracing-panel-rFRw8uXs.js} +2 -2
- package/dist/assets/{useBoolean-DP3412N2.js → useBoolean-DamyMuo_.js} +1 -1
- package/dist/assets/{useCellActionButton-D_-iAhme.js → useCellActionButton-Z2BNpaPg.js} +1 -1
- package/dist/assets/{useDeleteCell-41mvwiyA.js → useDeleteCell-Cd-d4sq2.js} +1 -1
- package/dist/assets/{useDependencyPanelTab-ELdrL73c.js → useDependencyPanelTab-CFcdGAEr.js} +1 -1
- package/dist/assets/{useNotebookActions-CgN-58GN.js → useNotebookActions-buQjCsjn.js} +1 -1
- package/dist/assets/{useRunCells-CfHlqXY6.js → useRunCells-C0BPo9m1.js} +1 -1
- package/dist/assets/{useSplitCell-gHtyz873.js → useSplitCell-fwbSsYi6.js} +1 -1
- package/dist/assets/{vega-component-BPU1T-x7.js → vega-component-BLse2pH8.js} +1 -1
- package/dist/index.html +26 -26
- package/package.json +1 -1
- package/src/components/editor/chrome/wrapper/footer-items/backend-status.tsx +1 -1
- package/src/core/runtime/__tests__/runtime.test.ts +38 -17
- package/src/core/runtime/runtime.ts +57 -34
- package/src/core/websocket/__tests__/useMarimoKernelConnection.hook.test.tsx +5 -4
- package/src/core/websocket/__tests__/useMarimoKernelConnection.test.ts +18 -54
- package/src/core/websocket/transports/__tests__/ws.test.ts +125 -0
- package/src/core/websocket/transports/basic.ts +1 -3
- package/src/core/websocket/transports/transport.ts +0 -1
- package/src/core/websocket/transports/ws.ts +94 -0
- package/src/core/websocket/useMarimoKernelConnection.tsx +30 -26
- package/src/core/websocket/useWebSocket.tsx +3 -18
- package/dist/assets/config-DGudsRYK.js +0 -1
- package/dist/assets/panels-CJ1t18_z.js +0 -1
|
@@ -4,50 +4,22 @@ import { afterEach, describe, expect, it, vi } from "vitest";
|
|
|
4
4
|
import { Logger } from "@/utils/Logger";
|
|
5
5
|
import { WebSocketClosedReason, WebSocketState } from "../types";
|
|
6
6
|
import { classifyCloseEvent } from "../useMarimoKernelConnection";
|
|
7
|
-
import { MAX_RETRIES } from "../useWebSocket";
|
|
8
7
|
|
|
9
|
-
function classify(
|
|
10
|
-
|
|
11
|
-
retryCount = 0,
|
|
12
|
-
maxRetries = MAX_RETRIES,
|
|
13
|
-
) {
|
|
14
|
-
return classifyCloseEvent({ reason }, { retryCount, maxRetries });
|
|
8
|
+
function classify(reason: string | undefined) {
|
|
9
|
+
return classifyCloseEvent({ reason });
|
|
15
10
|
}
|
|
16
11
|
|
|
17
12
|
describe("classifyCloseEvent", () => {
|
|
18
13
|
describe("transient closes (default branch)", () => {
|
|
19
|
-
it("retries
|
|
20
|
-
const decision = classify(undefined
|
|
14
|
+
it("retries on empty/undefined reason", () => {
|
|
15
|
+
const decision = classify(undefined);
|
|
21
16
|
expect(decision.kind).toBe("retry");
|
|
22
17
|
expect(decision.status).toEqual({ state: WebSocketState.CONNECTING });
|
|
23
18
|
});
|
|
24
19
|
|
|
25
|
-
it("retries on each intermediate close event during a retry storm", () => {
|
|
26
|
-
for (let n = 0; n < MAX_RETRIES; n++) {
|
|
27
|
-
const decision = classify(undefined, n);
|
|
28
|
-
expect(decision.kind).toBe("retry");
|
|
29
|
-
expect(decision.status).toEqual({ state: WebSocketState.CONNECTING });
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
it("transitions to CLOSED when retryCount reaches maxRetries", () => {
|
|
34
|
-
const decision = classify(undefined, MAX_RETRIES);
|
|
35
|
-
expect(decision.kind).toBe("gave-up");
|
|
36
|
-
expect(decision.status).toEqual({
|
|
37
|
-
state: WebSocketState.CLOSED,
|
|
38
|
-
code: WebSocketClosedReason.KERNEL_DISCONNECTED,
|
|
39
|
-
reason: "kernel not found",
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it("transitions to CLOSED when retryCount exceeds maxRetries", () => {
|
|
44
|
-
const decision = classify(undefined, MAX_RETRIES + 5);
|
|
45
|
-
expect(decision.kind).toBe("gave-up");
|
|
46
|
-
});
|
|
47
|
-
|
|
48
20
|
it("treats unknown reason strings as transient and logs a warning", () => {
|
|
49
21
|
const logger = vi.spyOn(Logger, "warn").mockImplementation(() => {});
|
|
50
|
-
const decision = classify("something-else"
|
|
22
|
+
const decision = classify("something-else");
|
|
51
23
|
expect(decision.kind).toBe("retry");
|
|
52
24
|
expect(logger).toHaveBeenCalled();
|
|
53
25
|
logger.mockRestore();
|
|
@@ -60,7 +32,7 @@ describe("classifyCloseEvent", () => {
|
|
|
60
32
|
|
|
61
33
|
describe("terminal closes (server-initiated)", () => {
|
|
62
34
|
it("MARIMO_ALREADY_CONNECTED → terminal + closeTransport, with takeover", () => {
|
|
63
|
-
const decision = classify("MARIMO_ALREADY_CONNECTED"
|
|
35
|
+
const decision = classify("MARIMO_ALREADY_CONNECTED");
|
|
64
36
|
expect(decision.kind).toBe("terminal");
|
|
65
37
|
expect(decision.status).toMatchObject({
|
|
66
38
|
state: WebSocketState.CLOSED,
|
|
@@ -79,7 +51,7 @@ describe("classifyCloseEvent", () => {
|
|
|
79
51
|
"MARIMO_NO_SESSION",
|
|
80
52
|
"MARIMO_SHUTDOWN",
|
|
81
53
|
])("%s → terminal with KERNEL_DISCONNECTED, closes transport", (reason) => {
|
|
82
|
-
const decision = classify(reason
|
|
54
|
+
const decision = classify(reason);
|
|
83
55
|
expect(decision.kind).toBe("terminal");
|
|
84
56
|
expect(decision.status).toMatchObject({
|
|
85
57
|
state: WebSocketState.CLOSED,
|
|
@@ -91,7 +63,7 @@ describe("classifyCloseEvent", () => {
|
|
|
91
63
|
});
|
|
92
64
|
|
|
93
65
|
it("MARIMO_MALFORMED_QUERY → terminal but does NOT close transport", () => {
|
|
94
|
-
const decision = classify("MARIMO_MALFORMED_QUERY"
|
|
66
|
+
const decision = classify("MARIMO_MALFORMED_QUERY");
|
|
95
67
|
expect(decision.kind).toBe("terminal");
|
|
96
68
|
expect(decision.status).toMatchObject({
|
|
97
69
|
state: WebSocketState.CLOSED,
|
|
@@ -103,7 +75,7 @@ describe("classifyCloseEvent", () => {
|
|
|
103
75
|
});
|
|
104
76
|
|
|
105
77
|
it("MARIMO_KERNEL_STARTUP_ERROR → terminal + closeTransport", () => {
|
|
106
|
-
const decision = classify("MARIMO_KERNEL_STARTUP_ERROR"
|
|
78
|
+
const decision = classify("MARIMO_KERNEL_STARTUP_ERROR");
|
|
107
79
|
expect(decision.kind).toBe("terminal");
|
|
108
80
|
expect(decision.status).toMatchObject({
|
|
109
81
|
state: WebSocketState.CLOSED,
|
|
@@ -113,25 +85,17 @@ describe("classifyCloseEvent", () => {
|
|
|
113
85
|
expect(decision.closeTransport).toBe(true);
|
|
114
86
|
}
|
|
115
87
|
});
|
|
116
|
-
|
|
117
|
-
it("terminal closes ignore retryCount entirely", () => {
|
|
118
|
-
const decision = classify("MARIMO_SHUTDOWN", 99);
|
|
119
|
-
expect(decision.kind).toBe("terminal");
|
|
120
|
-
});
|
|
121
88
|
});
|
|
122
89
|
|
|
123
|
-
describe("
|
|
124
|
-
it("
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
...Array.from({ length: MAX_RETRIES }, () => "retry"),
|
|
133
|
-
"gave-up",
|
|
134
|
-
]);
|
|
90
|
+
describe("transport exhaustion", () => {
|
|
91
|
+
it("MARIMO_TRANSPORT_EXHAUSTED → gave-up with KERNEL_DISCONNECTED", () => {
|
|
92
|
+
const decision = classify("MARIMO_TRANSPORT_EXHAUSTED");
|
|
93
|
+
expect(decision.kind).toBe("gave-up");
|
|
94
|
+
expect(decision.status).toEqual({
|
|
95
|
+
state: WebSocketState.CLOSED,
|
|
96
|
+
code: WebSocketClosedReason.KERNEL_DISCONNECTED,
|
|
97
|
+
reason: "kernel not found",
|
|
98
|
+
});
|
|
135
99
|
});
|
|
136
100
|
});
|
|
137
101
|
});
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
4
|
+
import { MAX_RETRIES, WsTransport, TRANSPORT_EXHAUSTED_REASON } from "../ws";
|
|
5
|
+
|
|
6
|
+
let innerListeners: Record<string, ((e: unknown) => void)[]>;
|
|
7
|
+
|
|
8
|
+
vi.mock("partysocket/ws", () => {
|
|
9
|
+
class FakeReconnectingWebSocket {
|
|
10
|
+
retryCount = 0;
|
|
11
|
+
readyState = WebSocket.CONNECTING;
|
|
12
|
+
constructor() {
|
|
13
|
+
innerListeners = { open: [], close: [], message: [], error: [] };
|
|
14
|
+
}
|
|
15
|
+
addEventListener(event: string, cb: (e: unknown) => void) {
|
|
16
|
+
innerListeners[event].push(cb);
|
|
17
|
+
}
|
|
18
|
+
removeEventListener(event: string, cb: (e: unknown) => void) {
|
|
19
|
+
innerListeners[event] = innerListeners[event].filter((c) => c !== cb);
|
|
20
|
+
}
|
|
21
|
+
reconnect() {}
|
|
22
|
+
close() {}
|
|
23
|
+
send() {}
|
|
24
|
+
}
|
|
25
|
+
return { default: FakeReconnectingWebSocket };
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
interface FakeReconnectingWebSocket {
|
|
29
|
+
retryCount: number;
|
|
30
|
+
readyState: number;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function dispatchClose(reason = "") {
|
|
34
|
+
const evt = new CloseEvent("close", { reason, code: 1006 });
|
|
35
|
+
for (const cb of innerListeners.close) {
|
|
36
|
+
cb(evt);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
describe("WsTransport", () => {
|
|
41
|
+
let transport: WsTransport;
|
|
42
|
+
let inner: FakeReconnectingWebSocket;
|
|
43
|
+
|
|
44
|
+
beforeEach(() => {
|
|
45
|
+
transport = new WsTransport(() => "ws://example.invalid/ws");
|
|
46
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
47
|
+
inner = (transport as any).inner;
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
describe("close event reason", () => {
|
|
51
|
+
it("forwards the original reason before retry budget is exhausted", () => {
|
|
52
|
+
const seen: CloseEvent[] = [];
|
|
53
|
+
transport.addEventListener("close", (e) => seen.push(e));
|
|
54
|
+
|
|
55
|
+
inner.retryCount = MAX_RETRIES - 1;
|
|
56
|
+
dispatchClose("");
|
|
57
|
+
|
|
58
|
+
expect(seen).toHaveLength(1);
|
|
59
|
+
expect(seen[0].reason).toBe("");
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it("rewrites reason to MARIMO_TRANSPORT_EXHAUSTED on exhaustion", () => {
|
|
63
|
+
const seen: CloseEvent[] = [];
|
|
64
|
+
transport.addEventListener("close", (e) => seen.push(e));
|
|
65
|
+
|
|
66
|
+
inner.retryCount = MAX_RETRIES;
|
|
67
|
+
dispatchClose("");
|
|
68
|
+
|
|
69
|
+
expect(seen).toHaveLength(1);
|
|
70
|
+
expect(seen[0].reason).toBe(TRANSPORT_EXHAUSTED_REASON);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it("does not rewrite a server-sent reason on exhaustion", () => {
|
|
74
|
+
// If partysocket happens to deliver a real MARIMO_* reason at the same
|
|
75
|
+
// moment the retry budget exhausts, the exhausted-state rewrite still
|
|
76
|
+
// wins because the wrapper keys off retryCount, not the original reason.
|
|
77
|
+
// Document the behavior so a future change is deliberate.
|
|
78
|
+
const seen: CloseEvent[] = [];
|
|
79
|
+
transport.addEventListener("close", (e) => seen.push(e));
|
|
80
|
+
|
|
81
|
+
inner.retryCount = MAX_RETRIES;
|
|
82
|
+
dispatchClose("MARIMO_SHUTDOWN");
|
|
83
|
+
|
|
84
|
+
expect(seen[0].reason).toBe(TRANSPORT_EXHAUSTED_REASON);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
describe("addEventListener dedupe", () => {
|
|
89
|
+
it("does not double-fire when the same close listener is added twice", () => {
|
|
90
|
+
const cb = vi.fn();
|
|
91
|
+
transport.addEventListener("close", cb);
|
|
92
|
+
transport.addEventListener("close", cb);
|
|
93
|
+
|
|
94
|
+
dispatchClose("");
|
|
95
|
+
|
|
96
|
+
expect(cb).toHaveBeenCalledTimes(1);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it("a single removeEventListener fully unregisters a duplicated add", () => {
|
|
100
|
+
const cb = vi.fn();
|
|
101
|
+
transport.addEventListener("close", cb);
|
|
102
|
+
transport.addEventListener("close", cb);
|
|
103
|
+
transport.removeEventListener("close", cb);
|
|
104
|
+
|
|
105
|
+
dispatchClose("");
|
|
106
|
+
|
|
107
|
+
expect(cb).not.toHaveBeenCalled();
|
|
108
|
+
// Inner socket has no orphaned wrappers left.
|
|
109
|
+
expect(innerListeners.close).toHaveLength(0);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
describe("removeEventListener", () => {
|
|
114
|
+
it("unregisters the right wrapper for close listeners", () => {
|
|
115
|
+
const cb = vi.fn();
|
|
116
|
+
transport.addEventListener("close", cb);
|
|
117
|
+
transport.removeEventListener("close", cb);
|
|
118
|
+
|
|
119
|
+
inner.retryCount = MAX_RETRIES;
|
|
120
|
+
dispatchClose("");
|
|
121
|
+
|
|
122
|
+
expect(cb).not.toHaveBeenCalled();
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
});
|
|
@@ -43,9 +43,7 @@ export class BasicTransport implements IConnectionTransport {
|
|
|
43
43
|
return WebSocket.OPEN;
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
reconnect(code?: number | undefined, reason?: string | undefined): void {
|
|
46
|
+
reconnect(_code?: number | undefined, _reason?: string | undefined): void {
|
|
49
47
|
this.close();
|
|
50
48
|
this.connect();
|
|
51
49
|
return;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import ReconnectingWebSocket from "partysocket/ws";
|
|
4
|
+
import type {
|
|
5
|
+
ConnectionEvent,
|
|
6
|
+
ConnectionTransportCallback,
|
|
7
|
+
IConnectionTransport,
|
|
8
|
+
} from "./transport";
|
|
9
|
+
|
|
10
|
+
// Per-`reconnect()` retry budget. After exhaustion, partysocket stops silently;
|
|
11
|
+
// the wrapper rewrites the close-event reason to surface the give-up.
|
|
12
|
+
export const MAX_RETRIES = 10;
|
|
13
|
+
|
|
14
|
+
export const TRANSPORT_EXHAUSTED_REASON = "MARIMO_TRANSPORT_EXHAUSTED";
|
|
15
|
+
|
|
16
|
+
export class WsTransport implements IConnectionTransport {
|
|
17
|
+
private inner: ReconnectingWebSocket;
|
|
18
|
+
private closeWrappers = new WeakMap<
|
|
19
|
+
ConnectionTransportCallback<"close">,
|
|
20
|
+
ConnectionTransportCallback<"close">
|
|
21
|
+
>();
|
|
22
|
+
|
|
23
|
+
constructor(urlProvider: () => string) {
|
|
24
|
+
this.inner = new ReconnectingWebSocket(urlProvider, undefined, {
|
|
25
|
+
maxRetries: MAX_RETRIES,
|
|
26
|
+
debug: false,
|
|
27
|
+
startClosed: true,
|
|
28
|
+
// long timeout — the server can become slow when many notebooks are open.
|
|
29
|
+
connectionTimeout: 10_000,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
get readyState(): WebSocket["readyState"] {
|
|
34
|
+
return this.inner.readyState as WebSocket["readyState"];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
reconnect(code?: number, reason?: string): void {
|
|
38
|
+
this.inner.reconnect(code, reason);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
close(): void {
|
|
42
|
+
this.inner.close();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
send(data: string | ArrayBuffer | Blob | ArrayBufferView): void {
|
|
46
|
+
this.inner.send(data);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
addEventListener<T extends ConnectionEvent>(
|
|
50
|
+
event: T,
|
|
51
|
+
callback: ConnectionTransportCallback<T>,
|
|
52
|
+
): void {
|
|
53
|
+
if (event === "close") {
|
|
54
|
+
const userCb = callback as ConnectionTransportCallback<"close">;
|
|
55
|
+
// Match native EventTarget dedupe: a second addEventListener with the
|
|
56
|
+
// same listener is a no-op. Without this, repeated adds leak wrappers
|
|
57
|
+
// on the inner socket and double-fire on close.
|
|
58
|
+
if (this.closeWrappers.has(userCb)) return;
|
|
59
|
+
const wrapper: ConnectionTransportCallback<"close"> = (e) => {
|
|
60
|
+
if (this.inner.retryCount >= MAX_RETRIES) {
|
|
61
|
+
userCb(
|
|
62
|
+
new CloseEvent("close", {
|
|
63
|
+
code: e.code,
|
|
64
|
+
reason: TRANSPORT_EXHAUSTED_REASON,
|
|
65
|
+
wasClean: e.wasClean,
|
|
66
|
+
}),
|
|
67
|
+
);
|
|
68
|
+
} else {
|
|
69
|
+
userCb(e);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
this.closeWrappers.set(userCb, wrapper);
|
|
73
|
+
this.inner.addEventListener("close", wrapper);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
this.inner.addEventListener(event, callback as never);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
removeEventListener<T extends ConnectionEvent>(
|
|
80
|
+
event: T,
|
|
81
|
+
callback: ConnectionTransportCallback<T>,
|
|
82
|
+
): void {
|
|
83
|
+
if (event === "close") {
|
|
84
|
+
const userCb = callback as ConnectionTransportCallback<"close">;
|
|
85
|
+
const wrapper = this.closeWrappers.get(userCb);
|
|
86
|
+
if (wrapper) {
|
|
87
|
+
this.closeWrappers.delete(userCb);
|
|
88
|
+
this.inner.removeEventListener("close", wrapper);
|
|
89
|
+
}
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
this.inner.removeEventListener(event, callback as never);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -11,10 +11,8 @@ import type {
|
|
|
11
11
|
NotificationMessageData,
|
|
12
12
|
NotificationPayload,
|
|
13
13
|
} from "@/core/kernel/messages";
|
|
14
|
-
import {
|
|
15
|
-
|
|
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
|
|
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
|
-
|
|
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.
|
|
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
|
-
//
|
|
35
|
-
|
|
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
|
/**
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var g=Object.defineProperty;var O=(t,e,r)=>e in t?g(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var m=(t,e,r)=>O(t,typeof e!="symbol"?e+"":e,r);import{i as S,l as y,n as C,o as A,p as i,u as I}from"./useEvent-D91BmmQi.js";import{t as _}from"./compiler-runtime-B3qBwwSJ.js";import{_ as c}from"./useEventListener-DvoEXWke.js";import{t as D}from"./invariant-BUdrueMv.js";import{t as P}from"./utils-Wvjk_Y4h.js";import{r as u}from"./constants-DMpttj8Q.js";import{t as b}from"./Deferred-DWBqOhWa.js";import{t as R}from"./session-DGdfs0bJ.js";function L(){return typeof document<"u"&&document.querySelector("marimo-wasm")!==null}const n={NOT_STARTED:"NOT_STARTED",CONNECTING:"CONNECTING",OPEN:"OPEN",CLOSING:"CLOSING",CLOSED:"CLOSED"},k={KERNEL_DISCONNECTED:"KERNEL_DISCONNECTED",ALREADY_RUNNING:"ALREADY_RUNNING",MALFORMED_QUERY:"MALFORMED_QUERY",KERNEL_STARTUP_ERROR:"KERNEL_STARTUP_ERROR"},o=i({state:n.NOT_STARTED});function v(){return A(o,t=>t.state===n.OPEN)}const G=i(t=>t(o).state===n.CONNECTING);i(t=>t(o).state===n.OPEN);const W=i(t=>{let e=t(o);return e.state===n.OPEN||e.state===n.NOT_STARTED}),H=i(t=>t(o).state===n.CLOSED),M=i(t=>t(o).state===n.NOT_STARTED);function $(t){return t===n.CLOSED}function z(t){return t===n.CONNECTING}function F(t){return t===n.OPEN}function j(t){return t===n.CLOSING}function N(t){return t===n.NOT_STARTED}function B(t){return t===n.CLOSED||t===n.CLOSING||t===n.CONNECTING}function K(t){switch(t){case n.CLOSED:return"App disconnected";case n.CONNECTING:return"Connecting to a runtime ...";case n.CLOSING:return"App disconnecting...";case n.OPEN:return"";case n.NOT_STARTED:return"Click to connect to a runtime";default:return""}}function Y(t){if(typeof t!="object"||!t||Array.isArray(t))return!1;for(let e of Object.values(t))if(typeof e!="string")return!1;return!0}function x(t){if(typeof t!="object"||!t||Array.isArray(t))return!1;let e=t;return!(!Y(e.files)||e.modelNotifications!==void 0&&!Array.isArray(e.modelNotifications))}function f(){let t=typeof window>"u"?void 0:window.__MARIMO_STATIC__;return x(t)?t:void 0}function E(){return f()!==void 0}function q(){let t=f();return D(t!==void 0,"Not a static notebook"),t.files}function Q(){var t;return(t=f())==null?void 0:t.modelNotifications}var V=class{constructor(t,e=!1){m(this,"initialHealthyCheck",new b);this.config=t,this.lazy=e;try{new URL(this.config.url)}catch(r){throw Error(`Invalid runtime URL: ${this.config.url}. ${r instanceof Error?r.message:"Unknown error"}`,{cause:r})}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}formatHttpURL(t,e,r=!0){t||(t="");let a=this.httpURL,s=new URLSearchParams(window.location.search);if(e)for(let[h,l]of e.entries())a.searchParams.set(h,l);for(let[h,l]of s.entries())r&&!Object.values(u).includes(h)||a.searchParams.set(h,l);return a.pathname=`${a.pathname.replace(/\/$/,"")}/${t.replace(/^\//,"")}`,a.hash="",a}formatWsURL(t,e){let r=this.formatHttpURL(t,e,!1);return!this.isSameOrigin&&this.config.authToken&&r.searchParams.set(u.accessToken,this.config.authToken),J(r.toString())}getWsURL(t){let e=new URL(this.config.url),r=new URLSearchParams(e.search);return new URLSearchParams(window.location.search).forEach((a,s)=>{r.has(s)||r.set(s,a)}),r.set(u.sessionId,t),this.formatWsURL("/ws",r)}getWsSyncURL(t){let e=new URL(this.config.url),r=new URLSearchParams(e.search);return new URLSearchParams(window.location.search).forEach((a,s)=>{r.has(s)||r.set(s,a)}),r.set(u.sessionId,t),this.formatWsURL("/ws_sync",r)}getTerminalWsURL(){return this.formatWsURL("/terminal/ws")}getLSPURL(t){if(t==="copilot"){let e=this.formatWsURL(`/lsp/${t}`),r=e.searchParams.get(u.accessToken);return e.search="",r&&e.searchParams.set(u.accessToken,r),e}return this.formatWsURL(`/lsp/${t}`)}getAiURL(t){return this.formatHttpURL(`/api/ai/${t}`)}healthURL(){return this.formatHttpURL("/health")}async isHealthy(){if(L()||P()||E())return!0;try{let t=await fetch(this.healthURL().toString());if(t.redirected){c.debug(`Runtime redirected to ${t.url}`);let r=new URL(t.url);r.pathname=r.pathname.replace(/\/health$/,""),this.config.url=r.toString()}let e=t.ok;return e&&this.setDOMBaseUri(this.config.url),e}catch(t){return c.error(`Failed to check health: ${t instanceof Error?t.message:"Unknown error"}`,{cause:t}),!1}}setDOMBaseUri(t){t=t.split("?",1)[0],t.endsWith("/")||(t+="/");let e=document.querySelector("base");e?e.setAttribute("href",t):(e=document.createElement("base"),e.setAttribute("href",t),document.head.append(e))}async init(t){c.debug("Initializing runtime...");let e=0;for(;!await this.isHealthy();){if(e>=25){c.error("Failed to connect after 25 retries"),this.initialHealthyCheck.reject(Error("Failed to connect after 25 retries"));return}if(!(t!=null&&t.disableRetryDelay)){let r=Math.min(100*1.2**e,2e3);await new Promise(a=>setTimeout(a,r))}e++}c.debug("Runtime is healthy"),this.initialHealthyCheck.resolve()}async waitForHealthy(){return this.initialHealthyCheck.promise}headers(){let t={"Marimo-Session-Id":R(),"Marimo-Server-Token":this.config.serverToken??"","x-runtime-url":this.httpURL.toString()};return this.config.authToken&&(t.Authorization=`Bearer ${this.config.authToken}`),t}sessionHeaders(){return{"Marimo-Session-Id":R()}}};function J(t){if(!t.startsWith("http")){c.warn(`URL must start with http: ${t}`);let e=new URL(t);return e.protocol="ws",e}return new URL(t.replace(/^http/,"ws"))}var X=_();function Z(){let t=new URL(document.baseURI);return t.search="",t.hash="",t.toString()}const p={lazy:!0,url:Z()},U=i(p);var d=i(t=>{let e=t(U);return new V(e,e.lazy)});function w(){return I(d)}function tt(){let t=(0,X.c)(4),e=w(),[r,a]=y(o),s;return t[0]!==r.state||t[1]!==e||t[2]!==a?(s=async()=>{N(r.state)?(a({state:n.CONNECTING}),await e.init()):c.log("Runtime already started or starting...")},t[0]=r.state,t[1]=e,t[2]=a,t[3]=s):s=t[3],C(s)}function T(){return S.get(d)}function et(t){if(t.startsWith("http"))return new URL(t);let e=T().httpURL.toString();return e.startsWith("blob:")&&(e=e.replace("blob:","")),new URL(t,e)}export{k as C,v as S,L as T,W as _,tt as a,G as b,q as c,$ as d,j as f,N as g,B as h,U as i,E as l,z as m,et as n,w as o,F as p,T as r,Q as s,p as t,K as u,o as v,n as w,M as x,H as y};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var WA=Object.defineProperty;var qA=(a,A,e)=>A in a?WA(a,A,{enumerable:!0,configurable:!0,writable:!0,value:e}):a[A]=e;var iA=(a,A,e)=>qA(a,typeof A!="symbol"?A+"":A,e);import{s as YA}from"./chunk-LvLJmgfZ.js";import{d as L,i as fA,l as pA,u as b}from"./useEvent-D91BmmQi.js";import{t as XA}from"./react-Bj1aDYRI.js";import{A as JA,B as zA,D as xA,Gt as $A,I as Ae,Kt as ee,Li as ae,Ln as te,Nr as Ge,R as oe,Rr as wA,T as se,Ui as ne,Wt as re,at as ke,b as ie,g as le,h as lA,it as Re,l as ce,qt as Ze,st as DA,ut as ge,wn as de,yn as he}from"./cells-DbE28H1u.js";import{t as B}from"./compiler-runtime-B3qBwwSJ.js";import{C as ue,_ as Be,b as me,c as Ye,h as fe,i as pe,m as xe,n as we,o as O,r as De,s as Ee,t as ve,x as ye,y as Ce}from"./state-Fa6RzVTL.js";import{_ as D,d as EA,t as be}from"./useEventListener-DvoEXWke.js";import{C as Ne,b as Me}from"./utils-Wvjk_Y4h.js";import{r as RA}from"./constants-DMpttj8Q.js";import{C as v,T as cA,d as _e,l as vA,o as Se,v as je,w as Y}from"./config-DGudsRYK.js";import{n as Fe,o as Qe}from"./switch-CTn-kJzM.js";import{n as Le}from"./ErrorBoundary-DyYDV0HI.js";import{n as Oe,t as f}from"./cn-DCUzRj2J.js";import{t as Pe}from"./jsx-runtime-BqBOg78p.js";import{a as Te,n as Ie}from"./fullscreen-eipL3i3Y.js";import{_ as Ke,f as He,g as Ue,h as yA,m as CA,p as bA,v as NA,y as Ve}from"./alert-dialog-BqFLkbUc.js";import{dt as We,ft as qe,st as MA}from"./JsonOutput-Dxol3ZtH.js";import{h as Xe}from"./download-DEJbA1IY.js";import{t as ZA}from"./tooltip-DTV9tlSr.js";import{t as gA}from"./button-BbCh-29a.js";import{t as Je}from"./createReducer-CI9qeK_X.js";import{i as _A}from"./strings-wdPMRf6Z.js";import{t as ze}from"./requests-DIwGYs0l.js";import{t as J}from"./createLucideIcon-D5guW7EU.js";import{N as $e,P as SA,a as Aa,i as jA,n as ea,o as aa,s as ta}from"./layout-DFhJt7oJ.js";import{o as Ga,r as oa,s as sa}from"./state-dx303w7J.js";import{c as na}from"./markdown-renderer-DGqYztXR.js";import{n as ra}from"./spinner-UuZAUjoP.js";import{i as ka,n as ia}from"./readonly-python-code-C5JNX2fu.js";import{t as la}from"./uuid-D_zLHhNi.js";import{t as z}from"./use-toast-ERM44-k9.js";import{i as Ra}from"./session-DGdfs0bJ.js";import{t as ca}from"./RenderHTML-Dz1OIbOh.js";import{r as FA}from"./share-oorMPghT.js";import{r as dA}from"./errors-iwK4b4VF.js";import{s as Za}from"./react-icons.esm--O4lBTlZ.js";import{r as QA}from"./events-CBm-hwqS.js";import{i as ga}from"./cell-link-pRI-YfIp.js";import{t as da}from"./error-banner-CLO6LFll.js";import{n as ha}from"./useAsyncData-C5i0IRVM.js";import{t as ua}from"./requests-DqJEWJ-Q.js";import{t as Ba}from"./request-registry-DKAymYdP.js";import{t as ma}from"./ws-Cb8IUKlU.js";import{n as Ya}from"./types-DZmRsGZN.js";import{n as fa}from"./runs-Cn-NiTzH.js";var pa=J("hourglass",[["path",{d:"M5 22h14",key:"ehvnwv"}],["path",{d:"M5 2h14",key:"pdyrp9"}],["path",{d:"M17 22v-4.172a2 2 0 0 0-.586-1.414L12 12l-4.414 4.414A2 2 0 0 0 7 17.828V22",key:"1d314k"}],["path",{d:"M7 2v4.172a2 2 0 0 0 .586 1.414L12 12l4.414-4.414A2 2 0 0 0 17 6.172V2",key:"1vvvr6"}]]),LA=J("menu",[["path",{d:"M4 5h16",key:"1tepv9"}],["path",{d:"M4 12h16",key:"1lakjw"}],["path",{d:"M4 19h16",key:"1djgab"}]]),xa=J("square-arrow-right",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M8 12h8",key:"1wcyev"}],["path",{d:"m12 16 4-4-4-4",key:"1i9zcv"}]]),wa=J("unlink",[["path",{d:"m18.84 12.25 1.72-1.71h-.02a5.004 5.004 0 0 0-.12-7.07 5.006 5.006 0 0 0-6.95 0l-1.72 1.71",key:"yqzxt4"}],["path",{d:"m5.17 11.75-1.71 1.71a5.004 5.004 0 0 0 .12 7.07 5.006 5.006 0 0 0 6.95 0l1.71-1.71",key:"4qinb0"}],["line",{x1:"8",x2:"8",y1:"2",y2:"5",key:"1041cp"}],["line",{x1:"2",x2:"5",y1:"8",y2:"8",key:"14m1p5"}],["line",{x1:"16",x2:"16",y1:"19",y2:"22",key:"rzdirn"}],["line",{x1:"19",x2:"22",y1:"16",y2:"16",key:"ox905f"}]]),Da=B(),k=YA(Pe(),1);const Ea=a=>{let A=(0,Da.c)(10),{reason:e,canTakeover:t}=a,G=t===void 0?!1:t,o=va;if(G){let R;A[0]===Symbol.for("react.memo_cache_sentinel")?(R=(0,k.jsx)("div",{className:"flex justify-between",children:(0,k.jsx)("span",{className:"font-bold text-xl flex items-center mb-2",children:"Notebook already connected"})}),A[0]=R):R=A[0];let n;A[1]===e?n=A[2]:(n=(0,k.jsx)("span",{children:e}),A[1]=e,A[2]=n);let r;A[3]===G?r=A[4]:(r=G&&(0,k.jsxs)(gA,{onClick:o,variant:"outline","data-testid":"takeover-button",className:"shrink-0",children:[(0,k.jsx)(xa,{className:"w-4 h-4 mr-2"}),"Take over session"]}),A[3]=G,A[4]=r);let i;return A[5]!==n||A[6]!==r?(i=(0,k.jsx)("div",{className:"flex justify-center",children:(0,k.jsxs)(da,{kind:"info",className:"mt-10 flex flex-col rounded p-3 max-w-[800px] mx-4",children:[R,(0,k.jsxs)("div",{className:"flex justify-between items-end text-base gap-20",children:[n,r]})]})}),A[5]=n,A[6]=r,A[7]=i):i=A[7],i}let s;return A[8]===e?s=A[9]:(s=(0,k.jsx)("div",{className:"font-mono text-center text-base text-(--red-11)",children:(0,k.jsx)("p",{children:e})}),A[8]=e,A[9]=s),s};async function va(){try{let a=new URL(window.location.href).searchParams;await Fe.post(`/kernel/takeover?${a.toString()}`,{}),FA()}catch(a){z({title:"Failed to take over session",description:dA(a),variant:"danger"})}}var ya=B(),m=YA(XA(),1);const Ca=a=>{let A=(0,ya.c)(8),{connection:e,className:t,children:G}=a,o;A[0]!==e.canTakeover||A[1]!==e.reason||A[2]!==e.state?(o=e.state===Y.CLOSED&&(0,k.jsx)(Ea,{reason:e.reason,canTakeover:e.canTakeover}),A[0]=e.canTakeover,A[1]=e.reason,A[2]=e.state,A[3]=o):o=A[3];let s;return A[4]!==G||A[5]!==t||A[6]!==o?(s=(0,k.jsxs)("div",{className:t,children:[G,o]}),A[4]=G,A[5]=t,A[6]=o,A[7]=s):s=A[7],s};var ba=B();const Na=a=>{let A=(0,ba.c)(10),{title:e}=a,[t,G]=(0,m.useState)(e),[o,s]=(0,m.useState)(!0),R,n;A[0]!==t||A[1]!==e?(R=()=>{if(e!==t){s(!1);let g=setTimeout(()=>{G(e),s(!0)},300);return()=>clearTimeout(g)}},n=[e,t],A[0]=t,A[1]=e,A[2]=R,A[3]=n):(R=A[2],n=A[3]),(0,m.useEffect)(R,n);let r;A[4]===Symbol.for("react.memo_cache_sentinel")?(r=(0,k.jsx)(ra,{className:"size-20 animate-spin text-primary","data-testid":"large-spinner",strokeWidth:1}),A[4]=r):r=A[4];let i=o?"opacity-100":"opacity-0",l;A[5]===i?l=A[6]:(l=f("mt-2 text-muted-foreground font-semibold text-lg transition-opacity duration-300",i),A[5]=i,A[6]=l);let Z;return A[7]!==t||A[8]!==l?(Z=(0,k.jsxs)("div",{className:"flex flex-col h-full flex-1 items-center justify-center p-4",children:[r,(0,k.jsx)("div",{className:l,children:t})]}),A[7]=t,A[8]=l,A[9]=Z):Z=A[9],Z};var hA=B();const Ma=a=>{let A=(0,hA.c)(2),{children:e}=a;if(!cA())return e;let t;return A[0]===e?t=A[1]:(t=(0,k.jsx)(_a,{children:e}),A[0]=e,A[1]=t),t};var _a=a=>{let A=(0,hA.c)(9),{children:e}=a,t;A[0]===Symbol.for("react.memo_cache_sentinel")?(t=[],A[0]=t):t=A[0];let{error:G}=ha(Qa,t),o=b(le),s=b(Be),R;A[1]!==o||A[2]!==s?(R=ja({hasCells:o,hasOutput:s,mode:ke(),codeHidden:Sa()}),A[1]=o,A[2]=s,A[3]=R):R=A[3];let n=R,r=(0,m.useRef)(!1),i,l;if(A[4]!==G||A[5]!==n?(i=()=>{G&&!n&&!r.current&&(r.current=!0,D.error("Pyodide failed to initialize",G),z({title:"Failed to start the notebook runtime",description:dA(G),variant:"danger"}))},l=[G,n],A[4]=G,A[5]=n,A[6]=i,A[7]=l):(i=A[6],l=A[7]),(0,m.useEffect)(i,l),G&&n)throw G;if(n){let Z;return A[8]===Symbol.for("react.memo_cache_sentinel")?(Z=(0,k.jsx)(Fa,{}),A[8]=Z):Z=A[8],Z}return e};function Sa(){return Ra(RA.showCode,"false")||!fA.get(Qe)}function ja(a){let{hasCells:A,hasOutput:e,mode:t,codeHidden:G}=a;return A?!e&&t==="read"&&G:!0}const Fa=a=>{let A=(0,hA.c)(2),e=b(Ce),t;return A[0]===e?t=A[1]:(t=(0,k.jsx)(Na,{title:e}),A[0]=e,A[1]=t),t};async function Qa(){return await xe.INSTANCE.initialized.promise,!0}var La={idle:"./favicon.ico",success:"data:image/x-icon;base64,AAABAAEAMDAAAAEACACoDgAAFgAAACgAAAAwAAAAYAAAAAEACAAAAAAAAAkAAAAAAAAAAAAAAAEAAAABAAAAAAAAXXQAAFd3AwBWeAQAVngEAFd4AwBXeAQAVnkEAFh3AwBXdwQAVXcGAFd4BQBXeAQAWHgEAFd6AwBXeAMAVnkEAFZ5AwBXdwQAV3cFAFd4BABYeAQAV3gEAFh4BABXeAQA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMEBQYYGAYFBAMCAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgcYGBgYGBgYGBgYGBgYGAcCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgJGBgYGBgYGBgYGBgYGBgYGBgYCQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKBBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgECgAAAAAAAAAAAAAAAAAAAAAAAAAAAAsYGBgYGBgYDA0OChkZGRkKDg0MGBgYGBgYGAsAAAAAAAAAAAAAAAAAAAAAAAAAAxgYGBgYGA8QGRkZGRkZGRkZGRkZEA8YGBgYGBgDAAAAAAAAAAAAAAAAAAAAAAARGBgYGBgSChkZGRkZGRkZGRkZGRkZGRkKEhgYGBgYEQAAAAAAAAAAAAAAAAAAAAMYGBgYGBMZGRkZGRkZGRkZGRkZGRkZGRkZGRMYGBgYGAMAAAAAAAAAAAAAAAAACxgYGBgUEBkZGRkZGRkZGRkZGRkZGRkZGRkZGRkQFBgYGBgLAAAAAAAAAAAAAAAKGBgYGBQKGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZChQYGBgYCgAAAAAAAAAAAAAEGBgYGBAZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRAYGBgYBAAAAAAAAAAAAAgYGBgYExkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkTGBgYGAgAAAAAAAAAAAkYGBgSGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZEhgYGAkAAAAAAAAAAhgYGBgKGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZChgYGBgCAAAAAAAABxgYGA8ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGQ8YGBgHAAAAAAABGBgYGBAZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRAYGBgYAQAAAAACGBgYDBkZGRkZGRkZGRkZGRkXFhYVGRkZGRkZGRkZGRkZGRkZGRkMGBgYAgAAAAADGBgYDRkZGRkZGRkZGRkZGRcYGBgYFxkZGRkZGRkZGRkZGRkZGRkNGBgYAwAAAAAEGBgYDhkZGRkZGRkZGRkZFxgYGBgYGBcZGRkZGRkZGRkZGRkZGRkOGBgYBAAAAAAFGBgYChkZGRkZGRkZGRkXGBgYGBgYGBgXGRkZGRkZGRkZGRkZGRkKGBgYBQAAAAAGGBgYGRkZGRkZGRkZGRUYGBgYGBgYGBgYFxkZGRkZGRkZGRkZGRkZGBgYBgAAAAAYGBgYGRkZGRkZGRkZGRYYGBgYFxcYGBgYGBcZGRkZGRkZGRkZGRkZGBgYGAAAAAAYGBgYGRkZGRkZGRkZGRYYGBgXGRkXGBgYGBgXGRkZGRkZGRkZGRkZGBgYGAAAAAAGGBgYGRkZGRkZGRkZGRUWFhcZGRkZFxgYGBgYFxkZGRkZGRkZGRkZGBgYBgAAAAAFGBgYChkZGRkZGRkZGRkZGRkZGRkZGRcYGBgYGBcZGRkZGRkZGRkKGBgYBQAAAAAEGBgYDhkZGRkZGRkZGRkZGRkZGRkZGRkXGBgYGBYZGRkZGRkZGRkOGBgYBAAAAAADGBgYDRkZGRkZGRkZGRkZGRkZGRkZGRkZFxgYGBYZGRkZGRkZGRkNGBgYAwAAAAACGBgYDBkZGRkZGRkZGRkZGRkZGRkZGRkZGRUWFhUZGRkZGRkZGRkMGBgYAgAAAAABGBgYGBAZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRAYGBgYAQAAAAAABxgYGA8ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGQ8YGBgHAAAAAAAAAhgYGBgKGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZChgYGBgCAAAAAAAAAAkYGBgSGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZEhgYGAkAAAAAAAAAAAgYGBgYExkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkTGBgYGAgAAAAAAAAAAAAEGBgYGBAZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRAYGBgYBAAAAAAAAAAAAAAKGBgYGBQKGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZChQYGBgYCgAAAAAAAAAAAAAACxgYGBgUEBkZGRkZGRkZGRkZGRkZGRkZGRkZGRkQFBgYGBgLAAAAAAAAAAAAAAAAAAMYGBgYGBMZGRkZGRkZGRkZGRkZGRkZGRkZGRMYGBgYGAMAAAAAAAAAAAAAAAAAAAARGBgYGBgSChkZGRkZGRkZGRkZGRkZGRkKEhgYGBgYEQAAAAAAAAAAAAAAAAAAAAAAAxgYGBgYGA8QGRkZGRkZGRkZGRkZEA8YGBgYGBgDAAAAAAAAAAAAAAAAAAAAAAAAAAsYGBgYGBgYDA0OChkZGRkKDg0MGBgYGBgYGAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAKBBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgECgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgJGBgYGBgYGBgYGBgYGBgYGBgYCQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgcYGBgYGBgYGBgYGBgYGAcCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMEBQYYGAYFBAMCAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////AAD///////8AAP//gAH//wAA//4AAH//AAD/+AAAH/8AAP/gAAAH/wAA/8AAAAP/AAD/gAAAAf8AAP8AAAAA/wAA/gAAAAB/AAD8AAAAAD8AAPgAAAAAHwAA+AAAAAAfAADwAAAAAA8AAPAAAAAADwAA4AAAAAAHAADgAAAAAAcAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAAAAAABwAA8AAAAAAPAADwAAAAAA8AAPgAAAAAHwAA+AAAAAAfAAD8AAAAAD8AAP4AAAAAfwAA/wAAAAD/AAD/gAAAAf8AAP/AAAAD/wAA/+AAAAf/AAD/+AAAH/8AAP/+AAB//wAA//+AAf//AAD///////8AAP///////wAA",running:"data:image/x-icon;base64,AAABAAEAMDAAAAEACACoDgAAFgAAACgAAAAwAAAAYAAAAAEACAAAAAAAAAkAAAAAAAAAAAAAAAEAAAABAAAAAAAA0YsAAMWEAwDHgwIAx4QBAMeEAgDGhAIAyIUBAMaFAwDGhAIAxoIAAMaFAgDHhAIAx4QCAMiFAwDHhAIAx4YAAMaFAgDHhQEAxoMCAMeEAgDHgwQAx4QDAMeDAgDHhAIA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMEBQYYGAYFBAMCAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgcYGBgYGBgYGBgYGBgYGAcCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgJGBgYGBgYGBgYGBgYGBgYGBgYCQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKBBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgECgAAAAAAAAAAAAAAAAAAAAAAAAAAAAsYGBgYGBgYDA0OChkZGRkKDg0MGBgYGBgYGAsAAAAAAAAAAAAAAAAAAAAAAAAAAxgYGBgYGA8QGRkZGRkZGRkZGRkZEA8YGBgYGBgDAAAAAAAAAAAAAAAAAAAAAAARGBgYGBgSChkZGRkZGRkZGRkZGRkZGRkKEhgYGBgYEQAAAAAAAAAAAAAAAAAAAAMYGBgYGBMZGRkZGRkZGRkZGRkZGRkZGRkZGRMYGBgYGAMAAAAAAAAAAAAAAAAACxgYGBgUEBkZGRkZGRkZGRkZGRkZGRkZGRkZGRkQFBgYGBgLAAAAAAAAAAAAAAAKGBgYGBQKGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZChQYGBgYCgAAAAAAAAAAAAAEGBgYGBAZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRAYGBgYBAAAAAAAAAAAAAgYGBgYExkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkTGBgYGAgAAAAAAAAAAAkYGBgSGRkZGRkZGRkZFRgWFxkZGRkZGRkZGRkZGRkZGRkZEhgYGAkAAAAAAAAAAhgYGBgKGRkZGRkZGRkZFhgYGBYVGRkZGRkZGRkZGRkZGRkZChgYGBgCAAAAAAAABxgYGA8ZGRkZGRkZGRkZGBgYGBgYFxkZGRkZGRkZGRkZGRkZGQ8YGBgHAAAAAAABGBgYGBAZGRkZGRkZGRkZGBgYGBgYGBYVGRkZGRkZGRkZGRkZGRAYGBgYAQAAAAACGBgYDBkZGRkZGRkZGRkZGBgYGBgYGBgYFxkZGRkZGRkZGRkZGRkMGBgYAgAAAAADGBgYDRkZGRkZGRkZGRkZGBgYGBgYGBgYGBYVGRkZGRkZGRkZGRkNGBgYAwAAAAAEGBgYDhkZGRkZGRkZGRkZGBgYGBUWGBgYGBgYFxkZGRkZGRkZGRkOGBgYBAAAAAAFGBgYChkZGRkZGRkZGRkZGBgYGBkZFxgYGBgYGBYVGRkZGRkZGRkKGBgYBQAAAAAGGBgYGRkZGRkZGRkZGRkZGBgYGBkZGRUWGBgYGBgYFxkZGRkZGRkZGBgYBgAAAAAYGBgYGRkZGRkZGRkZGRkZGBgYGBkZGRkZFxgYGBgYFxkZGRkZGRkZGBgYGAAAAAAYGBgYGRkZGRkZGRkZGRkZGBgYGBkZGRkZFxgYGBgYFhkZGRkZGRkZGBgYGAAAAAAGGBgYGRkZGRkZGRkZGRkZGBgYGBkZGRkXGBgYGBgYFRkZGRkZGRkZGBgYBgAAAAAFGBgYChkZGRkZGRkZGRkZGBgYGBkZFxgYGBgYGBcZGRkZGRkZGRkKGBgYBQAAAAAEGBgYDhkZGRkZGRkZGRkZGBgYGBkXGBgYGBgYFxkZGRkZGRkZGRkOGBgYBAAAAAADGBgYDRkZGRkZGRkZGRkZGBgYGBgYGBgYGBcZGRkZGRkZGRkZGRkNGBgYAwAAAAACGBgYDBkZGRkZGRkZGRkZGBgYGBgYGBgYFxkZGRkZGRkZGRkZGRkMGBgYAgAAAAABGBgYGBAZGRkZGRkZGRkZGBgYGBgYGBcZGRkZGRkZGRkZGRkZGRAYGBgYAQAAAAAABxgYGA8ZGRkZGRkZGRkZGBgYGBgYFxkZGRkZGRkZGRkZGRkZGQ8YGBgHAAAAAAAAAhgYGBgKGRkZGRkZGRkZFhgYGBcZGRkZGRkZGRkZGRkZGRkZChgYGBgCAAAAAAAAAAkYGBgSGRkZGRkZGRkZFRYWFxkZGRkZGRkZGRkZGRkZGRkZEhgYGAkAAAAAAAAAAAgYGBgYExkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkTGBgYGAgAAAAAAAAAAAAEGBgYGBAZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRAYGBgYBAAAAAAAAAAAAAAKGBgYGBQKGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZChQYGBgYCgAAAAAAAAAAAAAACxgYGBgUEBkZGRkZGRkZGRkZGRkZGRkZGRkZGRkQFBgYGBgLAAAAAAAAAAAAAAAAAAMYGBgYGBMZGRkZGRkZGRkZGRkZGRkZGRkZGRMYGBgYGAMAAAAAAAAAAAAAAAAAAAARGBgYGBgSChkZGRkZGRkZGRkZGRkZGRkKEhgYGBgYEQAAAAAAAAAAAAAAAAAAAAAAAxgYGBgYGA8QGRkZGRkZGRkZGRkZEA8YGBgYGBgDAAAAAAAAAAAAAAAAAAAAAAAAAAsYGBgYGBgYDA0OChkZGRkKDg0MGBgYGBgYGAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAKBBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgECgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgJGBgYGBgYGBgYGBgYGBgYGBgYCQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgcYGBgYGBgYGBgYGBgYGAcCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMEBQYYGAYFBAMCAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////AAD///////8AAP//gAH//wAA//4AAH//AAD/+AAAH/8AAP/gAAAH/wAA/8AAAAP/AAD/gAAAAf8AAP8AAAAA/wAA/gAAAAB/AAD8AAAAAD8AAPgAAAAAHwAA+AAAAAAfAADwAAAAAA8AAPAAAAAADwAA4AAAAAAHAADgAAAAAAcAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAAAAAABwAA8AAAAAAPAADwAAAAAA8AAPgAAAAAHwAA+AAAAAAfAAD8AAAAAD8AAP4AAAAAfwAA/wAAAAD/AAD/gAAAAf8AAP/AAAAD/wAA/+AAAAf/AAD/+AAAH/8AAP/+AAB//wAA//+AAf//AAD///////8AAP///////wAA",error:"data:image/x-icon;base64,AAABAAEAMDAAAAEACACoDgAAFgAAACgAAAAwAAAAYAAAAAEACAAAAAAAAAkAAAAAAAAAAAAAAAEAAAABAAAAAAAALi7oACcn2wAlJdsAJibcACYm3AAmJtsAJyfdACUl3QAmJtsAKCjdACUl3AAmJtwAJyfcACYm3AAoKNcAJibcACcn3AAmJt0AJibcACUl3AAmJtwAKCjbACcn3AAmJtsAJibcAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMEBQYZGQYFBAMCAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgcZGRkZGRkZGRkZGRkZGQcCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgJGRkZGRkZGRkZGRkZGRkZGRkZCQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKBBkZGRkZGRkZGRkZGRkZGRkZGRkZGRkECgAAAAAAAAAAAAAAAAAAAAAAAAAAAAsZGRkZGRkZDA0ODxoaGhoPDg0MGRkZGRkZGQsAAAAAAAAAAAAAAAAAAAAAAAAAAxkZGRkZGRARGhoaGhoaGhoaGhoaERAZGRkZGRkDAAAAAAAAAAAAAAAAAAAAAAASGRkZGRkTDxoaGhoaGhoaGhoaGhoaGhoPExkZGRkZEgAAAAAAAAAAAAAAAAAAAAMZGRkZGRQaGhoaGhoaGhoaGhoaGhoaGhoaGhQZGRkZGQMAAAAAAAAAAAAAAAAACxkZGRkVERoaGhoaGhoaGhoaGhoaGhoaGhoaGhoRFRkZGRkLAAAAAAAAAAAAAAAKGRkZGRUPGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaDxUZGRkZCgAAAAAAAAAAAAAEGRkZGREaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhEZGRkZBAAAAAAAAAAAAAgZGRkZFBoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoUGRkZGQgAAAAAAAAAAAkZGRkTGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaExkZGQkAAAAAAAAAAhkZGRkPGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaDxkZGRkCAAAAAAAABxkZGRAaGhoaGhoaGhYXFxYaGhoaGhoaGhgXFxYaGhoaGhoaGhAZGRkHAAAAAAABGRkZGREaGhoaGhoaGhcZGRkYGhoaGhoaGBkZGRcaGhoaGhoaGhEZGRkZAQAAAAACGRkZDBoaGhoaGhoaGhcZGRkZGBoaGhoYGRkZGRcaGhoaGhoaGhoMGRkZAgAAAAADGRkZDRoaGhoaGhoaGhgZGRkZGRgaGhgZGRkZGRYaGhoaGhoaGhoNGRkZAwAAAAAEGRkZDhoaGhoaGhoaGhoYGRkZGRkYGBkZGRkZGBoaGhoaGhoaGhoOGRkZBAAAAAAFGRkZDxoaGhoaGhoaGhoaGBkZGRkZGRkZGRkYGhoaGhoaGhoaGhoPGRkZBQAAAAAGGRkZGhoaGhoaGhoaGhoaGhgZGRkZGRkZGRgaGhoaGhoaGhoaGhoaGRkZBgAAAAAZGRkZGhoaGhoaGhoaGhoaGhoYGRkZGRkZGBoaGhoaGhoaGhoaGhoaGRkZGQAAAAAZGRkZGhoaGhoaGhoaGhoaGhoYGRkZGRkZGBoaGhoaGhoaGhoaGhoaGRkZGQAAAAAGGRkZGhoaGhoaGhoaGhoaGhgZGRkZGRkZGRgaGhoaGhoaGhoaGhoaGRkZBgAAAAAFGRkZDxoaGhoaGhoaGhoaGBkZGRkZGRkZGRkYGhoaGhoaGhoaGhoPGRkZBQAAAAAEGRkZDhoaGhoaGhoaGhoYGRkZGRkYGBkZGRkZGBoaGhoaGhoaGhoOGRkZBAAAAAADGRkZDRoaGhoaGhoaGhYZGRkZGRgaGhgZGRkZGRgaGhoaGhoaGhoNGRkZAwAAAAACGRkZDBoaGhoaGhoaGhcZGRkZGBoaGhoYGRkZGRcaGhoaGhoaGhoMGRkZAgAAAAABGRkZGREaGhoaGhoaGhcZGRkYGhoaGhoaGBkZGRcaGhoaGhoaGhEZGRkZAQAAAAAABxkZGRAaGhoaGhoaGhYXFxgaGhoaGhoaGhYXFxYaGhoaGhoaGhAZGRkHAAAAAAAAAhkZGRkPGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaDxkZGRkCAAAAAAAAAAkZGRkTGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaExkZGQkAAAAAAAAAAAgZGRkZFBoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoUGRkZGQgAAAAAAAAAAAAEGRkZGREaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhEZGRkZBAAAAAAAAAAAAAAKGRkZGRUPGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaDxUZGRkZCgAAAAAAAAAAAAAACxkZGRkVERoaGhoaGhoaGhoaGhoaGhoaGhoaGhoRFRkZGRkLAAAAAAAAAAAAAAAAAAMZGRkZGRQaGhoaGhoaGhoaGhoaGhoaGhoaGhQZGRkZGQMAAAAAAAAAAAAAAAAAAAASGRkZGRkTDxoaGhoaGhoaGhoaGhoaGhoPExkZGRkZEgAAAAAAAAAAAAAAAAAAAAAAAxkZGRkZGRARGhoaGhoaGhoaGhoaERAZGRkZGRkDAAAAAAAAAAAAAAAAAAAAAAAAAAsZGRkZGRkZDA0ODxoaGhoPDg0MGRkZGRkZGQsAAAAAAAAAAAAAAAAAAAAAAAAAAAAKBBkZGRkZGRkZGRkZGRkZGRkZGRkZGRkECgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgJGRkZGRkZGRkZGRkZGRkZGRkZCQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgcZGRkZGRkZGRkZGRkZGQcCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMEBQYZGQYFBAMCAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////AAD///////8AAP//gAH//wAA//4AAH//AAD/+AAAH/8AAP/gAAAH/wAA/8AAAAP/AAD/gAAAAf8AAP8AAAAA/wAA/gAAAAB/AAD8AAAAAD8AAPgAAAAAHwAA+AAAAAAfAADwAAAAAA8AAPAAAAAADwAA4AAAAAAHAADgAAAAAAcAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAAAAAABwAA8AAAAAAPAADwAAAAAA8AAPgAAAAAHwAA+AAAAAAfAAD8AAAAAD8AAP4AAAAAfwAA/wAAAAD/AAD/gAAAAf8AAP/AAAAD/wAA/+AAAAf/AAD/+AAAH/8AAP/+AAB//wAA//+AAf//AAD///////8AAP///////wAA"};async function P(a){return La[a]}function Oa(a){if(document.visibilityState==="visible")return;let A=async()=>{a===0?new Notification("Execution completed",{body:"Your notebook run completed successfully.",icon:await P("success")}):new Notification("Execution failed",{body:`Your notebook run encountered ${a} error(s).`,icon:await P("error")})};!("Notification"in window)||Notification.permission==="denied"||(Notification.permission==="granted"?A():Notification.permission==="default"&&Notification.requestPermission().then(e=>{e==="granted"&&A()}))}const Pa=a=>{let{isRunning:A}=a,e=JA(),t=document.querySelector("link[rel~='icon']");t||(t=document.createElement("link"),t.rel="icon",document.getElementsByTagName("head")[0].append(t)),(0,m.useEffect)(()=>{!A&&t.href.includes("favicon")||(async()=>{let o;if(o=A?"running":e.length===0?"success":"error",t.href=await P(o),!document.hasFocus())return;let s=setTimeout(async()=>{t.href=await P("idle")},3e3);return()=>clearTimeout(s)})()},[A,e,t]);let G=$e(A)??A;return(0,m.useEffect)(()=>{G&&!A&&Oa(e.length)},[e,G,A]),be(window,"focus",async o=>{A||(t.href=await P("idle"))}),null};function Ta(){let{cellRuntime:a}=fA.get(ie),A=EA.entries(a).find(([e,t])=>t.status==="running");A&&ga(A[0],"focus")}var T=B();const Ia=a=>{let A=(0,T.c)(24),{connection:e,isRunning:t,onReconnect:G}=a,{mode:o}=b(ge),s=e.state===Y.CLOSED,R=e.state===Y.OPEN,n=s&&e.code===v.KERNEL_DISCONNECTED,r;A[0]!==e.canTakeover||A[1]!==s?(r=s&&!e.canTakeover&&(0,k.jsx)(Va,{}),A[0]=e.canTakeover,A[1]=s,A[2]=r):r=A[2];let i=o==="read"?"fixed":"absolute",l;A[3]===i?l=A[4]:(l=f("z-50 top-4 left-4",i),A[3]=i,A[4]=l);let Z;A[5]!==R||A[6]!==t?(Z=R&&t&&(0,k.jsx)(Ua,{}),A[5]=R,A[6]=t,A[7]=Z):Z=A[7];let g;A[8]!==n||A[9]!==e.canTakeover||A[10]!==s||A[11]!==G?(g=s&&!e.canTakeover&&(0,k.jsx)(Ka,{onReconnect:n?G:void 0}),A[8]=n,A[9]=e.canTakeover,A[10]=s,A[11]=G,A[12]=g):g=A[12];let d;A[13]!==e.canTakeover||A[14]!==s?(d=s&&e.canTakeover&&(0,k.jsx)(Ha,{}),A[13]=e.canTakeover,A[14]=s,A[15]=d):d=A[15];let h;A[16]!==l||A[17]!==Z||A[18]!==g||A[19]!==d?(h=(0,k.jsxs)("div",{className:l,children:[Z,g,d]}),A[16]=l,A[17]=Z,A[18]=g,A[19]=d,A[20]=h):h=A[20];let p;return A[21]!==r||A[22]!==h?(p=(0,k.jsxs)(k.Fragment,{children:[r,h]}),A[21]=r,A[22]=h,A[23]=p):p=A[23],p};var uA="print:hidden pointer-events-auto hover:cursor-pointer",Ka=a=>{let A=(0,T.c)(12),{onReconnect:e}=a,t=!e,G=t?"App disconnected":"App disconnected \u2014 click to reconnect",o=t?0:-1,s;A[0]===Symbol.for("react.memo_cache_sentinel")?(s=f(uA,"bg-transparent border-0 p-0"),A[0]=s):s=A[0];let R=t?"App disconnected":"Reconnect to app",n;A[1]===Symbol.for("react.memo_cache_sentinel")?(n=(0,k.jsx)(wa,{className:"w-[25px] h-[25px] text-(--red-11)"}),A[1]=n):n=A[1];let r;A[2]!==t||A[3]!==e||A[4]!==R?(r=(0,k.jsx)("button",{type:"button",className:s,"aria-label":R,"data-testid":"disconnected-indicator",onClick:e,disabled:t,children:n}),A[2]=t,A[3]=e,A[4]=R,A[5]=r):r=A[5];let i;A[6]!==o||A[7]!==r?(i=(0,k.jsx)("span",{tabIndex:o,children:r}),A[6]=o,A[7]=r,A[8]=i):i=A[8];let l;return A[9]!==G||A[10]!==i?(l=(0,k.jsx)(ZA,{content:G,children:i}),A[9]=G,A[10]=i,A[11]=l):l=A[11],l},Ha=()=>{let a=(0,T.c)(1),A;return a[0]===Symbol.for("react.memo_cache_sentinel")?(A=(0,k.jsx)(ZA,{content:"Notebook locked",children:(0,k.jsx)("div",{className:uA,children:(0,k.jsx)(ka,{className:"w-[25px] h-[25px] text-(--blue-11)"})})}),a[0]=A):A=a[0],A},Ua=()=>{let a=(0,T.c)(6),A=b(se),e=A?"Scratchpad is running":"Jump to running cell",t=A?void 0:Ta,G;a[0]===Symbol.for("react.memo_cache_sentinel")?(G=(0,k.jsx)(pa,{className:"running-app-icon",size:30,strokeWidth:1}),a[0]=G):G=a[0];let o;a[1]===t?o=a[2]:(o=(0,k.jsx)("div",{className:uA,"data-testid":"loading-indicator",onClick:t,children:G}),a[1]=t,a[2]=o);let s;return a[3]!==o||a[4]!==e?(s=(0,k.jsx)(ZA,{content:e,side:"right",children:o}),a[3]=o,a[4]=e,a[5]=s):s=a[5],s},Va=()=>{let a=(0,T.c)(1),A;return a[0]===Symbol.for("react.memo_cache_sentinel")?(A=(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)("div",{className:"noise"}),(0,k.jsx)("div",{className:"disconnected-gradient"})]}),a[0]=A):A=a[0],A},M=B(),Wa=Ke,qa=Ve,Xa=Ie(Ue),OA=m.forwardRef((a,A)=>{let e=(0,M.c)(9),t,G;e[0]===a?(t=e[1],G=e[2]):({className:t,...G}=a,e[0]=a,e[1]=t,e[2]=G);let o;e[3]===t?o=e[4]:(o=f("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",t),e[3]=t,e[4]=o);let s;return e[5]!==G||e[6]!==A||e[7]!==o?(s=(0,k.jsx)(yA,{className:o,...G,ref:A}),e[5]=G,e[6]=A,e[7]=o,e[8]=s):s=e[8],s});OA.displayName=yA.displayName;var Ja=Oe("fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500",{variants:{side:{top:"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",bottom:"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",left:"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",right:"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm"}},defaultVariants:{side:"right"}}),PA=m.forwardRef((a,A)=>{let e=(0,M.c)(15),t,G,o,s;e[0]===a?(t=e[1],G=e[2],o=e[3],s=e[4]):({side:s,className:G,children:t,...o}=a,e[0]=a,e[1]=t,e[2]=G,e[3]=o,e[4]=s);let R=s===void 0?"right":s,n;e[5]===Symbol.for("react.memo_cache_sentinel")?(n=(0,k.jsx)(OA,{}),e[5]=n):n=e[5];let r;e[6]!==G||e[7]!==R?(r=f(Ja({side:R}),G),e[6]=G,e[7]=R,e[8]=r):r=e[8];let i;e[9]===Symbol.for("react.memo_cache_sentinel")?(i=(0,k.jsxs)(He,{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary",children:[(0,k.jsx)(Za,{className:"h-4 w-4"}),(0,k.jsx)("span",{className:"sr-only",children:"Close"})]}),e[9]=i):i=e[9];let l;return e[10]!==t||e[11]!==o||e[12]!==A||e[13]!==r?(l=(0,k.jsx)(Xa,{children:(0,k.jsxs)(Te,{children:[n,(0,k.jsxs)(bA,{ref:A,className:r,...o,children:[t,i]})]})}),e[10]=t,e[11]=o,e[12]=A,e[13]=r,e[14]=l):l=e[14],l});PA.displayName=bA.displayName;var za=a=>{let A=(0,M.c)(8),e,t;A[0]===a?(e=A[1],t=A[2]):({className:e,...t}=a,A[0]=a,A[1]=e,A[2]=t);let G;A[3]===e?G=A[4]:(G=f("flex flex-col space-y-2 text-center sm:text-left",e),A[3]=e,A[4]=G);let o;return A[5]!==t||A[6]!==G?(o=(0,k.jsx)("div",{className:G,...t}),A[5]=t,A[6]=G,A[7]=o):o=A[7],o};za.displayName="SheetHeader";var $a=a=>{let A=(0,M.c)(8),e,t;A[0]===a?(e=A[1],t=A[2]):({className:e,...t}=a,A[0]=a,A[1]=e,A[2]=t);let G;A[3]===e?G=A[4]:(G=f("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",e),A[3]=e,A[4]=G);let o;return A[5]!==t||A[6]!==G?(o=(0,k.jsx)("div",{className:G,...t}),A[5]=t,A[6]=G,A[7]=o):o=A[7],o};$a.displayName="SheetFooter";var At=m.forwardRef((a,A)=>{let e=(0,M.c)(9),t,G;e[0]===a?(t=e[1],G=e[2]):({className:t,...G}=a,e[0]=a,e[1]=t,e[2]=G);let o;e[3]===t?o=e[4]:(o=f("text-lg font-semibold text-foreground",t),e[3]=t,e[4]=o);let s;return e[5]!==G||e[6]!==A||e[7]!==o?(s=(0,k.jsx)(NA,{ref:A,className:o,...G}),e[5]=G,e[6]=A,e[7]=o,e[8]=s):s=e[8],s});At.displayName=NA.displayName;var et=m.forwardRef((a,A)=>{let e=(0,M.c)(9),t,G;e[0]===a?(t=e[1],G=e[2]):({className:t,...G}=a,e[0]=a,e[1]=t,e[2]=G);let o;e[3]===t?o=e[4]:(o=f("text-sm text-muted-foreground",t),e[3]=t,e[4]=o);let s;return e[5]!==G||e[6]!==A||e[7]!==o?(s=(0,k.jsx)(CA,{ref:A,className:o,...G}),e[5]=G,e[6]=A,e[7]=o,e[8]=s):s=e[8],s});et.displayName=CA.displayName;var at=B();const BA=(0,m.memo)(()=>{let a=(0,at.c)(1),A;return a[0]===Symbol.for("react.memo_cache_sentinel")?(A=(0,k.jsx)(We,{name:MA.SIDEBAR}),a[0]=A):A=a[0],A});BA.displayName="SidebarSlot";var tt=B();const Gt=a=>{let A=(0,tt.c)(6),{openWidth:e}=a,t;A[0]===Symbol.for("react.memo_cache_sentinel")?(t=(0,k.jsx)(qa,{className:"lg:hidden",asChild:!0,children:(0,k.jsx)(gA,{variant:"ghost",className:"bg-background",children:(0,k.jsx)(LA,{className:"w-5 h-5"})})}),A[0]=t):t=A[0];let G;A[1]===e?G=A[2]:(G={maxWidth:e},A[1]=e,A[2]=G);let o;A[3]===Symbol.for("react.memo_cache_sentinel")?(o=(0,k.jsx)(BA,{}),A[3]=o):o=A[3];let s;return A[4]===G?s=A[5]:(s=(0,k.jsxs)(Wa,{children:[t,(0,k.jsx)(PA,{className:"w-full px-3 h-full flex flex-col overflow-y-auto",style:G,side:"left",children:o})]}),A[4]=G,A[5]=s),s};var ot=B();const st=a=>{let A=(0,ot.c)(7),{isOpen:e,toggle:t}=a,G=e?"rotate-0":"rotate-180",o;A[0]===G?o=A[1]:(o=f("h-5 w-5 transition-transform ease-in-out duration-700",G),A[0]=G,A[1]=o);let s;A[2]===o?s=A[3]:(s=(0,k.jsx)(Xe,{className:o}),A[2]=o,A[3]=s);let R;return A[4]!==s||A[5]!==t?(R=(0,k.jsx)("div",{className:"invisible lg:visible absolute top-[12px] right-[16px] z-20",children:(0,k.jsx)(gA,{onClick:t,className:"w-10 h-8",variant:"ghost",size:"icon",children:s})}),A[4]=s,A[5]=t,A[6]=R):R=A[6],R};var nt=B();const rt=a=>{let A=(0,nt.c)(11),{isOpen:e,toggle:t,width:G}=a,o=e?G:ve,s;A[0]===o?s=A[1]:(s={width:o},A[0]=o,A[1]=s);let R;A[2]===Symbol.for("react.memo_cache_sentinel")?(R=f("app-sidebar auto-collapse-nav","top-0 left-0 z-20 h-full hidden lg:block relative transition-[width] ease-in-out duration-300"),A[2]=R):R=A[2];let n;A[3]!==e||A[4]!==t?(n=(0,k.jsx)(st,{isOpen:e,toggle:t}),A[3]=e,A[4]=t,A[5]=n):n=A[5];let r;A[6]===Symbol.for("react.memo_cache_sentinel")?(r=(0,k.jsx)("div",{className:"relative h-full flex flex-col px-3 pb-16 pt-14 overflow-y-auto shadow-sm border-l",children:(0,k.jsx)(BA,{})}),A[6]=r):r=A[6];let i;return A[7]!==e||A[8]!==s||A[9]!==n?(i=(0,k.jsxs)("aside",{"data-expanded":e,style:s,className:R,children:[n,r]}),A[7]=e,A[8]=s,A[9]=n,A[10]=i):i=A[10],i};var kt=B();const it=a=>{let A=(0,kt.c)(15),{children:e}=a,[t,G]=pA(De),{isOpen:o,width:s}=t;if(qe(MA.SIDEBAR).length===0)return e;let R;A[0]===s?R=A[1]:(R=we(s),A[0]=s,A[1]=R);let n=R,r;A[2]!==G||A[3]!==o?(r=()=>G({type:"toggle",isOpen:!o}),A[2]=G,A[3]=o,A[4]=r):r=A[4];let i;A[5]!==o||A[6]!==n||A[7]!==r?(i=(0,k.jsx)(rt,{isOpen:o,width:n,toggle:r}),A[5]=o,A[6]=n,A[7]=r,A[8]=i):i=A[8];let l;A[9]===n?l=A[10]:(l=(0,k.jsx)("div",{className:"absolute top-3 left-4 flex items-center z-50",children:(0,k.jsx)(Gt,{openWidth:n})}),A[9]=n,A[10]=l);let Z;return A[11]!==e||A[12]!==i||A[13]!==l?(Z=(0,k.jsxs)("div",{className:"inset-0 absolute flex",children:[i,l,e]}),A[11]=e,A[12]=i,A[13]=l,A[14]=Z):Z=A[14],Z};var lt=B();const Rt=a=>{let A=(0,lt.c)(18),{width:e,connection:t,isRunning:G,children:o,onReconnect:s}=a,R=t.state,n;A[0]===G?n=A[1]:(n=(0,k.jsx)(Pa,{isRunning:G}),A[0]=G,A[1]=n);let r;A[2]!==t||A[3]!==G||A[4]!==s?(r=(0,k.jsx)(Ia,{connection:t,isRunning:G,onReconnect:s}),A[2]=t,A[3]=G,A[4]=s,A[5]=r):r=A[5];let i;A[6]!==R||A[7]!==e?(i=f("mathjax_ignore",_e(R)&&"disconnected","bg-background w-full h-full text-textColor","flex flex-col overflow-y-auto",e==="full"&&"config-width-full",e==="columns"?"overflow-x-auto":"overflow-x-hidden","print:height-fit"),A[6]=R,A[7]=e,A[8]=i):i=A[8];let l;A[9]!==o||A[10]!==R||A[11]!==i||A[12]!==e?(l=(0,k.jsx)(Ma,{children:(0,k.jsx)(it,{children:(0,k.jsx)("div",{id:"App","data-config-width":e,"data-connection-state":R,className:i,children:o})})}),A[9]=o,A[10]=R,A[11]=i,A[12]=e,A[13]=l):l=A[13];let Z;return A[14]!==n||A[15]!==r||A[16]!==l?(Z=(0,k.jsxs)(k.Fragment,{children:[n,r,l]}),A[14]=n,A[15]=r,A[16]=l,A[17]=Z):Z=A[17],Z};function ct(a){return a.kind==="missing"}function TA(a){return a.kind==="installing"}var{valueAtom:Zt,useActions:gt}=Je(()=>({packageAlert:null,startupLogsAlert:null,packageLogs:{}}),{addPackageAlert:(a,A)=>{var G;let e={...a.packageLogs};if(TA(A)&&A.logs&&A.log_status)for(let[o,s]of Object.entries(A.logs))switch(A.log_status){case"start":e[o]=s;break;case"append":e[o]=(e[o]||"")+s;break;case"done":e[o]=(e[o]||"")+s;break}let t=((G=a.packageAlert)==null?void 0:G.id)||la();return{...a,packageAlert:{id:t,...A},packageLogs:e}},clearPackageAlert:(a,A)=>a.packageAlert!==null&&a.packageAlert.id===A?{...a,packageAlert:null,packageLogs:{}}:a,addStartupLog:(a,A)=>{var t;let e=((t=a.startupLogsAlert)==null?void 0:t.content)||"";return{...a,startupLogsAlert:{...a.startupLogsAlert,content:e+A.content,status:A.status}}},clearStartupLogsAlert:a=>({...a,startupLogsAlert:null})});const dt=()=>b(Zt);function IA(){return gt()}var KA=B();const HA=(0,m.memo)(a=>{let A=(0,KA.c)(11),{appConfig:e,mode:t,children:G}=a,{selectedLayout:o,layoutData:s}=Aa(),R=b(DA);if(t==="edit"&&!R)return G;let n;if(A[0]!==t||A[1]!==o){n=o;let Z=new URLSearchParams(window.location.search);if(t==="read"&&Z.has(RA.viewAs)){let g=Z.get(RA.viewAs);Ya.includes(g)&&(n=g)}A[0]=t,A[1]=o,A[2]=n}else n=A[2];let r;A[3]===n?r=A[4]:(r=aa.find(Z=>Z.type===n),A[3]=n,A[4]=r);let i=r;if(!i)return G;let l;return A[5]!==e||A[6]!==n||A[7]!==s||A[8]!==t||A[9]!==i?(l=(0,k.jsx)(ht,{appConfig:e,mode:t,plugin:i,layoutData:s,finalLayout:n}),A[5]=e,A[6]=n,A[7]=s,A[8]=t,A[9]=i,A[10]=l):l=A[10],l});HA.displayName="CellsRenderer";const ht=a=>{let A=(0,KA.c)(18),{appConfig:e,mode:t,plugin:G,layoutData:o,finalLayout:s}=a,R=Ae(),{setCurrentLayoutData:n}=jA(),r,i,l,Z,g;if(A[0]!==e||A[1]!==s||A[2]!==o||A[3]!==t||A[4]!==R||A[5]!==G){let h=ce(R);r=G.Component,i=e,l=t,Z=h,g=o[s]||G.getInitialLayout(h),A[0]=e,A[1]=s,A[2]=o,A[3]=t,A[4]=R,A[5]=G,A[6]=r,A[7]=i,A[8]=l,A[9]=Z,A[10]=g}else r=A[6],i=A[7],l=A[8],Z=A[9],g=A[10];let d;return A[11]!==r||A[12]!==n||A[13]!==i||A[14]!==l||A[15]!==Z||A[16]!==g?(d=(0,k.jsx)(r,{appConfig:i,mode:l,cells:Z,layout:g,setLayout:n}),A[11]=r,A[12]=n,A[13]=i,A[14]=l,A[15]=Z,A[16]=g,A[17]=d):d=A[17],d};var ut=class UA{constructor(A){iA(this,"hasStarted",!1);iA(this,"handleReadyEvent",A=>{let e=A.detail.objectId;if(!this.uiElementRegistry.has(e))return;let t=this.uiElementRegistry.lookupValue(e);t!==void 0&&this.sendComponentValues({objectIds:[e],values:[t]}).catch(G=>{D.warn(G)})});this.uiElementRegistry=A}static get INSTANCE(){let A="_marimo_private_RuntimeState";return window[A]||(window[A]=new UA(O)),window[A]}get sendComponentValues(){if(!this._sendComponentValues)throw Error("sendComponentValues is not set");return this._sendComponentValues}start(A){if(this.hasStarted){D.warn("RuntimeState already started");return}this._sendComponentValues=A,document.addEventListener(QA.TYPE,this.handleReadyEvent),this.hasStarted=!0}stop(){if(!this.hasStarted){D.warn("RuntimeState already stopped");return}document.removeEventListener(QA.TYPE,this.handleReadyEvent),this.hasStarted=!1}},Bt=B();function mt(a){if(a.static)return me.empty();if(cA())return fe();let A=a.url;return new ma(A,void 0,{maxRetries:10,debug:!1,startClosed:!0,connectionTimeout:1e4})}function Yt(a){let A=(0,Bt.c)(15),{onOpen:e,onMessage:t,onClose:G,onError:o,waitToConnect:s}=a,R;A[0]!==G||A[1]!==o||A[2]!==t||A[3]!==e||A[4]!==a?(R=()=>{let l=mt(a);return l.addEventListener("open",e),l.addEventListener("close",G),l.addEventListener("error",o),l.addEventListener("message",t),l},A[0]=G,A[1]=o,A[2]=t,A[3]=e,A[4]=a,A[5]=R):R=A[5];let[n]=(0,m.useState)(R),r;A[6]!==G||A[7]!==o||A[8]!==t||A[9]!==e||A[10]!==n||A[11]!==s?(r=()=>(n.readyState===WebSocket.CLOSED&&s().then(()=>n.reconnect()).catch(l=>{D.error("Healthy connection never made",l),n.close()}),()=>{D.warn("useConnectionTransport is unmounting. This likely means there is a bug."),n.close(),n.removeEventListener("open",e),n.removeEventListener("close",G),n.removeEventListener("error",o),n.removeEventListener("message",t)}),A[6]=G,A[7]=o,A[8]=t,A[9]=e,A[10]=n,A[11]=s,A[12]=r):r=A[12];let i;return A[13]===n?i=A[14]:(i=[n],A[13]=n,A[14]=i),(0,m.useEffect)(r,i),n}function ft(a){let{codes:A,names:e,configs:t,cell_ids:G,last_executed_code:o,last_execution_time:s}=a,R=o||{},n=s||{};return A.map((r,i)=>{let l=G[i],Z=R[l];return oe({id:l,code:r,edited:Z?Z!==r:!1,name:e[i],lastCodeRun:R[l]??null,lastExecutionTime:n[l]??null,config:t[i]})})}function pt(a,A,e){let t=ea(),{layout:G}=a;if(G){let o=G.type,s=ta({type:o,data:G.data,cells:A});t.selectedLayout=o,t.layoutData[o]=s,e({layoutView:o,data:s})}return t}function xt(){let a=[],A=[];return O.entries.forEach((e,t)=>{a.push(t),A.push(e.value)}),{objectIds:a,values:A}}function wt(a,A){let{existingCells:e,autoInstantiate:t,setCells:G,setLayoutData:o,setAppConfig:s,setCapabilities:R,setKernelState:n,onError:r}=A,{resumed:i,ui_values:l,app_config:Z,capabilities:g,auto_instantiated:d}=a,h=e&&e.length>0,p=h&&!i?e:ft(a);G(p,pt(a,p,o));let y=Ne.safeParse(Z);if(y.success?s(y.data):D.error("Failed to parse app config",y.error),R(g),d)return;if(i){for(let[x,F]of EA.entries(l||{})){let Q=x;O.set(Q,F)}return}let{objectIds:_,values:S}=xt(),j=h?Object.fromEntries(e.map(x=>[x.id,x.code])):void 0;ze().sendInstantiate({objectIds:_,values:S,autoRun:t,codes:j}).then(()=>{n({isInstantiated:!0,error:null})}).catch(x=>{n({isInstantiated:!1,error:x}),r(Error("Failed to instantiate",{cause:x}))})}function Dt(a){let A=a.cell_id;O.removeElementsByCell(A),SA.INSTANCE.removeForCellId(A)}function Et(a,A){A(a),SA.INSTANCE.track(a)}const $={append:a=>{let A=new URL(window.location.href);A.searchParams.append(a.key,a.value),window.history.pushState({},"",`${A.pathname}${A.search}`)},set:a=>{let A=new URL(window.location.href);Array.isArray(a.value)?(A.searchParams.delete(a.key),a.value.forEach(e=>A.searchParams.append(a.key,e))):A.searchParams.set(a.key,a.value),window.history.pushState({},"",`${A.pathname}${A.search}`)},delete:a=>{let A=new URL(window.location.href);a.value==null?A.searchParams.delete(a.key):A.searchParams.delete(a.key,a.value),window.history.pushState({},"",`${A.pathname}${A.search}`)},clear:()=>{let a=new URL(window.location.href);a.search="",window.history.pushState({},"",`${a.pathname}${a.search}`)}};var vt=B();function yt(a,A){switch(a.reason){case"MARIMO_ALREADY_CONNECTED":return{kind:"terminal",status:{state:Y.CLOSED,code:v.ALREADY_RUNNING,reason:"another browser tab is already connected to the kernel",canTakeover:!0},closeTransport:!0};case"MARIMO_WRONG_KERNEL_ID":case"MARIMO_NO_FILE_KEY":case"MARIMO_NO_SESSION_ID":case"MARIMO_NO_SESSION":case"MARIMO_SHUTDOWN":return{kind:"terminal",status:{state:Y.CLOSED,code:v.KERNEL_DISCONNECTED,reason:"kernel not found"},closeTransport:!0};case"MARIMO_MALFORMED_QUERY":return{kind:"terminal",status:{state:Y.CLOSED,code:v.MALFORMED_QUERY,reason:"the kernel did not recognize a request; please file a bug with marimo"},closeTransport:!1};case"MARIMO_KERNEL_STARTUP_ERROR":return{kind:"terminal",status:{state:Y.CLOSED,code:v.KERNEL_STARTUP_ERROR,reason:"Failed to start kernel sandbox"},closeTransport:!0};default:a.reason&&_A(a.reason)}return A.retryCount>=A.maxRetries?{kind:"gave-up",status:{state:Y.CLOSED,code:v.KERNEL_DISCONNECTED,reason:"kernel not found"}}:{kind:"retry",status:{state:Y.CONNECTING}}}function Ct(){return Object.values(lA().cellData).filter(a=>a.id!==ae)}function bt(a){let A=(0,vt.c)(42),e=(0,m.useRef)(!0),{autoInstantiate:t,sessionId:G,setCells:o}=a,{showBoundary:s}=Le(),{handleCellMessage:R}=xA(),n;A[0]===Symbol.for("react.memo_cache_sentinel")?(n={skipMiddleware:!0},A[0]=n):n=A[0];let r=xA(n),i;A[1]===r?i=A[2]:(i=u=>{Re(u.changes,r,Qt)},A[1]=r,A[2]=i);let l=i,{addCellNotification:Z}=fa(),g=L(ia),d=Me(),{setVariables:h,setMetadata:p}=te(),{addColumnPreview:y}=wA(),{addDatasets:_,filterDatasetsFromVariables:S}=wA(),{addDataSourceConnection:j,filterDataSourcesFromVariables:x}=Ge(),{setLayoutData:F}=jA(),[Q,C]=pA(je),{addBanner:AA}=ue(),{addPackageAlert:I,addStartupLog:eA}=IA(),aA=L(DA),tA=L(de),E=Se(),GA=L(ua),oA=L(ye),{setNamespaces:sA,filterFromVariables:nA}=oa(),K;A[3]!==AA||A[4]!==Z||A[5]!==y||A[6]!==j||A[7]!==_||A[8]!==I||A[9]!==eA||A[10]!==t||A[11]!==x||A[12]!==S||A[13]!==nA||A[14]!==R||A[15]!==l||A[16]!==d||A[17]!==GA||A[18]!==tA||A[19]!==o||A[20]!==oA||A[21]!==g||A[22]!==aA||A[23]!==F||A[24]!==p||A[25]!==sA||A[26]!==h||A[27]!==s?(K=u=>{let c=ne(u.data);switch(c.data.op){case"reload":FA();return;case"kernel-ready":{let w=Ct();wt(c.data,{autoInstantiate:t,setCells:o,setLayoutData:F,setAppConfig:d,setCapabilities:tA,setKernelState:g,onError:s,existingCells:w}),aA(c.data.kiosk);return}case"completed-run":return;case"interrupted":return;case"kernel-startup-error":oA(c.data.error);return;case"send-ui-element-message":{let w=c.data.ui_element;if(w){let VA=na(c.data);O.broadcastMessage(w,c.data.message,VA)}return}case"model-lifecycle":Ye(Ee,c.data);return;case"remove-ui-elements":Dt(c.data);return;case"completion-result":he.resolve(c.data.completion_id,c.data);return;case"function-call-result":pe.resolve(c.data.function_call_id,c.data);return;case"cell-op":{Et(c.data,R);let w=lA().cellData[c.data.cell_id];if(!w)return;Z({cellNotification:c.data,code:w.code});return}case"variables":h(c.data.variables.map(Ft)),S(c.data.variables.map(jt)),x(c.data.variables.map(St)),nA(c.data.variables.map(_t));return;case"variable-values":p(c.data.variables.map(Mt));return;case"alert":z({title:c.data.title,description:ca({html:c.data.description}),variant:c.data.variant});return;case"banner":AA(c.data);return;case"missing-package-alert":I({...c.data,kind:"missing"});return;case"installing-package-alert":I({...c.data,kind:"installing"});return;case"startup-logs":eA({content:c.data.content,status:c.data.status});return;case"query-params-append":$.append(c.data);return;case"query-params-set":$.set(c.data);return;case"query-params-delete":$.delete(c.data);return;case"query-params-clear":$.clear();return;case"datasets":_(c.data);return;case"data-column-preview":y(c.data);return;case"sql-table-preview":$A.resolve(c.data.request_id,c.data);return;case"sql-table-list-preview":ee.resolve(c.data.request_id,c.data);return;case"sql-schema-list-preview":re.resolve(c.data.request_id,c.data);return;case"validate-sql-result":Ze.resolve(c.data.request_id,c.data);return;case"secret-keys-result":Ba.resolve(c.data.request_id,c.data);return;case"cache-info":GA(c.data);return;case"cache-cleared":return;case"data-source-connections":j({connections:c.data.connections.map(Nt)});return;case"storage-namespaces":sA(c.data);return;case"storage-entries":sa.resolve(c.data.request_id,c.data);return;case"storage-download-ready":Ga.resolve(c.data.request_id,c.data);return;case"reconnected":return;case"focus-cell":zA(c.data.cell_id);return;case"notebook-document-transaction":l(c.data.transaction);return;default:_A(c.data)}},A[3]=AA,A[4]=Z,A[5]=y,A[6]=j,A[7]=_,A[8]=I,A[9]=eA,A[10]=t,A[11]=x,A[12]=S,A[13]=nA,A[14]=R,A[15]=l,A[16]=d,A[17]=GA,A[18]=tA,A[19]=o,A[20]=oA,A[21]=g,A[22]=aA,A[23]=F,A[24]=p,A[25]=sA,A[26]=h,A[27]=s,A[28]=K):K=A[28];let rA=K,mA=(u,c)=>{e.current&&(e.current=!1,N.reconnect(u,c))},kA=async()=>{if(!(N.readyState===WebSocket.OPEN||N.readyState===WebSocket.CONNECTING)){if(e.current=!0,C({state:Y.CONNECTING}),!await E.isHealthy()){e.current=!1,C({state:Y.CLOSED,code:v.KERNEL_DISCONNECTED,reason:"kernel not found"});return}N.reconnect()}},H;A[29]===Symbol.for("react.memo_cache_sentinel")?(H=vA(),A[29]=H):H=A[29];let U;A[30]!==E||A[31]!==G?(U=()=>E.getWsURL(G).toString(),A[30]=E,A[31]=G,A[32]=U):U=A[32];let V;A[33]===C?V=A[34]:(V=async()=>{e.current=!0,C({state:Y.OPEN})},A[33]=C,A[34]=V);let W;A[35]===E?W=A[36]:(W=async()=>{vA()||cA()||E.isSameOrigin||await E.waitForHealthy()},A[35]=E,A[36]=W);let q;A[37]===rA?q=A[38]:(q=u=>{try{rA(u)}catch(c){let w=c;D.error("Failed to handle message",u.data,w),z({title:"Failed to handle message",description:dA(w),variant:"danger"})}},A[37]=rA,A[38]=q);let N=Yt({static:H,url:U,onOpen:V,waitToConnect:W,onMessage:q,onClose:u=>{D.warn("WebSocket closed",u.code,u.reason);let c=yt(u,{retryCount:N.retryCount,maxRetries:10});if(C(c.status),c.kind==="terminal"&&c.closeTransport){N.close();return}c.kind==="retry"&&mA(u.code,u.reason)},onError:u=>{D.warn("WebSocket error",u),C({state:Y.CLOSED,code:v.KERNEL_DISCONNECTED,reason:"kernel not found"}),mA()}}),X;return A[39]!==Q||A[40]!==kA?(X={connection:Q,reconnect:kA},A[39]=Q,A[40]=kA,A[41]=X):X=A[41],X}function Nt(a){return{...a,name:a.name}}function Mt(a){return{name:a.name,dataType:a.datatype,value:a.value}}function _t(a){return a.name}function St(a){return a.name}function jt(a){return a.name}function Ft(a){return{name:a.name,declaredBy:a.declared_by,usedBy:a.used_by}}function Qt(){return lA().cellIds.inOrderIds}var Lt=B();const Ot=a=>{let A=(0,Lt.c)(2),{children:e}=a,t;return A[0]===e?t=A[1]:(t=(0,k.jsx)("div",{"data-testid":"chrome-wrapper",className:"flex flex-col flex-1 overflow-hidden absolute inset-0 print:relative",children:e}),A[0]=e,A[1]=t),t};export{TA as a,dt as c,LA as d,HA as i,Rt as l,bt as n,ct as o,ut as r,IA as s,Ot as t,Ca as u};
|