@marimo-team/islands 0.25.3-dev16 → 0.25.3-dev167

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 (519) hide show
  1. package/dist/{ConnectedDataExplorerComponent-CNMliVzw.js → ConnectedDataExplorerComponent-BbDrlHvG.js} +17 -15
  2. package/dist/{ErrorBoundary-BEmYzeHb.js → ErrorBoundary-h9XmEWa0.js} +16 -16
  3. package/dist/{abnfDiagram-VCTEODGH-D-Ez91gV.js → abnfDiagram-VCTEODGH-Dr-fo8_z.js} +2 -2
  4. package/dist/any-language-editor-3E24SnCV.js +75 -0
  5. package/dist/{architectureDiagram-5GKGNRK7-CTpcNtO8.js → architectureDiagram-5GKGNRK7-ByKIl9GG.js} +1 -1
  6. package/dist/{arrays-CN1djC4k.js → arrays-R6JsImiT.js} +8 -0
  7. package/dist/assets/__vite-browser-external-DVeFf2e7.js +1 -0
  8. package/dist/assets/worker-C1pfNBsx.js +113 -0
  9. package/dist/{button-CvjkwdSk.js → button-BQRdqQi1.js} +199 -192
  10. package/dist/{capabilities-CQ5IjhzL.js → capabilities-CI4xUPsp.js} +2 -2
  11. package/dist/{chat-ui-DaHynk8g.js → chat-ui-BsV2WH-4.js} +1143 -1142
  12. package/dist/{check-EDwSwP89.js → check-SpOMoCLP.js} +1 -1
  13. package/dist/{chunk-IMKFNOWR-DGxi-zeo.js → chunk-IMKFNOWR-IKDP18MQ.js} +1 -1
  14. package/dist/{chunk-SHT3W25Y-CV9J3rAB.js → chunk-SHT3W25Y-LkIgegwh.js} +1 -1
  15. package/dist/{chunk-SVP7TREG-BL-9Fqgg.js → chunk-SVP7TREG-DReBYtnB.js} +1 -1
  16. package/dist/{chunk-TICWLB2K-Cu_XMjDM.js → chunk-TICWLB2K-DQ0A0-1D.js} +1 -1
  17. package/dist/{chunk-YOKDWASO-DPZk8vhS.js → chunk-YOKDWASO-DKplTrBY.js} +20 -20
  18. package/dist/{classDiagram-ZZMXUADV-BXXV13Hq.js → classDiagram-ZZMXUADV-CwvXdCNE.js} +2 -2
  19. package/dist/{classDiagram-v2-VYDZK3BY-B7FXJ1Cp.js → classDiagram-v2-VYDZK3BY-D0XAxDsc.js} +2 -2
  20. package/dist/{code-visibility-D75HwL4W.js → code-visibility-C7I2fnCM.js} +6 -6
  21. package/dist/{common-hR234FGW.js → common-DZHaZLBJ.js} +6897 -6718
  22. package/dist/{copy-icon-Ft7t9bqz.js → copy-icon-C1trdvVt.js} +3 -3
  23. package/dist/{cynefinDiagram-5FMLGOSQ-CH96rwba.js → cynefinDiagram-5FMLGOSQ-BFN68nHr.js} +1 -1
  24. package/dist/{dagre-GXQ25YYZ-BD3PmpFY.js → dagre-GXQ25YYZ-CZt4rtLq.js} +1 -1
  25. package/dist/{data-grid-overlay-editor-D-NMDtk0.js → data-grid-overlay-editor-idtxmwN9.js} +5 -5
  26. package/dist/{data-grid-types-BH_r7g7l.js → data-grid-types-0PJ-9N5n.js} +1 -1
  27. package/dist/{diagram-S7CK7UJ4-BsSJJldB.js → diagram-S7CK7UJ4-D5cOz47_.js} +1 -1
  28. package/dist/{diagram-UQ7AKVKN-muQtNZc4.js → diagram-UQ7AKVKN-Qgdppb4a.js} +1 -1
  29. package/dist/{diagram-VX7I27RA-CdhuZAqR.js → diagram-VX7I27RA-BsDCvily.js} +1 -1
  30. package/dist/{diagram-Z3DM3KII-BD8mXjOj.js → diagram-Z3DM3KII-igTkGjKI.js} +1 -1
  31. package/dist/{dialog-CEBFZNyc.js → dialog-DgeqyrEZ.js} +3 -3
  32. package/dist/{dist-DpBpA_n1.js → dist-Lm-D-Vr6.js} +3 -3
  33. package/dist/{dropdown-menu-CP_qCYHC.js → dropdown-menu-BWnnAstC.js} +1277 -1229
  34. package/dist/{ebnfDiagram-PWID7BFC-BIN1sweE.js → ebnfDiagram-PWID7BFC-BHuZGjIr.js} +2 -2
  35. package/dist/{erDiagram-RLTQ6QDP-Ctp5cfoN.js → erDiagram-RLTQ6QDP-DKObXTVE.js} +1 -1
  36. package/dist/{error-banner-D-WCIiMt.js → error-banner-D40pmfQQ.js} +83 -83
  37. package/dist/{error-entries-Bv6bZPF3.js → error-entries-BpUJSLUZ.js} +1019 -978
  38. package/dist/{feedback-button-B3sliPJj.js → feedback-button-Ce4rnBDY.js} +23 -23
  39. package/dist/{flowDiagram-HODETNUW-3EfLrlFb.js → flowDiagram-HODETNUW-DZI_kit0.js} +2 -2
  40. package/dist/{formats-27CW_UP4.js → formats-CwJHWasD.js} +3 -3
  41. package/dist/{ganttDiagram-EL5Y4UJY-BQT16JSc.js → ganttDiagram-EL5Y4UJY-Dh_4cBJZ.js} +2 -2
  42. package/dist/{glide-data-editor-Dufy2ePW.js → glide-data-editor-DeJ7_EKL.js} +370 -368
  43. package/dist/{glide-utils-DJyqh0EM.js → glide-utils-Dz_F4pAY.js} +16 -16
  44. package/dist/{globals-B02fTTAH.js → globals-0gsyLTho.js} +3 -3
  45. package/dist/{highlighted-body-KPVGNVTW-zwjq21tf.js → highlighted-body-KPVGNVTW-3Ziwfz-V.js} +2 -2
  46. package/dist/{html-to-image-Bf8QMGi4.js → html-to-image-CQr2-IDA.js} +632 -595
  47. package/dist/{infoDiagram-27XIBGKW-DipQoHxl.js → infoDiagram-27XIBGKW-DdPl-7-n.js} +1 -1
  48. package/dist/{ishikawaDiagram-5VMMS53U-DgFMjSGz.js → ishikawaDiagram-5VMMS53U-DbyW6l59.js} +1 -1
  49. package/dist/{kanban-definition-UXKFOSKX-w1ACVjgl.js → kanban-definition-UXKFOSKX-BMX9SyBS.js} +1 -1
  50. package/dist/{label-BDKF3Afc.js → label-D9_-zSg-.js} +3 -3
  51. package/dist/{linear-Cnaq3Tfb.js → linear-DWERh7eI.js} +121 -73
  52. package/dist/{loader-BQOfjTIJ.js → loader-DOVB0Syl.js} +12 -12
  53. package/dist/main.js +7685 -7337
  54. package/dist/{mermaid-CHo49Yv-.js → mermaid-C8W8mTbA.js} +38 -38
  55. package/dist/mermaid-HWGCJPDP-Du3-HPQA.js +2 -0
  56. package/dist/{mindmap-definition-YA3MSWOX-CrT0KSfX.js → mindmap-definition-YA3MSWOX-Zd_tAxWL.js} +1 -1
  57. package/dist/{number-overlay-editor-EF8mCVoy.js → number-overlay-editor-20DRoFcn.js} +3 -3
  58. package/dist/{objects-CzUgoMIF.js → objects-DCmMvZtn.js} +1 -3
  59. package/dist/{once-BtE-wKRL.js → once-eG8Vmvjd.js} +1 -1
  60. package/dist/{pegDiagram-XKGWAZYB-BqvywNJA.js → pegDiagram-XKGWAZYB-DjYydPdo.js} +2 -2
  61. package/dist/{pieDiagram-E7YTZNPT-BfxJ_XCc.js → pieDiagram-E7YTZNPT-R5LKjO2n.js} +1 -1
  62. package/dist/precisionRound-DhAzeRcm.js +49 -0
  63. package/dist/{process-output-BZg56CCb.js → process-output-Uw-VJE5V.js} +5 -5
  64. package/dist/{quadrantDiagram-AXDQQJYC-Ccw0xMjN.js → quadrantDiagram-AXDQQJYC-Blrm7V7_.js} +1 -1
  65. package/dist/{railroadDiagram-O6MQD6OU-8vFLVTPu.js → railroadDiagram-O6MQD6OU-C7uNKtfm.js} +2 -2
  66. package/dist/{react-vega-BED0DjiB.js → react-vega-C4T9Rb_w.js} +12284 -12270
  67. package/dist/{requirementDiagram-BXWQKSXE-a_MxGvxe.js → requirementDiagram-BXWQKSXE-CxAIzQfl.js} +1 -1
  68. package/dist/{reveal-component-Boolki8h.js → reveal-component-H3W5fYvI.js} +14 -14
  69. package/dist/{select-BButFi-d.js → select-CkF_GBxO.js} +537 -458
  70. package/dist/{sequenceDiagram-WJ2MYXX4-CXFMnxGh.js → sequenceDiagram-WJ2MYXX4-B5tmlPd5.js} +1 -1
  71. package/dist/{spec-BwarBpUJ.js → spec-45FnujvG.js} +41 -11
  72. package/dist/{stateDiagram-D77RDMKH-DQeA_CwI.js → stateDiagram-D77RDMKH-C1hc5H7Y.js} +2 -2
  73. package/dist/{stateDiagram-v2-MP3YSRHH-BxxQucm1.js → stateDiagram-v2-MP3YSRHH-DRWeqQTn.js} +2 -2
  74. package/dist/style.css +1 -1
  75. package/dist/{swimlanes-42K2YHIH-Do6L-cYg.js → swimlanes-42K2YHIH-NTLas--s.js} +1 -1
  76. package/dist/{swimlanesDiagram-VR7AAH4N-DUzPvSVU.js → swimlanesDiagram-VR7AAH4N-ChPggljD.js} +2 -2
  77. package/dist/{swiper-component-DKntyn8p.js → swiper-component-BkCm-kLg.js} +2 -2
  78. package/dist/{time-BieKwdYS.js → time-BaMbJs4z.js} +18 -18
  79. package/dist/{timeline-definition-24CTP7MA-D3c46WM5.js → timeline-definition-24CTP7MA-B4CZ9srJ.js} +1 -1
  80. package/dist/{toDate-UtiwmnH2.js → toDate-rySyYxqk.js} +19 -18
  81. package/dist/{toast-B9UMEi8u.js → toast-Btbve3Lm.js} +231 -213
  82. package/dist/{tooltip-BO1REbqs.js → tooltip-CJ4Rqasp.js} +327 -303
  83. package/dist/{use-restore-focus-BEM7sFWl.js → use-restore-focus-CmGwRNId.js} +1482 -1433
  84. package/dist/{useAsyncData-Deh5kszT.js → useAsyncData-B7MiltyV.js} +15 -14
  85. package/dist/{useDateFormatter-D8XruNGG.js → useDateFormatter-eCL_SdeG.js} +2 -2
  86. package/dist/{useDeepCompareMemoize-DXwzRINI.js → useDeepCompareMemoize-DZmHBD_1.js} +1 -1
  87. package/dist/{useIframeCapabilities-DBETvvPl.js → useIframeCapabilities-CSdWn6NP.js} +1 -1
  88. package/dist/{useLifecycle-j7D9uD1o.js → useLifecycle-DRbRhzxg.js} +3 -3
  89. package/dist/{useTheme-CRnjkku0.js → useTheme-TLkqJsvo.js} +57 -54
  90. package/dist/{vega-component-BeF9dfyO.js → vega-component-DC6P127L.js} +148 -148
  91. package/dist/{vega-embed-container-BNHE18G9.js → vega-embed-container--LYZqguO.js} +2 -2
  92. package/dist/{vega-loader.browser-DNST6uVf.js → vega-loader.browser-B9Pz0EGP.js} +298 -507
  93. package/dist/{vennDiagram-4TSXK5OY-BSZD8JcZ.js → vennDiagram-4TSXK5OY-DJIvMt44.js} +1 -1
  94. package/dist/{wardleyDiagram-VM6X3IG4-48cUWkfA.js → wardleyDiagram-VM6X3IG4-45H0zg0u.js} +1 -1
  95. package/dist/{xychartDiagram-S5SC5T6Z-CswYgYeu.js → xychartDiagram-S5SC5T6Z-ZT-XzcPN.js} +2 -2
  96. package/package.json +16 -16
  97. package/src/__tests__/module-entry.test.ts +44 -0
  98. package/src/__tests__/mount.test.ts +1 -21
  99. package/src/__tests__/{host-imports.test.ts → replica-imports.test.ts} +12 -11
  100. package/src/components/ai/__tests__/ai-model-dropdown.test.tsx +63 -0
  101. package/src/components/ai/ai-model-dropdown.tsx +11 -6
  102. package/src/components/app-config/ai-config.tsx +7 -2
  103. package/src/components/app-config/user-config-form.tsx +35 -0
  104. package/src/components/chat/__tests__/message-queue.test.tsx +17 -0
  105. package/src/components/chat/acp/__tests__/session-tabs.test.tsx +43 -0
  106. package/src/components/chat/acp/__tests__/state.test.ts +2 -2
  107. package/src/components/chat/acp/blocks.tsx +3 -2
  108. package/src/components/chat/acp/session-tabs.tsx +8 -3
  109. package/src/components/chat/chat-components.tsx +2 -0
  110. package/src/components/chat/chat-panel.tsx +9 -8
  111. package/src/components/chat/chat-utils.ts +4 -8
  112. package/src/components/data-table/TableBottomBar.tsx +4 -1
  113. package/src/components/data-table/TableTopBar.tsx +2 -0
  114. package/src/components/data-table/__tests__/chart-spec-model.test.ts +195 -195
  115. package/src/components/data-table/__tests__/column-explorer.test.tsx +27 -1
  116. package/src/components/data-table/__tests__/columns.test.tsx +105 -0
  117. package/src/components/data-table/__tests__/context-menu-interaction.test.tsx +130 -0
  118. package/src/components/data-table/__tests__/data-table.test.tsx +1 -0
  119. package/src/components/data-table/__tests__/date-popover.test.tsx +72 -0
  120. package/src/components/data-table/__tests__/export-actions.test.tsx +105 -0
  121. package/src/components/data-table/__tests__/keyboard-selection.test.tsx +188 -0
  122. package/src/components/data-table/__tests__/pagination.test.tsx +28 -1
  123. package/src/components/data-table/__tests__/search-highlight.test.tsx +109 -0
  124. package/src/components/data-table/__tests__/url-detector.test.tsx +74 -0
  125. package/src/components/data-table/cell-selection/feature.ts +2 -2
  126. package/src/components/data-table/cell-selection/types.ts +2 -2
  127. package/src/components/data-table/charts/__tests__/chart-panel.test.tsx +74 -1
  128. package/src/components/data-table/charts/__tests__/spec-snapshot.test.ts +20 -20
  129. package/src/components/data-table/charts/__tests__/spec.test.ts +78 -52
  130. package/src/components/data-table/charts/__tests__/storage.test.ts +4 -1
  131. package/src/components/data-table/charts/chart-spec/spec.ts +68 -43
  132. package/src/components/data-table/charts/charts.tsx +40 -30
  133. package/src/components/data-table/charts/storage.ts +16 -5
  134. package/src/components/data-table/column-explorer-panel/column-explorer.tsx +1 -1
  135. package/src/components/data-table/column-summary/chart-spec-model.tsx +23 -16
  136. package/src/components/data-table/column-summary/column-summary.tsx +2 -4
  137. package/src/components/data-table/column-visibility-dropdown.tsx +8 -13
  138. package/src/components/data-table/columns.tsx +45 -46
  139. package/src/components/data-table/context-menu.tsx +36 -20
  140. package/src/components/data-table/data-table.tsx +17 -1
  141. package/src/components/data-table/date-popover.tsx +6 -4
  142. package/src/components/data-table/export-actions.tsx +76 -48
  143. package/src/components/data-table/pagination.tsx +44 -33
  144. package/src/components/data-table/range-focus/atoms.ts +4 -6
  145. package/src/components/data-table/range-focus/use-cell-range-selection.ts +65 -38
  146. package/src/components/data-table/range-focus/use-scroll-into-view.ts +21 -2
  147. package/src/components/data-table/renderers.tsx +16 -7
  148. package/src/components/data-table/row-viewer-panel/__tests__/row-viewer.test.tsx +24 -1
  149. package/src/components/data-table/row-viewer-panel/row-viewer.tsx +4 -4
  150. package/src/components/data-table/search-highlight.tsx +79 -0
  151. package/src/components/data-table/types.ts +1 -0
  152. package/src/components/data-table/url-detector.tsx +49 -9
  153. package/src/components/datasources/__tests__/column-actions.test.tsx +97 -0
  154. package/src/components/datasources/__tests__/column-preview.test.tsx +98 -5
  155. package/src/components/datasources/__tests__/datasources-interactions.test.tsx +181 -0
  156. package/src/components/datasources/__tests__/table-list.test.tsx +118 -0
  157. package/src/components/datasources/__tests__/utils.test.ts +57 -6
  158. package/src/components/datasources/column-preview.tsx +13 -4
  159. package/src/components/datasources/datasources.tsx +51 -39
  160. package/src/components/datasources/utils.ts +32 -23
  161. package/src/components/debugger/debugger-code.tsx +5 -0
  162. package/src/components/dependency-graph/dependency-graph-tree.tsx +8 -8
  163. package/src/components/dependency-graph/elements.ts +24 -21
  164. package/src/components/dependency-graph/panels.tsx +2 -1
  165. package/src/components/dependency-graph/utils/__tests__/layout.test.ts +18 -11
  166. package/src/components/editor/SortableCell.tsx +1 -3
  167. package/src/{core/attachments/__tests__/toast.test.tsx → components/editor/__tests__/agent-toast.test.tsx} +1 -1
  168. package/src/components/editor/__tests__/data-attributes.test.tsx +6 -2
  169. package/src/components/editor/__tests__/dynamic-favicon.test.tsx +111 -18
  170. package/src/components/editor/__tests__/package-alert.test.tsx +22 -1
  171. package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +24 -0
  172. package/src/components/editor/actions/pair-with-agent-modal.tsx +18 -15
  173. package/src/components/editor/actions/useRestartKernel.tsx +1 -1
  174. package/src/components/editor/ai/add-cell-with-ai.tsx +3 -3
  175. package/src/components/editor/ai/ai-completion-editor.tsx +1 -0
  176. package/src/components/editor/alerts/__tests__/connection-notice.test.tsx +1 -1
  177. package/src/components/editor/alerts/connection-notice.tsx +1 -1
  178. package/src/components/editor/alerts/startup-logs-alert.tsx +1 -0
  179. package/src/components/editor/app-container.tsx +1 -1
  180. package/src/components/editor/boundary/__tests__/ErrorBoundary.test.tsx +1 -1
  181. package/src/components/editor/cell/CreateCellButton.tsx +10 -12
  182. package/src/components/editor/cell/DeleteButton.tsx +3 -2
  183. package/src/components/editor/cell/RunButton.tsx +2 -2
  184. package/src/components/editor/cell/StopButton.tsx +2 -2
  185. package/src/components/editor/cell/__tests__/useShouldShowInterrupt.test.ts +39 -0
  186. package/src/components/editor/cell/code/__tests__/language-toggle.test.tsx +54 -0
  187. package/src/components/editor/cell/code/cell-editor.tsx +2 -2
  188. package/src/components/editor/cell/code/language-toggle.tsx +8 -7
  189. package/src/components/editor/cell/collapse.tsx +5 -3
  190. package/src/components/editor/cell/useShouldShowInterrupt.ts +2 -12
  191. package/src/components/editor/chrome/components/__tests__/feedback-button.test.tsx +1 -1
  192. package/src/components/editor/chrome/components/feedback-button.tsx +1 -1
  193. package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +31 -2
  194. package/src/components/editor/chrome/panels/__tests__/runtime-details.test.tsx +1 -1
  195. package/src/components/editor/chrome/panels/__tests__/sandbox-recovery.test.tsx +1 -1
  196. package/src/components/editor/chrome/panels/cache-panel.tsx +1 -0
  197. package/src/components/editor/chrome/panels/outline/__tests__/outline-keyboard.test.tsx +84 -0
  198. package/src/components/editor/chrome/panels/outline/floating-outline.tsx +39 -14
  199. package/src/components/editor/chrome/panels/outline/useActiveOutline.tsx +3 -2
  200. package/src/components/editor/chrome/panels/packages-panel.tsx +4 -7
  201. package/src/components/editor/chrome/panels/secrets-panel.tsx +1 -0
  202. package/src/components/editor/chrome/panels/snippets-panel.tsx +5 -1
  203. package/src/components/editor/chrome/wrapper/__tests__/attachment-status.test.tsx +9 -18
  204. package/src/components/editor/chrome/wrapper/__tests__/pending-ai-cells.test.tsx +58 -1
  205. package/src/components/editor/chrome/wrapper/footer-items/attachment-status.tsx +4 -4
  206. package/src/components/editor/chrome/wrapper/footer-items/backend-status.tsx +1 -1
  207. package/src/components/editor/chrome/wrapper/footer-items/lsp-status.tsx +1 -1
  208. package/src/components/editor/chrome/wrapper/footer-items/machine-stats.tsx +1 -1
  209. package/src/components/editor/chrome/wrapper/footer-items/runtime-settings.tsx +1 -7
  210. package/src/components/editor/chrome/wrapper/pending-ai-cells.tsx +12 -2
  211. package/src/components/editor/chrome/wrapper/storage.ts +1 -1
  212. package/src/components/editor/connections/components.tsx +1 -1
  213. package/src/components/editor/controls/Controls.tsx +2 -2
  214. package/src/components/editor/controls/__tests__/command-palette.test.tsx +53 -0
  215. package/src/components/editor/controls/__tests__/keyboard-shortcuts.test.tsx +61 -0
  216. package/src/components/editor/controls/__tests__/notebook-menu-dropdown.test.tsx +1 -1
  217. package/src/components/editor/controls/command-palette.tsx +22 -10
  218. package/src/components/editor/controls/keyboard-shortcuts.tsx +14 -5
  219. package/src/components/editor/dynamic-favicon.tsx +21 -40
  220. package/src/components/editor/errors/__tests__/send-error-report-button.test.tsx +9 -23
  221. package/src/components/editor/errors/send-error-report-button.tsx +3 -6
  222. package/src/components/editor/file-tree/__tests__/file-explorer-interactions.test.tsx +6 -0
  223. package/src/components/editor/file-tree/__tests__/file-explorer-navigation.test.tsx +47 -0
  224. package/src/components/editor/file-tree/__tests__/use-file-search.test.tsx +91 -0
  225. package/src/components/editor/file-tree/file-explorer.tsx +45 -8
  226. package/src/components/editor/file-tree/file-name-input.tsx +1 -0
  227. package/src/components/editor/file-tree/file-viewer.tsx +4 -2
  228. package/src/components/editor/file-tree/use-file-search.ts +35 -21
  229. package/src/components/editor/header/__tests__/status.test.tsx +5 -3
  230. package/src/components/editor/header/app-header.tsx +1 -1
  231. package/src/components/editor/header/status.tsx +40 -20
  232. package/src/components/editor/links/__tests__/cell-link.test.tsx +146 -0
  233. package/src/components/editor/links/cell-link.tsx +14 -5
  234. package/src/components/editor/navigation/focus-utils.ts +4 -4
  235. package/src/components/editor/notebook-banner.tsx +1 -0
  236. package/src/components/editor/notebook-cell.tsx +12 -3
  237. package/src/components/editor/output/MarimoErrorOutput.tsx +2 -1
  238. package/src/components/editor/output/MarimoTracebackOutput.tsx +19 -17
  239. package/src/components/editor/output/Outputs.css +8 -0
  240. package/src/components/editor/output/__tests__/traceback.test.tsx +27 -1
  241. package/src/components/editor/output/ansi-reduce.ts +33 -20
  242. package/src/components/editor/output/console/ConsoleOutput.tsx +19 -25
  243. package/src/components/editor/package-alert.tsx +14 -7
  244. package/src/components/editor/renderers/grid-layout/grid-layout.tsx +12 -6
  245. package/src/components/editor/renderers/vertical-layout/sidebar/toggle.tsx +7 -1
  246. package/src/components/home/components.tsx +17 -31
  247. package/src/components/icons/__tests__/large-spinner.test.tsx +39 -0
  248. package/src/components/icons/large-spinner.tsx +3 -14
  249. package/src/components/icons/spinner.tsx +1 -1
  250. package/src/components/mcp/mcp-status-indicator.tsx +1 -1
  251. package/src/components/pages/__tests__/home-page.test.tsx +116 -0
  252. package/src/components/pages/home-page.tsx +164 -91
  253. package/src/components/scratchpad/scratchpad.test.tsx +95 -0
  254. package/src/components/scratchpad/scratchpad.tsx +16 -3
  255. package/src/components/slides/reveal-component.tsx +4 -2
  256. package/src/components/slides/slide-cell-view.tsx +1 -1
  257. package/src/components/slides/slide-form.tsx +1 -0
  258. package/src/components/tracing/tracing-keyboard.test.tsx +85 -0
  259. package/src/components/tracing/tracing.tsx +45 -41
  260. package/src/components/ui/__tests__/draggable-popover.test.tsx +24 -0
  261. package/src/components/ui/__tests__/range-slider.test.tsx +165 -0
  262. package/src/components/ui/alert-dialog.tsx +1 -1
  263. package/src/components/ui/draggable-popover.tsx +24 -2
  264. package/src/components/ui/range-slider.tsx +22 -9
  265. package/src/core/ai/context/providers/datasource.ts +6 -2
  266. package/src/core/ai/tools/base.ts +16 -7
  267. package/src/core/ai/tools/edit-notebook-tool.ts +47 -45
  268. package/src/core/ai/tools/registry.ts +13 -8
  269. package/src/core/ai/tools/sample-tool.ts +6 -7
  270. package/src/core/cells/__tests__/__snapshots__/cells.test.ts.snap +4 -0
  271. package/src/core/cells/__tests__/cell.test.ts +39 -0
  272. package/src/core/cells/__tests__/cells.test.ts +3 -1
  273. package/src/core/cells/__tests__/collapseConsoleOutputs.test.ts +54 -0
  274. package/src/core/cells/__tests__/notebook-outline.test.ts +113 -0
  275. package/src/core/cells/__tests__/session.test.ts +117 -36
  276. package/src/core/cells/cell.ts +14 -3
  277. package/src/core/cells/cells.ts +3 -1
  278. package/src/core/cells/pending-delete-service.ts +2 -6
  279. package/src/core/cells/session.ts +1 -1
  280. package/src/core/cells/types.ts +10 -1
  281. package/src/core/codemirror/__tests__/setup.test.ts +29 -29
  282. package/src/core/codemirror/ai/__tests__/resources.test.ts +117 -0
  283. package/src/core/codemirror/ai/resources.ts +1 -1
  284. package/src/core/codemirror/cells/__tests__/extensions.test.ts +15 -0
  285. package/src/core/codemirror/cells/extensions.ts +7 -3
  286. package/src/core/codemirror/keymaps/vim.ts +2 -6
  287. package/src/core/codemirror/language/__tests__/sql.test.ts +22 -20
  288. package/src/core/codemirror/language/extension.ts +8 -8
  289. package/src/core/codemirror/language/languages/markdown.ts +8 -6
  290. package/src/core/codemirror/language/languages/python.ts +16 -10
  291. package/src/core/codemirror/language/languages/sql/sql.ts +9 -7
  292. package/src/core/codemirror/language/panel/panel.tsx +1 -0
  293. package/src/core/codemirror/language/types.ts +7 -7
  294. package/src/core/codemirror/readonly/__tests__/extension.test.ts +1 -1
  295. package/src/core/codemirror/readonly/extension.ts +2 -2
  296. package/src/core/codemirror/rtc/extension.ts +24 -12
  297. package/src/core/codemirror/rtc/loro/awareness.ts +34 -19
  298. package/src/core/codemirror/rtc/loro/sync.ts +1 -0
  299. package/src/core/codemirror/utils.ts +1 -0
  300. package/src/core/config/__tests__/config-schema.test.ts +5 -3
  301. package/src/core/config/config-schema.ts +3 -0
  302. package/src/core/datasets/__tests__/data-source-discovery.test.ts +5 -5
  303. package/src/core/datasets/data-source-discovery.ts +4 -6
  304. package/src/core/edit-app.tsx +2 -2
  305. package/src/core/errors/error-entries.ts +3 -0
  306. package/src/core/export/hooks.ts +1 -1
  307. package/src/core/hotkeys/actions.ts +2 -4
  308. package/src/core/islands/__tests__/bootstrap.test.ts +16 -42
  309. package/src/core/islands/__tests__/bridge.test.ts +31 -26
  310. package/src/core/islands/bootstrap.ts +22 -52
  311. package/src/core/islands/bridge.ts +31 -20
  312. package/src/core/islands/components/__tests__/IslandControls.test.tsx +7 -5
  313. package/src/core/islands/worker/__tests__/controller.test.ts +62 -4
  314. package/src/core/islands/worker/controller.ts +4 -10
  315. package/src/core/islands/worker/worker.tsx +33 -33
  316. package/src/core/kernel/__tests__/RuntimeState.test.ts +1 -1
  317. package/src/core/network/__tests__/connection.test.ts +1 -1
  318. package/src/core/network/connection-notice.ts +1 -1
  319. package/src/core/network/connection.ts +5 -3
  320. package/src/core/network/requests-lazy.ts +1 -1
  321. package/src/core/network/useConnectionNotice.ts +8 -2
  322. package/src/core/notebook/attachments.ts +38 -0
  323. package/src/core/notebook/document/__tests__/codemirror.test.ts +485 -0
  324. package/src/core/notebook/document/__tests__/draft.test.ts +322 -0
  325. package/src/core/notebook/document/__tests__/fixtures.ts +92 -0
  326. package/src/core/notebook/document/__tests__/hooks.test.tsx +391 -0
  327. package/src/core/notebook/document/__tests__/lifecycle-scenarios.test.ts +61 -0
  328. package/src/core/notebook/document/__tests__/model.test.ts +191 -0
  329. package/src/core/notebook/document/__tests__/protocol-fixtures.ts +38 -0
  330. package/src/core/notebook/document/__tests__/recovery-scenarios.test.ts +230 -0
  331. package/src/core/notebook/document/__tests__/scenario-fixture.ts +43 -0
  332. package/src/core/notebook/document/__tests__/scenarios.test.ts +205 -0
  333. package/src/core/notebook/document/__tests__/state.test.ts +438 -0
  334. package/src/core/notebook/document/__tests__/submission.test.ts +203 -0
  335. package/src/core/notebook/document/__tests__/test-host.test.ts +92 -0
  336. package/src/core/notebook/document/__tests__/test-host.ts +247 -0
  337. package/src/core/notebook/document/__tests__/test-notebook.ts +149 -0
  338. package/src/core/notebook/document/__tests__/user.ts +61 -0
  339. package/src/core/notebook/document/codemirror.ts +311 -0
  340. package/src/core/notebook/document/draft.ts +472 -0
  341. package/src/core/notebook/document/hooks.tsx +118 -0
  342. package/src/core/notebook/document/index.ts +15 -0
  343. package/src/core/notebook/document/model.ts +55 -0
  344. package/src/core/notebook/document/select.ts +41 -0
  345. package/src/core/notebook/document/state.ts +374 -0
  346. package/src/core/notebook/document/sync.ts +369 -0
  347. package/src/core/notebook/index.ts +18 -0
  348. package/src/core/notebook/replica/AGENTS.md +11 -0
  349. package/src/core/notebook/replica/__tests__/attachments.test.ts +56 -0
  350. package/src/core/notebook/replica/__tests__/document.test.ts +126 -0
  351. package/src/core/notebook/replica/__tests__/fixtures.ts +79 -0
  352. package/src/core/notebook/replica/__tests__/replica.test.ts +550 -0
  353. package/src/core/notebook/replica/backend.ts +19 -0
  354. package/src/core/notebook/replica/connection.ts +42 -0
  355. package/src/core/notebook/replica/index.ts +13 -0
  356. package/src/core/notebook/replica/replica.ts +286 -0
  357. package/src/core/notebook/replica/resources/attachments.ts +22 -0
  358. package/src/core/notebook/replica/resources/document.ts +101 -0
  359. package/src/core/packages/__tests__/useSandboxController.test.tsx +1 -1
  360. package/src/core/packages/useSandboxController.ts +1 -1
  361. package/src/core/run-app.tsx +3 -3
  362. package/src/core/runtime/__tests__/adapter.test.ts +1 -1
  363. package/src/core/runtime/__tests__/createWsUrl.test.ts +77 -7
  364. package/src/core/runtime/__tests__/runtime.test.ts +32 -58
  365. package/src/core/runtime/adapter.ts +1 -1
  366. package/src/core/runtime/config.ts +2 -2
  367. package/src/core/runtime/runtime.ts +38 -42
  368. package/src/core/runtime/types.ts +0 -2
  369. package/src/core/saving/filename.ts +1 -1
  370. package/src/core/saving/save-component.tsx +13 -4
  371. package/src/core/saving/useAutoSave.ts +1 -1
  372. package/src/core/session/__tests__/backend.test.ts +235 -0
  373. package/src/core/session/__tests__/useNotebookReplica.hook.test.tsx +183 -0
  374. package/src/core/session/__tests__/useNotebookSession.hook.test.tsx +609 -0
  375. package/src/core/session/active-notebook.ts +7 -0
  376. package/src/core/session/backend.ts +125 -0
  377. package/src/core/{websocket → session}/types.ts +2 -2
  378. package/src/core/session/useNotebookReplica.ts +72 -0
  379. package/src/core/{websocket → session}/useNotebookSession.tsx +18 -25
  380. package/src/core/state/__tests__/jotai.test.tsx +108 -0
  381. package/src/core/state/jotai.ts +1 -1
  382. package/src/core/static/__tests__/files.test.ts +38 -10
  383. package/src/core/static/files.ts +2 -0
  384. package/src/core/{websocket → transports}/__tests__/connection-state.test.ts +1 -13
  385. package/src/core/transports/__tests__/server.test.ts +408 -0
  386. package/src/core/transports/__tests__/static.test.ts +175 -0
  387. package/src/core/transports/__tests__/wasm.test.ts +166 -0
  388. package/src/core/{websocket → transports}/connection-state.ts +9 -16
  389. package/src/core/transports/server.ts +152 -0
  390. package/src/core/transports/static.ts +84 -0
  391. package/src/core/transports/wasm.ts +97 -0
  392. package/src/core/wasm/__tests__/bridge.test.ts +213 -50
  393. package/src/core/wasm/__tests__/worker.test.ts +187 -0
  394. package/src/core/wasm/bridge.ts +81 -52
  395. package/src/core/wasm/rpc.ts +15 -3
  396. package/src/core/wasm/store.ts +3 -3
  397. package/src/core/wasm/worker/bootstrap.ts +55 -51
  398. package/src/core/wasm/worker/getMarimoWheel.ts +1 -1
  399. package/src/core/wasm/worker/save-worker.ts +9 -10
  400. package/src/core/wasm/worker/types.ts +29 -18
  401. package/src/core/wasm/worker/worker.ts +97 -44
  402. package/src/css/globals.css +10 -0
  403. package/src/hooks/__tests__/useAsyncData.test.tsx +148 -0
  404. package/src/hooks/__tests__/useDebounce.test.tsx +51 -0
  405. package/src/hooks/__tests__/useDeepCompareMemoize.test.tsx +39 -0
  406. package/src/hooks/__tests__/useDelayElapsed.test.tsx +28 -0
  407. package/src/hooks/__tests__/useInternalStateWithSync.test.tsx +20 -0
  408. package/src/hooks/__tests__/useScript.test.tsx +77 -0
  409. package/src/hooks/__tests__/useStateForKey.test.tsx +257 -0
  410. package/src/hooks/useAsyncData.ts +3 -3
  411. package/src/hooks/useDataSourceDiscovery.ts +6 -4
  412. package/src/hooks/useDebounce.ts +6 -10
  413. package/src/hooks/useDeepCompareMemoize.ts +1 -1
  414. package/src/hooks/useDelayElapsed.ts +14 -10
  415. package/src/hooks/useElapsedTime.ts +3 -3
  416. package/src/hooks/useEventListener.ts +1 -2
  417. package/src/hooks/useInputHistory.ts +4 -7
  418. package/src/hooks/useInternalStateWithSync.ts +6 -6
  419. package/src/hooks/useResizeObserver.ts +4 -7
  420. package/src/hooks/useScript.ts +67 -70
  421. package/src/hooks/useStateForKey.ts +93 -0
  422. package/src/mount.tsx +1 -5
  423. package/src/plugins/__tests__/plugin-object-schemas.test.ts +104 -0
  424. package/src/plugins/core/registerReactComponent.tsx +1 -1
  425. package/src/plugins/impl/CodeEditorPlugin.tsx +1 -1
  426. package/src/plugins/impl/DataEditorPlugin.tsx +1 -1
  427. package/src/plugins/impl/DataTablePlugin.tsx +69 -37
  428. package/src/plugins/impl/DropdownPlugin.tsx +2 -6
  429. package/src/plugins/impl/FileBrowserPlugin.tsx +4 -16
  430. package/src/plugins/impl/FormPlugin.tsx +1 -1
  431. package/src/plugins/impl/RangeSliderPlugin.tsx +16 -2
  432. package/src/plugins/impl/RefreshPlugin.tsx +1 -0
  433. package/src/plugins/impl/SliderPlugin.tsx +6 -8
  434. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +387 -1
  435. package/src/plugins/impl/__tests__/FileBrowserPlugin.test.tsx +45 -0
  436. package/src/plugins/impl/__tests__/RangeSliderPlugin.test.tsx +109 -0
  437. package/src/plugins/impl/__tests__/SliderPlugin.test.tsx +24 -3
  438. package/src/plugins/impl/anywidget/__tests__/registry.test.ts +153 -0
  439. package/src/plugins/impl/anywidget/__tests__/widget-binding.test.ts +241 -2
  440. package/src/plugins/impl/anywidget/model.ts +3 -1
  441. package/src/plugins/impl/anywidget/registry.ts +18 -14
  442. package/src/plugins/impl/anywidget/runtime.ts +21 -9
  443. package/src/plugins/impl/anywidget/widget-binding.ts +160 -82
  444. package/src/plugins/impl/chat/__tests__/chat-prompts.test.tsx +93 -0
  445. package/src/plugins/impl/chat/chat-ui.tsx +14 -11
  446. package/src/plugins/impl/code/any-language-editor.tsx +2 -2
  447. package/src/plugins/impl/data-editor/glide-data-editor.tsx +8 -5
  448. package/src/plugins/impl/data-editor/glide-utils.ts +3 -1
  449. package/src/plugins/impl/data-explorer/ConnectedDataExplorerComponent.tsx +1 -1
  450. package/src/plugins/impl/data-explorer/components/column-summary.tsx +4 -2
  451. package/src/plugins/impl/data-explorer/state/reducer.ts +1 -1
  452. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +1 -2
  453. package/src/plugins/impl/data-frames/__tests__/sidebar.test.tsx +160 -0
  454. package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +66 -66
  455. package/src/plugins/impl/data-frames/panel.tsx +43 -16
  456. package/src/plugins/impl/mpl-interactive/MplInteractivePlugin.tsx +5 -3
  457. package/src/plugins/impl/panel/PanelPlugin.tsx +16 -17
  458. package/src/plugins/impl/panel/__tests__/utils.test.ts +39 -1
  459. package/src/plugins/impl/panel/utils.ts +17 -0
  460. package/src/plugins/impl/plotly/PlotlyPlugin.tsx +2 -5
  461. package/src/plugins/impl/plotly/selection.ts +25 -19
  462. package/src/plugins/impl/vega/VegaPlugin.tsx +2 -3
  463. package/src/plugins/impl/vega/make-selectable.ts +4 -7
  464. package/src/plugins/layout/RoutesPlugin.tsx +1 -1
  465. package/src/stories/__tests__/editor-story.test.tsx +33 -0
  466. package/src/stories/button.stories.tsx +1 -0
  467. package/src/stories/cell.stories.tsx +1 -1
  468. package/src/stories/data-table.stories.tsx +31 -0
  469. package/src/stories/editor.stories.tsx +24 -17
  470. package/src/stories/form-wrapper.stories.tsx +2 -2
  471. package/src/stories/layout/vertical/one-column.stories.tsx +1 -1
  472. package/src/stories/runtime-story.tsx +1 -1
  473. package/src/stories/select.stories.tsx +2 -2
  474. package/src/stories/switchable-multi-select.stories.tsx +1 -1
  475. package/src/utils/__tests__/arrays.test.ts +35 -0
  476. package/src/utils/__tests__/batch-requests.test.ts +3 -3
  477. package/src/utils/__tests__/createReducer.test.ts +1 -0
  478. package/src/utils/__tests__/numbers.test.ts +105 -1
  479. package/src/utils/__tests__/objects.test.ts +21 -0
  480. package/src/utils/arrays.ts +11 -2
  481. package/src/utils/blob.ts +1 -1
  482. package/src/utils/createReducer.ts +11 -5
  483. package/src/utils/maps.ts +0 -3
  484. package/src/utils/numbers.ts +79 -18
  485. package/src/utils/objects.ts +4 -9
  486. package/src/utils/once.ts +19 -19
  487. package/src/utils/tracer.ts +9 -5
  488. package/src/utils/zod-utils.ts +1 -3
  489. package/dist/any-language-editor-DZ_YTVus.js +0 -76
  490. package/dist/assets/__vite-browser-external-BXYkiFsk.js +0 -1
  491. package/dist/assets/worker-HPY9fbhz.js +0 -114
  492. package/dist/mermaid-HWGCJPDP-ByCsZnYF.js +0 -2
  493. package/dist/precisionRound-DMIVQrt2.js +0 -97
  494. package/src/core/attachments/state.ts +0 -21
  495. package/src/core/host/AGENTS.md +0 -6
  496. package/src/core/host/__tests__/events.test.ts +0 -46
  497. package/src/core/host/__tests__/notebook-client.test.ts +0 -191
  498. package/src/core/host/__tests__/protocol.test.ts +0 -214
  499. package/src/core/host/connection.ts +0 -81
  500. package/src/core/host/events.ts +0 -60
  501. package/src/core/host/notebook-client.ts +0 -226
  502. package/src/core/host/protocol.ts +0 -1943
  503. package/src/core/state/__tests__/jotai.test.ts +0 -25
  504. package/src/core/wasm/worker/message-buffer.ts +0 -33
  505. package/src/core/websocket/__tests__/createConnectionTransport.test.ts +0 -49
  506. package/src/core/websocket/__tests__/useNotebookClient.hook.test.tsx +0 -140
  507. package/src/core/websocket/__tests__/useNotebookSession.hook.test.tsx +0 -883
  508. package/src/core/websocket/transports/__tests__/basic.test.ts +0 -275
  509. package/src/core/websocket/transports/__tests__/sse.test.ts +0 -335
  510. package/src/core/websocket/transports/__tests__/transport.test.ts +0 -308
  511. package/src/core/websocket/transports/__tests__/ws.test.ts +0 -125
  512. package/src/core/websocket/transports/basic.ts +0 -102
  513. package/src/core/websocket/transports/create.ts +0 -31
  514. package/src/core/websocket/transports/sse.ts +0 -308
  515. package/src/core/websocket/transports/transport.ts +0 -50
  516. package/src/core/websocket/transports/ws.ts +0 -98
  517. package/src/core/websocket/useNotebookClient.ts +0 -80
  518. /package/src/{core/attachments/toast.ts → components/editor/agent-toast.ts} +0 -0
  519. /package/src/core/{websocket → session}/connection-utils.ts +0 -0
@@ -167,13 +167,13 @@ function updateLanguageAdapterAndCode({
167
167
  setLanguageAdapter.of(nextLanguage),
168
168
  setLanguageMetadata.of(metadata),
169
169
  languageCompartment.reconfigure(
170
- nextLanguage.getExtension(
170
+ nextLanguage.getExtension({
171
171
  cellId,
172
172
  completionConfig,
173
- hotkeysProvider,
173
+ hotkeys: hotkeysProvider,
174
174
  placeholderType,
175
175
  lspConfig,
176
- ),
176
+ }),
177
177
  ),
178
178
  // Clear history
179
179
  historyCompartment.reconfigure([]),
@@ -218,13 +218,13 @@ export function adaptiveLanguageConfiguration(opts: {
218
218
  // Language adapter
219
219
  languageToggleKeymaps(),
220
220
  languageCompartment.of(
221
- LanguageAdapters.python.getExtension(
221
+ LanguageAdapters.python.getExtension({
222
222
  cellId,
223
223
  completionConfig,
224
224
  hotkeys,
225
225
  placeholderType,
226
226
  lspConfig,
227
- ),
227
+ }),
228
228
  ),
229
229
  languageAdapterState,
230
230
  languageMetadataField,
@@ -323,12 +323,12 @@ export function reconfigureLanguageEffect(
323
323
  }
324
324
 
325
325
  return languageCompartment.reconfigure(
326
- language.getExtension(
326
+ language.getExtension({
327
327
  cellId,
328
328
  completionConfig,
329
- hotkeysProvider,
329
+ hotkeys: hotkeysProvider,
330
330
  placeholderType,
331
331
  lspConfig,
332
- ),
332
+ }),
333
333
  );
334
334
  }
@@ -69,12 +69,14 @@ export class MarkdownLanguageAdapter implements LanguageAdapter<MarkdownLanguage
69
69
  return this.parser.isSupported(pythonCode);
70
70
  }
71
71
 
72
- public getExtension(
73
- _cellId: CellId,
74
- _completionConfig: CompletionConfig,
75
- hotkeys: HotkeyProvider,
76
- _: PlaceholderType,
77
- ): Extension[] {
72
+ public getExtension({
73
+ hotkeys,
74
+ }: {
75
+ cellId: CellId;
76
+ completionConfig: CompletionConfig;
77
+ hotkeys: HotkeyProvider;
78
+ placeholderType: PlaceholderType;
79
+ }): Extension[] {
78
80
  const markdownLanguageData = markdown().language.data;
79
81
  let view: EditorView | undefined;
80
82
 
@@ -157,7 +157,7 @@ const pylspClient = once((lspConfig: LSPConfig) => {
157
157
  return notebookClient;
158
158
  });
159
159
 
160
- const tyLspClient = once((_: LSPConfig) => {
160
+ const tyLspClient = once((_config: LSPConfig) => {
161
161
  // oxlint-disable-next-line prefer-const -- reassigned after closure capture
162
162
  let resyncCallback: (() => Promise<void>) | undefined;
163
163
 
@@ -176,7 +176,7 @@ const tyLspClient = once((_: LSPConfig) => {
176
176
  const notebookClient = new NotebookLanguageServerClient(
177
177
  new LanguageServerClient({
178
178
  ...lspClientOpts,
179
- getWorkspaceConfiguration: (_) => [{ disableLanguageServices: true }],
179
+ getWorkspaceConfiguration: () => [{ disableLanguageServices: true }],
180
180
  }),
181
181
  {},
182
182
  );
@@ -226,7 +226,7 @@ const pyreflyClient = once(
226
226
  },
227
227
  );
228
228
 
229
- const pyrightClient = once((_: LSPConfig) => {
229
+ const pyrightClient = once((_config: LSPConfig) => {
230
230
  // oxlint-disable-next-line prefer-const -- reassigned after closure capture
231
231
  let resyncCallback: (() => Promise<void>) | undefined;
232
232
 
@@ -279,13 +279,19 @@ export class PythonLanguageAdapter implements LanguageAdapter<{}> {
279
279
  return this.parser.isSupported(code);
280
280
  }
281
281
 
282
- public getExtension(
283
- cellId: CellId,
284
- completionConfig: CompletionConfig,
285
- hotkeys: HotkeyProvider,
286
- placeholderType: PlaceholderType,
287
- lspConfig: LSPConfig & { diagnostics: DiagnosticsConfig },
288
- ): Extension[] {
282
+ public getExtension({
283
+ cellId,
284
+ completionConfig,
285
+ hotkeys,
286
+ placeholderType,
287
+ lspConfig,
288
+ }: {
289
+ cellId: CellId;
290
+ completionConfig: CompletionConfig;
291
+ hotkeys: HotkeyProvider;
292
+ placeholderType: PlaceholderType;
293
+ lspConfig: LSPConfig & { diagnostics: DiagnosticsConfig };
294
+ }): Extension[] {
289
295
  const getCompletionsExtension = () => {
290
296
  const autocompleteOptions = {
291
297
  // We remove the default keymap because we use our own which
@@ -155,13 +155,15 @@ export class SQLLanguageAdapter implements LanguageAdapter<SQLLanguageAdapterMet
155
155
  return this.parser.isSupported(pythonCode);
156
156
  }
157
157
 
158
- public getExtension(
159
- _cellId: CellId,
160
- _completionConfig: CompletionConfig,
161
- _hotkeys: HotkeyProvider,
162
- _placeholderType: PlaceholderType,
163
- lspConfig: LSPConfig & { diagnostics: DiagnosticsConfig },
164
- ): Extension[] {
158
+ public getExtension({
159
+ lspConfig,
160
+ }: {
161
+ cellId: CellId;
162
+ completionConfig: CompletionConfig;
163
+ hotkeys: HotkeyProvider;
164
+ placeholderType: PlaceholderType;
165
+ lspConfig: LSPConfig & { diagnostics: DiagnosticsConfig };
166
+ }): Extension[] {
165
167
  const analysis = createSQLAnalysis();
166
168
  const extensions = [
167
169
  // This can be updated with a dispatch effect
@@ -101,6 +101,7 @@ export const LanguagePanelComponent: React.FC<{
101
101
  {metadata.engine === DUCKDB_ENGINE && <SQLModeSelect />}
102
102
  <Tooltip content="Format SQL">
103
103
  <Button
104
+ aria-label="Format SQL"
104
105
  variant="text"
105
106
  size="icon"
106
107
  onClick={async () => {
@@ -26,13 +26,13 @@ export interface LanguageAdapter<M = Record<string, any>> {
26
26
  transformIn(code: string): [string, number, M];
27
27
  transformOut(code: string, metadata: M): [string, number];
28
28
  isSupported(code: string): boolean;
29
- getExtension(
30
- cellId: CellId,
31
- completionConfig: CompletionConfig,
32
- hotkeys: HotkeyProvider,
33
- placeholderType: PlaceholderType,
34
- lspConfig: LSPConfig & { diagnostics?: DiagnosticsConfig },
35
- ): Extension[];
29
+ getExtension(options: {
30
+ cellId: CellId;
31
+ completionConfig: CompletionConfig;
32
+ hotkeys: HotkeyProvider;
33
+ placeholderType: PlaceholderType;
34
+ lspConfig: LSPConfig & { diagnostics?: DiagnosticsConfig };
35
+ }): Extension[];
36
36
  }
37
37
 
38
38
  export type LanguageMetadataOf<T extends LanguageAdapter> =
@@ -4,7 +4,7 @@ import { EditorState } from "@codemirror/state";
4
4
  import { EditorView } from "@codemirror/view";
5
5
  import { createStore } from "jotai";
6
6
  import { describe, expect, it } from "vitest";
7
- import { ConnectionState } from "@/core/websocket/types";
7
+ import { ConnectionState } from "@/core/session/types";
8
8
  import { connectionAtom } from "../../../network/connection";
9
9
  import { dynamicReadonly, isEditorReadonly } from "../extension";
10
10
 
@@ -5,9 +5,9 @@ import type { createStore } from "jotai";
5
5
  import {
6
6
  isAppConnected,
7
7
  isAppConnecting,
8
- } from "@/core/websocket/connection-utils";
8
+ } from "@/core/session/connection-utils";
9
9
  import { connectionAtom } from "../../network/connection";
10
- import { ConnectionState } from "../../websocket/types";
10
+ import { ConnectionState } from "../../session/types";
11
11
 
12
12
  /**
13
13
  * State effect for updating readonly status based on connection
@@ -207,7 +207,13 @@ export function realTimeCollaboration(
207
207
  extension: [
208
208
  languageObserverExtension(cellId),
209
209
  languageListenerExtension(cellId),
210
- loroAwarenessPlugin(doc, awareness, userState, () => loroText, cellId),
210
+ loroAwarenessPlugin({
211
+ doc,
212
+ awareness,
213
+ user: userState,
214
+ getTextFromDoc: () => loroText,
215
+ cellId,
216
+ }),
211
217
  loroSyncPlugin(doc, ["codes", cellId], () => {
212
218
  return loroText;
213
219
  }),
@@ -419,14 +425,21 @@ function languageListenerExtension(cellId: CellId) {
419
425
  /**
420
426
  * Create a plugin to observe awareness changes
421
427
  */
422
- function loroAwarenessPlugin(
423
- doc: LoroDoc,
424
- awareness: Awareness<AwarenessState>,
425
- user: UserState,
426
- getTextFromDoc: (doc: LoroDoc) => LoroText,
427
- cellId: CellId,
428
- getUserId?: () => Uid,
429
- ): Extension[] {
428
+ function loroAwarenessPlugin({
429
+ doc,
430
+ awareness,
431
+ user,
432
+ getTextFromDoc,
433
+ cellId,
434
+ getUserId,
435
+ }: {
436
+ doc: LoroDoc;
437
+ awareness: Awareness<AwarenessState>;
438
+ user: UserState;
439
+ getTextFromDoc: (doc: LoroDoc) => LoroText;
440
+ cellId: CellId;
441
+ getUserId?: () => Uid;
442
+ }): Extension[] {
430
443
  const scopeId = `loro:cell:${cellId}` as ScopeId;
431
444
 
432
445
  return [
@@ -435,15 +448,14 @@ function loroAwarenessPlugin(
435
448
  createSelectionLayer(),
436
449
  ViewPlugin.define(
437
450
  (view) =>
438
- new AwarenessPlugin(
439
- view,
451
+ new AwarenessPlugin(view, {
440
452
  doc,
441
453
  user,
442
454
  awareness,
443
455
  getTextFromDoc,
444
456
  scopeId,
445
457
  getUserId,
446
- ),
458
+ }),
447
459
  ),
448
460
  ViewPlugin.define(
449
461
  (view) => new RemoteAwarenessPlugin(view, doc, awareness, scopeId),
@@ -208,13 +208,19 @@ export class RemoteCursorMarker implements LayerMarker {
208
208
  private name: string;
209
209
  private colorClassName: string;
210
210
 
211
- public constructor(
212
- left: number,
213
- top: number,
214
- height: number,
215
- name: string,
216
- colorClassName: string,
217
- ) {
211
+ public constructor({
212
+ left,
213
+ top,
214
+ height,
215
+ name,
216
+ colorClassName,
217
+ }: {
218
+ left: number;
219
+ top: number;
220
+ height: number;
221
+ name: string;
222
+ colorClassName: string;
223
+ }) {
218
224
  this.left = left;
219
225
  this.top = top;
220
226
  this.height = height;
@@ -271,13 +277,13 @@ export class RemoteCursorMarker implements LayerMarker {
271
277
  const baseLeft = left - view.scrollDOM.scrollLeft;
272
278
  const baseTop = rect.top - view.scrollDOM.scrollTop;
273
279
  return [
274
- new RemoteCursorMarker(
275
- absolutePosition.left - baseLeft,
276
- absolutePosition.top - baseTop,
277
- absolutePosition.bottom - absolutePosition.top,
278
- displayName,
280
+ new RemoteCursorMarker({
281
+ left: absolutePosition.left - baseLeft,
282
+ top: absolutePosition.top - baseTop,
283
+ height: absolutePosition.bottom - absolutePosition.top,
284
+ name: displayName,
279
285
  colorClassName,
280
- ),
286
+ }),
281
287
  ];
282
288
  }
283
289
 
@@ -375,12 +381,21 @@ export class AwarenessPlugin implements PluginValue {
375
381
 
376
382
  public constructor(
377
383
  view: EditorView,
378
- doc: LoroDoc,
379
- user: UserState,
380
- awareness: Awareness<AwarenessState>,
381
- getTextFromDoc: (doc: LoroDoc) => LoroText,
382
- scopeId: ScopeId,
383
- getUserId?: () => Uid,
384
+ {
385
+ doc,
386
+ user,
387
+ awareness,
388
+ getTextFromDoc,
389
+ scopeId,
390
+ getUserId,
391
+ }: {
392
+ doc: LoroDoc;
393
+ user: UserState;
394
+ awareness: Awareness<AwarenessState>;
395
+ getTextFromDoc: (doc: LoroDoc) => LoroText;
396
+ scopeId: ScopeId;
397
+ getUserId?: () => Uid;
398
+ },
384
399
  ) {
385
400
  this.view = view;
386
401
  this.doc = doc;
@@ -148,6 +148,7 @@ export class LoroSyncPluginValue implements PluginValue {
148
148
  return;
149
149
  }
150
150
  let adj = 0;
151
+ // oxlint-disable-next-line marimo/prefer-object-params -- CodeMirror supplies positional change ranges and inserted text.
151
152
  update.changes.iterChanges((fromA, toA, fromB, toB, insert) => {
152
153
  const insertText = insert.sliceString(0, insert.length, "\n");
153
154
  if (fromA !== toA) {
@@ -122,6 +122,7 @@ export function hasNewLines(tr: Transaction | ViewUpdate): boolean {
122
122
 
123
123
  let hasNewLines = false;
124
124
  // Iterate through all changes in the transaction
125
+ // oxlint-disable-next-line marimo/prefer-object-params -- CodeMirror supplies positional change ranges and inserted text.
125
126
  tr.changes.iterChanges((fromA, toA, fromB, toB, inserted) => {
126
127
  // Check if the inserted text contains line breaks
127
128
  if (inserted.toString().includes("\n")) {
@@ -79,6 +79,7 @@ test("default UserConfig - empty", () => {
79
79
  "experimental": {},
80
80
  "file_browser": {},
81
81
  "formatting": {
82
+ "infer_types": "off",
82
83
  "line_length": 79,
83
84
  },
84
85
  "keymap": {
@@ -155,6 +156,7 @@ test("default UserConfig - one level", () => {
155
156
  "experimental": {},
156
157
  "file_browser": {},
157
158
  "formatting": {
159
+ "infer_types": "off",
158
160
  "line_length": 79,
159
161
  },
160
162
  "keymap": {
@@ -273,7 +275,7 @@ test("resolvedMarimoConfigAtom overrides correctly and does not mutate the origi
273
275
  autosave_delay: 1000,
274
276
  format_on_save: false,
275
277
  },
276
- formatting: { line_length: 79 },
278
+ formatting: { line_length: 79, infer_types: "off" },
277
279
  };
278
280
 
279
281
  const overrides = {
@@ -299,7 +301,7 @@ test("resolvedMarimoConfigAtom overrides correctly and does not mutate the origi
299
301
  autosave_delay: 1000,
300
302
  format_on_save: false,
301
303
  },
302
- formatting: { line_length: 79 },
304
+ formatting: { line_length: 79, infer_types: "off" },
303
305
  display: { theme: "dark" },
304
306
  });
305
307
 
@@ -314,7 +316,7 @@ test("resolvedMarimoConfigAtom overrides correctly and does not mutate the origi
314
316
  autosave_delay: 1000,
315
317
  format_on_save: false,
316
318
  },
317
- formatting: { line_length: 79 },
319
+ formatting: { line_length: 79, infer_types: "off" },
318
320
  });
319
321
  });
320
322
 
@@ -44,6 +44,8 @@ export const DEFAULT_AI_MODEL = "openai/gpt-4o";
44
44
  */
45
45
  const AUTO_DOWNLOAD_FORMATS = ["html", "markdown", "ipynb"] as const;
46
46
 
47
+ export const TYPE_INFERENCE_MODES = ["off", "jedi"] as const;
48
+
47
49
  export type CopilotMode = NonNullable<schemas["AiConfig"]["mode"]>;
48
50
  export const COPILOT_MODES: CopilotMode[] = [
49
51
  "manual",
@@ -112,6 +114,7 @@ export const UserConfigSchema = z
112
114
  .nonnegative()
113
115
  .prefault(79)
114
116
  .transform((n) => Math.min(n, 1000)),
117
+ infer_types: z.enum(TYPE_INFERENCE_MODES).prefault("off"),
115
118
  })
116
119
  .prefault({}),
117
120
  keymap: z
@@ -4,7 +4,7 @@ import { requestId } from "@/__tests__/branded";
4
4
  import type { DataSourceDiscoveryResult } from "@/core/kernel/messages";
5
5
  import { connectionAtom } from "@/core/network/connection";
6
6
  import { store } from "@/core/state/jotai";
7
- import { ConnectionState } from "@/core/websocket/types";
7
+ import { ConnectionState } from "@/core/session/types";
8
8
  import {
9
9
  fetchDataSourceDiscovery,
10
10
  invalidateDataSourceDiscovery,
@@ -185,8 +185,8 @@ describe("isDetectedSourceConnected", () => {
185
185
  });
186
186
  const emptySnapshot = {
187
187
  dialects: [] as string[],
188
- storageProtocols: [] as string[],
189
- storageBackendTypes: [] as string[],
188
+ storageProtocols: new Set<string>(),
189
+ storageBackendTypes: new Set<string>(),
190
190
  };
191
191
 
192
192
  it("does not hide a source when nothing is connected", () => {
@@ -242,7 +242,7 @@ describe("isDetectedSourceConnected", () => {
242
242
  expect(
243
243
  isDetectedSourceConnected(s3, {
244
244
  ...emptySnapshot,
245
- storageProtocols: ["s3"],
245
+ storageProtocols: new Set(["s3"]),
246
246
  }),
247
247
  ).toBe(true);
248
248
  });
@@ -262,7 +262,7 @@ describe("isDetectedSourceConnected", () => {
262
262
  expect(
263
263
  isDetectedSourceConnected(hf, {
264
264
  ...emptySnapshot,
265
- storageBackendTypes: ["huggingface"],
265
+ storageBackendTypes: new Set(["huggingface"]),
266
266
  }),
267
267
  ).toBe(true);
268
268
  });
@@ -27,8 +27,8 @@ export function matchesDiscoveryGroup(
27
27
  */
28
28
  export interface LiveConnectionSnapshot {
29
29
  dialects: readonly string[];
30
- storageProtocols: readonly string[];
31
- storageBackendTypes: readonly string[];
30
+ storageProtocols: ReadonlySet<string>;
31
+ storageBackendTypes: ReadonlySet<string>;
32
32
  }
33
33
 
34
34
  /**
@@ -47,15 +47,13 @@ export function isDetectedSourceConnected(
47
47
  }
48
48
 
49
49
  if (
50
- match.protocols.some((protocol) =>
51
- snapshot.storageProtocols.includes(protocol),
52
- )
50
+ match.protocols.some((protocol) => snapshot.storageProtocols.has(protocol))
53
51
  ) {
54
52
  return true;
55
53
  }
56
54
 
57
55
  return match.backendTypes.some((backendType) =>
58
- snapshot.storageBackendTypes.includes(backendType),
56
+ snapshot.storageBackendTypes.has(backendType),
59
57
  );
60
58
  }
61
59
 
@@ -41,7 +41,7 @@ import { viewStateAtom } from "./mode";
41
41
  import { useRequestClient } from "./network/requests";
42
42
  import { useFilename } from "./saving/filename";
43
43
  import { lastSavedNotebookAtom } from "./saving/state";
44
- import { useNotebookSession } from "./websocket/useNotebookSession";
44
+ import { useNotebookSession } from "./session/useNotebookSession";
45
45
 
46
46
  interface AppProps {
47
47
  /**
@@ -81,7 +81,7 @@ export const EditApp: React.FC<AppProps> = ({
81
81
  return () => {
82
82
  RuntimeState.INSTANCE.stop();
83
83
  };
84
- }, []);
84
+ }, [sendComponentValues]);
85
85
 
86
86
  const { connection, reconnect } = useNotebookSession({
87
87
  autoInstantiate: userConfig.runtime.auto_instantiate,
@@ -122,6 +122,9 @@ export function describeError(error: MarimoError): string {
122
122
  if (error.type === "import-star") {
123
123
  return error.msg;
124
124
  }
125
+ if (error.type === "lazy-import") {
126
+ return error.msg;
127
+ }
125
128
  if (error.type === "ancestor-stopped") {
126
129
  return error.msg;
127
130
  }
@@ -16,7 +16,7 @@ import { connectionAtom } from "../network/connection";
16
16
  import { useRequestClient } from "../network/requests";
17
17
  import type { UpdateCellOutputsRequest } from "../network/types";
18
18
  import { VirtualFileTracker } from "../static/virtual-file-tracker";
19
- import { ConnectionState } from "../websocket/types";
19
+ import { ConnectionState } from "../session/types";
20
20
 
21
21
  const DELAY = 5000; // 5 seconds;
22
22
 
@@ -2,6 +2,7 @@
2
2
  import { atom, useAtomValue, useSetAtom } from "jotai";
3
3
  import useEvent from "react-use-event-hook";
4
4
  import type { HotkeyAction } from "@/core/hotkeys/hotkeys";
5
+ import { Objects } from "@/utils/objects";
5
6
 
6
7
  /**
7
8
  * Map of registered keyboard shortcuts and their callbacks.
@@ -29,10 +30,7 @@ export function useSetRegisteredAction() {
29
30
  },
30
31
  ),
31
32
  unregisterAction: useEvent((shortcut: HotkeyAction) => {
32
- set((actions) => {
33
- const { [shortcut]: unused, ...rest } = actions;
34
- return rest;
35
- });
33
+ set((actions) => Objects.omit(actions, [shortcut]));
36
34
  }),
37
35
  };
38
36
  }
@@ -3,22 +3,20 @@
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";
11
- import type { IslandsKernelMessage } from "../worker/worker";
9
+ import type { NotificationMessage } from "@/core/kernel/messages";
12
10
 
13
- function completedRun(sessionGeneration: number): IslandsKernelMessage {
14
- return {
15
- sessionGeneration,
16
- message: JSON.stringify({
17
- op: "completed-run",
18
- data: { op: "completed-run", run_id: null },
19
- }) as IslandsKernelMessage["message"],
20
- };
21
- }
11
+ type Consumer = (
12
+ notification: NotificationMessage,
13
+ sessionGeneration: number,
14
+ ) => void;
15
+
16
+ const completedRun = {
17
+ op: "completed-run",
18
+ run_id: null,
19
+ } as NotificationMessage;
22
20
 
23
21
  describe("initializeIslands", () => {
24
22
  afterEach(vi.restoreAllMocks);
@@ -28,9 +26,9 @@ describe("initializeIslands", () => {
28
26
  root.innerHTML =
29
27
  '<marimo-island data-app-id="app-1" data-reactive="true"></marimo-island>';
30
28
 
31
- let consumeMessage: ((message: IslandsKernelMessage) => void) | undefined;
29
+ let consumeMessage: Consumer | undefined;
32
30
  const bridge = {
33
- consumeMessages: (consumer: (message: IslandsKernelMessage) => void) => {
31
+ consumeNotifications: (consumer: Consumer) => {
34
32
  consumeMessage = consumer;
35
33
  },
36
34
  sendComponentValues: vi.fn(),
@@ -50,38 +48,14 @@ 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
- consumeMessage?.(completedRun(1));
51
+ consumeMessage?.(completedRun, 1);
78
52
  expect(store.get(islandsHydratedAtom)).toBe(false);
79
53
 
80
- consumeMessage?.(completedRun(1));
81
- consumeMessage?.(completedRun(0));
54
+ consumeMessage?.(completedRun, 1);
55
+ consumeMessage?.(completedRun, 0);
82
56
  expect(store.get(islandsHydratedAtom)).toBe(false);
83
57
 
84
- consumeMessage?.(completedRun(2));
58
+ consumeMessage?.(completedRun, 2);
85
59
  expect(store.get(islandsHydratedAtom)).toBe(true);
86
60
  });
87
61
  });