@marimo-team/islands 0.25.3-dev29 → 0.25.3-dev291

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 (844) hide show
  1. package/dist/{ConnectedDataExplorerComponent-7EaP9VWb.js → ConnectedDataExplorerComponent-CErm132k.js} +116 -113
  2. package/dist/{ErrorBoundary-ysC54Xwn.js → ErrorBoundary-Df7sOY5r.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-0udY4hpv.js → chat-ui-CoAmcc-W.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-CZmyRTO8.js → code-visibility-DO6O_8h-.js} +43 -50
  23. package/dist/{common-CCrzSQnL.js → common-Coz-wkOd.js} +10640 -10053
  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-B141KnZO.js → data-grid-overlay-editor-LbsctrY7.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-CQl9aZz1.js +2595 -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-DQXS8piQ.js +374 -0
  70. package/dist/{flowDiagram-HODETNUW-DQ4JuadE.js → flowDiagram-HODETNUW-aIFlAtOy.js} +2 -2
  71. package/dist/{formats-DRHUWwSK.js → formats-PzBQMUnr.js} +6 -6
  72. package/dist/{glide-data-editor-DLHbRbsj.js → glide-data-editor-CiTOpufo.js} +6630 -2846
  73. package/dist/{glide-utils-pisbYVjH.js → glide-utils-BSQr4d90.js} +107 -76
  74. package/dist/{globals-D2g1BHQ0.js → globals-Bmz_qpY8.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-DgtRTNaG.js → html-to-image-DbxMq9QA.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-DHqP6YVn.js → number-overlay-editor-CXO_e1Yo.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-CuIlhYwn.js → process-output-BHsfwmw9.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-DYHhtPqq.js → reveal-component-CLRZbwl1.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-1lFfDE_8.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 +41 -4
  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/dom/outline.ts +4 -1
  519. package/src/core/edit-app.tsx +22 -28
  520. package/src/core/errors/__tests__/error-entries.test.ts +40 -1
  521. package/src/core/errors/error-entries.ts +6 -4
  522. package/src/core/executions/__tests__/atoms.test.ts +98 -0
  523. package/src/core/executions/__tests__/freshness.test.ts +482 -0
  524. package/src/core/executions/__tests__/hooks.test.tsx +151 -0
  525. package/src/core/executions/__tests__/output.test.ts +266 -0
  526. package/src/core/executions/__tests__/select.test.ts +268 -0
  527. package/src/core/executions/atoms.ts +263 -0
  528. package/src/core/executions/freshness.ts +171 -0
  529. package/src/core/executions/hooks.ts +86 -0
  530. package/src/core/executions/index.ts +48 -0
  531. package/src/core/executions/output.ts +242 -0
  532. package/src/core/executions/select.ts +175 -0
  533. package/src/core/export/__tests__/hooks.test.ts +0 -5
  534. package/src/core/export/hooks.ts +1 -1
  535. package/src/core/export/layout.ts +2 -2
  536. package/src/core/hotkeys/actions.ts +2 -4
  537. package/src/core/hotkeys/hotkeys.ts +2 -1
  538. package/src/core/islands/__tests__/bootstrap.test.ts +69 -17
  539. package/src/core/islands/__tests__/bridge.test.ts +85 -27
  540. package/src/core/islands/bootstrap.ts +49 -54
  541. package/src/core/islands/bridge.ts +84 -25
  542. package/src/core/islands/components/__tests__/IslandControls.test.tsx +7 -5
  543. package/src/core/islands/components/__tests__/web-components.test.tsx +63 -0
  544. package/src/core/islands/components/output-wrapper.tsx +5 -5
  545. package/src/core/islands/components/web-components.tsx +12 -1
  546. package/src/core/islands/worker/__tests__/controller.test.ts +62 -4
  547. package/src/core/islands/worker/controller.ts +4 -10
  548. package/src/core/islands/worker/worker.tsx +33 -33
  549. package/src/core/kernel/__tests__/RuntimeState.test.ts +1 -1
  550. package/src/core/kernel/__tests__/handlers.test.ts +7 -157
  551. package/src/core/kernel/handlers.ts +13 -79
  552. package/src/core/kernel/state.ts +0 -15
  553. package/src/core/lifecycle/render-policy.ts +12 -26
  554. package/src/core/meta/__tests__/code-visibility.test.tsx +78 -70
  555. package/src/core/meta/code-visibility.ts +18 -9
  556. package/src/core/network/__tests__/connection.test.ts +1 -1
  557. package/src/core/network/__tests__/requests-lazy.test.ts +6 -8
  558. package/src/core/network/connection-notice.ts +1 -1
  559. package/src/core/network/connection.ts +1 -1
  560. package/src/core/network/requests-lazy.ts +5 -8
  561. package/src/core/network/requests-network.ts +5 -31
  562. package/src/core/network/requests-static.ts +1 -4
  563. package/src/core/network/requests-toasting.tsx +1 -4
  564. package/src/core/network/types.ts +6 -14
  565. package/src/core/network/useConnectionNotice.ts +8 -2
  566. package/src/core/notebook/__tests__/operations.test.ts +51 -0
  567. package/src/core/notebook/attachments.ts +38 -0
  568. package/src/core/notebook/document/__tests__/codemirror.test.ts +759 -0
  569. package/src/core/notebook/document/__tests__/draft.test.ts +363 -0
  570. package/src/core/notebook/document/__tests__/fixtures.ts +92 -0
  571. package/src/core/notebook/document/__tests__/hooks.test.tsx +391 -0
  572. package/src/core/notebook/document/__tests__/lifecycle-scenarios.test.ts +61 -0
  573. package/src/core/notebook/document/__tests__/model.test.ts +247 -0
  574. package/src/core/notebook/document/__tests__/protocol-fixtures.ts +38 -0
  575. package/src/core/notebook/document/__tests__/recovery-scenarios.test.ts +230 -0
  576. package/src/core/notebook/document/__tests__/scenario-fixture.ts +43 -0
  577. package/src/core/notebook/document/__tests__/scenarios.test.ts +205 -0
  578. package/src/core/notebook/document/__tests__/state.test.ts +459 -0
  579. package/src/core/notebook/document/__tests__/submission.test.ts +203 -0
  580. package/src/core/notebook/document/__tests__/test-host.test.ts +92 -0
  581. package/src/core/notebook/document/__tests__/test-host.ts +247 -0
  582. package/src/core/notebook/document/__tests__/test-notebook.ts +149 -0
  583. package/src/core/notebook/document/__tests__/user.ts +61 -0
  584. package/src/core/notebook/document/codemirror.ts +216 -0
  585. package/src/core/notebook/document/draft.ts +502 -0
  586. package/src/core/notebook/document/hooks.tsx +118 -0
  587. package/src/core/notebook/document/index.ts +24 -0
  588. package/src/core/notebook/document/model.ts +102 -0
  589. package/src/core/notebook/document/select.ts +41 -0
  590. package/src/core/notebook/document/state.ts +378 -0
  591. package/src/core/notebook/document/sync.ts +369 -0
  592. package/src/core/notebook/index.ts +19 -0
  593. package/src/core/notebook/operations.ts +30 -0
  594. package/src/core/notebook/replica/AGENTS.md +11 -0
  595. package/src/core/{host → notebook/replica}/__tests__/attachments.test.ts +9 -10
  596. package/src/core/{host → notebook/replica}/__tests__/document.test.ts +18 -16
  597. package/src/core/notebook/replica/__tests__/executions.test.ts +200 -0
  598. package/src/core/notebook/replica/__tests__/fixtures.ts +79 -0
  599. package/src/core/notebook/replica/__tests__/replica.test.ts +559 -0
  600. package/src/core/notebook/replica/__tests__/results.test.ts +193 -0
  601. package/src/core/notebook/replica/__tests__/runtime.test.ts +78 -0
  602. package/src/core/notebook/replica/backend.ts +19 -0
  603. package/src/core/notebook/replica/connection.ts +42 -0
  604. package/src/core/notebook/replica/index.ts +20 -0
  605. package/src/core/notebook/replica/replica.ts +336 -0
  606. package/src/core/{host → notebook/replica}/resources/attachments.ts +6 -3
  607. package/src/core/{host → notebook/replica}/resources/document.ts +3 -3
  608. package/src/core/notebook/replica/resources/executions.ts +157 -0
  609. package/src/core/notebook/replica/resources/results.ts +48 -0
  610. package/src/core/notebook/replica/resources/runtime.ts +14 -0
  611. package/src/core/packages/__tests__/useSandboxController.test.tsx +1 -1
  612. package/src/core/packages/useSandboxController.ts +1 -1
  613. package/src/core/run-app.tsx +49 -51
  614. package/src/core/runtime/__tests__/adapter.test.ts +4 -4
  615. package/src/core/runtime/__tests__/createWsUrl.test.ts +77 -7
  616. package/src/core/runtime/__tests__/runtime.test.ts +32 -74
  617. package/src/core/runtime/adapter.ts +5 -5
  618. package/src/core/runtime/config.ts +2 -2
  619. package/src/core/runtime/runtime.ts +33 -46
  620. package/src/core/runtime/types.ts +0 -2
  621. package/src/core/saving/__tests__/document.test.tsx +123 -0
  622. package/src/core/saving/__tests__/state.test.ts +111 -0
  623. package/src/core/saving/__tests__/useAutoSave.test.tsx +67 -0
  624. package/src/core/saving/document.ts +33 -0
  625. package/src/core/saving/filename.ts +1 -1
  626. package/src/core/saving/save-component.tsx +39 -60
  627. package/src/core/saving/state.ts +38 -39
  628. package/src/core/saving/useAutoSave.ts +17 -53
  629. package/src/core/session/__tests__/backend.test.ts +236 -0
  630. package/src/core/session/__tests__/useNotebookReplica.hook.test.tsx +186 -0
  631. package/src/core/{websocket → session}/__tests__/useNotebookSession.hook.test.tsx +245 -262
  632. package/src/core/session/active-notebook.ts +28 -0
  633. package/src/core/session/backend.ts +123 -0
  634. package/src/core/session/embedded.ts +7 -0
  635. package/src/core/{websocket → session}/types.ts +2 -2
  636. package/src/core/session/useNotebookReplica.ts +74 -0
  637. package/src/core/{websocket → session}/useNotebookSession.tsx +80 -67
  638. package/src/core/state/__tests__/jotai.test.tsx +108 -0
  639. package/src/core/state/jotai.ts +1 -1
  640. package/src/core/static/__tests__/files.test.ts +38 -10
  641. package/src/core/static/files.ts +2 -0
  642. package/src/core/{websocket → transports}/__tests__/connection-state.test.ts +1 -13
  643. package/src/core/transports/__tests__/server.test.ts +408 -0
  644. package/src/core/transports/__tests__/static.test.ts +306 -0
  645. package/src/core/transports/__tests__/wasm.test.ts +166 -0
  646. package/src/core/{websocket → transports}/connection-state.ts +9 -16
  647. package/src/core/transports/server.ts +152 -0
  648. package/src/core/transports/static.ts +166 -0
  649. package/src/core/transports/wasm.ts +97 -0
  650. package/src/core/vscode/__tests__/vscode-bindings.test.ts +125 -0
  651. package/src/core/vscode/vscode-bindings.ts +14 -2
  652. package/src/core/wasm/__tests__/bridge.test.ts +210 -64
  653. package/src/core/wasm/__tests__/worker.test.ts +188 -0
  654. package/src/core/wasm/bridge.ts +120 -73
  655. package/src/core/wasm/rpc.ts +15 -3
  656. package/src/core/wasm/store.ts +3 -3
  657. package/src/core/wasm/worker/bootstrap.ts +55 -51
  658. package/src/core/wasm/worker/getMarimoWheel.ts +1 -1
  659. package/src/core/wasm/worker/save-worker.ts +9 -10
  660. package/src/core/wasm/worker/types.ts +30 -18
  661. package/src/core/wasm/worker/worker.ts +118 -72
  662. package/src/css/app/Cell.css +7 -36
  663. package/src/css/app/codemirror.css +1 -1
  664. package/src/css/common.css +1 -1
  665. package/src/css/globals.css +72 -24
  666. package/src/hooks/__tests__/useAsyncData.test.tsx +148 -0
  667. package/src/hooks/__tests__/useDebounce.test.tsx +51 -0
  668. package/src/hooks/__tests__/useDeepCompareMemoize.test.tsx +39 -0
  669. package/src/hooks/__tests__/useDelayElapsed.test.tsx +28 -0
  670. package/src/hooks/__tests__/useInternalStateWithSync.test.tsx +20 -0
  671. package/src/hooks/__tests__/useScript.test.tsx +77 -0
  672. package/src/hooks/__tests__/useStateForKey.test.tsx +257 -0
  673. package/src/hooks/useAsyncData.ts +3 -3
  674. package/src/hooks/useDataSourceDiscovery.ts +6 -4
  675. package/src/hooks/useDebounce.ts +6 -10
  676. package/src/hooks/useDeepCompareMemoize.ts +1 -1
  677. package/src/hooks/useDelayElapsed.ts +14 -10
  678. package/src/hooks/useElapsedTime.ts +3 -3
  679. package/src/hooks/useEventListener.ts +1 -2
  680. package/src/hooks/useInputHistory.ts +4 -7
  681. package/src/hooks/useInternalStateWithSync.ts +6 -6
  682. package/src/hooks/useResizeObserver.ts +4 -7
  683. package/src/hooks/useScript.ts +67 -70
  684. package/src/hooks/useStateForKey.ts +93 -0
  685. package/src/mount.tsx +20 -15
  686. package/src/plugins/__tests__/plugin-object-schemas.test.ts +104 -0
  687. package/src/plugins/core/RenderHTML.tsx +3 -5
  688. package/src/plugins/core/__test__/RenderHTML-copy.test.tsx +60 -0
  689. package/src/plugins/core/registerReactComponent.tsx +5 -14
  690. package/src/plugins/impl/CodeEditorPlugin.tsx +1 -1
  691. package/src/plugins/impl/DataEditorPlugin.tsx +34 -13
  692. package/src/plugins/impl/DataTablePlugin.tsx +69 -37
  693. package/src/plugins/impl/DropdownPlugin.tsx +2 -6
  694. package/src/plugins/impl/FileBrowserPlugin.tsx +4 -16
  695. package/src/plugins/impl/FormPlugin.tsx +1 -1
  696. package/src/plugins/impl/RangeSliderPlugin.tsx +16 -2
  697. package/src/plugins/impl/RefreshPlugin.tsx +1 -0
  698. package/src/plugins/impl/SliderPlugin.tsx +6 -8
  699. package/src/plugins/impl/__tests__/DataEditorPlugin.test.ts +93 -4
  700. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +387 -1
  701. package/src/plugins/impl/__tests__/FileBrowserPlugin.test.tsx +45 -0
  702. package/src/plugins/impl/__tests__/RangeSliderPlugin.test.tsx +109 -0
  703. package/src/plugins/impl/__tests__/SliderPlugin.test.tsx +24 -3
  704. package/src/plugins/impl/anywidget/__tests__/registry.test.ts +153 -0
  705. package/src/plugins/impl/anywidget/__tests__/widget-binding.test.ts +241 -2
  706. package/src/plugins/impl/anywidget/model.ts +3 -1
  707. package/src/plugins/impl/anywidget/registry.ts +18 -14
  708. package/src/plugins/impl/anywidget/runtime.ts +21 -9
  709. package/src/plugins/impl/anywidget/widget-binding.ts +160 -82
  710. package/src/plugins/impl/chat/__tests__/chat-prompts.test.tsx +93 -0
  711. package/src/plugins/impl/chat/chat-ui.tsx +17 -15
  712. package/src/plugins/impl/code/any-language-editor.tsx +2 -2
  713. package/src/plugins/impl/common/error-banner.tsx +5 -3
  714. package/src/plugins/impl/data-editor/__tests__/column-types.test.ts +42 -0
  715. package/src/plugins/impl/data-editor/__tests__/editor-state.test.ts +52 -1
  716. package/src/plugins/impl/data-editor/__tests__/glide-data-editor.test.tsx +120 -4
  717. package/src/plugins/impl/data-editor/__tests__/glide-utils.test.ts +116 -0
  718. package/src/plugins/impl/data-editor/column-types.ts +55 -0
  719. package/src/plugins/impl/data-editor/editor-state.ts +18 -2
  720. package/src/plugins/impl/data-editor/glide-data-editor.tsx +74 -12
  721. package/src/plugins/impl/data-editor/glide-utils.ts +39 -38
  722. package/src/plugins/impl/data-editor/types.ts +5 -0
  723. package/src/plugins/impl/data-explorer/ConnectedDataExplorerComponent.tsx +1 -1
  724. package/src/plugins/impl/data-explorer/components/column-summary.tsx +4 -2
  725. package/src/plugins/impl/data-explorer/state/reducer.ts +1 -1
  726. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +1 -2
  727. package/src/plugins/impl/data-frames/__tests__/sidebar.test.tsx +160 -0
  728. package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +66 -66
  729. package/src/plugins/impl/data-frames/panel.tsx +44 -16
  730. package/src/plugins/impl/mpl-interactive/MplInteractivePlugin.tsx +5 -3
  731. package/src/plugins/impl/panel/PanelPlugin.tsx +16 -17
  732. package/src/plugins/impl/panel/__tests__/utils.test.ts +39 -1
  733. package/src/plugins/impl/panel/utils.ts +17 -0
  734. package/src/plugins/impl/plotly/PlotlyPlugin.tsx +2 -5
  735. package/src/plugins/impl/plotly/selection.ts +25 -19
  736. package/src/plugins/impl/vega/VegaPlugin.tsx +2 -3
  737. package/src/plugins/impl/vega/make-selectable.ts +4 -7
  738. package/src/plugins/layout/DownloadPlugin.tsx +7 -11
  739. package/src/plugins/layout/RoutesPlugin.tsx +1 -1
  740. package/src/plugins/layout/__test__/DownloadPlugin.test.tsx +205 -0
  741. package/src/stories/__tests__/editor-story.test.tsx +33 -0
  742. package/src/stories/button.stories.tsx +1 -0
  743. package/src/stories/cell-status.stories.tsx +29 -24
  744. package/src/stories/cell.stories.tsx +46 -46
  745. package/src/stories/data-table.stories.tsx +31 -0
  746. package/src/stories/editor.stories.tsx +24 -17
  747. package/src/stories/form-wrapper.stories.tsx +2 -2
  748. package/src/stories/layout/vertical/one-column.stories.tsx +28 -42
  749. package/src/stories/runtime-story.tsx +23 -17
  750. package/src/stories/select.stories.tsx +2 -2
  751. package/src/stories/switchable-multi-select.stories.tsx +1 -1
  752. package/src/theme/__tests__/islands-theme.test.tsx +276 -0
  753. package/src/theme/namespace.tsx +4 -3
  754. package/src/theme/useTheme.ts +71 -41
  755. package/src/utils/__tests__/arrays.test.ts +35 -0
  756. package/src/utils/__tests__/batch-requests.test.ts +3 -3
  757. package/src/utils/__tests__/{createReducer.test.ts → createReducer.test.tsx} +127 -1
  758. package/src/utils/__tests__/download.test.tsx +183 -23
  759. package/src/utils/__tests__/numbers.test.ts +105 -1
  760. package/src/utils/__tests__/objects.test.ts +21 -0
  761. package/src/utils/arrays.ts +11 -2
  762. package/src/utils/blob.ts +1 -1
  763. package/src/utils/createReducer.ts +115 -79
  764. package/src/utils/download.ts +67 -6
  765. package/src/utils/maps.ts +0 -3
  766. package/src/utils/numbers.ts +79 -18
  767. package/src/utils/objects.ts +4 -9
  768. package/src/utils/time.ts +10 -0
  769. package/src/utils/tracer.ts +9 -5
  770. package/src/utils/zod-utils.ts +1 -3
  771. package/dist/_baseMerge-BiGRwuqv.js +0 -165
  772. package/dist/any-language-editor-D4q-IFcM.js +0 -76
  773. package/dist/assets/__vite-browser-external-BXYkiFsk.js +0 -1
  774. package/dist/assets/worker-HPY9fbhz.js +0 -114
  775. package/dist/feedback-button-CykZqHY-.js +0 -379
  776. package/dist/hasIn-o2Us0uVx.js +0 -132
  777. package/dist/html-to-image--r0l9wUy.js +0 -3251
  778. package/dist/isArrayLikeObject-BZl-15ir.js +0 -450
  779. package/dist/isEmpty-BSZ1LaUo.js +0 -35
  780. package/dist/isSymbol-kQcfYbNX.js +0 -8
  781. package/dist/label-DoysmLMW.js +0 -281
  782. package/dist/pick-CJeoxYOS.js +0 -51
  783. package/dist/select-DemoKT4G.js +0 -1344
  784. package/dist/toDate-gyi35XS2.js +0 -1185
  785. package/dist/toast-PkdZraM8.js +0 -1830
  786. package/dist/use-restore-focus-CKjfFjLM.js +0 -6369
  787. package/dist/useLifecycle-Dfq8UD-b.js +0 -169
  788. package/dist/useTheme-Bu5bBgrh.js +0 -904
  789. package/src/components/chat/reasoning-accordion.tsx +0 -61
  790. package/src/components/chat/tool-call/tool-error-card.tsx +0 -81
  791. package/src/components/chat/tool-call/tool-history-row.tsx +0 -174
  792. package/src/components/editor/ai/__tests__/staged-cell-submission.test.ts +0 -106
  793. package/src/components/editor/ai/add-cell-with-ai.tsx +0 -506
  794. package/src/components/editor/ai/staged-cell-submission.ts +0 -46
  795. package/src/components/editor/cell/__tests__/StagedAICell.test.tsx +0 -64
  796. package/src/components/editor/cell/code/__tests__/rtc-editor-config.test.ts +0 -50
  797. package/src/components/editor/chrome/wrapper/footer-items/rtc-status.tsx +0 -65
  798. package/src/components/editor/navigation/__tests__/state.test.ts +0 -81
  799. package/src/components/editor/navigation/state.ts +0 -65
  800. package/src/components/icons/loading-ellipsis.tsx +0 -46
  801. package/src/core/ai/tools/__tests__/run-cells-tool.test.ts +0 -656
  802. package/src/core/ai/tools/run-cells-tool.ts +0 -303
  803. package/src/core/attachments/state.ts +0 -18
  804. package/src/core/cells/__tests__/apply-transaction.test.ts +0 -991
  805. package/src/core/cells/__tests__/document-changes.test.ts +0 -1140
  806. package/src/core/cells/__tests__/document-roundtrip.test.ts +0 -392
  807. package/src/core/cells/document-changes.ts +0 -944
  808. package/src/core/codemirror/rtc/extension.ts +0 -453
  809. package/src/core/codemirror/rtc/loro/__tests__/sync.test.ts +0 -52
  810. package/src/core/codemirror/rtc/loro/awareness.ts +0 -531
  811. package/src/core/codemirror/rtc/loro/colors.ts +0 -38
  812. package/src/core/codemirror/rtc/loro/sync.ts +0 -168
  813. package/src/core/host/AGENTS.md +0 -11
  814. package/src/core/host/__tests__/events.test.ts +0 -46
  815. package/src/core/host/__tests__/fixtures.ts +0 -39
  816. package/src/core/host/__tests__/notebook-client.test.ts +0 -433
  817. package/src/core/host/__tests__/protocol.test.ts +0 -229
  818. package/src/core/host/__tests__/stream.test.ts +0 -209
  819. package/src/core/host/connection.ts +0 -81
  820. package/src/core/host/events.ts +0 -61
  821. package/src/core/host/notebook-client.ts +0 -290
  822. package/src/core/host/protocol.ts +0 -1948
  823. package/src/core/host/resources/resource.ts +0 -47
  824. package/src/core/host/stream.ts +0 -211
  825. package/src/core/rtc/state.ts +0 -34
  826. package/src/core/state/__tests__/jotai.test.ts +0 -25
  827. package/src/core/wasm/worker/message-buffer.ts +0 -33
  828. package/src/core/websocket/__tests__/createConnectionTransport.test.ts +0 -49
  829. package/src/core/websocket/__tests__/useNotebookClient.hook.test.tsx +0 -170
  830. package/src/core/websocket/state.ts +0 -7
  831. package/src/core/websocket/transports/__tests__/basic.test.ts +0 -275
  832. package/src/core/websocket/transports/__tests__/sse.test.ts +0 -335
  833. package/src/core/websocket/transports/__tests__/transport.test.ts +0 -308
  834. package/src/core/websocket/transports/__tests__/ws.test.ts +0 -125
  835. package/src/core/websocket/transports/basic.ts +0 -102
  836. package/src/core/websocket/transports/create.ts +0 -31
  837. package/src/core/websocket/transports/sse.ts +0 -308
  838. package/src/core/websocket/transports/transport.ts +0 -50
  839. package/src/core/websocket/transports/ws.ts +0 -98
  840. package/src/core/websocket/useNotebookClient.ts +0 -88
  841. package/src/utils/__tests__/id-tree.test.ts +0 -2145
  842. package/src/utils/id-tree.tsx +0 -1134
  843. /package/src/{core/attachments/toast.ts → components/editor/agent-toast.ts} +0 -0
  844. /package/src/core/{websocket → session}/connection-utils.ts +0 -0
@@ -48,6 +48,7 @@ import { DEFAULT_AI_MODEL, type UserConfig } from "@/core/config/config-schema";
48
48
  import { isWasm } from "@/core/wasm/utils";
49
49
  import { cn } from "@/utils/cn";
50
50
  import { Events } from "@/utils/events";
51
+ import { Objects } from "@/utils/objects";
51
52
  import { Strings } from "@/utils/strings";
52
53
  import { AIModelDropdown, getProviderLabel } from "../ai/ai-model-dropdown";
53
54
  import {
@@ -118,7 +119,7 @@ export const AiProviderTitle: React.FC<AiProviderTitleProps> = ({
118
119
  children,
119
120
  }) => {
120
121
  return (
121
- <div className="flex items-center text-base font-semibold">
122
+ <div className="flex items-center text-sm font-medium">
122
123
  {provider && <AiProviderIcon provider={provider} className="mr-2" />}
123
124
  {children}
124
125
  </div>
@@ -148,9 +149,10 @@ export const ApiKey: React.FC<ApiKeyProps> = ({
148
149
  control={form.control}
149
150
  name={name}
150
151
  render={({ field, override }) => (
151
- <div className="flex flex-col space-y-1">
152
+ <div className="settings-field flex flex-col space-y-1">
152
153
  <FormItem className={formItemClasses}>
153
- <FormLabel>API Key</FormLabel>
154
+ <FormLabel>API key</FormLabel>
155
+ {description && <FormDescription>{description}</FormDescription>}
154
156
  <FormControl>
155
157
  <Input
156
158
  data-testid={testId}
@@ -173,7 +175,6 @@ export const ApiKey: React.FC<ApiKeyProps> = ({
173
175
  <FormMessage />
174
176
  <IsOverridden override={override} />
175
177
  </FormItem>
176
- {description && <FormDescription>{description}</FormDescription>}
177
178
  </div>
178
179
  )}
179
180
  />
@@ -217,9 +218,10 @@ export const BaseUrl: React.FC<BaseUrlProps> = ({
217
218
  control={form.control}
218
219
  name={name}
219
220
  render={({ field, override }) => (
220
- <div className="flex flex-col space-y-1">
221
+ <div className="settings-field flex flex-col space-y-1">
221
222
  <FormItem className={formItemClasses}>
222
223
  <FormLabel>Base URL</FormLabel>
224
+ {description && <FormDescription>{description}</FormDescription>}
223
225
  <FormControl>
224
226
  <Input
225
227
  data-testid={testId}
@@ -238,7 +240,6 @@ export const BaseUrl: React.FC<BaseUrlProps> = ({
238
240
  <FormMessage />
239
241
  <IsOverridden override={override} />
240
242
  </FormItem>
241
- {description && <FormDescription>{description}</FormDescription>}
242
243
  </div>
243
244
  )}
244
245
  />
@@ -282,6 +283,7 @@ export const ModelSelector: React.FC<ModelSelectorProps> = ({
282
283
  const renderFormItem = () => (
283
284
  <FormItem className={formItemClasses}>
284
285
  <FormLabel>{label}</FormLabel>
286
+ {description && <FormDescription>{description}</FormDescription>}
285
287
  <FormControl>
286
288
  <AIModelDropdown
287
289
  value={value}
@@ -324,11 +326,10 @@ export const ModelSelector: React.FC<ModelSelectorProps> = ({
324
326
  );
325
327
 
326
328
  return (
327
- <div className="flex flex-col space-y-1">
329
+ <div className="settings-field flex flex-col space-y-1">
328
330
  {renderFormItem()}
329
331
  <IsOverridden override={override} />
330
332
  <IncorrectModelId value={value} />
331
- {description && <FormDescription>{description}</FormDescription>}
332
333
  </div>
333
334
  );
334
335
  }}
@@ -343,6 +344,7 @@ interface ProviderSelectProps {
343
344
  options: string[];
344
345
  testId: string;
345
346
  disabled?: boolean;
347
+ description?: React.ReactNode;
346
348
  }
347
349
 
348
350
  export const ProviderSelect: React.FC<ProviderSelectProps> = ({
@@ -351,15 +353,17 @@ export const ProviderSelect: React.FC<ProviderSelectProps> = ({
351
353
  options,
352
354
  testId,
353
355
  disabled = false,
356
+ description,
354
357
  }) => {
355
358
  return (
356
359
  <OverriddenFormField
357
360
  control={form.control}
358
361
  name={name}
359
362
  render={({ field, override }) => (
360
- <div className="flex flex-col space-y-1">
363
+ <div className="settings-field flex flex-col space-y-1">
361
364
  <FormItem className={formItemClasses}>
362
365
  <FormLabel>Provider</FormLabel>
366
+ {description && <FormDescription>{description}</FormDescription>}
363
367
  <FormControl>
364
368
  <NativeSelect
365
369
  data-testid={testId}
@@ -439,7 +443,7 @@ const renderCopilotProvider = ({
439
443
  if (copilot === "custom") {
440
444
  return (
441
445
  <ModelSelector
442
- label="Autocomplete Model"
446
+ label="Autocomplete model"
443
447
  form={form}
444
448
  config={config}
445
449
  name="ai.models.autocomplete_model"
@@ -460,7 +464,9 @@ const SettingGroup = ({
460
464
  className?: string;
461
465
  }) => {
462
466
  return (
463
- <div className={cn("flex flex-col gap-4 pb-4", className)}>{children}</div>
467
+ <div className={cn("settings-group flex flex-col gap-4", className)}>
468
+ {children}
469
+ </div>
464
470
  );
465
471
  };
466
472
 
@@ -501,6 +507,7 @@ const ModelListItem: React.FC<ModelListItemProps> = ({
501
507
  <ModelInfoCard model={model} />
502
508
  {model.custom && (
503
509
  <Button
510
+ aria-label={`Delete model ${model.name}`}
504
511
  variant="ghost"
505
512
  size="icon"
506
513
  onClick={handleDelete}
@@ -561,18 +568,14 @@ export const AiCodeCompletionConfig: React.FC<AiConfigProps> = ({
561
568
  const { value: copilot } = getOverride("completion.copilot", watchedCopilot);
562
569
  return (
563
570
  <SettingGroup>
564
- <SettingSubtitle>Code Completion</SettingSubtitle>
565
- <p className="text-sm text-muted-secondary">
566
- Choose GitHub Copilot, Codeium, or a custom provider (such as Ollama) to
567
- enable AI-powered code completion.
568
- </p>
569
-
571
+ <SettingSubtitle>Copilot</SettingSubtitle>
570
572
  <ProviderSelect
571
573
  form={form}
572
574
  config={config}
573
575
  name="completion.copilot"
574
576
  options={["none", "github", "codeium", "custom"]}
575
577
  testId="copilot-select"
578
+ description="Choose GitHub Copilot, Codeium, or a custom provider (such as Ollama) to enable AI-powered code completion."
576
579
  />
577
580
 
578
581
  {renderCopilotProvider({ form, config, onSubmit, copilot })}
@@ -681,7 +684,10 @@ export const CustomProvidersConfig: React.FC<AiConfigProps> = ({
681
684
  };
682
685
 
683
686
  const removeProvider = (providerName: string) => {
684
- const { [providerName]: _, ...rest } = customProviders;
687
+ const rest = Objects.filter(
688
+ customProviders,
689
+ (_, name) => name !== providerName,
690
+ );
685
691
  // Reset to clear nested dirty state, then set new value
686
692
  form.resetField("ai.custom_providers");
687
693
  form.setValue("ai.custom_providers", rest, { shouldDirty: true });
@@ -691,7 +697,7 @@ export const CustomProvidersConfig: React.FC<AiConfigProps> = ({
691
697
  const providerForm = (
692
698
  <div className="flex flex-col gap-3 p-4 border border-border rounded-md bg-muted/20">
693
699
  <div className="flex flex-col gap-1.5">
694
- <Label htmlFor={providerNameInputId}>Provider Name</Label>
700
+ <Label htmlFor={providerNameInputId}>Provider name</Label>
695
701
  <Input
696
702
  id={providerNameInputId}
697
703
  placeholder="e.g., together, groq, mistral"
@@ -729,7 +735,7 @@ export const CustomProvidersConfig: React.FC<AiConfigProps> = ({
729
735
  </div>
730
736
 
731
737
  <div className="flex flex-col gap-1.5">
732
- <Label htmlFor={apiKeyInputId}>API Key (optional)</Label>
738
+ <Label htmlFor={apiKeyInputId}>API key (optional)</Label>
733
739
  <Input
734
740
  id={apiKeyInputId}
735
741
  placeholder="sk-..."
@@ -745,7 +751,7 @@ export const CustomProvidersConfig: React.FC<AiConfigProps> = ({
745
751
  disabled={!hasValidValues}
746
752
  size="xs"
747
753
  >
748
- Add Provider
754
+ Add provider
749
755
  </Button>
750
756
  <Button variant="outline" onClick={resetForm} size="xs">
751
757
  Cancel
@@ -834,7 +840,7 @@ export const CustomProvidersConfig: React.FC<AiConfigProps> = ({
834
840
  className="w-fit self-end"
835
841
  >
836
842
  <Trash2Icon className="h-4 w-4 mr-2" />
837
- Remove Provider
843
+ Remove provider
838
844
  </Button>
839
845
  </AccordionFormItem>
840
846
  );
@@ -842,10 +848,10 @@ export const CustomProvidersConfig: React.FC<AiConfigProps> = ({
842
848
 
843
849
  return (
844
850
  <SettingGroup>
845
- <SettingSubtitle>Custom Providers</SettingSubtitle>
851
+ <SettingSubtitle>Custom providers</SettingSubtitle>
846
852
  <p className="text-sm text-muted-secondary">
847
853
  Add your own OpenAI-compatible provider. Once added, you can
848
- configure models in the AI Models tab.
854
+ configure models in the AI models tab.
849
855
  </p>
850
856
 
851
857
  {customProviderEntries.length > 0 && (
@@ -867,7 +873,7 @@ export const CustomProvidersConfig: React.FC<AiConfigProps> = ({
867
873
  className="self-start"
868
874
  isFormOpen={isAddingProvider}
869
875
  setIsFormOpen={setIsAddingProvider}
870
- label="Add Provider"
876
+ label="Add provider"
871
877
  />
872
878
  )}
873
879
  </SettingGroup>
@@ -1203,9 +1209,12 @@ export const AiProvidersConfig: React.FC<AiConfigProps> = ({
1203
1209
  disabled={isWasmRuntime}
1204
1210
  name="ai.bedrock.region_name"
1205
1211
  render={({ field, override }) => (
1206
- <div className="flex flex-col space-y-1">
1212
+ <div className="settings-field flex flex-col space-y-1">
1207
1213
  <FormItem className={formItemClasses}>
1208
- <FormLabel>AWS Region</FormLabel>
1214
+ <FormLabel>AWS region</FormLabel>
1215
+ <FormDescription>
1216
+ The AWS region where Bedrock service is available.
1217
+ </FormDescription>
1209
1218
  <FormControl>
1210
1219
  <NativeSelect
1211
1220
  data-testid="bedrock-region-select"
@@ -1228,9 +1237,6 @@ export const AiProvidersConfig: React.FC<AiConfigProps> = ({
1228
1237
  <FormMessage />
1229
1238
  <IsOverridden override={override} />
1230
1239
  </FormItem>
1231
- <FormDescription>
1232
- The AWS region where Bedrock service is available.
1233
- </FormDescription>
1234
1240
  </div>
1235
1241
  )}
1236
1242
  />
@@ -1240,9 +1246,13 @@ export const AiProvidersConfig: React.FC<AiConfigProps> = ({
1240
1246
  disabled={isWasmRuntime}
1241
1247
  name="ai.bedrock.profile_name"
1242
1248
  render={({ field, override }) => (
1243
- <div className="flex flex-col space-y-1">
1249
+ <div className="settings-field flex flex-col space-y-1">
1244
1250
  <FormItem className={formItemClasses}>
1245
- <FormLabel>AWS Profile Name (Optional)</FormLabel>
1251
+ <FormLabel>AWS profile name (optional)</FormLabel>
1252
+ <FormDescription>
1253
+ The AWS profile name from your ~/.aws/credentials file.
1254
+ Leave blank to use your default AWS credentials.
1255
+ </FormDescription>
1246
1256
  <FormControl>
1247
1257
  <Input
1248
1258
  data-testid="bedrock-profile-input"
@@ -1257,17 +1267,13 @@ export const AiProvidersConfig: React.FC<AiConfigProps> = ({
1257
1267
  <FormMessage />
1258
1268
  <IsOverridden override={override} />
1259
1269
  </FormItem>
1260
- <FormDescription>
1261
- The AWS profile name from your ~/.aws/credentials file. Leave
1262
- blank to use your default AWS credentials.
1263
- </FormDescription>
1264
1270
  </div>
1265
1271
  )}
1266
1272
  />
1267
1273
  </AccordionFormItem>
1268
1274
 
1269
1275
  <AccordionFormItem
1270
- title="OpenAI-Compatible (Legacy)"
1276
+ title="OpenAI-compatible (legacy)"
1271
1277
  provider="openai-compatible"
1272
1278
  isConfigured={
1273
1279
  hasValue("ai.open_ai_compatible.api_key") &&
@@ -1275,7 +1281,7 @@ export const AiProvidersConfig: React.FC<AiConfigProps> = ({
1275
1281
  }
1276
1282
  >
1277
1283
  <p className="text-sm text-amber-600 dark:text-amber-400 mb-2">
1278
- Consider using Custom Providers instead, which allows you to add
1284
+ Consider using Custom providers instead, which allows you to add
1279
1285
  multiple providers with distinct names.
1280
1286
  </p>
1281
1287
  <ApiKey
@@ -1321,98 +1327,11 @@ export const AiAssistConfig: React.FC<AiConfigProps> = ({
1321
1327
 
1322
1328
  return (
1323
1329
  <SettingGroup>
1324
- <SettingSubtitle>AI Assistant</SettingSubtitle>
1325
-
1326
- <FormField
1327
- control={form.control}
1328
- name="ai.inline_tooltip"
1329
- render={({ field }) => (
1330
- <div className="flex flex-col gap-y-1">
1331
- <FormItem className={formItemClasses}>
1332
- <FormLabel className="font-normal">AI Edit Tooltip</FormLabel>
1333
- <FormControl>
1334
- <Checkbox
1335
- data-testid="inline-ai-checkbox"
1336
- checked={field.value === true}
1337
- onCheckedChange={field.onChange}
1338
- />
1339
- </FormControl>
1340
- </FormItem>
1341
- <FormDescription>
1342
- Enable "Edit with AI" tooltip when selecting code.
1343
- </FormDescription>
1344
- </div>
1345
- )}
1346
- />
1347
-
1348
- <FormField
1349
- control={form.control}
1350
- name="ai.max_tokens"
1351
- render={({ field }) => {
1352
- return (
1353
- <div className="flex flex-col gap-y-1">
1354
- <div className="flex items-center gap-x-2">
1355
- <FormItem className={formItemClasses}>
1356
- <FormLabel className="font-normal">
1357
- Max output tokens
1358
- </FormLabel>
1359
- <FormControl>
1360
- <Input
1361
- data-testid="ai-max-tokens-input"
1362
- type="number"
1363
- min={1}
1364
- disabled={!maxTokensEnabled}
1365
- className="w-28 h-6"
1366
- value={field.value ?? (maxTokensEnabled ? "" : 32768)}
1367
- onChange={(e) => {
1368
- const n = Number.parseInt(e.target.value, 10);
1369
- field.onChange(Number.isFinite(n) && n > 0 ? n : null);
1370
- }}
1371
- />
1372
- </FormControl>
1373
- </FormItem>
1374
- <FormItem className={formItemClasses}>
1375
- <Checkbox
1376
- data-testid="ai-max-tokens-checkbox"
1377
- checked={maxTokensEnabled}
1378
- onCheckedChange={(checked) => {
1379
- const isChecked = checked === true;
1380
- setMaxTokensEnabled(isChecked);
1381
- // null signals delete to the server; cast because
1382
- // UserConfig (OpenAPI-derived) types max_tokens as
1383
- // `number | undefined`, but zod accepts `null`.
1384
- const next = (
1385
- isChecked ? (field.value ?? 32768) : null
1386
- ) as number | undefined;
1387
- // shouldDirty: true forces RHF to keep this in
1388
- // dirtyFields even when `next` happens to equal the
1389
- // form's defaultValue (e.g. untick → tick when disk
1390
- // started with 32768). Otherwise getDirtyValues
1391
- // would skip it and the save body would be empty.
1392
- form.setValue("ai.max_tokens", next, {
1393
- shouldDirty: true,
1394
- shouldTouch: true,
1395
- });
1396
- onSubmit(form.getValues());
1397
- }}
1398
- />
1399
- <FormLabel className="font-normal">Override</FormLabel>
1400
- </FormItem>
1401
- </div>
1402
-
1403
- <FormDescription>
1404
- Each provider sets its own max output tokens (Anthropic uses a
1405
- recommended default). Adjust to control costs or enable more
1406
- output.
1407
- </FormDescription>
1408
- </div>
1409
- );
1410
- }}
1411
- />
1330
+ <SettingSubtitle>AI assistant</SettingSubtitle>
1412
1331
 
1413
1332
  <FormErrorsBanner />
1414
1333
  <ModelSelector
1415
- label="Chat Model"
1334
+ label="Chat model"
1416
1335
  form={form}
1417
1336
  config={config}
1418
1337
  name="ai.models.chat_model"
@@ -1424,7 +1343,7 @@ export const AiAssistConfig: React.FC<AiConfigProps> = ({
1424
1343
  onSubmit={onSubmit}
1425
1344
  />
1426
1345
  <ModelSelector
1427
- label="Edit Model"
1346
+ label="Edit model"
1428
1347
  form={form}
1429
1348
  config={config}
1430
1349
  name="ai.models.edit_model"
@@ -1432,20 +1351,87 @@ export const AiAssistConfig: React.FC<AiConfigProps> = ({
1432
1351
  description={
1433
1352
  <span>
1434
1353
  Model to use for code editing with the{" "}
1435
- <Kbd className="inline">Generate with AI</Kbd> button.
1354
+ <Kbd className="inline">Edit with AI</Kbd> action.
1436
1355
  </span>
1437
1356
  }
1438
1357
  forRole="edit"
1439
1358
  onSubmit={onSubmit}
1440
1359
  />
1441
1360
 
1361
+ <FormField
1362
+ control={form.control}
1363
+ name="ai.max_tokens"
1364
+ render={({ field }) => {
1365
+ return (
1366
+ <div className="settings-field flex flex-col gap-y-1">
1367
+ <FormItem className={formItemClasses}>
1368
+ <FormLabel className="font-normal">Max output tokens</FormLabel>
1369
+ <FormDescription>
1370
+ Limit output tokens for both chat and code edits. When not
1371
+ overridden, each provider uses its default (Anthropic uses a
1372
+ recommended default).
1373
+ </FormDescription>
1374
+ <div className="flex flex-wrap items-center gap-2">
1375
+ <FormControl>
1376
+ <Input
1377
+ data-testid="ai-max-tokens-input"
1378
+ type="number"
1379
+ min={1}
1380
+ disabled={!maxTokensEnabled}
1381
+ className="w-20 h-7"
1382
+ value={field.value ?? (maxTokensEnabled ? "" : 32768)}
1383
+ onChange={(e) => {
1384
+ const n = Number.parseInt(e.target.value, 10);
1385
+ field.onChange(Number.isFinite(n) && n > 0 ? n : null);
1386
+ }}
1387
+ />
1388
+ </FormControl>
1389
+ <FormItem className="flex-row items-center gap-1.5">
1390
+ <FormControl>
1391
+ <Checkbox
1392
+ data-testid="ai-max-tokens-checkbox"
1393
+ checked={maxTokensEnabled}
1394
+ onCheckedChange={(checked) => {
1395
+ const isChecked = checked === true;
1396
+ setMaxTokensEnabled(isChecked);
1397
+ // null signals delete to the server; cast because
1398
+ // UserConfig (OpenAPI-derived) types max_tokens as
1399
+ // `number | undefined`, but zod accepts `null`.
1400
+ const next = (
1401
+ isChecked ? (field.value ?? 32768) : null
1402
+ ) as number | undefined;
1403
+ // shouldDirty: true forces RHF to keep this in
1404
+ // dirtyFields even when `next` happens to equal the
1405
+ // form's defaultValue (e.g. untick → tick when disk
1406
+ // started with 32768). Otherwise getDirtyValues
1407
+ // would skip it and the save body would be empty.
1408
+ form.setValue("ai.max_tokens", next, {
1409
+ shouldDirty: true,
1410
+ shouldTouch: true,
1411
+ });
1412
+ onSubmit(form.getValues());
1413
+ }}
1414
+ />
1415
+ </FormControl>
1416
+ <FormLabel className="font-normal">Override</FormLabel>
1417
+ </FormItem>
1418
+ </div>
1419
+ </FormItem>
1420
+ </div>
1421
+ );
1422
+ }}
1423
+ />
1424
+
1442
1425
  <OverriddenFormField
1443
1426
  control={form.control}
1444
1427
  name="ai.rules"
1445
1428
  render={({ field, override }) => (
1446
- <div className="flex flex-col">
1429
+ <div className="settings-field flex flex-col">
1447
1430
  <FormItem>
1448
- <FormLabel>Custom Rules</FormLabel>
1431
+ <FormLabel>Custom rules</FormLabel>
1432
+ <FormDescription>
1433
+ Custom rules to include in all AI completion prompts.
1434
+ </FormDescription>
1449
1435
  <FormControl>
1450
1436
  <Textarea
1451
1437
  data-testid="ai-rules-input"
@@ -1459,8 +1445,28 @@ export const AiAssistConfig: React.FC<AiConfigProps> = ({
1459
1445
  <FormMessage />
1460
1446
  <IsOverridden override={override} />
1461
1447
  </FormItem>
1448
+ </div>
1449
+ )}
1450
+ />
1451
+ <FormField
1452
+ control={form.control}
1453
+ name="ai.inline_tooltip"
1454
+ render={({ field }) => (
1455
+ <div className="settings-field flex flex-col gap-y-1">
1456
+ <FormItem className={formItemClasses}>
1457
+ <FormLabel className="font-normal">
1458
+ Show “Edit with AI” on text selection
1459
+ </FormLabel>
1460
+ <FormControl>
1461
+ <Checkbox
1462
+ data-testid="inline-ai-checkbox"
1463
+ checked={field.value === true}
1464
+ onCheckedChange={field.onChange}
1465
+ />
1466
+ </FormControl>
1467
+ </FormItem>
1462
1468
  <FormDescription>
1463
- Custom rules to include in all AI completion prompts.
1469
+ Enable "Edit with AI" tooltip when selecting code.
1464
1470
  </FormDescription>
1465
1471
  </div>
1466
1472
  )}
@@ -1653,7 +1659,7 @@ export const AiModelDisplayConfig: React.FC<AiConfigProps> = ({
1653
1659
 
1654
1660
  <div className="bg-background">
1655
1661
  <Tree
1656
- aria-label="AI Models by Provider"
1662
+ aria-label="AI models by provider"
1657
1663
  className="flex-1 overflow-auto outline-hidden focus-visible:outline-hidden"
1658
1664
  selectionMode="none"
1659
1665
  >
@@ -1765,7 +1771,7 @@ export const AddModelForm: React.FC<{
1765
1771
  {customProviderNames.length > 0 && (
1766
1772
  <>
1767
1773
  <p className="px-2 py-1 text-xs text-muted-secondary font-medium">
1768
- Custom Providers
1774
+ Custom providers
1769
1775
  </p>
1770
1776
  {customProviderNames.map((p) => (
1771
1777
  <SelectItem key={p} value={p}>
@@ -1777,7 +1783,7 @@ export const AddModelForm: React.FC<{
1777
1783
  ))}
1778
1784
  {knownProviders.length > 0 && (
1779
1785
  <p className="px-2 py-1 text-xs text-muted-secondary font-medium mt-1">
1780
- Built-in Providers
1786
+ Built-in providers
1781
1787
  </p>
1782
1788
  )}
1783
1789
  </>
@@ -1846,7 +1852,7 @@ export const AddModelForm: React.FC<{
1846
1852
  id={modelNameInputId}
1847
1853
  value={modelName}
1848
1854
  onChange={(e) => setModelName(e.target.value)}
1849
- placeholder="gpt-4"
1855
+ placeholder="gpt-5.6-sol"
1850
1856
  className="text-xs mb-0"
1851
1857
  />
1852
1858
  </div>
@@ -1876,7 +1882,7 @@ export const AddModelForm: React.FC<{
1876
1882
  <AddButton
1877
1883
  isFormOpen={isFormOpen}
1878
1884
  setIsFormOpen={setIsFormOpen}
1879
- label="Add Model"
1885
+ label="Add model"
1880
1886
  className="pl-2"
1881
1887
  />
1882
1888
  {modelAdded && (
@@ -1930,9 +1936,9 @@ const AiEnabledConfig: React.FC<AiConfigProps> = ({ form }) => {
1930
1936
  control={form.control}
1931
1937
  name="ai.enabled"
1932
1938
  render={({ field, override }) => (
1933
- <div className="flex flex-col gap-y-1">
1939
+ <div className="settings-field flex flex-col gap-y-1">
1934
1940
  <FormItem className={formItemClasses}>
1935
- <FormLabel className="font-normal">Enable AI features</FormLabel>
1941
+ <FormLabel className="font-normal">Show AI features</FormLabel>
1936
1942
  <FormControl>
1937
1943
  <Checkbox
1938
1944
  data-testid="ai-enabled-checkbox"
@@ -1946,8 +1952,8 @@ const AiEnabledConfig: React.FC<AiConfigProps> = ({ form }) => {
1946
1952
  <IsOverridden override={override} />
1947
1953
  </FormItem>
1948
1954
  <FormDescription>
1949
- When disabled, AI actions and panels are hidden from the marimo
1950
- UI.
1955
+ When disabled, various AI-related features are hidden from the
1956
+ marimo UI.
1951
1957
  </FormDescription>
1952
1958
  </div>
1953
1959
  )}
@@ -1981,32 +1987,32 @@ export const AiConfig: React.FC<AiConfigProps> = ({
1981
1987
  onValueChange={(value) => setActiveTab(value as AiSettingsSubTab)}
1982
1988
  className="flex-1"
1983
1989
  >
1984
- <TabsList className="mb-2">
1985
- <TabsTrigger value="ai-features">AI Features</TabsTrigger>
1990
+ <TabsList className="mb-2 max-w-full justify-start overflow-x-auto">
1991
+ <TabsTrigger value="ai-features">AI features</TabsTrigger>
1986
1992
  {aiEnabled !== false && (
1987
1993
  <>
1988
- <TabsTrigger value="ai-providers">AI Providers</TabsTrigger>
1989
- <TabsTrigger value="ai-models">AI Models</TabsTrigger>
1994
+ <TabsTrigger value="ai-providers">AI providers</TabsTrigger>
1995
+ <TabsTrigger value="ai-models">AI models</TabsTrigger>
1990
1996
  {!wasm && <TabsTrigger value="mcp">MCP</TabsTrigger>}
1991
1997
  </>
1992
1998
  )}
1993
1999
  </TabsList>
2000
+ {aiEnabled !== false && <PairWithAgentBanner className="mt-2 mb-6" />}
1994
2001
 
1995
- <TabsContent value="ai-features">
2002
+ <TabsContent value="ai-features" className="space-y-6">
2003
+ {aiEnabled !== false && (
2004
+ <AiAssistConfig form={form} config={config} onSubmit={onSubmit} />
2005
+ )}
1996
2006
  <AiCodeCompletionConfig
1997
2007
  form={form}
1998
2008
  config={config}
1999
2009
  onSubmit={onSubmit}
2000
2010
  />
2001
2011
  <AiEnabledConfig form={form} config={config} onSubmit={onSubmit} />
2002
- {aiEnabled !== false && (
2003
- <AiAssistConfig form={form} config={config} onSubmit={onSubmit} />
2004
- )}
2005
2012
  </TabsContent>
2006
2013
  {aiEnabled !== false && (
2007
2014
  <>
2008
2015
  <TabsContent value="ai-providers">
2009
- <PairWithAgentBanner className="mb-4" />
2010
2016
  <AiProvidersConfig
2011
2017
  form={form}
2012
2018
  config={config}
@@ -2,7 +2,6 @@
2
2
 
3
3
  import { useAtom } from "jotai";
4
4
  import { SettingsIcon } from "lucide-react";
5
- import { VisuallyHidden } from "react-aria";
6
5
  import { AppConfigForm } from "@/components/app-config/app-config-form";
7
6
  import {
8
7
  Popover,
@@ -51,10 +50,12 @@ export const ConfigButton: React.FC<Props> = ({
51
50
  );
52
51
 
53
52
  const userSettingsDialog = (
54
- <DialogContent className="w-[90vw] h-[90vh] overflow-hidden sm:max-w-5xl top-[5vh] p-0">
55
- <VisuallyHidden>
56
- <DialogTitle>User settings</DialogTitle>
57
- </VisuallyHidden>
53
+ <DialogContent className="flex flex-col gap-0 w-[94vw] h-[90vh] overflow-hidden sm:max-w-5xl top-[5vh] p-0 font-prose">
54
+ <div className="border-b px-6 py-4 pr-12">
55
+ <DialogTitle className="text-base font-semibold">
56
+ User settings
57
+ </DialogTitle>
58
+ </div>
58
59
  <UserConfigForm />
59
60
  </DialogContent>
60
61
  );
@@ -37,7 +37,7 @@ import {
37
37
  const FORM_DEBOUNCE = 100; // ms;
38
38
 
39
39
  export const AppConfigForm: React.FC = () => {
40
- const [config, setConfig] = useAppConfig();
40
+ const config = useAppConfig();
41
41
  const { saveAppConfig } = useRequestClient();
42
42
  const htmlCheckboxId = useId();
43
43
  const ipynbCheckboxId = useId();
@@ -50,18 +50,14 @@ export const AppConfigForm: React.FC = () => {
50
50
  defaultValues: config,
51
51
  });
52
52
 
53
+ // The host document carries the saved config back.
53
54
  const onSubmit = async (values: AppConfig) => {
54
- await saveAppConfig({ config: values })
55
- .then(() => {
56
- setConfig(values);
57
- })
58
- .catch(() => {
59
- setConfig(values);
60
- });
55
+ await saveAppConfig({ config: values });
61
56
  };
62
57
 
63
58
  const debouncedSubmit = useDebouncedCallback((v: AppConfig) => {
64
- onSubmit(v);
59
+ // The request client reports a failed save, so nothing is left to handle.
60
+ onSubmit(v).catch(() => undefined);
65
61
  }, FORM_DEBOUNCE);
66
62
 
67
63
  // When width is changed, dispatch a resize event so widgets know to resize