@marimo-team/islands 0.25.3-dev206 → 0.25.3-dev207

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 (84) hide show
  1. package/dist/{ConnectedDataExplorerComponent-DFynurqb.js → ConnectedDataExplorerComponent-ApTYh0V3.js} +4 -4
  2. package/dist/{ErrorBoundary-DZyGV5dX.js → ErrorBoundary-DV6q3WpD.js} +2 -2
  3. package/dist/{abnfDiagram-VCTEODGH-DGkUyNdz.js → abnfDiagram-VCTEODGH-uo9xhZY0.js} +2 -2
  4. package/dist/{architectureDiagram-5GKGNRK7-Bav9J7uF.js → architectureDiagram-5GKGNRK7-Hz6eyeOD.js} +1 -1
  5. package/dist/assets/__vite-browser-external-CBRgnYY0.js +1 -0
  6. package/dist/assets/{worker-DodjWT_Z.js → worker-DiPNP__U.js} +2 -2
  7. package/dist/{chat-ui-Dorq26Pp.js → chat-ui-BTA1I5i1.js} +7 -7
  8. package/dist/{chunk-IMKFNOWR-1UCTsTqh.js → chunk-IMKFNOWR-DBM2i23k.js} +1 -1
  9. package/dist/{chunk-SHT3W25Y-Bige_rTb.js → chunk-SHT3W25Y-L8KQLLBy.js} +1 -1
  10. package/dist/{chunk-SVP7TREG-Cmr0Anfb.js → chunk-SVP7TREG-BOUJKJEP.js} +1 -1
  11. package/dist/{chunk-TICWLB2K-IWykFldb.js → chunk-TICWLB2K-DY3CzFjX.js} +1 -1
  12. package/dist/{classDiagram-ZZMXUADV-BH73ECRQ.js → classDiagram-ZZMXUADV-s9iwW-q4.js} +2 -2
  13. package/dist/{classDiagram-v2-VYDZK3BY-CCuCgq0H.js → classDiagram-v2-VYDZK3BY-2GI5CjGB.js} +2 -2
  14. package/dist/{code-visibility-CFFYYeyU.js → code-visibility-DLj8SFEM.js} +4 -4
  15. package/dist/{common-B9xea2wZ.js → common-BEiP9-YB.js} +9 -9
  16. package/dist/{cynefinDiagram-5FMLGOSQ-CWtL7MIJ.js → cynefinDiagram-5FMLGOSQ-DOxnhBK2.js} +1 -1
  17. package/dist/{dagre-GXQ25YYZ-DsVO2pVC.js → dagre-GXQ25YYZ-D1AhEfpM.js} +1 -1
  18. package/dist/{data-grid-overlay-editor-De3J2jxB.js → data-grid-overlay-editor-Bt6VgNDi.js} +1 -1
  19. package/dist/{diagram-S7CK7UJ4-BuAktgZv.js → diagram-S7CK7UJ4-DV_GebF_.js} +1 -1
  20. package/dist/{diagram-UQ7AKVKN-DlkAXHu5.js → diagram-UQ7AKVKN-6dNzGFfD.js} +1 -1
  21. package/dist/{diagram-VX7I27RA-B9U9H0E8.js → diagram-VX7I27RA-DUh9jsfi.js} +1 -1
  22. package/dist/{diagram-Z3DM3KII-BqmfxzUL.js → diagram-Z3DM3KII-Cug-qcQ8.js} +1 -1
  23. package/dist/{dropdown-menu-BFQYzWmC.js → dropdown-menu-dlEm41Bt.js} +1 -1
  24. package/dist/{ebnfDiagram-PWID7BFC-CH5t8ATi.js → ebnfDiagram-PWID7BFC-d5LKx7Vb.js} +2 -2
  25. package/dist/{erDiagram-RLTQ6QDP-DdIo2BIb.js → erDiagram-RLTQ6QDP-BwvlkcID.js} +1 -1
  26. package/dist/{error-entries-B0bcEwXm.js → error-entries-CVUHA5r_.js} +3875 -3884
  27. package/dist/{feedback-button-DXpmx6ff.js → feedback-button-Dd87gzc6.js} +5 -5
  28. package/dist/{flowDiagram-HODETNUW-BmYk_-Na.js → flowDiagram-HODETNUW-CJcSoFer.js} +2 -2
  29. package/dist/{formats-DyYnckF5.js → formats-Ry7c-aIV.js} +1 -1
  30. package/dist/{glide-data-editor-BevQ8Zdz.js → glide-data-editor-CW4LOU-D.js} +5 -5
  31. package/dist/{globals-Beuc24As.js → globals-D3AhIN1i.js} +2 -2
  32. package/dist/{html-to-image-BOd7ryZJ.js → html-to-image--E3uFbJ9.js} +5 -5
  33. package/dist/{infoDiagram-27XIBGKW-DvYh-Sbk.js → infoDiagram-27XIBGKW-Cezgppw3.js} +1 -1
  34. package/dist/{ishikawaDiagram-5VMMS53U-BdHnYq8s.js → ishikawaDiagram-5VMMS53U-BahZQwJz.js} +1 -1
  35. package/dist/{kanban-definition-UXKFOSKX-Bf8CT_tU.js → kanban-definition-UXKFOSKX-Cvfn_Obm.js} +1 -1
  36. package/dist/main.js +22 -22
  37. package/dist/{mermaid-DBpOnw8c.js → mermaid-BrdwbArF.js} +34 -34
  38. package/dist/{mindmap-definition-YA3MSWOX-DkYG8ltR.js → mindmap-definition-YA3MSWOX-uB4B2d-J.js} +1 -1
  39. package/dist/{number-overlay-editor-DX_x9WUo.js → number-overlay-editor-klVnf90Q.js} +1 -1
  40. package/dist/{pegDiagram-XKGWAZYB-DM7BQ0ip.js → pegDiagram-XKGWAZYB-CYaIwAmH.js} +2 -2
  41. package/dist/{pieDiagram-E7YTZNPT-CPFGg4YS.js → pieDiagram-E7YTZNPT-BJ1oUxVv.js} +1 -1
  42. package/dist/{process-output-8BbxxGrz.js → process-output-SjJxB1wh.js} +2 -2
  43. package/dist/{railroadDiagram-O6MQD6OU-4rUJlIpQ.js → railroadDiagram-O6MQD6OU-BqKSaBux.js} +2 -2
  44. package/dist/{requirementDiagram-BXWQKSXE-F6ffUUQC.js → requirementDiagram-BXWQKSXE-DwFhgDhH.js} +1 -1
  45. package/dist/{reveal-component-BMw2TipA.js → reveal-component-CS16WNwA.js} +6 -6
  46. package/dist/{sequenceDiagram-WJ2MYXX4-tNU95HVS.js → sequenceDiagram-WJ2MYXX4-L7ENjfKF.js} +1 -1
  47. package/dist/{spec-Alkla7dB.js → spec-BcJ9ncAY.js} +1 -1
  48. package/dist/{stateDiagram-D77RDMKH-BA8Modqv.js → stateDiagram-D77RDMKH-CVf88u-p.js} +2 -2
  49. package/dist/{stateDiagram-v2-MP3YSRHH-CFmickht.js → stateDiagram-v2-MP3YSRHH-DvpkQ1V6.js} +2 -2
  50. package/dist/style.css +1 -1
  51. package/dist/{swimlanes-42K2YHIH-DBiYZZZc.js → swimlanes-42K2YHIH-DIuFHbVE.js} +1 -1
  52. package/dist/{swimlanesDiagram-VR7AAH4N-CsgR851k.js → swimlanesDiagram-VR7AAH4N-CAqHAziW.js} +2 -2
  53. package/dist/{timeline-definition-24CTP7MA-Dfj0CMXY.js → timeline-definition-24CTP7MA-xO4EQqBm.js} +1 -1
  54. package/dist/{toDate-B0-Y0SEW.js → toDate-BZZ64K_m.js} +1 -5
  55. package/dist/{useAsyncData-Phxf6GCd.js → useAsyncData-Dqw22wZQ.js} +1 -1
  56. package/dist/{useDeepCompareMemoize-BXv7DUcU.js → useDeepCompareMemoize-D3gozcjJ.js} +1 -1
  57. package/dist/{useLifecycle-DDDsO4O2.js → useLifecycle-CaZi4wTw.js} +1 -1
  58. package/dist/{useTheme-DbBkeP6Z.js → useTheme-TzPgWXwB.js} +1 -4
  59. package/dist/{vega-component-C_dhEynE.js → vega-component-Blvspl7v.js} +5 -5
  60. package/dist/{vennDiagram-4TSXK5OY-fJ83Z7FE.js → vennDiagram-4TSXK5OY-DzCi-lRh.js} +1 -1
  61. package/dist/{wardleyDiagram-VM6X3IG4-DbO9cD15.js → wardleyDiagram-VM6X3IG4-CW48xa0n.js} +1 -1
  62. package/dist/{xychartDiagram-S5SC5T6Z-DmsdQJG7.js → xychartDiagram-S5SC5T6Z-UPxGGI2B.js} +1 -1
  63. package/package.json +2 -6
  64. package/src/components/app-config/user-config-form.tsx +0 -26
  65. package/src/components/editor/cell/code/cell-editor.tsx +11 -100
  66. package/src/components/editor/chrome/wrapper/footer.tsx +0 -2
  67. package/src/core/cells/__tests__/document.test.ts +0 -18
  68. package/src/core/cells/document.ts +6 -9
  69. package/src/core/codemirror/cells/__tests__/extensions.test.ts +1 -46
  70. package/src/core/codemirror/cells/extensions.ts +1 -19
  71. package/src/core/config/config-schema.ts +0 -1
  72. package/src/core/config/feature-flag.tsx +0 -2
  73. package/src/core/runtime/__tests__/runtime.test.ts +0 -16
  74. package/src/core/runtime/runtime.ts +0 -8
  75. package/src/css/app/codemirror.css +1 -1
  76. package/dist/assets/__vite-browser-external-BCJsx8QS.js +0 -1
  77. package/src/components/editor/cell/code/__tests__/rtc-editor-config.test.ts +0 -50
  78. package/src/components/editor/chrome/wrapper/footer-items/rtc-status.tsx +0 -65
  79. package/src/core/codemirror/rtc/extension.ts +0 -464
  80. package/src/core/codemirror/rtc/loro/__tests__/sync.test.ts +0 -52
  81. package/src/core/codemirror/rtc/loro/awareness.ts +0 -546
  82. package/src/core/codemirror/rtc/loro/colors.ts +0 -38
  83. package/src/core/codemirror/rtc/loro/sync.ts +0 -169
  84. package/src/core/rtc/state.ts +0 -34
@@ -9,7 +9,7 @@ import "./chunk-4HAMMTFA-D4eFPyFh.js";
9
9
  import "./chunk-GVQU2GXP-Cwbt-lF0.js";
10
10
  import "./chunk-L3NEJ4N5-n-zgIVSy.js";
11
11
  import { o as n } from "./chunk-OSK3NFVY-DXa-Cxbn.js";
12
- import { c as r } from "./mermaid-DBpOnw8c.js";
12
+ import { c as r } from "./mermaid-BrdwbArF.js";
13
13
  //#region ../node_modules/.pnpm/mermaid@11.17.2/node_modules/mermaid/dist/chunks/mermaid.core/swimlanes-42K2YHIH.mjs
14
14
  var i = 5, a = 1e-5, o = 1e-6;
15
15
  function s(e) {
@@ -9,11 +9,11 @@ import "./chunk-4HAMMTFA-D4eFPyFh.js";
9
9
  import "./chunk-GVQU2GXP-Cwbt-lF0.js";
10
10
  import "./chunk-L3NEJ4N5-n-zgIVSy.js";
11
11
  import "./chunk-OSK3NFVY-DXa-Cxbn.js";
12
- import "./mermaid-DBpOnw8c.js";
12
+ import "./mermaid-BrdwbArF.js";
13
13
  import "./chunk-F27PBJKO-ufseIn5y.js";
14
14
  import "./chunk-XXDRQBXY-Dnl5VBqG.js";
15
15
  import "./chunk-POPQ4Y6H-hYOXbYH_.js";
16
- import { r as t, t as n } from "./chunk-SHT3W25Y-Bige_rTb.js";
16
+ import { r as t, t as n } from "./chunk-SHT3W25Y-L8KQLLBy.js";
17
17
  //#region ../node_modules/.pnpm/mermaid@11.17.2/node_modules/mermaid/dist/chunks/mermaid.core/swimlanesDiagram-VR7AAH4N.mjs
18
18
  var r = n({
19
19
  defaultLayout: "swimlane",
@@ -3,7 +3,7 @@ import { p as t } from "./chunk-75Z2AOVW-D7gxIs2Q.js";
3
3
  import { n, t as r } from "./src-CA_m4ONl.js";
4
4
  import { n as i, t as a } from "./chunk-Y2CYZVJY-DKKS1VyV.js";
5
5
  import { $ as o, J as s, a as c, b as l, et as u, nt as d, o as f, x as p } from "./chunk-DU6HZSFF-BwiyaNpg.js";
6
- import { p as m } from "./mermaid-DBpOnw8c.js";
6
+ import { p as m } from "./mermaid-BrdwbArF.js";
7
7
  //#region ../node_modules/.pnpm/mermaid@11.17.2/node_modules/mermaid/dist/chunks/mermaid.core/timeline-definition-24CTP7MA.mjs
8
8
  var h = (function() {
9
9
  var e = /* @__PURE__ */ i(function(e, t, n, r) {
@@ -2,7 +2,7 @@ import { t as e } from "./rolldown-runtime-Cb76FRpK.js";
2
2
  import { g as t } from "./button-BQRdqQi1.js";
3
3
  import { t as n } from "./compiler-runtime-CldRdSsv.js";
4
4
  import { m as r } from "./tooltip-s4zZxwKe.js";
5
- import { F as i, M as a, a as o, b as s, o as c } from "./useTheme-DbBkeP6Z.js";
5
+ import { F as i, M as a, a as o, b as s, o as c } from "./useTheme-TzPgWXwB.js";
6
6
  import { t as l } from "./invariant-DLmrl-hA.js";
7
7
  var u = r("circle-question-mark", [
8
8
  ["circle", {
@@ -580,10 +580,6 @@ var G = new Set(Object.values(o)), K = class {
580
580
  let t = this.formatHttpURL({ path: `/api/marimo/v1/notebooks/${encodeURIComponent(e)}` });
581
581
  return t.searchParams.delete(o.accessToken), t;
582
582
  }
583
- getWsSyncURL(e) {
584
- let t = this.getSessionURL("/ws_sync", e);
585
- return q(this.appendCrossOriginAuth(t).toString());
586
- }
587
583
  getTerminalWsURL(e) {
588
584
  let t = this.formatWsURL("/terminal/ws");
589
585
  return e && (t.searchParams.set("rows", String(e.rows)), t.searchParams.set("cols", String(e.cols))), t;
@@ -1,7 +1,7 @@
1
1
  import { a as e } from "./rolldown-runtime-Cb76FRpK.js";
2
2
  import { t } from "./react-sHtZdjeP.js";
3
3
  import { t as n } from "./compiler-runtime-CldRdSsv.js";
4
- import { R as r } from "./useTheme-DbBkeP6Z.js";
4
+ import { R as r } from "./useTheme-TzPgWXwB.js";
5
5
  import { t as i } from "./invariant-DLmrl-hA.js";
6
6
  //#region src/hooks/useAsyncData.ts
7
7
  var a = n(), o = /* @__PURE__ */ e(t(), 1), s = {
@@ -1,6 +1,6 @@
1
1
  import { a as e } from "./rolldown-runtime-Cb76FRpK.js";
2
2
  import { t } from "./react-sHtZdjeP.js";
3
- import { C as n } from "./useTheme-DbBkeP6Z.js";
3
+ import { C as n } from "./useTheme-TzPgWXwB.js";
4
4
  //#region src/hooks/useDeepCompareMemoize.ts
5
5
  var r = /* @__PURE__ */ e(t(), 1);
6
6
  function i(e) {
@@ -4,7 +4,7 @@ import { t as i } from "./react-sHtZdjeP.js";
4
4
  import { t as a } from "./compiler-runtime-CldRdSsv.js";
5
5
  import { m as o } from "./tooltip-s4zZxwKe.js";
6
6
  import { t as s } from "./jsx-runtime-3BD1kT0s.js";
7
- import { F as c, N as l } from "./useTheme-DbBkeP6Z.js";
7
+ import { F as c, N as l } from "./useTheme-TzPgWXwB.js";
8
8
  var u = o("calendar", [
9
9
  ["path", {
10
10
  d: "M8 2v4",
@@ -910,10 +910,7 @@ var rt = F((e) => {
910
910
  custom_models: []
911
911
  })
912
912
  }).prefault({}),
913
- experimental: s({
914
- markdown: p().optional(),
915
- rtc: p().optional()
916
- }).prefault(() => ({})),
913
+ experimental: s({ markdown: p().optional() }).prefault(() => ({})),
917
914
  server: s({
918
915
  disable_file_downloads: p().optional(),
919
916
  transport: m(["websocket", "sse"]).optional()
@@ -3,20 +3,20 @@ import { g as t, h as n, m as r, o as i } from "./button-BQRdqQi1.js";
3
3
  import { t as a } from "./react-sHtZdjeP.js";
4
4
  import { t as o } from "./compiler-runtime-CldRdSsv.js";
5
5
  import { t as s } from "./tooltip-s4zZxwKe.js";
6
- import { C as c, a as l } from "./toDate-B0-Y0SEW.js";
6
+ import { C as c, a as l } from "./toDate-BZZ64K_m.js";
7
7
  import { t as u } from "./jsx-runtime-3BD1kT0s.js";
8
8
  import { n as d } from "./error-banner-DxJ3s8YO.js";
9
9
  import { t as f } from "./debounce-C3jyATpc.js";
10
- import { R as p, n as ee } from "./useTheme-DbBkeP6Z.js";
10
+ import { R as p, n as ee } from "./useTheme-TzPgWXwB.js";
11
11
  import { t as te } from "./objects-DCmMvZtn.js";
12
12
  import { a as m, t as h } from "./arrays-DoQ-AILx.js";
13
- import { t as ne } from "./useAsyncData-Phxf6GCd.js";
14
- import { a as g, i as re, n as ie, t as ae } from "./formats-DyYnckF5.js";
13
+ import { t as ne } from "./useAsyncData-Dqw22wZQ.js";
14
+ import { a as g, i as re, n as ie, t as ae } from "./formats-Ry7c-aIV.js";
15
15
  import { t as _ } from "./semaphore-89jsoHtS.js";
16
16
  import { D as oe, n as se } from "./vega-loader.browser-B9Pz0EGP.js";
17
17
  import { t as ce } from "./react-vega-C4T9Rb_w.js";
18
18
  import { a as le, n as v } from "./loader-DOVB0Syl.js";
19
- import { t as ue } from "./useDeepCompareMemoize-BXv7DUcU.js";
19
+ import { t as ue } from "./useDeepCompareMemoize-D3gozcjJ.js";
20
20
  import { t as de } from "./use-vega-container-remeasure-Bz4PZMtt.js";
21
21
  //#region src/plugins/impl/vega/fix-relative-url.ts
22
22
  var fe = /* @__PURE__ */ e(a(), 1), pe = o();
@@ -3,7 +3,7 @@ import { t } from "./src-CA_m4ONl.js";
3
3
  import { n } from "./chunk-Y2CYZVJY-DKKS1VyV.js";
4
4
  import { $ as r, H as i, K as a, U as o, a as s, b as c, c as l, et as u, f as d, nt as f, tt as p, v as m, w as h, y as g } from "./chunk-DU6HZSFF-BwiyaNpg.js";
5
5
  import { t as _ } from "./rough.esm-CtV9AnV1.js";
6
- import { p as v } from "./mermaid-DBpOnw8c.js";
6
+ import { p as v } from "./mermaid-BrdwbArF.js";
7
7
  //#region ../node_modules/.pnpm/khroma@2.1.0/node_modules/khroma/dist/methods/transparentize.js
8
8
  var y = (e, t) => p(e, "a", -t), b = 1e-10;
9
9
  function x(e, t) {
@@ -2,7 +2,7 @@ import { i as e } from "./chunk-75Z2AOVW-D7gxIs2Q.js";
2
2
  import { n as t } from "./src-CA_m4ONl.js";
3
3
  import { n } from "./chunk-Y2CYZVJY-DKKS1VyV.js";
4
4
  import { D as r, H as i, K as a, U as o, a as s, b as c, c as l, v as u, w as d, x as f, y as p } from "./chunk-DU6HZSFF-BwiyaNpg.js";
5
- import { p as m } from "./mermaid-DBpOnw8c.js";
5
+ import { p as m } from "./mermaid-BrdwbArF.js";
6
6
  import { n as h } from "./mermaid-parser.core-DxuSfYwJ.js";
7
7
  import { t as g } from "./chunk-JWPE2WC7-DJvv1t8U.js";
8
8
  //#region ../node_modules/.pnpm/mermaid@11.17.2/node_modules/mermaid/dist/chunks/mermaid.core/wardleyDiagram-VM6X3IG4.mjs
@@ -9,7 +9,7 @@ import { n as s } from "./chunk-Y2CYZVJY-DKKS1VyV.js";
9
9
  import { D as c, H as l, K as u, U as d, a as f, b as p, c as m, f as h, v as g, w as _, y as v, z as y } from "./chunk-DU6HZSFF-BwiyaNpg.js";
10
10
  import "./chunk-PWAF6VOD-CQw5qATZ.js";
11
11
  import { t as b } from "./chunk-GMAD6QVW-BhaJx0X3.js";
12
- import { p as x } from "./mermaid-DBpOnw8c.js";
12
+ import { p as x } from "./mermaid-BrdwbArF.js";
13
13
  //#region ../node_modules/.pnpm/d3-scale@4.0.2/node_modules/d3-scale/src/band.js
14
14
  function S() {
15
15
  var e = t().unknown(void 0), r = e.domain, i = e.range, o = 0, s = 1, c, l, u = !1, d = 0, f = 0, p = .5;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marimo-team/islands",
3
- "version": "0.25.3-dev206",
3
+ "version": "0.25.3-dev207",
4
4
  "main": "dist/main.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",
@@ -52,12 +52,12 @@
52
52
  "@lezer/lr": "^1.4.10",
53
53
  "@lezer/markdown": "^1.7.2",
54
54
  "@lezer/python": "^1.1.19",
55
+ "@marimo-team/client": "workspace:*",
55
56
  "@marimo-team/codemirror-ai": "^0.3.10",
56
57
  "@marimo-team/codemirror-languageserver": "^2.0.1",
57
58
  "@marimo-team/codemirror-mcp": "^0.1.7",
58
59
  "@marimo-team/codemirror-sql": "^0.3.0",
59
60
  "@marimo-team/llm-info": "workspace:*",
60
- "@marimo-team/client": "workspace:*",
61
61
  "@marimo-team/marimo-api": "workspace:*",
62
62
  "@marimo-team/react-slotz": "^0.2.0",
63
63
  "@marimo-team/smart-cells": "workspace:*",
@@ -111,13 +111,10 @@
111
111
  "js-cookie": "^3.0.8",
112
112
  "katex": "^0.18.7",
113
113
  "lodash-es": "^4.18.1",
114
- "loro-codemirror": "^0.3.3",
115
- "loro-crdt": "^1.16.1",
116
114
  "lucide-react": "^0.577.0",
117
115
  "lz-string": "^1.5.0",
118
116
  "marked": "^15.0.12",
119
117
  "mermaid": "^11.17.2",
120
- "partysocket": "1.3.0",
121
118
  "path-to-regexp": "^8.4.2",
122
119
  "plotly.js": "^3.7.0",
123
120
  "pyodide": "314.0.0",
@@ -228,7 +225,6 @@
228
225
  "tailwindcss": "^4.3.3",
229
226
  "vega-typings": "^2.3.0",
230
227
  "vite": "^8.3.4",
231
- "vite-plugin-wasm": "^3.6.0",
232
228
  "vitest": "^4.1.11",
233
229
  "yaml": "^2.9.1"
234
230
  }
@@ -23,7 +23,6 @@ import {
23
23
  Form,
24
24
  FormControl,
25
25
  FormDescription,
26
- FormField,
27
26
  FormItem,
28
27
  FormLabel,
29
28
  FormMessage,
@@ -1293,31 +1292,6 @@ export const UserConfigForm: React.FC = () => {
1293
1292
  notebook to take effect.
1294
1293
  </p>
1295
1294
 
1296
- <FormField
1297
- control={form.control}
1298
- name="experimental.rtc_v2"
1299
- render={({ field }) => (
1300
- <div className="flex flex-col gap-y-1">
1301
- <FormItem className={formItemClasses}>
1302
- <FormLabel className="font-normal">
1303
- Real-Time Collaboration
1304
- </FormLabel>
1305
- <FormControl>
1306
- <Checkbox
1307
- data-testid="rtc-checkbox"
1308
- checked={field.value === true}
1309
- onCheckedChange={field.onChange}
1310
- />
1311
- </FormControl>
1312
- </FormItem>
1313
-
1314
- <FormDescription>
1315
- Enable experimental real-time collaboration. This change
1316
- requires a page refresh to take effect.
1317
- </FormDescription>
1318
- </div>
1319
- )}
1320
- />
1321
1295
  <OverriddenFormField
1322
1296
  control={form.control}
1323
1297
  name="experimental.external_agents"
@@ -1,13 +1,11 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
  import { historyField } from "@codemirror/commands";
3
- import { EditorState, type Extension, StateEffect } from "@codemirror/state";
3
+ import { EditorState, StateEffect } from "@codemirror/state";
4
4
  import { EditorView, ViewPlugin } from "@codemirror/view";
5
5
  import { useIntersectionObserver } from "@uidotdev/usehooks";
6
6
  import { useAtom, useAtomValue, useSetAtom } from "jotai";
7
7
  import React, { memo, useEffect, useMemo, useRef, useState } from "react";
8
8
  import useEvent from "react-use-event-hook";
9
- import { Button } from "@/components/ui/button";
10
- import { DelayMount } from "@/components/utils/delay-mount";
11
9
  import { aiCompletionCellAtom } from "@/core/ai/state";
12
10
  import { maybeAddMarimoImport } from "@/core/cells/add-missing-import";
13
11
  import { getNotebook } from "@/core/cells/cells";
@@ -35,17 +33,10 @@ import { prepareCellCodeUpdate } from "@/core/codemirror/language/cell-code";
35
33
  import { getEditorCodeAsPython } from "@/core/codemirror/language/utils";
36
34
  import { MARKDOWN_INITIAL_HIDE_CODE } from "@/core/codemirror/language/languages/markdown";
37
35
  import type { LanguageAdapterType } from "@/core/codemirror/language/types";
38
- import {
39
- connectedDocAtom,
40
- realTimeCollaboration,
41
- } from "@/core/codemirror/rtc/extension";
42
36
  import { autoInstantiateAtom, isAiFeatureEnabled } from "@/core/config/config";
43
37
  import type { UserConfig } from "@/core/config/config-schema";
44
38
  import { OverridingHotkeyProvider } from "@/core/hotkeys/hotkeys";
45
- import { connectionAtom } from "@/core/network/connection";
46
- import { canUseRtc, isRtcEnabled } from "@/core/rtc/state";
47
39
  import { useSaveNotebook } from "@/core/saving/save-component";
48
- import { isAppConnecting } from "@/core/session/connection-utils";
49
40
  import type { Theme } from "@/theme/useTheme";
50
41
  import { cn } from "@/utils/cn";
51
42
  import { invariant } from "@/utils/invariant";
@@ -99,21 +90,6 @@ export interface CellEditorProps
99
90
  tooltipParentSelector?: string;
100
91
  }
101
92
 
102
- export function composeRtcEditorConfig(
103
- code: string,
104
- extensions: Extension[],
105
- rtc: ReturnType<typeof realTimeCollaboration> | undefined,
106
- ): { code: string; extensions: Extension[] } {
107
- if (!rtc) {
108
- return { code, extensions };
109
- }
110
-
111
- return {
112
- code: rtc.code,
113
- extensions: [...extensions, rtc.extension],
114
- };
115
- }
116
-
117
93
  const CellEditorInternal = ({
118
94
  theme,
119
95
  showPlaceholder,
@@ -358,42 +334,24 @@ const CellEditorInternal = ({
358
334
  saveOrNameNotebook,
359
335
  ]);
360
336
 
361
- const rtcEnabled = isRtcEnabled() && canUseRtc(cellId);
362
- const createEditorConfig = (initialCode?: string) => {
363
- if (!rtcEnabled) {
364
- return composeRtcEditorConfig(code, extensions, undefined);
365
- }
366
-
367
- const rtc = realTimeCollaboration(cellId, initialCode);
368
- return composeRtcEditorConfig(code, extensions, rtc);
369
- };
370
-
371
337
  const handleInitializeEditor = useEvent(() => {
372
- const editorConfig = createEditorConfig(code);
373
-
374
338
  // Create a new editor
375
339
  const ev = new EditorView({
376
- state: EditorState.create({
377
- doc: editorConfig.code,
378
- extensions: editorConfig.extensions,
379
- }),
340
+ state: EditorState.create({ doc: code, extensions }),
380
341
  });
381
342
  setEditorView(ev);
382
343
  // Initialize the language adapter
383
- if (!rtcEnabled) {
384
- switchLanguage(ev, {
385
- language: getInitialLanguageAdapter(ev.state).type,
386
- });
387
- }
344
+ switchLanguage(ev, {
345
+ language: getInitialLanguageAdapter(ev.state).type,
346
+ });
388
347
  });
389
348
 
390
349
  const handleReconfigureEditor = useEvent(() => {
391
350
  invariant(editorViewRef.current !== null, "Editor view is not initialized");
392
- const editorConfig = createEditorConfig();
393
351
 
394
352
  editorViewRef.current.dispatch({
395
353
  effects: [
396
- StateEffect.reconfigure.of([editorConfig.extensions]),
354
+ StateEffect.reconfigure.of([extensions]),
397
355
  reconfigureLanguageEffect(editorViewRef.current, {
398
356
  completionConfig: userConfig.completion,
399
357
  hotkeysProvider: new OverridingHotkeyProvider(
@@ -410,24 +368,18 @@ const CellEditorInternal = ({
410
368
 
411
369
  const handleDeserializeEditor = useEvent(() => {
412
370
  invariant(serializedEditorState, "Editor view is not initialized");
413
- const editorConfig = createEditorConfig(code);
414
371
 
415
372
  const ev = new EditorView({
416
373
  state: EditorState.fromJSON(
417
374
  serializedEditorState,
418
- {
419
- doc: editorConfig.code,
420
- extensions: editorConfig.extensions,
421
- },
375
+ { doc: code, extensions },
422
376
  { history: historyField },
423
377
  ),
424
378
  });
425
379
  // Initialize the language adapter
426
- if (!rtcEnabled) {
427
- switchLanguage(ev, {
428
- language: getInitialLanguageAdapter(ev.state).type,
429
- });
430
- }
380
+ switchLanguage(ev, {
381
+ language: getInitialLanguageAdapter(ev.state).type,
382
+ });
431
383
  setEditorView(ev);
432
384
  // The restored state is used once; the next mount builds a fresh editor.
433
385
  takeRestoredEditorState({ cellId });
@@ -626,45 +578,4 @@ const CellCodeMirrorEditor = React.forwardRef(
626
578
  );
627
579
  CellCodeMirrorEditor.displayName = "CellCodeMirrorEditor";
628
580
 
629
- // Wait until the websocket connection is open before rendering the editor
630
- // This is used for real-time collaboration since the backend needs the connection started
631
- // before connecting the rtc websockets
632
- function WithWaitUntilConnected<T extends Pick<CellEditorProps, "id">>(
633
- Component: React.ComponentType<T>,
634
- ) {
635
- const WaitUntilConnectedComponent = (props: T) => {
636
- const connection = useAtomValue(connectionAtom);
637
- const [rtcDoc, setRtcDoc] = useAtom(connectedDocAtom);
638
-
639
- if (
640
- isRtcEnabled() &&
641
- canUseRtc(props.id) &&
642
- (isAppConnecting(connection.state) || rtcDoc === undefined)
643
- ) {
644
- return (
645
- <div className="flex h-full w-full items-baseline p-4">
646
- <DelayMount milliseconds={1000} fallback={null}>
647
- <span>Waiting for real-time collaboration connection...</span>
648
- <Button
649
- variant="link"
650
- onClick={() => {
651
- setRtcDoc("disabled");
652
- }}
653
- >
654
- Turn off real-time collaboration
655
- </Button>
656
- </DelayMount>
657
- </div>
658
- );
659
- }
660
-
661
- return <Component {...props} />;
662
- };
663
-
664
- WaitUntilConnectedComponent.displayName = `WithWaitUntilConnected(${Component.displayName})`;
665
- return WaitUntilConnectedComponent;
666
- }
667
-
668
- export const CellEditor = isRtcEnabled()
669
- ? WithWaitUntilConnected(memo(CellEditorInternal))
670
- : memo(CellEditorInternal);
581
+ export const CellEditor = memo(CellEditorInternal);
@@ -21,7 +21,6 @@ import { CopilotStatusIcon } from "./footer-items/copilot-status";
21
21
  import { DocumentSyncStatus } from "./footer-items/document-sync-status";
22
22
  import { MachineStats } from "./footer-items/machine-stats";
23
23
  import { PyodideStatus } from "./footer-items/pyodide-status";
24
- import { RTCStatus } from "./footer-items/rtc-status";
25
24
  import { RuntimeSettings } from "./footer-items/runtime-settings";
26
25
  import { useSetDependencyPanelTab } from "./useDependencyPanelTab";
27
26
 
@@ -113,7 +112,6 @@ export const Footer: React.FC = () => {
113
112
  <AttachmentStatus />
114
113
  <AIStatusIcon />
115
114
  <CopilotStatusIcon />
116
- <RTCStatus />
117
115
  </div>
118
116
  </footer>
119
117
  );
@@ -21,7 +21,6 @@ import {
21
21
  import { OverridingHotkeyProvider } from "@/core/hotkeys/hotkeys";
22
22
  import { store } from "@/core/state/jotai";
23
23
  import { activeDocumentModelAtom } from "@/core/session/active-notebook";
24
- import { isRtcEnabled } from "../../rtc/state";
25
24
  import {
26
25
  createNotebookActions,
27
26
  exportedForTesting,
@@ -31,11 +30,6 @@ import {
31
30
  import { applyDocument, flushDocument, followDocument } from "../document";
32
31
  import { type CellId, SCRATCH_CELL_ID } from "../ids";
33
32
 
34
- vi.mock("../../rtc/state", async (importOriginal) => ({
35
- ...(await importOriginal<typeof import("../../rtc/state")>()),
36
- isRtcEnabled: vi.fn(() => false),
37
- }));
38
-
39
33
  const { initialNotebookState } = exportedForTesting;
40
34
 
41
35
  const a = cellId("a");
@@ -148,18 +142,6 @@ describe("applyDocument", () => {
148
142
  expect(view.state.field(languageAdapterState).type).toBe("python");
149
143
  });
150
144
 
151
- it("leaves an RTC editor to Loro", () => {
152
- vi.mocked(isRtcEnabled).mockReturnValueOnce(true);
153
- const state = notebookOf([cell(a)]);
154
- const view = createEditor("a = 1");
155
- state.cellHandles[a].current = { editorView: view, editorViewOrNull: view };
156
-
157
- const next = applyDocument(state, documentOf([cell(a, { code: "a = 2" })]));
158
-
159
- expect(next.cellData[a].code).toBe("a = 2");
160
- expect(view.state.doc.toString()).toBe("a = 1");
161
- });
162
-
163
145
  it("keeps the code this client has when the host withholds source", () => {
164
146
  const state = notebookOf([cell(a)]);
165
147
 
@@ -21,7 +21,6 @@ import type {
21
21
  } from "@/core/notebook/document";
22
22
  import type { DispatchedActionOf } from "@/utils/createReducer";
23
23
  import { prepareCellCodeUpdate } from "../codemirror/language/cell-code";
24
- import { canUseRtc, isRtcEnabled } from "../rtc/state";
25
24
  import { store } from "../state/jotai";
26
25
  import { activeDocumentModelAtom } from "../session/active-notebook";
27
26
  import type { NotebookState, ReducerCellActions } from "./cells";
@@ -60,14 +59,12 @@ function followCell(
60
59
  if (code === current.code) {
61
60
  return { ...current, name: cell.name, config };
62
61
  }
63
- // RTC cells follow Loro. Other editors take the host's code; one that
64
- // shows it already, as the editor this client types in does, is left alone.
65
- if (!isRtcEnabled() || !canUseRtc(current.id)) {
66
- const view = handle?.current?.editorViewOrNull;
67
- const update = view && prepareCellCodeUpdate(view.state, code);
68
- if (update) {
69
- view.dispatch(update);
70
- }
62
+ // The editor takes the host's code; one that shows it already, as the
63
+ // editor this client types in does, is left alone.
64
+ const view = handle?.current?.editorViewOrNull;
65
+ const update = view && prepareCellCodeUpdate(view.state, code);
66
+ if (update) {
67
+ view.dispatch(update);
71
68
  }
72
69
  return {
73
70
  ...current,
@@ -8,11 +8,9 @@ import {
8
8
  } from "@codemirror/state";
9
9
  import { describe, expect, it } from "vitest";
10
10
  import { formattingChangeEffect } from "../../format";
11
- import { loroSyncAnnotation } from "../../rtc/loro/sync";
12
11
  import { exportedForTesting } from "../extensions";
13
12
 
14
- const { isCollaboratorUpdate, shouldAutorunMarkdownUpdate } =
15
- exportedForTesting;
13
+ const { shouldAutorunMarkdownUpdate } = exportedForTesting;
16
14
 
17
15
  function createTransaction(spec: TransactionSpec) {
18
16
  return EditorState.create({ doc: "" }).update(spec);
@@ -51,24 +49,6 @@ describe("shouldAutorunMarkdownUpdate", () => {
51
49
  ).toBe(false);
52
50
  });
53
51
 
54
- it("ignores RTC sync transactions", () => {
55
- const transaction = createTransaction({
56
- changes: { from: 0, insert: "#" },
57
- annotations: [
58
- Transaction.userEvent.of("input.type"),
59
- loroSyncAnnotation.of(true),
60
- ],
61
- });
62
-
63
- expect(
64
- shouldAutorunMarkdownUpdate({
65
- docChanged: transaction.docChanged,
66
- transactions: [transaction],
67
- hasFocus: true,
68
- }),
69
- ).toBe(false);
70
- });
71
-
72
52
  it("ignores remote transactions while focused", () => {
73
53
  const transaction = createTransaction({
74
54
  changes: { from: 0, insert: "#" },
@@ -126,28 +106,3 @@ describe("shouldAutorunMarkdownUpdate", () => {
126
106
  ).toBe(false);
127
107
  });
128
108
  });
129
-
130
- describe("isCollaboratorUpdate", () => {
131
- it("recognizes an update made only of Loro sync transactions", () => {
132
- const transaction = createTransaction({
133
- changes: { from: 0, insert: "#" },
134
- annotations: [loroSyncAnnotation.of(true)],
135
- });
136
-
137
- expect(isCollaboratorUpdate([transaction])).toBe(true);
138
- });
139
-
140
- it("treats typing beside a Loro sync transaction as local", () => {
141
- const remote = createTransaction({
142
- changes: { from: 0, insert: "#" },
143
- annotations: [loroSyncAnnotation.of(true)],
144
- });
145
- const local = createTransaction({
146
- changes: { from: 0, insert: "x" },
147
- annotations: [Transaction.userEvent.of("input.type")],
148
- });
149
-
150
- expect(isCollaboratorUpdate([remote, local])).toBe(false);
151
- expect(isCollaboratorUpdate([])).toBe(false);
152
- });
153
- });
@@ -14,7 +14,6 @@ import {
14
14
  clearPendingCutAtom,
15
15
  pendingCutCellIdsAtom,
16
16
  } from "@/core/cells/pending-cut-service";
17
- import { loroSyncAnnotation } from "@/core/codemirror/rtc/loro/sync";
18
17
  import type { KeymapConfig } from "@/core/config/config-schema";
19
18
  import type { HotkeyProvider } from "@/core/hotkeys/hotkeys";
20
19
  import { getFeatureFlag } from "@/core/config/feature-flag";
@@ -325,11 +324,6 @@ function cellKeymaps({
325
324
  function cellCodeEditing(hotkeys: HotkeyProvider): Extension[] {
326
325
  const onChangePlugin = EditorView.updateListener.of((update) => {
327
326
  if (update.docChanged) {
328
- // Loro already applied a collaborator's change here. The client that
329
- // typed it syncs it to the document.
330
- if (isCollaboratorUpdate(update.transactions)) {
331
- return;
332
- }
333
327
  // Check if the doc update was a formatting change
334
328
  // e.g. changing from python to markdown
335
329
  const isFormattingChange = update.transactions.some((tr) =>
@@ -355,14 +349,6 @@ function cellCodeEditing(hotkeys: HotkeyProvider): Extension[] {
355
349
  return [onChangePlugin, formatKeymapExtension(hotkeys)];
356
350
  }
357
351
 
358
- /** Whether every transaction in an update arrived from a collaborator through Loro. */
359
- function isCollaboratorUpdate(transactions: readonly Transaction[]): boolean {
360
- return (
361
- transactions.length > 0 &&
362
- transactions.every((tr) => tr.annotation(loroSyncAnnotation) !== undefined)
363
- );
364
- }
365
-
366
352
  const MARKDOWN_AUTORUN_USER_EVENTS = ["input", "delete", "undo", "redo"];
367
353
 
368
354
  function shouldAutorunMarkdownUpdate({
@@ -397,10 +383,7 @@ function shouldAutorunMarkdownUpdate({
397
383
  return transactions.some((tr) => {
398
384
  // Ignore remote changes to avoid duplicate runs. The client that made the
399
385
  // edit runs it.
400
- if (
401
- tr.annotation(Transaction.remote) ||
402
- tr.annotation(loroSyncAnnotation) !== undefined
403
- ) {
386
+ if (tr.annotation(Transaction.remote)) {
404
387
  return false;
405
388
  }
406
389
 
@@ -480,6 +463,5 @@ export function cellBundle({
480
463
  }
481
464
 
482
465
  export const exportedForTesting = {
483
- isCollaboratorUpdate,
484
466
  shouldAutorunMarkdownUpdate,
485
467
  };
@@ -204,7 +204,6 @@ export const UserConfigSchema = z
204
204
  experimental: z
205
205
  .looseObject({
206
206
  markdown: z.boolean().optional(),
207
- rtc: z.boolean().optional(),
208
207
  // Add new experimental features here
209
208
  })
210
209
  // Pass through so that we don't remove any extra keys that the user has added.
@@ -8,7 +8,6 @@ import { getResolvedMarimoConfig } from "./config";
8
8
  export interface ExperimentalFeatures {
9
9
  markdown: boolean; // Used in playground (community cloud)
10
10
  wasm_layouts: boolean; // Used in playground (community cloud)
11
- rtc_v2: boolean;
12
11
  cache_panel: boolean;
13
12
  external_agents: boolean;
14
13
  debugger: boolean; // Live frame-watching debugger (gutter breakpoints + pdb)
@@ -19,7 +18,6 @@ export interface ExperimentalFeatures {
19
18
  const defaultValues: ExperimentalFeatures = {
20
19
  markdown: true,
21
20
  wasm_layouts: false,
22
- rtc_v2: false,
23
21
  cache_panel: import.meta.env.DEV,
24
22
  external_agents: import.meta.env.DEV,
25
23
  debugger: false,