@marimo-team/frontend 0.25.3-dev20 → 0.25.3-dev21

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 (106) hide show
  1. package/dist/assets/{CellStatus-DVOHpdeJ.js → CellStatus-O0rU3_5j.js} +1 -1
  2. package/dist/assets/{ErrorBoundary-CM13wrd8.js → ErrorBoundary-BkSCfv3B.js} +2 -2
  3. package/dist/assets/{JsonOutput-Cx1iyibB.js → JsonOutput-Dq6MGIMV.js} +5 -5
  4. package/dist/assets/MarimoErrorOutput-BLtCVffa.js +10 -0
  5. package/dist/assets/{RenderHTML-DX6i99Op.js → RenderHTML-PtQ99V0D.js} +1 -1
  6. package/dist/assets/{RunButton-BKoh0zYG.js → RunButton-B8KRdPZ-.js} +1 -1
  7. package/dist/assets/{add-cell-with-ai-BpD_790A.js → add-cell-with-ai-BOBZjUxI.js} +5 -5
  8. package/dist/assets/{add-connection-dialog-B1BXCjex.js → add-connection-dialog-DP62zXw2.js} +1 -1
  9. package/dist/assets/{agent-panel-CDFUc1uu.js → agent-panel-BFul7UiF.js} +1 -1
  10. package/dist/assets/{ai-model-dropdown-i1vfGeVi.js → ai-model-dropdown-sTKkdrbX.js} +3 -3
  11. package/dist/assets/{app-config-button-AdV-QDD7.js → app-config-button-Bp44UZdD.js} +1 -1
  12. package/dist/assets/{blob-BG8yoQmx.js → blob-ykpU69Lk.js} +1 -1
  13. package/dist/assets/{cell-editor-BKJ06H5F.js → cell-editor-B7YlotyH.js} +8 -8
  14. package/dist/assets/cell-link-CmO9D2a2.js +1 -0
  15. package/dist/assets/cells-BMs-CYDt.js +220 -0
  16. package/dist/assets/{chat-display-DhgI2MS9.js → chat-display-Dw8HQAAY.js} +1 -1
  17. package/dist/assets/{chat-panel-Cau71Ygr.js → chat-panel-DPDZrfoJ.js} +2 -2
  18. package/dist/assets/{chat-ui-C5ql1Up-.js → chat-ui-BxnFw9Za.js} +1 -1
  19. package/dist/assets/code-visibility-CGVmpSdE.js +1 -0
  20. package/dist/assets/{column-preview-BZ_iNhtJ.js → column-preview-BQ4k86Lv.js} +1 -1
  21. package/dist/assets/{command-palette-DDC3kBet.js → command-palette-BfxYnBUD.js} +1 -1
  22. package/dist/assets/{common-Sl3uthjg.js → common-CzWTWhcY.js} +1 -1
  23. package/dist/assets/{components-3cou6Mka.js → components-C-p2nJ78.js} +1 -1
  24. package/dist/assets/config-BtRLgrlt.js +104 -0
  25. package/dist/assets/{config-DRIpOKqh.js → config-CMUeR8Wr.js} +1 -1
  26. package/dist/assets/{datasource-DfbNb83e.js → datasource-CEDUN47W.js} +1 -1
  27. package/dist/assets/{dependency-graph-panel-L5cBE5sl.js → dependency-graph-panel-KWuUrABU.js} +1 -1
  28. package/dist/assets/{documentation-panel-D7S8JIc2.js → documentation-panel-T1wYs9YS.js} +1 -1
  29. package/dist/assets/{download-C03FOElq.js → download-Bt4rM2gS.js} +1 -1
  30. package/dist/assets/{edit-page-CLF_VUTW.js → edit-page-DIxL37jf.js} +6 -6
  31. package/dist/assets/{error-entries-CLnPDv7b.js → error-entries-CQTemuon.js} +1 -1
  32. package/dist/assets/{error-panel-D2xrYLue.js → error-panel-BmlN965r.js} +1 -1
  33. package/dist/assets/{feedback-button-DzPunIqU.js → feedback-button-CO89l9HJ.js} +2 -2
  34. package/dist/assets/feedback-button-QWfd9e1X.js +1 -0
  35. package/dist/assets/{file-explorer-panel-Uk4_QIJQ.js → file-explorer-panel-Bs25Xwng.js} +1 -1
  36. package/dist/assets/{file-name-input-B4fRaQkI.js → file-name-input-DgR3ynbz.js} +1 -1
  37. package/dist/assets/{floating-outline-B5MaM1JS.js → floating-outline-kOJ_XOxZ.js} +1 -1
  38. package/dist/assets/{gallery-page-BefvdsM7.js → gallery-page--AiS7R2S.js} +1 -1
  39. package/dist/assets/{glide-data-editor-C3eaYlXg.js → glide-data-editor-FopeFe04.js} +1 -1
  40. package/dist/assets/{home-page-hmvKlc1w.js → home-page-DEUEDKZQ.js} +1 -1
  41. package/dist/assets/hooks-CsCHI0xl.js +1 -0
  42. package/dist/assets/{index-CMx5iSyu.js → index-BXheV3uz.js} +9 -9
  43. package/dist/assets/{layout-Ck1RoL1B.js → layout-CcQIAduN.js} +5 -5
  44. package/dist/assets/{logs-panel-BRytaWaO.js → logs-panel-Cj-mRfbP.js} +1 -1
  45. package/dist/assets/{markdown-renderer-DX0Xrrfy.js → markdown-renderer-Dg2Tj8xg.js} +1 -1
  46. package/dist/assets/{name-cell-input-DlpTvPLa.js → name-cell-input-DhWcLBL9.js} +1 -1
  47. package/dist/assets/{outline-panel-B2WIpz-1.js → outline-panel-DCCN7CCz.js} +1 -1
  48. package/dist/assets/{packages-panel-CI5ff9b-.js → packages-panel-cI3VRnI0.js} +1 -1
  49. package/dist/assets/{panel-accordion-state-BqSH5ttk.js → panel-accordion-state-CrUAB8rV.js} +1 -1
  50. package/dist/assets/panels-DeK2CjCU.js +4 -0
  51. package/dist/assets/{process-output-f3C3PD0Z.js → process-output-C0AVlTcL.js} +1 -1
  52. package/dist/assets/{readonly-code-display-MnMEoYW5.js → readonly-code-display-CEGKPKlf.js} +1 -1
  53. package/dist/assets/{readonly-python-code-ggs4hAzC.js → readonly-python-code-kOLuuvuL.js} +1 -1
  54. package/dist/assets/{reveal-component-PiV1eQk9.js → reveal-component-m_Q_Dhsa.js} +3 -3
  55. package/dist/assets/run-page-ZPnT0tT8.js +1 -0
  56. package/dist/assets/{runtime-details-state-CoL-p0MC.js → runtime-details-state-DRpKx1d7.js} +1 -1
  57. package/dist/assets/{scratchpad-panel-D2rWg4k8.js → scratchpad-panel-4r5I7_4T.js} +1 -1
  58. package/dist/assets/session-panel-B-fUHivk.js +1 -0
  59. package/dist/assets/{snippets-panel-ClGHtEKQ.js → snippets-panel-QqliOy2l.js} +1 -1
  60. package/dist/assets/state-BAKG3nB6.js +3 -0
  61. package/dist/assets/{state-DtGB7xeJ.js → state-BiuybHTd.js} +1 -1
  62. package/dist/assets/{terminal-wnSHYT8N.js → terminal-CP30at9D.js} +3 -3
  63. package/dist/assets/{tracing-Dz2rYOFL.js → tracing-Cg6nJ9oa.js} +1 -1
  64. package/dist/assets/{tracing-panel-DqQY9V91.js → tracing-panel-_OkwL3ST.js} +2 -2
  65. package/dist/assets/{tree-actions-DnUokmva.js → tree-actions-D5U7Yym8.js} +1 -1
  66. package/dist/assets/{useAddCell-IN24thff.js → useAddCell-C3jdhSc9.js} +1 -1
  67. package/dist/assets/{useBoolean-d0Tty94N.js → useBoolean-BHCcNH_F.js} +1 -1
  68. package/dist/assets/{useCellActionButton-DmaFZ4oF.js → useCellActionButton-Db-2kvJ0.js} +1 -1
  69. package/dist/assets/{useDeleteCell-fQlM46Y2.js → useDeleteCell-D0dwhgwH.js} +1 -1
  70. package/dist/assets/{useDependencyPanelTab-ImXYINm_.js → useDependencyPanelTab-BjQVPzm0.js} +1 -1
  71. package/dist/assets/{useInstallPackage-BW06eter.js → useInstallPackage-B-krIeGp.js} +1 -1
  72. package/dist/assets/useNotebookActions-CY_gTNzg.js +1 -0
  73. package/dist/assets/{useRunCells-DSJPXE-j.js → useRunCells-Dyf_vzJl.js} +1 -1
  74. package/dist/assets/{useSplitCell-DQyMF5gd.js → useSplitCell-DA8ujlOv.js} +1 -1
  75. package/dist/assets/{vega-component-IouMe13t.js → vega-component-CaZvZfgt.js} +1 -1
  76. package/dist/index.html +30 -30
  77. package/package.json +1 -1
  78. package/src/components/editor/chrome/wrapper/__tests__/attachment-status.test.tsx +12 -18
  79. package/src/components/editor/errors/__tests__/send-error-report-button.test.tsx +12 -23
  80. package/src/core/attachments/state.ts +5 -8
  81. package/src/core/host/__tests__/attachments.test.ts +57 -0
  82. package/src/core/host/__tests__/notebook-client.test.ts +131 -1
  83. package/src/core/host/events.ts +1 -0
  84. package/src/core/host/notebook-client.ts +20 -2
  85. package/src/core/host/resources/attachments.ts +19 -0
  86. package/src/core/islands/__tests__/bootstrap.test.ts +0 -26
  87. package/src/core/islands/bootstrap.ts +0 -1
  88. package/src/core/runtime/__tests__/runtime.test.ts +1 -1
  89. package/src/core/runtime/runtime.ts +4 -3
  90. package/src/core/websocket/__tests__/useNotebookClient.hook.test.tsx +30 -0
  91. package/src/core/websocket/__tests__/useNotebookSession.hook.test.tsx +0 -171
  92. package/src/core/websocket/state.ts +7 -0
  93. package/src/core/websocket/useNotebookClient.ts +9 -1
  94. package/src/core/websocket/useNotebookSession.tsx +0 -8
  95. package/dist/assets/MarimoErrorOutput-s_5GOX8k.js +0 -10
  96. package/dist/assets/cell-link-8Auigi8P.js +0 -1
  97. package/dist/assets/cells-C6YGYGdi.js +0 -220
  98. package/dist/assets/code-visibility-BJImdpDi.js +0 -1
  99. package/dist/assets/config-Dy28fDwn.js +0 -1
  100. package/dist/assets/feedback-button-Kla7i5RT.js +0 -1
  101. package/dist/assets/hooks-DzML9nez.js +0 -1
  102. package/dist/assets/panels-B_jlikjE.js +0 -107
  103. package/dist/assets/run-page-CkP22x9D.js +0 -1
  104. package/dist/assets/session-panel-CnANhcTo.js +0 -1
  105. package/dist/assets/state-CbjBtkdd.js +0 -3
  106. package/dist/assets/useNotebookActions-DHt3s-ia.js +0 -1
@@ -3,8 +3,6 @@
3
3
  import { createStore } from "jotai";
4
4
  import { afterEach, describe, expect, it, vi } from "vitest";
5
5
  import { RuntimeState } from "@/core/kernel/RuntimeState";
6
- import { attachmentsAtom } from "@/core/attachments/state";
7
- import { Logger } from "@/utils/Logger";
8
6
  import { initializeIslands } from "../bootstrap";
9
7
  import type { IslandsPyodideBridge } from "../bridge";
10
8
  import { islandsHydratedAtom, islandsPendingInitialRunsAtom } from "../state";
@@ -50,30 +48,6 @@ describe("initializeIslands", () => {
50
48
  expect(store.get(islandsHydratedAtom)).toBe(false);
51
49
  store.set(islandsPendingInitialRunsAtom, new Set([1, 2]));
52
50
 
53
- const errors = vi.spyOn(Logger, "error");
54
- consumeMessage?.({
55
- sessionGeneration: 1,
56
- message: JSON.stringify({
57
- op: "attachments",
58
- data: {
59
- op: "attachments",
60
- attachments: [
61
- {
62
- id: "a1",
63
- kind: "agent",
64
- name: "Pi",
65
- since: "2026-10-14T00:00:00Z",
66
- notebook_id: "nb-test",
67
- identity: "pi-thread",
68
- },
69
- ],
70
- },
71
- }) as IslandsKernelMessage["message"],
72
- });
73
- expect(errors).not.toHaveBeenCalled();
74
- expect(store.get(attachmentsAtom)).toEqual([]);
75
- expect(store.get(islandsPendingInitialRunsAtom)).toEqual(new Set([1, 2]));
76
-
77
51
  consumeMessage?.(completedRun(1));
78
52
  expect(store.get(islandsHydratedAtom)).toBe(false);
79
53
 
@@ -209,7 +209,6 @@ function handleMessage(
209
209
  case "cache-info":
210
210
  case "kernel-startup-error":
211
211
  case "notebook-document-transaction":
212
- case "attachments":
213
212
  return;
214
213
 
215
214
  case "completed-run":
@@ -78,7 +78,7 @@ describe("RuntimeManager", () => {
78
78
  "wss://example.com/nested/api/marimo/v1/notebooks/nb_123/events/ws",
79
79
  params: {
80
80
  file: "notebook.py",
81
- types: "marimo",
81
+ types: "notebook,document,cell,attachment,marimo",
82
82
  session_id: sessionId,
83
83
  access_token: "test-token",
84
84
  },
@@ -3,14 +3,13 @@
3
3
  import { Deferred } from "@/utils/Deferred";
4
4
  import { Logger } from "@/utils/Logger";
5
5
  import { KnownQueryParams } from "../constants";
6
+ import { NOTEBOOK_EVENT_TYPES } from "../host/events";
6
7
  import { isIslands } from "../islands/utils";
7
8
  import { getSessionId, type SessionId } from "../kernel/session";
8
9
  import { isStaticNotebook } from "../static/static-state";
9
10
  import { isWasm } from "../wasm/utils";
10
11
  import type { RuntimeConfig } from "./types";
11
12
 
12
- const HOST_EVENT_TYPES = ["marimo"];
13
-
14
13
  export class RuntimeManager {
15
14
  private initialHealthyCheck = new Deferred<void>();
16
15
  private config: RuntimeConfig;
@@ -165,7 +164,7 @@ export class RuntimeManager {
165
164
  const url = this.formatWsURL(path, searchParams);
166
165
  if (notebookId) {
167
166
  // TODO(MO-8034): Separate host options from notebook query params.
168
- url.searchParams.set("types", HOST_EVENT_TYPES.join(","));
167
+ url.searchParams.set("types", NOTEBOOK_EVENT_TYPES.join(","));
169
168
  }
170
169
  return url;
171
170
  }
@@ -177,6 +176,8 @@ export class RuntimeManager {
177
176
  * (see `headers()`) instead of the URL.
178
177
  */
179
178
  public getSseURL(sessionId: SessionId): URL {
179
+ // TODO: Migrate editor SSE to the host event stream. Until then, host
180
+ // state such as attachments is unavailable on this legacy connection.
180
181
  const url = this.formatHttpURL({
181
182
  path: "/sse",
182
183
  searchParams: this.getSessionSearchParams(sessionId),
@@ -9,6 +9,9 @@ import { ConnectionState } from "../types";
9
9
  import { createConnectionTransport } from "../transports/create";
10
10
  import type { IConnectionTransport } from "../transports/transport";
11
11
  import { useNotebookClient } from "../useNotebookClient";
12
+ import { fixtureMessages } from "../../host/__tests__/fixtures";
13
+ import { agentAttachmentsAtom } from "../../attachments/state";
14
+ import { notebookClientAtom } from "../state";
12
15
 
13
16
  vi.mock("../transports/create", () => ({ createConnectionTransport: vi.fn() }));
14
17
 
@@ -30,6 +33,10 @@ function makeTransport() {
30
33
  };
31
34
  return {
32
35
  transport,
36
+ receive: (message: unknown) =>
37
+ events.dispatchEvent(
38
+ new MessageEvent("message", { data: JSON.stringify(message) }),
39
+ ),
33
40
  notify: () =>
34
41
  events.dispatchEvent(
35
42
  new MessageEvent("message", {
@@ -72,6 +79,29 @@ beforeEach(() => {
72
79
  });
73
80
 
74
81
  describe("useNotebookClient", () => {
82
+ it("exposes host presence to the UI without waiting for kernel-ready", async () => {
83
+ const transport = makeTransport();
84
+ vi.mocked(createConnectionTransport).mockReturnValue(transport.transport);
85
+ const { result, store, unmount } = setup();
86
+ await act(async () => Promise.resolve());
87
+ expect(store.get(notebookClientAtom)).toBe(result.current);
88
+ act(() =>
89
+ fixtureMessages("notebook-events.sse").forEach(transport.receive),
90
+ );
91
+ expect(store.get(agentAttachmentsAtom)).toEqual([
92
+ {
93
+ id: "a2",
94
+ notebook_id: "n1",
95
+ kind: "agent",
96
+ name: "Notebook CLI",
97
+ since: "2026-10-01T09:20:03Z",
98
+ },
99
+ ]);
100
+ unmount();
101
+ expect(store.get(notebookClientAtom)).toBeNull();
102
+ expect(store.get(agentAttachmentsAtom)).toEqual([]);
103
+ });
104
+
75
105
  it("uses current callbacks and URL providers without reconnecting on a rerender", async () => {
76
106
  const first = makeTransport();
77
107
  vi.mocked(createConnectionTransport).mockReturnValue(first.transport);
@@ -41,11 +41,6 @@ import { Logger } from "@/utils/Logger";
41
41
  import { Deferred } from "@/utils/Deferred";
42
42
  import { cellId } from "@/__tests__/branded";
43
43
  import { alertAtom, getPackageAlert } from "@/core/alerts/state";
44
- import {
45
- type Attachment,
46
- attachmentsAtom,
47
- agentAttachmentsAtom,
48
- } from "@/core/attachments/state";
49
44
  import { notebookAtom } from "@/core/cells/cells";
50
45
  import { AppConfigSchema } from "@/core/config/config-schema";
51
46
  import { ConnectionNotice } from "@/components/editor/alerts/connection-notice";
@@ -239,28 +234,6 @@ describe("useNotebookSession messages", () => {
239
234
  });
240
235
  }
241
236
 
242
- it("replaces attachment snapshots, including the last detach", () => {
243
- const agent: Attachment = {
244
- id: "a1",
245
- kind: "agent",
246
- name: "Pi",
247
- since: "2026-10-14T00:00:00Z",
248
- notebook_id: "nb-test",
249
- identity: "pi-thread",
250
- };
251
- const client: Attachment = {
252
- id: "c1",
253
- kind: "client",
254
- name: null,
255
- since: "2026-10-14T00:00:01Z",
256
- notebook_id: "nb-test",
257
- };
258
- for (const attachments of [[agent, client], [client], []]) {
259
- receive({ data: { op: "attachments", attachments } });
260
- expect(store.get(attachmentsAtom)).toEqual(attachments);
261
- }
262
- });
263
-
264
237
  it.each(["{broken", "null"])(
265
238
  "reports a malformed legacy frame and continues applying notifications: %s",
266
239
  (data) => {
@@ -408,150 +381,6 @@ it.each(["kernel-ready", "reconnected"])(
408
381
  },
409
382
  );
410
383
 
411
- describe("attachment snapshots across browser connections", () => {
412
- const agent: Attachment = {
413
- id: "a1",
414
- kind: "agent",
415
- name: "Pi",
416
- since: "2026-10-14T00:00:00Z",
417
- notebook_id: "nb-test",
418
- identity: "pi-thread",
419
- };
420
-
421
- function connectedSession() {
422
- const store = createStore();
423
- store.set(connectionAtom, { state: ConnectionState.OPEN });
424
- store.set(attachmentsAtom, [agent]);
425
- const transport = makeTransport(WebSocket.OPEN);
426
- vi.mocked(createConnectionTransport).mockReturnValue(transport);
427
- vi.mocked(useRuntimeManager).mockReturnValue(makeRuntimeManager());
428
- renderConnectionHook(store);
429
- const options = getTransportHandlers();
430
- const receive = (data: NotificationPayload["data"]) =>
431
- act(() => {
432
- options.onMessage(
433
- new MessageEvent("message", {
434
- data: JSON.stringify({ op: data.op, data }),
435
- }),
436
- );
437
- });
438
- return { store, transport, options, receive };
439
- }
440
-
441
- it.each([
442
- "MARIMO_NO_FILE_KEY",
443
- "MARIMO_NO_SESSION_ID",
444
- "MARIMO_NO_SESSION",
445
- "MARIMO_SHUTDOWN",
446
- "MARIMO_KERNEL_STARTUP_ERROR",
447
- "MARIMO_UNAUTHORIZED",
448
- "MARIMO_KIOSK_NOT_ALLOWED",
449
- "MARIMO_TRANSPORT_EXHAUSTED",
450
- ])("clears cached attachments on %s", (reason) => {
451
- const { store, transport, options } = connectedSession();
452
- act(() => options.onClose(new CloseEvent("close", { reason })));
453
- expect(store.get(attachmentsAtom)).toEqual([]);
454
- expect(store.get(agentAttachmentsAtom)).toEqual([]);
455
- expect(store.get(connectionAtom).state).toBe(ConnectionState.CLOSED);
456
- expect(transport.reconnect).not.toHaveBeenCalled();
457
- });
458
-
459
- it("clears the snapshot on transport error", () => {
460
- const { store, options } = connectedSession();
461
- act(() => options.onError(new Event("error")));
462
- expect(store.get(attachmentsAtom)).toEqual([]);
463
- expect(store.get(agentAttachmentsAtom)).toEqual([]);
464
- });
465
-
466
- it("waits for a fresh snapshot after a transient reconnect", async () => {
467
- const { store, transport, options, receive } = connectedSession();
468
- act(() => options.onClose(new CloseEvent("close")));
469
- expect(store.get(attachmentsAtom)).toEqual([]);
470
- expect(store.get(connectionAtom).state).toBe(ConnectionState.CONNECTING);
471
- expect(transport.reconnect).toHaveBeenCalledOnce();
472
-
473
- await act(async () => options.onOpen(new Event("open")));
474
- receive({ op: "reconnected" });
475
- expect(store.get(connectionAtom).state).toBe(ConnectionState.OPEN);
476
- expect(store.get(agentAttachmentsAtom)).toEqual([]);
477
-
478
- const refreshed = { ...agent, id: "a2", name: "Codex" };
479
- receive({ op: "attachments", attachments: [refreshed] });
480
- expect(store.get(agentAttachmentsAtom)).toEqual([refreshed]);
481
- receive({ op: "attachments", attachments: [] });
482
- expect(store.get(agentAttachmentsAtom)).toEqual([]);
483
- });
484
-
485
- it("keeps a fresh snapshot hidden until the session is ready", async () => {
486
- const { store, options, receive } = connectedSession();
487
- act(() => options.onClose(new CloseEvent("close")));
488
- await act(async () => options.onOpen(new Event("open")));
489
- receive({ op: "attachments", attachments: [agent] });
490
- expect(store.get(attachmentsAtom)).toEqual([agent]);
491
- expect(store.get(agentAttachmentsAtom)).toEqual([]);
492
- receive({ op: "reconnected" });
493
- expect(store.get(agentAttachmentsAtom)).toEqual([agent]);
494
- });
495
-
496
- it("invalidates an old snapshot when a new transport opens", async () => {
497
- const { store, options } = connectedSession();
498
- await act(async () => options.onOpen(new Event("open")));
499
- expect(store.get(attachmentsAtom)).toEqual([]);
500
- expect(store.get(agentAttachmentsAtom)).toEqual([]);
501
- });
502
- });
503
-
504
- it.each([true, false])(
505
- "keeps attachments only when kernel-ready resumes the session: %s",
506
- (resumed) => {
507
- const store = createStore();
508
- const attachments: Attachment[] = [
509
- {
510
- id: "a1",
511
- kind: "agent",
512
- name: "Pi",
513
- since: "2026-10-14T00:00:00Z",
514
- notebook_id: "nb-test",
515
- identity: "pi-thread",
516
- },
517
- ];
518
- store.set(attachmentsAtom, attachments);
519
- vi.mocked(createConnectionTransport).mockReturnValue(
520
- makeTransport(WebSocket.OPEN),
521
- );
522
- vi.mocked(useRuntimeManager).mockReturnValue(makeRuntimeManager());
523
- renderConnectionHook(store);
524
- const options = getTransportHandlers();
525
- act(() =>
526
- options.onMessage(
527
- new MessageEvent("message", {
528
- data: JSON.stringify({
529
- op: "kernel-ready",
530
- data: {
531
- op: "kernel-ready",
532
- cell_ids: [],
533
- codes: [],
534
- names: [],
535
- configs: [],
536
- layout: null,
537
- resumed,
538
- ui_values: {},
539
- last_executed_code: {},
540
- last_execution_time: {},
541
- app_config: { width: "normal" },
542
- kiosk: false,
543
- capabilities: { terminal: false },
544
- auto_instantiated: true,
545
- consumer_capabilities: { edit: true, interact: true },
546
- },
547
- }),
548
- }),
549
- ),
550
- );
551
- expect(store.get(attachmentsAtom)).toEqual(resumed ? attachments : []);
552
- },
553
- );
554
-
555
384
  describe("connection notice", () => {
556
385
  beforeEach(() => vi.useFakeTimers());
557
386
  afterEach(() => vi.useRealTimers());
@@ -0,0 +1,7 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { atom } from "jotai";
4
+ import type { NotebookClient } from "../host/notebook-client";
5
+
6
+ /** The client owned by the mounted notebook session. */
7
+ export const notebookClientAtom = atom<NotebookClient | null>(null);
@@ -14,6 +14,7 @@ import {
14
14
  type NotebookConnection,
15
15
  } from "../host/notebook-client";
16
16
  import { classifyCloseEvent } from "./connection-state";
17
+ import { notebookClientAtom } from "./state";
17
18
  import {
18
19
  createConnectionTransport,
19
20
  type ConnectionTransportOptions,
@@ -41,6 +42,7 @@ export function useNotebookClient(options: Options): NotebookClient {
41
42
 
42
43
  useEffect(() => {
43
44
  const lifetime = new AbortController();
45
+ store.set(notebookClientAtom, controller.client);
44
46
  controller.connect({
45
47
  createTransport: (url) =>
46
48
  createConnectionTransport({
@@ -61,9 +63,15 @@ export function useNotebookClient(options: Options): NotebookClient {
61
63
  decodeJson: jsonParseWithSpecialChar,
62
64
  classifyClose: classifyCloseEvent,
63
65
  });
64
- return () => lifetime.abort();
66
+ return () => {
67
+ lifetime.abort();
68
+ if (store.get(notebookClientAtom) === controller.client) {
69
+ store.set(notebookClientAtom, null);
70
+ }
71
+ };
65
72
  }, [
66
73
  controller,
74
+ store,
67
75
  sessionId,
68
76
  isStatic,
69
77
  transportType,
@@ -5,7 +5,6 @@ import { useAtom, useAtomValue, useSetAtom, useStore } from "jotai";
5
5
  import { useLayoutEffect } from "react";
6
6
  import { useErrorBoundary } from "react-error-boundary";
7
7
  import { toast } from "@/components/ui/use-toast";
8
- import { attachmentsAtom } from "@/core/attachments/state";
9
8
  import { getNotebook, useCellActions } from "@/core/cells/cells";
10
9
  import { applyTransactionChanges } from "@/core/cells/document-changes";
11
10
  import { AUTOCOMPLETER } from "@/core/codemirror/completion/Autocompleter";
@@ -140,7 +139,6 @@ export function useNotebookSession(opts: {
140
139
  const transportType = useAtomValue(connectionTransportTypeAtom);
141
140
  const setCacheInfo = useSetAtom(cacheInfoAtom);
142
141
  const setKernelStartupError = useSetAtom(kernelStartupErrorAtom);
143
- const setAttachments = useSetAtom(attachmentsAtom);
144
142
  const {
145
143
  setNamespaces: setStorageNamespaces,
146
144
  filterFromVariables: filterStorageFromVariables,
@@ -148,9 +146,6 @@ export function useNotebookSession(opts: {
148
146
 
149
147
  const handleNotification = (msg: NotificationPayload) => {
150
148
  switch (msg.data.op) {
151
- case "attachments":
152
- setAttachments(msg.data.attachments);
153
- return;
154
149
  case "reload":
155
150
  reloadSafe();
156
151
  return;
@@ -185,7 +180,6 @@ export function useNotebookSession(opts: {
185
180
  existingCells,
186
181
  });
187
182
  if (!msg.data.resumed) {
188
- setAttachments([]);
189
183
  // A freshly started kernel may expose a different environment
190
184
  // (e.g. new env vars); re-run discovery instead of reusing stale
191
185
  // suggestions from the previous kernel instance.
@@ -452,7 +446,6 @@ export function useNotebookSession(opts: {
452
446
  if (status.state === ConnectionState.NOT_STARTED) {
453
447
  return;
454
448
  }
455
- setAttachments([]);
456
449
  if (status.state === ConnectionState.OPEN) {
457
450
  updateStartupProgress(null);
458
451
  return; // kernel-ready, not the socket, establishes session readiness.
@@ -487,7 +480,6 @@ export function useNotebookSession(opts: {
487
480
  notebook,
488
481
  store,
489
482
  setConnection,
490
- setAttachments,
491
483
  setKernelStartupError,
492
484
  updateStartupProgress,
493
485
  ]);
@@ -1,10 +0,0 @@
1
- import{a as e}from"./rolldown-runtime-B0Z9INg1.js";import{c as t,d as n,f as r,l as i,r as a,t as o,u as s}from"./useEvent-Dfcbgjhg.js";import{t as c}from"./react-DVplv7_D.js";import{Ao as l,D as u,Kr as d,Oa as f,Q as p,Qr as m,Z as h,Za as g,ai as _,b as v,ka as y,no as b,qa as x,ut as S}from"./cells-C6YGYGdi.js";import{t as C}from"./compiler-runtime-BrajqUja.js";import{i as w,r as T,x as E}from"./config-CA1V-wjh.js";import{g as D,p as O}from"./useEventListener-D9cftcHj.js";import{t as k}from"./invariant-Ci2dTZ72.js";import{a as A,i as j,o as M,p as ee,r as te,s as N,t as P}from"./config-DRIpOKqh.js";import{r as F,v as ne}from"./session-DqoWmb7X.js";import{k as I,v as re}from"./config-Dy28fDwn.js";import{t as ie}from"./cn-ldLVeaqm.js";import{t as ae}from"./jsx-runtime-B74pBk57.js";import{a as oe,p as se,r as ce,t as le}from"./dropdown-menu-C1rnl-0o.js";import{t as L}from"./tooltip-C9TuY18o.js";import{r as ue,t as R}from"./button-COI-NGrx.js";import{t as z}from"./createLucideIcon-DfJ2oMlA.js";import{t as de}from"./check-BQNapYaf.js";import{a as fe}from"./useNumberFormatter-D7O_26UI.js";import{t as pe}from"./chevron-right-eAtVhbNZ.js";import{t as me}from"./hat-glasses-C8RhSVii.js";import{p as B}from"./write-secret-modal-DzKAInL2.js";import{t as he}from"./package-GSoSTiIK.js";import{l as ge,r as _e}from"./datasource-DfbNb83e.js";import{t as ve}from"./use-toast-Wu434mLr.js";import{n as ye}from"./strings-B2vv-ENv.js";import{a as be}from"./dist-DusFODSa.js";import{t as xe}from"./uuid-k9DpjH68.js";import{t as Se}from"./RenderHTML-DX6i99Op.js";import{t as Ce,u as we}from"./useInstallPackage-BW06eter.js";import{a as Te,r as Ee}from"./errors-CNsgAw6m.js";import{t as De}from"./kbd-pdKBv96t.js";import{t as Oe}from"./error-entries-CLnPDv7b.js";import{r as ke,t as Ae}from"./alert-DTaqCu_d.js";import{n as je,o as Me}from"./state-DtGB7xeJ.js";import{n as V}from"./cell-link-8Auigi8P.js";var Ne=z(`send`,[[`path`,{d:`M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z`,key:`1ffxy3`}],[`path`,{d:`m21.854 2.147-10.94 10.939`,key:`12cjpa`}]]),H=z(`square-arrow-out-up-right`,[[`path`,{d:`M21 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h6`,key:`y09zxi`}],[`path`,{d:`m21 3-9 9`,key:`mpx6sq`}],[`path`,{d:`M15 3h6v6`,key:`1q9fwt`}]]),Pe=z(`terminal`,[[`path`,{d:`M12 19h8`,key:`baeox8`}],[`path`,{d:`m4 17 6-6-6-6`,key:`1yngyt`}]]),U=e(c(),1),W=C(),Fe=`Fix this notebook error.`;function Ie(e,t){let n,r;return`errors`in t?(n=t.errors.map(Oe).join(`
2
- `),r=t.errors.flatMap(e=>`traceback`in e&&e.traceback?[h(S(e.traceback))]:[]).join(`
3
-
4
- `)):(r=t.tracebackFormat===`html`?h(S(t.traceback)):t.traceback,n=r.split(`
5
- `).findLast(e=>e.length>0)??``),{type:`cell-output`,cell_id:e,output:{type:`error`,instructions:Fe,message:n,...r?{traceback:r}:{}},...t.code===void 0?{}:{code:t.code}}}var Le=String.raw`_cell_([^\W_][\w-]*?)(_\w*)`,Re=String.raw`(?<!_)${Le}`;RegExp(`^${Le}$`);var ze=new RegExp(Re),G=new RegExp(Re,`g`);function Be(e){let t=[];G.lastIndex=0;let n=0,r=G.exec(e);for(;r!==null;)r.index>n&&t.push(e.slice(n,r.index)),t.push({cellId:r[1],name:r[2]}),n=r.index+r[0].length,r=G.exec(e);return n<e.length&&t.push(e.slice(n)),t}function Ve(e){return ze.test(e)}function He(e){let t=null,n=e.cursor();do n.name===`ExpressionStatement`&&(t=n.node);while(n.next());return t}function Ue(e){let t=e.split(`
6
- `),n=` `,r=He(be.parse(e));if(!r)return[`def _():`,...K(t,n),`${n}return`,``,``,`_()`].join(`
7
- `);let i=e.slice(0,r.from).trim(),a=e.slice(r.from).trim(),o=i.split(`
8
- `),s=a.split(`
9
- `);return[`def _():`,...K(o,n),`${n}return ${s[0]}`,...K(s.slice(1),n),``,``,`_()`].join(`
10
- `)}function K(e,t){if(e.length===1&&e[0]===``)return[];let n=[];for(let r of e)r===``?n.push(``):n.push(t+r);return n}function We(e,t){if(e.type===`multiple-defs`)return[{title:`Fix: Wrap in a function`,description:`Make this cell's variables local by wrapping the cell in a function.`,fixType:`manual`,onFix:async e=>{k(e.editor,`Editor is null`);let t=Ue(e.editor.state.doc.toString());e.editor.dispatch({changes:{from:0,to:e.editor.state.doc.length,insert:t}})}}];if(e.type===`exception`&&e.exception_type===`NameError`){let t=e.msg.match(/name '(.+)' is not defined/)?.[1];if(!t||!(t in Ke))return[];let n=Ge(t);return[{title:`Fix: Add '${n}'`,description:`Add a new cell for the missing import`,fixType:`manual`,onFix:async e=>{e.addCodeBelow(n)}}]}return e.type===`sql-error`&&t.aiEnabled?[{title:`Fix with AI`,description:`Fix the SQL statement`,fixType:`ai`,onFix:async t=>{let n=_e(t.cellId,a),r=`Fix the SQL statement: ${e.msg}.`;n&&(r+=`\nDatabase schema: ${n}`),t.aiFix?.setAiCompletionCell({cellId:t.cellId,initialPrompt:r,triggerImmediately:t.aiFix.triggerFix})}}]:[]}function Ge(e){let t=Ke[e];return t===e?`import ${t}`:`import ${t} as ${e}`}var Ke={mo:`marimo`,alt:`altair`,bokeh:`bokeh`,dask:`dask`,np:`numpy`,pd:`pandas`,pl:`polars`,plotly:`plotly`,plt:`matplotlib.pyplot`,px:`plotly.express`,scipy:`scipy`,sk:`sklearn`,sns:`seaborn`,stats:`scipy.stats`,tf:`tensorflow`,torch:`torch`,xr:`xarray`,dt:`datetime`,json:`json`,math:`math`,os:`os`,re:`re`,sys:`sys`},q=I(`marimo:acp:sessions:v1`,{sessions:[],activeTabId:null},m),qe=r(e=>{let t=e(q);return t.activeTabId&&t.sessions.find(e=>e.tabId===t.activeTabId)||null},(e,t,n)=>{t(q,e=>({...e,activeTabId:n}))});function Je(){return`tab_${xe()}`}function Ye(e,t=20){return e.length<=t?e:`${e.slice(0,t-3)}...`}function Xe(e,t){let n=it(t.agentId),r=Date.now(),i=t.firstMessage?Ye(t.firstMessage.trim()):`New ${t.agentId} session`,a=Je();if(n===`single`){let n=e.sessions.filter(e=>e.agentId===t.agentId),a=e.sessions.filter(e=>e.agentId!==t.agentId);if(n.length>0){let o=n[0],s={agentId:t.agentId,title:i,createdAt:r,lastUsedAt:r,tabId:o.tabId,externalAgentSessionId:null,selectedModel:t.model??o.selectedModel??null};return{...e,sessions:[...a.slice(0,0),s],activeTabId:s.tabId}}}return{...e,sessions:[...e.sessions.slice(0,0),{agentId:t.agentId,tabId:a,title:i,createdAt:r,lastUsedAt:r,externalAgentSessionId:null,selectedModel:t.model??null}],activeTabId:a}}function Ze(e,t){let n=e.sessions.filter(e=>e.tabId!==t);return{sessions:n,activeTabId:e.activeTabId===t?n.length>0?n[n.length-1].tabId:null:e.activeTabId}}function Qe(e,t){let n=e.activeTabId;return n?{...e,sessions:e.sessions.map(e=>e.tabId===n?{...e,title:Ye(t)}:e)}:e}function $e(e,t){return{...e,sessions:e.sessions.map(e=>e.tabId===t?{...e,lastUsedAt:Date.now()}:e)}}function et(e,t){let n=e.activeTabId;return n?{...e,sessions:e.sessions.map(e=>e.tabId===n?{...e,externalAgentSessionId:t,lastUsedAt:Date.now()}:e)}:e}function tt(){return[`claude`,`gemini`,`codex`,`opencode`,`cursor`]}function nt(e){return ye(e)}function rt(e){let t=J[e].port,n=window.location.hostname;return`${window.location.protocol===`https:`?`wss:`:`ws:`}//${n}:${t}/message`}var J={claude:{port:3017,command:`npx @agentclientprotocol/claude-agent-acp`,sessionSupport:`single`},gemini:{port:3019,command:`npx @google/gemini-cli --experimental-acp`,sessionSupport:`single`},codex:{port:3021,command:`npx @zed-industries/codex-acp`,sessionSupport:`single`},opencode:{port:3023,command:`npx opencode-ai acp`,sessionSupport:`single`},cursor:{port:3025,command:`agent acp`,sessionSupport:`single`}};function it(e){return J[e].sessionSupport}function at(e){let t=J[e].port,n=J[e].command;return`npx stdio-to-ws "${O()?`cmd /c ${n}`:n}" --port ${t}`}var ot=I(`marimo:chrome:ai-panel-tab`,`chat`,m);function st(){let e=(0,W.c)(3),[n,r]=t(ot),i;return e[0]!==n||e[1]!==r?(i={aiPanelTab:n,setAiPanelTab:r},e[0]=n,e[1]=r,e[2]=i):i=e[2],i}var ct=`code_mode`;function lt(e,t){return e||(_(`external_agents`)?t:`chat`)}function ut(){let e=(0,W.c)(6),{openApplication:t}=d(),{setAiPanelTab:r}=st(),{saveModeChange:i}=P(),a=s(Me),c=n(),l;return e[0]!==t||e[1]!==i||e[2]!==r||e[3]!==a||e[4]!==c?(l=async e=>{let n=lt(e.panel,c.get(ot)),o=c.get(w),s=_(`external_agents`)&&c.get(q).sessions.length>0;if(!(n===`agents`?s:o)){ve({title:n===`agents`?`No agent session`:`AI not configured`,description:n===`agents`?`Start an agent session or switch to the chat panel.`:`Configure an AI provider and chat model to fix with AI.`,variant:`danger`});return}e.panel&&r(e.panel),n===`chat`&&await i(ct).catch(dt),a({prompt:e.prompt,submit:e.submit??!1}),t(`ai`)},e[0]=t,e[1]=i,e[2]=r,e[3]=a,e[4]=c,e[5]=l):l=e[5],o(l)}function dt(){return D.error(`Failed to save mode change`)}var ft=I(`marimo:ai-autofix-mode`,`autofix`,m);function pt(){let e=(0,W.c)(3),[n,r]=t(ft),i;return e[0]!==n||e[1]!==r?(i={fixMode:n,setFixMode:r},e[0]=n,e[1]=r,e[2]=i):i=e[2],i}var Y=ae();function mt(e,t){if(e!=null)return`@error://${e}\n\nPlease fix this error.`;let n=t?.trim();return n?`My code gives the following error. Please fix it:\n\n${n}`:`Please fix this error.`}var X=e=>{let t=(0,W.c)(25),{errors:r,cellId:a,className:o}=e,c=n(),{createNewCell:l}=u(),d=i(T),f;if(t[0]!==d||t[1]!==r){let e;t[3]===d?e=t[4]:(e=e=>We(e,{aiEnabled:d}),t[3]=d,t[4]=e),f=r.flatMap(e),t[0]=d,t[1]=r,t[2]=f}else f=t[2];let p=f,m=s(je),h=ut();if(p.length===0)return null;let g=p[0],_;t[5]!==a||t[6]!==l||t[7]!==g||t[8]!==m||t[9]!==c?(_=e=>{let t=c.get(v).cellHandles[a].current?.editorView;g.onFix({addCodeBelow:e=>{l({cellId:a,autoFocus:!1,before:!1,code:e})},editor:t,cellId:a,aiFix:{setAiCompletionCell:m,triggerFix:e}}),t?.focus()},t[5]=a,t[6]=l,t[7]=g,t[8]=m,t[9]=c,t[10]=_):_=t[10];let y=_,b;t[11]!==a||t[12]!==h?(b=()=>{h({prompt:mt(a)})},t[11]=a,t[12]=h,t[13]=b):b=t[13];let x=b,S;t[14]===o?S=t[15]:(S=ie(`my-2`,o),t[14]=o,t[15]=S);let C;t[16]!==g.description||t[17]!==g.fixType||t[18]!==g.title||t[19]!==y||t[20]!==x?(C=g.fixType===`ai`?(0,Y.jsx)(_t,{tooltip:g.description,openPrompt:()=>y(!1),applyAutofix:()=>y(!0),openChat:x}):(0,Y.jsx)(L,{content:g.description,align:`start`,children:(0,Y.jsxs)(R,{size:`xs`,variant:`outline`,className:`font-normal`,onClick:()=>y(!1),children:[(0,Y.jsx)(ge,{className:`h-3 w-3 mr-2`}),g.title]})}),t[16]=g.description,t[17]=g.fixType,t[18]=g.title,t[19]=y,t[20]=x,t[21]=C):C=t[21];let w;return t[22]!==S||t[23]!==C?(w=(0,Y.jsx)(`div`,{className:S,children:C}),t[22]=S,t[23]=C,t[24]=w):w=t[24],w},ht={autofix:{Icon:ge,title:`Inline AI Fix`,description:`Apply AI fixes inline in the cell`},chat:{Icon:me,title:`Fix with AI assistant`,description:`Open the AI sidebar to fix`},prompt:{Icon:x,title:`Suggest a prompt`,description:`Edit the prompt before applying`}},gt=[`autofix`,`prompt`,`chat`],_t=e=>{let t=(0,W.c)(18),{tooltip:n,openPrompt:r,applyAutofix:i,openChat:a}=e,{fixMode:o,setFixMode:s}=pt(),c=r;o===`chat`?c=a:o===`autofix`&&(c=i);let{Icon:l,title:u}=ht[o],d;t[0]===l?d=t[1]:(d=(0,Y.jsx)(l,{className:`h-3 w-3 mr-2 mb-0.5`}),t[0]=l,t[1]=d);let f;t[2]!==c||t[3]!==d||t[4]!==u?(f=(0,Y.jsxs)(R,{size:`xs`,variant:`outline`,className:`font-normal rounded-r-none border-r-0`,onClick:c,children:[d,u]}),t[2]=c,t[3]=d,t[4]=u,t[5]=f):f=t[5];let p;t[6]!==f||t[7]!==n?(p=(0,Y.jsx)(L,{content:n,align:`start`,children:f}),t[6]=f,t[7]=n,t[8]=p):p=t[8];let m;t[9]===Symbol.for(`react.memo_cache_sentinel`)?(m=(0,Y.jsx)(se,{asChild:!0,children:(0,Y.jsx)(R,{size:`xs`,variant:`outline`,className:`rounded-l-none px-2`,"aria-label":`Fix options`,children:(0,Y.jsx)(fe,{className:`h-3 w-3`})})}),t[9]=m):m=t[9];let h;t[10]!==o||t[11]!==s?(h=gt.map(e=>(0,Y.jsx)(oe,{className:`flex items-center gap-2`,onClick:()=>s(e),children:(0,Y.jsx)(vt,{mode:e,selected:e===o})},e)),t[10]=o,t[11]=s,t[12]=h):h=t[12];let g;t[13]===h?g=t[14]:(g=(0,Y.jsxs)(le,{children:[m,(0,Y.jsx)(ce,{align:`end`,className:`w-56`,children:h})]}),t[13]=h,t[14]=g);let _;return t[15]!==p||t[16]!==g?(_=(0,Y.jsxs)(`div`,{className:`flex`,children:[p,g]}),t[15]=p,t[16]=g,t[17]=_):_=t[17],_},vt=e=>{let t=(0,W.c)(15),{mode:n,selected:r}=e,{Icon:i,title:a,description:o}=ht[n],s;t[0]===i?s=t[1]:(s=(0,Y.jsx)(i,{className:`h-4 w-4 shrink-0`}),t[0]=i,t[1]=s);let c;t[2]===a?c=t[3]:(c=(0,Y.jsx)(`span`,{className:`font-medium`,children:a}),t[2]=a,t[3]=c);let l;t[4]===o?l=t[5]:(l=(0,Y.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:o}),t[4]=o,t[5]=l);let u;t[6]!==c||t[7]!==l?(u=(0,Y.jsxs)(`div`,{className:`flex flex-col`,children:[c,l]}),t[6]=c,t[7]=l,t[8]=u):u=t[8];let d;t[9]===r?d=t[10]:(d=r&&(0,Y.jsx)(de,{className:`h-4 w-4 ml-auto shrink-0`}),t[9]=r,t[10]=d);let f;return t[11]!==s||t[12]!==u||t[13]!==d?(f=(0,Y.jsxs)(`div`,{className:`flex items-center gap-2 w-full`,children:[s,u,d]}),t[11]=s,t[12]=u,t[13]=d,t[14]=f):f=t[14],f},yt=e=>{let t=(0,W.c)(12),{local:n}=e,r;t[0]===n.name?r=t[1]:(r=(0,Y.jsx)(`span`,{className:`font-code`,children:n.name}),t[0]=n.name,t[1]=r);let i;t[2]===n.cellId?i=t[3]:(i=(0,Y.jsx)(V,{cellId:n.cellId}),t[2]=n.cellId,t[3]=i);let a;t[4]!==r||t[5]!==i?(a=(0,Y.jsxs)(`div`,{className:`max-w-xs`,children:[`Local variable `,r,` in cell`,` `,i,`.`]}),t[4]=r,t[5]=i,t[6]=a):a=t[6];let o=a,s;t[7]===n.name?s=t[8]:(s=(0,Y.jsx)(`span`,{className:`font-code cursor-help`,children:n.name}),t[7]=n.name,t[8]=s);let c;return t[9]!==s||t[10]!==o?(c=(0,Y.jsx)(L,{content:o,children:s}),t[9]=s,t[10]=o,t[11]=c):c=t[11],c},bt=e=>{let t=(0,W.c)(4),{segments:n}=e,r;t[0]===n?r=t[1]:(r=n.map(xt),t[0]=n,t[1]=r);let i;return t[2]===r?i=t[3]:(i=(0,Y.jsx)(Y.Fragment,{children:r}),t[2]=r,t[3]=i),i};function xt(e,t){return typeof e==`string`?(0,Y.jsx)(`span`,{children:e},t):(0,Y.jsx)(yt,{local:e},t)}var St=r([]),Ct=r(e=>e(re)?e(St).filter(e=>e.kind===`agent`):[]);function wt(e){return e.name||`Agent`}function Z(e){let t=e.variant===`danger`?5e3:3e3,{dismiss:n}=ve({...e,duration:t});window.setTimeout(n,t)}function Tt({getContent:e}){let t=i(ee)?.hostEnabled,n=i(Ct),r=i(F),[a,o]=(0,U.useState)(!1);return t?(0,Y.jsxs)(R,{size:`xs`,variant:`outline`,disabled:a||n.length===0||!r,onClick:async()=>{if(!(a||n.length===0||!r)){o(!0);try{await N.post(`/pair/notebooks/${encodeURIComponent(r)}/messages`,e()),Z({title:`Sent to ${n.map(wt).join(`, `)}`})}catch(e){Z({variant:`danger`,title:e instanceof Ee&&e.status===409?`No agent attached`:`Could not send error`,description:Te(e)})}finally{o(!1)}}},children:[(0,Y.jsx)(Ne,{className:`h-3 w-3 mr-2`}),`Send error to agent`]}):null}var Et=new p,Dt=e=>{let t=RegExp(`\x1B\\[[0-9;]*m`,`g`);return e.replaceAll(t,``)},Ot=/(pip\s+install|uv\s+add|uv\s+pip\s+install)\s+/gi;function kt(e){Ot.lastIndex=0;let t=Ot.exec(e);if(!t)return null;let n=t.index+t[0].length,r=e.slice(n).split(/\s+/),i=``,a=0;for(let e of r){let t=e.trim();if(!t)continue;if(t.startsWith(`-`)){a+=t.length+1;continue}let n=t.match(/^[\w,.[\]-]+/);if(n){i=n[0];break}break}if(!i)return null;let o=n+a+i.length;return{package:i,endIndex:o}}function Q(e,t=``){if(!e)return null;if(!/https?:\/\//.test(e))return e;let n=l(e);return n.length===1&&n[0].type===`text`?e:(0,Y.jsx)(Y.Fragment,{children:n.map((e,n)=>{let r=t?`${t}-${n}`:n;if(e.type===`url`){let t=Dt(e.url);return(0,Y.jsx)(`a`,{href:t,target:`_blank`,rel:`noopener noreferrer`,onClick:ue.stopPropagation(),className:`text-link hover:underline`,children:t},r)}if(e.type===`image`){let t=Dt(e.url);return(0,Y.jsx)(`a`,{href:t,target:`_blank`,rel:`noopener noreferrer`,onClick:ue.stopPropagation(),className:`text-link hover:underline`,children:t},r)}return(0,Y.jsx)(U.Fragment,{children:e.value},r)})})}var At=e=>{let t=(0,W.c)(6),{packages:n,children:r}=e,{handleInstallPackages:i}=Ce(),a;t[0]!==i||t[1]!==n?(a=e=>{i(n),e.preventDefault()},t[0]=i,t[1]=n,t[2]=a):a=t[2];let o;return t[3]!==r||t[4]!==a?(o=(0,Y.jsx)(`button`,{onClick:a,className:`text-link hover:underline`,type:`button`,children:r}),t[3]=r,t[4]=a,t[5]=o):o=t[5],o},jt=e=>{if(!(e instanceof y.Text))return;let t=Dt(e.data);if(!/(pip\s+install|uv\s+add|uv\s+pip\s+install)/i.test(t))return;let n=[],r=/(pip\s+install|uv\s+add|uv\s+pip\s+install)\s+/gi,i;for(;(i=r.exec(t))!==null;){let e=i.index,r=kt(t.slice(e));r&&n.push({match:i,result:r})}if(n.length===0)return;let a=[],o=0;if(n.forEach((e,n)=>{let{match:r,result:i}=e,s=r.index,c=s+i.endIndex;if(o<s){let e=t.slice(o,s);a.push((0,Y.jsx)(U.Fragment,{children:Q(e,`before-${n}`)},`before-${n}`))}let l=t.slice(s,c);a.push((0,Y.jsx)(At,{packages:[i.package],children:l},`install-${n}`)),o=c}),o<t.length){let e=t.slice(o);a.push((0,Y.jsx)(U.Fragment,{children:Q(e,`after`)},`after`))}return(0,Y.jsx)(Y.Fragment,{children:a})},Mt=e=>{if(!(e instanceof y.Text))return;let t=e.data;if(!/https?:\/\//.test(t))return;let n=Q(t);if(typeof n!=`string`)return(0,Y.jsx)(Y.Fragment,{children:n})},Nt=(...e)=>t=>{for(let n of e){let e=n(t);if(e!==void 0)return e}},Pt=(e,t)=>{let n=Et.ansi_to_html(e),r=f(n,{replace:e=>t(e)});return(0,Y.jsx)(`span`,{children:r})},Ft=e=>{let t=(0,W.c)(2),{text:n}=e,r;return t[0]===n?r=t[1]:(r=Pt(n,Nt(jt,Mt)),t[0]=n,t[1]=r),r},It=e=>{let t=(0,W.c)(16),{traceback:n}=e,[r,i]=(0,U.useState)(!0),a;t[0]===r?a=t[1]:(a=()=>i(!r),t[0]=r,t[1]=a);let o=r?`Collapse traceback`:`Expand traceback`,s;t[2]===r?s=t[3]:(s=r?(0,Y.jsx)(fe,{className:`h-3 w-3`}):(0,Y.jsx)(pe,{className:`h-3 w-3`}),t[2]=r,t[3]=s);let c;t[4]===Symbol.for(`react.memo_cache_sentinel`)?(c=(0,Y.jsx)(`span`,{className:`text-[0.6875rem] uppercase tracking-wider`,children:`Traceback`}),t[4]=c):c=t[4];let l;t[5]!==r||t[6]!==a||t[7]!==o||t[8]!==s?(l=(0,Y.jsxs)(`button`,{type:`button`,onClick:a,"aria-expanded":r,"aria-label":o,className:`flex items-center gap-1 text-muted-foreground/70 hover:text-muted-foreground transition-colors`,children:[s,c]}),t[5]=r,t[6]=a,t[7]=o,t[8]=s,t[9]=l):l=t[9];let u;t[10]!==r||t[11]!==n?(u=r&&(0,Y.jsx)(`div`,{className:`font-code text-sm mt-1 p-3 bg-muted rounded border overflow-auto max-h-[50vh] cursor-text select-text`,children:Se({html:n})}),t[10]=r,t[11]=n,t[12]=u):u=t[12];let d;return t[13]!==l||t[14]!==u?(d=(0,Y.jsxs)(`div`,{className:`mt-2`,children:[l,u]}),t[13]=l,t[14]=u,t[15]=d):d=t[15],d},$=e=>{let t=(0,W.c)(10),n=e.title??`Tip`,r;t[0]===n?r=t[1]:(r=(0,Y.jsx)(M,{className:`pt-2 pb-0 font-normal`,children:n}),t[0]=n,t[1]=r);let i;t[2]===e.children?i=t[3]:(i=(0,Y.jsx)(j,{className:`mr-24 text-[0.84375rem]`,wrapperClassName:`pt-0 pb-2`,children:e.children}),t[2]=e.children,t[3]=i);let a;t[4]!==r||t[5]!==i?(a=(0,Y.jsxs)(A,{value:`item-1`,className:`text-muted-foreground`,children:[r,i]}),t[4]=r,t[5]=i,t[6]=a):a=t[6];let o;return t[7]!==e.className||t[8]!==a?(o=(0,Y.jsx)(te,{type:`single`,collapsible:!0,className:e.className,children:a}),t[7]=e.className,t[8]=a,t[9]=o):o=t[9],o},Lt=e=>{let t=(0,W.c)(44),{errors:n,cellId:r,code:a,className:o}=e,s=d(),c=i(E).display.cell_output===`above`,l=i(ne).mode!==`edit`,u=`This cell wasn't run because it has errors`,f=`destructive`,p=`text-error`,m=null;if(n.some(Rt))u=`Interrupted`;else if(n.some(zt))u=`An internal error occurred`;else if(n.some(Bt))u=`Ancestor prevented from running`,f=`default`,p=`text-secondary-foreground`;else if(n.some(Vt))u=`Ancestor stopped`,f=`default`,p=`text-secondary-foreground`;else if(n.some(Ht))u=`SQL error`;else if(n.some(Ut))u=null,m=`Cell not run`;else{let e;t[0]===n?e=t[1]:(e=n.find(Wt),t[0]=n,t[1]=e);let r=e;r&&`exception_type`in r&&(u=r.exception_type)}let h,_,v,y,x,S;if(t[2]!==f||t[3]!==r||t[4]!==s||t[5]!==o||t[6]!==n||t[7]!==c||t[8]!==l||t[9]!==m||t[10]!==p||t[11]!==u){let e=n.filter(Gt),i=n.filter(Kt),a=n.filter(qt),d=n.filter(Jt),C=n.filter(Yt),w=n.filter(Xt),T=n.filter(Zt),E=n.filter(Qt),D=n.filter($t),O=n.filter(en),k=n.filter(tn),A=n.filter(nn),j=n.filter(rn),M;t[18]===s?M=t[19]:(M=()=>{s.openApplication(`scratchpad`)},t[18]=s,t[19]=M);let ee=M,te=()=>{let t=[];if(k.length>0||A.length>0){let e=k.some(an),n=!e&&k.some(on);t.push((0,Y.jsxs)(`div`,{children:[k.map(sn),A.map(cn),e&&(0,Y.jsxs)(R,{size:`xs`,variant:`outline`,className:`mt-2 font-normal`,onClick:()=>we(s),children:[(0,Y.jsx)(he,{className:`h-3.5 w-3.5 mr-1.5 mb-0.5`}),(0,Y.jsx)(`span`,{children:`Open package manager`})]}),n&&(0,Y.jsxs)(R,{size:`xs`,variant:`outline`,className:`mt-2 font-normal`,onClick:()=>s.openApplication(`terminal`),children:[(0,Y.jsx)(Pe,{className:`h-3.5 w-3.5 mr-1.5`}),(0,Y.jsx)(`span`,{children:`Open terminal`})]}),r&&(0,Y.jsx)(X,{errors:[...k,...A],cellId:r})]},`syntax-unknown`))}if(e.length>0&&t.push((0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`p`,{className:`text-muted-foreground font-medium`,children:`The setup cell cannot be run because it has references.`}),(0,Y.jsx)(`ul`,{className:`list-disc`,children:e.flatMap(ln)}),r&&(0,Y.jsx)(X,{errors:e,cellId:r}),(0,Y.jsxs)($,{title:`Why can't the setup cell have references?`,className:`mb-2`,children:[(0,Y.jsx)(`p`,{className:`pb-2`,children:`The setup cell contains logic that must be run before any other cell runs, including top-level imports used by top-level functions. For this reason, it can't refer to other cells' variables.`}),(0,Y.jsx)(`p`,{className:`py-2`,children:`Try simplifying the setup cell to only contain only necessary variables.`}),(0,Y.jsxs)(`p`,{className:`py-2`,children:[(0,Y.jsxs)(B,{href:`https://links.marimo.app/errors-setup`,children:[`Learn more at our docs`,` `,(0,Y.jsx)(H,{size:`0.75rem`,className:`inline`})]}),`.`]})]})]},`setup-refs`)),i.length>0&&t.push((0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`p`,{className:`text-muted-foreground font-medium`,children:`This cell is in a cycle.`}),(0,Y.jsx)(`ul`,{className:`list-disc`,children:i.flatMap(un)}),r&&(0,Y.jsx)(X,{errors:i,cellId:r}),(0,Y.jsxs)($,{title:`What are cycles and how do I resolve them?`,className:`mb-2`,children:[(0,Y.jsx)(`p`,{className:`pb-2`,children:`An example of a cycle is if one cell declares a variable 'a' and reads 'b', and another cell declares 'b' and and reads 'a'. Cycles like this make it impossible for marimo to know how to run your cells, and generally suggest that your code has a bug.`}),(0,Y.jsx)(`p`,{className:`py-2`,children:`Try merging these cells into a single cell to eliminate the cycle.`}),(0,Y.jsxs)(`p`,{className:`py-2`,children:[(0,Y.jsxs)(B,{href:`https://links.marimo.app/errors-cycles`,children:[`Learn more at our docs`,` `,(0,Y.jsx)(H,{size:`0.75rem`,className:`inline`})]}),`.`]})]})]},`cycle`)),a.length>0){let e=a[0].name;t.push((0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`p`,{className:`text-muted-foreground font-medium`,children:`This cell redefines variables from other cells.`}),a.map(fn),r&&(0,Y.jsx)(X,{errors:a,cellId:r}),(0,Y.jsxs)($,{title:`Why can't I redefine variables?`,children:[(0,Y.jsx)(`p`,{className:`pb-2`,children:`marimo requires that each variable is defined in just one cell. This constraint enables reactive and reproducible execution, arbitrary cell reordering, seamless UI elements, execution as a script, and more.`}),(0,Y.jsxs)(`p`,{className:`py-2`,children:[`Try merging this cell with the mentioned cells or wrapping it in a function. Alternatively, prefix variables with an underscore (e.g., `,(0,Y.jsxs)(De,{className:`inline`,children:[`_`,e]}),`). to make them private to this cell.`]}),(0,Y.jsxs)(`p`,{className:`py-2`,children:[(0,Y.jsxs)(B,{href:`https://links.marimo.app/errors-multiple-definitions`,children:[`Learn more at our docs`,` `,(0,Y.jsx)(H,{size:`0.75rem`,className:`inline`})]}),`.`]})]}),(0,Y.jsx)($,{title:`Need a scratchpad?`,children:(0,Y.jsxs)(`div`,{className:`flex flex-row gap-2 items-center`,children:[(0,Y.jsxs)(R,{size:`xs`,variant:`link`,className:`my-2 font-normal mx-0 px-0`,onClick:ee,children:[(0,Y.jsx)(g,{className:`h-3`}),(0,Y.jsx)(`span`,{children:`Try the scratchpad`})]}),(0,Y.jsx)(`span`,{children:`to experiment without restrictions on variable names.`})]})})]},`multiple-defs`))}return d.length>0&&t.push((0,Y.jsxs)(`div`,{children:[d.map(pn),r&&(0,Y.jsx)(X,{errors:d,cellId:r}),(0,Y.jsxs)($,{title:"Why can't I use `import *`?",children:[(0,Y.jsx)(`p`,{className:`pb-2`,children:`Star imports are incompatible with marimo's git-friendly file format and reproducible reactive execution.`}),(0,Y.jsx)(`p`,{className:`py-2`,children:"marimo's Python file format stores code in functions, so notebooks can be imported as regular Python modules without executing all their code. But Python disallows `import *` everywhere except at the top-level of a module."}),(0,Y.jsx)(`p`,{className:`py-2`,children:`Star imports would also silently add names to globals, which would be incompatible with reactive execution.`}),(0,Y.jsxs)(`p`,{className:`py-2`,children:[(0,Y.jsxs)(B,{href:`https://links.marimo.app/errors-import-star`,children:[`Learn more at our docs`,` `,(0,Y.jsx)(H,{size:`0.75rem`,className:`inline`})]}),`.`]})]})]},`import-star`)),C.length>0&&t.push((0,Y.jsxs)(`div`,{children:[C.map(mn),r&&(0,Y.jsx)(X,{errors:C,cellId:r})]},`interruption`)),w.length>0&&t.push((0,Y.jsxs)(`ul`,{children:[w.map((e,t)=>{if(e.exception_type===`NameError`&&e.msg.startsWith(`name 'mo'`))return(0,Y.jsx)(`li`,{className:`my-2`,children:(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`p`,{className:`text-muted-foreground`,children:`name 'mo' is not defined.`}),(0,Y.jsxs)(`p`,{className:`text-muted-foreground mt-2`,children:[`The marimo module (imported as`,` `,(0,Y.jsx)(De,{className:`inline`,children:`mo`}),`) is required for Markdown, SQL, and UI elements.`]})]})},`exception-${t}`);if(e.exception_type===`NameError`&&e.msg.startsWith(`name '_`)){let n=Be(e.msg);return(0,Y.jsx)(`li`,{className:`my-2`,children:(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`p`,{className:`text-muted-foreground`,children:(0,Y.jsx)(bt,{segments:n})}),(0,Y.jsxs)(`p`,{className:`text-muted-foreground mt-2`,children:[`Variables prefixed with an underscore are local to a cell`,` `,`(`,(0,Y.jsxs)(B,{href:`https://links.marimo.app/local-variables`,children:[`docs`,` `,(0,Y.jsx)(H,{size:`0.75rem`,className:`inline`})]}),`).`]}),c&&(0,Y.jsx)(`div`,{className:`text-muted-foreground mt-2`,children:`See the console area for a traceback.`})]})},`exception-${t}`)}return(0,Y.jsx)(`li`,{className:`my-2`,children:e.raising_cell==null?(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`p`,{className:`text-muted-foreground`,children:Q(e.msg,`exception-${t}`)}),l&&`traceback`in e&&e.traceback?(0,Y.jsx)(It,{traceback:e.traceback}):c&&(0,Y.jsx)(`div`,{className:`text-muted-foreground mt-2`,children:`See the console area for a traceback.`})]}):(0,Y.jsxs)(`div`,{children:[Q(e.msg,`exception-${t}`),(0,Y.jsx)(V,{cellId:e.raising_cell}),l&&`traceback`in e&&e.traceback&&(0,Y.jsx)(It,{traceback:e.traceback})]})},`exception-${t}`)}),w.some(hn)&&(0,Y.jsx)($,{children:`Fix the error in the mentioned cells, or handle the exceptions with try/except blocks.`}),r&&(0,Y.jsx)(X,{errors:w,cellId:r})]},`exception`)),T.length>0&&t.push((0,Y.jsxs)(`ul`,{children:[T.map(gn),r&&(0,Y.jsx)(X,{errors:T,cellId:r}),(0,Y.jsx)($,{children:T.some(_n)?`Ensure that the referenced cells define the required variables, or turn off strict execution.`:`Something is wrong with your declarations. Fix any discrepancies, or turn off strict execution.`})]},`strict-exception`)),E.length>0&&t.push((0,Y.jsxs)(`div`,{children:[E.map(vn),r&&(0,Y.jsx)(X,{errors:E,cellId:r})]},`internal`)),D.length>0&&t.push((0,Y.jsxs)(`div`,{children:[D.map(yn),r&&(0,Y.jsx)(X,{errors:D,cellId:r})]},`ancestor-prevented`)),O.length>0&&t.push((0,Y.jsxs)(`div`,{children:[O.map(bn),r&&(0,Y.jsx)(X,{errors:O,cellId:r})]},`ancestor-stopped`)),j.length>0&&t.push((0,Y.jsxs)(`div`,{children:[j.map(xn),r&&(0,Y.jsx)(X,{errors:j,cellId:r,className:`mt-2.5`})]},`sql-errors`)),t},N;t[20]===m?N=t[21]:(N=m&&(0,Y.jsxs)(`div`,{className:`flex items-center gap-1 font-code text-[0.6875rem] uppercase tracking-wider text-muted-foreground/70`,children:[m,(0,Y.jsx)(L,{content:`marimo didn't run this cell because it detected an error.`,delayDuration:200,children:(0,Y.jsx)(b,{className:`size-3 cursor-help`})})]}),t[20]=m,t[21]=N);let P;t[22]!==p||t[23]!==u?(P=u&&(0,Y.jsx)(ke,{className:`font-code font-medium ${p}`,children:u}),t[22]=p,t[23]=u,t[24]=P):P=t[24];let F;t[25]!==N||t[26]!==P?(F=(0,Y.jsxs)(`div`,{className:`space-y-0.5`,children:[N,P]}),t[25]=N,t[26]=P,t[27]=F):F=t[27];let ne=F;h=Ae,y=f,t[28]===o?x=t[29]:(x=ie(`border-none font-code text-sm text-[0.84375rem] p-0 text-muted-foreground normal has-[svg]:pl-0 space-y-2`,o),t[28]=o,t[29]=x),S=ne,_=`flex flex-col gap-4`,v=te(),t[2]=f,t[3]=r,t[4]=s,t[5]=o,t[6]=n,t[7]=c,t[8]=l,t[9]=m,t[10]=p,t[11]=u,t[12]=h,t[13]=_,t[14]=v,t[15]=y,t[16]=x,t[17]=S}else h=t[12],_=t[13],v=t[14],y=t[15],x=t[16],S=t[17];let C;t[30]!==_||t[31]!==v?(C=(0,Y.jsx)(`div`,{className:_,children:v}),t[30]=_,t[31]=v,t[32]=C):C=t[32];let w;t[33]!==r||t[34]!==a||t[35]!==n?(w=r&&n.length>0&&(0,Y.jsx)(Tt,{getContent:()=>Ie(r,{code:a,errors:n})}),t[33]=r,t[34]=a,t[35]=n,t[36]=w):w=t[36];let T;return t[37]!==h||t[38]!==y||t[39]!==x||t[40]!==S||t[41]!==C||t[42]!==w?(T=(0,Y.jsxs)(h,{variant:y,className:x,children:[S,C,w]}),t[37]=h,t[38]=y,t[39]=x,t[40]=S,t[41]=C,t[42]=w,t[43]=T):T=t[43],T};function Rt(e){return e.type===`interruption`}function zt(e){return e.type===`internal`}function Bt(e){return e.type===`ancestor-prevented`}function Vt(e){return e.type===`ancestor-stopped`}function Ht(e){return e.type===`sql-error`}function Ut(e){return e.type===`multiple-defs`||e.type===`cycle`||e.type===`setup-refs`||e.type===`import-star`}function Wt(e){return e.type===`exception`}function Gt(e){return e.type===`setup-refs`}function Kt(e){return e.type===`cycle`}function qt(e){return e.type===`multiple-defs`}function Jt(e){return e.type===`import-star`}function Yt(e){return e.type===`interruption`}function Xt(e){return e.type===`exception`}function Zt(e){return e.type===`strict-exception`}function Qt(e){return e.type===`internal`}function $t(e){return e.type===`ancestor-prevented`}function en(e){return e.type===`ancestor-stopped`}function tn(e){return e.type===`syntax`}function nn(e){return e.type===`unknown`}function rn(e){return e.type===`sql-error`}function an(e){return e.msg.includes(`!pip`)}function on(e){return e.msg.includes(`use os.subprocess`)}function sn(e,t){return(0,Y.jsx)(`pre`,{children:Q(e.msg,`syntax-${t}`)},`syntax-${t}`)}function cn(e,t){return(0,Y.jsx)(`pre`,{children:Q(e.msg,`unknown-${t}`)},`unknown-${t}`)}function ln(e,t){return e.edges_with_vars.map((e,n)=>(0,Y.jsxs)(`li`,{className:`my-0.5 ml-8 text-muted-foreground/40`,children:[(0,Y.jsx)(V,{cellId:e[0]}),(0,Y.jsxs)(`span`,{className:`text-muted-foreground`,children:[`: `,` `,e[1].length===1?e[1][0]:e[1].join(`, `)]})]},`setup-refs-${t}-${n}`))}function un(e,t){return e.edges_with_vars.map((e,n)=>(0,Y.jsxs)(`li`,{className:`my-0.5 ml-8 text-muted-foreground/40`,children:[(0,Y.jsx)(V,{cellId:e[0]}),(0,Y.jsxs)(`span`,{className:`text-muted-foreground`,children:[` -> `,e[1].length===1?e[1][0]:e[1].join(`, `),` -> `]}),(0,Y.jsx)(V,{cellId:e[2]})]},`cycle-${t}-${n}`))}function dn(e,t){return(0,Y.jsx)(`li`,{className:`my-0.5 ml-8 text-muted-foreground/40`,children:(0,Y.jsx)(V,{cellId:e})},`cell-${t}`)}function fn(e,t){return(0,Y.jsxs)(U.Fragment,{children:[(0,Y.jsx)(`p`,{className:`text-muted-foreground mt-2`,children:`'${e.name}' was also defined by:`}),(0,Y.jsx)(`ul`,{className:`list-disc`,children:e.cells.map(dn)})]},`multiple-defs-${t}`)}function pn(e,t){return(0,Y.jsx)(`p`,{className:`text-muted-foreground`,children:e.msg},`import-star-${t}`)}function mn(e,t){return(0,Y.jsx)(`p`,{children:`This cell was interrupted and needs to be re-run.`},`interruption-${t}`)}function hn(e){return e.raising_cell!=null}function gn(e,t){return(0,Y.jsx)(`li`,{className:`my-2`,children:e.blamed_cell==null?(0,Y.jsx)(`p`,{children:e.msg}):(0,Y.jsxs)(`div`,{children:[e.msg,(0,Y.jsx)(V,{cellId:e.blamed_cell})]})},`strict-exception-${t}`)}function _n(e){return e.blamed_cell!=null}function vn(e,t){return(0,Y.jsx)(`p`,{children:e.msg},`internal-${t}`)}function yn(e,t){return(0,Y.jsxs)(`div`,{children:[e.msg,e.blamed_cell==null?(0,Y.jsxs)(`span`,{children:[`(`,(0,Y.jsx)(V,{cellId:e.raising_cell}),`)`]}):(0,Y.jsxs)(`span`,{children:[`(`,(0,Y.jsx)(V,{cellId:e.raising_cell}),`\xA0blames\xA0`,(0,Y.jsx)(V,{cellId:e.blamed_cell}),`)`]})]},`ancestor-prevented-${t}`)}function bn(e,t){return(0,Y.jsxs)(`div`,{children:[e.msg,(0,Y.jsx)(V,{cellId:e.raising_cell})]},`ancestor-stopped-${t}`)}function xn(e,t){return(0,Y.jsx)(`div`,{className:`space-y-2 mt-2`,children:(0,Y.jsx)(`p`,{className:`text-muted-foreground whitespace-pre-wrap`,children:e.msg})},`sql-error-${t}`)}export{$e as C,Ie as D,Be as E,Pe as O,et as S,Ve as T,it as _,Ct as a,Ze as b,bt as c,ut as d,st as f,nt as g,at as h,Z as i,_t as l,q as m,Ft as n,wt as o,Xe as p,Tt as r,St as s,Lt as t,mt as u,rt as v,Qe as w,qe as x,tt as y};
@@ -1 +0,0 @@
1
- import{c as e,l as t,t as n,u as r}from"./useEvent-Dfcbgjhg.js";import{D as i,In as a,M as o,P as s,gr as c,xo as l,za as u}from"./cells-C6YGYGdi.js";import{t as d}from"./compiler-runtime-BrajqUja.js";import{p as f}from"./config-CA1V-wjh.js";import{g as p}from"./useEventListener-D9cftcHj.js";import{i as m}from"./utils-B4K466FK.js";import{c as h}from"./session-DqoWmb7X.js";import{T as g,_}from"./config-Dy28fDwn.js";import{t as v}from"./cn-ldLVeaqm.js";import{t as y}from"./jsx-runtime-B74pBk57.js";import{n as b}from"./paths-bkIFVj8h.js";import{b as x}from"./write-secret-modal-DzKAInL2.js";import{r as S}from"./requests-lt0JK8Jt.js";var C=d();function w(){return t(u)}function T(){let t=(0,C.c)(5),[i]=e(_),a=r(u),{openAlert:o}=x(),{sendRename:s}=S(),c;return t[0]!==i.state||t[1]!==o||t[2]!==s||t[3]!==a?(c=async e=>{let t=f();return i.state===g.OPEN?(h(t=>{e===null?t.delete(m.filePath):t.set(m.filePath,e)}),s({filename:e}).then(()=>(a(e),document.title=t.app_title||b.basename(e)||`Untitled Notebook`,e)).catch(e=>(o(e.message),null))):(o(`Failed to save notebook: not connected to a kernel.`),null)},t[0]=i.state,t[1]=o,t[2]=s,t[3]=a,t[4]=c):c=t[4],n(c)}var E=y(),D=e=>{let t=(0,C.c)(12),{className:n,cellId:r,variant:c,onClick:l,formatCellName:u,skipScroll:d}=e,f=s()[r]??``,p=o().inOrderIds.indexOf(r),{showCellIfHidden:m}=i(),h=u??j,g;t[0]===n?g=t[1]:(g=v(`inline-block cursor-pointer text-link hover:underline`,n),t[0]=n,t[1]=g);let _;t[2]!==r||t[3]!==l||t[4]!==m||t[5]!==d||t[6]!==c?(_=e=>{if(r===`__scratch__`)return!1;m({cellId:r}),e.stopPropagation(),e.preventDefault(),requestAnimationFrame(()=>{A(r,c,d)&&l?.()})},t[2]=r,t[3]=l,t[4]=m,t[5]=d,t[6]=c,t[7]=_):_=t[7];let y=h(a(f,p)),b;return t[8]!==g||t[9]!==_||t[10]!==y?(b=(0,E.jsx)(`div`,{className:g,role:`link`,tabIndex:-1,onClick:_,children:y}),t[8]=g,t[9]=_,t[10]=y,t[11]=b):b=t[11],b},O=e=>{let t=(0,C.c)(2),n;return t[0]===e?n=t[1]:(n=(0,E.jsx)(D,{...e,variant:`destructive`}),t[0]=e,t[1]=n),n},k=e=>{let t=(0,C.c)(10),{cellId:n,lineNumber:r}=e,i=w(),a;t[0]!==n||t[1]!==r?(a=()=>c(n,r),t[0]=n,t[1]=r,t[2]=a):a=t[2];let o;t[3]!==n||t[4]!==i?(o=e=>n===`__scratch__`?`scratch`:`marimo://${i||`untitled`}#cell=${e}`,t[3]=n,t[4]=i,t[5]=o):o=t[5];let s;return t[6]!==n||t[7]!==a||t[8]!==o?(s=(0,E.jsx)(D,{cellId:n,onClick:a,skipScroll:!0,variant:`destructive`,className:`traceback-cell-link`,formatCellName:o}),t[6]=n,t[7]=a,t[8]=o,t[9]=s):s=t[9],s};function A(e,t,n){let r=l.create(e),i=document.getElementById(r),a=i?.classList.contains(`has-error`);return i===null?(p.error(`Cell ${r} not found on page.`),!1):(n||i.scrollIntoView({behavior:`smooth`,block:`center`}),(t===`destructive`||a&&t===void 0)&&(i.classList.add(`error-outline`),setTimeout(()=>{i.classList.remove(`error-outline`)},2e3)),(t===`focus`||!a&&t===void 0)&&(i.classList.add(`focus-outline`),setTimeout(()=>{i.classList.remove(`focus-outline`)},2e3)),!0)}function j(e){return e}export{w as a,A as i,O as n,T as o,k as r,D as t};