@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.
Files changed (92) hide show
  1. package/dist/assets/{CellStatus-CJVmn-JU.js → CellStatus-BwPGnX3z.js} +1 -1
  2. package/dist/assets/{JsonOutput-BLd1jTNA.js → JsonOutput--AuyEErr.js} +1 -1
  3. package/dist/assets/{MarimoErrorOutput-Orp0blpZ.js → MarimoErrorOutput-BZjY8e2w.js} +1 -1
  4. package/dist/assets/{RenderHTML-BzGWfPTJ.js → RenderHTML-BTLaM20B.js} +1 -1
  5. package/dist/assets/{add-cell-with-ai-Dx5UA23s.js → add-cell-with-ai-BWWVs9qV.js} +1 -1
  6. package/dist/assets/{add-database-form-MNQmbAaT.js → add-database-form-Bw_YRH1r.js} +1 -1
  7. package/dist/assets/{agent-panel-BS2q53WX.js → agent-panel-Bm-vW8YL.js} +1 -1
  8. package/dist/assets/{ai-model-dropdown-DZ7evAGU.js → ai-model-dropdown-BrUOgnWS.js} +1 -1
  9. package/dist/assets/{app-config-button-CsABtw-A.js → app-config-button-B8CXELx0.js} +1 -1
  10. package/dist/assets/{cell-editor-D4tKLHiP.js → cell-editor-CQcpZLQc.js} +13 -13
  11. package/dist/assets/{cell-link-BoUpLV2S.js → cell-link-CFAPzUg5.js} +1 -1
  12. package/dist/assets/{cells-D_SkyFDn.js → cells-DU3EySUd.js} +2 -2
  13. package/dist/assets/{chat-components-6dWNbFjV.js → chat-components-Bc9j9ls4.js} +1 -1
  14. package/dist/assets/{chat-display-Cfg38gMM.js → chat-display-BrTi6c8V.js} +1 -1
  15. package/dist/assets/{chat-panel-CofEklYU.js → chat-panel-8Dym5Gv3.js} +1 -1
  16. package/dist/assets/{client-BUus2uot.js → client-DfkWorYM.js} +1 -1
  17. package/dist/assets/{column-preview-9nPwQyJZ.js → column-preview-Ck6B_-sQ.js} +1 -1
  18. package/dist/assets/{command-Qt3ng7cb.js → command-B_minI8b.js} +1 -1
  19. package/dist/assets/{command-palette-ptrGtoIl.js → command-palette-BT3u6JBB.js} +1 -1
  20. package/dist/assets/{common-DE3UmpZO.js → common-jorbwXZC.js} +1 -1
  21. package/dist/assets/config-Ba3eeYri.js +1 -0
  22. package/dist/assets/{datasource-CR_zEq5o.js → datasource-DCvPlnaJ.js} +1 -1
  23. package/dist/assets/{dependency-graph-panel-DQnoPpen.js → dependency-graph-panel-C9jYZ6pA.js} +1 -1
  24. package/dist/assets/{documentation-panel-C0769uWv.js → documentation-panel-AsatrTfg.js} +1 -1
  25. package/dist/assets/{download-CITws1-y.js → download-PR1bF3g_.js} +1 -1
  26. package/dist/assets/{edit-page-pktOsK3x.js → edit-page-W6lXebDS.js} +6 -6
  27. package/dist/assets/{error-panel-B-EvbVVc.js → error-panel-D_wVKV6I.js} +1 -1
  28. package/dist/assets/{es-CEEVxHsX.js → es-CEE_7T0w.js} +1 -1
  29. package/dist/assets/{file-explorer-panel-BqkMxs-d.js → file-explorer-panel-DltK8JVp.js} +1 -1
  30. package/dist/assets/{floating-outline-p0aHdM2W.js → floating-outline-BfdazXWm.js} +1 -1
  31. package/dist/assets/{focus-D18AHojc.js → focus-CtlWIiQr.js} +1 -1
  32. package/dist/assets/{form-DEraWoX5.js → form-Cy5TkLzh.js} +1 -1
  33. package/dist/assets/{globals-D3SeIm1j.js → globals-BSLm1nlz.js} +1 -1
  34. package/dist/assets/{home-page-9rDRaLCP.js → home-page-CEnaUutq.js} +1 -1
  35. package/dist/assets/house-CncUa_LL.js +1 -0
  36. package/dist/assets/index-__6MNWbe.css +2 -0
  37. package/dist/assets/{index-CGjwCay2.js → index-qglXvdF9.js} +22 -22
  38. package/dist/assets/{kiosk-mode-DL9UBacr.js → kiosk-mode-BnTZR6mM.js} +1 -1
  39. package/dist/assets/{layout-Bd6wzfjT.js → layout-BTiWDrbh.js} +1 -1
  40. package/dist/assets/links-Bpd4gqTj.js +1 -0
  41. package/dist/assets/{logs-panel-C7VsvCHz.js → logs-panel-Cnp9tO_1.js} +1 -1
  42. package/dist/assets/{markdown-renderer-C_xfLXiO.js → markdown-renderer-BSrbBHwX.js} +1 -1
  43. package/dist/assets/{mode-BFwdGSZ7.js → mode-yhfN-4ye.js} +1 -1
  44. package/dist/assets/{name-cell-input-CsDYsdH3.js → name-cell-input-CmuWqgFR.js} +1 -1
  45. package/dist/assets/{outline-panel-BlhMaZpZ.js → outline-panel-DCfj1bI-.js} +1 -1
  46. package/dist/assets/{packages-panel-YNB3ay32.js → packages-panel-BiEckVdM.js} +1 -1
  47. package/dist/assets/panels-BXRys72u.js +1 -0
  48. package/dist/assets/{process-output-4w8xDO0j.js → process-output-wGlHkL-Q.js} +1 -1
  49. package/dist/assets/{readonly-python-code-DjP4vjBQ.js → readonly-python-code-xbh7G2Y2.js} +1 -1
  50. package/dist/assets/{run-page-DRgXZvWr.js → run-page-BCwJRhCq.js} +1 -1
  51. package/dist/assets/{scratchpad-panel-BYCWZWFJ.js → scratchpad-panel-ByFq6zUA.js} +1 -1
  52. package/dist/assets/{session-panel-C0b1PCJc.js → session-panel-DuQl_oQp.js} +1 -1
  53. package/dist/assets/{snippets-panel-CpjS6w9M.js → snippets-panel-R_ql6HGu.js} +1 -1
  54. package/dist/assets/{state-BTRRCWOH.js → state-DEHWsmkM.js} +1 -1
  55. package/dist/assets/{state-kFdt1US2.js → state-DXAf-ejz.js} +1 -1
  56. package/dist/assets/{switch-C9iBa4rX.js → switch-CWzL-0WF.js} +1 -1
  57. package/dist/assets/{terminal-BvgBa6Ri.js → terminal-BWM0fOMh.js} +1 -1
  58. package/dist/assets/{textarea-D2hGxqGj.js → textarea-CfvBt_Xm.js} +1 -1
  59. package/dist/assets/{tracing-CKdq5KMT.js → tracing-Kscqc1t3.js} +1 -1
  60. package/dist/assets/{tracing-panel-DXjACxb_.js → tracing-panel-BEzOflWc.js} +2 -2
  61. package/dist/assets/{types-VzFAm7Cv.js → types-DhuSHMNQ.js} +1 -1
  62. package/dist/assets/{useAddCell-CVfRv5mq.js → useAddCell-C9lbOVO1.js} +1 -1
  63. package/dist/assets/{useBoolean-5kuXz69O.js → useBoolean-B-A0dyIW.js} +1 -1
  64. package/dist/assets/{useCellActionButton-Woqd9LSB.js → useCellActionButton-fsh9MTAX.js} +1 -1
  65. package/dist/assets/{useDeleteCell-GHwc6J4l.js → useDeleteCell-ByImoTpm.js} +1 -1
  66. package/dist/assets/{useDependencyPanelTab-B0ZsFCYF.js → useDependencyPanelTab-CngFbla0.js} +1 -1
  67. package/dist/assets/useNotebookActions-D01w160c.js +1 -0
  68. package/dist/assets/{useRunCells-BZ_OFvV4.js → useRunCells-CmnSPQtM.js} +1 -1
  69. package/dist/assets/{useSplitCell-BnJiHHep.js → useSplitCell-BTH64tve.js} +1 -1
  70. package/dist/assets/utilities.esm-CMQs6YPp.js +3 -0
  71. package/dist/assets/{vega-component-DpAAiTdH.js → vega-component-B8ghmMYW.js} +1 -1
  72. package/dist/index.html +35 -35
  73. package/package.json +1 -1
  74. package/src/components/editor/KernelStartupErrorModal.tsx +101 -0
  75. package/src/components/editor/notebook-cell.tsx +13 -13
  76. package/src/core/MarimoApp.tsx +2 -0
  77. package/src/core/cells/cells.ts +1 -4
  78. package/src/core/codemirror/cm.ts +2 -0
  79. package/src/core/codemirror/misc/__tests__/string-braces.test.ts +200 -0
  80. package/src/core/codemirror/misc/string-braces.ts +37 -0
  81. package/src/core/errors/state.ts +7 -1
  82. package/src/core/islands/main.ts +2 -0
  83. package/src/core/websocket/types.ts +1 -0
  84. package/src/core/websocket/useMarimoKernelConnection.tsx +18 -1
  85. package/src/css/app/Cell.css +6 -0
  86. package/dist/assets/config-babG4OBR.js +0 -1
  87. package/dist/assets/globe-CY9im410.js +0 -1
  88. package/dist/assets/index-nL7dJutx.css +0 -2
  89. package/dist/assets/links-ENMiP32L.js +0 -1
  90. package/dist/assets/panels-DfOJ05Sp.js +0 -1
  91. package/dist/assets/useNotebookActions-DQW0wwU6.js +0 -1
  92. 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
+ }
@@ -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
  }
@@ -192,6 +192,8 @@ export async function initialize() {
192
192
  return;
193
193
  case "cache-info":
194
194
  return;
195
+ case "kernel-startup-error":
196
+ return;
195
197
  default:
196
198
  logNever(msg.data);
197
199
  }
@@ -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
@@ -319,6 +319,12 @@
319
319
  }
320
320
  }
321
321
 
322
+ #cell-setup,
323
+ #cell-setup .cm-editor,
324
+ #cell-setup .cm-gutter {
325
+ background-color: var(--gray-2);
326
+ }
327
+
322
328
  #App.disconnected {
323
329
  /* Background determined by disconnected gradient/noise. */
324
330
 
@@ -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};