@marimo-team/frontend 0.25.2 → 0.25.3-dev100

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 (476) hide show
  1. package/dist/assets/CellStatus-fK4n2NPc.js +1 -0
  2. package/dist/assets/{ConnectedDataExplorerComponent-t8fH_TNc.js → ConnectedDataExplorerComponent-Dft8R6l5.js} +1 -1
  3. package/dist/assets/{ErrorBoundary-Gl5nCA8C.js → ErrorBoundary-CAEGdoFW.js} +2 -2
  4. package/dist/assets/JsonOutput-CyAKmZDD.js +11 -0
  5. package/dist/assets/{LazyAnyLanguageCodeMirror-CKcCbG2G.js → LazyAnyLanguageCodeMirror-BPYE76jR.js} +2 -2
  6. package/dist/assets/MarimoErrorOutput-CgZvP0p0.js +10 -0
  7. package/dist/assets/{RenderHTML-BbOqmHy3.js → RenderHTML-DQvxDDNS.js} +1 -1
  8. package/dist/assets/RunButton-BBDnDL6G.js +1 -0
  9. package/dist/assets/__vite-browser-external-8vDMR0Kk.js +1 -0
  10. package/dist/assets/__vite-browser-external-mKcnhO20.js +1 -0
  11. package/dist/assets/{add-cell-with-ai-8UBC0xwR.js → add-cell-with-ai-Clg5FELx.js} +12 -12
  12. package/dist/assets/{add-connection-dialog-DXQnd6eB.js → add-connection-dialog-BqdWmD-7.js} +2 -2
  13. package/dist/assets/{agent-panel-D7kMZLG-.js → agent-panel-5RxG5Y82.js} +5 -5
  14. package/dist/assets/ai-model-dropdown-Bvl1ktQq.js +13 -0
  15. package/dist/assets/{alert-dialog-BaPGzeOK.js → alert-dialog-C-sWmKva.js} +1 -1
  16. package/dist/assets/any-language-editor-DUMe1UCk.js +1 -0
  17. package/dist/assets/{app-config-button-BKEG4x9u.js → app-config-button-0QTeQ2Mv.js} +1 -1
  18. package/dist/assets/arrays-0R2reF2y.js +1 -0
  19. package/dist/assets/{blob-D5nfNHOo.js → blob-5VcB8K_t.js} +1 -1
  20. package/dist/assets/{button-COI-NGrx.js → button-D8gVKwe-.js} +1 -1
  21. package/dist/assets/{cache-panel-DTY1dqvi.js → cache-panel-BV-c7ed0.js} +1 -1
  22. package/dist/assets/{capabilities-BJvf-MD4.js → capabilities-Pq1YNPlK.js} +1 -1
  23. package/dist/assets/cell-editor-Byw5y-oI.js +42 -0
  24. package/dist/assets/cell-link-C5yYyzuF.js +1 -0
  25. package/dist/assets/{cells-BRkCaSsh.js → cells-D_11MjVB.js} +60 -60
  26. package/dist/assets/{chat-display-Dnagy4Nv.js → chat-display-BCR_ySiV.js} +1 -1
  27. package/dist/assets/chat-panel-RPRvBsaU.js +4 -0
  28. package/dist/assets/chat-ui-CGviVaRA.js +4 -0
  29. package/dist/assets/{circle-DXf-VWZG.js → circle-B6D_6D8w.js} +1 -1
  30. package/dist/assets/code-visibility-DYDagVy7.js +1 -0
  31. package/dist/assets/coerce-DWjFeXOY.js +1 -0
  32. package/dist/assets/column-preview-xe533-Cn.js +1 -0
  33. package/dist/assets/command-palette-BB9bWdWp.js +1 -0
  34. package/dist/assets/{common-Cu6CDbuw.js → common-CaeItbcI.js} +1 -1
  35. package/dist/assets/components-CBE8cOLK.js +1 -0
  36. package/dist/assets/{components-CP_UoFtT.js → components-DCo7mAWO.js} +1 -1
  37. package/dist/assets/{components-CGw16R_N.js → components-G6frbw0c.js} +1 -1
  38. package/dist/assets/config-CD1IuZFJ.js +1 -0
  39. package/dist/assets/config-DMz7oN0r.js +1 -0
  40. package/dist/assets/config-DpY86_Yq.js +1 -0
  41. package/dist/assets/{copy-D8O_CYCG.js → copy-KlhazlhB.js} +1 -1
  42. package/dist/assets/{copy-icon-BIiRXh_3.js → copy-icon-8-a5vovc.js} +1 -1
  43. package/dist/assets/{createReducer-DgRODTW6.js → createReducer-CaI_Oa0v.js} +1 -1
  44. package/dist/assets/{datasource-Cq6x_5ML.js → datasource-deuXnlU-.js} +1 -1
  45. package/dist/assets/{dates-BbFQ2oE4.js → dates-CQMwFko2.js} +1 -1
  46. package/dist/assets/{dependency-graph-panel--Kgtktcw.js → dependency-graph-panel-CIykLnJe.js} +2 -2
  47. package/dist/assets/{dist-iaThVDkA.js → dist-jlhMTKo_.js} +1 -1
  48. package/dist/assets/{documentation-panel-BHmbeznw.js → documentation-panel-2PQ8kQLa.js} +1 -1
  49. package/dist/assets/{download-DCJXy66H.js → download-dK52bLxZ.js} +1 -1
  50. package/dist/assets/{dropdown-menu-C1rnl-0o.js → dropdown-menu-DS6umAnH.js} +1 -1
  51. package/dist/assets/edit-page-DrElzw10.js +9 -0
  52. package/dist/assets/{error-banner-Cd69vvyX.js → error-banner-B5kzVf_0.js} +1 -1
  53. package/dist/assets/{error-entries-Dk3VZ-OK.js → error-entries-3GVk2KjS.js} +1 -1
  54. package/dist/assets/{error-panel-BPRYmC5J.js → error-panel-CzDRGPeC.js} +1 -1
  55. package/dist/assets/{errors-DCrsa1nH.js → errors-CNsgAw6m.js} +1 -1
  56. package/dist/assets/{es-Cqst59WX.js → es-N9SHpmG7.js} +1 -1
  57. package/dist/assets/{feedback-button-Bik2-e33.js → feedback-button-C5NgWpFg.js} +2 -2
  58. package/dist/assets/feedback-button-CONwLFpw.js +1 -0
  59. package/dist/assets/file-explorer-panel-B50xDnTZ.js +1 -0
  60. package/dist/assets/{file-name-input-Cdc-TVqO.js → file-name-input-DqwMSgGU.js} +1 -1
  61. package/dist/assets/{floating-outline-XD9FAV-f.js → floating-outline-ChmAuvxz.js} +1 -1
  62. package/dist/assets/{formats-yZ06h1Pl.js → formats-zylfwejq.js} +1 -1
  63. package/dist/assets/{formatting-BqrP-n49.js → formatting-uom1es4b.js} +1 -1
  64. package/dist/assets/{fullscreen-B9tHcfpV.js → fullscreen-BWTs8pYZ.js} +1 -1
  65. package/dist/assets/{gallery-page-Dm6mGwBi.js → gallery-page-CiL8aMS1.js} +1 -1
  66. package/dist/assets/{ganttDiagram-EL5Y4UJY-2n7Ig5Jm.js → ganttDiagram-EL5Y4UJY-CYqkCfFG.js} +1 -1
  67. package/dist/assets/{glide-data-editor-J9CAb70d.js → glide-data-editor-CqRclBkp.js} +2 -2
  68. package/dist/assets/{glide-utils-CIrAxdjv.js → glide-utils-HFqhvWHI.js} +2 -2
  69. package/dist/assets/home-page-BgZVl4dP.js +1 -0
  70. package/dist/assets/{hooks-93IwHd2u.js → hooks-DM5n7Osw.js} +1 -1
  71. package/dist/assets/{html-to-image-DK9Zl1lU.js → html-to-image-D_0rd3_B.js} +1 -1
  72. package/dist/assets/index-BnhSnwvB.css +2 -0
  73. package/dist/assets/index-EG2n8Oht.js +30 -0
  74. package/dist/assets/{input-BoBxR50a.js → input-DmHMEZGh.js} +1 -1
  75. package/dist/assets/kiosk-mode-DFS6HopF.js +1 -0
  76. package/dist/assets/layout-BpP8nTjb.js +9 -0
  77. package/dist/assets/linear-Bma8J3iM.js +1 -0
  78. package/dist/assets/links-DX2w97N9.js +1 -0
  79. package/dist/assets/{logs-panel-ABM16htT.js → logs-panel-B5eVAZtH.js} +1 -1
  80. package/dist/assets/{markdown-renderer-BG3sp2rs.js → markdown-renderer-BWUzqkJM.js} +1 -1
  81. package/dist/assets/{menu-items-BrwnTgyK.js → menu-items-BgUyNUpu.js} +1 -1
  82. package/dist/assets/{mermaid-a3xYymTy.js → mermaid-BKXlWk4F.js} +2 -2
  83. package/dist/assets/{name-cell-input-BgEBmqyL.js → name-cell-input-DXW68gRW.js} +1 -1
  84. package/dist/assets/numbers-CsZVw3Dc.js +1 -0
  85. package/dist/assets/{objects-snlMn4yk.js → objects-rLPlQ3X_.js} +1 -1
  86. package/dist/assets/{once-Haz_uxEL.js → once-6KNTRW0u.js} +1 -1
  87. package/dist/assets/{outline-panel-DCXQ3_F6.js → outline-panel-DPxJhJ_A.js} +1 -1
  88. package/dist/assets/{package-data-dv4FBHxR.js → package-data-CKPmBDtg.js} +1 -1
  89. package/dist/assets/packages-panel-gBE2FWQr.js +1 -0
  90. package/dist/assets/{panel-accordion-state-C1sdPp0m.js → panel-accordion-state-CCF5Gxnc.js} +1 -1
  91. package/dist/assets/panels-Dr6qMCvU.js +105 -0
  92. package/dist/assets/precisionRound-BxlUs8G4.js +1 -0
  93. package/dist/assets/process-output-Cw9IDcKQ.js +1 -0
  94. package/dist/assets/{quadrantDiagram-AXDQQJYC-yBhCDI7E.js → quadrantDiagram-AXDQQJYC-D9KH5Zge.js} +1 -1
  95. package/dist/assets/react-vega-BTNeboR2.js +189 -0
  96. package/dist/assets/{readonly-code-display-Do50PHI8.js → readonly-code-display-DYcZQ28T.js} +1 -1
  97. package/dist/assets/{readonly-python-code-DCSMIsTX.js → readonly-python-code-RFuQP50v.js} +1 -1
  98. package/dist/assets/{renderShortcut-BkVJQ_Zh.js → renderShortcut-rUwGqKgC.js} +1 -1
  99. package/dist/assets/{requests-lt0JK8Jt.js → requests-BIFR-h4M.js} +1 -1
  100. package/dist/assets/requests-DuLJN9Tf.js +1 -0
  101. package/dist/assets/{reveal-component-ltaepAqw.js → reveal-component-yRrDmCQz.js} +37 -37
  102. package/dist/assets/run-page-B69M4-zE.js +1 -0
  103. package/dist/assets/{runs-BLp5jezv.js → runs-C49hleBy.js} +1 -1
  104. package/dist/assets/{runtime-details-state-CSPobEdR.js → runtime-details-state-pobtu6TO.js} +1 -1
  105. package/dist/assets/{save-worker-BbUSwZRG.js → save-worker-pCkSHhuz.js} +1 -1
  106. package/dist/assets/{schemas-Dv42wLFq.js → schemas-ChRqMOTL.js} +1 -1
  107. package/dist/assets/scratchpad-panel-H44_pvb_.js +1 -0
  108. package/dist/assets/{scroll-to-bottom-button-1FyowpWV.js → scroll-to-bottom-button-CIkON2WJ.js} +1 -1
  109. package/dist/assets/{secrets-panel-Bctbtkrp.js → secrets-panel-bcfEKxRx.js} +1 -1
  110. package/dist/assets/{select-DTBn5eTb.js → select-3CVGlYrC.js} +1 -1
  111. package/dist/assets/{session-DqoWmb7X.js → session-CMLIzZKw.js} +1 -1
  112. package/dist/assets/session-panel-Bnd1iXkO.js +1 -0
  113. package/dist/assets/{snippets-panel-Bh1oTw4m.js → snippets-panel-DKApxKx9.js} +1 -1
  114. package/dist/assets/{spec-BfSBcO5B.js → spec-uCpVvaAR.js} +1 -1
  115. package/dist/assets/{state-uwRvJLb8.js → state-3mcyTS9q.js} +1 -1
  116. package/dist/assets/state-B_MCKzBL.js +1 -0
  117. package/dist/assets/state-Bl9BiY_s.js +3 -0
  118. package/dist/assets/{state-C3oDoyFe.js → state-C5WAeuTu.js} +1 -1
  119. package/dist/assets/{state-DxQnC_1I.js → state-Cv2JW3l9.js} +1 -1
  120. package/dist/assets/{state-XsPO8hNi.js → state-Dv059B3A.js} +1 -1
  121. package/dist/assets/{strings-B2vv-ENv.js → strings-C25fhMR_.js} +1 -1
  122. package/dist/assets/{swiper-component-a07domrZ.js → swiper-component-CRGRy5_O.js} +1 -1
  123. package/dist/assets/{switch-CTaiAjrz.js → switch-DYjBfpNJ.js} +1 -1
  124. package/dist/assets/{tabs-BuQlZFbt.js → tabs-CY8E4r9U.js} +1 -1
  125. package/dist/assets/{terminal-Ck_vK-34.js → terminal-Ca-kubKb.js} +1 -1
  126. package/dist/assets/{time-MgToa8VM.js → time-DswSXBDk.js} +1 -1
  127. package/dist/assets/{toast-BGzLGnvw.js → toast-Gzxi-le_.js} +1 -1
  128. package/dist/assets/tooltip-Brya4Ghn.js +61 -0
  129. package/dist/assets/{tooltip-C9TuY18o.js → tooltip-CkGm8X7m.js} +1 -1
  130. package/dist/assets/tracing-Clwy4SlW.js +1 -0
  131. package/dist/assets/tracing-panel-BwjLG_aC.js +2 -0
  132. package/dist/assets/{tree-actions-GM5E_bUs.js → tree-actions-BZNTQ12N.js} +1 -1
  133. package/dist/assets/{use-restore-focus-BxEGwIbk.js → use-restore-focus-DdS7Tl0F.js} +1 -1
  134. package/dist/assets/{useAddCell-GR7eEQrT.js → useAddCell-Cjuqk2YR.js} +1 -1
  135. package/dist/assets/useAsyncData-qvoPYHtx.js +1 -0
  136. package/dist/assets/useBoolean-Dd2nWXFJ.js +1 -0
  137. package/dist/assets/useCellActionButton-MoWLvuGe.js +1 -0
  138. package/dist/assets/useDebounce-DwTQ_1Pu.js +1 -0
  139. package/dist/assets/{useDeepCompareMemoize-DFIVN9dn.js → useDeepCompareMemoize-B2DVK2De.js} +1 -1
  140. package/dist/assets/useDelayElapsed-BlsDT4TV.js +1 -0
  141. package/dist/assets/{useDeleteCell-2_bMClHd.js → useDeleteCell-BC-MW7d1.js} +1 -1
  142. package/dist/assets/{useDependencyPanelTab-k3C3M18S.js → useDependencyPanelTab-CZU7i-B3.js} +1 -1
  143. package/dist/assets/{useEvent-Dfcbgjhg.js → useEvent-BDjgaBtz.js} +1 -1
  144. package/dist/assets/{useEventListener-D9cftcHj.js → useEventListener-CjDeLqFC.js} +1 -1
  145. package/dist/assets/{useIframeCapabilities-CwTkczVN.js → useIframeCapabilities-Czr9e4uG.js} +1 -1
  146. package/dist/assets/{useInstallPackage-iX1eufdl.js → useInstallPackage-wcDq9hYT.js} +1 -1
  147. package/dist/assets/{useInterval--x3s1VpI.js → useInterval-DJdQmXnq.js} +1 -1
  148. package/dist/assets/useNotebookActions-wFxVdRXQ.js +1 -0
  149. package/dist/assets/{useRunCells-B2vUhREg.js → useRunCells-ByaWxoIt.js} +1 -1
  150. package/dist/assets/{useSplitCell-DEb03htp.js → useSplitCell-YJIystwv.js} +1 -1
  151. package/dist/assets/useStateForKey-CGMJQT8x.js +1 -0
  152. package/dist/assets/{useTheme-COhSHkCj.js → useTheme-BAA27lh7.js} +1 -1
  153. package/dist/assets/{utils-CaQYvazl.js → utils-DfElfBpz.js} +1 -1
  154. package/dist/assets/vega-component-BeyxAJad.js +1 -0
  155. package/dist/assets/{vega-embed-container-DJPNkHPb.js → vega-embed-container-DtArSJz1.js} +1 -1
  156. package/dist/assets/vega-loader.browser-Bu25TKax.js +6 -0
  157. package/dist/assets/{worker-DTQ7oH2A.js → worker-bSCjCvwz.js} +1 -1
  158. package/dist/assets/{write-secret-modal-DzKAInL2.js → write-secret-modal-BEx-EUlh.js} +1 -1
  159. package/dist/assets/{xychartDiagram-S5SC5T6Z-KbGzG6-u.js → xychartDiagram-S5SC5T6Z-CeRnBS5e.js} +1 -1
  160. package/dist/index.html +80 -79
  161. package/package.json +8 -5
  162. package/src/__tests__/fixtures/{pair-preview.ts → pair-config.ts} +3 -2
  163. package/src/__tests__/host-imports.test.ts +101 -0
  164. package/src/__tests__/mount.test.ts +8 -8
  165. package/src/components/app-config/ai-config.tsx +7 -2
  166. package/src/components/chat/__tests__/message-queue.test.tsx +17 -0
  167. package/src/components/chat/acp/__tests__/state.test.ts +2 -2
  168. package/src/components/chat/acp/blocks.tsx +2 -2
  169. package/src/components/chat/chat-components.tsx +2 -0
  170. package/src/components/chat/chat-panel.tsx +9 -8
  171. package/src/components/chat/chat-utils.ts +4 -8
  172. package/src/components/data-table/__tests__/column-explorer.test.tsx +27 -1
  173. package/src/components/data-table/__tests__/columns.test.tsx +105 -0
  174. package/src/components/data-table/__tests__/context-menu-interaction.test.tsx +130 -0
  175. package/src/components/data-table/__tests__/context-menu.test.ts +176 -0
  176. package/src/components/data-table/__tests__/date-filter-inputs.test.tsx +24 -1
  177. package/src/components/data-table/__tests__/date-popover.test.tsx +72 -0
  178. package/src/components/data-table/__tests__/export-actions.test.tsx +434 -6
  179. package/src/components/data-table/__tests__/search-highlight.test.tsx +109 -0
  180. package/src/components/data-table/__tests__/url-detector.test.tsx +74 -0
  181. package/src/components/data-table/cell-selection/feature.ts +2 -2
  182. package/src/components/data-table/cell-selection/types.ts +2 -2
  183. package/src/components/data-table/charts/__tests__/chart-panel.test.tsx +74 -1
  184. package/src/components/data-table/charts/__tests__/storage.test.ts +4 -1
  185. package/src/components/data-table/charts/charts.tsx +35 -25
  186. package/src/components/data-table/charts/storage.ts +16 -5
  187. package/src/components/data-table/column-explorer-panel/column-explorer.tsx +1 -1
  188. package/src/components/data-table/column-summary/column-summary.tsx +2 -4
  189. package/src/components/data-table/column-visibility-dropdown.tsx +8 -13
  190. package/src/components/data-table/columns.tsx +45 -46
  191. package/src/components/data-table/context-menu.tsx +161 -46
  192. package/src/components/data-table/data-table.tsx +7 -1
  193. package/src/components/data-table/date-filter-inputs.tsx +15 -42
  194. package/src/components/data-table/date-popover.tsx +6 -4
  195. package/src/components/data-table/export-actions.tsx +267 -163
  196. package/src/components/data-table/row-viewer-panel/row-viewer.tsx +2 -2
  197. package/src/components/data-table/schemas.ts +14 -36
  198. package/src/components/data-table/search-highlight.tsx +79 -0
  199. package/src/components/data-table/types.ts +1 -0
  200. package/src/components/data-table/url-detector.tsx +49 -9
  201. package/src/components/data-table/utils.ts +18 -0
  202. package/src/components/datasources/__tests__/column-actions.test.tsx +97 -0
  203. package/src/components/datasources/__tests__/column-preview.test.tsx +63 -2
  204. package/src/components/datasources/__tests__/table-list.test.tsx +118 -0
  205. package/src/components/datasources/column-preview.tsx +8 -2
  206. package/src/components/datasources/datasources.tsx +47 -35
  207. package/src/components/debugger/debugger-code.tsx +5 -0
  208. package/src/components/dependency-graph/panels.tsx +2 -1
  209. package/src/components/editor/Output.tsx +9 -2
  210. package/src/components/editor/SortableCell.tsx +1 -3
  211. package/src/components/editor/__tests__/dynamic-favicon.test.tsx +111 -18
  212. package/src/components/editor/actions/__tests__/pair-with-agent-commands.test.ts +80 -252
  213. package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +210 -34
  214. package/src/components/editor/actions/pair-with-agent-commands.ts +42 -51
  215. package/src/components/editor/actions/pair-with-agent-modal.tsx +100 -37
  216. package/src/components/editor/ai/add-cell-with-ai.tsx +3 -3
  217. package/src/components/editor/ai/ai-completion-editor.tsx +1 -0
  218. package/src/components/editor/alerts/startup-logs-alert.tsx +1 -0
  219. package/src/components/editor/cell/CreateCellButton.tsx +8 -10
  220. package/src/components/editor/cell/DeleteButton.tsx +1 -0
  221. package/src/components/editor/cell/__tests__/useShouldShowInterrupt.test.ts +39 -0
  222. package/src/components/editor/cell/code/__tests__/language-toggle.test.tsx +54 -0
  223. package/src/components/editor/cell/code/cell-editor.tsx +1 -1
  224. package/src/components/editor/cell/code/language-toggle.tsx +8 -7
  225. package/src/components/editor/cell/useShouldShowInterrupt.ts +2 -12
  226. package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +30 -1
  227. package/src/components/editor/chrome/panels/cache-panel.tsx +1 -0
  228. package/src/components/editor/chrome/panels/error-panel.tsx +1 -0
  229. package/src/components/editor/chrome/panels/packages-panel.tsx +4 -7
  230. package/src/components/editor/chrome/wrapper/__tests__/attachment-status.test.tsx +366 -0
  231. package/src/components/editor/chrome/wrapper/__tests__/pending-ai-cells.test.tsx +58 -1
  232. package/src/components/editor/chrome/wrapper/footer-item.tsx +32 -24
  233. package/src/components/editor/chrome/wrapper/footer-items/attachment-status.tsx +237 -0
  234. package/src/components/editor/chrome/wrapper/footer-items/runtime-settings.tsx +1 -7
  235. package/src/components/editor/chrome/wrapper/footer.tsx +2 -0
  236. package/src/components/editor/chrome/wrapper/pending-ai-cells.tsx +12 -2
  237. package/src/components/editor/chrome/wrapper/storage.ts +1 -1
  238. package/src/components/editor/connections/components.tsx +1 -1
  239. package/src/components/editor/controls/__tests__/command-palette.test.tsx +53 -0
  240. package/src/components/editor/controls/command-palette.tsx +22 -10
  241. package/src/components/editor/dynamic-favicon.tsx +21 -40
  242. package/src/components/editor/errors/__tests__/send-error-report-button.test.tsx +537 -0
  243. package/src/components/editor/errors/send-error-report-button.tsx +69 -0
  244. package/src/components/editor/file-tree/__tests__/file-explorer-interactions.test.tsx +6 -0
  245. package/src/components/editor/file-tree/__tests__/use-file-search.test.tsx +91 -0
  246. package/src/components/editor/file-tree/file-explorer.tsx +10 -5
  247. package/src/components/editor/file-tree/file-viewer.tsx +4 -2
  248. package/src/components/editor/file-tree/use-file-search.ts +35 -21
  249. package/src/components/editor/notebook-banner.tsx +1 -0
  250. package/src/components/editor/output/MarimoErrorOutput.tsx +21 -5
  251. package/src/components/editor/output/MarimoTracebackOutput.tsx +37 -22
  252. package/src/components/editor/output/__tests__/ansi-reduce.test.ts +18 -0
  253. package/src/components/editor/output/ansi-reduce.ts +12 -0
  254. package/src/components/editor/output/console/ConsoleOutput.tsx +19 -25
  255. package/src/components/editor/package-alert.tsx +6 -4
  256. package/src/components/editor/renderers/vertical-layout/sidebar/toggle.tsx +7 -1
  257. package/src/components/home/components.tsx +17 -31
  258. package/src/components/icons/__tests__/large-spinner.test.tsx +39 -0
  259. package/src/components/icons/large-spinner.tsx +3 -14
  260. package/src/components/icons/spinner.tsx +1 -1
  261. package/src/components/mcp/mcp-status-indicator.tsx +1 -1
  262. package/src/components/pages/__tests__/home-page.test.tsx +116 -0
  263. package/src/components/pages/home-page.tsx +164 -91
  264. package/src/components/scratchpad/scratchpad.tsx +2 -2
  265. package/src/components/slides/reveal-component.tsx +4 -2
  266. package/src/components/slides/slide-cell-view.tsx +1 -1
  267. package/src/components/slides/slide-form.tsx +1 -0
  268. package/src/components/tracing/tracing.tsx +2 -2
  269. package/src/components/ui/alert-dialog.tsx +1 -1
  270. package/src/core/ai/context/providers/datasource.ts +6 -2
  271. package/src/core/attachments/__tests__/toast.test.tsx +58 -0
  272. package/src/core/attachments/state.ts +18 -0
  273. package/src/core/attachments/toast.ts +15 -0
  274. package/src/core/cells/__tests__/__snapshots__/cells.test.ts.snap +4 -0
  275. package/src/core/cells/__tests__/cell.test.ts +39 -0
  276. package/src/core/cells/__tests__/cells.test.ts +55 -1
  277. package/src/core/cells/__tests__/collapseConsoleOutputs.test.ts +54 -0
  278. package/src/core/cells/__tests__/error-report.test.ts +139 -0
  279. package/src/core/cells/__tests__/notebook-outline.test.ts +113 -0
  280. package/src/core/cells/__tests__/session.test.ts +50 -1
  281. package/src/core/cells/cell.ts +14 -3
  282. package/src/core/cells/cells.ts +3 -1
  283. package/src/core/cells/error-report.ts +63 -0
  284. package/src/core/cells/pending-delete-service.ts +2 -6
  285. package/src/core/cells/session.ts +29 -2
  286. package/src/core/cells/types.ts +10 -1
  287. package/src/core/codemirror/__tests__/setup.test.ts +1 -1
  288. package/src/core/codemirror/keymaps/vim.ts +2 -6
  289. package/src/core/codemirror/language/languages/markdown.ts +1 -1
  290. package/src/core/codemirror/language/languages/python.ts +3 -3
  291. package/src/core/codemirror/language/panel/panel.tsx +1 -0
  292. package/src/core/config/pair.ts +5 -3
  293. package/src/core/datasets/__tests__/data-source-discovery.test.ts +4 -4
  294. package/src/core/datasets/data-source-discovery.ts +4 -6
  295. package/src/core/document/__tests__/draft.test.ts +322 -0
  296. package/src/core/document/__tests__/fixtures.ts +92 -0
  297. package/src/core/document/__tests__/model.test.ts +483 -0
  298. package/src/core/document/__tests__/state.test.ts +446 -0
  299. package/src/core/document/__tests__/submission.test.ts +346 -0
  300. package/src/core/document/draft.ts +472 -0
  301. package/src/core/document/index.ts +10 -0
  302. package/src/core/document/model.ts +53 -0
  303. package/src/core/document/state.ts +401 -0
  304. package/src/core/document/sync.ts +359 -0
  305. package/src/core/edit-app.tsx +2 -2
  306. package/src/core/host/AGENTS.md +16 -0
  307. package/src/core/host/__tests__/attachments.test.ts +56 -0
  308. package/src/core/host/__tests__/document.test.ts +126 -0
  309. package/src/core/host/__tests__/fixtures.ts +41 -0
  310. package/src/core/host/__tests__/notebook-client.test.ts +570 -0
  311. package/src/core/host/connection.ts +42 -0
  312. package/src/core/host/notebook-client.ts +297 -0
  313. package/src/core/host/resources/attachments.ts +22 -0
  314. package/src/core/host/resources/document.ts +101 -0
  315. package/src/core/hotkeys/actions.ts +2 -4
  316. package/src/core/kernel/__tests__/RuntimeState.test.ts +1 -1
  317. package/src/core/network/connection.ts +4 -2
  318. package/src/core/network/useConnectionNotice.ts +8 -2
  319. package/src/core/run-app.tsx +2 -2
  320. package/src/core/runtime/__tests__/createWsUrl.test.ts +77 -7
  321. package/src/core/runtime/__tests__/runtime.test.ts +18 -17
  322. package/src/core/runtime/runtime.ts +26 -30
  323. package/src/core/state/__tests__/jotai.test.tsx +108 -0
  324. package/src/core/state/jotai.ts +1 -1
  325. package/src/core/static/files.ts +2 -0
  326. package/src/core/wasm/bridge.ts +2 -10
  327. package/src/core/wasm/store.ts +3 -3
  328. package/src/core/wasm/worker/bootstrap.ts +1 -1
  329. package/src/core/wasm/worker/getMarimoWheel.ts +1 -1
  330. package/src/core/websocket/__tests__/{useMarimoKernelConnection.test.ts → connection-state.test.ts} +15 -29
  331. package/src/core/websocket/__tests__/useNotebookClient.hook.test.tsx +223 -0
  332. package/src/core/websocket/__tests__/{useMarimoKernelConnection.hook.test.tsx → useNotebookSession.hook.test.tsx} +194 -184
  333. package/src/core/websocket/connection-state.ts +60 -0
  334. package/src/core/websocket/state.ts +7 -0
  335. package/src/core/websocket/transports/__tests__/notebook.test.ts +502 -0
  336. package/src/core/websocket/transports/notebook.ts +213 -0
  337. package/src/core/websocket/types.ts +9 -39
  338. package/src/core/websocket/useNotebookClient.ts +89 -0
  339. package/src/core/websocket/{useMarimoKernelConnection.tsx → useNotebookSession.tsx} +53 -224
  340. package/src/css/globals.css +5 -0
  341. package/src/hooks/__tests__/useAsyncData.test.tsx +148 -0
  342. package/src/hooks/__tests__/useDebounce.test.tsx +51 -0
  343. package/src/hooks/__tests__/useDeepCompareMemoize.test.tsx +39 -0
  344. package/src/hooks/__tests__/useDelayElapsed.test.tsx +28 -0
  345. package/src/hooks/__tests__/useInternalStateWithSync.test.tsx +20 -0
  346. package/src/hooks/__tests__/useScript.test.tsx +77 -0
  347. package/src/hooks/__tests__/useStateForKey.test.tsx +257 -0
  348. package/src/hooks/useAsyncData.ts +3 -3
  349. package/src/hooks/useDataSourceDiscovery.ts +6 -4
  350. package/src/hooks/useDebounce.ts +5 -8
  351. package/src/hooks/useDeepCompareMemoize.ts +1 -1
  352. package/src/hooks/useDelayElapsed.ts +14 -10
  353. package/src/hooks/useElapsedTime.ts +3 -3
  354. package/src/hooks/useInputHistory.ts +4 -7
  355. package/src/hooks/useInternalStateWithSync.ts +6 -6
  356. package/src/hooks/useResizeObserver.ts +4 -7
  357. package/src/hooks/useScript.ts +67 -70
  358. package/src/hooks/useStateForKey.ts +93 -0
  359. package/src/mount.tsx +3 -3
  360. package/src/plugins/core/registerReactComponent.tsx +1 -1
  361. package/src/plugins/impl/CodeEditorPlugin.tsx +1 -1
  362. package/src/plugins/impl/DataTablePlugin.tsx +14 -15
  363. package/src/plugins/impl/DropdownPlugin.tsx +2 -6
  364. package/src/plugins/impl/FileBrowserPlugin.tsx +4 -16
  365. package/src/plugins/impl/FormPlugin.tsx +1 -1
  366. package/src/plugins/impl/RangeSliderPlugin.tsx +0 -1
  367. package/src/plugins/impl/RefreshPlugin.tsx +1 -0
  368. package/src/plugins/impl/SliderPlugin.tsx +6 -8
  369. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +201 -1
  370. package/src/plugins/impl/__tests__/FileBrowserPlugin.test.tsx +45 -0
  371. package/src/plugins/impl/__tests__/SliderPlugin.test.tsx +24 -3
  372. package/src/plugins/impl/anywidget/__tests__/registry.test.ts +2 -0
  373. package/src/plugins/impl/anywidget/__tests__/widget-binding.test.ts +241 -2
  374. package/src/plugins/impl/anywidget/runtime.ts +21 -9
  375. package/src/plugins/impl/anywidget/widget-binding.ts +160 -82
  376. package/src/plugins/impl/chat/__tests__/chat-prompts.test.tsx +93 -0
  377. package/src/plugins/impl/chat/chat-ui.tsx +12 -10
  378. package/src/plugins/impl/code/any-language-editor.tsx +2 -2
  379. package/src/plugins/impl/data-editor/glide-data-editor.tsx +8 -5
  380. package/src/plugins/impl/data-editor/glide-utils.ts +3 -1
  381. package/src/plugins/impl/data-explorer/ConnectedDataExplorerComponent.tsx +1 -1
  382. package/src/plugins/impl/data-explorer/state/reducer.ts +1 -1
  383. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +0 -1
  384. package/src/plugins/impl/mpl-interactive/MplInteractivePlugin.tsx +5 -3
  385. package/src/plugins/impl/panel/PanelPlugin.tsx +16 -17
  386. package/src/plugins/impl/panel/__tests__/utils.test.ts +39 -1
  387. package/src/plugins/impl/panel/utils.ts +17 -0
  388. package/src/plugins/impl/vega/make-selectable.ts +4 -7
  389. package/src/plugins/layout/RoutesPlugin.tsx +1 -1
  390. package/src/stories/__tests__/editor-story.test.tsx +33 -0
  391. package/src/stories/button.stories.tsx +1 -0
  392. package/src/stories/editor.stories.tsx +24 -17
  393. package/src/stories/form-wrapper.stories.tsx +2 -2
  394. package/src/stories/select.stories.tsx +2 -2
  395. package/src/stories/switchable-multi-select.stories.tsx +1 -1
  396. package/src/utils/__tests__/arrays.test.ts +35 -0
  397. package/src/utils/__tests__/batch-requests.test.ts +3 -3
  398. package/src/utils/__tests__/dates.test.ts +116 -0
  399. package/src/utils/__tests__/numbers.test.ts +48 -1
  400. package/src/utils/__tests__/objects.test.ts +21 -0
  401. package/src/utils/arrays.ts +10 -0
  402. package/src/utils/blob.ts +1 -1
  403. package/src/utils/dates.ts +94 -0
  404. package/src/utils/numbers.ts +28 -17
  405. package/src/utils/objects.ts +3 -7
  406. package/src/utils/once.ts +19 -19
  407. package/src/utils/zod-utils.ts +1 -3
  408. package/dist/assets/CellStatus-BP2mavAq.js +0 -1
  409. package/dist/assets/JsonOutput-D6HIIsCb.js +0 -11
  410. package/dist/assets/MarimoErrorOutput-D60XkCny.js +0 -6
  411. package/dist/assets/RunButton-CK3LhnP5.js +0 -1
  412. package/dist/assets/__vite-browser-external-CYO_P3S8.js +0 -1
  413. package/dist/assets/__vite-browser-external-FeDVGZU8.js +0 -1
  414. package/dist/assets/ai-model-dropdown-B0z6-zhp.js +0 -5
  415. package/dist/assets/any-language-editor-BLCAD3yx.js +0 -1
  416. package/dist/assets/api-BeC_VSGv.js +0 -1
  417. package/dist/assets/arrays-BqUx5USx.js +0 -1
  418. package/dist/assets/cell-editor-ADVfycpN.js +0 -21
  419. package/dist/assets/cell-link-LSth_8hT.js +0 -1
  420. package/dist/assets/chat-panel-DQ6HkWEF.js +0 -4
  421. package/dist/assets/chat-ui-Df8Vcj6n.js +0 -4
  422. package/dist/assets/circle-play-CYIb0qT6.js +0 -1
  423. package/dist/assets/code-visibility-B-_GvwR5.js +0 -1
  424. package/dist/assets/coerce-CpE6kUdX.js +0 -1
  425. package/dist/assets/column-preview-Cm2D6vyX.js +0 -1
  426. package/dist/assets/command-palette-DTSQ7gOC.js +0 -1
  427. package/dist/assets/components-CXfO-F47.js +0 -1
  428. package/dist/assets/config-BOKzA3tF.js +0 -1
  429. package/dist/assets/config-DX8Y2WbJ.js +0 -1
  430. package/dist/assets/config-VPSq73n8.js +0 -1
  431. package/dist/assets/edit-page-ChcSgpke.js +0 -9
  432. package/dist/assets/feedback-button-B2gKC5cn.js +0 -1
  433. package/dist/assets/file-explorer-panel-BEEK5lcl.js +0 -1
  434. package/dist/assets/home-page-DMHnsRxm.js +0 -4
  435. package/dist/assets/index-Bcdzex-3.css +0 -2
  436. package/dist/assets/index-s-M1OXjs.js +0 -29
  437. package/dist/assets/kiosk-mode-BZECfg9k.js +0 -1
  438. package/dist/assets/layout-DmcNEu3P.js +0 -9
  439. package/dist/assets/linear-0eij_aAG.js +0 -1
  440. package/dist/assets/link-NuFVR7G9.js +0 -1
  441. package/dist/assets/links-DkkL9DVa.js +0 -1
  442. package/dist/assets/numbers-Mk3-CcoU.js +0 -1
  443. package/dist/assets/packages-panel-BMGOmZkR.js +0 -1
  444. package/dist/assets/pair-CaQyK6En.js +0 -1
  445. package/dist/assets/panels-CxVG8-v2.js +0 -4
  446. package/dist/assets/precisionRound-Bq_nmf5u.js +0 -1
  447. package/dist/assets/process-output-D0KGq04R.js +0 -1
  448. package/dist/assets/react-vega-C3rYGtP6.js +0 -189
  449. package/dist/assets/requests-CgSY1X4a.js +0 -1
  450. package/dist/assets/run-page-DF3c5cDk.js +0 -1
  451. package/dist/assets/scratchpad-panel-Dwd6W5PE.js +0 -1
  452. package/dist/assets/session-panel-VdDhEBa-.js +0 -1
  453. package/dist/assets/state-BAJYRhmO.js +0 -1
  454. package/dist/assets/state-_Qai_QyX.js +0 -3
  455. package/dist/assets/tooltip-mT3CGest.js +0 -61
  456. package/dist/assets/tracing-Di6pUmX8.js +0 -1
  457. package/dist/assets/tracing-panel-PeRXHD8_.js +0 -2
  458. package/dist/assets/useAsyncData-C7aJJz0Y.js +0 -1
  459. package/dist/assets/useBoolean-BDD6_xQQ.js +0 -1
  460. package/dist/assets/useCellActionButton-B-9eG5z_.js +0 -1
  461. package/dist/assets/useDebounce-B_ccBZTp.js +0 -1
  462. package/dist/assets/useNotebookActions-NHN6A-cN.js +0 -1
  463. package/dist/assets/vega-component-CnadTgoE.js +0 -1
  464. package/dist/assets/vega-loader.browser-CLRkNgm7.js +0 -6
  465. package/dist/assets/ws-BXWY541V.js +0 -22
  466. package/src/core/state/__tests__/jotai.test.ts +0 -25
  467. package/src/core/websocket/__tests__/useWebSocket.test.ts +0 -49
  468. package/src/core/websocket/transports/__tests__/basic.test.ts +0 -275
  469. package/src/core/websocket/transports/__tests__/sse.test.ts +0 -338
  470. package/src/core/websocket/transports/__tests__/transport.test.ts +0 -308
  471. package/src/core/websocket/transports/__tests__/ws.test.ts +0 -125
  472. package/src/core/websocket/transports/basic.ts +0 -102
  473. package/src/core/websocket/transports/sse.ts +0 -308
  474. package/src/core/websocket/transports/transport.ts +0 -61
  475. package/src/core/websocket/transports/ws.ts +0 -98
  476. package/src/core/websocket/useWebSocket.tsx +0 -88
package/dist/index.html CHANGED
@@ -66,68 +66,68 @@
66
66
  <marimo-server-token data-token="{{ server_token }}" hidden></marimo-server-token>
67
67
  <!-- /TODO -->
68
68
  <title>{{ title }}</title>
69
- <script type="module" crossorigin src="./assets/index-s-M1OXjs.js"></script>
69
+ <script type="module" crossorigin src="./assets/index-EG2n8Oht.js"></script>
70
70
  <link rel="modulepreload" crossorigin href="./assets/rolldown-runtime-B0Z9INg1.js">
71
71
  <link rel="modulepreload" crossorigin href="./assets/react-DVplv7_D.js">
72
72
  <link rel="modulepreload" crossorigin href="./assets/compiler-runtime-BrajqUja.js">
73
- <link rel="modulepreload" crossorigin href="./assets/useEvent-Dfcbgjhg.js">
73
+ <link rel="modulepreload" crossorigin href="./assets/useEvent-BDjgaBtz.js">
74
74
  <link rel="modulepreload" crossorigin href="./assets/react-dom-_LrxgvjW.js">
75
- <link rel="modulepreload" crossorigin href="./assets/schemas-Dv42wLFq.js">
75
+ <link rel="modulepreload" crossorigin href="./assets/schemas-ChRqMOTL.js">
76
76
  <link rel="modulepreload" crossorigin href="./assets/isObject-BCaOs5rp.js">
77
77
  <link rel="modulepreload" crossorigin href="./assets/isSymbol-oX0TOjjx.js">
78
78
  <link rel="modulepreload" crossorigin href="./assets/now-Cmx0b_zA.js">
79
79
  <link rel="modulepreload" crossorigin href="./assets/debounce-aFmHgJZY.js">
80
80
  <link rel="modulepreload" crossorigin href="./assets/isArrayLikeObject-DnwgSs_Z.js">
81
81
  <link rel="modulepreload" crossorigin href="./assets/_baseMerge-CQpUq7ep.js">
82
- <link rel="modulepreload" crossorigin href="./assets/objects-snlMn4yk.js">
83
- <link rel="modulepreload" crossorigin href="./assets/useEventListener-D9cftcHj.js">
82
+ <link rel="modulepreload" crossorigin href="./assets/objects-rLPlQ3X_.js">
83
+ <link rel="modulepreload" crossorigin href="./assets/useEventListener-CjDeLqFC.js">
84
84
  <link rel="modulepreload" crossorigin href="./assets/invariant-Ci2dTZ72.js">
85
- <link rel="modulepreload" crossorigin href="./assets/config-VPSq73n8.js">
85
+ <link rel="modulepreload" crossorigin href="./assets/config-DpY86_Yq.js">
86
86
  <link rel="modulepreload" crossorigin href="./assets/utils-B4K466FK.js">
87
- <link rel="modulepreload" crossorigin href="./assets/session-DqoWmb7X.js">
87
+ <link rel="modulepreload" crossorigin href="./assets/session-CMLIzZKw.js">
88
88
  <link rel="modulepreload" crossorigin href="./assets/Deferred-CrTnjj37.js">
89
- <link rel="modulepreload" crossorigin href="./assets/config-DX8Y2WbJ.js">
89
+ <link rel="modulepreload" crossorigin href="./assets/config-CD1IuZFJ.js">
90
90
  <link rel="modulepreload" crossorigin href="./assets/clsx-DB0hHKMi.js">
91
91
  <link rel="modulepreload" crossorigin href="./assets/cn-ldLVeaqm.js">
92
92
  <link rel="modulepreload" crossorigin href="./assets/jsx-runtime-B74pBk57.js">
93
- <link rel="modulepreload" crossorigin href="./assets/fullscreen-B9tHcfpV.js">
94
- <link rel="modulepreload" crossorigin href="./assets/dist-iaThVDkA.js">
95
- <link rel="modulepreload" crossorigin href="./assets/menu-items-BrwnTgyK.js">
96
- <link rel="modulepreload" crossorigin href="./assets/use-restore-focus-BxEGwIbk.js">
93
+ <link rel="modulepreload" crossorigin href="./assets/fullscreen-BWTs8pYZ.js">
94
+ <link rel="modulepreload" crossorigin href="./assets/dist-jlhMTKo_.js">
95
+ <link rel="modulepreload" crossorigin href="./assets/menu-items-BgUyNUpu.js">
96
+ <link rel="modulepreload" crossorigin href="./assets/use-restore-focus-DdS7Tl0F.js">
97
97
  <link rel="modulepreload" crossorigin href="./assets/createLucideIcon-DfJ2oMlA.js">
98
- <link rel="modulepreload" crossorigin href="./assets/circle-DXf-VWZG.js">
99
- <link rel="modulepreload" crossorigin href="./assets/button-COI-NGrx.js">
98
+ <link rel="modulepreload" crossorigin href="./assets/circle-B6D_6D8w.js">
99
+ <link rel="modulepreload" crossorigin href="./assets/button-D8gVKwe-.js">
100
100
  <link rel="modulepreload" crossorigin href="./assets/check-BQNapYaf.js">
101
101
  <link rel="modulepreload" crossorigin href="./assets/I18nProvider-Cg2I_s1_.js">
102
102
  <link rel="modulepreload" crossorigin href="./assets/useNumberFormatter-D7O_26UI.js">
103
- <link rel="modulepreload" crossorigin href="./assets/select-DTBn5eTb.js">
104
- <link rel="modulepreload" crossorigin href="./assets/toast-BGzLGnvw.js">
105
- <link rel="modulepreload" crossorigin href="./assets/tooltip-C9TuY18o.js">
103
+ <link rel="modulepreload" crossorigin href="./assets/select-3CVGlYrC.js">
104
+ <link rel="modulepreload" crossorigin href="./assets/toast-Gzxi-le_.js">
105
+ <link rel="modulepreload" crossorigin href="./assets/tooltip-CkGm8X7m.js">
106
106
  <link rel="modulepreload" crossorigin href="./assets/paths-bkIFVj8h.js">
107
107
  <link rel="modulepreload" crossorigin href="./assets/useLifecycle-Mq4gc5kS.js">
108
108
  <link rel="modulepreload" crossorigin href="./assets/toDate-DOj9Q6uC.js">
109
109
  <link rel="modulepreload" crossorigin href="./assets/database-zap-B_PMVg8T.js">
110
- <link rel="modulepreload" crossorigin href="./assets/alert-dialog-BaPGzeOK.js">
111
- <link rel="modulepreload" crossorigin href="./assets/arrays-BqUx5USx.js">
112
- <link rel="modulepreload" crossorigin href="./assets/once-Haz_uxEL.js">
113
- <link rel="modulepreload" crossorigin href="./assets/numbers-Mk3-CcoU.js">
114
- <link rel="modulepreload" crossorigin href="./assets/useDebounce-B_ccBZTp.js">
115
- <link rel="modulepreload" crossorigin href="./assets/input-BoBxR50a.js">
110
+ <link rel="modulepreload" crossorigin href="./assets/alert-dialog-C-sWmKva.js">
111
+ <link rel="modulepreload" crossorigin href="./assets/arrays-0R2reF2y.js">
112
+ <link rel="modulepreload" crossorigin href="./assets/once-6KNTRW0u.js">
113
+ <link rel="modulepreload" crossorigin href="./assets/numbers-CsZVw3Dc.js">
114
+ <link rel="modulepreload" crossorigin href="./assets/useDebounce-DwTQ_1Pu.js">
115
+ <link rel="modulepreload" crossorigin href="./assets/input-DmHMEZGh.js">
116
116
  <link rel="modulepreload" crossorigin href="./assets/use-toast-Wu434mLr.js">
117
- <link rel="modulepreload" crossorigin href="./assets/requests-lt0JK8Jt.js">
117
+ <link rel="modulepreload" crossorigin href="./assets/requests-BIFR-h4M.js">
118
118
  <link rel="modulepreload" crossorigin href="./assets/uuid-k9DpjH68.js">
119
- <link rel="modulepreload" crossorigin href="./assets/write-secret-modal-DzKAInL2.js">
119
+ <link rel="modulepreload" crossorigin href="./assets/write-secret-modal-BEx-EUlh.js">
120
120
  <link rel="modulepreload" crossorigin href="./assets/plus-C5silF6g.js">
121
121
  <link rel="modulepreload" crossorigin href="./assets/trash-2-DcgaW8fn.js">
122
122
  <link rel="modulepreload" crossorigin href="./assets/preload-helper-uBIymjUX.js">
123
123
  <link rel="modulepreload" crossorigin href="./assets/dist-Cny7_yZb.js">
124
124
  <link rel="modulepreload" crossorigin href="./assets/dist-DBMV4gqt.js">
125
- <link rel="modulepreload" crossorigin href="./assets/capabilities-BJvf-MD4.js">
125
+ <link rel="modulepreload" crossorigin href="./assets/capabilities-Pq1YNPlK.js">
126
126
  <link rel="modulepreload" crossorigin href="./assets/cjs-C49f7GXV.js">
127
- <link rel="modulepreload" crossorigin href="./assets/createReducer-DgRODTW6.js">
127
+ <link rel="modulepreload" crossorigin href="./assets/createReducer-CaI_Oa0v.js">
128
128
  <link rel="modulepreload" crossorigin href="./assets/dist-qhAY4L2r.js">
129
129
  <link rel="modulepreload" crossorigin href="./assets/marked.esm-B_3iMIUq.js">
130
- <link rel="modulepreload" crossorigin href="./assets/strings-B2vv-ENv.js">
130
+ <link rel="modulepreload" crossorigin href="./assets/strings-C25fhMR_.js">
131
131
  <link rel="modulepreload" crossorigin href="./assets/dist-BOfh4hMd.js">
132
132
  <link rel="modulepreload" crossorigin href="./assets/badge-crT3E0Rm.js">
133
133
  <link rel="modulepreload" crossorigin href="./assets/dist-DtH-7lot.js">
@@ -136,84 +136,84 @@
136
136
  <link rel="modulepreload" crossorigin href="./assets/dist-LSsCJjA3.js">
137
137
  <link rel="modulepreload" crossorigin href="./assets/dist-DusFODSa.js">
138
138
  <link rel="modulepreload" crossorigin href="./assets/stex-Dc5bKD4z.js">
139
- <link rel="modulepreload" crossorigin href="./assets/useTheme-COhSHkCj.js">
140
- <link rel="modulepreload" crossorigin href="./assets/useAsyncData-C7aJJz0Y.js">
139
+ <link rel="modulepreload" crossorigin href="./assets/useTheme-BAA27lh7.js">
140
+ <link rel="modulepreload" crossorigin href="./assets/useAsyncData-qvoPYHtx.js">
141
141
  <link rel="modulepreload" crossorigin href="./assets/purify.es--06brOip.js">
142
- <link rel="modulepreload" crossorigin href="./assets/cells-BRkCaSsh.js">
143
- <link rel="modulepreload" crossorigin href="./assets/coerce-CpE6kUdX.js">
142
+ <link rel="modulepreload" crossorigin href="./assets/cells-D_11MjVB.js">
143
+ <link rel="modulepreload" crossorigin href="./assets/coerce-DWjFeXOY.js">
144
144
  <link rel="modulepreload" crossorigin href="./assets/get-DjNf4SIX.js">
145
145
  <link rel="modulepreload" crossorigin href="./assets/_hasPath-BmRQipI0.js">
146
146
  <link rel="modulepreload" crossorigin href="./assets/hasIn-yw4sIeJR.js">
147
147
  <link rel="modulepreload" crossorigin href="./assets/_baseSet-Bpdo9AvU.js">
148
148
  <link rel="modulepreload" crossorigin href="./assets/pick-DKIID_Mo.js">
149
- <link rel="modulepreload" crossorigin href="./assets/state-BAJYRhmO.js">
150
- <link rel="modulepreload" crossorigin href="./assets/state-C3oDoyFe.js">
151
- <link rel="modulepreload" crossorigin href="./assets/LazyAnyLanguageCodeMirror-CKcCbG2G.js">
152
- <link rel="modulepreload" crossorigin href="./assets/copy-D8O_CYCG.js">
149
+ <link rel="modulepreload" crossorigin href="./assets/errors-CNsgAw6m.js">
150
+ <link rel="modulepreload" crossorigin href="./assets/config-DMz7oN0r.js">
151
+ <link rel="modulepreload" crossorigin href="./assets/state-B_MCKzBL.js">
152
+ <link rel="modulepreload" crossorigin href="./assets/state-C5WAeuTu.js">
153
+ <link rel="modulepreload" crossorigin href="./assets/LazyAnyLanguageCodeMirror-BPYE76jR.js">
154
+ <link rel="modulepreload" crossorigin href="./assets/copy-KlhazlhB.js">
153
155
  <link rel="modulepreload" crossorigin href="./assets/micromark-factory-space-D9Dr-k4J.js">
154
156
  <link rel="modulepreload" crossorigin href="./assets/chunk-YOKDWASO-BIpRENEC.js">
155
- <link rel="modulepreload" crossorigin href="./assets/markdown-renderer-BG3sp2rs.js">
157
+ <link rel="modulepreload" crossorigin href="./assets/markdown-renderer-BWUzqkJM.js">
156
158
  <link rel="modulepreload" crossorigin href="./assets/copy-Djr5m5ac.js">
157
- <link rel="modulepreload" crossorigin href="./assets/copy-icon-BIiRXh_3.js">
158
- <link rel="modulepreload" crossorigin href="./assets/useRunCells-B2vUhREg.js">
159
- <link rel="modulepreload" crossorigin href="./assets/RenderHTML-BbOqmHy3.js">
160
- <link rel="modulepreload" crossorigin href="./assets/blob-D5nfNHOo.js">
159
+ <link rel="modulepreload" crossorigin href="./assets/copy-icon-8-a5vovc.js">
160
+ <link rel="modulepreload" crossorigin href="./assets/useRunCells-ByaWxoIt.js">
161
+ <link rel="modulepreload" crossorigin href="./assets/RenderHTML-DQvxDDNS.js">
162
+ <link rel="modulepreload" crossorigin href="./assets/blob-5VcB8K_t.js">
161
163
  <link rel="modulepreload" crossorigin href="./assets/kbd-pdKBv96t.js">
162
- <link rel="modulepreload" crossorigin href="./assets/useInstallPackage-iX1eufdl.js">
163
- <link rel="modulepreload" crossorigin href="./assets/errors-DCrsa1nH.js">
164
- <link rel="modulepreload" crossorigin href="./assets/api-BeC_VSGv.js">
164
+ <link rel="modulepreload" crossorigin href="./assets/useInstallPackage-wcDq9hYT.js">
165
165
  <link rel="modulepreload" crossorigin href="./assets/share-BZW3tzEX.js">
166
166
  <link rel="modulepreload" crossorigin href="./assets/events-CbeVJ6OD.js">
167
- <link rel="modulepreload" crossorigin href="./assets/state-_Qai_QyX.js">
168
- <link rel="modulepreload" crossorigin href="./assets/pair-CaQyK6En.js">
169
- <link rel="modulepreload" crossorigin href="./assets/ErrorBoundary-Gl5nCA8C.js">
170
- <link rel="modulepreload" crossorigin href="./assets/config-BOKzA3tF.js">
167
+ <link rel="modulepreload" crossorigin href="./assets/state-Bl9BiY_s.js">
168
+ <link rel="modulepreload" crossorigin href="./assets/ErrorBoundary-CAEGdoFW.js">
171
169
  <link rel="modulepreload" crossorigin href="./assets/chevron-right-eAtVhbNZ.js">
172
- <link rel="modulepreload" crossorigin href="./assets/dropdown-menu-C1rnl-0o.js">
173
- <link rel="modulepreload" crossorigin href="./assets/html-to-image-DK9Zl1lU.js">
174
- <link rel="modulepreload" crossorigin href="./assets/download-DCJXy66H.js">
175
- <link rel="modulepreload" crossorigin href="./assets/switch-CTaiAjrz.js">
176
- <link rel="modulepreload" crossorigin href="./assets/tabs-BuQlZFbt.js">
170
+ <link rel="modulepreload" crossorigin href="./assets/dropdown-menu-DS6umAnH.js">
171
+ <link rel="modulepreload" crossorigin href="./assets/html-to-image-D_0rd3_B.js">
172
+ <link rel="modulepreload" crossorigin href="./assets/download-dK52bLxZ.js">
173
+ <link rel="modulepreload" crossorigin href="./assets/switch-DYjBfpNJ.js">
174
+ <link rel="modulepreload" crossorigin href="./assets/tabs-CY8E4r9U.js">
177
175
  <link rel="modulepreload" crossorigin href="./assets/table-DG7Ap4H4.js">
178
176
  <link rel="modulepreload" crossorigin href="./assets/eye-off-CxVozGAC.js">
179
177
  <link rel="modulepreload" crossorigin href="./assets/refresh-cw-Qw1f8Jhy.js">
180
- <link rel="modulepreload" crossorigin href="./assets/tree-actions-GM5E_bUs.js">
178
+ <link rel="modulepreload" crossorigin href="./assets/tree-actions-BZNTQ12N.js">
181
179
  <link rel="modulepreload" crossorigin href="./assets/ellipsis-63DyBLHQ.js">
182
180
  <link rel="modulepreload" crossorigin href="./assets/external-link-UrX9KO36.js">
183
181
  <link rel="modulepreload" crossorigin href="./assets/spinner-DyNE-o8o.js">
184
182
  <link rel="modulepreload" crossorigin href="./assets/message-circle-C3rKm8_a.js">
185
183
  <link rel="modulepreload" crossorigin href="./assets/hat-glasses-C8RhSVii.js">
186
184
  <link rel="modulepreload" crossorigin href="./assets/package-GSoSTiIK.js">
187
- <link rel="modulepreload" crossorigin href="./assets/datasource-Cq6x_5ML.js">
185
+ <link rel="modulepreload" crossorigin href="./assets/datasource-deuXnlU-.js">
186
+ <link rel="modulepreload" crossorigin href="./assets/error-entries-3GVk2KjS.js">
188
187
  <link rel="modulepreload" crossorigin href="./assets/alert-DTaqCu_d.js">
189
- <link rel="modulepreload" crossorigin href="./assets/state-XsPO8hNi.js">
190
- <link rel="modulepreload" crossorigin href="./assets/cell-link-LSth_8hT.js">
191
- <link rel="modulepreload" crossorigin href="./assets/MarimoErrorOutput-D60XkCny.js">
188
+ <link rel="modulepreload" crossorigin href="./assets/state-Dv059B3A.js">
189
+ <link rel="modulepreload" crossorigin href="./assets/cell-link-C5yYyzuF.js">
190
+ <link rel="modulepreload" crossorigin href="./assets/MarimoErrorOutput-CgZvP0p0.js">
192
191
  <link rel="modulepreload" crossorigin href="./assets/useDateFormatter-DA-62E-Y.js">
193
192
  <link rel="modulepreload" crossorigin href="./assets/en-US-Buu61juQ.js">
194
193
  <link rel="modulepreload" crossorigin href="./assets/isValid-q_Ad80ug.js">
195
- <link rel="modulepreload" crossorigin href="./assets/dates-BbFQ2oE4.js">
194
+ <link rel="modulepreload" crossorigin href="./assets/dates-CQMwFko2.js">
196
195
  <link rel="modulepreload" crossorigin href="./assets/defaultLocale-CNPGWpMu.js">
197
- <link rel="modulepreload" crossorigin href="./assets/precisionRound-Bq_nmf5u.js">
196
+ <link rel="modulepreload" crossorigin href="./assets/precisionRound-BxlUs8G4.js">
198
197
  <link rel="modulepreload" crossorigin href="./assets/defaultLocale-D5bOh7g6.js">
199
- <link rel="modulepreload" crossorigin href="./assets/vega-loader.browser-CLRkNgm7.js">
200
- <link rel="modulepreload" crossorigin href="./assets/tooltip-mT3CGest.js">
198
+ <link rel="modulepreload" crossorigin href="./assets/vega-loader.browser-Bu25TKax.js">
199
+ <link rel="modulepreload" crossorigin href="./assets/tooltip-Brya4Ghn.js">
201
200
  <link rel="modulepreload" crossorigin href="./assets/react-icons.esm-D6tfmvq8.js">
202
201
  <link rel="modulepreload" crossorigin href="./assets/extends-CvVTau-c.js">
203
202
  <link rel="modulepreload" crossorigin href="./assets/objectWithoutPropertiesLoose-Do6ywDBO.js">
204
- <link rel="modulepreload" crossorigin href="./assets/useIframeCapabilities-CwTkczVN.js">
205
- <link rel="modulepreload" crossorigin href="./assets/error-banner-Cd69vvyX.js">
206
- <link rel="modulepreload" crossorigin href="./assets/utils-CaQYvazl.js">
207
- <link rel="modulepreload" crossorigin href="./assets/formats-yZ06h1Pl.js">
203
+ <link rel="modulepreload" crossorigin href="./assets/useIframeCapabilities-Czr9e4uG.js">
204
+ <link rel="modulepreload" crossorigin href="./assets/error-banner-B5kzVf_0.js">
205
+ <link rel="modulepreload" crossorigin href="./assets/utils-DfElfBpz.js">
206
+ <link rel="modulepreload" crossorigin href="./assets/formats-zylfwejq.js">
208
207
  <link rel="modulepreload" crossorigin href="./assets/table-vrvqpuKJ.js">
209
208
  <link rel="modulepreload" crossorigin href="./assets/react-resizable-panels.browser.esm-Dbe0MrFr.js">
210
- <link rel="modulepreload" crossorigin href="./assets/JsonOutput-D6HIIsCb.js">
209
+ <link rel="modulepreload" crossorigin href="./assets/useStateForKey-CGMJQT8x.js">
210
+ <link rel="modulepreload" crossorigin href="./assets/JsonOutput-CyAKmZDD.js">
211
211
  <link rel="modulepreload" crossorigin href="./assets/chart-no-axes-column-C4_v6fQW.js">
212
212
  <link rel="modulepreload" crossorigin href="./assets/square-function-_W_Lo0P4.js">
213
- <link rel="modulepreload" crossorigin href="./assets/spec-BfSBcO5B.js">
213
+ <link rel="modulepreload" crossorigin href="./assets/spec-uCpVvaAR.js">
214
214
  <link rel="modulepreload" crossorigin href="./assets/semaphore-BjoL5P0h.js">
215
215
  <link rel="modulepreload" crossorigin href="./assets/fileToBase64-BgBraYAr.js">
216
- <link rel="modulepreload" crossorigin href="./assets/useBoolean-BDD6_xQQ.js">
216
+ <link rel="modulepreload" crossorigin href="./assets/useBoolean-Dd2nWXFJ.js">
217
217
  <link rel="modulepreload" crossorigin href="./assets/code-xml-SQaZqvcO.js">
218
218
  <link rel="modulepreload" crossorigin href="./assets/file-headphone-Dl35U6h3.js">
219
219
  <link rel="modulepreload" crossorigin href="./assets/file-BPBVl9pl.js">
@@ -221,27 +221,28 @@
221
221
  <link rel="modulepreload" crossorigin href="./assets/file-icons-CdJgUy-I.js">
222
222
  <link rel="modulepreload" crossorigin href="./assets/globe-UdPdIbF7.js">
223
223
  <link rel="modulepreload" crossorigin href="./assets/esm-CI_o7NhW.js">
224
- <link rel="modulepreload" crossorigin href="./assets/useAddCell-GR7eEQrT.js">
225
- <link rel="modulepreload" crossorigin href="./assets/readonly-python-code-DCSMIsTX.js">
224
+ <link rel="modulepreload" crossorigin href="./assets/useAddCell-Cjuqk2YR.js">
225
+ <link rel="modulepreload" crossorigin href="./assets/readonly-python-code-RFuQP50v.js">
226
226
  <link rel="modulepreload" crossorigin href="./assets/data-grid-types-DgHVN_Zz.js">
227
- <link rel="modulepreload" crossorigin href="./assets/glide-utils-CIrAxdjv.js">
228
- <link rel="modulepreload" crossorigin href="./assets/column-preview-Cm2D6vyX.js">
227
+ <link rel="modulepreload" crossorigin href="./assets/glide-utils-HFqhvWHI.js">
228
+ <link rel="modulepreload" crossorigin href="./assets/column-preview-xe533-Cn.js">
229
229
  <link rel="modulepreload" crossorigin href="./assets/square-BPmgQFnh.js">
230
230
  <link rel="modulepreload" crossorigin href="./assets/triangle-alert-DmIqR8sY.js">
231
231
  <link rel="modulepreload" crossorigin href="./assets/prop-types-Djf4O40e.js">
232
- <link rel="modulepreload" crossorigin href="./assets/es-Cqst59WX.js">
233
- <link rel="modulepreload" crossorigin href="./assets/package-data-dv4FBHxR.js">
232
+ <link rel="modulepreload" crossorigin href="./assets/es-N9SHpmG7.js">
233
+ <link rel="modulepreload" crossorigin href="./assets/package-data-CKPmBDtg.js">
234
234
  <link rel="modulepreload" crossorigin href="./assets/markdown-export-DzhB1FrN.js">
235
- <link rel="modulepreload" crossorigin href="./assets/renderShortcut-BkVJQ_Zh.js">
235
+ <link rel="modulepreload" crossorigin href="./assets/renderShortcut-rUwGqKgC.js">
236
236
  <link rel="modulepreload" crossorigin href="./assets/bundle.esm-D3tw5rqW.js">
237
237
  <link rel="modulepreload" crossorigin href="./assets/icons-CiZ_8zS-.js">
238
- <link rel="modulepreload" crossorigin href="./assets/useDeepCompareMemoize-DFIVN9dn.js">
238
+ <link rel="modulepreload" crossorigin href="./assets/useDeepCompareMemoize-B2DVK2De.js">
239
+ <link rel="modulepreload" crossorigin href="./assets/useDelayElapsed-BlsDT4TV.js">
239
240
  <link rel="modulepreload" crossorigin href="./assets/pathUtils-DPmlLd-r.js">
240
- <link rel="modulepreload" crossorigin href="./assets/floating-outline-XD9FAV-f.js">
241
+ <link rel="modulepreload" crossorigin href="./assets/floating-outline-ChmAuvxz.js">
241
242
  <link rel="stylesheet" crossorigin href="./assets/cells-0PFKL3SH.css">
242
243
  <link rel="stylesheet" crossorigin href="./assets/markdown-renderer-DjIHoF9Z.css">
243
244
  <link rel="stylesheet" crossorigin href="./assets/JsonOutput-B0GmlMnR.css">
244
- <link rel="stylesheet" crossorigin href="./assets/index-Bcdzex-3.css">
245
+ <link rel="stylesheet" crossorigin href="./assets/index-BnhSnwvB.css">
245
246
  </head>
246
247
  <body>
247
248
  <div id="root"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marimo-team/frontend",
3
- "version": "0.25.2",
3
+ "version": "0.25.3-dev100",
4
4
  "main": "dist/main.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",
@@ -57,6 +57,7 @@
57
57
  "@marimo-team/codemirror-mcp": "^0.1.7",
58
58
  "@marimo-team/codemirror-sql": "^0.3.0",
59
59
  "@marimo-team/llm-info": "workspace:*",
60
+ "@marimo-team/client": "workspace:*",
60
61
  "@marimo-team/marimo-api": "workspace:*",
61
62
  "@marimo-team/react-slotz": "^0.2.0",
62
63
  "@marimo-team/smart-cells": "workspace:*",
@@ -152,6 +153,7 @@
152
153
  "typescript-memoize": "^1.1.1",
153
154
  "use-acp": "0.2.6",
154
155
  "use-resize-observer": "^9.1.0",
156
+ "vega": "6.2.0",
155
157
  "vega-lite": "6.4.3",
156
158
  "vega-loader": "^5.1.3",
157
159
  "vega-parser": "^7.1.3",
@@ -183,7 +185,8 @@
183
185
  "preview:islands": "cross-env VITE_MARIMO_VERSION='0.4.6' VITE_MARIMO_ISLANDS=true vite --config islands/vite.config.mts build",
184
186
  "storybook": "storybook dev -p 6006",
185
187
  "build-storybook": "storybook build",
186
- "sync-katex-css": "node --experimental-strip-types scripts/sync-katex-css.ts"
188
+ "sync-katex-css": "node --experimental-strip-types scripts/sync-katex-css.ts",
189
+ "doctor": "npx react-doctor@latest"
187
190
  },
188
191
  "peerDependencies": {
189
192
  "react": "^17 || ^18 || ^19",
@@ -205,7 +208,7 @@
205
208
  "@types/react": "^19.3.0",
206
209
  "@types/react-dom": "^19.3.0",
207
210
  "@types/timestring": "^6.0.5",
208
- "@vitejs/plugin-react": "^6.1.1",
211
+ "@vitejs/plugin-react": "^6.1.2",
209
212
  "@vitest/coverage-v8": "4.1.11",
210
213
  "blob-polyfill": "^7.0.20220408",
211
214
  "cross-env": "^7.0.3",
@@ -215,7 +218,7 @@
215
218
  "oxc-transform-react": "0.145.0",
216
219
  "oxfmt": "^0.68.0",
217
220
  "oxlint": "^1.83.0",
218
- "postcss": "^8.5.28",
221
+ "postcss": "^8.5.29",
219
222
  "postcss-prefix-selector": "^2.2.1",
220
223
  "react": "^19.3.0",
221
224
  "react-dom": "^19.3.0",
@@ -224,7 +227,7 @@
224
227
  "stylelint-config-standard": "^36.0.1",
225
228
  "tailwindcss": "^4.3.3",
226
229
  "vega-typings": "^2.3.0",
227
- "vite": "^8.3.0",
230
+ "vite": "^8.3.4",
228
231
  "vite-plugin-wasm": "^3.6.0",
229
232
  "vitest": "^4.1.11",
230
233
  "yaml": "^2.9.1"
@@ -2,11 +2,12 @@
2
2
 
3
3
  import { readFileSync } from "node:fs";
4
4
  import path from "node:path";
5
- import { pairPreviewSchema } from "@/core/config/pair";
5
+ import { pairConfigSchema } from "@/core/config/pair";
6
6
 
7
7
  // Read the Python-owned resource only in tests to check the shared contract.
8
- export const PAIR_PREVIEW = pairPreviewSchema.parse({
8
+ export const PAIR_CONFIG = pairConfigSchema.parse({
9
9
  command: "uvx marimo@latest",
10
+ hostEnabled: true,
10
11
  templates: JSON.parse(
11
12
  readFileSync(
12
13
  path.resolve(
@@ -0,0 +1,101 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import NodeChildProcess from "node:child_process";
4
+ import NodeFs from "node:fs";
5
+ import NodeOs from "node:os";
6
+ import NodePath from "node:path";
7
+ import NodeUrl from "node:url";
8
+ import { expect, it } from "vitest";
9
+ import { z } from "zod";
10
+
11
+ it("enforces host dependencies for runtime and type imports", () => {
12
+ const frontend = NodeUrl.fileURLToPath(
13
+ new NodeUrl.URL("../../", import.meta.url),
14
+ );
15
+ const directory = NodeFs.mkdtempSync(
16
+ NodePath.join(NodeOs.tmpdir(), "host-imports-"),
17
+ );
18
+ const files = {
19
+ "src/core/host/allowed.ts": `
20
+ import { atom } from "jotai/vanilla";
21
+ import { z } from "zod";
22
+ import * as Protocol from "@marimo-team/client/protocol";
23
+ import { Logger } from "@/utils/Logger";
24
+ import type { Document } from "./document";
25
+ export * from "@/core/host/events";
26
+ type Event = import("./events").NotebookEvent;
27
+ void import("./protocol");
28
+ `,
29
+ "src/core/host/protocol.ts": `
30
+ import type { NotificationMessage as A } from "../kernel/messages";
31
+ import { type NotificationMessage as B } from "@/core/kernel/messages";
32
+ import { NotificationMessage as C } from "../kernel/messages";
33
+ import type { NotificationPayload } from "../kernel/messages";
34
+ `,
35
+ "src/core/host/forbidden.ts": `
36
+ import { useEffect } from "react";
37
+ import type { NotificationMessage } from "../kernel/messages";
38
+ export * from "../kernel/messages";
39
+ export { Logger } from "@/utils/Logger/../other";
40
+ void import("../kernel/messages");
41
+ type Message = import("../kernel/messages").NotificationMessage;
42
+ const module = require("../kernel/messages");
43
+ void import(module);
44
+ import "./__tests__/allowed";
45
+ import "./allowed.test";
46
+ `,
47
+ "src/core/host/__tests__/allowed.ts": `import { useEffect } from "react";`,
48
+ "src/core/host/allowed.test.ts": `import { useEffect } from "react";`,
49
+ "src/core/host/allowed.spec.ts": `import { useEffect } from "react";`,
50
+ "src/core/websocket/allowed.ts": `import { useEffect } from "react";`,
51
+ };
52
+ try {
53
+ for (const [path, source] of Object.entries(files)) {
54
+ const destination = NodePath.join(directory, path);
55
+ NodeFs.mkdirSync(NodePath.dirname(destination), { recursive: true });
56
+ NodeFs.writeFileSync(destination, source);
57
+ }
58
+ const result = NodeChildProcess.spawnSync(
59
+ NodePath.join(frontend, "node_modules/.bin/oxlint"),
60
+ [
61
+ "--config",
62
+ NodePath.join(frontend, ".oxlintrc.json"),
63
+ "--format",
64
+ "json",
65
+ directory,
66
+ ],
67
+ { cwd: frontend, encoding: "utf8" },
68
+ );
69
+ const report = z
70
+ .object({
71
+ diagnostics: z.array(
72
+ z.object({
73
+ severity: z.string(),
74
+ filename: z.string(),
75
+ labels: z.array(z.object({ span: z.object({ line: z.number() }) })),
76
+ }),
77
+ ),
78
+ })
79
+ .parse(JSON.parse(result.stdout));
80
+ const errors = report.diagnostics.filter(
81
+ (diagnostic) => diagnostic.severity === "error",
82
+ );
83
+ expect(
84
+ errors
85
+ .map((error) => ({
86
+ file: NodePath.basename(error.filename),
87
+ line: error.labels[0].span.line,
88
+ }))
89
+ .toSorted((a, b) => a.file.localeCompare(b.file) || a.line - b.line),
90
+ ).toEqual([
91
+ ...[2, 3, 4, 5, 6, 7, 8, 9, 10, 11].map((line) => ({
92
+ file: "forbidden.ts",
93
+ line,
94
+ })),
95
+ ...[2, 3, 4, 5].map((line) => ({ file: "protocol.ts", line })),
96
+ ]);
97
+ expect(result.status).toBe(1);
98
+ } finally {
99
+ NodeFs.rmSync(directory, { recursive: true, force: true });
100
+ }
101
+ });
@@ -8,8 +8,8 @@ import { connectionAtom } from "@/core/network/connection";
8
8
  import { store } from "@/core/state/jotai";
9
9
  import { isStaticNotebook } from "@/core/static/static-state";
10
10
  import { ConnectionState } from "@/core/websocket/types";
11
- import { pairPreviewAtom } from "@/core/config/pair";
12
- import { PAIR_PREVIEW } from "./fixtures/pair-preview";
11
+ import { pairConfigAtom } from "@/core/config/pair";
12
+ import { PAIR_CONFIG } from "./fixtures/pair-config";
13
13
  import { mount, visibleForTesting } from "../mount";
14
14
 
15
15
  // Mock React DOM
@@ -84,20 +84,20 @@ describe("mount", () => {
84
84
  mockElement,
85
85
  );
86
86
 
87
- it("hydrates the server's Pair preview configuration", () => {
88
- const error = mountRead({ pairPreview: PAIR_PREVIEW });
87
+ it("hydrates the server's Pair configuration", () => {
88
+ const error = mountRead({ pairConfig: PAIR_CONFIG });
89
89
 
90
90
  expect(error).toBeUndefined();
91
- expect(store.get(pairPreviewAtom)).toEqual(PAIR_PREVIEW);
91
+ expect(store.get(pairConfigAtom)).toEqual(PAIR_CONFIG);
92
92
  });
93
93
 
94
- it("uses legacy Pair behavior when the host omits preview configuration", () => {
95
- store.set(pairPreviewAtom, PAIR_PREVIEW);
94
+ it("clears Pair configuration when the server omits it", () => {
95
+ store.set(pairConfigAtom, PAIR_CONFIG);
96
96
 
97
97
  const error = mountRead();
98
98
 
99
99
  expect(error).toBeUndefined();
100
- expect(store.get(pairPreviewAtom)).toBeUndefined();
100
+ expect(store.get(pairConfigAtom)).toBeUndefined();
101
101
  });
102
102
 
103
103
  describe("connection state initialization", () => {
@@ -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 {
@@ -501,6 +502,7 @@ const ModelListItem: React.FC<ModelListItemProps> = ({
501
502
  <ModelInfoCard model={model} />
502
503
  {model.custom && (
503
504
  <Button
505
+ aria-label={`Delete model ${model.name}`}
504
506
  variant="ghost"
505
507
  size="icon"
506
508
  onClick={handleDelete}
@@ -681,7 +683,10 @@ export const CustomProvidersConfig: React.FC<AiConfigProps> = ({
681
683
  };
682
684
 
683
685
  const removeProvider = (providerName: string) => {
684
- const { [providerName]: _, ...rest } = customProviders;
686
+ const rest = Objects.filter(
687
+ customProviders,
688
+ (_, name) => name !== providerName,
689
+ );
685
690
  // Reset to clear nested dirty state, then set new value
686
691
  form.resetField("ai.custom_providers");
687
692
  form.setValue("ai.custom_providers", rest, { shouldDirty: true });
@@ -1846,7 +1851,7 @@ export const AddModelForm: React.FC<{
1846
1851
  id={modelNameInputId}
1847
1852
  value={modelName}
1848
1853
  onChange={(e) => setModelName(e.target.value)}
1849
- placeholder="gpt-4"
1854
+ placeholder="gpt-5.6-sol"
1850
1855
  className="text-xs mb-0"
1851
1856
  />
1852
1857
  </div>
@@ -77,6 +77,23 @@ describe("useMessageQueue", () => {
77
77
  expect(result.current.messages).toEqual([]);
78
78
  });
79
79
 
80
+ it("preserves multiple enqueues and flushes before React renders", () => {
81
+ const { result } = renderHook(() => useMessageQueue());
82
+ const send = vi.fn();
83
+
84
+ act(() => {
85
+ result.current.enqueue([textPart("first")]);
86
+ result.current.enqueue([textPart("second")]);
87
+ result.current.flushNext(send);
88
+ result.current.flushNext(send);
89
+ });
90
+
91
+ expect(send).toHaveBeenNthCalledWith(1, [textPart("first")]);
92
+ expect(send).toHaveBeenNthCalledWith(2, [textPart("second")]);
93
+ expect(result.current.messages).toEqual([]);
94
+ expect(result.current.hasQueuedRef.current).toBe(false);
95
+ });
96
+
80
97
  it("flushNext on an empty queue is a no-op", () => {
81
98
  const { result } = renderHook(() => useMessageQueue());
82
99
  const send = vi.fn();
@@ -74,7 +74,7 @@ describe("state utility functions", () => {
74
74
  const newState = addSession(initialState, session);
75
75
 
76
76
  // Remove the dynamic tabId for snapshot comparison
77
- const { tabId, ...sessionWithoutId } = newState.sessions[0];
77
+ const { tabId: _tabId, ...sessionWithoutId } = newState.sessions[0];
78
78
  expect({
79
79
  ...newState,
80
80
  sessions: [sessionWithoutId],
@@ -116,7 +116,7 @@ describe("state utility functions", () => {
116
116
  const newState = addSession(initialState, newSession);
117
117
 
118
118
  // Remove dynamic tabId for snapshot
119
- const { tabId, ...sessionWithoutId } = newState.sessions[0];
119
+ const { tabId: _tabId, ...sessionWithoutId } = newState.sessions[0];
120
120
  expect({
121
121
  ...newState,
122
122
  sessions: [sessionWithoutId],
@@ -328,9 +328,9 @@ export const PlansBlock = (props: { data: PlanNotificationEvent[] }) => {
328
328
  </span>
329
329
  </div>
330
330
  <ul className="flex flex-col gap-1">
331
- {plans.map((item, index) => (
331
+ {plans.map((item) => (
332
332
  <li
333
- key={`${item.status}-${index}`}
333
+ key={item.content}
334
334
  className={`
335
335
  flex items-center gap-2 px-2 py-1 rounded
336
336
  `}
@@ -124,6 +124,7 @@ export const AddContextButton = ({
124
124
  return (
125
125
  <Tooltip content="Add context">
126
126
  <Button
127
+ aria-label="Add context"
127
128
  variant="text"
128
129
  size="icon"
129
130
  onClick={handleAddContext}
@@ -148,6 +149,7 @@ export const AttachFileButton = ({
148
149
  <>
149
150
  <Tooltip content="Attach a file">
150
151
  <Button
152
+ aria-label="Attach a file"
151
153
  variant="text"
152
154
  size="icon"
153
155
  onClick={() => fileInputRef.current?.click()}