@marimo-team/islands 0.25.3-dev12 → 0.25.3-dev121

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 (391) hide show
  1. package/dist/{ConnectedDataExplorerComponent-CNMliVzw.js → ConnectedDataExplorerComponent-CFzqIsUg.js} +14 -14
  2. package/dist/{ErrorBoundary-CUd8VnYI.js → ErrorBoundary-DMV_LmQz.js} +8 -8
  3. package/dist/{abnfDiagram-VCTEODGH-D-Ez91gV.js → abnfDiagram-VCTEODGH-Di400kYu.js} +2 -2
  4. package/dist/any-language-editor-k2B8YI3Y.js +75 -0
  5. package/dist/{architectureDiagram-5GKGNRK7-CTpcNtO8.js → architectureDiagram-5GKGNRK7-BdTJcsNJ.js} +1 -1
  6. package/dist/{arrays-CN1djC4k.js → arrays-R6JsImiT.js} +8 -0
  7. package/dist/assets/__vite-browser-external-SaDYcg7x.js +1 -0
  8. package/dist/assets/{worker-HPY9fbhz.js → worker-CfME3uyi.js} +3 -2
  9. package/dist/{button-CvjkwdSk.js → button-BxB3RDjN.js} +1 -1
  10. package/dist/{capabilities-CQ5IjhzL.js → capabilities-BgR0osfN.js} +2 -2
  11. package/dist/{chat-ui-DaHynk8g.js → chat-ui-DA8zEZ1I.js} +1141 -1141
  12. package/dist/{check-EDwSwP89.js → check-P35dc2dH.js} +1 -1
  13. package/dist/{chunk-IMKFNOWR-DGxi-zeo.js → chunk-IMKFNOWR-mtD7aJBw.js} +1 -1
  14. package/dist/{chunk-SHT3W25Y-CV9J3rAB.js → chunk-SHT3W25Y-DybB1ShH.js} +1 -1
  15. package/dist/{chunk-SVP7TREG-BL-9Fqgg.js → chunk-SVP7TREG-DNhhdCex.js} +1 -1
  16. package/dist/{chunk-TICWLB2K-Cu_XMjDM.js → chunk-TICWLB2K-NhAQhlDf.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-GTL0l5xS.js} +2 -2
  19. package/dist/{classDiagram-v2-VYDZK3BY-B7FXJ1Cp.js → classDiagram-v2-VYDZK3BY-BWrM2ruI.js} +2 -2
  20. package/dist/{code-visibility-P0Ornave.js → code-visibility-DH5nTo0j.js} +6 -6
  21. package/dist/{common-BtO98PuE.js → common-5eNT-fXN.js} +5559 -5453
  22. package/dist/{copy-icon-Ft7t9bqz.js → copy-icon-CPoxUG7G.js} +3 -3
  23. package/dist/{cynefinDiagram-5FMLGOSQ-CH96rwba.js → cynefinDiagram-5FMLGOSQ-CX22wa7c.js} +1 -1
  24. package/dist/{dagre-GXQ25YYZ-BD3PmpFY.js → dagre-GXQ25YYZ-Df6Pp-cl.js} +1 -1
  25. package/dist/{data-grid-overlay-editor-B801aMeG.js → data-grid-overlay-editor-Chb0ro0y.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-CctU9kVx.js} +1 -1
  28. package/dist/{diagram-UQ7AKVKN-muQtNZc4.js → diagram-UQ7AKVKN-FVHjCF9j.js} +1 -1
  29. package/dist/{diagram-VX7I27RA-CdhuZAqR.js → diagram-VX7I27RA-BSDbwFFv.js} +1 -1
  30. package/dist/{diagram-Z3DM3KII-BD8mXjOj.js → diagram-Z3DM3KII-BX8kW7Nc.js} +1 -1
  31. package/dist/{dialog-CEBFZNyc.js → dialog-C1PcpCqX.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-B_7xD2X4.js} +177 -169
  34. package/dist/{ebnfDiagram-PWID7BFC-BIN1sweE.js → ebnfDiagram-PWID7BFC-DtapdLet.js} +2 -2
  35. package/dist/{erDiagram-RLTQ6QDP-Ctp5cfoN.js → erDiagram-RLTQ6QDP-BAru9jHt.js} +1 -1
  36. package/dist/{error-banner-D-WCIiMt.js → error-banner-Sl2FlSJ4.js} +2 -2
  37. package/dist/{error-entries-Bv6bZPF3.js → error-entries-g9iQiVIT.js} +844 -811
  38. package/dist/{feedback-button-Bpu-arCP.js → feedback-button-DWp0Qlyy.js} +29 -29
  39. package/dist/{flowDiagram-HODETNUW-3EfLrlFb.js → flowDiagram-HODETNUW-CjaeFeea.js} +2 -2
  40. package/dist/{formats-27CW_UP4.js → formats-V8ifA0Bk.js} +3 -3
  41. package/dist/{ganttDiagram-EL5Y4UJY-BQT16JSc.js → ganttDiagram-EL5Y4UJY-Dh_4cBJZ.js} +2 -2
  42. package/dist/{glide-data-editor-XZB3u4tH.js → glide-data-editor-DkAUNAn6.js} +370 -368
  43. package/dist/{glide-utils-DJyqh0EM.js → glide-utils-Bt8_pBa2.js} +16 -16
  44. package/dist/{globals-BIQc0DK0.js → globals-CUq9S0hL.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-Bg5ZoSO-.js} +29 -29
  47. package/dist/{infoDiagram-27XIBGKW-DipQoHxl.js → infoDiagram-27XIBGKW-B1hmUggC.js} +1 -1
  48. package/dist/{ishikawaDiagram-5VMMS53U-DgFMjSGz.js → ishikawaDiagram-5VMMS53U-DUeT3t-d.js} +1 -1
  49. package/dist/{kanban-definition-UXKFOSKX-w1ACVjgl.js → kanban-definition-UXKFOSKX-DEUnNNgc.js} +1 -1
  50. package/dist/{label-BDKF3Afc.js → label-BRnUC0NX.js} +2 -2
  51. package/dist/{linear-Cnaq3Tfb.js → linear-DWERh7eI.js} +121 -73
  52. package/dist/{loader-BQOfjTIJ.js → loader-Bm8cy3e8.js} +12 -12
  53. package/dist/main.js +3272 -3030
  54. package/dist/{mermaid-CHo49Yv-.js → mermaid-B0fXpsNP.js} +38 -38
  55. package/dist/mermaid-HWGCJPDP-Du3-HPQA.js +2 -0
  56. package/dist/{mindmap-definition-YA3MSWOX-CrT0KSfX.js → mindmap-definition-YA3MSWOX-CPexlhDQ.js} +1 -1
  57. package/dist/{number-overlay-editor-CEO_7tD7.js → number-overlay-editor-CKqpdMbo.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-CMpp1OOQ.js} +2 -2
  61. package/dist/{pieDiagram-E7YTZNPT-BfxJ_XCc.js → pieDiagram-E7YTZNPT-DlMWg5t1.js} +1 -1
  62. package/dist/precisionRound-DhAzeRcm.js +49 -0
  63. package/dist/{process-output-BZg56CCb.js → process-output-BtVPCGeI.js} +4 -4
  64. package/dist/{quadrantDiagram-AXDQQJYC-Ccw0xMjN.js → quadrantDiagram-AXDQQJYC-Blrm7V7_.js} +1 -1
  65. package/dist/{railroadDiagram-O6MQD6OU-8vFLVTPu.js → railroadDiagram-O6MQD6OU-DBJfseeO.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-BC7V639r.js} +1 -1
  68. package/dist/{reveal-component-LPCUNcgp.js → reveal-component-BImvqVXl.js} +23 -23
  69. package/dist/{select-BButFi-d.js → select-B0LRDH0g.js} +4 -4
  70. package/dist/{sequenceDiagram-WJ2MYXX4-CXFMnxGh.js → sequenceDiagram-WJ2MYXX4-CgesU6F-.js} +1 -1
  71. package/dist/{spec-BwarBpUJ.js → spec-DTiOPKyk.js} +41 -11
  72. package/dist/{stateDiagram-D77RDMKH-DQeA_CwI.js → stateDiagram-D77RDMKH-lH_BUhs3.js} +2 -2
  73. package/dist/{stateDiagram-v2-MP3YSRHH-BxxQucm1.js → stateDiagram-v2-MP3YSRHH-8LL6FrBe.js} +2 -2
  74. package/dist/style.css +1 -1
  75. package/dist/{swimlanes-42K2YHIH-Do6L-cYg.js → swimlanes-42K2YHIH-Cuf9B9kE.js} +1 -1
  76. package/dist/{swimlanesDiagram-VR7AAH4N-DUzPvSVU.js → swimlanesDiagram-VR7AAH4N-BoMMtOPh.js} +2 -2
  77. package/dist/{swiper-component-DKntyn8p.js → swiper-component-DfhRvAFi.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-yzzw4TF4.js} +1 -1
  80. package/dist/{toDate-UtiwmnH2.js → toDate-DKH0_kMo.js} +15 -18
  81. package/dist/{toast-B9UMEi8u.js → toast-CFWpihJU.js} +4 -4
  82. package/dist/{tooltip-BO1REbqs.js → tooltip-CKO1pHJo.js} +2 -2
  83. package/dist/{use-restore-focus-BEM7sFWl.js → use-restore-focus-DBCITLeF.js} +1 -1
  84. package/dist/{useAsyncData-Deh5kszT.js → useAsyncData-D0mLJstx.js} +15 -14
  85. package/dist/{useDateFormatter-D8XruNGG.js → useDateFormatter-c_yJtkAe.js} +2 -2
  86. package/dist/{useDeepCompareMemoize-DXwzRINI.js → useDeepCompareMemoize-BpPWi3G3.js} +1 -1
  87. package/dist/{useIframeCapabilities-DBETvvPl.js → useIframeCapabilities-BkdeVdXC.js} +1 -1
  88. package/dist/{useLifecycle-j7D9uD1o.js → useLifecycle-Dum8WSXq.js} +3 -3
  89. package/dist/{useTheme-CRnjkku0.js → useTheme-CfeaVw5D.js} +6 -6
  90. package/dist/{vega-component-BeF9dfyO.js → vega-component-DgytCKrL.js} +147 -147
  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-eJOrTqqC.js} +1 -1
  94. package/dist/{wardleyDiagram-VM6X3IG4-48cUWkfA.js → wardleyDiagram-VM6X3IG4-TILPvee6.js} +1 -1
  95. package/dist/{xychartDiagram-S5SC5T6Z-CswYgYeu.js → xychartDiagram-S5SC5T6Z-DUPvRwwJ.js} +2 -2
  96. package/package.json +12 -12
  97. package/src/__tests__/host-imports.test.ts +1 -0
  98. package/src/__tests__/mount.test.ts +0 -20
  99. package/src/components/app-config/ai-config.tsx +7 -2
  100. package/src/components/chat/__tests__/message-queue.test.tsx +17 -0
  101. package/src/components/chat/acp/__tests__/state.test.ts +2 -2
  102. package/src/components/chat/acp/blocks.tsx +2 -2
  103. package/src/components/chat/chat-components.tsx +2 -0
  104. package/src/components/chat/chat-panel.tsx +9 -8
  105. package/src/components/chat/chat-utils.ts +4 -8
  106. package/src/components/data-table/__tests__/chart-spec-model.test.ts +195 -195
  107. package/src/components/data-table/__tests__/column-explorer.test.tsx +27 -1
  108. package/src/components/data-table/__tests__/columns.test.tsx +105 -0
  109. package/src/components/data-table/__tests__/context-menu-interaction.test.tsx +130 -0
  110. package/src/components/data-table/__tests__/date-popover.test.tsx +72 -0
  111. package/src/components/data-table/__tests__/export-actions.test.tsx +105 -0
  112. package/src/components/data-table/__tests__/search-highlight.test.tsx +109 -0
  113. package/src/components/data-table/__tests__/url-detector.test.tsx +74 -0
  114. package/src/components/data-table/cell-selection/feature.ts +2 -2
  115. package/src/components/data-table/cell-selection/types.ts +2 -2
  116. package/src/components/data-table/charts/__tests__/chart-panel.test.tsx +74 -1
  117. package/src/components/data-table/charts/__tests__/spec-snapshot.test.ts +20 -20
  118. package/src/components/data-table/charts/__tests__/spec.test.ts +78 -52
  119. package/src/components/data-table/charts/__tests__/storage.test.ts +4 -1
  120. package/src/components/data-table/charts/chart-spec/spec.ts +68 -43
  121. package/src/components/data-table/charts/charts.tsx +40 -30
  122. package/src/components/data-table/charts/storage.ts +16 -5
  123. package/src/components/data-table/column-explorer-panel/column-explorer.tsx +1 -1
  124. package/src/components/data-table/column-summary/chart-spec-model.tsx +23 -16
  125. package/src/components/data-table/column-summary/column-summary.tsx +2 -4
  126. package/src/components/data-table/column-visibility-dropdown.tsx +8 -13
  127. package/src/components/data-table/columns.tsx +45 -46
  128. package/src/components/data-table/context-menu.tsx +36 -20
  129. package/src/components/data-table/data-table.tsx +7 -1
  130. package/src/components/data-table/date-popover.tsx +6 -4
  131. package/src/components/data-table/export-actions.tsx +76 -48
  132. package/src/components/data-table/row-viewer-panel/row-viewer.tsx +2 -2
  133. package/src/components/data-table/search-highlight.tsx +79 -0
  134. package/src/components/data-table/types.ts +1 -0
  135. package/src/components/data-table/url-detector.tsx +49 -9
  136. package/src/components/datasources/__tests__/column-actions.test.tsx +97 -0
  137. package/src/components/datasources/__tests__/column-preview.test.tsx +63 -2
  138. package/src/components/datasources/__tests__/table-list.test.tsx +118 -0
  139. package/src/components/datasources/column-preview.tsx +8 -2
  140. package/src/components/datasources/datasources.tsx +47 -35
  141. package/src/components/debugger/debugger-code.tsx +5 -0
  142. package/src/components/dependency-graph/dependency-graph-tree.tsx +8 -8
  143. package/src/components/dependency-graph/elements.ts +24 -21
  144. package/src/components/dependency-graph/panels.tsx +2 -1
  145. package/src/components/dependency-graph/utils/__tests__/layout.test.ts +18 -11
  146. package/src/components/editor/SortableCell.tsx +1 -3
  147. package/src/components/editor/__tests__/dynamic-favicon.test.tsx +111 -18
  148. package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +24 -0
  149. package/src/components/editor/actions/pair-with-agent-modal.tsx +18 -15
  150. package/src/components/editor/ai/add-cell-with-ai.tsx +3 -3
  151. package/src/components/editor/ai/ai-completion-editor.tsx +1 -0
  152. package/src/components/editor/alerts/startup-logs-alert.tsx +1 -0
  153. package/src/components/editor/cell/CreateCellButton.tsx +8 -10
  154. package/src/components/editor/cell/DeleteButton.tsx +1 -0
  155. package/src/components/editor/cell/__tests__/useShouldShowInterrupt.test.ts +39 -0
  156. package/src/components/editor/cell/code/__tests__/language-toggle.test.tsx +54 -0
  157. package/src/components/editor/cell/code/cell-editor.tsx +1 -1
  158. package/src/components/editor/cell/code/language-toggle.tsx +8 -7
  159. package/src/components/editor/cell/useShouldShowInterrupt.ts +2 -12
  160. package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +30 -1
  161. package/src/components/editor/chrome/panels/cache-panel.tsx +1 -0
  162. package/src/components/editor/chrome/panels/packages-panel.tsx +4 -7
  163. package/src/components/editor/chrome/wrapper/__tests__/attachment-status.test.tsx +12 -18
  164. package/src/components/editor/chrome/wrapper/__tests__/pending-ai-cells.test.tsx +58 -1
  165. package/src/components/editor/chrome/wrapper/footer-items/runtime-settings.tsx +1 -7
  166. package/src/components/editor/chrome/wrapper/pending-ai-cells.tsx +12 -2
  167. package/src/components/editor/chrome/wrapper/storage.ts +1 -1
  168. package/src/components/editor/connections/components.tsx +1 -1
  169. package/src/components/editor/controls/__tests__/command-palette.test.tsx +53 -0
  170. package/src/components/editor/controls/command-palette.tsx +22 -10
  171. package/src/components/editor/dynamic-favicon.tsx +21 -40
  172. package/src/components/editor/errors/__tests__/send-error-report-button.test.tsx +12 -23
  173. package/src/components/editor/file-tree/__tests__/file-explorer-interactions.test.tsx +6 -0
  174. package/src/components/editor/file-tree/__tests__/use-file-search.test.tsx +91 -0
  175. package/src/components/editor/file-tree/file-explorer.tsx +10 -5
  176. package/src/components/editor/file-tree/file-viewer.tsx +4 -2
  177. package/src/components/editor/file-tree/use-file-search.ts +35 -21
  178. package/src/components/editor/notebook-banner.tsx +1 -0
  179. package/src/components/editor/output/MarimoTracebackOutput.tsx +2 -2
  180. package/src/components/editor/output/ansi-reduce.ts +33 -20
  181. package/src/components/editor/output/console/ConsoleOutput.tsx +19 -25
  182. package/src/components/editor/package-alert.tsx +6 -4
  183. package/src/components/editor/renderers/grid-layout/grid-layout.tsx +12 -6
  184. package/src/components/editor/renderers/vertical-layout/sidebar/toggle.tsx +7 -1
  185. package/src/components/home/components.tsx +17 -31
  186. package/src/components/icons/__tests__/large-spinner.test.tsx +39 -0
  187. package/src/components/icons/large-spinner.tsx +3 -14
  188. package/src/components/icons/spinner.tsx +1 -1
  189. package/src/components/mcp/mcp-status-indicator.tsx +1 -1
  190. package/src/components/pages/__tests__/home-page.test.tsx +116 -0
  191. package/src/components/pages/home-page.tsx +164 -91
  192. package/src/components/scratchpad/scratchpad.tsx +2 -2
  193. package/src/components/slides/reveal-component.tsx +4 -2
  194. package/src/components/slides/slide-cell-view.tsx +1 -1
  195. package/src/components/slides/slide-form.tsx +1 -0
  196. package/src/components/tracing/tracing.tsx +2 -2
  197. package/src/components/ui/alert-dialog.tsx +1 -1
  198. package/src/core/ai/context/providers/datasource.ts +6 -2
  199. package/src/core/ai/tools/base.ts +16 -7
  200. package/src/core/ai/tools/edit-notebook-tool.ts +47 -45
  201. package/src/core/ai/tools/registry.ts +13 -8
  202. package/src/core/ai/tools/sample-tool.ts +6 -7
  203. package/src/core/attachments/state.ts +5 -8
  204. package/src/core/cells/__tests__/__snapshots__/cells.test.ts.snap +4 -0
  205. package/src/core/cells/__tests__/cell.test.ts +39 -0
  206. package/src/core/cells/__tests__/cells.test.ts +3 -1
  207. package/src/core/cells/__tests__/collapseConsoleOutputs.test.ts +54 -0
  208. package/src/core/cells/__tests__/notebook-outline.test.ts +113 -0
  209. package/src/core/cells/__tests__/session.test.ts +117 -36
  210. package/src/core/cells/cell.ts +14 -3
  211. package/src/core/cells/cells.ts +3 -1
  212. package/src/core/cells/pending-delete-service.ts +2 -6
  213. package/src/core/cells/session.ts +1 -1
  214. package/src/core/cells/types.ts +10 -1
  215. package/src/core/codemirror/__tests__/setup.test.ts +29 -29
  216. package/src/core/codemirror/cells/__tests__/extensions.test.ts +15 -0
  217. package/src/core/codemirror/cells/extensions.ts +7 -3
  218. package/src/core/codemirror/keymaps/vim.ts +2 -6
  219. package/src/core/codemirror/language/__tests__/sql.test.ts +22 -20
  220. package/src/core/codemirror/language/extension.ts +8 -8
  221. package/src/core/codemirror/language/languages/markdown.ts +8 -6
  222. package/src/core/codemirror/language/languages/python.ts +16 -10
  223. package/src/core/codemirror/language/languages/sql/sql.ts +9 -7
  224. package/src/core/codemirror/language/panel/panel.tsx +1 -0
  225. package/src/core/codemirror/language/types.ts +7 -7
  226. package/src/core/codemirror/rtc/extension.ts +24 -12
  227. package/src/core/codemirror/rtc/loro/awareness.ts +34 -19
  228. package/src/core/codemirror/rtc/loro/sync.ts +1 -0
  229. package/src/core/codemirror/utils.ts +1 -0
  230. package/src/core/datasets/__tests__/data-source-discovery.test.ts +4 -4
  231. package/src/core/datasets/data-source-discovery.ts +4 -6
  232. package/src/core/document/__tests__/codemirror.test.ts +483 -0
  233. package/src/core/document/__tests__/draft.test.ts +322 -0
  234. package/src/core/document/__tests__/fixtures.ts +92 -0
  235. package/src/core/document/__tests__/hooks.test.tsx +386 -0
  236. package/src/core/document/__tests__/lifecycle-scenarios.test.ts +61 -0
  237. package/src/core/document/__tests__/model.test.ts +158 -0
  238. package/src/core/document/__tests__/protocol-fixtures.ts +38 -0
  239. package/src/core/document/__tests__/recovery-scenarios.test.ts +230 -0
  240. package/src/core/document/__tests__/scenario-fixture.ts +42 -0
  241. package/src/core/document/__tests__/scenarios.test.ts +205 -0
  242. package/src/core/document/__tests__/state.test.ts +438 -0
  243. package/src/core/document/__tests__/submission.test.ts +203 -0
  244. package/src/core/document/__tests__/test-host.test.ts +92 -0
  245. package/src/core/document/__tests__/test-host.ts +247 -0
  246. package/src/core/document/__tests__/test-notebook.ts +139 -0
  247. package/src/core/document/__tests__/user.ts +61 -0
  248. package/src/core/document/codemirror.ts +311 -0
  249. package/src/core/document/draft.ts +472 -0
  250. package/src/core/document/hooks.tsx +118 -0
  251. package/src/core/document/index.ts +22 -0
  252. package/src/core/document/model.ts +52 -0
  253. package/src/core/document/select.ts +41 -0
  254. package/src/core/document/state.ts +374 -0
  255. package/src/core/document/sync.ts +363 -0
  256. package/src/core/host/AGENTS.md +12 -2
  257. package/src/core/host/__tests__/attachments.test.ts +56 -0
  258. package/src/core/host/__tests__/document.test.ts +126 -0
  259. package/src/core/host/__tests__/fixtures.ts +41 -0
  260. package/src/core/host/__tests__/notebook-client.test.ts +511 -132
  261. package/src/core/host/__tests__/static.test.ts +167 -0
  262. package/src/core/host/__tests__/wasm.test.ts +152 -0
  263. package/src/core/host/backend.ts +10 -0
  264. package/src/core/host/connection.ts +1 -40
  265. package/src/core/host/notebook-client.ts +204 -133
  266. package/src/core/host/resources/attachments.ts +22 -0
  267. package/src/core/host/resources/document.ts +101 -0
  268. package/src/core/host/static.ts +70 -0
  269. package/src/core/host/wasm.ts +92 -0
  270. package/src/core/hotkeys/actions.ts +2 -4
  271. package/src/core/islands/__tests__/bootstrap.test.ts +0 -26
  272. package/src/core/islands/bootstrap.ts +0 -1
  273. package/src/core/islands/components/__tests__/IslandControls.test.tsx +7 -5
  274. package/src/core/kernel/__tests__/RuntimeState.test.ts +1 -1
  275. package/src/core/network/connection.ts +4 -2
  276. package/src/core/network/useConnectionNotice.ts +8 -2
  277. package/src/core/runtime/__tests__/createWsUrl.test.ts +77 -7
  278. package/src/core/runtime/__tests__/runtime.test.ts +15 -58
  279. package/src/core/runtime/runtime.ts +25 -42
  280. package/src/core/runtime/types.ts +0 -2
  281. package/src/core/state/__tests__/jotai.test.tsx +108 -0
  282. package/src/core/state/jotai.ts +1 -1
  283. package/src/core/static/__tests__/files.test.ts +38 -10
  284. package/src/core/static/files.ts +2 -0
  285. package/src/core/wasm/bridge.ts +38 -10
  286. package/src/core/wasm/store.ts +3 -3
  287. package/src/core/wasm/worker/bootstrap.ts +2 -1
  288. package/src/core/wasm/worker/getMarimoWheel.ts +1 -1
  289. package/src/core/wasm/worker/types.ts +11 -0
  290. package/src/core/wasm/worker/worker.ts +48 -0
  291. package/src/core/websocket/__tests__/connection-state.test.ts +0 -12
  292. package/src/core/websocket/__tests__/useNotebookClient.hook.test.tsx +153 -70
  293. package/src/core/websocket/__tests__/useNotebookSession.hook.test.tsx +151 -428
  294. package/src/core/websocket/connection-state.ts +0 -10
  295. package/src/core/websocket/state.ts +7 -0
  296. package/src/core/websocket/transports/__tests__/notebook.test.ts +502 -0
  297. package/src/core/websocket/transports/notebook.ts +213 -0
  298. package/src/core/websocket/useNotebookClient.ts +38 -29
  299. package/src/core/websocket/useNotebookSession.tsx +1 -14
  300. package/src/css/globals.css +5 -0
  301. package/src/hooks/__tests__/useAsyncData.test.tsx +148 -0
  302. package/src/hooks/__tests__/useDebounce.test.tsx +51 -0
  303. package/src/hooks/__tests__/useDeepCompareMemoize.test.tsx +39 -0
  304. package/src/hooks/__tests__/useDelayElapsed.test.tsx +28 -0
  305. package/src/hooks/__tests__/useInternalStateWithSync.test.tsx +20 -0
  306. package/src/hooks/__tests__/useScript.test.tsx +77 -0
  307. package/src/hooks/__tests__/useStateForKey.test.tsx +257 -0
  308. package/src/hooks/useAsyncData.ts +3 -3
  309. package/src/hooks/useDataSourceDiscovery.ts +6 -4
  310. package/src/hooks/useDebounce.ts +6 -10
  311. package/src/hooks/useDeepCompareMemoize.ts +1 -1
  312. package/src/hooks/useDelayElapsed.ts +14 -10
  313. package/src/hooks/useElapsedTime.ts +3 -3
  314. package/src/hooks/useEventListener.ts +1 -2
  315. package/src/hooks/useInputHistory.ts +4 -7
  316. package/src/hooks/useInternalStateWithSync.ts +6 -6
  317. package/src/hooks/useResizeObserver.ts +4 -7
  318. package/src/hooks/useScript.ts +67 -70
  319. package/src/hooks/useStateForKey.ts +93 -0
  320. package/src/mount.tsx +0 -4
  321. package/src/plugins/__tests__/plugin-object-schemas.test.ts +104 -0
  322. package/src/plugins/core/registerReactComponent.tsx +1 -1
  323. package/src/plugins/impl/CodeEditorPlugin.tsx +1 -1
  324. package/src/plugins/impl/DataEditorPlugin.tsx +1 -1
  325. package/src/plugins/impl/DataTablePlugin.tsx +29 -33
  326. package/src/plugins/impl/DropdownPlugin.tsx +2 -6
  327. package/src/plugins/impl/FileBrowserPlugin.tsx +4 -16
  328. package/src/plugins/impl/FormPlugin.tsx +1 -1
  329. package/src/plugins/impl/RangeSliderPlugin.tsx +0 -1
  330. package/src/plugins/impl/RefreshPlugin.tsx +1 -0
  331. package/src/plugins/impl/SliderPlugin.tsx +6 -8
  332. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +117 -1
  333. package/src/plugins/impl/__tests__/FileBrowserPlugin.test.tsx +45 -0
  334. package/src/plugins/impl/__tests__/SliderPlugin.test.tsx +24 -3
  335. package/src/plugins/impl/anywidget/__tests__/registry.test.ts +2 -0
  336. package/src/plugins/impl/anywidget/__tests__/widget-binding.test.ts +241 -2
  337. package/src/plugins/impl/anywidget/runtime.ts +21 -9
  338. package/src/plugins/impl/anywidget/widget-binding.ts +160 -82
  339. package/src/plugins/impl/chat/__tests__/chat-prompts.test.tsx +93 -0
  340. package/src/plugins/impl/chat/chat-ui.tsx +12 -10
  341. package/src/plugins/impl/code/any-language-editor.tsx +2 -2
  342. package/src/plugins/impl/data-editor/glide-data-editor.tsx +8 -5
  343. package/src/plugins/impl/data-editor/glide-utils.ts +3 -1
  344. package/src/plugins/impl/data-explorer/ConnectedDataExplorerComponent.tsx +1 -1
  345. package/src/plugins/impl/data-explorer/state/reducer.ts +1 -1
  346. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +1 -2
  347. package/src/plugins/impl/mpl-interactive/MplInteractivePlugin.tsx +5 -3
  348. package/src/plugins/impl/panel/PanelPlugin.tsx +16 -17
  349. package/src/plugins/impl/panel/__tests__/utils.test.ts +39 -1
  350. package/src/plugins/impl/panel/utils.ts +17 -0
  351. package/src/plugins/impl/plotly/PlotlyPlugin.tsx +2 -5
  352. package/src/plugins/impl/plotly/selection.ts +25 -19
  353. package/src/plugins/impl/vega/VegaPlugin.tsx +2 -3
  354. package/src/plugins/impl/vega/make-selectable.ts +4 -7
  355. package/src/plugins/layout/RoutesPlugin.tsx +1 -1
  356. package/src/stories/__tests__/editor-story.test.tsx +33 -0
  357. package/src/stories/button.stories.tsx +1 -0
  358. package/src/stories/editor.stories.tsx +24 -17
  359. package/src/stories/form-wrapper.stories.tsx +2 -2
  360. package/src/stories/select.stories.tsx +2 -2
  361. package/src/stories/switchable-multi-select.stories.tsx +1 -1
  362. package/src/utils/__tests__/arrays.test.ts +35 -0
  363. package/src/utils/__tests__/batch-requests.test.ts +3 -3
  364. package/src/utils/__tests__/numbers.test.ts +48 -1
  365. package/src/utils/__tests__/objects.test.ts +21 -0
  366. package/src/utils/arrays.ts +10 -0
  367. package/src/utils/blob.ts +1 -1
  368. package/src/utils/numbers.ts +28 -17
  369. package/src/utils/objects.ts +3 -7
  370. package/src/utils/once.ts +19 -19
  371. package/src/utils/tracer.ts +9 -5
  372. package/src/utils/zod-utils.ts +1 -3
  373. package/dist/any-language-editor-DZ_YTVus.js +0 -76
  374. package/dist/assets/__vite-browser-external-BXYkiFsk.js +0 -1
  375. package/dist/mermaid-HWGCJPDP-ByCsZnYF.js +0 -2
  376. package/dist/precisionRound-DMIVQrt2.js +0 -97
  377. package/src/core/host/__tests__/events.test.ts +0 -46
  378. package/src/core/host/__tests__/protocol.test.ts +0 -214
  379. package/src/core/host/events.ts +0 -60
  380. package/src/core/host/protocol.ts +0 -1943
  381. package/src/core/state/__tests__/jotai.test.ts +0 -25
  382. package/src/core/websocket/__tests__/createConnectionTransport.test.ts +0 -49
  383. package/src/core/websocket/transports/__tests__/basic.test.ts +0 -275
  384. package/src/core/websocket/transports/__tests__/sse.test.ts +0 -335
  385. package/src/core/websocket/transports/__tests__/transport.test.ts +0 -308
  386. package/src/core/websocket/transports/__tests__/ws.test.ts +0 -125
  387. package/src/core/websocket/transports/basic.ts +0 -102
  388. package/src/core/websocket/transports/create.ts +0 -31
  389. package/src/core/websocket/transports/sse.ts +0 -308
  390. package/src/core/websocket/transports/transport.ts +0 -50
  391. package/src/core/websocket/transports/ws.ts +0 -98
@@ -0,0 +1,374 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import {
4
+ atom,
5
+ type Atom,
6
+ type createStore,
7
+ type WritableAtom,
8
+ } from "jotai/vanilla";
9
+ import type { Document } from "../host/resources/document";
10
+ import * as Protocol from "@marimo-team/client/protocol";
11
+ import {
12
+ acknowledge,
13
+ type CellEdit,
14
+ createCell,
15
+ deleteCell,
16
+ type Draft,
17
+ type EditableDocument,
18
+ editCell,
19
+ EMPTY_DRAFT,
20
+ isEmptyDraft,
21
+ type Placement,
22
+ prune,
23
+ setOrder,
24
+ toChanges,
25
+ viewDocument,
26
+ } from "./draft";
27
+
28
+ /** Operations on a working draft, valid only during the edit callback. */
29
+ export interface DocumentEditor {
30
+ setCode(id: Protocol.CellId, code: string): void;
31
+ setName(id: Protocol.CellId, name: string): void;
32
+ updateConfig(id: Protocol.CellId, patch: Partial<Protocol.CellConfig>): void;
33
+ createCell(cell: Protocol.CellInput, placement?: Placement): void;
34
+ deleteCell(id: Protocol.CellId): void;
35
+ /** A permutation of the cells present at this point in the transaction. */
36
+ setOrder(order: readonly Protocol.CellId[]): void;
37
+ }
38
+
39
+ /** Synchronous; a thrown error discards the entire transaction. */
40
+ export type DocumentEdit = (editor: DocumentEditor) => void;
41
+
42
+ /** A captured edit request. Return this same object when reporting its result. */
43
+ export interface DocumentSubmission {
44
+ readonly notebookId: Protocol.NotebookId;
45
+ readonly changes: readonly Protocol.Change[];
46
+ }
47
+
48
+ type ResponseRevision = Pick<Protocol.Document, "notebook_id" | "version">;
49
+
50
+ interface PendingSubmission {
51
+ readonly submission: DocumentSubmission;
52
+ readonly draft: Draft;
53
+ readonly responseRevision: ResponseRevision | null;
54
+ }
55
+
56
+ interface ModelState {
57
+ readonly confirmed: Document | null;
58
+ readonly drafts: ReadonlyMap<Protocol.NotebookId, Draft>;
59
+ readonly pending: PendingSubmission | null;
60
+ }
61
+
62
+ /**
63
+ * Local edits over confirmed host state, with one submission in flight.
64
+ *
65
+ * A reset retains the submission so its receipt can reconcile a new snapshot.
66
+ * Switching notebook identity invalidates it, retaining each notebook's draft.
67
+ */
68
+ export interface DocumentState {
69
+ /** Confirmed host state with local drafts applied, null while unavailable. */
70
+ readonly documentAtom: Atom<EditableDocument | null>;
71
+ /** Null when the document or source needed by a put is unavailable. */
72
+ readonly changesAtom: Atom<readonly Protocol.Change[] | null>;
73
+ /** Remains pending until both the response and its streamed revision arrive. */
74
+ readonly pendingAtom: Atom<DocumentSubmission | null>;
75
+ readonly editAtom: WritableAtom<null, [edit: DocumentEdit], void>;
76
+ /** Capture a request, or null when unavailable, unchanged, or already sending. */
77
+ readonly submitAtom: WritableAtom<null, [], DocumentSubmission | null>;
78
+ /**
79
+ * Report the response revision, or null for a rejected request.
80
+ *
81
+ * Success waits for a complete streamed document at that version or later.
82
+ * Duplicate replies and replies for another notebook are ignored. Retry an
83
+ * uncertain request with the same body and idempotency key; do not reject it
84
+ * or capture a new request until its outcome is known.
85
+ */
86
+ readonly settleAtom: WritableAtom<
87
+ null,
88
+ [submission: DocumentSubmission, responseRevision: ResponseRevision | null],
89
+ void
90
+ >;
91
+ }
92
+
93
+ function draftOf(state: ModelState): Draft {
94
+ return state.confirmed === null
95
+ ? EMPTY_DRAFT
96
+ : (state.drafts.get(state.confirmed.revision.notebook_id) ?? EMPTY_DRAFT);
97
+ }
98
+
99
+ function withDraft(state: ModelState, draft: Draft): ModelState {
100
+ if (state.confirmed === null || draft === draftOf(state)) {
101
+ return state;
102
+ }
103
+ const drafts = new Map(state.drafts);
104
+ const notebookId = state.confirmed.revision.notebook_id;
105
+ if (isEmptyDraft(draft)) {
106
+ drafts.delete(notebookId);
107
+ } else {
108
+ drafts.set(notebookId, draft);
109
+ }
110
+ return { ...state, drafts };
111
+ }
112
+
113
+ /** Publish the confirmed document and any released fields together. */
114
+ function reconcile(state: ModelState): ModelState {
115
+ const { confirmed, pending } = state;
116
+ if (confirmed === null) {
117
+ return state;
118
+ }
119
+ let draft = draftOf(state);
120
+ if (
121
+ pending !== null &&
122
+ pending.responseRevision !== null &&
123
+ confirmed.revision.version >= pending.responseRevision.version
124
+ ) {
125
+ draft = acknowledge(draft, pending.draft);
126
+ state = { ...state, pending: null };
127
+ }
128
+ return withDraft(state, prune(confirmed, draft, state.pending?.draft));
129
+ }
130
+
131
+ /** Internal draft and submission state for one editing lifetime. */
132
+ export function createDocumentState({
133
+ store,
134
+ source,
135
+ signal,
136
+ }: {
137
+ store: ReturnType<typeof createStore>;
138
+ source: Atom<Document | null>;
139
+ signal: AbortSignal;
140
+ }): DocumentState {
141
+ signal.throwIfAborted();
142
+ const stateAtom = atom<ModelState>({
143
+ confirmed: store.get(source),
144
+ drafts: new Map(),
145
+ pending: null,
146
+ });
147
+ const documentAtom = atom((get): EditableDocument | null => {
148
+ const state = get(stateAtom);
149
+ return state.confirmed === null
150
+ ? null
151
+ : viewDocument(state.confirmed, draftOf(state));
152
+ });
153
+ const changesAtom = atom((get): readonly Protocol.Change[] | null => {
154
+ const state = get(stateAtom);
155
+ return state.confirmed === null
156
+ ? null
157
+ : toChanges(state.confirmed, draftOf(state));
158
+ });
159
+ const pendingAtom = atom((get) => get(stateAtom).pending?.submission ?? null);
160
+
161
+ const unsubscribe = store.sub(source, () => {
162
+ const confirmed = store.get(source);
163
+ store.set(stateAtom, (state) =>
164
+ reconcile({
165
+ ...state,
166
+ confirmed,
167
+ pending:
168
+ confirmed !== null &&
169
+ state.pending !== null &&
170
+ confirmed.revision.notebook_id !== state.pending.submission.notebookId
171
+ ? null
172
+ : state.pending,
173
+ }),
174
+ );
175
+ });
176
+
177
+ let editing = false;
178
+ const editAtom = atom(null, (get, set, edit: DocumentEdit) => {
179
+ if (editing) {
180
+ throw new Error("Document transactions cannot be nested");
181
+ }
182
+ const state = get(stateAtom);
183
+ if (signal.aborted || state.confirmed === null) {
184
+ return;
185
+ }
186
+ editing = true;
187
+ try {
188
+ const draft = editDocument(
189
+ state.confirmed,
190
+ draftOf(state),
191
+ edit,
192
+ state.pending?.draft,
193
+ );
194
+ if (
195
+ signal.aborted ||
196
+ get(stateAtom) !== state ||
197
+ get(source) !== state.confirmed
198
+ ) {
199
+ throw new Error("The document changed during the transaction");
200
+ }
201
+ set(stateAtom, withDraft(state, draft));
202
+ } finally {
203
+ editing = false;
204
+ }
205
+ });
206
+
207
+ const submitAtom = atom(null, (get, set): DocumentSubmission | null => {
208
+ const state = get(stateAtom);
209
+ if (signal.aborted || state.confirmed === null || state.pending !== null) {
210
+ return null;
211
+ }
212
+ const draft = draftOf(state);
213
+ const changes = toChanges(state.confirmed, draft);
214
+ if (changes === null) {
215
+ return null;
216
+ }
217
+ if (changes.length === 0) {
218
+ set(stateAtom, withDraft(state, EMPTY_DRAFT));
219
+ return null;
220
+ }
221
+ const submission = {
222
+ notebookId: state.confirmed.revision.notebook_id,
223
+ changes,
224
+ };
225
+ set(stateAtom, {
226
+ ...state,
227
+ pending: { submission, draft, responseRevision: null },
228
+ });
229
+ return submission;
230
+ });
231
+
232
+ const settleAtom = atom(
233
+ null,
234
+ (
235
+ get,
236
+ set,
237
+ submission: DocumentSubmission,
238
+ responseRevision: ResponseRevision | null,
239
+ ) => {
240
+ const state = get(stateAtom);
241
+ if (
242
+ signal.aborted ||
243
+ state.pending?.submission !== submission ||
244
+ state.pending.responseRevision !== null
245
+ ) {
246
+ return;
247
+ }
248
+ if (
249
+ responseRevision !== null &&
250
+ responseRevision.notebook_id !== submission.notebookId
251
+ ) {
252
+ throw new Error("Edit response belongs to another notebook");
253
+ }
254
+ set(
255
+ stateAtom,
256
+ reconcile({
257
+ ...state,
258
+ pending:
259
+ responseRevision === null
260
+ ? null
261
+ : { ...state.pending, responseRevision },
262
+ }),
263
+ );
264
+ },
265
+ );
266
+
267
+ function stop() {
268
+ unsubscribe();
269
+ signal.removeEventListener("abort", stop);
270
+ store.set(stateAtom, {
271
+ confirmed: null,
272
+ drafts: new Map(),
273
+ pending: null,
274
+ });
275
+ }
276
+ signal.addEventListener("abort", stop, { once: true });
277
+ if (signal.aborted) {
278
+ stop();
279
+ }
280
+
281
+ return {
282
+ documentAtom,
283
+ changesAtom,
284
+ pendingAtom,
285
+ editAtom,
286
+ submitAtom,
287
+ settleAtom,
288
+ };
289
+ }
290
+
291
+ function editDocument(
292
+ confirmed: Document,
293
+ draft: Draft,
294
+ edit: DocumentEdit,
295
+ sent: Draft = EMPTY_DRAFT,
296
+ ): Draft {
297
+ let next = draft;
298
+ let active = true;
299
+
300
+ function assertActive() {
301
+ if (!active) {
302
+ throw new Error("The document transaction has ended");
303
+ }
304
+ }
305
+
306
+ function hasCell(id: Protocol.CellId): boolean {
307
+ const local = next.cells.get(id);
308
+ return (
309
+ local?.kind === "create" ||
310
+ (local?.kind !== "delete" && confirmed.cells.has(id))
311
+ );
312
+ }
313
+
314
+ function requireCell(id: Protocol.CellId) {
315
+ assertActive();
316
+ if (!hasCell(id)) {
317
+ throw new Error(`Cell ${id} does not exist`);
318
+ }
319
+ }
320
+
321
+ function updateCell(id: Protocol.CellId, patch: CellEdit) {
322
+ requireCell(id);
323
+ next = editCell(confirmed, next, id, patch);
324
+ }
325
+
326
+ const editor: DocumentEditor = {
327
+ setCode: (id, code) => updateCell(id, { code }),
328
+ setName: (id, name) => updateCell(id, { name }),
329
+ updateConfig: (id, patch) =>
330
+ updateCell(id, { config: Protocol.CellConfig.partial().parse(patch) }),
331
+ createCell: (cell, placement = {}) => {
332
+ assertActive();
333
+ if (confirmed.cells.has(cell.id) || hasCell(cell.id)) {
334
+ throw new Error(`Cell ${cell.id} already exists`);
335
+ }
336
+ if (placement.after !== undefined && placement.before !== undefined) {
337
+ throw new Error("Specify either before or after for cell placement");
338
+ }
339
+ const anchor = placement.after ?? placement.before;
340
+ if (anchor !== undefined) {
341
+ requireCell(anchor);
342
+ }
343
+ next = createCell(next, cell, { ...placement });
344
+ },
345
+ deleteCell: (id) => {
346
+ requireCell(id);
347
+ next = deleteCell(next, id, sent);
348
+ },
349
+ setOrder: (order) => {
350
+ assertActive();
351
+ const { cells } = viewDocument(confirmed, next);
352
+ if (
353
+ order.length !== cells.size ||
354
+ new Set(order).size !== cells.size ||
355
+ order.some((id) => !cells.has(id))
356
+ ) {
357
+ throw new Error("Cell order must contain every cell exactly once");
358
+ }
359
+ next = setOrder(next, order);
360
+ },
361
+ };
362
+
363
+ try {
364
+ const result: unknown = edit(editor);
365
+ if (result instanceof Promise) {
366
+ // Observe a rejected async callback without publishing its partial draft.
367
+ result.catch(() => undefined);
368
+ throw new Error("Document edit callbacks must be synchronous");
369
+ }
370
+ return next;
371
+ } finally {
372
+ active = false;
373
+ }
374
+ }