@marimo-team/islands 0.25.3-dev28 → 0.25.3-dev284

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 (841) hide show
  1. package/dist/{ConnectedDataExplorerComponent-7EaP9VWb.js → ConnectedDataExplorerComponent-CErm132k.js} +116 -113
  2. package/dist/{ErrorBoundary-CUdSBv06.js → ErrorBoundary-DlAypzMw.js} +76 -82
  3. package/dist/_baseSet-BfI5FjBM.js +328 -0
  4. package/dist/{abnfDiagram-VCTEODGH-z_OSynK8.js → abnfDiagram-VCTEODGH-d-Qn2fwb.js} +2 -2
  5. package/dist/any-language-editor-6k6F12Z3.js +75 -0
  6. package/dist/{architectureDiagram-5GKGNRK7-Cs8J8BZr.js → architectureDiagram-5GKGNRK7-DxragHYv.js} +1 -1
  7. package/dist/{arrays-CN1djC4k.js → arrays-DoQ-AILx.js} +15 -27
  8. package/dist/assertNever-B-YzWzbL.js +507 -0
  9. package/dist/assets/__vite-browser-external-BKBpimif.js +1 -0
  10. package/dist/assets/worker-CgoMtD-_.js +113 -0
  11. package/dist/{blockDiagram-I7D4REHJ-Cg25UrxT.js → blockDiagram-I7D4REHJ-Dkhe6_PP.js} +1 -1
  12. package/dist/{button-CvjkwdSk.js → button-DZuNnIZO.js} +56 -48
  13. package/dist/{capabilities-CQ5IjhzL.js → capabilities-D9FskwsK.js} +2 -2
  14. package/dist/{chat-ui-BzjAsTFN.js → chat-ui-ByGe2rP1.js} +2100 -1810
  15. package/dist/{check-BMKBBrdc.js → check-XFzZeH-y.js} +1 -1
  16. package/dist/{chunk-IMKFNOWR-aoSFasqF.js → chunk-IMKFNOWR-C0x0feFg.js} +1 -1
  17. package/dist/{chunk-SHT3W25Y-CMaybO3O.js → chunk-SHT3W25Y-D0ZdASqB.js} +1 -1
  18. package/dist/{chunk-SVP7TREG-BNBrTAw1.js → chunk-SVP7TREG-BHjL96zx.js} +1 -1
  19. package/dist/{chunk-TICWLB2K-DXNxvUJn.js → chunk-TICWLB2K-CzcrwGfp.js} +1 -1
  20. package/dist/{classDiagram-ZZMXUADV-DXdCCDOg.js → classDiagram-ZZMXUADV-BTqFAZTP.js} +2 -2
  21. package/dist/{classDiagram-v2-VYDZK3BY-DyZqrtLP.js → classDiagram-v2-VYDZK3BY-EPXb0Elt.js} +2 -2
  22. package/dist/{code-visibility-BuxqA3v5.js → code-visibility-kxOpbw86.js} +43 -50
  23. package/dist/{common-xtZHxsM2.js → common-58GnHt6Y.js} +10605 -10045
  24. package/dist/config-C8MFHQ2E.js +637 -0
  25. package/dist/{copy-icon-BgUO8jsi.js → copy-icon-CtllOdmg.js} +3 -3
  26. package/dist/createReducer-DRqwmaTc.js +67 -0
  27. package/dist/{cynefinDiagram-5FMLGOSQ-DWHuKJs8.js → cynefinDiagram-5FMLGOSQ-CBSD344q.js} +1 -1
  28. package/dist/{dagre-GXQ25YYZ-DYLu-OCU.js → dagre-GXQ25YYZ-JItjh3Ge.js} +3 -3
  29. package/dist/{dagre-BGSfXNEb.js → dagre-mqiMAsFY.js} +531 -680
  30. package/dist/{data-grid-overlay-editor-qnbf5J94.js → data-grid-overlay-editor-CeO8C9Le.js} +1 -1
  31. package/dist/{debounce-C3jyATpc.js → debounce-DrhhziJv.js} +2 -2
  32. package/dist/{diagram-S7CK7UJ4-PwwcUOHP.js → diagram-S7CK7UJ4-CTD9xTVb.js} +1 -1
  33. package/dist/{diagram-UQ7AKVKN-CvJbL_IM.js → diagram-UQ7AKVKN-DTfnFai8.js} +1 -1
  34. package/dist/{diagram-VX7I27RA-B5RkqnzN.js → diagram-VX7I27RA-BcSnucV-.js} +1 -1
  35. package/dist/{diagram-Z3DM3KII-CyijwTR2.js → diagram-Z3DM3KII-C2ATIE8A.js} +1 -1
  36. package/dist/{dialog-Cc479ZEH.js → dialog-CaYm5imE.js} +32 -32
  37. package/dist/{dist-Bvs24R_E.js → dist-11T5wq3_.js} +31 -30
  38. package/dist/{dist-F8Ep36rk.js → dist-17ugwGZc.js} +59 -58
  39. package/dist/{dist-BMQf5zIS.js → dist-7cRjf--y.js} +123 -122
  40. package/dist/{dist-diIx5qJW.js → dist-B8pkfkzc.js} +31 -30
  41. package/dist/{dist-CN_BeG2I.js → dist-B9UoM_wq.js} +58 -57
  42. package/dist/{dist-CLdpGQVr.js → dist-BGuMTs1i.js} +118 -117
  43. package/dist/{dist-BK4Oj99o.js → dist-BHW11fni.js} +18 -17
  44. package/dist/dist-BLY4m1Wi.js +850 -0
  45. package/dist/{dist-PXYI_yuP.js → dist-BNlcVoxs.js} +24 -23
  46. package/dist/{dist-D6d86eNJ.js → dist-BQYe5Bju.js} +47 -46
  47. package/dist/{dist-CkTTIdBe.js → dist-BX1mn8na.js} +337 -337
  48. package/dist/{dist-DiDibOYr.js → dist-Bh0PTKUW.js} +151 -150
  49. package/dist/{dist-CSJ0MDRw.js → dist-CKaXK92p.js} +56 -55
  50. package/dist/{dist-C8fAKSH1.js → dist-CLhwfhpJ.js} +53 -52
  51. package/dist/{dist-DoE4XJBC.js → dist-CYeqK4Xw.js} +9801 -10649
  52. package/dist/{dist-BLfKmR-l.js → dist-Cxlp3WH6.js} +16 -15
  53. package/dist/{dist-D-wwqlzJ.js → dist-DSJPGj42.js} +158 -157
  54. package/dist/{dist-BorMD-uX.js → dist-DU9ICsWZ.js} +75 -74
  55. package/dist/{dist-DBtSl3sf.js → dist-DWv0ALBi.js} +47 -46
  56. package/dist/{dist-OR1OnN-y.js → dist-DiBpWEsB.js} +31 -30
  57. package/dist/{dist-CrSP_H1M.js → dist-DiLFTlnl.js} +242 -242
  58. package/dist/{dist-CN8zI-XC.js → dist-X9CsotJl.js} +239 -239
  59. package/dist/{dist-CSbh1PNP.js → dist-cVDV5IuI.js} +23 -22
  60. package/dist/{dist-BuaRHxOc.js → dist-fRfaOoq8.js} +44 -43
  61. package/dist/{dist-Cg7gzw-a.js → dist-gTTI-9Px.js} +78 -77
  62. package/dist/{dropdown-menu-BuE2b8Yb.js → dropdown-menu-Bb0bFOIk.js} +2904 -1493
  63. package/dist/{ebnfDiagram-PWID7BFC-DG90ELFp.js → ebnfDiagram-PWID7BFC-B7B9JPxc.js} +2 -2
  64. package/dist/{erDiagram-RLTQ6QDP-FMo_SpyX.js → erDiagram-RLTQ6QDP-v6hDno1O.js} +1 -1
  65. package/dist/{error-banner-CFPHFw4h.js → error-banner-CHCdHVFB.js} +87 -87
  66. package/dist/error-entries-9U4BFHjf.js +2586 -0
  67. package/dist/{esm-AMFssoNp.js → esm-BDqqT86j.js} +329 -329
  68. package/dist/{esm-D2gTsXEV.js → esm-BgKjMvWw.js} +530 -529
  69. package/dist/feedback-button-CU5tLok7.js +374 -0
  70. package/dist/{flowDiagram-HODETNUW-DQ4JuadE.js → flowDiagram-HODETNUW-aIFlAtOy.js} +2 -2
  71. package/dist/{formats-Bv_5N2Ff.js → formats-PzBQMUnr.js} +6 -6
  72. package/dist/{glide-data-editor-DQ_cEi05.js → glide-data-editor-D-EO3BiP.js} +6630 -2846
  73. package/dist/{glide-utils-pisbYVjH.js → glide-utils-BSQr4d90.js} +107 -76
  74. package/dist/{globals-D7vITxEX.js → globals-BscgCh7D.js} +3 -3
  75. package/dist/{graphlib-BmY_CCV9.js → graphlib-nlwT3Wvy.js} +177 -220
  76. package/dist/hasIn-C20JsQ2m.js +28 -0
  77. package/dist/{error-entries-j85LP88u.js → html-to-image-BYh_MorV.js} +26294 -26451
  78. package/dist/{infoDiagram-27XIBGKW-CRSDtRrd.js → infoDiagram-27XIBGKW-D6YHLeCP.js} +1 -1
  79. package/dist/isArrayLikeObject-B-HXCsex.js +626 -0
  80. package/dist/isEmpty-CdX7MTE1.js +14 -0
  81. package/dist/{ishikawaDiagram-5VMMS53U-DxLEUldB.js → ishikawaDiagram-5VMMS53U-D1ZvprOX.js} +1 -1
  82. package/dist/{kanban-definition-UXKFOSKX-BLhvu8o4.js → kanban-definition-UXKFOSKX-Bna_3BMr.js} +1 -1
  83. package/dist/{loader-BPdQhmlq.js → loader-DZvtzQoD.js} +3 -3
  84. package/dist/main.js +10276 -8171
  85. package/dist/{mermaid-Bjm6C1qN.js → mermaid-A36unKXJ.js} +62 -62
  86. package/dist/{mindmap-definition-YA3MSWOX-g2LwxnYQ.js → mindmap-definition-YA3MSWOX-CyVCs__G.js} +1 -1
  87. package/dist/{now-jM8-M7IR.js → now-BKZCLE5P.js} +12 -13
  88. package/dist/{number-overlay-editor-DJHB-CGK.js → number-overlay-editor-Dtmaj1ET.js} +1 -1
  89. package/dist/{objects-CzUgoMIF.js → objects-DCmMvZtn.js} +1 -3
  90. package/dist/{once-BtE-wKRL.js → once-NnpX_HnX.js} +1 -1
  91. package/dist/{pegDiagram-XKGWAZYB-CpMAt3Qs.js → pegDiagram-XKGWAZYB-9hNBD2wZ.js} +2 -2
  92. package/dist/pencil-DYUlSKxZ.js +10 -0
  93. package/dist/pick-tCszMUbm.js +35 -0
  94. package/dist/{pieDiagram-E7YTZNPT-CVTthoZo.js → pieDiagram-E7YTZNPT-8tr-NYo7.js} +1 -1
  95. package/dist/{process-output-DGzGHArA.js → process-output-bS3MGJ3f.js} +4 -4
  96. package/dist/{railroadDiagram-O6MQD6OU-ao8cqqFB.js → railroadDiagram-O6MQD6OU-Dzg1dyyp.js} +2 -2
  97. package/dist/{react-vega-BDpbvBCb.js → react-vega-C4T9Rb_w.js} +1 -1
  98. package/dist/{requirementDiagram-BXWQKSXE--J8vyfm-.js → requirementDiagram-BXWQKSXE-B7sNqwGG.js} +1 -1
  99. package/dist/{reveal-component-BxYUpAPg.js → reveal-component-DDr66wjo.js} +1151 -1128
  100. package/dist/select-DsoP1qe8.js +1200 -0
  101. package/dist/{sequenceDiagram-WJ2MYXX4-CiQbn62x.js → sequenceDiagram-WJ2MYXX4-oP9shbaG.js} +1 -1
  102. package/dist/{spec-D_u2ipzF.js → spec-BZMDxAu7.js} +41 -11
  103. package/dist/{stateDiagram-D77RDMKH-DVEeGs5b.js → stateDiagram-D77RDMKH-CjCv4ogv.js} +4 -4
  104. package/dist/{stateDiagram-v2-MP3YSRHH-1OQRe6iA.js → stateDiagram-v2-MP3YSRHH-BW9X162a.js} +2 -2
  105. package/dist/static-state-D-Q-Ajaa.js +72 -0
  106. package/dist/style.css +1 -1
  107. package/dist/{swimlanes-42K2YHIH-CqkGoGqn.js → swimlanes-42K2YHIH-Ckfs9Wrn.js} +1 -1
  108. package/dist/{swimlanesDiagram-VR7AAH4N-CszjkrKo.js → swimlanesDiagram-VR7AAH4N-DpTNG9YP.js} +2 -2
  109. package/dist/{swiper-component-DKntyn8p.js → swiper-component-DQbK_ZWm.js} +7 -7
  110. package/dist/{timeline-definition-24CTP7MA-DLRUNVAx.js → timeline-definition-24CTP7MA-BXaBlV6U.js} +1 -1
  111. package/dist/toast-BhjIy3Tq.js +491 -0
  112. package/dist/{tooltip-CtBZ5q8p.js → tooltip-DMMiOn2f.js} +321 -297
  113. package/dist/use-restore-focus-CosX7-gx.js +7568 -0
  114. package/dist/{useAsyncData-BneN349z.js → useAsyncData-Ci4AvJff.js} +18 -17
  115. package/dist/{useDateFormatter-DkajGwwd.js → useDateFormatter-CPlava52.js} +2 -2
  116. package/dist/{useDeepCompareMemoize-Z_7R8wTt.js → useDeepCompareMemoize-NaaWoFlX.js} +1 -1
  117. package/dist/useEvent-BRH-aCqi.js +19 -0
  118. package/dist/{useIframeCapabilities-DBETvvPl.js → useIframeCapabilities-BXhDDoCG.js} +1 -1
  119. package/dist/useLifecycle-SniivYmC.js +112 -0
  120. package/dist/{vega-component-DPd52jvr.js → vega-component-DIxaDQNs.js} +161 -160
  121. package/dist/{vega-embed-container-BgKnsDbB.js → vega-embed-container--LYZqguO.js} +2 -2
  122. package/dist/{vega-loader.browser-CpbZAXub.js → vega-loader.browser-B9Pz0EGP.js} +1 -1
  123. package/dist/{vennDiagram-4TSXK5OY-CypgoBVZ.js → vennDiagram-4TSXK5OY-C-hQ4iNJ.js} +1 -1
  124. package/dist/{wardleyDiagram-VM6X3IG4-B6xjiQ_g.js → wardleyDiagram-VM6X3IG4-C2MQ_Umv.js} +1 -1
  125. package/dist/{xychartDiagram-S5SC5T6Z-e0PefDVs.js → xychartDiagram-S5SC5T6Z-BtTTBn7Q.js} +1 -1
  126. package/package.json +16 -20
  127. package/src/__mocks__/document.tsx +63 -0
  128. package/src/__mocks__/executions.ts +197 -0
  129. package/src/__mocks__/notebook.ts +3 -7
  130. package/src/__mocks__/partial.ts +26 -0
  131. package/src/__mocks__/requests.ts +1 -4
  132. package/src/__tests__/CellStatus.test.tsx +25 -26
  133. package/src/__tests__/fixtures/pair-config.ts +1 -1
  134. package/src/__tests__/main.test.tsx +24 -1
  135. package/src/__tests__/module-entry.test.ts +44 -0
  136. package/src/__tests__/mount.test.ts +1 -21
  137. package/src/__tests__/{host-imports.test.ts → replica-imports.test.ts} +12 -11
  138. package/src/components/ai/__tests__/ai-model-dropdown.test.tsx +63 -0
  139. package/src/components/ai/ai-model-dropdown.tsx +11 -6
  140. package/src/components/app-config/__tests__/state.test.tsx +50 -0
  141. package/src/components/app-config/ai-config.tsx +156 -150
  142. package/src/components/app-config/app-config-button.tsx +6 -5
  143. package/src/components/app-config/app-config-form.tsx +5 -9
  144. package/src/components/app-config/common.tsx +7 -9
  145. package/src/components/app-config/data-form.tsx +112 -113
  146. package/src/components/app-config/mcp-config.tsx +30 -53
  147. package/src/components/app-config/user-config-form.css +91 -0
  148. package/src/components/app-config/user-config-form.tsx +266 -349
  149. package/src/components/chat/__tests__/capabilities-popover.test.tsx +0 -1
  150. package/src/components/chat/__tests__/chat-display.test.tsx +196 -0
  151. package/src/components/chat/__tests__/chat-markdown.test.tsx +43 -0
  152. package/src/components/chat/__tests__/chat-utils.test.ts +93 -1
  153. package/src/components/chat/__tests__/message-queue.test.tsx +17 -0
  154. package/src/components/chat/__tests__/notebook-access-selector.test.tsx +64 -0
  155. package/src/components/chat/__tests__/turn-timing.test.ts +84 -0
  156. package/src/components/chat/__tests__/use-assistant-turn.test.ts +95 -0
  157. package/src/components/chat/__tests__/user-message.test.tsx +27 -0
  158. package/src/components/chat/acp/__tests__/agent-panel-initialization.test.tsx +1 -1
  159. package/src/components/chat/acp/__tests__/agent-panel.test.tsx +22 -17
  160. package/src/components/chat/acp/__tests__/session-tabs.test.tsx +43 -0
  161. package/src/components/chat/acp/__tests__/state.test.ts +2 -2
  162. package/src/components/chat/acp/agent-panel.tsx +6 -3
  163. package/src/components/chat/acp/blocks.tsx +13 -12
  164. package/src/components/chat/acp/common.tsx +4 -5
  165. package/src/components/chat/acp/model-selector.tsx +1 -1
  166. package/src/components/chat/acp/session-tabs.tsx +8 -3
  167. package/src/components/chat/agent-activity.tsx +132 -0
  168. package/src/components/chat/capabilities-popover.tsx +2 -11
  169. package/src/components/chat/chat-components.tsx +9 -4
  170. package/src/components/chat/chat-display.tsx +131 -57
  171. package/src/components/chat/chat-history-popover.tsx +6 -1
  172. package/src/components/chat/chat-markdown.tsx +15 -0
  173. package/src/components/chat/chat-panel.tsx +216 -294
  174. package/src/components/chat/chat-typography.css +108 -0
  175. package/src/components/chat/chat-utils.ts +24 -35
  176. package/src/components/chat/notebook-access-selector.stories.tsx +22 -0
  177. package/src/components/chat/notebook-access-selector.tsx +100 -0
  178. package/src/components/chat/tool-call/__tests__/tool-labels.test.ts +76 -0
  179. package/src/components/chat/tool-call/__tests__/tool-step.test.tsx +57 -0
  180. package/src/components/chat/tool-call/shared.ts +6 -0
  181. package/src/components/chat/tool-call/tool-call-view.tsx +22 -76
  182. package/src/components/chat/tool-call/tool-labels.ts +172 -0
  183. package/src/components/chat/tool-call/tool-result.tsx +1 -1
  184. package/src/components/chat/tool-call/tool-step.tsx +145 -0
  185. package/src/components/chat/turn-timing.ts +73 -0
  186. package/src/components/chat/use-assistant-turn.ts +65 -0
  187. package/src/components/chat/use-chat-generation.ts +20 -0
  188. package/src/components/chat/user-message.tsx +145 -0
  189. package/src/components/data-table/TableBottomBar.tsx +4 -1
  190. package/src/components/data-table/TableTopBar.tsx +2 -0
  191. package/src/components/data-table/__tests__/chart-spec-model.test.ts +195 -195
  192. package/src/components/data-table/__tests__/column-explorer.test.tsx +27 -1
  193. package/src/components/data-table/__tests__/columns.test.tsx +105 -0
  194. package/src/components/data-table/__tests__/context-menu-interaction.test.tsx +130 -0
  195. package/src/components/data-table/__tests__/data-table.test.tsx +1 -0
  196. package/src/components/data-table/__tests__/date-popover.test.tsx +72 -0
  197. package/src/components/data-table/__tests__/export-actions.test.tsx +105 -0
  198. package/src/components/data-table/__tests__/keyboard-selection.test.tsx +188 -0
  199. package/src/components/data-table/__tests__/pagination.test.tsx +28 -1
  200. package/src/components/data-table/__tests__/search-highlight.test.tsx +109 -0
  201. package/src/components/data-table/__tests__/url-detector.test.tsx +74 -0
  202. package/src/components/data-table/cell-selection/feature.ts +2 -2
  203. package/src/components/data-table/cell-selection/types.ts +2 -2
  204. package/src/components/data-table/charts/__tests__/chart-panel.test.tsx +74 -1
  205. package/src/components/data-table/charts/__tests__/spec-snapshot.test.ts +20 -20
  206. package/src/components/data-table/charts/__tests__/spec.test.ts +78 -52
  207. package/src/components/data-table/charts/__tests__/storage.test.ts +4 -1
  208. package/src/components/data-table/charts/chart-spec/spec.ts +68 -43
  209. package/src/components/data-table/charts/charts.tsx +40 -30
  210. package/src/components/data-table/charts/storage.ts +16 -5
  211. package/src/components/data-table/column-explorer-panel/column-explorer.tsx +1 -1
  212. package/src/components/data-table/column-formatting/types.ts +1 -2
  213. package/src/components/data-table/column-summary/chart-spec-model.tsx +23 -16
  214. package/src/components/data-table/column-summary/column-summary.tsx +2 -4
  215. package/src/components/data-table/column-visibility-dropdown.tsx +8 -13
  216. package/src/components/data-table/columns.tsx +45 -46
  217. package/src/components/data-table/context-menu.tsx +36 -20
  218. package/src/components/data-table/data-table.tsx +17 -1
  219. package/src/components/data-table/date-popover.tsx +6 -4
  220. package/src/components/data-table/export-actions.tsx +76 -48
  221. package/src/components/data-table/pagination.tsx +44 -33
  222. package/src/components/data-table/range-focus/atoms.ts +4 -6
  223. package/src/components/data-table/range-focus/use-cell-range-selection.ts +65 -38
  224. package/src/components/data-table/range-focus/use-scroll-into-view.ts +21 -2
  225. package/src/components/data-table/renderers.tsx +16 -7
  226. package/src/components/data-table/row-viewer-panel/__tests__/row-viewer.test.tsx +24 -1
  227. package/src/components/data-table/row-viewer-panel/row-viewer.tsx +4 -4
  228. package/src/components/data-table/search-highlight.tsx +79 -0
  229. package/src/components/data-table/types.ts +1 -0
  230. package/src/components/data-table/url-detector.tsx +49 -9
  231. package/src/components/datasources/__tests__/column-actions.test.tsx +97 -0
  232. package/src/components/datasources/__tests__/column-preview.test.tsx +96 -5
  233. package/src/components/datasources/__tests__/datasources-interactions.test.tsx +181 -0
  234. package/src/components/datasources/__tests__/table-list.test.tsx +118 -0
  235. package/src/components/datasources/__tests__/utils.test.ts +57 -6
  236. package/src/components/datasources/column-preview.tsx +17 -12
  237. package/src/components/datasources/datasources.tsx +56 -43
  238. package/src/components/datasources/utils.ts +32 -23
  239. package/src/components/debugger/debugger-code.tsx +5 -0
  240. package/src/components/dependency-graph/custom-node.tsx +1 -1
  241. package/src/components/dependency-graph/dependency-graph-tree.tsx +8 -8
  242. package/src/components/dependency-graph/elements.ts +24 -21
  243. package/src/components/dependency-graph/minimap-content.tsx +15 -20
  244. package/src/components/dependency-graph/panels.tsx +4 -2
  245. package/src/components/dependency-graph/utils/__tests__/layout.test.ts +18 -11
  246. package/src/components/editor/SortableCell.tsx +1 -3
  247. package/src/components/editor/__tests__/Output.test.tsx +50 -32
  248. package/src/{core/attachments/__tests__/toast.test.tsx → components/editor/__tests__/agent-toast.test.tsx} +1 -1
  249. package/src/components/editor/__tests__/data-attributes.test.tsx +28 -23
  250. package/src/components/editor/__tests__/dynamic-favicon.test.tsx +111 -18
  251. package/src/components/editor/__tests__/output-persistence.test.tsx +28 -9
  252. package/src/components/editor/__tests__/package-alert.test.tsx +22 -1
  253. package/src/components/editor/actions/__tests__/name-cell-input.test.tsx +69 -0
  254. package/src/components/editor/actions/__tests__/pair-with-agent-commands.test.ts +21 -40
  255. package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +41 -14
  256. package/src/components/editor/actions/__tests__/pair-with-agent.test.tsx +6 -24
  257. package/src/components/editor/actions/__tests__/useCellActionButton.test.tsx +131 -0
  258. package/src/components/editor/actions/name-cell-input.tsx +4 -3
  259. package/src/components/editor/actions/pair-with-agent-commands.ts +10 -7
  260. package/src/components/editor/actions/pair-with-agent-modal.tsx +29 -30
  261. package/src/components/editor/actions/pair-with-agent.tsx +16 -39
  262. package/src/components/editor/actions/useCellActionButton.tsx +47 -35
  263. package/src/components/editor/actions/useConfigActions.tsx +3 -4
  264. package/src/components/editor/actions/useNotebookActions.tsx +25 -29
  265. package/src/components/editor/actions/useRestartKernel.tsx +1 -1
  266. package/src/components/editor/actions/useSetCodeVisibility.ts +11 -12
  267. package/src/components/editor/actions/useSetOutputsExpanded.ts +14 -19
  268. package/src/components/editor/ai/ai-completion-editor.tsx +2 -1
  269. package/src/components/editor/ai/completion-handlers.tsx +0 -37
  270. package/src/components/editor/ai/prompt-input.tsx +189 -0
  271. package/src/components/editor/alerts/__tests__/connection-notice.test.tsx +1 -1
  272. package/src/components/editor/alerts/connection-notice.tsx +1 -1
  273. package/src/components/editor/alerts/startup-logs-alert.tsx +1 -0
  274. package/src/components/editor/alerts/stdin-blocking-alert.tsx +4 -2
  275. package/src/components/editor/app-container.tsx +1 -1
  276. package/src/components/editor/boundary/__tests__/ErrorBoundary.test.tsx +1 -1
  277. package/src/components/editor/cell/CellStatus.tsx +28 -23
  278. package/src/components/editor/cell/CreateCellButton.tsx +15 -21
  279. package/src/components/editor/cell/DeleteButton.tsx +3 -2
  280. package/src/components/editor/cell/RunButton.tsx +18 -8
  281. package/src/components/editor/cell/StagedAICell.tsx +52 -137
  282. package/src/components/editor/cell/StopButton.tsx +2 -2
  283. package/src/components/editor/cell/__tests__/useRunCells.test.tsx +169 -0
  284. package/src/components/editor/cell/__tests__/useShouldShowInterrupt.test.ts +39 -0
  285. package/src/components/editor/cell/cell-actions.tsx +12 -1
  286. package/src/components/editor/cell/cell-context-menu.tsx +4 -1
  287. package/src/components/editor/cell/code/__tests__/language-toggle.test.tsx +54 -0
  288. package/src/components/editor/cell/code/cell-editor.tsx +65 -169
  289. package/src/components/editor/cell/code/language-toggle.tsx +8 -7
  290. package/src/components/editor/cell/collapse.tsx +16 -6
  291. package/src/components/editor/cell/useAddCell.ts +4 -8
  292. package/src/components/editor/cell/useDeleteCell.tsx +10 -36
  293. package/src/components/editor/cell/useRunCells.ts +49 -8
  294. package/src/components/editor/cell/useShouldShowInterrupt.ts +2 -12
  295. package/src/components/editor/cell/useSplitCell.tsx +10 -6
  296. package/src/components/editor/chrome/components/__tests__/feedback-button.test.tsx +1 -1
  297. package/src/components/editor/chrome/components/feedback-button.tsx +2 -8
  298. package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +31 -2
  299. package/src/components/editor/chrome/panels/__tests__/runtime-details.test.tsx +1 -1
  300. package/src/components/editor/chrome/panels/__tests__/sandbox-recovery.test.tsx +1 -1
  301. package/src/components/editor/chrome/panels/cache-panel.tsx +1 -0
  302. package/src/components/editor/chrome/panels/dependency-graph-panel.tsx +1 -1
  303. package/src/components/editor/chrome/panels/logs-panel.tsx +2 -1
  304. package/src/components/editor/chrome/panels/outline/__tests__/outline-keyboard.test.tsx +84 -0
  305. package/src/components/editor/chrome/panels/outline/floating-outline.tsx +39 -14
  306. package/src/components/editor/chrome/panels/outline/useActiveOutline.tsx +3 -2
  307. package/src/components/editor/chrome/panels/packages-panel.tsx +4 -7
  308. package/src/components/editor/chrome/panels/panel-header.tsx +13 -0
  309. package/src/components/editor/chrome/panels/secrets-panel.tsx +1 -0
  310. package/src/components/editor/chrome/panels/session-panel.tsx +1 -1
  311. package/src/components/editor/chrome/panels/snippets-panel.tsx +10 -12
  312. package/src/components/editor/chrome/panels/variable-panel.tsx +1 -5
  313. package/src/components/editor/chrome/types.ts +1 -1
  314. package/src/components/editor/chrome/wrapper/__tests__/attachment-status.test.tsx +7 -9
  315. package/src/components/editor/chrome/wrapper/__tests__/document-sync-status.test.tsx +92 -0
  316. package/src/components/editor/chrome/wrapper/__tests__/pending-ai-cells.test.tsx +265 -37
  317. package/src/components/editor/chrome/wrapper/__tests__/useAskAiAboutCell.test.tsx +58 -0
  318. package/src/components/editor/chrome/wrapper/app-chrome.tsx +91 -74
  319. package/src/components/editor/chrome/wrapper/footer-items/attachment-status.tsx +4 -4
  320. package/src/components/editor/chrome/wrapper/footer-items/backend-status.tsx +1 -1
  321. package/src/components/editor/chrome/wrapper/footer-items/document-sync-status.tsx +54 -0
  322. package/src/components/editor/chrome/wrapper/footer-items/lsp-status.tsx +1 -1
  323. package/src/components/editor/chrome/wrapper/footer-items/machine-stats.tsx +1 -1
  324. package/src/components/editor/chrome/wrapper/footer-items/runtime-settings.tsx +1 -7
  325. package/src/components/editor/chrome/wrapper/footer.tsx +2 -2
  326. package/src/components/editor/chrome/wrapper/minimap-state.ts +1 -1
  327. package/src/components/editor/chrome/wrapper/pending-ai-cells.tsx +143 -72
  328. package/src/components/editor/chrome/wrapper/pending-ai-changes-badge.tsx +25 -0
  329. package/src/components/editor/chrome/wrapper/sidebar.tsx +8 -4
  330. package/src/components/editor/chrome/wrapper/storage.ts +1 -1
  331. package/src/components/editor/chrome/wrapper/useAskAiAboutCell.ts +36 -0
  332. package/src/components/editor/columns/__tests__/cell-column.test.tsx +1 -1
  333. package/src/components/editor/columns/cell-column.tsx +1 -1
  334. package/src/components/editor/columns/sortable-column.tsx +2 -2
  335. package/src/components/editor/connections/components.tsx +5 -10
  336. package/src/components/editor/controls/Controls.tsx +4 -4
  337. package/src/components/editor/controls/__tests__/command-palette.test.tsx +53 -0
  338. package/src/components/editor/controls/__tests__/keyboard-shortcuts.test.tsx +61 -0
  339. package/src/components/editor/controls/__tests__/notebook-menu-dropdown.test.tsx +10 -4
  340. package/src/components/editor/controls/command-palette.tsx +22 -10
  341. package/src/components/editor/controls/keyboard-shortcuts.tsx +14 -5
  342. package/src/components/editor/documentation.css +34 -11
  343. package/src/components/editor/dynamic-favicon.tsx +21 -40
  344. package/src/components/editor/errors/__tests__/send-error-report-button.test.tsx +26 -22
  345. package/src/components/editor/errors/auto-fix.tsx +4 -8
  346. package/src/components/editor/errors/send-error-report-button.tsx +3 -6
  347. package/src/components/editor/file-tree/__tests__/file-explorer-interactions.test.tsx +6 -0
  348. package/src/components/editor/file-tree/__tests__/file-explorer-navigation.test.tsx +47 -0
  349. package/src/components/editor/file-tree/__tests__/use-file-search.test.tsx +91 -0
  350. package/src/components/editor/file-tree/file-explorer.tsx +48 -15
  351. package/src/components/editor/file-tree/file-name-input.tsx +1 -0
  352. package/src/components/editor/file-tree/file-viewer.tsx +4 -2
  353. package/src/components/editor/file-tree/use-file-search.ts +35 -21
  354. package/src/components/editor/header/__tests__/filename-form.test.tsx +1 -4
  355. package/src/components/editor/header/__tests__/status.test.tsx +5 -3
  356. package/src/components/editor/header/app-header.tsx +1 -1
  357. package/src/components/editor/header/filename-form.tsx +1 -1
  358. package/src/components/editor/header/status.tsx +44 -22
  359. package/src/components/editor/links/__tests__/cell-link.test.tsx +148 -0
  360. package/src/components/editor/links/cell-link-list.tsx +1 -1
  361. package/src/components/editor/links/cell-link.tsx +21 -11
  362. package/src/components/editor/navigation/__tests__/clipboard.test.ts +60 -38
  363. package/src/components/editor/navigation/__tests__/navigation.test.ts +108 -85
  364. package/src/components/editor/navigation/__tests__/selection.test.ts +43 -21
  365. package/src/components/editor/navigation/clipboard.ts +17 -14
  366. package/src/components/editor/navigation/focus-utils.ts +23 -4
  367. package/src/components/editor/navigation/multi-cell-action-toolbar.tsx +17 -33
  368. package/src/components/editor/navigation/navigation.ts +74 -72
  369. package/src/components/editor/navigation/selection.ts +30 -29
  370. package/src/components/editor/notebook-banner.tsx +1 -0
  371. package/src/components/editor/notebook-cell.tsx +126 -152
  372. package/src/components/editor/output/MarimoErrorOutput.tsx +2 -1
  373. package/src/components/editor/output/MarimoTracebackOutput.tsx +19 -17
  374. package/src/components/editor/output/Outputs.css +8 -0
  375. package/src/components/editor/output/VideoOutput.tsx +6 -0
  376. package/src/components/editor/output/__tests__/VideoOutput.test.tsx +131 -0
  377. package/src/components/editor/output/__tests__/traceback.test.tsx +27 -1
  378. package/src/components/editor/output/ansi-reduce.ts +33 -20
  379. package/src/components/editor/output/console/ConsoleOutput.tsx +19 -25
  380. package/src/components/editor/output/console/__tests__/ConsoleOutput.test.tsx +125 -69
  381. package/src/components/editor/package-alert.tsx +14 -7
  382. package/src/components/editor/renderers/__tests__/add-cell-buttons.test.tsx +18 -0
  383. package/src/components/editor/renderers/cell-array.tsx +32 -100
  384. package/src/components/editor/renderers/grid-layout/__tests__/grid-layout.test.tsx +75 -0
  385. package/src/components/editor/renderers/grid-layout/grid-layout.tsx +28 -22
  386. package/src/components/editor/renderers/slides-layout/__tests__/plugin.test.ts +0 -4
  387. package/src/components/editor/renderers/slides-layout/slides-layout.tsx +1 -1
  388. package/src/components/editor/renderers/vertical-layout/__tests__/useFocusFirstEditor.test.ts +4 -4
  389. package/src/components/editor/renderers/vertical-layout/sidebar/toggle.tsx +7 -1
  390. package/src/components/editor/renderers/vertical-layout/useFocusFirstEditor.ts +1 -1
  391. package/src/components/editor/renderers/vertical-layout/vertical-layout.tsx +19 -37
  392. package/src/components/editor/stdin-blocking-alert.tsx +4 -2
  393. package/src/components/home/components.tsx +17 -31
  394. package/src/components/icons/__tests__/large-spinner.test.tsx +39 -0
  395. package/src/components/icons/large-spinner.tsx +3 -14
  396. package/src/components/icons/spinner.tsx +1 -1
  397. package/src/components/markdown/markdown-renderer.tsx +39 -28
  398. package/src/components/mcp/mcp-status-indicator.tsx +18 -14
  399. package/src/components/pages/__tests__/home-page.test.tsx +116 -0
  400. package/src/components/pages/edit-page.tsx +19 -17
  401. package/src/components/pages/home-page.tsx +164 -91
  402. package/src/components/scratchpad/scratchpad.test.tsx +89 -0
  403. package/src/components/scratchpad/scratchpad.tsx +47 -33
  404. package/src/components/scratchpad/state.ts +7 -0
  405. package/src/components/slides/__tests__/minimap-actions.test.tsx +22 -29
  406. package/src/components/slides/__tests__/minimap.test.ts +38 -19
  407. package/src/components/slides/__tests__/slide-scroll-hint.test.tsx +37 -0
  408. package/src/components/slides/minimap.tsx +22 -14
  409. package/src/components/slides/reveal-component.tsx +73 -36
  410. package/src/components/slides/reveal-slides.css +5 -4
  411. package/src/components/slides/slide-cell-view.tsx +37 -34
  412. package/src/components/slides/slide-form.tsx +1 -0
  413. package/src/components/slides/slide-scroll-hint.tsx +3 -1
  414. package/src/components/slides/slide.tsx +3 -4
  415. package/src/components/sort/SortableCellsProvider.tsx +8 -25
  416. package/src/components/tracing/tracing-keyboard.test.tsx +85 -0
  417. package/src/components/tracing/tracing.tsx +46 -42
  418. package/src/components/ui/__tests__/draggable-popover.test.tsx +24 -0
  419. package/src/components/ui/__tests__/fullscreen.test.tsx +44 -2
  420. package/src/components/ui/__tests__/range-slider.test.tsx +165 -0
  421. package/src/components/ui/alert-dialog.tsx +1 -1
  422. package/src/components/ui/draggable-popover.tsx +24 -2
  423. package/src/components/ui/fullscreen.tsx +25 -1
  424. package/src/components/ui/range-slider.tsx +22 -9
  425. package/src/components/ui/toast.tsx +1 -1
  426. package/src/core/MarimoApp.tsx +3 -1
  427. package/src/core/ai/__tests__/staged-cells.test.ts +89 -608
  428. package/src/core/ai/context/context.ts +2 -0
  429. package/src/core/ai/context/providers/__tests__/cell-output.test.ts +8 -12
  430. package/src/core/ai/context/providers/__tests__/cell.test.ts +49 -0
  431. package/src/core/ai/context/providers/cell-output.ts +2 -2
  432. package/src/core/ai/context/providers/cell.ts +54 -0
  433. package/src/core/ai/context/providers/datasource.ts +6 -2
  434. package/src/core/ai/staged-cells.ts +56 -323
  435. package/src/core/ai/state.ts +3 -0
  436. package/src/core/ai/tools/__tests__/edit-notebook-tool.test.ts +40 -88
  437. package/src/core/ai/tools/__tests__/registry.test.ts +17 -0
  438. package/src/core/ai/tools/base.ts +18 -15
  439. package/src/core/ai/tools/edit-notebook-tool.ts +86 -80
  440. package/src/core/ai/tools/registry.ts +13 -10
  441. package/src/core/ai/tools/sample-tool.ts +6 -7
  442. package/src/core/cells/__tests__/__snapshots__/cells.test.ts.snap +4 -527
  443. package/src/core/cells/__tests__/actions.test.ts +623 -35
  444. package/src/core/cells/__tests__/add-missing-import.test.ts +7 -8
  445. package/src/core/cells/__tests__/arrange.test.ts +432 -0
  446. package/src/core/cells/__tests__/cell.test.ts +148 -150
  447. package/src/core/cells/__tests__/cells.test.ts +390 -2925
  448. package/src/core/cells/__tests__/collapseConsoleOutputs.test.ts +54 -0
  449. package/src/core/cells/__tests__/document.test.ts +158 -0
  450. package/src/core/cells/__tests__/editor.test.ts +57 -0
  451. package/src/core/cells/__tests__/flush-document.test.ts +40 -0
  452. package/src/core/cells/__tests__/harness.ts +106 -0
  453. package/src/core/cells/__tests__/layout.test.ts +176 -0
  454. package/src/core/cells/__tests__/logs.test.ts +0 -13
  455. package/src/core/cells/__tests__/notebook-outline.test.ts +122 -0
  456. package/src/core/cells/__tests__/outputs.test.tsx +71 -53
  457. package/src/core/cells/__tests__/pending-delete-service.test.tsx +11 -20
  458. package/src/core/cells/__tests__/session.test.ts +445 -211
  459. package/src/core/cells/__tests__/utils.test.ts +135 -337
  460. package/src/core/cells/actions.ts +677 -6
  461. package/src/core/cells/add-missing-import.ts +47 -43
  462. package/src/core/cells/arrange.ts +529 -0
  463. package/src/core/cells/cell.ts +78 -146
  464. package/src/core/cells/cells.ts +116 -1457
  465. package/src/core/cells/columns.ts +38 -0
  466. package/src/core/cells/document.ts +167 -0
  467. package/src/core/cells/edit.ts +30 -0
  468. package/src/core/cells/editor.ts +82 -0
  469. package/src/core/cells/focus.ts +27 -6
  470. package/src/core/cells/layout.ts +221 -0
  471. package/src/core/cells/outputs.ts +12 -28
  472. package/src/core/cells/pending-delete-service.ts +8 -14
  473. package/src/core/cells/scrollCellIntoView.ts +6 -0
  474. package/src/core/cells/session.ts +76 -53
  475. package/src/core/cells/types.ts +21 -51
  476. package/src/core/cells/utils.ts +85 -87
  477. package/src/core/codemirror/__tests__/format.test.ts +0 -34
  478. package/src/core/codemirror/__tests__/setup.test.ts +61 -29
  479. package/src/core/codemirror/ai/__tests__/resources.test.ts +117 -0
  480. package/src/core/codemirror/ai/resources.ts +1 -1
  481. package/src/core/codemirror/cells/__tests__/extensions.test.ts +2 -6
  482. package/src/core/codemirror/cells/extensions.ts +18 -30
  483. package/src/core/codemirror/cells/state.ts +2 -6
  484. package/src/core/codemirror/cm.ts +5 -1
  485. package/src/core/codemirror/config/types.ts +1 -1
  486. package/src/core/codemirror/copilot/__tests__/getCodes.test.ts +6 -7
  487. package/src/core/codemirror/copilot/getCodes.ts +2 -2
  488. package/src/core/codemirror/format.ts +6 -23
  489. package/src/core/codemirror/keymaps/vim.ts +4 -8
  490. package/src/core/codemirror/language/__tests__/sql.test.ts +22 -20
  491. package/src/core/codemirror/language/__tests__/utils.test.ts +187 -15
  492. package/src/core/codemirror/language/cell-code.ts +114 -0
  493. package/src/core/codemirror/language/extension.ts +52 -35
  494. package/src/core/codemirror/language/languages/markdown.ts +8 -6
  495. package/src/core/codemirror/language/languages/python.ts +19 -13
  496. package/src/core/codemirror/language/languages/sql/sql.ts +16 -24
  497. package/src/core/codemirror/language/panel/panel.tsx +1 -0
  498. package/src/core/codemirror/language/types.ts +7 -7
  499. package/src/core/codemirror/language/utils.ts +9 -39
  500. package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +1 -2
  501. package/src/core/codemirror/lsp/notebook-lsp.ts +6 -5
  502. package/src/core/codemirror/lsp/utils.ts +1 -1
  503. package/src/core/codemirror/misc/__tests__/paste.test.ts +3 -1
  504. package/src/core/codemirror/misc/paste.ts +1 -1
  505. package/src/core/codemirror/placeholder/__tests__/extensions.test.ts +75 -0
  506. package/src/core/codemirror/placeholder/extensions.ts +80 -19
  507. package/src/core/codemirror/readonly/__tests__/extension.test.ts +1 -1
  508. package/src/core/codemirror/readonly/extension.ts +2 -2
  509. package/src/core/codemirror/utils.ts +1 -0
  510. package/src/core/config/__tests__/app-config.test.ts +64 -0
  511. package/src/core/config/__tests__/config-schema.test.ts +56 -6
  512. package/src/core/config/config-schema.ts +17 -4
  513. package/src/core/config/config.ts +65 -20
  514. package/src/core/config/feature-flag.tsx +0 -2
  515. package/src/core/datasets/__tests__/data-source-discovery.test.ts +5 -5
  516. package/src/core/datasets/data-source-discovery.ts +4 -6
  517. package/src/core/documentation/doc-lookup.ts +1 -1
  518. package/src/core/edit-app.tsx +22 -28
  519. package/src/core/errors/__tests__/error-entries.test.ts +40 -1
  520. package/src/core/errors/error-entries.ts +6 -4
  521. package/src/core/executions/__tests__/atoms.test.ts +98 -0
  522. package/src/core/executions/__tests__/freshness.test.ts +482 -0
  523. package/src/core/executions/__tests__/hooks.test.tsx +106 -0
  524. package/src/core/executions/__tests__/select.test.ts +268 -0
  525. package/src/core/executions/atoms.ts +228 -0
  526. package/src/core/executions/freshness.ts +171 -0
  527. package/src/core/executions/hooks.ts +47 -0
  528. package/src/core/executions/index.ts +33 -0
  529. package/src/core/executions/select.ts +175 -0
  530. package/src/core/export/__tests__/hooks.test.ts +0 -5
  531. package/src/core/export/hooks.ts +1 -1
  532. package/src/core/export/layout.ts +2 -2
  533. package/src/core/hotkeys/actions.ts +2 -4
  534. package/src/core/hotkeys/hotkeys.ts +2 -1
  535. package/src/core/islands/__tests__/bootstrap.test.ts +69 -17
  536. package/src/core/islands/__tests__/bridge.test.ts +85 -27
  537. package/src/core/islands/bootstrap.ts +49 -54
  538. package/src/core/islands/bridge.ts +84 -25
  539. package/src/core/islands/components/__tests__/IslandControls.test.tsx +7 -5
  540. package/src/core/islands/components/__tests__/web-components.test.tsx +63 -0
  541. package/src/core/islands/components/output-wrapper.tsx +5 -5
  542. package/src/core/islands/components/web-components.tsx +12 -1
  543. package/src/core/islands/worker/__tests__/controller.test.ts +62 -4
  544. package/src/core/islands/worker/controller.ts +4 -10
  545. package/src/core/islands/worker/worker.tsx +33 -33
  546. package/src/core/kernel/__tests__/RuntimeState.test.ts +1 -1
  547. package/src/core/kernel/__tests__/handlers.test.ts +7 -157
  548. package/src/core/kernel/handlers.ts +13 -79
  549. package/src/core/kernel/state.ts +0 -15
  550. package/src/core/lifecycle/render-policy.ts +12 -26
  551. package/src/core/meta/__tests__/code-visibility.test.tsx +78 -70
  552. package/src/core/meta/code-visibility.ts +18 -9
  553. package/src/core/network/__tests__/connection.test.ts +1 -1
  554. package/src/core/network/__tests__/requests-lazy.test.ts +6 -8
  555. package/src/core/network/connection-notice.ts +1 -1
  556. package/src/core/network/connection.ts +1 -1
  557. package/src/core/network/requests-lazy.ts +5 -8
  558. package/src/core/network/requests-network.ts +5 -31
  559. package/src/core/network/requests-static.ts +1 -4
  560. package/src/core/network/requests-toasting.tsx +1 -4
  561. package/src/core/network/types.ts +6 -14
  562. package/src/core/network/useConnectionNotice.ts +8 -2
  563. package/src/core/notebook/__tests__/operations.test.ts +51 -0
  564. package/src/core/notebook/attachments.ts +38 -0
  565. package/src/core/notebook/document/__tests__/codemirror.test.ts +759 -0
  566. package/src/core/notebook/document/__tests__/draft.test.ts +363 -0
  567. package/src/core/notebook/document/__tests__/fixtures.ts +92 -0
  568. package/src/core/notebook/document/__tests__/hooks.test.tsx +391 -0
  569. package/src/core/notebook/document/__tests__/lifecycle-scenarios.test.ts +61 -0
  570. package/src/core/notebook/document/__tests__/model.test.ts +247 -0
  571. package/src/core/notebook/document/__tests__/protocol-fixtures.ts +38 -0
  572. package/src/core/notebook/document/__tests__/recovery-scenarios.test.ts +230 -0
  573. package/src/core/notebook/document/__tests__/scenario-fixture.ts +43 -0
  574. package/src/core/notebook/document/__tests__/scenarios.test.ts +205 -0
  575. package/src/core/notebook/document/__tests__/state.test.ts +459 -0
  576. package/src/core/notebook/document/__tests__/submission.test.ts +203 -0
  577. package/src/core/notebook/document/__tests__/test-host.test.ts +92 -0
  578. package/src/core/notebook/document/__tests__/test-host.ts +247 -0
  579. package/src/core/notebook/document/__tests__/test-notebook.ts +149 -0
  580. package/src/core/notebook/document/__tests__/user.ts +61 -0
  581. package/src/core/notebook/document/codemirror.ts +216 -0
  582. package/src/core/notebook/document/draft.ts +502 -0
  583. package/src/core/notebook/document/hooks.tsx +118 -0
  584. package/src/core/notebook/document/index.ts +24 -0
  585. package/src/core/notebook/document/model.ts +102 -0
  586. package/src/core/notebook/document/select.ts +41 -0
  587. package/src/core/notebook/document/state.ts +378 -0
  588. package/src/core/notebook/document/sync.ts +369 -0
  589. package/src/core/notebook/index.ts +19 -0
  590. package/src/core/notebook/operations.ts +30 -0
  591. package/src/core/notebook/replica/AGENTS.md +11 -0
  592. package/src/core/{host → notebook/replica}/__tests__/attachments.test.ts +9 -10
  593. package/src/core/{host → notebook/replica}/__tests__/document.test.ts +18 -16
  594. package/src/core/notebook/replica/__tests__/executions.test.ts +200 -0
  595. package/src/core/notebook/replica/__tests__/fixtures.ts +79 -0
  596. package/src/core/notebook/replica/__tests__/replica.test.ts +559 -0
  597. package/src/core/notebook/replica/__tests__/results.test.ts +193 -0
  598. package/src/core/notebook/replica/__tests__/runtime.test.ts +78 -0
  599. package/src/core/notebook/replica/backend.ts +19 -0
  600. package/src/core/notebook/replica/connection.ts +42 -0
  601. package/src/core/notebook/replica/index.ts +20 -0
  602. package/src/core/notebook/replica/replica.ts +336 -0
  603. package/src/core/{host → notebook/replica}/resources/attachments.ts +6 -3
  604. package/src/core/{host → notebook/replica}/resources/document.ts +3 -3
  605. package/src/core/notebook/replica/resources/executions.ts +157 -0
  606. package/src/core/notebook/replica/resources/results.ts +48 -0
  607. package/src/core/notebook/replica/resources/runtime.ts +14 -0
  608. package/src/core/packages/__tests__/useSandboxController.test.tsx +1 -1
  609. package/src/core/packages/useSandboxController.ts +1 -1
  610. package/src/core/run-app.tsx +49 -51
  611. package/src/core/runtime/__tests__/adapter.test.ts +4 -4
  612. package/src/core/runtime/__tests__/createWsUrl.test.ts +77 -7
  613. package/src/core/runtime/__tests__/runtime.test.ts +32 -74
  614. package/src/core/runtime/adapter.ts +5 -5
  615. package/src/core/runtime/config.ts +2 -2
  616. package/src/core/runtime/runtime.ts +33 -46
  617. package/src/core/runtime/types.ts +0 -2
  618. package/src/core/saving/__tests__/document.test.tsx +123 -0
  619. package/src/core/saving/__tests__/state.test.ts +111 -0
  620. package/src/core/saving/__tests__/useAutoSave.test.tsx +67 -0
  621. package/src/core/saving/document.ts +33 -0
  622. package/src/core/saving/filename.ts +1 -1
  623. package/src/core/saving/save-component.tsx +39 -60
  624. package/src/core/saving/state.ts +38 -39
  625. package/src/core/saving/useAutoSave.ts +17 -53
  626. package/src/core/session/__tests__/backend.test.ts +236 -0
  627. package/src/core/session/__tests__/useNotebookReplica.hook.test.tsx +186 -0
  628. package/src/core/{websocket → session}/__tests__/useNotebookSession.hook.test.tsx +245 -262
  629. package/src/core/session/active-notebook.ts +28 -0
  630. package/src/core/session/backend.ts +123 -0
  631. package/src/core/session/embedded.ts +7 -0
  632. package/src/core/{websocket → session}/types.ts +2 -2
  633. package/src/core/session/useNotebookReplica.ts +74 -0
  634. package/src/core/{websocket → session}/useNotebookSession.tsx +80 -67
  635. package/src/core/state/__tests__/jotai.test.tsx +108 -0
  636. package/src/core/state/jotai.ts +1 -1
  637. package/src/core/static/__tests__/files.test.ts +38 -10
  638. package/src/core/static/files.ts +2 -0
  639. package/src/core/{websocket → transports}/__tests__/connection-state.test.ts +1 -13
  640. package/src/core/transports/__tests__/server.test.ts +408 -0
  641. package/src/core/transports/__tests__/static.test.ts +306 -0
  642. package/src/core/transports/__tests__/wasm.test.ts +166 -0
  643. package/src/core/{websocket → transports}/connection-state.ts +9 -16
  644. package/src/core/transports/server.ts +152 -0
  645. package/src/core/transports/static.ts +166 -0
  646. package/src/core/transports/wasm.ts +97 -0
  647. package/src/core/vscode/__tests__/vscode-bindings.test.ts +125 -0
  648. package/src/core/vscode/vscode-bindings.ts +14 -2
  649. package/src/core/wasm/__tests__/bridge.test.ts +210 -64
  650. package/src/core/wasm/__tests__/worker.test.ts +188 -0
  651. package/src/core/wasm/bridge.ts +120 -73
  652. package/src/core/wasm/rpc.ts +15 -3
  653. package/src/core/wasm/store.ts +3 -3
  654. package/src/core/wasm/worker/bootstrap.ts +55 -51
  655. package/src/core/wasm/worker/getMarimoWheel.ts +1 -1
  656. package/src/core/wasm/worker/save-worker.ts +9 -10
  657. package/src/core/wasm/worker/types.ts +30 -18
  658. package/src/core/wasm/worker/worker.ts +118 -72
  659. package/src/css/app/Cell.css +7 -36
  660. package/src/css/app/codemirror.css +1 -1
  661. package/src/css/common.css +1 -1
  662. package/src/css/globals.css +72 -24
  663. package/src/hooks/__tests__/useAsyncData.test.tsx +148 -0
  664. package/src/hooks/__tests__/useDebounce.test.tsx +51 -0
  665. package/src/hooks/__tests__/useDeepCompareMemoize.test.tsx +39 -0
  666. package/src/hooks/__tests__/useDelayElapsed.test.tsx +28 -0
  667. package/src/hooks/__tests__/useInternalStateWithSync.test.tsx +20 -0
  668. package/src/hooks/__tests__/useScript.test.tsx +77 -0
  669. package/src/hooks/__tests__/useStateForKey.test.tsx +257 -0
  670. package/src/hooks/useAsyncData.ts +3 -3
  671. package/src/hooks/useDataSourceDiscovery.ts +6 -4
  672. package/src/hooks/useDebounce.ts +6 -10
  673. package/src/hooks/useDeepCompareMemoize.ts +1 -1
  674. package/src/hooks/useDelayElapsed.ts +14 -10
  675. package/src/hooks/useElapsedTime.ts +3 -3
  676. package/src/hooks/useEventListener.ts +1 -2
  677. package/src/hooks/useInputHistory.ts +4 -7
  678. package/src/hooks/useInternalStateWithSync.ts +6 -6
  679. package/src/hooks/useResizeObserver.ts +4 -7
  680. package/src/hooks/useScript.ts +67 -70
  681. package/src/hooks/useStateForKey.ts +93 -0
  682. package/src/mount.tsx +20 -15
  683. package/src/plugins/__tests__/plugin-object-schemas.test.ts +104 -0
  684. package/src/plugins/core/RenderHTML.tsx +3 -5
  685. package/src/plugins/core/__test__/RenderHTML-copy.test.tsx +60 -0
  686. package/src/plugins/core/registerReactComponent.tsx +5 -14
  687. package/src/plugins/impl/CodeEditorPlugin.tsx +1 -1
  688. package/src/plugins/impl/DataEditorPlugin.tsx +34 -13
  689. package/src/plugins/impl/DataTablePlugin.tsx +69 -37
  690. package/src/plugins/impl/DropdownPlugin.tsx +2 -6
  691. package/src/plugins/impl/FileBrowserPlugin.tsx +4 -16
  692. package/src/plugins/impl/FormPlugin.tsx +1 -1
  693. package/src/plugins/impl/RangeSliderPlugin.tsx +16 -2
  694. package/src/plugins/impl/RefreshPlugin.tsx +1 -0
  695. package/src/plugins/impl/SliderPlugin.tsx +6 -8
  696. package/src/plugins/impl/__tests__/DataEditorPlugin.test.ts +93 -4
  697. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +387 -1
  698. package/src/plugins/impl/__tests__/FileBrowserPlugin.test.tsx +45 -0
  699. package/src/plugins/impl/__tests__/RangeSliderPlugin.test.tsx +109 -0
  700. package/src/plugins/impl/__tests__/SliderPlugin.test.tsx +24 -3
  701. package/src/plugins/impl/anywidget/__tests__/registry.test.ts +153 -0
  702. package/src/plugins/impl/anywidget/__tests__/widget-binding.test.ts +241 -2
  703. package/src/plugins/impl/anywidget/model.ts +3 -1
  704. package/src/plugins/impl/anywidget/registry.ts +18 -14
  705. package/src/plugins/impl/anywidget/runtime.ts +21 -9
  706. package/src/plugins/impl/anywidget/widget-binding.ts +160 -82
  707. package/src/plugins/impl/chat/__tests__/chat-prompts.test.tsx +93 -0
  708. package/src/plugins/impl/chat/chat-ui.tsx +17 -15
  709. package/src/plugins/impl/code/any-language-editor.tsx +2 -2
  710. package/src/plugins/impl/common/error-banner.tsx +5 -3
  711. package/src/plugins/impl/data-editor/__tests__/column-types.test.ts +42 -0
  712. package/src/plugins/impl/data-editor/__tests__/editor-state.test.ts +52 -1
  713. package/src/plugins/impl/data-editor/__tests__/glide-data-editor.test.tsx +120 -4
  714. package/src/plugins/impl/data-editor/__tests__/glide-utils.test.ts +116 -0
  715. package/src/plugins/impl/data-editor/column-types.ts +55 -0
  716. package/src/plugins/impl/data-editor/editor-state.ts +18 -2
  717. package/src/plugins/impl/data-editor/glide-data-editor.tsx +74 -12
  718. package/src/plugins/impl/data-editor/glide-utils.ts +39 -38
  719. package/src/plugins/impl/data-editor/types.ts +5 -0
  720. package/src/plugins/impl/data-explorer/ConnectedDataExplorerComponent.tsx +1 -1
  721. package/src/plugins/impl/data-explorer/components/column-summary.tsx +4 -2
  722. package/src/plugins/impl/data-explorer/state/reducer.ts +1 -1
  723. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +1 -2
  724. package/src/plugins/impl/data-frames/__tests__/sidebar.test.tsx +160 -0
  725. package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +66 -66
  726. package/src/plugins/impl/data-frames/panel.tsx +44 -16
  727. package/src/plugins/impl/mpl-interactive/MplInteractivePlugin.tsx +5 -3
  728. package/src/plugins/impl/panel/PanelPlugin.tsx +16 -17
  729. package/src/plugins/impl/panel/__tests__/utils.test.ts +39 -1
  730. package/src/plugins/impl/panel/utils.ts +17 -0
  731. package/src/plugins/impl/plotly/PlotlyPlugin.tsx +2 -5
  732. package/src/plugins/impl/plotly/selection.ts +25 -19
  733. package/src/plugins/impl/vega/VegaPlugin.tsx +2 -3
  734. package/src/plugins/impl/vega/make-selectable.ts +4 -7
  735. package/src/plugins/layout/DownloadPlugin.tsx +7 -11
  736. package/src/plugins/layout/RoutesPlugin.tsx +1 -1
  737. package/src/plugins/layout/__test__/DownloadPlugin.test.tsx +205 -0
  738. package/src/stories/__tests__/editor-story.test.tsx +33 -0
  739. package/src/stories/button.stories.tsx +1 -0
  740. package/src/stories/cell-status.stories.tsx +29 -24
  741. package/src/stories/cell.stories.tsx +46 -46
  742. package/src/stories/data-table.stories.tsx +31 -0
  743. package/src/stories/editor.stories.tsx +24 -17
  744. package/src/stories/form-wrapper.stories.tsx +2 -2
  745. package/src/stories/layout/vertical/one-column.stories.tsx +28 -42
  746. package/src/stories/runtime-story.tsx +23 -17
  747. package/src/stories/select.stories.tsx +2 -2
  748. package/src/stories/switchable-multi-select.stories.tsx +1 -1
  749. package/src/theme/__tests__/islands-theme.test.tsx +276 -0
  750. package/src/theme/namespace.tsx +4 -3
  751. package/src/theme/useTheme.ts +71 -41
  752. package/src/utils/__tests__/arrays.test.ts +35 -0
  753. package/src/utils/__tests__/batch-requests.test.ts +3 -3
  754. package/src/utils/__tests__/{createReducer.test.ts → createReducer.test.tsx} +127 -1
  755. package/src/utils/__tests__/download.test.tsx +183 -23
  756. package/src/utils/__tests__/numbers.test.ts +105 -1
  757. package/src/utils/__tests__/objects.test.ts +21 -0
  758. package/src/utils/arrays.ts +11 -2
  759. package/src/utils/blob.ts +1 -1
  760. package/src/utils/createReducer.ts +115 -79
  761. package/src/utils/download.ts +67 -6
  762. package/src/utils/maps.ts +0 -3
  763. package/src/utils/numbers.ts +79 -18
  764. package/src/utils/objects.ts +4 -9
  765. package/src/utils/time.ts +10 -0
  766. package/src/utils/tracer.ts +9 -5
  767. package/src/utils/zod-utils.ts +1 -3
  768. package/dist/_baseMerge-BiGRwuqv.js +0 -165
  769. package/dist/any-language-editor-D4q-IFcM.js +0 -76
  770. package/dist/assets/__vite-browser-external-BXYkiFsk.js +0 -1
  771. package/dist/assets/worker-HPY9fbhz.js +0 -114
  772. package/dist/feedback-button-g9eH5l7Q.js +0 -379
  773. package/dist/hasIn-o2Us0uVx.js +0 -132
  774. package/dist/html-to-image-B5H-xKRH.js +0 -3251
  775. package/dist/isArrayLikeObject-BZl-15ir.js +0 -450
  776. package/dist/isEmpty-BSZ1LaUo.js +0 -35
  777. package/dist/isSymbol-kQcfYbNX.js +0 -8
  778. package/dist/label-DoysmLMW.js +0 -281
  779. package/dist/pick-CJeoxYOS.js +0 -51
  780. package/dist/select-DemoKT4G.js +0 -1344
  781. package/dist/toDate-BvdkR0aH.js +0 -1185
  782. package/dist/toast-PkdZraM8.js +0 -1830
  783. package/dist/use-restore-focus-CKjfFjLM.js +0 -6369
  784. package/dist/useLifecycle-Dfq8UD-b.js +0 -169
  785. package/dist/useTheme-Bu5bBgrh.js +0 -904
  786. package/src/components/chat/reasoning-accordion.tsx +0 -61
  787. package/src/components/chat/tool-call/tool-error-card.tsx +0 -81
  788. package/src/components/chat/tool-call/tool-history-row.tsx +0 -174
  789. package/src/components/editor/ai/__tests__/staged-cell-submission.test.ts +0 -106
  790. package/src/components/editor/ai/add-cell-with-ai.tsx +0 -506
  791. package/src/components/editor/ai/staged-cell-submission.ts +0 -46
  792. package/src/components/editor/cell/__tests__/StagedAICell.test.tsx +0 -64
  793. package/src/components/editor/cell/code/__tests__/rtc-editor-config.test.ts +0 -50
  794. package/src/components/editor/chrome/wrapper/footer-items/rtc-status.tsx +0 -65
  795. package/src/components/editor/navigation/__tests__/state.test.ts +0 -81
  796. package/src/components/editor/navigation/state.ts +0 -65
  797. package/src/components/icons/loading-ellipsis.tsx +0 -46
  798. package/src/core/ai/tools/__tests__/run-cells-tool.test.ts +0 -656
  799. package/src/core/ai/tools/run-cells-tool.ts +0 -303
  800. package/src/core/attachments/state.ts +0 -18
  801. package/src/core/cells/__tests__/apply-transaction.test.ts +0 -991
  802. package/src/core/cells/__tests__/document-changes.test.ts +0 -1140
  803. package/src/core/cells/__tests__/document-roundtrip.test.ts +0 -392
  804. package/src/core/cells/document-changes.ts +0 -944
  805. package/src/core/codemirror/rtc/extension.ts +0 -453
  806. package/src/core/codemirror/rtc/loro/__tests__/sync.test.ts +0 -52
  807. package/src/core/codemirror/rtc/loro/awareness.ts +0 -531
  808. package/src/core/codemirror/rtc/loro/colors.ts +0 -38
  809. package/src/core/codemirror/rtc/loro/sync.ts +0 -168
  810. package/src/core/host/AGENTS.md +0 -11
  811. package/src/core/host/__tests__/events.test.ts +0 -46
  812. package/src/core/host/__tests__/fixtures.ts +0 -39
  813. package/src/core/host/__tests__/notebook-client.test.ts +0 -433
  814. package/src/core/host/__tests__/protocol.test.ts +0 -214
  815. package/src/core/host/__tests__/stream.test.ts +0 -209
  816. package/src/core/host/connection.ts +0 -81
  817. package/src/core/host/events.ts +0 -61
  818. package/src/core/host/notebook-client.ts +0 -290
  819. package/src/core/host/protocol.ts +0 -1945
  820. package/src/core/host/resources/resource.ts +0 -47
  821. package/src/core/host/stream.ts +0 -211
  822. package/src/core/rtc/state.ts +0 -34
  823. package/src/core/state/__tests__/jotai.test.ts +0 -25
  824. package/src/core/wasm/worker/message-buffer.ts +0 -33
  825. package/src/core/websocket/__tests__/createConnectionTransport.test.ts +0 -49
  826. package/src/core/websocket/__tests__/useNotebookClient.hook.test.tsx +0 -170
  827. package/src/core/websocket/state.ts +0 -7
  828. package/src/core/websocket/transports/__tests__/basic.test.ts +0 -275
  829. package/src/core/websocket/transports/__tests__/sse.test.ts +0 -335
  830. package/src/core/websocket/transports/__tests__/transport.test.ts +0 -308
  831. package/src/core/websocket/transports/__tests__/ws.test.ts +0 -125
  832. package/src/core/websocket/transports/basic.ts +0 -102
  833. package/src/core/websocket/transports/create.ts +0 -31
  834. package/src/core/websocket/transports/sse.ts +0 -308
  835. package/src/core/websocket/transports/transport.ts +0 -50
  836. package/src/core/websocket/transports/ws.ts +0 -98
  837. package/src/core/websocket/useNotebookClient.ts +0 -88
  838. package/src/utils/__tests__/id-tree.test.ts +0 -2145
  839. package/src/utils/id-tree.tsx +0 -1134
  840. /package/src/{core/attachments/toast.ts → components/editor/agent-toast.ts} +0 -0
  841. /package/src/core/{websocket → session}/connection-utils.ts +0 -0
@@ -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> {
@@ -3,14 +3,15 @@
3
3
  import type { EditorView } from "@codemirror/view";
4
4
  import { z } from "zod";
5
5
  import { scrollAndHighlightCell } from "@/components/editor/links/cell-link";
6
- import {
7
- type CellPosition as NotebookCellPosition,
8
- type NotebookState,
9
- notebookAtom,
10
- } from "@/core/cells/cells";
6
+ import { type NotebookState, notebookAtom } from "@/core/cells/cells";
7
+ import type { CreateCellOptions } from "@/core/cells/actions";
11
8
  import { CellId } from "@/core/cells/ids";
12
- import { updateEditorCodeFromPython } from "@/core/codemirror/language/utils";
13
- import type { CellColumnId } from "@/utils/id-tree";
9
+ import { prepareCellCodeUpdate } from "@/core/codemirror/language/cell-code";
10
+ import {
11
+ type CellColumnId,
12
+ type Layout,
13
+ layoutAtom,
14
+ } from "@/core/cells/layout";
14
15
  import { stagedAICellsAtom } from "../staged-cells";
15
16
  import {
16
17
  type AiTool,
@@ -24,7 +25,7 @@ import type { CopilotMode } from "./registry";
24
25
 
25
26
  const description: ToolDescription = {
26
27
  baseDescription:
27
- "Perform editing operations on the current notebook. You should prefer to create new cells unless you need to edit existing cells. Call this tool multiple times to perform multiple edits. Separate code into logical individual cells to take advantage of the notebook's reactive execution model.",
28
+ "Propose cell edits for the user to review in the current notebook. You should prefer to create new cells unless you need to edit existing cells. Call this tool multiple times to perform multiple edits. Separate code into logical individual cells to take advantage of the notebook's reactive execution model.",
28
29
  prerequisites: [
29
30
  "If you are updating existing cells, you need the cellIds. If they are not known, call the lightweight_cell_map_tool to find out.",
30
31
  ],
@@ -86,7 +87,7 @@ export class EditNotebookTool implements AiTool<
86
87
  { edit }: EditNotebookInput,
87
88
  toolContext: ToolNotebookContext,
88
89
  ): Promise<ToolOutputBase> => {
89
- const { addStagedCell, createNewCell, store } = toolContext;
90
+ const { addStagedCell, createCell, store } = toolContext;
90
91
 
91
92
  switch (edit.type) {
92
93
  case "update_cell": {
@@ -94,19 +95,17 @@ export class EditNotebookTool implements AiTool<
94
95
  const cellId = position.cellId as CellId | undefined;
95
96
 
96
97
  if (!cellId) {
97
- throw new ToolExecutionError(
98
- "Cell ID is required for update_cell",
99
- "CELL_ID_REQUIRED_FOR_UPDATE_CELL",
100
- true,
101
- "Provide a cell ID to update",
102
- );
98
+ throw new ToolExecutionError("Cell ID is required for update_cell", {
99
+ code: "CELL_ID_REQUIRED_FOR_UPDATE_CELL",
100
+ isRetryable: true,
101
+ suggestedFix: "Provide a cell ID to update",
102
+ });
103
103
  } else if (!code) {
104
- throw new ToolExecutionError(
105
- "Code is required for update_cell",
106
- "CODE_REQUIRED_FOR_UPDATE_CELL",
107
- true,
108
- "Provide the new code to update the cell",
109
- );
104
+ throw new ToolExecutionError("Code is required for update_cell", {
105
+ code: "CODE_REQUIRED_FOR_UPDATE_CELL",
106
+ isRetryable: true,
107
+ suggestedFix: "Provide the new code to update the cell",
108
+ });
110
109
  }
111
110
 
112
111
  const notebook = store.get(notebookAtom);
@@ -119,7 +118,12 @@ export class EditNotebookTool implements AiTool<
119
118
 
120
119
  // If previous edit was from a new cell, just replace editor code with the new code
121
120
  if (existingStagedCell?.type === "add_cell") {
122
- updateEditorCodeFromPython(editorView, code);
121
+ const update = prepareCellCodeUpdate(editorView.state, code, {
122
+ initialize: true,
123
+ });
124
+ if (update) {
125
+ editorView.dispatch(update);
126
+ }
123
127
  break;
124
128
  }
125
129
 
@@ -139,15 +143,20 @@ export class EditNotebookTool implements AiTool<
139
143
  edit: { type: "update_cell", previousCode: previousCode },
140
144
  });
141
145
 
142
- updateEditorCodeFromPython(editorView, code);
146
+ const update = prepareCellCodeUpdate(editorView.state, code, {
147
+ initialize: true,
148
+ });
149
+
150
+ if (update) {
151
+ editorView.dispatch(update);
152
+ }
143
153
 
144
154
  break;
145
155
  }
146
156
  case "add_cell": {
147
157
  const { position, code } = edit;
148
158
 
149
- let notebookPosition: NotebookCellPosition = "__end__";
150
- let before = false;
159
+ let placement: CreateCellOptions = {};
151
160
  const newCellId = CellId.create();
152
161
  const notebook = store.get(notebookAtom);
153
162
 
@@ -157,51 +166,57 @@ export class EditNotebookTool implements AiTool<
157
166
  if (!cellId) {
158
167
  throw new ToolExecutionError(
159
168
  "Cell ID is required for add_cell with relative position",
160
- "TOOL_ERROR",
161
- true,
162
- "Provide a cell ID to add the cell before",
169
+ {
170
+ code: "TOOL_ERROR",
171
+ isRetryable: true,
172
+ suggestedFix: "Provide a cell ID to add the cell before",
173
+ },
163
174
  );
164
175
  }
165
176
 
166
177
  if (position.before === undefined) {
167
178
  throw new ToolExecutionError(
168
179
  "Before is required for add_cell with relative position",
169
- "TOOL_ERROR",
170
- true,
171
- `Provide a boolean value for before, true to add before cell ${cellId}, false to add after the cell`,
180
+ {
181
+ code: "TOOL_ERROR",
182
+ isRetryable: true,
183
+ suggestedFix: `Provide a boolean value for before, true to add before cell ${cellId}, false to add after the cell`,
184
+ },
172
185
  );
173
186
  }
174
187
 
175
188
  this.validateCellIdExists(cellId, notebook);
176
- notebookPosition = cellId;
177
- before = position.before;
189
+ placement = position.before
190
+ ? { before: cellId }
191
+ : { after: cellId };
178
192
  break;
179
193
  }
180
- case "column_end": {
194
+ case "column_end":
181
195
  if (!position.columnIndex) {
182
196
  throw new ToolExecutionError(
183
197
  "Column index is required for add_cell with column_end position",
184
- "TOOL_ERROR",
185
- true,
186
- "Provide a column index to add the cell at the end of",
198
+ {
199
+ code: "TOOL_ERROR",
200
+ isRetryable: true,
201
+ suggestedFix:
202
+ "Provide a column index to add the cell at the end of",
203
+ },
187
204
  );
188
205
  }
189
206
 
190
- const columnId = this.getColumnId(position.columnIndex, notebook);
191
- notebookPosition = { type: "__end__", columnId };
207
+ placement = {
208
+ endOf: this.getColumnId(
209
+ position.columnIndex,
210
+ store.get(layoutAtom),
211
+ ),
212
+ };
192
213
  break;
193
- }
214
+
194
215
  case "notebook_end":
195
- // Use default: notebookPosition = "__end__"
196
216
  break;
197
217
  }
198
218
 
199
- createNewCell({
200
- cellId: notebookPosition,
201
- before,
202
- code,
203
- newCellId,
204
- });
219
+ createCell({ ...placement, code, id: newCellId });
205
220
 
206
221
  addStagedCell({
207
222
  cellId: newCellId,
@@ -218,12 +233,11 @@ export class EditNotebookTool implements AiTool<
218
233
  const cellId = position.cellId as CellId | undefined;
219
234
 
220
235
  if (!cellId) {
221
- throw new ToolExecutionError(
222
- "Cell ID is required for delete_cell",
223
- "CELL_ID_REQUIRED_FOR_DELETE_CELL",
224
- true,
225
- "Provide a cell ID to delete",
226
- );
236
+ throw new ToolExecutionError("Cell ID is required for delete_cell", {
237
+ code: "CELL_ID_REQUIRED_FOR_DELETE_CELL",
238
+ isRetryable: true,
239
+ suggestedFix: "Provide a cell ID to delete",
240
+ });
227
241
  }
228
242
 
229
243
  const notebook = store.get(notebookAtom);
@@ -247,37 +261,30 @@ export class EditNotebookTool implements AiTool<
247
261
  next_steps: [
248
262
  "If you need to perform more edits, call this tool again.",
249
263
  "You should use the lint notebook tool to check for errors and lint issues. Fix them by editing the notebook.",
250
- "You should use the run stale cells tool to run the cells that have been edited or newly added. This allows you to see the output of the cells and fix any errors.",
251
264
  ],
252
265
  };
253
266
  };
254
267
 
255
268
  private validateCellIdExists(cellId: CellId, notebook: NotebookState) {
256
- const cellIds = notebook.cellIds;
257
- if (!cellIds.getColumns().some((column) => column.idSet.has(cellId))) {
258
- throw new ToolExecutionError(
259
- "Cell not found",
260
- "CELL_NOT_FOUND",
261
- false,
262
- "Check which cells exist in the notebook",
263
- );
269
+ if (!notebook.cellIds.includes(cellId)) {
270
+ throw new ToolExecutionError("Cell not found", {
271
+ code: "CELL_NOT_FOUND",
272
+ isRetryable: false,
273
+ suggestedFix: "Check which cells exist in the notebook",
274
+ });
264
275
  }
265
276
  }
266
277
 
267
- private getColumnId(
268
- columnIndex: number,
269
- notebook: NotebookState,
270
- ): CellColumnId {
271
- const cellIds = notebook.cellIds;
272
- const columns = cellIds.getColumns();
278
+ private getColumnId(columnIndex: number, layout: Layout): CellColumnId {
279
+ const { columns } = layout;
273
280
 
274
281
  if (columnIndex < 0 || columnIndex >= columns.length) {
275
- throw new ToolExecutionError(
276
- "Column index is out of range",
277
- "COLUMN_INDEX_OUT_OF_RANGE",
278
- true,
279
- "Choose a column index between 0 and the number of columns in the notebook (0-based)",
280
- );
282
+ throw new ToolExecutionError("Column index is out of range", {
283
+ code: "COLUMN_INDEX_OUT_OF_RANGE",
284
+ isRetryable: true,
285
+ suggestedFix:
286
+ "Choose a column index between 0 and the number of columns in the notebook (0-based)",
287
+ });
281
288
  }
282
289
  return columns[columnIndex].id;
283
290
  }
@@ -289,12 +296,11 @@ export class EditNotebookTool implements AiTool<
289
296
  const cellHandles = notebook.cellHandles;
290
297
  const cellHandle = cellHandles[cellId].current;
291
298
  if (!cellHandle?.editorView) {
292
- throw new ToolExecutionError(
293
- "Cell editor not found",
294
- "CELL_EDITOR_NOT_FOUND",
295
- false,
296
- "Internal error, ask the user to report this error",
297
- );
299
+ throw new ToolExecutionError("Cell editor not found", {
300
+ code: "CELL_EDITOR_NOT_FOUND",
301
+ isRetryable: false,
302
+ suggestedFix: "Internal error, ask the user to report this error",
303
+ });
298
304
  }
299
305
  return cellHandle.editorView;
300
306
  }
@@ -9,7 +9,6 @@ import {
9
9
  type ToolNotebookContext,
10
10
  } from "./base";
11
11
  import { EditNotebookTool } from "./edit-notebook-tool";
12
- import { RunStaleCellsTool } from "./run-cells-tool";
13
12
  import { formatToolDescription } from "./utils";
14
13
 
15
14
  export type AnyZodObject = ZodObject<z.ZodRawShape>;
@@ -73,9 +72,11 @@ export class FrontendToolRegistry {
73
72
  const strError = z.prettifyError(inputResponse.error);
74
73
  throw new ToolExecutionError(
75
74
  `Tool ${toolName} returned invalid input: ${strError}`,
76
- "INVALID_ARGUMENTS",
77
- true,
78
- "Please check the arguments and try again.",
75
+ {
76
+ code: "INVALID_ARGUMENTS",
77
+ isRetryable: true,
78
+ suggestedFix: "Please check the arguments and try again.",
79
+ },
79
80
  );
80
81
  }
81
82
  const args = inputResponse.data;
@@ -110,12 +111,15 @@ export class FrontendToolRegistry {
110
111
  // Handle unknown/generic errors
111
112
  const genericError = new ToolExecutionError(
112
113
  error instanceof Error ? error.message : String(error),
113
- "TOOL_ERROR",
114
- false,
115
- "Check the error message and try again with valid arguments.",
116
114
  {
117
- args: rawArgs,
118
- errorType: error?.constructor?.name ?? typeof error,
115
+ code: "TOOL_ERROR",
116
+ isRetryable: false,
117
+ suggestedFix:
118
+ "Check the error message and try again with valid arguments.",
119
+ meta: {
120
+ args: rawArgs,
121
+ errorType: error?.constructor?.name ?? typeof error,
122
+ },
119
123
  },
120
124
  );
121
125
  return {
@@ -143,5 +147,4 @@ export class FrontendToolRegistry {
143
147
 
144
148
  export const FRONTEND_TOOL_REGISTRY = new FrontendToolRegistry([
145
149
  new EditNotebookTool(),
146
- new RunStaleCellsTool(),
147
150
  ]);
@@ -50,13 +50,12 @@ export class TestFrontendTool implements AiTool<Input, Output> {
50
50
  public async handler({ name }: Input): Promise<Output> {
51
51
  // Example: Validate input and throw ToolExecutionError on invalid data
52
52
  if (!name.trim()) {
53
- throw new ToolExecutionError(
54
- "Name cannot be empty",
55
- "INVALID_INPUT",
56
- false,
57
- "Please provide a non-empty name",
58
- { field: "name", received: name },
59
- );
53
+ throw new ToolExecutionError("Name cannot be empty", {
54
+ code: "INVALID_INPUT",
55
+ isRetryable: false,
56
+ suggestedFix: "Please provide a non-empty name",
57
+ meta: { field: "name", received: name },
58
+ });
60
59
  }
61
60
 
62
61
  return {