@marimo-team/islands 0.25.3-dev23 → 0.25.3-dev231

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 (745) hide show
  1. package/dist/{ConnectedDataExplorerComponent-DfG3PRaJ.js → ConnectedDataExplorerComponent-BBihxHrr.js} +120 -116
  2. package/dist/{ErrorBoundary-h0Ea26dF.js → ErrorBoundary-BJSoVLSv.js} +16 -16
  3. package/dist/_baseSet-BfI5FjBM.js +328 -0
  4. package/dist/{abnfDiagram-VCTEODGH-B3w-XWX8.js → abnfDiagram-VCTEODGH-DBcJVxYP.js} +2 -2
  5. package/dist/any-language-editor-jGaR0EAo.js +75 -0
  6. package/dist/{architectureDiagram-5GKGNRK7-C18U9A6k.js → architectureDiagram-5GKGNRK7-BcHZXF4S.js} +1 -1
  7. package/dist/{arrays-CN1djC4k.js → arrays-DoQ-AILx.js} +15 -27
  8. package/dist/assets/__vite-browser-external-BKBpimif.js +1 -0
  9. package/dist/assets/worker-CgoMtD-_.js +113 -0
  10. package/dist/{blockDiagram-I7D4REHJ-Cg25UrxT.js → blockDiagram-I7D4REHJ-Dkhe6_PP.js} +1 -1
  11. package/dist/{button-CvjkwdSk.js → button-B6RjDKJx.js} +227 -217
  12. package/dist/{capabilities-CQ5IjhzL.js → capabilities-CkVzWJEX.js} +2 -2
  13. package/dist/{chat-ui-w8SVynkn.js → chat-ui-DljFsfWf.js} +1277 -1275
  14. package/dist/{check-BMKBBrdc.js → check-Z_vtI3OL.js} +1 -1
  15. package/dist/{chunk-IMKFNOWR-CrS5bzqW.js → chunk-IMKFNOWR-CTZlwBAA.js} +1 -1
  16. package/dist/{chunk-SHT3W25Y-StpvPvUG.js → chunk-SHT3W25Y-53g_RZHm.js} +1 -1
  17. package/dist/{chunk-SVP7TREG-CBXjbYZC.js → chunk-SVP7TREG-P6abNGV_.js} +1 -1
  18. package/dist/{chunk-TICWLB2K-Dp6bIb-q.js → chunk-TICWLB2K-BTJJqkyF.js} +1 -1
  19. package/dist/{chunk-YOKDWASO-DPZk8vhS.js → chunk-YOKDWASO-DKplTrBY.js} +20 -20
  20. package/dist/{classDiagram-ZZMXUADV-BFYuxV5g.js → classDiagram-ZZMXUADV-BUGqOrTm.js} +2 -2
  21. package/dist/{classDiagram-v2-VYDZK3BY-D_tjXVMl.js → classDiagram-v2-VYDZK3BY-CXpQvO-s.js} +2 -2
  22. package/dist/code-visibility-C29f__4k.js +134 -0
  23. package/dist/{common-DNPxRLm_.js → common-B6tzS_uB.js} +9837 -9658
  24. package/dist/config-DbjzjwxX.js +636 -0
  25. package/dist/{copy-icon-BgUO8jsi.js → copy-icon-CG57cxwb.js} +3 -3
  26. package/dist/createReducer-DePYJ0F3.js +63 -0
  27. package/dist/{cynefinDiagram-5FMLGOSQ-DSgYrHB2.js → cynefinDiagram-5FMLGOSQ-DOcnl8wW.js} +1 -1
  28. package/dist/{dagre-GXQ25YYZ-GYlruCBf.js → dagre-GXQ25YYZ-CuHR9QfG.js} +3 -3
  29. package/dist/{dagre-BGSfXNEb.js → dagre-mqiMAsFY.js} +531 -680
  30. package/dist/{data-grid-overlay-editor-B9QxYH-I.js → data-grid-overlay-editor-BsVL6sfo.js} +5 -5
  31. package/dist/{data-grid-types-BH_r7g7l.js → data-grid-types-0PJ-9N5n.js} +1 -1
  32. package/dist/{debounce-C3jyATpc.js → debounce-DrhhziJv.js} +2 -2
  33. package/dist/{diagram-S7CK7UJ4-DRu5LX5_.js → diagram-S7CK7UJ4-BPiG4kso.js} +1 -1
  34. package/dist/{diagram-UQ7AKVKN-DD7uiejP.js → diagram-UQ7AKVKN-_piBOvOC.js} +1 -1
  35. package/dist/{diagram-VX7I27RA-ByH9KAJJ.js → diagram-VX7I27RA-DCzVeJ8M.js} +1 -1
  36. package/dist/{diagram-Z3DM3KII-BsQHPRke.js → diagram-Z3DM3KII-D64CF1jQ.js} +1 -1
  37. package/dist/{dialog-Cc479ZEH.js → dialog-DsZ49mmU.js} +26 -26
  38. package/dist/{dist-Bvs24R_E.js → dist-11T5wq3_.js} +31 -30
  39. package/dist/{dist-F8Ep36rk.js → dist-17ugwGZc.js} +59 -58
  40. package/dist/{dist-BMQf5zIS.js → dist-7cRjf--y.js} +123 -122
  41. package/dist/{dist-diIx5qJW.js → dist-B8pkfkzc.js} +31 -30
  42. package/dist/{dist-CN_BeG2I.js → dist-B9UoM_wq.js} +58 -57
  43. package/dist/{dist-CLdpGQVr.js → dist-BGuMTs1i.js} +118 -117
  44. package/dist/{dist-BK4Oj99o.js → dist-BHW11fni.js} +18 -17
  45. package/dist/dist-BLY4m1Wi.js +850 -0
  46. package/dist/{dist-PXYI_yuP.js → dist-BNlcVoxs.js} +24 -23
  47. package/dist/{dist-D6d86eNJ.js → dist-BQYe5Bju.js} +47 -46
  48. package/dist/{dist-CkTTIdBe.js → dist-BX1mn8na.js} +337 -337
  49. package/dist/{dist-DiDibOYr.js → dist-Bh0PTKUW.js} +151 -150
  50. package/dist/{dist-CSJ0MDRw.js → dist-CKaXK92p.js} +56 -55
  51. package/dist/{dist-C8fAKSH1.js → dist-CLhwfhpJ.js} +53 -52
  52. package/dist/{dist-DoE4XJBC.js → dist-CYeqK4Xw.js} +9801 -10649
  53. package/dist/{dist-BLfKmR-l.js → dist-Cxlp3WH6.js} +16 -15
  54. package/dist/{dist-D-wwqlzJ.js → dist-DSJPGj42.js} +158 -157
  55. package/dist/{dist-BorMD-uX.js → dist-DU9ICsWZ.js} +75 -74
  56. package/dist/{dist-DBtSl3sf.js → dist-DWv0ALBi.js} +47 -46
  57. package/dist/{dist-OR1OnN-y.js → dist-DiBpWEsB.js} +31 -30
  58. package/dist/{dist-CrSP_H1M.js → dist-DiLFTlnl.js} +242 -242
  59. package/dist/{dist-DpBpA_n1.js → dist-Lm-D-Vr6.js} +3 -3
  60. package/dist/{dist-CSbh1PNP.js → dist-cVDV5IuI.js} +23 -22
  61. package/dist/{dist-BuaRHxOc.js → dist-fRfaOoq8.js} +44 -43
  62. package/dist/{dist-Cg7gzw-a.js → dist-gTTI-9Px.js} +78 -77
  63. package/dist/dropdown-menu-BRiE7Vnp.js +6083 -0
  64. package/dist/{ebnfDiagram-PWID7BFC-CQRK5_eT.js → ebnfDiagram-PWID7BFC-BapQPML-.js} +2 -2
  65. package/dist/{erDiagram-RLTQ6QDP-BKtWrDVh.js → erDiagram-RLTQ6QDP-CNQvC2_Q.js} +1 -1
  66. package/dist/{error-banner-CFPHFw4h.js → error-banner-IsonnvA0.js} +84 -83
  67. package/dist/error-entries-CRPfxMqm.js +2505 -0
  68. package/dist/{esm-D2gTsXEV.js → esm-BgKjMvWw.js} +530 -529
  69. package/dist/{esm-AMFssoNp.js → esm-CHjVSexr.js} +328 -329
  70. package/dist/feedback-button-X2gMVUoS.js +374 -0
  71. package/dist/{flowDiagram-HODETNUW-1IN-ih2E.js → flowDiagram-HODETNUW-BBt6S6oe.js} +2 -2
  72. package/dist/{formats-X4mMQWzX.js → formats-BK4VefeF.js} +6 -6
  73. package/dist/{ganttDiagram-EL5Y4UJY-BQT16JSc.js → ganttDiagram-EL5Y4UJY-Dh_4cBJZ.js} +2 -2
  74. package/dist/{glide-data-editor-BIYjd9hQ.js → glide-data-editor-D3OoHtUh.js} +417 -415
  75. package/dist/{glide-utils-DM9zBO4W.js → glide-utils-CQddGpa-.js} +16 -16
  76. package/dist/{globals-BX22lYk2.js → globals-DVh9Owsi.js} +3 -3
  77. package/dist/{graphlib-BmY_CCV9.js → graphlib-nlwT3Wvy.js} +177 -220
  78. package/dist/hasIn-C20JsQ2m.js +28 -0
  79. package/dist/{highlighted-body-KPVGNVTW-zwjq21tf.js → highlighted-body-KPVGNVTW-3Ziwfz-V.js} +2 -2
  80. package/dist/{error-entries-Damuuclv.js → html-to-image-0FooaKop.js} +26911 -26769
  81. package/dist/{infoDiagram-27XIBGKW-CkB-zr4p.js → infoDiagram-27XIBGKW-Hd8Ifz82.js} +1 -1
  82. package/dist/isArrayLikeObject-B-HXCsex.js +626 -0
  83. package/dist/isEmpty-CdX7MTE1.js +14 -0
  84. package/dist/{ishikawaDiagram-5VMMS53U-wlyLjBmM.js → ishikawaDiagram-5VMMS53U-CP7hnHWx.js} +1 -1
  85. package/dist/{kanban-definition-UXKFOSKX-C2usY0i-.js → kanban-definition-UXKFOSKX-CX91sa9b.js} +1 -1
  86. package/dist/{linear-Cnaq3Tfb.js → linear-DWERh7eI.js} +121 -73
  87. package/dist/{loader-BQOfjTIJ.js → loader-BisjOLiW.js} +12 -12
  88. package/dist/main.js +10257 -8124
  89. package/dist/{mermaid-BA-Z6wGL.js → mermaid-Djb3Ni9t.js} +54 -54
  90. package/dist/mermaid-HWGCJPDP-Du3-HPQA.js +2 -0
  91. package/dist/{mindmap-definition-YA3MSWOX-nKOWS8RR.js → mindmap-definition-YA3MSWOX-DgCNo07O.js} +1 -1
  92. package/dist/{now-jM8-M7IR.js → now-BKZCLE5P.js} +12 -13
  93. package/dist/{number-overlay-editor-DK-HbLsV.js → number-overlay-editor-CEMlW8ug.js} +3 -3
  94. package/dist/{dist-CN8zI-XC.js → objectWithoutPropertiesLoose-ai5NUqGa.js} +262 -240
  95. package/dist/{objects-CzUgoMIF.js → objects-DCmMvZtn.js} +1 -3
  96. package/dist/{once-BtE-wKRL.js → once-NnpX_HnX.js} +1 -1
  97. package/dist/{pegDiagram-XKGWAZYB-Dac9EIKD.js → pegDiagram-XKGWAZYB-SGJhnIKo.js} +2 -2
  98. package/dist/pick-tCszMUbm.js +35 -0
  99. package/dist/{pieDiagram-E7YTZNPT-B7S-DsW_.js → pieDiagram-E7YTZNPT-1stXIWCQ.js} +1 -1
  100. package/dist/precisionRound-DhAzeRcm.js +49 -0
  101. package/dist/{process-output-CTPTtxXB.js → process-output-BOvkTEDt.js} +4 -4
  102. package/dist/{quadrantDiagram-AXDQQJYC-Ccw0xMjN.js → quadrantDiagram-AXDQQJYC-Blrm7V7_.js} +1 -1
  103. package/dist/{railroadDiagram-O6MQD6OU-Cfa5Q-hr.js → railroadDiagram-O6MQD6OU-DY1mojzB.js} +2 -2
  104. package/dist/{react-vega-BED0DjiB.js → react-vega-C4T9Rb_w.js} +12284 -12270
  105. package/dist/{requirementDiagram-BXWQKSXE-d8zXCJIk.js → requirementDiagram-BXWQKSXE-gHzhUp0D.js} +1 -1
  106. package/dist/{reveal-component-Dl9ZugRb.js → reveal-component-BeUSmTRU.js} +426 -403
  107. package/dist/schemas-CdscWNy_.js +4747 -0
  108. package/dist/select-BSxlITBo.js +1200 -0
  109. package/dist/{sequenceDiagram-WJ2MYXX4-b6pei3lJ.js → sequenceDiagram-WJ2MYXX4-rjPtD9fB.js} +1 -1
  110. package/dist/{spec-BJzgmvVa.js → spec-Dq8RNplp.js} +41 -11
  111. package/dist/{stateDiagram-D77RDMKH-Be-xSpaZ.js → stateDiagram-D77RDMKH-DMNxjUxV.js} +4 -4
  112. package/dist/{stateDiagram-v2-MP3YSRHH-5Y-FxesJ.js → stateDiagram-v2-MP3YSRHH-CumAaqGo.js} +2 -2
  113. package/dist/static-state-BldGd99T.js +72 -0
  114. package/dist/strings-BGW-fXVJ.js +507 -0
  115. package/dist/style.css +1 -1
  116. package/dist/{swimlanes-42K2YHIH-nRRl4NU0.js → swimlanes-42K2YHIH-BU14_Tej.js} +1 -1
  117. package/dist/{swimlanesDiagram-VR7AAH4N-BS79510V.js → swimlanesDiagram-VR7AAH4N-CieAnPqJ.js} +2 -2
  118. package/dist/{swiper-component-DKntyn8p.js → swiper-component-Dir1o8ml.js} +2 -2
  119. package/dist/{time-BieKwdYS.js → time-BaMbJs4z.js} +18 -18
  120. package/dist/{timeline-definition-24CTP7MA-Cfzf8WPf.js → timeline-definition-24CTP7MA-CrVj4E1K.js} +1 -1
  121. package/dist/toast-BWIPi3aF.js +491 -0
  122. package/dist/{tooltip-CtBZ5q8p.js → tooltip-C3UnvsRe.js} +329 -305
  123. package/dist/use-restore-focus-BWO0z1lo.js +1672 -0
  124. package/dist/{useAsyncData-BD534XmW.js → useAsyncData-DsZMvNXn.js} +15 -14
  125. package/dist/{useDateFormatter-DkajGwwd.js → useDateFormatter-ChB4eyim.js} +2 -2
  126. package/dist/{useDeepCompareMemoize-C72_RNsu.js → useDeepCompareMemoize-KMBBux8C.js} +1 -1
  127. package/dist/{useIframeCapabilities-DBETvvPl.js → useIframeCapabilities-cMNQ80CK.js} +1 -1
  128. package/dist/useLifecycle-BquH9ET-.js +112 -0
  129. package/dist/useTheme-DgOLVISn.js +337 -0
  130. package/dist/utils-DXkj82sK.js +813 -0
  131. package/dist/{vega-component-DfcYgj-Y.js → vega-component-Bwg_Kuh-.js} +171 -170
  132. package/dist/{vega-embed-container-BNHE18G9.js → vega-embed-container--LYZqguO.js} +2 -2
  133. package/dist/{vega-loader.browser-DNST6uVf.js → vega-loader.browser-B9Pz0EGP.js} +298 -507
  134. package/dist/{vennDiagram-4TSXK5OY-CeY6Z1xZ.js → vennDiagram-4TSXK5OY-ZLxQ8yhm.js} +1 -1
  135. package/dist/{wardleyDiagram-VM6X3IG4-Cxs9NtVi.js → wardleyDiagram-VM6X3IG4-D88pcLY1.js} +1 -1
  136. package/dist/{xychartDiagram-S5SC5T6Z-DNWbvPK7.js → xychartDiagram-S5SC5T6Z-_13d4g8g.js} +2 -2
  137. package/package.json +16 -20
  138. package/src/__mocks__/document.tsx +63 -0
  139. package/src/__mocks__/notebook.ts +3 -4
  140. package/src/__mocks__/partial.ts +26 -0
  141. package/src/__mocks__/requests.ts +1 -4
  142. package/src/__tests__/main.test.tsx +24 -1
  143. package/src/__tests__/module-entry.test.ts +44 -0
  144. package/src/__tests__/mount.test.ts +1 -21
  145. package/src/__tests__/{host-imports.test.ts → replica-imports.test.ts} +12 -11
  146. package/src/components/ai/__tests__/ai-model-dropdown.test.tsx +63 -0
  147. package/src/components/ai/ai-model-dropdown.tsx +11 -6
  148. package/src/components/app-config/ai-config.tsx +155 -149
  149. package/src/components/app-config/app-config-button.tsx +6 -5
  150. package/src/components/app-config/app-config-form.tsx +5 -9
  151. package/src/components/app-config/common.tsx +7 -9
  152. package/src/components/app-config/data-form.tsx +112 -113
  153. package/src/components/app-config/mcp-config.tsx +30 -53
  154. package/src/components/app-config/user-config-form.css +91 -0
  155. package/src/components/app-config/user-config-form.tsx +266 -349
  156. package/src/components/chat/__tests__/message-queue.test.tsx +17 -0
  157. package/src/components/chat/__tests__/notebook-access-selector.test.tsx +64 -0
  158. package/src/components/chat/acp/__tests__/session-tabs.test.tsx +43 -0
  159. package/src/components/chat/acp/__tests__/state.test.ts +2 -2
  160. package/src/components/chat/acp/blocks.tsx +3 -2
  161. package/src/components/chat/acp/session-tabs.tsx +8 -3
  162. package/src/components/chat/capabilities-popover.tsx +1 -5
  163. package/src/components/chat/chat-components.tsx +2 -0
  164. package/src/components/chat/chat-panel.tsx +23 -104
  165. package/src/components/chat/chat-utils.ts +4 -8
  166. package/src/components/chat/notebook-access-selector.stories.tsx +22 -0
  167. package/src/components/chat/notebook-access-selector.tsx +100 -0
  168. package/src/components/data-table/TableBottomBar.tsx +4 -1
  169. package/src/components/data-table/TableTopBar.tsx +2 -0
  170. package/src/components/data-table/__tests__/chart-spec-model.test.ts +195 -195
  171. package/src/components/data-table/__tests__/column-explorer.test.tsx +27 -1
  172. package/src/components/data-table/__tests__/columns.test.tsx +105 -0
  173. package/src/components/data-table/__tests__/context-menu-interaction.test.tsx +130 -0
  174. package/src/components/data-table/__tests__/data-table.test.tsx +1 -0
  175. package/src/components/data-table/__tests__/date-popover.test.tsx +72 -0
  176. package/src/components/data-table/__tests__/export-actions.test.tsx +105 -0
  177. package/src/components/data-table/__tests__/keyboard-selection.test.tsx +188 -0
  178. package/src/components/data-table/__tests__/pagination.test.tsx +28 -1
  179. package/src/components/data-table/__tests__/search-highlight.test.tsx +109 -0
  180. package/src/components/data-table/__tests__/url-detector.test.tsx +74 -0
  181. package/src/components/data-table/cell-selection/feature.ts +2 -2
  182. package/src/components/data-table/cell-selection/types.ts +2 -2
  183. package/src/components/data-table/charts/__tests__/chart-panel.test.tsx +74 -1
  184. package/src/components/data-table/charts/__tests__/spec-snapshot.test.ts +20 -20
  185. package/src/components/data-table/charts/__tests__/spec.test.ts +78 -52
  186. package/src/components/data-table/charts/__tests__/storage.test.ts +4 -1
  187. package/src/components/data-table/charts/chart-spec/spec.ts +68 -43
  188. package/src/components/data-table/charts/charts.tsx +40 -30
  189. package/src/components/data-table/charts/storage.ts +16 -5
  190. package/src/components/data-table/column-explorer-panel/column-explorer.tsx +1 -1
  191. package/src/components/data-table/column-summary/chart-spec-model.tsx +23 -16
  192. package/src/components/data-table/column-summary/column-summary.tsx +2 -4
  193. package/src/components/data-table/column-visibility-dropdown.tsx +8 -13
  194. package/src/components/data-table/columns.tsx +45 -46
  195. package/src/components/data-table/context-menu.tsx +36 -20
  196. package/src/components/data-table/data-table.tsx +17 -1
  197. package/src/components/data-table/date-popover.tsx +6 -4
  198. package/src/components/data-table/export-actions.tsx +76 -48
  199. package/src/components/data-table/pagination.tsx +44 -33
  200. package/src/components/data-table/range-focus/atoms.ts +4 -6
  201. package/src/components/data-table/range-focus/use-cell-range-selection.ts +65 -38
  202. package/src/components/data-table/range-focus/use-scroll-into-view.ts +21 -2
  203. package/src/components/data-table/renderers.tsx +16 -7
  204. package/src/components/data-table/row-viewer-panel/__tests__/row-viewer.test.tsx +24 -1
  205. package/src/components/data-table/row-viewer-panel/row-viewer.tsx +4 -4
  206. package/src/components/data-table/search-highlight.tsx +79 -0
  207. package/src/components/data-table/types.ts +1 -0
  208. package/src/components/data-table/url-detector.tsx +49 -9
  209. package/src/components/datasources/__tests__/column-actions.test.tsx +97 -0
  210. package/src/components/datasources/__tests__/column-preview.test.tsx +96 -5
  211. package/src/components/datasources/__tests__/datasources-interactions.test.tsx +181 -0
  212. package/src/components/datasources/__tests__/table-list.test.tsx +118 -0
  213. package/src/components/datasources/__tests__/utils.test.ts +57 -6
  214. package/src/components/datasources/column-preview.tsx +17 -12
  215. package/src/components/datasources/datasources.tsx +56 -43
  216. package/src/components/datasources/utils.ts +32 -23
  217. package/src/components/debugger/debugger-code.tsx +5 -0
  218. package/src/components/dependency-graph/custom-node.tsx +1 -1
  219. package/src/components/dependency-graph/dependency-graph-tree.tsx +8 -8
  220. package/src/components/dependency-graph/elements.ts +24 -21
  221. package/src/components/dependency-graph/minimap-content.tsx +13 -19
  222. package/src/components/dependency-graph/panels.tsx +4 -2
  223. package/src/components/dependency-graph/utils/__tests__/layout.test.ts +18 -11
  224. package/src/components/editor/SortableCell.tsx +1 -3
  225. package/src/components/editor/__tests__/Output.test.tsx +50 -32
  226. package/src/{core/attachments/__tests__/toast.test.tsx → components/editor/__tests__/agent-toast.test.tsx} +1 -1
  227. package/src/components/editor/__tests__/data-attributes.test.tsx +28 -14
  228. package/src/components/editor/__tests__/dynamic-favicon.test.tsx +111 -18
  229. package/src/components/editor/__tests__/output-persistence.test.tsx +6 -2
  230. package/src/components/editor/__tests__/package-alert.test.tsx +22 -1
  231. package/src/components/editor/actions/__tests__/name-cell-input.test.tsx +69 -0
  232. package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +40 -10
  233. package/src/components/editor/actions/__tests__/pair-with-agent.test.tsx +6 -10
  234. package/src/components/editor/actions/__tests__/useCellActionButton.test.tsx +113 -0
  235. package/src/components/editor/actions/name-cell-input.tsx +4 -3
  236. package/src/components/editor/actions/pair-with-agent-commands.ts +2 -2
  237. package/src/components/editor/actions/pair-with-agent-modal.tsx +24 -21
  238. package/src/components/editor/actions/pair-with-agent.tsx +15 -10
  239. package/src/components/editor/actions/useCellActionButton.tsx +36 -31
  240. package/src/components/editor/actions/useConfigActions.tsx +3 -4
  241. package/src/components/editor/actions/useNotebookActions.tsx +19 -23
  242. package/src/components/editor/actions/useRestartKernel.tsx +1 -1
  243. package/src/components/editor/actions/useSetCodeVisibility.ts +11 -12
  244. package/src/components/editor/actions/useSetOutputsExpanded.ts +14 -19
  245. package/src/components/editor/ai/add-cell-with-ai.tsx +3 -3
  246. package/src/components/editor/ai/ai-completion-editor.tsx +1 -0
  247. package/src/components/editor/alerts/__tests__/connection-notice.test.tsx +1 -1
  248. package/src/components/editor/alerts/connection-notice.tsx +1 -1
  249. package/src/components/editor/alerts/startup-logs-alert.tsx +1 -0
  250. package/src/components/editor/alerts/stdin-blocking-alert.tsx +1 -1
  251. package/src/components/editor/app-container.tsx +1 -1
  252. package/src/components/editor/boundary/__tests__/ErrorBoundary.test.tsx +1 -1
  253. package/src/components/editor/cell/CreateCellButton.tsx +15 -21
  254. package/src/components/editor/cell/DeleteButton.tsx +3 -2
  255. package/src/components/editor/cell/RunButton.tsx +2 -2
  256. package/src/components/editor/cell/StagedAICell.tsx +10 -2
  257. package/src/components/editor/cell/StopButton.tsx +2 -2
  258. package/src/components/editor/cell/__tests__/StagedAICell.test.tsx +4 -2
  259. package/src/components/editor/cell/__tests__/useShouldShowInterrupt.test.ts +39 -0
  260. package/src/components/editor/cell/cell-actions.tsx +12 -1
  261. package/src/components/editor/cell/code/__tests__/language-toggle.test.tsx +54 -0
  262. package/src/components/editor/cell/code/cell-editor.tsx +46 -165
  263. package/src/components/editor/cell/code/language-toggle.tsx +8 -7
  264. package/src/components/editor/cell/collapse.tsx +11 -4
  265. package/src/components/editor/cell/useAddCell.ts +4 -8
  266. package/src/components/editor/cell/useDeleteCell.tsx +10 -36
  267. package/src/components/editor/cell/useRunCells.ts +2 -5
  268. package/src/components/editor/cell/useShouldShowInterrupt.ts +2 -12
  269. package/src/components/editor/cell/useSplitCell.tsx +10 -6
  270. package/src/components/editor/chrome/components/__tests__/feedback-button.test.tsx +1 -1
  271. package/src/components/editor/chrome/components/feedback-button.tsx +2 -8
  272. package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +31 -2
  273. package/src/components/editor/chrome/panels/__tests__/runtime-details.test.tsx +1 -1
  274. package/src/components/editor/chrome/panels/__tests__/sandbox-recovery.test.tsx +1 -1
  275. package/src/components/editor/chrome/panels/cache-panel.tsx +1 -0
  276. package/src/components/editor/chrome/panels/dependency-graph-panel.tsx +1 -1
  277. package/src/components/editor/chrome/panels/logs-panel.tsx +2 -1
  278. package/src/components/editor/chrome/panels/outline/__tests__/outline-keyboard.test.tsx +84 -0
  279. package/src/components/editor/chrome/panels/outline/floating-outline.tsx +39 -14
  280. package/src/components/editor/chrome/panels/outline/useActiveOutline.tsx +3 -2
  281. package/src/components/editor/chrome/panels/packages-panel.tsx +4 -7
  282. package/src/components/editor/chrome/panels/secrets-panel.tsx +1 -0
  283. package/src/components/editor/chrome/panels/session-panel.tsx +1 -1
  284. package/src/components/editor/chrome/panels/snippets-panel.tsx +10 -12
  285. package/src/components/editor/chrome/panels/variable-panel.tsx +1 -5
  286. package/src/components/editor/chrome/wrapper/__tests__/attachment-status.test.tsx +6 -9
  287. package/src/components/editor/chrome/wrapper/__tests__/document-sync-status.test.tsx +92 -0
  288. package/src/components/editor/chrome/wrapper/__tests__/pending-ai-cells.test.tsx +62 -3
  289. package/src/components/editor/chrome/wrapper/footer-items/attachment-status.tsx +4 -4
  290. package/src/components/editor/chrome/wrapper/footer-items/backend-status.tsx +1 -1
  291. package/src/components/editor/chrome/wrapper/footer-items/document-sync-status.tsx +54 -0
  292. package/src/components/editor/chrome/wrapper/footer-items/lsp-status.tsx +1 -1
  293. package/src/components/editor/chrome/wrapper/footer-items/machine-stats.tsx +1 -1
  294. package/src/components/editor/chrome/wrapper/footer-items/runtime-settings.tsx +1 -7
  295. package/src/components/editor/chrome/wrapper/footer.tsx +2 -2
  296. package/src/components/editor/chrome/wrapper/minimap-state.ts +1 -1
  297. package/src/components/editor/chrome/wrapper/pending-ai-cells.tsx +12 -2
  298. package/src/components/editor/chrome/wrapper/storage.ts +1 -1
  299. package/src/components/editor/columns/__tests__/cell-column.test.tsx +1 -1
  300. package/src/components/editor/columns/cell-column.tsx +1 -1
  301. package/src/components/editor/columns/sortable-column.tsx +2 -2
  302. package/src/components/editor/connections/components.tsx +5 -10
  303. package/src/components/editor/controls/Controls.tsx +4 -4
  304. package/src/components/editor/controls/__tests__/command-palette.test.tsx +53 -0
  305. package/src/components/editor/controls/__tests__/keyboard-shortcuts.test.tsx +61 -0
  306. package/src/components/editor/controls/__tests__/notebook-menu-dropdown.test.tsx +10 -4
  307. package/src/components/editor/controls/command-palette.tsx +22 -10
  308. package/src/components/editor/controls/keyboard-shortcuts.tsx +14 -5
  309. package/src/components/editor/documentation.css +34 -11
  310. package/src/components/editor/dynamic-favicon.tsx +21 -40
  311. package/src/components/editor/errors/__tests__/send-error-report-button.test.tsx +25 -20
  312. package/src/components/editor/errors/auto-fix.tsx +4 -8
  313. package/src/components/editor/errors/send-error-report-button.tsx +3 -6
  314. package/src/components/editor/file-tree/__tests__/file-explorer-interactions.test.tsx +6 -0
  315. package/src/components/editor/file-tree/__tests__/file-explorer-navigation.test.tsx +47 -0
  316. package/src/components/editor/file-tree/__tests__/use-file-search.test.tsx +91 -0
  317. package/src/components/editor/file-tree/file-explorer.tsx +48 -15
  318. package/src/components/editor/file-tree/file-name-input.tsx +1 -0
  319. package/src/components/editor/file-tree/file-viewer.tsx +4 -2
  320. package/src/components/editor/file-tree/use-file-search.ts +35 -21
  321. package/src/components/editor/header/__tests__/filename-form.test.tsx +1 -4
  322. package/src/components/editor/header/__tests__/status.test.tsx +5 -3
  323. package/src/components/editor/header/app-header.tsx +1 -1
  324. package/src/components/editor/header/filename-form.tsx +1 -1
  325. package/src/components/editor/header/status.tsx +40 -20
  326. package/src/components/editor/links/__tests__/cell-link.test.tsx +148 -0
  327. package/src/components/editor/links/cell-link-list.tsx +1 -1
  328. package/src/components/editor/links/cell-link.tsx +17 -7
  329. package/src/components/editor/navigation/__tests__/clipboard.test.ts +60 -38
  330. package/src/components/editor/navigation/__tests__/navigation.test.ts +108 -85
  331. package/src/components/editor/navigation/__tests__/selection.test.ts +43 -21
  332. package/src/components/editor/navigation/clipboard.ts +17 -14
  333. package/src/components/editor/navigation/focus-utils.ts +23 -4
  334. package/src/components/editor/navigation/multi-cell-action-toolbar.tsx +17 -33
  335. package/src/components/editor/navigation/navigation.ts +71 -70
  336. package/src/components/editor/navigation/selection.ts +30 -29
  337. package/src/components/editor/notebook-banner.tsx +1 -0
  338. package/src/components/editor/notebook-cell.tsx +29 -32
  339. package/src/components/editor/output/MarimoErrorOutput.tsx +2 -1
  340. package/src/components/editor/output/MarimoTracebackOutput.tsx +19 -17
  341. package/src/components/editor/output/Outputs.css +8 -0
  342. package/src/components/editor/output/__tests__/traceback.test.tsx +27 -1
  343. package/src/components/editor/output/ansi-reduce.ts +33 -20
  344. package/src/components/editor/output/console/ConsoleOutput.tsx +19 -25
  345. package/src/components/editor/output/console/__tests__/ConsoleOutput.test.tsx +125 -69
  346. package/src/components/editor/package-alert.tsx +14 -7
  347. package/src/components/editor/renderers/cell-array.tsx +22 -33
  348. package/src/components/editor/renderers/grid-layout/grid-layout.tsx +12 -6
  349. package/src/components/editor/renderers/slides-layout/__tests__/plugin.test.ts +0 -1
  350. package/src/components/editor/renderers/slides-layout/slides-layout.tsx +1 -1
  351. package/src/components/editor/renderers/vertical-layout/__tests__/useFocusFirstEditor.test.ts +4 -4
  352. package/src/components/editor/renderers/vertical-layout/sidebar/toggle.tsx +7 -1
  353. package/src/components/editor/renderers/vertical-layout/useFocusFirstEditor.ts +1 -1
  354. package/src/components/editor/renderers/vertical-layout/vertical-layout.tsx +1 -1
  355. package/src/components/editor/stdin-blocking-alert.tsx +1 -1
  356. package/src/components/home/components.tsx +17 -31
  357. package/src/components/icons/__tests__/large-spinner.test.tsx +39 -0
  358. package/src/components/icons/large-spinner.tsx +3 -14
  359. package/src/components/icons/spinner.tsx +1 -1
  360. package/src/components/markdown/markdown-renderer.tsx +4 -8
  361. package/src/components/mcp/mcp-status-indicator.tsx +1 -1
  362. package/src/components/pages/__tests__/home-page.test.tsx +116 -0
  363. package/src/components/pages/edit-page.tsx +19 -17
  364. package/src/components/pages/home-page.tsx +164 -91
  365. package/src/components/scratchpad/scratchpad.test.tsx +89 -0
  366. package/src/components/scratchpad/scratchpad.tsx +43 -32
  367. package/src/components/scratchpad/state.ts +7 -0
  368. package/src/components/slides/__tests__/minimap-actions.test.tsx +22 -29
  369. package/src/components/slides/__tests__/minimap.test.ts +38 -19
  370. package/src/components/slides/__tests__/slide-scroll-hint.test.tsx +37 -0
  371. package/src/components/slides/minimap.tsx +17 -12
  372. package/src/components/slides/reveal-component.tsx +58 -26
  373. package/src/components/slides/reveal-slides.css +5 -4
  374. package/src/components/slides/slide-cell-view.tsx +4 -5
  375. package/src/components/slides/slide-form.tsx +1 -0
  376. package/src/components/slides/slide-scroll-hint.tsx +3 -1
  377. package/src/components/sort/SortableCellsProvider.tsx +8 -25
  378. package/src/components/tracing/tracing-keyboard.test.tsx +85 -0
  379. package/src/components/tracing/tracing.tsx +46 -42
  380. package/src/components/ui/__tests__/draggable-popover.test.tsx +24 -0
  381. package/src/components/ui/__tests__/range-slider.test.tsx +165 -0
  382. package/src/components/ui/alert-dialog.tsx +1 -1
  383. package/src/components/ui/draggable-popover.tsx +24 -2
  384. package/src/components/ui/range-slider.tsx +22 -9
  385. package/src/core/MarimoApp.tsx +1 -1
  386. package/src/core/ai/__tests__/staged-cells.test.ts +32 -33
  387. package/src/core/ai/context/providers/__tests__/cell-output.test.ts +8 -12
  388. package/src/core/ai/context/providers/cell-output.ts +2 -2
  389. package/src/core/ai/context/providers/datasource.ts +6 -2
  390. package/src/core/ai/staged-cells.ts +18 -19
  391. package/src/core/ai/tools/__tests__/edit-notebook-tool.test.ts +40 -88
  392. package/src/core/ai/tools/__tests__/registry.test.ts +17 -0
  393. package/src/core/ai/tools/base.ts +18 -15
  394. package/src/core/ai/tools/edit-notebook-tool.ts +86 -80
  395. package/src/core/ai/tools/registry.ts +13 -10
  396. package/src/core/ai/tools/sample-tool.ts +6 -7
  397. package/src/core/cells/__tests__/__snapshots__/cells.test.ts.snap +4 -37
  398. package/src/core/cells/__tests__/actions.test.ts +624 -35
  399. package/src/core/cells/__tests__/add-missing-import.test.ts +7 -8
  400. package/src/core/cells/__tests__/arrange.test.ts +432 -0
  401. package/src/core/cells/__tests__/cell.test.ts +39 -0
  402. package/src/core/cells/__tests__/cells.test.ts +251 -2540
  403. package/src/core/cells/__tests__/collapseConsoleOutputs.test.ts +54 -0
  404. package/src/core/cells/__tests__/document.test.ts +164 -0
  405. package/src/core/cells/__tests__/editor.test.ts +57 -0
  406. package/src/core/cells/__tests__/flush-document.test.ts +40 -0
  407. package/src/core/cells/__tests__/harness.ts +106 -0
  408. package/src/core/cells/__tests__/layout.test.ts +177 -0
  409. package/src/core/cells/__tests__/notebook-outline.test.ts +122 -0
  410. package/src/core/cells/__tests__/outputs.test.tsx +71 -53
  411. package/src/core/cells/__tests__/session.test.ts +445 -211
  412. package/src/core/cells/__tests__/utils.test.ts +9 -108
  413. package/src/core/cells/actions.ts +675 -6
  414. package/src/core/cells/add-missing-import.ts +47 -43
  415. package/src/core/cells/arrange.ts +529 -0
  416. package/src/core/cells/cell.ts +14 -3
  417. package/src/core/cells/cells.ts +126 -1363
  418. package/src/core/cells/columns.ts +38 -0
  419. package/src/core/cells/document.ts +178 -0
  420. package/src/core/cells/edit.ts +30 -0
  421. package/src/core/cells/editor.ts +82 -0
  422. package/src/core/cells/layout.ts +221 -0
  423. package/src/core/cells/outputs.ts +12 -28
  424. package/src/core/cells/pending-delete-service.ts +3 -7
  425. package/src/core/cells/session.ts +76 -53
  426. package/src/core/cells/types.ts +22 -6
  427. package/src/core/cells/utils.ts +10 -8
  428. package/src/core/codemirror/__tests__/format.test.ts +0 -34
  429. package/src/core/codemirror/__tests__/setup.test.ts +29 -29
  430. package/src/core/codemirror/ai/__tests__/resources.test.ts +117 -0
  431. package/src/core/codemirror/ai/resources.ts +1 -1
  432. package/src/core/codemirror/cells/__tests__/extensions.test.ts +2 -6
  433. package/src/core/codemirror/cells/extensions.ts +30 -28
  434. package/src/core/codemirror/cells/state.ts +1 -6
  435. package/src/core/codemirror/copilot/__tests__/getCodes.test.ts +6 -7
  436. package/src/core/codemirror/copilot/getCodes.ts +2 -2
  437. package/src/core/codemirror/format.ts +6 -23
  438. package/src/core/codemirror/keymaps/vim.ts +4 -8
  439. package/src/core/codemirror/language/__tests__/sql.test.ts +22 -20
  440. package/src/core/codemirror/language/__tests__/utils.test.ts +187 -15
  441. package/src/core/codemirror/language/cell-code.ts +114 -0
  442. package/src/core/codemirror/language/extension.ts +52 -35
  443. package/src/core/codemirror/language/languages/markdown.ts +8 -6
  444. package/src/core/codemirror/language/languages/python.ts +16 -10
  445. package/src/core/codemirror/language/languages/sql/sql.ts +16 -24
  446. package/src/core/codemirror/language/panel/panel.tsx +1 -0
  447. package/src/core/codemirror/language/types.ts +7 -7
  448. package/src/core/codemirror/language/utils.ts +9 -39
  449. package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +1 -2
  450. package/src/core/codemirror/lsp/notebook-lsp.ts +6 -5
  451. package/src/core/codemirror/lsp/utils.ts +1 -1
  452. package/src/core/codemirror/misc/__tests__/paste.test.ts +3 -1
  453. package/src/core/codemirror/misc/paste.ts +1 -1
  454. package/src/core/codemirror/readonly/__tests__/extension.test.ts +1 -1
  455. package/src/core/codemirror/readonly/extension.ts +2 -2
  456. package/src/core/codemirror/utils.ts +1 -0
  457. package/src/core/config/__tests__/app-config.test.ts +64 -0
  458. package/src/core/config/__tests__/config-schema.test.ts +56 -6
  459. package/src/core/config/config-schema.ts +17 -4
  460. package/src/core/config/config.ts +65 -20
  461. package/src/core/config/feature-flag.tsx +0 -2
  462. package/src/core/datasets/__tests__/data-source-discovery.test.ts +5 -5
  463. package/src/core/datasets/data-source-discovery.ts +4 -6
  464. package/src/core/documentation/doc-lookup.ts +1 -1
  465. package/src/core/edit-app.tsx +21 -28
  466. package/src/core/errors/error-entries.ts +4 -1
  467. package/src/core/export/hooks.ts +1 -1
  468. package/src/core/export/layout.ts +2 -2
  469. package/src/core/hotkeys/actions.ts +2 -4
  470. package/src/core/islands/__tests__/bootstrap.test.ts +69 -17
  471. package/src/core/islands/__tests__/bridge.test.ts +85 -27
  472. package/src/core/islands/bootstrap.ts +46 -53
  473. package/src/core/islands/bridge.ts +84 -25
  474. package/src/core/islands/components/__tests__/IslandControls.test.tsx +7 -5
  475. package/src/core/islands/components/web-components.tsx +1 -1
  476. package/src/core/islands/worker/__tests__/controller.test.ts +62 -4
  477. package/src/core/islands/worker/controller.ts +4 -10
  478. package/src/core/islands/worker/worker.tsx +33 -33
  479. package/src/core/kernel/__tests__/RuntimeState.test.ts +1 -1
  480. package/src/core/kernel/__tests__/handlers.test.ts +7 -153
  481. package/src/core/kernel/handlers.ts +19 -72
  482. package/src/core/meta/__tests__/code-visibility.test.tsx +78 -70
  483. package/src/core/meta/code-visibility.ts +18 -9
  484. package/src/core/network/__tests__/connection.test.ts +1 -1
  485. package/src/core/network/__tests__/requests-lazy.test.ts +1 -3
  486. package/src/core/network/connection-notice.ts +1 -1
  487. package/src/core/network/connection.ts +1 -1
  488. package/src/core/network/requests-lazy.ts +2 -5
  489. package/src/core/network/requests-network.ts +5 -31
  490. package/src/core/network/requests-static.ts +1 -4
  491. package/src/core/network/requests-toasting.tsx +1 -4
  492. package/src/core/network/types.ts +6 -14
  493. package/src/core/network/useConnectionNotice.ts +8 -2
  494. package/src/core/notebook/__tests__/operations.test.ts +51 -0
  495. package/src/core/notebook/attachments.ts +38 -0
  496. package/src/core/notebook/document/__tests__/codemirror.test.ts +758 -0
  497. package/src/core/notebook/document/__tests__/draft.test.ts +363 -0
  498. package/src/core/notebook/document/__tests__/fixtures.ts +92 -0
  499. package/src/core/notebook/document/__tests__/hooks.test.tsx +391 -0
  500. package/src/core/notebook/document/__tests__/lifecycle-scenarios.test.ts +61 -0
  501. package/src/core/notebook/document/__tests__/model.test.ts +247 -0
  502. package/src/core/notebook/document/__tests__/protocol-fixtures.ts +38 -0
  503. package/src/core/notebook/document/__tests__/recovery-scenarios.test.ts +230 -0
  504. package/src/core/notebook/document/__tests__/scenario-fixture.ts +43 -0
  505. package/src/core/notebook/document/__tests__/scenarios.test.ts +205 -0
  506. package/src/core/notebook/document/__tests__/state.test.ts +459 -0
  507. package/src/core/notebook/document/__tests__/submission.test.ts +203 -0
  508. package/src/core/notebook/document/__tests__/test-host.test.ts +92 -0
  509. package/src/core/notebook/document/__tests__/test-host.ts +247 -0
  510. package/src/core/notebook/document/__tests__/test-notebook.ts +149 -0
  511. package/src/core/notebook/document/__tests__/user.ts +61 -0
  512. package/src/core/notebook/document/codemirror.ts +216 -0
  513. package/src/core/notebook/document/draft.ts +502 -0
  514. package/src/core/notebook/document/hooks.tsx +118 -0
  515. package/src/core/notebook/document/index.ts +24 -0
  516. package/src/core/notebook/document/model.ts +102 -0
  517. package/src/core/notebook/document/select.ts +41 -0
  518. package/src/core/notebook/document/state.ts +378 -0
  519. package/src/core/notebook/document/sync.ts +369 -0
  520. package/src/core/notebook/index.ts +19 -0
  521. package/src/core/notebook/operations.ts +30 -0
  522. package/src/core/notebook/replica/AGENTS.md +11 -0
  523. package/src/core/{host → notebook/replica}/__tests__/attachments.test.ts +9 -10
  524. package/src/core/{host → notebook/replica}/__tests__/document.test.ts +18 -16
  525. package/src/core/notebook/replica/__tests__/executions.test.ts +201 -0
  526. package/src/core/notebook/replica/__tests__/fixtures.ts +79 -0
  527. package/src/core/notebook/replica/__tests__/replica.test.ts +559 -0
  528. package/src/core/notebook/replica/__tests__/results.test.ts +193 -0
  529. package/src/core/notebook/replica/__tests__/runtime.test.ts +78 -0
  530. package/src/core/notebook/replica/backend.ts +19 -0
  531. package/src/core/notebook/replica/connection.ts +42 -0
  532. package/src/core/notebook/replica/index.ts +20 -0
  533. package/src/core/notebook/replica/replica.ts +336 -0
  534. package/src/core/{host → notebook/replica}/resources/attachments.ts +6 -3
  535. package/src/core/{host → notebook/replica}/resources/document.ts +4 -4
  536. package/src/core/notebook/replica/resources/executions.ts +157 -0
  537. package/src/core/notebook/replica/resources/results.ts +48 -0
  538. package/src/core/notebook/replica/resources/runtime.ts +14 -0
  539. package/src/core/packages/__tests__/useSandboxController.test.tsx +1 -1
  540. package/src/core/packages/useSandboxController.ts +1 -1
  541. package/src/core/run-app.tsx +48 -51
  542. package/src/core/runtime/__tests__/adapter.test.ts +1 -1
  543. package/src/core/runtime/__tests__/createWsUrl.test.ts +77 -7
  544. package/src/core/runtime/__tests__/runtime.test.ts +32 -74
  545. package/src/core/runtime/adapter.ts +1 -1
  546. package/src/core/runtime/config.ts +2 -2
  547. package/src/core/runtime/runtime.ts +33 -46
  548. package/src/core/runtime/types.ts +0 -2
  549. package/src/core/saving/__tests__/document.test.tsx +123 -0
  550. package/src/core/saving/__tests__/state.test.ts +111 -0
  551. package/src/core/saving/__tests__/useAutoSave.test.tsx +67 -0
  552. package/src/core/saving/document.ts +33 -0
  553. package/src/core/saving/filename.ts +1 -1
  554. package/src/core/saving/save-component.tsx +39 -60
  555. package/src/core/saving/state.ts +38 -39
  556. package/src/core/saving/useAutoSave.ts +17 -53
  557. package/src/core/session/__tests__/backend.test.ts +236 -0
  558. package/src/core/session/__tests__/useNotebookReplica.hook.test.tsx +184 -0
  559. package/src/core/{websocket → session}/__tests__/useNotebookSession.hook.test.tsx +213 -262
  560. package/src/core/session/active-notebook.ts +28 -0
  561. package/src/core/session/backend.ts +123 -0
  562. package/src/core/session/embedded.ts +7 -0
  563. package/src/core/{websocket → session}/types.ts +2 -2
  564. package/src/core/session/useNotebookReplica.ts +74 -0
  565. package/src/core/{websocket → session}/useNotebookSession.tsx +77 -64
  566. package/src/core/state/__tests__/jotai.test.tsx +108 -0
  567. package/src/core/state/jotai.ts +1 -1
  568. package/src/core/static/__tests__/files.test.ts +38 -10
  569. package/src/core/static/files.ts +2 -0
  570. package/src/core/{websocket → transports}/__tests__/connection-state.test.ts +1 -13
  571. package/src/core/transports/__tests__/server.test.ts +408 -0
  572. package/src/core/transports/__tests__/static.test.ts +306 -0
  573. package/src/core/transports/__tests__/wasm.test.ts +166 -0
  574. package/src/core/{websocket → transports}/connection-state.ts +9 -16
  575. package/src/core/transports/server.ts +152 -0
  576. package/src/core/transports/static.ts +166 -0
  577. package/src/core/transports/wasm.ts +97 -0
  578. package/src/core/wasm/__tests__/bridge.test.ts +105 -65
  579. package/src/core/wasm/__tests__/worker.test.ts +187 -0
  580. package/src/core/wasm/bridge.ts +69 -72
  581. package/src/core/wasm/rpc.ts +15 -3
  582. package/src/core/wasm/store.ts +3 -3
  583. package/src/core/wasm/worker/bootstrap.ts +55 -51
  584. package/src/core/wasm/worker/getMarimoWheel.ts +1 -1
  585. package/src/core/wasm/worker/save-worker.ts +9 -10
  586. package/src/core/wasm/worker/types.ts +29 -18
  587. package/src/core/wasm/worker/worker.ts +89 -45
  588. package/src/css/app/codemirror.css +1 -1
  589. package/src/css/globals.css +66 -22
  590. package/src/hooks/__tests__/useAsyncData.test.tsx +148 -0
  591. package/src/hooks/__tests__/useDebounce.test.tsx +51 -0
  592. package/src/hooks/__tests__/useDeepCompareMemoize.test.tsx +39 -0
  593. package/src/hooks/__tests__/useDelayElapsed.test.tsx +28 -0
  594. package/src/hooks/__tests__/useInternalStateWithSync.test.tsx +20 -0
  595. package/src/hooks/__tests__/useScript.test.tsx +77 -0
  596. package/src/hooks/__tests__/useStateForKey.test.tsx +257 -0
  597. package/src/hooks/useAsyncData.ts +3 -3
  598. package/src/hooks/useDataSourceDiscovery.ts +6 -4
  599. package/src/hooks/useDebounce.ts +6 -10
  600. package/src/hooks/useDeepCompareMemoize.ts +1 -1
  601. package/src/hooks/useDelayElapsed.ts +14 -10
  602. package/src/hooks/useElapsedTime.ts +3 -3
  603. package/src/hooks/useEventListener.ts +1 -2
  604. package/src/hooks/useInputHistory.ts +4 -7
  605. package/src/hooks/useInternalStateWithSync.ts +6 -6
  606. package/src/hooks/useResizeObserver.ts +4 -7
  607. package/src/hooks/useScript.ts +67 -70
  608. package/src/hooks/useStateForKey.ts +93 -0
  609. package/src/mount.tsx +20 -15
  610. package/src/plugins/__tests__/plugin-object-schemas.test.ts +104 -0
  611. package/src/plugins/core/registerReactComponent.tsx +1 -1
  612. package/src/plugins/impl/CodeEditorPlugin.tsx +1 -1
  613. package/src/plugins/impl/DataEditorPlugin.tsx +1 -1
  614. package/src/plugins/impl/DataTablePlugin.tsx +69 -37
  615. package/src/plugins/impl/DropdownPlugin.tsx +2 -6
  616. package/src/plugins/impl/FileBrowserPlugin.tsx +4 -16
  617. package/src/plugins/impl/FormPlugin.tsx +1 -1
  618. package/src/plugins/impl/RangeSliderPlugin.tsx +16 -2
  619. package/src/plugins/impl/RefreshPlugin.tsx +1 -0
  620. package/src/plugins/impl/SliderPlugin.tsx +6 -8
  621. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +387 -1
  622. package/src/plugins/impl/__tests__/FileBrowserPlugin.test.tsx +45 -0
  623. package/src/plugins/impl/__tests__/RangeSliderPlugin.test.tsx +109 -0
  624. package/src/plugins/impl/__tests__/SliderPlugin.test.tsx +24 -3
  625. package/src/plugins/impl/anywidget/__tests__/registry.test.ts +153 -0
  626. package/src/plugins/impl/anywidget/__tests__/widget-binding.test.ts +241 -2
  627. package/src/plugins/impl/anywidget/model.ts +3 -1
  628. package/src/plugins/impl/anywidget/registry.ts +18 -14
  629. package/src/plugins/impl/anywidget/runtime.ts +21 -9
  630. package/src/plugins/impl/anywidget/widget-binding.ts +160 -82
  631. package/src/plugins/impl/chat/__tests__/chat-prompts.test.tsx +93 -0
  632. package/src/plugins/impl/chat/chat-ui.tsx +14 -11
  633. package/src/plugins/impl/code/any-language-editor.tsx +2 -2
  634. package/src/plugins/impl/data-editor/glide-data-editor.tsx +8 -5
  635. package/src/plugins/impl/data-editor/glide-utils.ts +3 -1
  636. package/src/plugins/impl/data-explorer/ConnectedDataExplorerComponent.tsx +1 -1
  637. package/src/plugins/impl/data-explorer/components/column-summary.tsx +4 -2
  638. package/src/plugins/impl/data-explorer/state/reducer.ts +1 -1
  639. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +1 -2
  640. package/src/plugins/impl/data-frames/__tests__/sidebar.test.tsx +160 -0
  641. package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +66 -66
  642. package/src/plugins/impl/data-frames/panel.tsx +43 -16
  643. package/src/plugins/impl/mpl-interactive/MplInteractivePlugin.tsx +5 -3
  644. package/src/plugins/impl/panel/PanelPlugin.tsx +16 -17
  645. package/src/plugins/impl/panel/__tests__/utils.test.ts +39 -1
  646. package/src/plugins/impl/panel/utils.ts +17 -0
  647. package/src/plugins/impl/plotly/PlotlyPlugin.tsx +2 -5
  648. package/src/plugins/impl/plotly/selection.ts +25 -19
  649. package/src/plugins/impl/vega/VegaPlugin.tsx +2 -3
  650. package/src/plugins/impl/vega/make-selectable.ts +4 -7
  651. package/src/plugins/layout/RoutesPlugin.tsx +1 -1
  652. package/src/stories/__tests__/editor-story.test.tsx +33 -0
  653. package/src/stories/button.stories.tsx +1 -0
  654. package/src/stories/cell.stories.tsx +2 -5
  655. package/src/stories/data-table.stories.tsx +31 -0
  656. package/src/stories/editor.stories.tsx +24 -17
  657. package/src/stories/form-wrapper.stories.tsx +2 -2
  658. package/src/stories/layout/vertical/one-column.stories.tsx +28 -23
  659. package/src/stories/runtime-story.tsx +23 -17
  660. package/src/stories/select.stories.tsx +2 -2
  661. package/src/stories/switchable-multi-select.stories.tsx +1 -1
  662. package/src/utils/__tests__/arrays.test.ts +35 -0
  663. package/src/utils/__tests__/batch-requests.test.ts +3 -3
  664. package/src/utils/__tests__/{createReducer.test.ts → createReducer.test.tsx} +29 -0
  665. package/src/utils/__tests__/numbers.test.ts +105 -1
  666. package/src/utils/__tests__/objects.test.ts +21 -0
  667. package/src/utils/arrays.ts +11 -2
  668. package/src/utils/blob.ts +1 -1
  669. package/src/utils/createReducer.ts +53 -26
  670. package/src/utils/maps.ts +0 -3
  671. package/src/utils/numbers.ts +79 -18
  672. package/src/utils/objects.ts +4 -9
  673. package/src/utils/tracer.ts +9 -5
  674. package/src/utils/zod-utils.ts +1 -3
  675. package/dist/_baseMerge-BiGRwuqv.js +0 -165
  676. package/dist/any-language-editor-D4q-IFcM.js +0 -76
  677. package/dist/assets/__vite-browser-external-BXYkiFsk.js +0 -1
  678. package/dist/assets/worker-HPY9fbhz.js +0 -114
  679. package/dist/code-visibility-vqPDeo1_.js +0 -138
  680. package/dist/dropdown-menu-DHP9P4VE.js +0 -4678
  681. package/dist/feedback-button-BPcyKSZd.js +0 -379
  682. package/dist/hasIn-o2Us0uVx.js +0 -132
  683. package/dist/html-to-image-BdA59IUD.js +0 -3251
  684. package/dist/isArrayLikeObject-BZl-15ir.js +0 -450
  685. package/dist/isEmpty-BSZ1LaUo.js +0 -35
  686. package/dist/isSymbol-kQcfYbNX.js +0 -8
  687. package/dist/label-DoysmLMW.js +0 -281
  688. package/dist/mermaid-HWGCJPDP-ByCsZnYF.js +0 -2
  689. package/dist/objectWithoutPropertiesLoose-BRDcTsfB.js +0 -23
  690. package/dist/pick-CJeoxYOS.js +0 -51
  691. package/dist/precisionRound-DMIVQrt2.js +0 -97
  692. package/dist/select-DemoKT4G.js +0 -1344
  693. package/dist/toDate-B5mIgxwZ.js +0 -1185
  694. package/dist/toast-PkdZraM8.js +0 -1830
  695. package/dist/use-restore-focus-CKjfFjLM.js +0 -6369
  696. package/dist/useLifecycle-BGWzTwHK.js +0 -169
  697. package/dist/useTheme-BhQvec43.js +0 -904
  698. package/src/components/editor/cell/code/__tests__/rtc-editor-config.test.ts +0 -50
  699. package/src/components/editor/chrome/wrapper/footer-items/rtc-status.tsx +0 -65
  700. package/src/components/editor/navigation/__tests__/state.test.ts +0 -81
  701. package/src/components/editor/navigation/state.ts +0 -65
  702. package/src/core/ai/tools/__tests__/run-cells-tool.test.ts +0 -656
  703. package/src/core/ai/tools/run-cells-tool.ts +0 -303
  704. package/src/core/attachments/state.ts +0 -18
  705. package/src/core/cells/__tests__/apply-transaction.test.ts +0 -991
  706. package/src/core/cells/__tests__/document-changes.test.ts +0 -1140
  707. package/src/core/cells/__tests__/document-roundtrip.test.ts +0 -392
  708. package/src/core/cells/document-changes.ts +0 -944
  709. package/src/core/codemirror/rtc/extension.ts +0 -453
  710. package/src/core/codemirror/rtc/loro/__tests__/sync.test.ts +0 -52
  711. package/src/core/codemirror/rtc/loro/awareness.ts +0 -531
  712. package/src/core/codemirror/rtc/loro/colors.ts +0 -38
  713. package/src/core/codemirror/rtc/loro/sync.ts +0 -168
  714. package/src/core/host/AGENTS.md +0 -11
  715. package/src/core/host/__tests__/events.test.ts +0 -46
  716. package/src/core/host/__tests__/fixtures.ts +0 -39
  717. package/src/core/host/__tests__/notebook-client.test.ts +0 -433
  718. package/src/core/host/__tests__/protocol.test.ts +0 -214
  719. package/src/core/host/__tests__/stream.test.ts +0 -211
  720. package/src/core/host/connection.ts +0 -81
  721. package/src/core/host/events.ts +0 -61
  722. package/src/core/host/notebook-client.ts +0 -290
  723. package/src/core/host/protocol.ts +0 -1943
  724. package/src/core/host/resources/resource.ts +0 -59
  725. package/src/core/host/stream.ts +0 -213
  726. package/src/core/rtc/state.ts +0 -34
  727. package/src/core/state/__tests__/jotai.test.ts +0 -25
  728. package/src/core/wasm/worker/message-buffer.ts +0 -33
  729. package/src/core/websocket/__tests__/createConnectionTransport.test.ts +0 -49
  730. package/src/core/websocket/__tests__/useNotebookClient.hook.test.tsx +0 -170
  731. package/src/core/websocket/state.ts +0 -7
  732. package/src/core/websocket/transports/__tests__/basic.test.ts +0 -275
  733. package/src/core/websocket/transports/__tests__/sse.test.ts +0 -335
  734. package/src/core/websocket/transports/__tests__/transport.test.ts +0 -308
  735. package/src/core/websocket/transports/__tests__/ws.test.ts +0 -125
  736. package/src/core/websocket/transports/basic.ts +0 -102
  737. package/src/core/websocket/transports/create.ts +0 -31
  738. package/src/core/websocket/transports/sse.ts +0 -308
  739. package/src/core/websocket/transports/transport.ts +0 -50
  740. package/src/core/websocket/transports/ws.ts +0 -98
  741. package/src/core/websocket/useNotebookClient.ts +0 -88
  742. package/src/utils/__tests__/id-tree.test.ts +0 -2145
  743. package/src/utils/id-tree.tsx +0 -1134
  744. /package/src/{core/attachments/toast.ts → components/editor/agent-toast.ts} +0 -0
  745. /package/src/core/{websocket → session}/connection-utils.ts +0 -0
@@ -7,7 +7,7 @@ import { beforeEach, describe, expect, it, vi } from "vitest";
7
7
  import { cellId } from "@/__tests__/branded";
8
8
  import { CellId } from "@/core/cells/ids";
9
9
  import { getCellEditorView } from "../../cells/cells";
10
- import { updateEditorCodeFromPython } from "../../codemirror/language/utils";
10
+ import { prepareCellCodeUpdate } from "../../codemirror/language/cell-code";
11
11
  import {
12
12
  stagedAICellsAtom,
13
13
  stagedGenerationInProgressAtom,
@@ -21,8 +21,8 @@ const { stagedGenerationAtom, createActions, reducer, initialState } =
21
21
  visibleForTesting;
22
22
 
23
23
  // Mock the dependencies
24
- const mockCreateNewCell = vi.fn();
25
- const mockUpdateCellCode = vi.fn();
24
+ const mockCreateCell = vi.fn();
25
+ const mockSetCellCode = vi.fn();
26
26
  const mockDeleteCellCallback = vi.fn();
27
27
 
28
28
  // Mock cell handle with editor view
@@ -34,17 +34,16 @@ const mockCellHandle = {
34
34
  },
35
35
  };
36
36
 
37
+ vi.mock("../../cells/actions", () => ({
38
+ useCellActions: () => ({
39
+ createCell: mockCreateCell,
40
+ setCellCode: mockSetCellCode,
41
+ }),
42
+ }));
37
43
  vi.mock("../../cells/cells", async () => {
38
44
  const { atom } = await import("jotai");
39
45
  return {
40
- notebookAtom: atom({ cellData: {}, cellIds: { inOrderIds: [] } }),
41
- useCellActions: () => ({
42
- createNewCell: mockCreateNewCell,
43
- updateCellCode: mockUpdateCellCode,
44
- }),
45
- cellHandleAtom: vi.fn(() => ({
46
- read: vi.fn(() => mockCellHandle),
47
- })),
46
+ notebookAtom: atom({ cellData: {}, cellIds: [] }),
48
47
  getCellEditorView: vi.fn(() => mockCellHandle.current.editorViewOrNull),
49
48
  };
50
49
  });
@@ -57,8 +56,8 @@ vi.mock("@/core/network/requests", () => ({
57
56
  getRequestClient: () => ({ sendRun: vi.fn() }),
58
57
  }));
59
58
 
60
- vi.mock("../../codemirror/language/utils", () => ({
61
- updateEditorCodeFromPython: vi.fn(),
59
+ vi.mock("../../codemirror/language/cell-code", () => ({
60
+ prepareCellCodeUpdate: vi.fn(() => ({ effects: [] })),
62
61
  }));
63
62
 
64
63
  // Mock CellId.create
@@ -261,11 +260,9 @@ describe("staged-cells", () => {
261
260
  const returnedCellId = result.current.createStagedCell(testCode);
262
261
 
263
262
  expect(returnedCellId).toBe(mockCellId);
264
- expect(mockCreateNewCell).toHaveBeenCalledWith({
265
- cellId: "__end__",
263
+ expect(mockCreateCell).toHaveBeenCalledWith({
266
264
  code: testCode,
267
- before: false,
268
- newCellId: mockCellId,
265
+ id: mockCellId,
269
266
  });
270
267
  });
271
268
 
@@ -330,7 +327,7 @@ describe("staged-cells", () => {
330
327
 
331
328
  // Verify it was created and added
332
329
  expect(createdCellId).toBe(mockCellId);
333
- expect(mockCreateNewCell).toHaveBeenCalled();
330
+ expect(mockCreateCell).toHaveBeenCalled();
334
331
 
335
332
  let state = store.get(stagedAICellsAtom);
336
333
  expect(state.has(mockCellId)).toBe(true);
@@ -401,8 +398,9 @@ describe("staged cell generation", () => {
401
398
  result.current.beginStagedCellGeneration();
402
399
 
403
400
  // No cell or cell update should have been called
404
- expect(mockCreateNewCell).not.toHaveBeenCalled();
405
- expect(updateEditorCodeFromPython).not.toHaveBeenCalled();
401
+ expect(mockCreateCell).not.toHaveBeenCalled();
402
+ expect(prepareCellCodeUpdate).not.toHaveBeenCalled();
403
+ expect(mockSetCellCode).not.toHaveBeenCalled();
406
404
  expect(store.get(stagedGenerationInProgressAtom)).toBe(true);
407
405
  });
408
406
 
@@ -610,11 +608,9 @@ describe("staged cell generation", () => {
610
608
  },
611
609
  });
612
610
 
613
- expect(mockCreateNewCell).toHaveBeenCalledWith({
614
- cellId: "__end__",
611
+ expect(mockCreateCell).toHaveBeenCalledWith({
615
612
  code: "print('```')",
616
- before: false,
617
- newCellId: "mock-cell-id",
613
+ id: "mock-cell-id",
618
614
  });
619
615
  });
620
616
 
@@ -636,16 +632,16 @@ describe("staged cell generation", () => {
636
632
  },
637
633
  });
638
634
 
639
- expect(mockCreateNewCell).toHaveBeenCalledWith(
635
+ expect(mockCreateCell).toHaveBeenCalledWith(
640
636
  expect.objectContaining({
641
637
  code: "value = 1",
642
- newCellId: "first-cell",
638
+ id: "first-cell",
643
639
  }),
644
640
  );
645
- expect(mockCreateNewCell).toHaveBeenCalledWith(
641
+ expect(mockCreateCell).toHaveBeenCalledWith(
646
642
  expect.objectContaining({
647
643
  code: "value",
648
- newCellId: "second-cell",
644
+ id: "second-cell",
649
645
  }),
650
646
  );
651
647
  });
@@ -683,13 +679,17 @@ describe("staged cell generation", () => {
683
679
  },
684
680
  });
685
681
 
686
- expect(mockCreateNewCell).toHaveBeenCalledTimes(2);
682
+ expect(mockCreateCell).toHaveBeenCalledTimes(2);
687
683
  expect(store.get(stagedAICellsAtom).has(cellId("first-cell"))).toBe(true);
688
684
  expect(store.get(stagedAICellsAtom).has(cellId("second-cell"))).toBe(true);
689
- expect(updateEditorCodeFromPython).toHaveBeenCalledTimes(2);
685
+ expect(prepareCellCodeUpdate).toHaveBeenCalledTimes(2);
686
+ expect(
687
+ mockCellHandle.current.editorViewOrNull.dispatch,
688
+ ).toHaveBeenCalledTimes(2);
689
+ expect(mockSetCellCode).not.toHaveBeenCalled();
690
690
  });
691
691
 
692
- it("should update notebook state when the cell editor is not mounted", () => {
692
+ it("writes through the document when the cell editor is not mounted", () => {
693
693
  const { result } = renderGenerationHook();
694
694
  result.current.beginStagedCellGeneration();
695
695
 
@@ -709,10 +709,9 @@ describe("staged cell generation", () => {
709
709
  },
710
710
  });
711
711
 
712
- expect(mockUpdateCellCode).toHaveBeenCalledWith({
712
+ expect(mockSetCellCode).toHaveBeenCalledWith({
713
713
  cellId: cellId("unmounted-cell"),
714
714
  code: "value = 1",
715
- formattingChange: false,
716
715
  });
717
716
  });
718
717
 
@@ -34,9 +34,7 @@ describe("CellOutputContextProvider", () => {
34
34
  beforeEach(() => {
35
35
  // Create a basic mock notebook state
36
36
  mockNotebook = {
37
- cellIds: {
38
- inOrderIds: ["cell1", "cell2", "cell3"],
39
- },
37
+ cellIds: ["cell1", "cell2", "cell3"],
40
38
  cellData: {
41
39
  cell1: {
42
40
  id: "cell1",
@@ -207,7 +205,7 @@ describe("Cell output utility functions", () => {
207
205
 
208
206
  beforeEach(() => {
209
207
  const mockNotebook = {
210
- cellIds: { inOrderIds: [] },
208
+ cellIds: [],
211
209
  cellData: {},
212
210
  cellRuntime: {},
213
211
  } as unknown as NotebookState;
@@ -226,7 +224,7 @@ describe("Cell output utility functions", () => {
226
224
 
227
225
  for (const testCase of testCases) {
228
226
  mockStore = createMockStore({
229
- cellIds: { inOrderIds: ["test"] },
227
+ cellIds: ["test"],
230
228
  cellData: {
231
229
  test: { id: "test", name: "", code: "" },
232
230
  },
@@ -261,7 +259,7 @@ describe("Cell output utility functions", () => {
261
259
 
262
260
  for (const testCase of testCases) {
263
261
  mockStore = createMockStore({
264
- cellIds: { inOrderIds: ["test"] },
262
+ cellIds: ["test"],
265
263
  cellData: {
266
264
  test: { id: "test", name: "", code: "" },
267
265
  },
@@ -295,7 +293,7 @@ describe("Cell output utility functions", () => {
295
293
 
296
294
  for (const testCase of testCases) {
297
295
  mockStore = createMockStore({
298
- cellIds: { inOrderIds: ["test"] },
296
+ cellIds: ["test"],
299
297
  cellData: {
300
298
  test: { id: "test", name: "", code: "" },
301
299
  },
@@ -338,7 +336,7 @@ describe("Cell output utility functions", () => {
338
336
  } as unknown as Document;
339
337
 
340
338
  const mockNotebook = {
341
- cellIds: { inOrderIds: [] },
339
+ cellIds: [],
342
340
  cellData: {},
343
341
  cellRuntime: {},
344
342
  } as unknown as NotebookState;
@@ -369,7 +367,7 @@ describe("Cell output utility functions", () => {
369
367
  ).mockReturnValue(mockDiv);
370
368
 
371
369
  mockStore = createMockStore({
372
- cellIds: { inOrderIds: ["test"] },
370
+ cellIds: ["test"],
373
371
  cellData: {
374
372
  test: { id: "test", name: "", code: "" },
375
373
  },
@@ -395,9 +393,7 @@ describe("Cell output utility functions", () => {
395
393
 
396
394
  beforeEach(() => {
397
395
  mockNotebook = {
398
- cellIds: {
399
- inOrderIds: ["cell1", "cell2"],
400
- },
396
+ cellIds: ["cell1", "cell2"],
401
397
  cellData: {
402
398
  cell1: {
403
399
  id: "cell1",
@@ -93,7 +93,7 @@ export class CellOutputContextProvider extends AIContextProvider<CellOutputConte
93
93
  const notebook = this.store.get(notebookAtom);
94
94
  const items: CellOutputContextItem[] = [];
95
95
 
96
- for (const cellId of notebook.cellIds.inOrderIds) {
96
+ for (const cellId of notebook.cellIds) {
97
97
  const cellContextData = getCellContextData(cellId, notebook);
98
98
  const cellOutput = cellContextData.cellOutput;
99
99
 
@@ -358,7 +358,7 @@ export function getCellContextData(
358
358
  const cellRuntime = notebook.cellRuntime[cellId];
359
359
 
360
360
  const cellData = notebook.cellData[cellId];
361
- const cellIndex = notebook.cellIds.inOrderIds.indexOf(cellId);
361
+ const cellIndex = notebook.cellIds.indexOf(cellId);
362
362
  const cellName = displayCellName(cellData.name, cellIndex);
363
363
 
364
364
  let consoleOutputs: BaseOutput[] | undefined;
@@ -98,8 +98,12 @@ export class DatasourceContextProvider extends AIContextProvider<DatasourceConte
98
98
  public formatContext(item: DatasourceContextItem): string {
99
99
  const data = item.data;
100
100
  // Remove certain fields that are not needed in the context
101
- const { name, display_name, source, ...filteredDatasource } =
102
- data.connection;
101
+ const {
102
+ name,
103
+ display_name: _displayName,
104
+ source: _source,
105
+ ...filteredDatasource
106
+ } = data.connection;
103
107
 
104
108
  let datasource = filteredDatasource;
105
109
  const isInternalEngine = INTERNAL_SQL_ENGINES.has(name as ConnectionName);
@@ -14,12 +14,9 @@ import {
14
14
  notebookCellsCompletionSchema,
15
15
  } from "./completion-output";
16
16
  import { maybeAddMarimoImport } from "../cells/add-missing-import";
17
- import {
18
- type CreateNewCellAction,
19
- getCellEditorView,
20
- useCellActions,
21
- } from "../cells/cells";
22
- import { updateEditorCodeFromPython } from "../codemirror/language/utils";
17
+ import { getCellEditorView } from "../cells/cells";
18
+ import { type CreateCell, useCellActions } from "../cells/actions";
19
+ import { prepareCellCodeUpdate } from "../codemirror/language/cell-code";
23
20
  import type { JotaiStore } from "../state/jotai";
24
21
  import type { EditType } from "./tools/edit-notebook-tool";
25
22
 
@@ -98,18 +95,13 @@ interface UpdateStagedCellAction {
98
95
  /** Manage staged cells without assuming which AI workflow owns them. */
99
96
  export function useStagedCells(store: JotaiStore) {
100
97
  const { addStagedCell, removeStagedCell } = useStagedAICellsActions();
101
- const { createNewCell, updateCellCode } = useCellActions();
98
+ const { setCellCode, createCell } = useCellActions();
102
99
  const deleteCellCallback = useDeleteCellCallback();
103
100
 
104
101
  const createStagedCell = (code: string): CellId => {
105
102
  const newCellId = CellId.create();
106
103
  addStagedCell({ cellId: newCellId, edit: { type: "add_cell" } });
107
- createNewCell({
108
- cellId: "__end__",
109
- code,
110
- before: false,
111
- newCellId: newCellId,
112
- });
104
+ createCell({ code, id: newCellId });
113
105
  return newCellId;
114
106
  };
115
107
 
@@ -122,11 +114,18 @@ export function useStagedCells(store: JotaiStore) {
122
114
  return;
123
115
  }
124
116
 
117
+ // The AI may change the cell's language, and only the editor infers
118
+ // one. Without a mounted editor the code arrives through the document.
125
119
  const editorView = getCellEditorView(cellId);
126
120
  if (editorView) {
127
- updateEditorCodeFromPython(editorView, code);
121
+ const update = prepareCellCodeUpdate(editorView.state, code, {
122
+ initialize: true,
123
+ });
124
+ if (update) {
125
+ editorView.dispatch(update);
126
+ }
128
127
  } else {
129
- updateCellCode({ cellId, code, formattingChange: false });
128
+ setCellCode({ cellId, code });
130
129
  }
131
130
  };
132
131
 
@@ -147,7 +146,7 @@ export function useStagedCells(store: JotaiStore) {
147
146
  /** Owns the lifecycle of cells created by one structured completion flow. */
148
147
  export function useStagedCellGeneration(store: JotaiStore) {
149
148
  const stagedCellActions = useStagedCells(store);
150
- const { createNewCell } = useCellActions();
149
+ const { createCell } = useCellActions();
151
150
  const ownedGeneration = useRef<OwnedStagedGeneration | null>(null);
152
151
  // Ownership lives in a ref, so subscribe to its backing atoms to rerender
153
152
  // consumers when completion or per-cell acceptance changes.
@@ -175,7 +174,7 @@ export function useStagedCellGeneration(store: JotaiStore) {
175
174
  status: "in_progress",
176
175
  reconciler: new StagedCellReconciler({
177
176
  ...stagedCellActions,
178
- createNewCell,
177
+ createCell,
179
178
  }),
180
179
  };
181
180
  store.set(stagedGenerationAtom, {
@@ -297,7 +296,7 @@ interface StagedCellReconcilerActions {
297
296
  deleteStagedCell: (cellId: CellId) => void;
298
297
  removeStagedCell: (cellId: CellId) => void;
299
298
  addStagedCell: (payload: { cellId: CellId; edit: Edit }) => void;
300
- createNewCell: (opts: CreateNewCellAction) => void;
299
+ createCell: CreateCell;
301
300
  }
302
301
 
303
302
  class StagedCellReconciler {
@@ -386,7 +385,7 @@ class StagedCellReconciler {
386
385
 
387
386
  const cellId = maybeAddMarimoImport({
388
387
  autoInstantiate: false,
389
- createNewCell: this.actions.createNewCell,
388
+ createCell: this.actions.createCell,
390
389
  fromCellId: this.createdCells[0]?.cellId,
391
390
  before: true,
392
391
  });
@@ -4,13 +4,18 @@ import { EditorState } from "@codemirror/state";
4
4
  import { EditorView } from "@codemirror/view";
5
5
  import { getDefaultStore } from "jotai";
6
6
  import { beforeEach, describe, expect, it, vi } from "vitest";
7
+ import { mockDocumentModel } from "@/__mocks__/document";
7
8
  import { MockNotebook } from "@/__mocks__/notebook";
8
9
  import { cellId } from "@/__tests__/branded";
9
10
  import { notebookAtom } from "@/core/cells/cells";
10
11
  import type { CellId } from "@/core/cells/ids";
11
- import { updateEditorCodeFromPython } from "@/core/codemirror/language/utils";
12
12
  import { OverridingHotkeyProvider } from "@/core/hotkeys/hotkeys";
13
- import { MultiColumn } from "@/utils/id-tree";
13
+ import {
14
+ cell,
15
+ CONFIG,
16
+ document as documentOf,
17
+ withCells,
18
+ } from "@/core/notebook/document/__tests__/fixtures";
14
19
  import { cellConfigExtension } from "../../../codemirror/config/extension";
15
20
  import { adaptiveLanguageConfiguration } from "../../../codemirror/language/extension";
16
21
  import { stagedAICellsAtom } from "../../staged-cells";
@@ -22,11 +27,6 @@ vi.mock("@/components/editor/links/cell-link", () => ({
22
27
  scrollAndHighlightCell: vi.fn(),
23
28
  }));
24
29
 
25
- // Mock updateEditorCodeFromPython
26
- vi.mock("@/core/codemirror/language/utils", () => ({
27
- updateEditorCodeFromPython: vi.fn(),
28
- }));
29
-
30
30
  function createMockEditorView(code: string): EditorView {
31
31
  return new EditorView({
32
32
  state: EditorState.create({
@@ -67,12 +67,9 @@ describe("EditNotebookTool", () => {
67
67
  let tool: EditNotebookTool;
68
68
  let cellId1: CellId;
69
69
  let cellId2: CellId;
70
- let cellId3: CellId;
71
70
  let toolContext: {
72
71
  addStagedCell: ReturnType<typeof vi.fn>;
73
- createNewCell: ReturnType<typeof vi.fn>;
74
- prepareForRun: ReturnType<typeof vi.fn>;
75
- sendRun: ReturnType<typeof vi.fn>;
72
+ createCell: ReturnType<typeof vi.fn>;
76
73
  store: ReturnType<typeof getDefaultStore>;
77
74
  };
78
75
 
@@ -87,16 +84,13 @@ describe("EditNotebookTool", () => {
87
84
  const current = store.get(stagedAICellsAtom);
88
85
  store.set(stagedAICellsAtom, new Map(current).set(cellId, edit));
89
86
  }),
90
- createNewCell: vi.fn(),
91
- prepareForRun: vi.fn(),
92
- sendRun: vi.fn().mockResolvedValue(null),
87
+ createCell: vi.fn(),
93
88
  store,
94
89
  };
95
90
  tool = new EditNotebookTool();
96
91
 
97
92
  cellId1 = cellId("cell-1");
98
93
  cellId2 = cellId("cell-2");
99
- cellId3 = cellId("cell-3");
100
94
 
101
95
  // Reset mocks
102
96
  vi.clearAllMocks();
@@ -106,7 +100,7 @@ describe("EditNotebookTool", () => {
106
100
  it("should have correct metadata", () => {
107
101
  expect(tool.name).toBe("edit_notebook_tool");
108
102
  expect(tool.description).toBeDefined();
109
- expect(tool.description.baseDescription).toContain("editing operations");
103
+ expect(tool.description.baseDescription).toContain("Propose cell edits");
110
104
  expect(tool.schema).toBeDefined();
111
105
  expect(tool.outputSchema).toBeDefined();
112
106
  expect(tool.mode).toEqual(["agent"]);
@@ -140,10 +134,7 @@ describe("EditNotebookTool", () => {
140
134
  );
141
135
 
142
136
  expect(result.status).toBe("success");
143
- expect(vi.mocked(updateEditorCodeFromPython)).toHaveBeenCalledWith(
144
- editorView,
145
- newCode,
146
- );
137
+ expect(editorView.state.doc.toString()).toBe(newCode);
147
138
 
148
139
  // Check that cell was staged
149
140
  const stagedCells = store.get(stagedAICellsAtom);
@@ -166,10 +157,7 @@ describe("EditNotebookTool", () => {
166
157
  );
167
158
 
168
159
  expect(result2.status).toBe("success");
169
- expect(vi.mocked(updateEditorCodeFromPython)).toHaveBeenCalledWith(
170
- editorView,
171
- "x = 3",
172
- );
160
+ expect(editorView.state.doc.toString()).toBe("x = 3");
173
161
 
174
162
  const stagedCells2 = store.get(stagedAICellsAtom);
175
163
  expect(stagedCells2.has(cellId1)).toBe(true);
@@ -206,7 +194,7 @@ describe("EditNotebookTool", () => {
206
194
 
207
195
  // Should NOT stage the cell or update the editor
208
196
  expect(toolContext.addStagedCell).not.toHaveBeenCalled();
209
- expect(vi.mocked(updateEditorCodeFromPython)).not.toHaveBeenCalled();
197
+ expect(editorView.state.doc.toString()).toBe(code);
210
198
 
211
199
  // No staged cells
212
200
  const stagedCells = store.get(stagedAICellsAtom);
@@ -459,27 +447,37 @@ describe("EditNotebookTool", () => {
459
447
  [cellId2]: { code: "x = 2" },
460
448
  },
461
449
  });
462
- // Create multi-column layout
463
- notebook.cellIds = MultiColumn.from([[cellId1], [cellId2]]);
464
450
  store.set(notebookAtom, notebook);
465
-
466
- const newCode = "y = 2";
467
- const result = await tool.handler(
468
- {
469
- edit: {
470
- type: "add_cell",
471
- position: { type: "column_end", columnIndex: 1 },
472
- code: newCode,
473
- },
474
- },
475
- toolContext as never,
451
+ // The layout reads columns from the document's cells.
452
+ const { stop } = mockDocumentModel(
453
+ store,
454
+ withCells(documentOf(), {
455
+ c1: null,
456
+ c2: null,
457
+ [cellId1]: cell(cellId1, "x = 1"),
458
+ [cellId2]: cell(cellId2, "x = 2", {
459
+ config: { ...CONFIG, column: 1 },
460
+ }),
461
+ }),
476
462
  );
477
463
 
478
- expect(result.status).toBe("success");
464
+ try {
465
+ const result = await tool.handler(
466
+ {
467
+ edit: {
468
+ type: "add_cell",
469
+ position: { type: "column_end", columnIndex: 1 },
470
+ code: "y = 2",
471
+ },
472
+ },
473
+ toolContext as never,
474
+ );
479
475
 
480
- // Check that a new cell was staged
481
- const stagedCells = store.get(stagedAICellsAtom);
482
- expect(stagedCells.size).toBe(1);
476
+ expect(result.status).toBe("success");
477
+ expect(store.get(stagedAICellsAtom).size).toBe(1);
478
+ } finally {
479
+ stop();
480
+ }
483
481
  });
484
482
 
485
483
  it("should throw error when cell ID doesn't exist for position", async () => {
@@ -714,52 +712,6 @@ describe("EditNotebookTool", () => {
714
712
  });
715
713
  });
716
714
 
717
- describe("validation", () => {
718
- it("should validate cell exists in multi-column notebook", async () => {
719
- const notebook = MockNotebook.notebookState({
720
- cellData: {
721
- [cellId1]: { code: "x = 1" },
722
- [cellId2]: { code: "x = 2" },
723
- [cellId3]: { code: "x = 3" },
724
- },
725
- });
726
- // Create multi-column layout
727
- notebook.cellIds = MultiColumn.from([[cellId1, cellId2], [cellId3]]);
728
- store.set(notebookAtom, notebook);
729
-
730
- // Should not throw for cells in different columns
731
- const editorView = createMockEditorView("x = 1");
732
- notebook.cellHandles[cellId1] = { current: { editorView } } as never;
733
- notebook.cellHandles[cellId3] = { current: { editorView } } as never;
734
-
735
- await expect(
736
- tool.handler(
737
- {
738
- edit: {
739
- type: "update_cell",
740
- position: { cellId: cellId1 },
741
- code: "y = 1",
742
- },
743
- },
744
- toolContext as never,
745
- ),
746
- ).resolves.toBeDefined();
747
-
748
- await expect(
749
- tool.handler(
750
- {
751
- edit: {
752
- type: "update_cell",
753
- position: { cellId: cellId3 },
754
- code: "y = 3",
755
- },
756
- },
757
- toolContext as never,
758
- ),
759
- ).resolves.toBeDefined();
760
- });
761
- });
762
-
763
715
  describe("return value", () => {
764
716
  it("should return success status with next steps", async () => {
765
717
  const notebook = MockNotebook.notebookState({
@@ -10,6 +10,23 @@ import { TestFrontendTool } from "../sample-tool";
10
10
  const INVALID_KEYS_IN_SCHEMA_PARAMS = new Set(["anyOf", "oneOf"]);
11
11
 
12
12
  describe("FrontendToolRegistry", () => {
13
+ it("only offers cell proposals with Suggest edits access", () => {
14
+ expect(
15
+ Object.fromEntries(
16
+ COPILOT_MODES.map((mode) => [
17
+ mode,
18
+ FRONTEND_TOOL_REGISTRY.getToolSchemas(mode).map((tool) => tool.name),
19
+ ]),
20
+ ),
21
+ ).toEqual({
22
+ manual: [],
23
+ ask: [],
24
+ agent: ["edit_notebook_tool"],
25
+ code_mode: [],
26
+ });
27
+ expect(FRONTEND_TOOL_REGISTRY.has("run_stale_cells_tool")).toBe(false);
28
+ });
29
+
13
30
  it("registers tools via constructor and supports has()", () => {
14
31
  const registry = new FrontendToolRegistry([new TestFrontendTool()]);
15
32
  expect(registry.has("test_frontend_tool")).toBe(true);
@@ -1,9 +1,8 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
3
  import { z } from "zod";
4
- import type { CreateNewCellAction } from "@/core/cells/cells";
4
+ import type { CreateCell } from "@/core/cells/actions";
5
5
  import type { CellId } from "@/core/cells/ids";
6
- import type { ExecuteCellsRequest } from "@/core/network/types";
7
6
  import type { JotaiStore } from "@/core/state/jotai";
8
7
  import type { Edit } from "../staged-cells";
9
8
  import type { CopilotMode } from "./registry";
@@ -20,9 +19,11 @@ export type StatusValue = "success" | "error" | "warning";
20
19
  * @example
21
20
  * throw new ToolExecutionError(
22
21
  * "Failed to fetch data",
23
- * "FETCH_ERROR",
24
- * true,
25
- * "Check your network connection"
22
+ * {
23
+ * code: "FETCH_ERROR",
24
+ * isRetryable: true,
25
+ * suggestedFix: "Check your network connection",
26
+ * }
26
27
  * );
27
28
  */
28
29
  export class ToolExecutionError extends Error {
@@ -33,10 +34,17 @@ export class ToolExecutionError extends Error {
33
34
 
34
35
  public constructor(
35
36
  message: string,
36
- code = "TOOL_ERROR",
37
- isRetryable = false,
38
- suggestedFix?: string,
39
- meta?: Record<string, unknown>,
37
+ {
38
+ code = "TOOL_ERROR",
39
+ isRetryable = false,
40
+ suggestedFix,
41
+ meta,
42
+ }: {
43
+ code?: string;
44
+ isRetryable?: boolean;
45
+ suggestedFix?: string;
46
+ meta?: Record<string, unknown>;
47
+ } = {},
40
48
  ) {
41
49
  super(message);
42
50
  this.name = "ToolExecutionError";
@@ -58,9 +66,6 @@ export class ToolExecutionError extends Error {
58
66
  }
59
67
  }
60
68
 
61
- // Can be any input
62
- export type EmptyToolInput = unknown;
63
-
64
69
  /**
65
70
  * Base interface for tool output responses.
66
71
  * Mirrors the SuccessResult dataclass from marimo/_ai/_tools/types.py
@@ -104,9 +109,7 @@ export interface ToolDescription {
104
109
  export interface ToolNotebookContext {
105
110
  store: JotaiStore;
106
111
  addStagedCell: (payload: { cellId: CellId; edit: Edit }) => void;
107
- createNewCell: (payload: CreateNewCellAction) => void;
108
- prepareForRun: (payload: { cellId: CellId }) => void;
109
- sendRun: (request: ExecuteCellsRequest) => Promise<null>;
112
+ createCell: CreateCell;
110
113
  }
111
114
 
112
115
  export interface AiTool<TIn, TOut> {