@marimo-team/frontend 0.19.2 → 0.19.3-dev11
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-CJVmn-JU.js → CellStatus-BwPGnX3z.js} +1 -1
- package/dist/assets/{JsonOutput-BLd1jTNA.js → JsonOutput--AuyEErr.js} +1 -1
- package/dist/assets/{MarimoErrorOutput-Orp0blpZ.js → MarimoErrorOutput-BZjY8e2w.js} +1 -1
- package/dist/assets/{RenderHTML-BzGWfPTJ.js → RenderHTML-BTLaM20B.js} +1 -1
- package/dist/assets/{add-cell-with-ai-Dx5UA23s.js → add-cell-with-ai-BWWVs9qV.js} +1 -1
- package/dist/assets/{add-database-form-MNQmbAaT.js → add-database-form-Bw_YRH1r.js} +1 -1
- package/dist/assets/{agent-panel-BS2q53WX.js → agent-panel-Bm-vW8YL.js} +1 -1
- package/dist/assets/{ai-model-dropdown-DZ7evAGU.js → ai-model-dropdown-BrUOgnWS.js} +1 -1
- package/dist/assets/{app-config-button-CsABtw-A.js → app-config-button-B8CXELx0.js} +1 -1
- package/dist/assets/{cell-editor-D4tKLHiP.js → cell-editor-CQcpZLQc.js} +13 -13
- package/dist/assets/{cell-link-BoUpLV2S.js → cell-link-CFAPzUg5.js} +1 -1
- package/dist/assets/{cells-D_SkyFDn.js → cells-DU3EySUd.js} +2 -2
- package/dist/assets/{chat-components-6dWNbFjV.js → chat-components-Bc9j9ls4.js} +1 -1
- package/dist/assets/{chat-display-Cfg38gMM.js → chat-display-BrTi6c8V.js} +1 -1
- package/dist/assets/{chat-panel-CofEklYU.js → chat-panel-8Dym5Gv3.js} +1 -1
- package/dist/assets/{client-BUus2uot.js → client-DfkWorYM.js} +1 -1
- package/dist/assets/{column-preview-9nPwQyJZ.js → column-preview-Ck6B_-sQ.js} +1 -1
- package/dist/assets/{command-Qt3ng7cb.js → command-B_minI8b.js} +1 -1
- package/dist/assets/{command-palette-ptrGtoIl.js → command-palette-BT3u6JBB.js} +1 -1
- package/dist/assets/{common-DE3UmpZO.js → common-jorbwXZC.js} +1 -1
- package/dist/assets/config-Ba3eeYri.js +1 -0
- package/dist/assets/{datasource-CR_zEq5o.js → datasource-DCvPlnaJ.js} +1 -1
- package/dist/assets/{dependency-graph-panel-DQnoPpen.js → dependency-graph-panel-C9jYZ6pA.js} +1 -1
- package/dist/assets/{documentation-panel-C0769uWv.js → documentation-panel-AsatrTfg.js} +1 -1
- package/dist/assets/{download-CITws1-y.js → download-PR1bF3g_.js} +1 -1
- package/dist/assets/{edit-page-pktOsK3x.js → edit-page-W6lXebDS.js} +6 -6
- package/dist/assets/{error-panel-B-EvbVVc.js → error-panel-D_wVKV6I.js} +1 -1
- package/dist/assets/{es-CEEVxHsX.js → es-CEE_7T0w.js} +1 -1
- package/dist/assets/{file-explorer-panel-BqkMxs-d.js → file-explorer-panel-DltK8JVp.js} +1 -1
- package/dist/assets/{floating-outline-p0aHdM2W.js → floating-outline-BfdazXWm.js} +1 -1
- package/dist/assets/{focus-D18AHojc.js → focus-CtlWIiQr.js} +1 -1
- package/dist/assets/{form-DEraWoX5.js → form-Cy5TkLzh.js} +1 -1
- package/dist/assets/{globals-D3SeIm1j.js → globals-BSLm1nlz.js} +1 -1
- package/dist/assets/{home-page-9rDRaLCP.js → home-page-CEnaUutq.js} +1 -1
- package/dist/assets/house-CncUa_LL.js +1 -0
- package/dist/assets/index-__6MNWbe.css +2 -0
- package/dist/assets/{index-CGjwCay2.js → index-qglXvdF9.js} +22 -22
- package/dist/assets/{kiosk-mode-DL9UBacr.js → kiosk-mode-BnTZR6mM.js} +1 -1
- package/dist/assets/{layout-Bd6wzfjT.js → layout-BTiWDrbh.js} +1 -1
- package/dist/assets/links-Bpd4gqTj.js +1 -0
- package/dist/assets/{logs-panel-C7VsvCHz.js → logs-panel-Cnp9tO_1.js} +1 -1
- package/dist/assets/{markdown-renderer-C_xfLXiO.js → markdown-renderer-BSrbBHwX.js} +1 -1
- package/dist/assets/{mode-BFwdGSZ7.js → mode-yhfN-4ye.js} +1 -1
- package/dist/assets/{name-cell-input-CsDYsdH3.js → name-cell-input-CmuWqgFR.js} +1 -1
- package/dist/assets/{outline-panel-BlhMaZpZ.js → outline-panel-DCfj1bI-.js} +1 -1
- package/dist/assets/{packages-panel-YNB3ay32.js → packages-panel-BiEckVdM.js} +1 -1
- package/dist/assets/panels-BXRys72u.js +1 -0
- package/dist/assets/{process-output-4w8xDO0j.js → process-output-wGlHkL-Q.js} +1 -1
- package/dist/assets/{readonly-python-code-DjP4vjBQ.js → readonly-python-code-xbh7G2Y2.js} +1 -1
- package/dist/assets/{run-page-DRgXZvWr.js → run-page-BCwJRhCq.js} +1 -1
- package/dist/assets/{scratchpad-panel-BYCWZWFJ.js → scratchpad-panel-ByFq6zUA.js} +1 -1
- package/dist/assets/{session-panel-C0b1PCJc.js → session-panel-DuQl_oQp.js} +1 -1
- package/dist/assets/{snippets-panel-CpjS6w9M.js → snippets-panel-R_ql6HGu.js} +1 -1
- package/dist/assets/{state-BTRRCWOH.js → state-DEHWsmkM.js} +1 -1
- package/dist/assets/{state-kFdt1US2.js → state-DXAf-ejz.js} +1 -1
- package/dist/assets/{switch-C9iBa4rX.js → switch-CWzL-0WF.js} +1 -1
- package/dist/assets/{terminal-BvgBa6Ri.js → terminal-BWM0fOMh.js} +1 -1
- package/dist/assets/{textarea-D2hGxqGj.js → textarea-CfvBt_Xm.js} +1 -1
- package/dist/assets/{tracing-CKdq5KMT.js → tracing-Kscqc1t3.js} +1 -1
- package/dist/assets/{tracing-panel-DXjACxb_.js → tracing-panel-BEzOflWc.js} +2 -2
- package/dist/assets/{types-VzFAm7Cv.js → types-DhuSHMNQ.js} +1 -1
- package/dist/assets/{useAddCell-CVfRv5mq.js → useAddCell-C9lbOVO1.js} +1 -1
- package/dist/assets/{useBoolean-5kuXz69O.js → useBoolean-B-A0dyIW.js} +1 -1
- package/dist/assets/{useCellActionButton-Woqd9LSB.js → useCellActionButton-fsh9MTAX.js} +1 -1
- package/dist/assets/{useDeleteCell-GHwc6J4l.js → useDeleteCell-ByImoTpm.js} +1 -1
- package/dist/assets/{useDependencyPanelTab-B0ZsFCYF.js → useDependencyPanelTab-CngFbla0.js} +1 -1
- package/dist/assets/useNotebookActions-D01w160c.js +1 -0
- package/dist/assets/{useRunCells-BZ_OFvV4.js → useRunCells-CmnSPQtM.js} +1 -1
- package/dist/assets/{useSplitCell-BnJiHHep.js → useSplitCell-BTH64tve.js} +1 -1
- package/dist/assets/utilities.esm-CMQs6YPp.js +3 -0
- package/dist/assets/{vega-component-DpAAiTdH.js → vega-component-B8ghmMYW.js} +1 -1
- package/dist/index.html +35 -35
- package/package.json +1 -1
- package/src/components/editor/KernelStartupErrorModal.tsx +101 -0
- package/src/components/editor/notebook-cell.tsx +13 -13
- package/src/core/MarimoApp.tsx +2 -0
- package/src/core/cells/cells.ts +1 -4
- package/src/core/codemirror/cm.ts +2 -0
- package/src/core/codemirror/misc/__tests__/string-braces.test.ts +200 -0
- package/src/core/codemirror/misc/string-braces.ts +37 -0
- package/src/core/errors/state.ts +7 -1
- package/src/core/islands/main.ts +2 -0
- package/src/core/websocket/types.ts +1 -0
- package/src/core/websocket/useMarimoKernelConnection.tsx +18 -1
- package/src/css/app/Cell.css +6 -0
- package/dist/assets/config-babG4OBR.js +0 -1
- package/dist/assets/globe-CY9im410.js +0 -1
- package/dist/assets/index-nL7dJutx.css +0 -2
- package/dist/assets/links-ENMiP32L.js +0 -1
- package/dist/assets/panels-DfOJ05Sp.js +0 -1
- package/dist/assets/useNotebookActions-DQW0wwU6.js +0 -1
- package/dist/assets/utilities.esm-FYD46c3d.js +0 -3
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { python } from "@codemirror/lang-python";
|
|
4
|
+
import { EditorState } from "@codemirror/state";
|
|
5
|
+
import { EditorView } from "@codemirror/view";
|
|
6
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
7
|
+
import { stringBraceInputHandler } from "../string-braces";
|
|
8
|
+
|
|
9
|
+
function createEditor(
|
|
10
|
+
initialContent: string,
|
|
11
|
+
cursorPosition: number,
|
|
12
|
+
): EditorView {
|
|
13
|
+
const state = EditorState.create({
|
|
14
|
+
doc: initialContent,
|
|
15
|
+
selection: { anchor: cursorPosition },
|
|
16
|
+
extensions: [python()],
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
const view = new EditorView({
|
|
20
|
+
state,
|
|
21
|
+
parent: document.body,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
return view;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
describe("string brace auto-closing", () => {
|
|
28
|
+
let view: EditorView;
|
|
29
|
+
|
|
30
|
+
afterEach(() => {
|
|
31
|
+
if (view) {
|
|
32
|
+
view.destroy();
|
|
33
|
+
if (document.body.contains(view.dom)) {
|
|
34
|
+
view.dom.remove();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it("should auto-close braces in f-strings", () => {
|
|
40
|
+
view = createEditor('f"hello ', 8);
|
|
41
|
+
const result = stringBraceInputHandler(view, 8, 8, "{");
|
|
42
|
+
|
|
43
|
+
expect(result).toBe(true);
|
|
44
|
+
expect(view.state.doc.toString()).toBe('f"hello {}');
|
|
45
|
+
expect(view.state.selection.main.head).toBe(9);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it("should auto-close braces in regular double-quoted strings", () => {
|
|
49
|
+
view = createEditor('"hello ', 7);
|
|
50
|
+
const result = stringBraceInputHandler(view, 7, 7, "{");
|
|
51
|
+
|
|
52
|
+
expect(result).toBe(true);
|
|
53
|
+
expect(view.state.doc.toString()).toBe('"hello {}');
|
|
54
|
+
expect(view.state.selection.main.head).toBe(8);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it("should auto-close braces in rf-strings", () => {
|
|
58
|
+
view = createEditor('rf"hello ', 9);
|
|
59
|
+
const result = stringBraceInputHandler(view, 9, 9, "{");
|
|
60
|
+
|
|
61
|
+
expect(result).toBe(true);
|
|
62
|
+
expect(view.state.doc.toString()).toBe('rf"hello {}');
|
|
63
|
+
expect(view.state.selection.main.head).toBe(10);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it("should auto-close braces in fr-strings", () => {
|
|
67
|
+
view = createEditor('fr"hello ', 9);
|
|
68
|
+
const result = stringBraceInputHandler(view, 9, 9, "{");
|
|
69
|
+
|
|
70
|
+
expect(result).toBe(true);
|
|
71
|
+
expect(view.state.doc.toString()).toBe('fr"hello {}');
|
|
72
|
+
expect(view.state.selection.main.head).toBe(10);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it("should auto-close braces in single-quoted strings", () => {
|
|
76
|
+
view = createEditor("'hello ", 7);
|
|
77
|
+
const result = stringBraceInputHandler(view, 7, 7, "{");
|
|
78
|
+
|
|
79
|
+
expect(result).toBe(true);
|
|
80
|
+
expect(view.state.doc.toString()).toBe("'hello {}");
|
|
81
|
+
expect(view.state.selection.main.head).toBe(8);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it("should auto-close braces in uppercase F-strings", () => {
|
|
85
|
+
view = createEditor('F"hello ', 8);
|
|
86
|
+
const result = stringBraceInputHandler(view, 8, 8, "{");
|
|
87
|
+
|
|
88
|
+
expect(result).toBe(true);
|
|
89
|
+
expect(view.state.doc.toString()).toBe('F"hello {}');
|
|
90
|
+
expect(view.state.selection.main.head).toBe(9);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it("should auto-close braces in raw strings without f/t", () => {
|
|
94
|
+
view = createEditor('r"hello ', 8);
|
|
95
|
+
const result = stringBraceInputHandler(view, 8, 8, "{");
|
|
96
|
+
|
|
97
|
+
expect(result).toBe(true);
|
|
98
|
+
expect(view.state.doc.toString()).toBe('r"hello {}');
|
|
99
|
+
expect(view.state.selection.main.head).toBe(9);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
// Handled by other CodeMirror handler(s)
|
|
103
|
+
it("should NOT auto-close braces outside strings", () => {
|
|
104
|
+
view = createEditor("x = ", 4);
|
|
105
|
+
const result = stringBraceInputHandler(view, 4, 4, "{");
|
|
106
|
+
|
|
107
|
+
expect(result).toBe(false);
|
|
108
|
+
expect(view.state.doc.toString()).toBe("x = ");
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it("should NOT auto-close braces when typing other characters", () => {
|
|
112
|
+
view = createEditor('f"hello ', 8);
|
|
113
|
+
const result = stringBraceInputHandler(view, 8, 8, "a");
|
|
114
|
+
|
|
115
|
+
expect(result).toBe(false);
|
|
116
|
+
expect(view.state.doc.toString()).toBe('f"hello ');
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it("should handle braces at the start of string", () => {
|
|
120
|
+
view = createEditor('f"', 2);
|
|
121
|
+
const result = stringBraceInputHandler(view, 2, 2, "{");
|
|
122
|
+
|
|
123
|
+
expect(result).toBe(true);
|
|
124
|
+
expect(view.state.doc.toString()).toBe('f"{}');
|
|
125
|
+
expect(view.state.selection.main.head).toBe(3);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it("should handle braces in the middle of string content", () => {
|
|
129
|
+
view = createEditor('f"hello world ', 14);
|
|
130
|
+
const result = stringBraceInputHandler(view, 14, 14, "{");
|
|
131
|
+
|
|
132
|
+
expect(result).toBe(true);
|
|
133
|
+
expect(view.state.doc.toString()).toBe('f"hello world {}');
|
|
134
|
+
expect(view.state.selection.main.head).toBe(15);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it("should handle multiple braces in string", () => {
|
|
138
|
+
view = createEditor('f"hello {} world', 16);
|
|
139
|
+
const result = stringBraceInputHandler(view, 16, 16, "{");
|
|
140
|
+
|
|
141
|
+
expect(result).toBe(true);
|
|
142
|
+
expect(view.state.doc.toString()).toBe('f"hello {} world{}');
|
|
143
|
+
expect(view.state.selection.main.head).toBe(17);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it("should handle empty string", () => {
|
|
147
|
+
view = createEditor('f""', 2);
|
|
148
|
+
const result = stringBraceInputHandler(view, 2, 2, "{");
|
|
149
|
+
|
|
150
|
+
expect(result).toBe(true);
|
|
151
|
+
expect(view.state.doc.toString()).toBe('f"{}"');
|
|
152
|
+
expect(view.state.selection.main.head).toBe(3);
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
it("should auto-close braces in triple-quoted strings", () => {
|
|
156
|
+
view = createEditor('"""hello ', 9);
|
|
157
|
+
const result = stringBraceInputHandler(view, 9, 9, "{");
|
|
158
|
+
|
|
159
|
+
expect(result).toBe(true);
|
|
160
|
+
expect(view.state.doc.toString()).toBe('"""hello {}');
|
|
161
|
+
expect(view.state.selection.main.head).toBe(10);
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
it("should auto-close braces in triple-quoted f-strings", () => {
|
|
165
|
+
view = createEditor('f"""hello ', 10);
|
|
166
|
+
const result = stringBraceInputHandler(view, 10, 10, "{");
|
|
167
|
+
|
|
168
|
+
expect(result).toBe(true);
|
|
169
|
+
expect(view.state.doc.toString()).toBe('f"""hello {}');
|
|
170
|
+
expect(view.state.selection.main.head).toBe(11);
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
it("should auto-close braces in triple single-quoted strings", () => {
|
|
174
|
+
view = createEditor("'''hello ", 9);
|
|
175
|
+
const result = stringBraceInputHandler(view, 9, 9, "{");
|
|
176
|
+
|
|
177
|
+
expect(result).toBe(true);
|
|
178
|
+
expect(view.state.doc.toString()).toBe("'''hello {}");
|
|
179
|
+
expect(view.state.selection.main.head).toBe(10);
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
it("should auto-close braces in triple single-quoted f-strings", () => {
|
|
183
|
+
view = createEditor("f'''hello ", 10);
|
|
184
|
+
const result = stringBraceInputHandler(view, 10, 10, "{");
|
|
185
|
+
|
|
186
|
+
expect(result).toBe(true);
|
|
187
|
+
expect(view.state.doc.toString()).toBe("f'''hello {}");
|
|
188
|
+
expect(view.state.selection.main.head).toBe(11);
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
it("should NOT auto-close braces when text is selected", () => {
|
|
192
|
+
view = createEditor('f"hello world"', 8);
|
|
193
|
+
// User has selected "world" (from position 8 to 13)
|
|
194
|
+
const result = stringBraceInputHandler(view, 8, 13, "{");
|
|
195
|
+
|
|
196
|
+
expect(result).toBe(false);
|
|
197
|
+
// Document should remain unchanged since we return false
|
|
198
|
+
expect(view.state.doc.toString()).toBe('f"hello world"');
|
|
199
|
+
});
|
|
200
|
+
});
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
import { syntaxTree } from "@codemirror/language";
|
|
3
|
+
import type { Extension } from "@codemirror/state";
|
|
4
|
+
import { EditorView } from "@codemirror/view";
|
|
5
|
+
|
|
6
|
+
export function stringBraceInputHandler(
|
|
7
|
+
view: EditorView,
|
|
8
|
+
from: number,
|
|
9
|
+
to: number,
|
|
10
|
+
text: string,
|
|
11
|
+
): boolean {
|
|
12
|
+
if (text !== "{") {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
if (from !== to) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const tree = syntaxTree(view.state);
|
|
21
|
+
const node = tree.resolveInner(from, -1);
|
|
22
|
+
|
|
23
|
+
if (!node?.type.name.includes("String")) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
view.dispatch({
|
|
28
|
+
changes: { from, to, insert: "{}" },
|
|
29
|
+
selection: { anchor: from + 1 },
|
|
30
|
+
userEvent: "input.type",
|
|
31
|
+
});
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function stringsAutoCloseBraces(): Extension {
|
|
36
|
+
return EditorView.inputHandler.of(stringBraceInputHandler);
|
|
37
|
+
}
|
package/src/core/errors/state.ts
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
|
-
import { useAtomValue } from "jotai";
|
|
3
|
+
import { atom, useAtomValue } from "jotai";
|
|
4
4
|
import { createReducerAndAtoms } from "@/utils/createReducer";
|
|
5
5
|
import type { Identified } from "@/utils/typed";
|
|
6
6
|
import { generateUUID } from "@/utils/uuid";
|
|
7
7
|
import type { Banner } from "../kernel/messages";
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* Atom for storing kernel startup error message.
|
|
11
|
+
* When set to a non-null value, shows a modal with the error details.
|
|
12
|
+
*/
|
|
13
|
+
export const kernelStartupErrorAtom = atom<string | null>(null);
|
|
14
|
+
|
|
9
15
|
interface BannerState {
|
|
10
16
|
banners: Identified<Banner>[];
|
|
11
17
|
}
|
package/src/core/islands/main.ts
CHANGED
|
@@ -16,6 +16,7 @@ export const WebSocketClosedReason = {
|
|
|
16
16
|
KERNEL_DISCONNECTED: "KERNEL_DISCONNECTED",
|
|
17
17
|
ALREADY_RUNNING: "ALREADY_RUNNING",
|
|
18
18
|
MALFORMED_QUERY: "MALFORMED_QUERY",
|
|
19
|
+
KERNEL_STARTUP_ERROR: "KERNEL_STARTUP_ERROR",
|
|
19
20
|
} as const;
|
|
20
21
|
|
|
21
22
|
export type WebSocketClosedReason =
|
|
@@ -40,7 +40,7 @@ import {
|
|
|
40
40
|
} from "../datasets/request-registry";
|
|
41
41
|
import { useDatasetsActions } from "../datasets/state";
|
|
42
42
|
import { UI_ELEMENT_REGISTRY } from "../dom/uiregistry";
|
|
43
|
-
import { useBannersActions } from "../errors/state";
|
|
43
|
+
import { kernelStartupErrorAtom, useBannersActions } from "../errors/state";
|
|
44
44
|
import { FUNCTIONS_REGISTRY } from "../functions/FunctionRegistry";
|
|
45
45
|
import {
|
|
46
46
|
handleCellNotificationeration,
|
|
@@ -105,6 +105,7 @@ export function useMarimoKernelConnection(opts: {
|
|
|
105
105
|
const setCapabilities = useSetAtom(capabilitiesAtom);
|
|
106
106
|
const runtimeManager = useRuntimeManager();
|
|
107
107
|
const setCacheInfo = useSetAtom(cacheInfoAtom);
|
|
108
|
+
const setKernelStartupError = useSetAtom(kernelStartupErrorAtom);
|
|
108
109
|
|
|
109
110
|
const handleMessage = (e: MessageEvent<JsonString<NotificationPayload>>) => {
|
|
110
111
|
const msg = jsonParseWithSpecialChar(e.data);
|
|
@@ -134,6 +135,11 @@ export function useMarimoKernelConnection(opts: {
|
|
|
134
135
|
case "interrupted":
|
|
135
136
|
return;
|
|
136
137
|
|
|
138
|
+
case "kernel-startup-error":
|
|
139
|
+
// Full error received via message before websocket close
|
|
140
|
+
setKernelStartupError(msg.data.error);
|
|
141
|
+
return;
|
|
142
|
+
|
|
137
143
|
case "send-ui-element-message": {
|
|
138
144
|
const modelId = msg.data.model_id;
|
|
139
145
|
const uiElement = msg.data.ui_element;
|
|
@@ -413,6 +419,17 @@ export function useMarimoKernelConnection(opts: {
|
|
|
413
419
|
return;
|
|
414
420
|
|
|
415
421
|
default:
|
|
422
|
+
// Check for kernel startup error (full error already received via message)
|
|
423
|
+
if (e.reason === "MARIMO_KERNEL_STARTUP_ERROR") {
|
|
424
|
+
setConnection({
|
|
425
|
+
state: WebSocketState.CLOSED,
|
|
426
|
+
code: WebSocketClosedReason.KERNEL_STARTUP_ERROR,
|
|
427
|
+
reason: "Failed to start kernel sandbox",
|
|
428
|
+
});
|
|
429
|
+
ws.close(); // prevent reconnecting
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
|
|
416
433
|
// Session should be valid
|
|
417
434
|
// - browser tab might have been closed or re-opened
|
|
418
435
|
// - computer might have just woken from sleep
|
package/src/css/app/Cell.css
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var ct=Object.defineProperty;var ht=(t,n,o)=>n in t?ct(t,n,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[n]=o;var K=(t,n,o)=>ht(t,typeof n!="symbol"?n+"":n,o);import{t as F}from"./chunk-LvLJmgfZ.js";import{i as lt,l as ft,n as dt,o as pt,p as M,u as gt}from"./useEvent-DlWF5OMa.js";import{t as yt}from"./compiler-runtime-DeeZ7FnK.js";import{d as $}from"./hotkeys-uKX61F1_.js";import{t as wt}from"./utils-CJJIceVn.js";import{r as j}from"./constants-Bkp4R3bQ.js";import{t as Lt}from"./Deferred-DzyBMRsy.js";function Y(){return typeof document<"u"&&document.querySelector("marimo-wasm")!==null}const S={NOT_STARTED:"NOT_STARTED",CONNECTING:"CONNECTING",OPEN:"OPEN",CLOSING:"CLOSING",CLOSED:"CLOSED"},mt={KERNEL_DISCONNECTED:"KERNEL_DISCONNECTED",ALREADY_RUNNING:"ALREADY_RUNNING",MALFORMED_QUERY:"MALFORMED_QUERY"},W=M({state:S.NOT_STARTED});function bt(){return pt(W,t=>t.state===S.OPEN)}const St=M(t=>t(W).state===S.CONNECTING),Ot=M(t=>t(W).state===S.OPEN),Et=M(t=>{let n=t(W);return n.state===S.OPEN||n.state===S.NOT_STARTED}),Ut=M(t=>t(W).state===S.CLOSED),Rt=M(t=>t(W).state===S.NOT_STARTED);function kt(t){return t===S.CLOSED}function It(t){return t===S.CONNECTING}function vt(t){return t===S.OPEN}function Nt(t){return t===S.CLOSING}function q(t){return t===S.NOT_STARTED}function xt(t){return t===S.CLOSED||t===S.CLOSING||t===S.CONNECTING}function Ct(t){switch(t){case S.CLOSED:return"App disconnected";case S.CONNECTING:return"Connecting to a runtime ...";case S.CLOSING:return"App disconnecting...";case S.OPEN:return"";case S.NOT_STARTED:return"Click to connect to a runtime";default:return""}}var Ht=F((t=>{Object.defineProperty(t,"__esModule",{value:!0}),t.toBig=t.shrSL=t.shrSH=t.rotrSL=t.rotrSH=t.rotrBL=t.rotrBH=t.rotr32L=t.rotr32H=t.rotlSL=t.rotlSH=t.rotlBL=t.rotlBH=t.add5L=t.add5H=t.add4L=t.add4H=t.add3L=t.add3H=void 0,t.add=w,t.fromBig=f,t.split=h;var n=BigInt(2**32-1),o=BigInt(32);function f(s,i=!1){return i?{h:Number(s&n),l:Number(s>>o&n)}:{h:Number(s>>o&n)|0,l:Number(s&n)|0}}function h(s,i=!1){let e=s.length,d=new Uint32Array(e),U=new Uint32Array(e);for(let I=0;I<e;I++){let{h:A,l:G}=f(s[I],i);[d[I],U[I]]=[A,G]}return[d,U]}var E=(s,i)=>BigInt(s>>>0)<<o|BigInt(i>>>0);t.toBig=E;var O=(s,i,e)=>s>>>e;t.shrSH=O;var H=(s,i,e)=>s<<32-e|i>>>e;t.shrSL=H;var B=(s,i,e)=>s>>>e|i<<32-e;t.rotrSH=B;var D=(s,i,e)=>s<<32-e|i>>>e;t.rotrSL=D;var v=(s,i,e)=>s<<64-e|i>>>e-32;t.rotrBH=v;var N=(s,i,e)=>s>>>e-32|i<<64-e;t.rotrBL=N;var _=(s,i)=>i;t.rotr32H=_;var P=(s,i)=>s;t.rotr32L=P;var x=(s,i,e)=>s<<e|i>>>32-e;t.rotlSH=x;var k=(s,i,e)=>i<<e|s>>>32-e;t.rotlSL=k;var p=(s,i,e)=>i<<e-32|s>>>64-e;t.rotlBH=p;var L=(s,i,e)=>s<<e-32|i>>>64-e;t.rotlBL=L;function w(s,i,e,d){let U=(i>>>0)+(d>>>0);return{h:s+e+(U/2**32|0)|0,l:U|0}}var y=(s,i,e)=>(s>>>0)+(i>>>0)+(e>>>0);t.add3L=y;var T=(s,i,e,d)=>i+e+d+(s/2**32|0)|0;t.add3H=T;var l=(s,i,e,d)=>(s>>>0)+(i>>>0)+(e>>>0)+(d>>>0);t.add4L=l;var a=(s,i,e,d,U)=>i+e+d+U+(s/2**32|0)|0;t.add4H=a;var c=(s,i,e,d,U)=>(s>>>0)+(i>>>0)+(e>>>0)+(d>>>0)+(U>>>0);t.add5L=c;var g=(s,i,e,d,U,I)=>i+e+d+U+I+(s/2**32|0)|0;t.add5H=g,t.default={fromBig:f,split:h,toBig:E,shrSH:O,shrSL:H,rotrSH:B,rotrSL:D,rotrBH:v,rotrBL:N,rotr32H:_,rotr32L:P,rotlSH:x,rotlSL:k,rotlBH:p,rotlBL:L,add:w,add3L:y,add3H:T,add4L:l,add4H:a,add5H:g,add5L:c}})),Bt=F((t=>{Object.defineProperty(t,"__esModule",{value:!0}),t.crypto=void 0,t.crypto=typeof globalThis=="object"&&"crypto"in globalThis?globalThis.crypto:void 0})),_t=F((t=>{Object.defineProperty(t,"__esModule",{value:!0}),t.wrapXOFConstructorWithOpts=t.wrapConstructorWithOpts=t.wrapConstructor=t.Hash=t.nextTick=t.swap32IfBE=t.byteSwapIfBE=t.swap8IfBE=t.isLE=void 0,t.isBytes=o,t.anumber=f,t.abytes=h,t.ahash=E,t.aexists=O,t.aoutput=H,t.u8=B,t.u32=D,t.clean=v,t.createView=N,t.rotr=_,t.rotl=P,t.byteSwap=x,t.byteSwap32=k,t.bytesToHex=w,t.hexToBytes=l,t.asyncLoop=a,t.utf8ToBytes=c,t.bytesToUtf8=g,t.toBytes=s,t.kdfInputToBytes=i,t.concatBytes=e,t.checkOpts=d,t.createHasher=U,t.createOptHasher=I,t.createXOFer=A,t.randomBytes=G;var n=Bt();function o(r){return r instanceof Uint8Array||ArrayBuffer.isView(r)&&r.constructor.name==="Uint8Array"}function f(r){if(!Number.isSafeInteger(r)||r<0)throw Error("positive integer expected, got "+r)}function h(r,...u){if(!o(r))throw Error("Uint8Array expected");if(u.length>0&&!u.includes(r.length))throw Error("Uint8Array expected of length "+u+", got length="+r.length)}function E(r){if(typeof r!="function"||typeof r.create!="function")throw Error("Hash should be wrapped by utils.createHasher");f(r.outputLen),f(r.blockLen)}function O(r,u=!0){if(r.destroyed)throw Error("Hash instance has been destroyed");if(u&&r.finished)throw Error("Hash#digest() has already been called")}function H(r,u){h(r);let m=u.outputLen;if(r.length<m)throw Error("digestInto() expects output buffer of length at least "+m)}function B(r){return new Uint8Array(r.buffer,r.byteOffset,r.byteLength)}function D(r){return new Uint32Array(r.buffer,r.byteOffset,Math.floor(r.byteLength/4))}function v(...r){for(let u=0;u<r.length;u++)r[u].fill(0)}function N(r){return new DataView(r.buffer,r.byteOffset,r.byteLength)}function _(r,u){return r<<32-u|r>>>u}function P(r,u){return r<<u|r>>>32-u>>>0}t.isLE=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;function x(r){return r<<24&4278190080|r<<8&16711680|r>>>8&65280|r>>>24&255}t.swap8IfBE=t.isLE?r=>r:r=>x(r),t.byteSwapIfBE=t.swap8IfBE;function k(r){for(let u=0;u<r.length;u++)r[u]=x(r[u]);return r}t.swap32IfBE=t.isLE?r=>r:k;var p=typeof Uint8Array.from([]).toHex=="function"&&typeof Uint8Array.fromHex=="function",L=Array.from({length:256},(r,u)=>u.toString(16).padStart(2,"0"));function w(r){if(h(r),p)return r.toHex();let u="";for(let m=0;m<r.length;m++)u+=L[r[m]];return u}var y={_0:48,_9:57,A:65,F:70,a:97,f:102};function T(r){if(r>=y._0&&r<=y._9)return r-y._0;if(r>=y.A&&r<=y.F)return r-(y.A-10);if(r>=y.a&&r<=y.f)return r-(y.a-10)}function l(r){if(typeof r!="string")throw Error("hex string expected, got "+typeof r);if(p)return Uint8Array.fromHex(r);let u=r.length,m=u/2;if(u%2)throw Error("hex string expected, got unpadded hex of length "+u);let b=new Uint8Array(m);for(let R=0,C=0;R<m;R++,C+=2){let X=T(r.charCodeAt(C)),V=T(r.charCodeAt(C+1));if(X===void 0||V===void 0){let ut=r[C]+r[C+1];throw Error('hex string expected, got non-hex character "'+ut+'" at index '+C)}b[R]=X*16+V}return b}t.nextTick=async()=>{};async function a(r,u,m){let b=Date.now();for(let R=0;R<r;R++){m(R);let C=Date.now()-b;C>=0&&C<u||(await(0,t.nextTick)(),b+=C)}}function c(r){if(typeof r!="string")throw Error("string expected");return new Uint8Array(new TextEncoder().encode(r))}function g(r){return new TextDecoder().decode(r)}function s(r){return typeof r=="string"&&(r=c(r)),h(r),r}function i(r){return typeof r=="string"&&(r=c(r)),h(r),r}function e(...r){let u=0;for(let b=0;b<r.length;b++){let R=r[b];h(R),u+=R.length}let m=new Uint8Array(u);for(let b=0,R=0;b<r.length;b++){let C=r[b];m.set(C,R),R+=C.length}return m}function d(r,u){if(u!==void 0&&{}.toString.call(u)!=="[object Object]")throw Error("options should be object or undefined");return Object.assign(r,u)}t.Hash=class{};function U(r){let u=b=>r().update(s(b)).digest(),m=r();return u.outputLen=m.outputLen,u.blockLen=m.blockLen,u.create=()=>r(),u}function I(r){let u=(b,R)=>r(R).update(s(b)).digest(),m=r({});return u.outputLen=m.outputLen,u.blockLen=m.blockLen,u.create=b=>r(b),u}function A(r){let u=(b,R)=>r(R).update(s(b)).digest(),m=r({});return u.outputLen=m.outputLen,u.blockLen=m.blockLen,u.create=b=>r(b),u}t.wrapConstructor=U,t.wrapConstructorWithOpts=I,t.wrapXOFConstructorWithOpts=A;function G(r=32){if(n.crypto&&typeof n.crypto.getRandomValues=="function")return n.crypto.getRandomValues(new Uint8Array(r));if(n.crypto&&typeof n.crypto.randomBytes=="function")return Uint8Array.from(n.crypto.randomBytes(r));throw Error("crypto.getRandomValues must be defined")}})),Tt=F((t=>{Object.defineProperty(t,"__esModule",{value:!0}),t.shake256=t.shake128=t.keccak_512=t.keccak_384=t.keccak_256=t.keccak_224=t.sha3_512=t.sha3_384=t.sha3_256=t.sha3_224=t.Keccak=void 0,t.keccakP=L;var n=Ht(),o=_t(),f=BigInt(0),h=BigInt(1),E=BigInt(2),O=BigInt(7),H=BigInt(256),B=BigInt(113),D=[],v=[],N=[];for(let l=0,a=h,c=1,g=0;l<24;l++){[c,g]=[g,(2*c+3*g)%5],D.push(2*(5*g+c)),v.push((l+1)*(l+2)/2%64);let s=f;for(let i=0;i<7;i++)a=(a<<h^(a>>O)*B)%H,a&E&&(s^=h<<(h<<BigInt(i))-h);N.push(s)}var _=(0,n.split)(N,!0),P=_[0],x=_[1],k=(l,a,c)=>c>32?(0,n.rotlBH)(l,a,c):(0,n.rotlSH)(l,a,c),p=(l,a,c)=>c>32?(0,n.rotlBL)(l,a,c):(0,n.rotlSL)(l,a,c);function L(l,a=24){let c=new Uint32Array(10);for(let g=24-a;g<24;g++){for(let e=0;e<10;e++)c[e]=l[e]^l[e+10]^l[e+20]^l[e+30]^l[e+40];for(let e=0;e<10;e+=2){let d=(e+8)%10,U=(e+2)%10,I=c[U],A=c[U+1],G=k(I,A,1)^c[d],r=p(I,A,1)^c[d+1];for(let u=0;u<50;u+=10)l[e+u]^=G,l[e+u+1]^=r}let s=l[2],i=l[3];for(let e=0;e<24;e++){let d=v[e],U=k(s,i,d),I=p(s,i,d),A=D[e];s=l[A],i=l[A+1],l[A]=U,l[A+1]=I}for(let e=0;e<50;e+=10){for(let d=0;d<10;d++)c[d]=l[e+d];for(let d=0;d<10;d++)l[e+d]^=~c[(d+2)%10]&c[(d+4)%10]}l[0]^=P[g],l[1]^=x[g]}(0,o.clean)(c)}var w=class at extends o.Hash{constructor(a,c,g,s=!1,i=24){if(super(),this.pos=0,this.posOut=0,this.finished=!1,this.destroyed=!1,this.enableXOF=!1,this.blockLen=a,this.suffix=c,this.outputLen=g,this.enableXOF=s,this.rounds=i,(0,o.anumber)(g),!(0<a&&a<200))throw Error("only keccak-f1600 function is supported");this.state=new Uint8Array(200),this.state32=(0,o.u32)(this.state)}clone(){return this._cloneInto()}keccak(){(0,o.swap32IfBE)(this.state32),L(this.state32,this.rounds),(0,o.swap32IfBE)(this.state32),this.posOut=0,this.pos=0}update(a){(0,o.aexists)(this),a=(0,o.toBytes)(a),(0,o.abytes)(a);let{blockLen:c,state:g}=this,s=a.length;for(let i=0;i<s;){let e=Math.min(c-this.pos,s-i);for(let d=0;d<e;d++)g[this.pos++]^=a[i++];this.pos===c&&this.keccak()}return this}finish(){if(this.finished)return;this.finished=!0;let{state:a,suffix:c,pos:g,blockLen:s}=this;a[g]^=c,c&128&&g===s-1&&this.keccak(),a[s-1]^=128,this.keccak()}writeInto(a){(0,o.aexists)(this,!1),(0,o.abytes)(a),this.finish();let c=this.state,{blockLen:g}=this;for(let s=0,i=a.length;s<i;){this.posOut>=g&&this.keccak();let e=Math.min(g-this.posOut,i-s);a.set(c.subarray(this.posOut,this.posOut+e),s),this.posOut+=e,s+=e}return a}xofInto(a){if(!this.enableXOF)throw Error("XOF is not possible for this instance");return this.writeInto(a)}xof(a){return(0,o.anumber)(a),this.xofInto(new Uint8Array(a))}digestInto(a){if((0,o.aoutput)(a,this),this.finished)throw Error("digest() was already called");return this.writeInto(a),this.destroy(),a}digest(){return this.digestInto(new Uint8Array(this.outputLen))}destroy(){this.destroyed=!0,(0,o.clean)(this.state)}_cloneInto(a){let{blockLen:c,suffix:g,outputLen:s,rounds:i,enableXOF:e}=this;return a||(a=new at(c,g,s,e,i)),a.state32.set(this.state32),a.pos=this.pos,a.posOut=this.posOut,a.finished=this.finished,a.rounds=i,a.suffix=g,a.outputLen=s,a.enableXOF=e,a.destroyed=this.destroyed,a}};t.Keccak=w;var y=(l,a,c)=>(0,o.createHasher)(()=>new w(a,l,c));t.sha3_224=y(6,144,224/8),t.sha3_256=y(6,136,256/8),t.sha3_384=y(6,104,384/8),t.sha3_512=y(6,72,512/8),t.keccak_224=y(1,144,224/8),t.keccak_256=y(1,136,256/8),t.keccak_384=y(1,104,384/8),t.keccak_512=y(1,72,512/8);var T=(l,a,c)=>(0,o.createXOFer)((g={})=>new w(a,l,g.dkLen===void 0?c:g.dkLen,!0));t.shake128=T(31,168,128/8),t.shake256=T(31,136,256/8)})),At=F(((t,n)=>{var{sha3_512:o}=Tt(),f=24,h=32,E=(p=4,L=Math.random)=>{let w="";for(;w.length<p;)w+=Math.floor(L()*36).toString(36);return w};function O(p){let L=0n;for(let w of p.values()){let y=BigInt(w);L=(L<<8n)+y}return L}var H=(p="")=>O(o(p)).toString(36).slice(1),B=Array.from({length:26},(p,L)=>String.fromCharCode(L+97)),D=p=>B[Math.floor(p()*B.length)],v=({globalObj:p=typeof global<"u"?global:typeof window<"u"?window:{},random:L=Math.random}={})=>{let w=Object.keys(p).toString();return H(w.length?w+E(h,L):E(h,L)).substring(0,h)},N=p=>()=>p++,_=476782367,P=({random:p=Math.random,counter:L=N(Math.floor(p()*_)),length:w=f,fingerprint:y=v({random:p})}={})=>function(){let T=D(p),l=Date.now().toString(36),a=L().toString(36);return`${T+H(`${l+E(w,p)+a+y}`).substring(1,w)}`},x=P(),k=(p,{minLength:L=2,maxLength:w=h}={})=>{let y=p.length,T=/^[0-9a-z]+$/;return!!(typeof p=="string"&&y>=L&&y<=w&&T.test(p))};n.exports.getConstants=()=>({defaultLength:f,bigLength:h}),n.exports.init=P,n.exports.createId=x,n.exports.bufToBigInt=O,n.exports.createCounter=N,n.exports.createFingerprint=v,n.exports.isCuid=k})),Q=F(((t,n)=>{var{createId:o,init:f,getConstants:h,isCuid:E}=At();n.exports.createId=o,n.exports.init=f,n.exports.getConstants=h,n.exports.isCuid=E}));function J(t){return new URL(t,document.baseURI)}function Z(t){let n=new URL(window.location.href);t(n.searchParams),window.history.replaceState({},"",n.toString())}function Dt(t,n){if(typeof window>"u")return!1;let o=new URLSearchParams(window.location.search);return n===void 0?o.has(t):o.get(t)===n}function Pt(){return J(`?file=${`__new__${tt()}`}`).toString()}var Mt=/^(https?:\/\/\S+)$/;function $t(t){return typeof t=="string"&&Mt.test(t)}function Wt({href:t,queryParams:n,keys:o}){let f=typeof n=="string"?new URLSearchParams(n):n;if(f.size===0||t.startsWith("http://")||t.startsWith("https://"))return t;let h=t.startsWith("#"),E=h&&t.includes("?");if(h&&!E){let k=o?[...f.entries()].filter(([w])=>o.includes(w)):[...f.entries()],p=new URLSearchParams;for(let[w,y]of k)p.set(w,y);let L=p.toString();return L?`/?${L}${t}`:t}let O=t,H="",B=new URLSearchParams,D=h?1:0,v=t.indexOf("#",D);v!==-1&&(H=t.slice(v),O=t.slice(0,v));let N=O.indexOf("?");N!==-1&&(B=new URLSearchParams(O.slice(N+1)),O=O.slice(0,N));let _=new URLSearchParams(B),P=o?[...f.entries()].filter(([k])=>o.includes(k)):[...f.entries()];for(let[k,p]of P)_.set(k,p);let x=_.toString();return x?`${O}?${x}${H}`:t}var Ft=(0,Q().init)({length:6});function tt(){return`s_${Ft()}`}function rt(t){return t?/^s_[\da-z]{6}$/.test(t):!1}var jt=(()=>{let t=new URL(window.location.href).searchParams.get(j.sessionId);return rt(t)?(Z(n=>{n.has(j.kiosk)||n.delete(j.sessionId)}),$.debug("Connecting to existing session",{sessionId:t}),t):($.debug("Starting a new session",{sessionId:t}),tt())})();function z(){return jt}var Gt=class{constructor(t,n=!1){K(this,"initialHealthyCheck",new Lt);this.config=t,this.lazy=n;try{new URL(this.config.url)}catch(o){throw Error(`Invalid runtime URL: ${this.config.url}. ${o instanceof Error?o.message:"Unknown error"}`)}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,n,o=!0){t||(t="");let f=this.httpURL,h=new URLSearchParams(window.location.search);if(n)for(let[E,O]of n.entries())f.searchParams.set(E,O);for(let[E,O]of h.entries())o&&!Object.values(j).includes(E)||f.searchParams.set(E,O);return f.pathname=`${f.pathname.replace(/\/$/,"")}/${t.replace(/^\//,"")}`,f.hash="",f}formatWsURL(t,n){return zt(this.formatHttpURL(t,n,!1).toString())}getWsURL(t){let n=new URL(this.config.url),o=new URLSearchParams(n.search);return new URLSearchParams(window.location.search).forEach((f,h)=>{o.has(h)||o.set(h,f)}),o.set(j.sessionId,t),this.formatWsURL("/ws",o)}getWsSyncURL(t){let n=new URL(this.config.url),o=new URLSearchParams(n.search);return new URLSearchParams(window.location.search).forEach((f,h)=>{o.has(h)||o.set(h,f)}),o.set(j.sessionId,t),this.formatWsURL("/ws_sync",o)}getTerminalWsURL(){return this.formatWsURL("/terminal/ws")}getLSPURL(t){if(t==="copilot"){let n=this.formatWsURL(`/lsp/${t}`);return n.search="",n}return this.formatWsURL(`/lsp/${t}`)}getAiURL(t){return this.formatHttpURL(`/api/ai/${t}`)}healthURL(){return this.formatHttpURL("/health")}async isHealthy(){if(Y()||wt())return!0;try{let t=await fetch(this.healthURL().toString());if(t.redirected){$.debug(`Runtime redirected to ${t.url}`);let o=t.url.replace(/\/health$/,"");this.config.url=o}let n=t.ok;return n&&this.setDOMBaseUri(this.config.url),n}catch{return!1}}setDOMBaseUri(t){t=t.split("?",1)[0],t.endsWith("/")||(t+="/");let n=document.querySelector("base");n?n.setAttribute("href",t):(n=document.createElement("base"),n.setAttribute("href",t),document.head.append(n))}async init(t){$.debug("Initializing runtime...");let n=0;for(;!await this.isHealthy();){if(n>=25){$.error("Failed to connect after 25 retries"),this.initialHealthyCheck.reject(Error("Failed to connect after 25 retries"));return}if(!(t!=null&&t.disableRetryDelay)){let o=Math.min(100*1.2**n,2e3);await new Promise(f=>setTimeout(f,o))}n++}$.debug("Runtime is healthy"),this.initialHealthyCheck.resolve()}async waitForHealthy(){return this.initialHealthyCheck.promise}headers(){let t={"Marimo-Session-Id":z(),"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":z()}}};function zt(t){if(!t.startsWith("http")){$.warn(`URL must start with http: ${t}`);let n=new URL(t);return n.protocol="ws",n}return new URL(t.replace(/^http/,"ws"))}var Xt=yt();function Vt(){let t=new URL(document.baseURI);return t.search="",t.hash="",t.toString()}const nt={lazy:!0,url:Vt()},et=M(nt);var st=M(t=>{let n=t(et);return new Gt(n,n.lazy)});function ot(){return gt(st)}function Kt(){let t=(0,Xt.c)(4),n=ot(),[o,f]=ft(W),h;return t[0]!==o.state||t[1]!==n||t[2]!==f?(h=async()=>{q(o.state)?(f({state:S.CONNECTING}),await n.init()):$.log("Runtime already started or starting...")},t[0]=o.state,t[1]=n,t[2]=f,t[3]=h):h=t[3],dt(h)}function it(){return lt.get(st)}function Yt(t){if(t.startsWith("http"))return new URL(t);let n=it().httpURL.toString();return n.startsWith("blob:")&&(n=n.replace("blob:","")),new URL(t,n)}export{mt as A,Et as C,St as D,Ot as E,Y as M,Rt as O,q as S,Ut as T,kt as _,Kt as a,It as b,rt as c,$t as d,Pt as f,Ct as g,Q as h,et as i,S as j,bt as k,Wt as l,J as m,Yt as n,ot as o,Z as p,it as r,z as s,nt as t,Dt as u,Nt as v,W as w,xt as x,vt as y};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./createLucideIcon-CW2xpJ57.js";var a=e("globe",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]]);export{a as t};
|