@marimo-team/frontend 0.25.3-dev5 → 0.25.3-dev52

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 (304) hide show
  1. package/dist/assets/CellStatus-RQxLjC9P.js +1 -0
  2. package/dist/assets/{ConnectedDataExplorerComponent-t8fH_TNc.js → ConnectedDataExplorerComponent-D9UK8o9A.js} +1 -1
  3. package/dist/assets/{ErrorBoundary-B4n9EnHB.js → ErrorBoundary-DzEMMFh0.js} +2 -2
  4. package/dist/assets/JsonOutput-9IONH7hu.js +11 -0
  5. package/dist/assets/{LazyAnyLanguageCodeMirror-CKcCbG2G.js → LazyAnyLanguageCodeMirror-BPYE76jR.js} +2 -2
  6. package/dist/assets/MarimoErrorOutput-BT8Qy5wh.js +10 -0
  7. package/dist/assets/{RenderHTML-9bMgbYmo.js → RenderHTML-PyMU3fBB.js} +1 -1
  8. package/dist/assets/{RunButton-CFQUNN5c.js → RunButton-2p2uCp9U.js} +1 -1
  9. package/dist/assets/{add-cell-with-ai-C_SruRWS.js → add-cell-with-ai-CEQ8jvcR.js} +7 -7
  10. package/dist/assets/{add-connection-dialog-CoE_PhuD.js → add-connection-dialog-D9fnw-j0.js} +2 -2
  11. package/dist/assets/{agent-panel-0b3k4QzJ.js → agent-panel-DkTYXm6j.js} +3 -3
  12. package/dist/assets/ai-model-dropdown-Cv9fEAp9.js +13 -0
  13. package/dist/assets/{alert-dialog-BaPGzeOK.js → alert-dialog-C-sWmKva.js} +1 -1
  14. package/dist/assets/any-language-editor-DUMe1UCk.js +1 -0
  15. package/dist/assets/{app-config-button-iXdCWvfC.js → app-config-button-BZzwY1BU.js} +1 -1
  16. package/dist/assets/arrays-0R2reF2y.js +1 -0
  17. package/dist/assets/{blob-iOBwGaP9.js → blob-DmUUV8Xf.js} +1 -1
  18. package/dist/assets/{button-COI-NGrx.js → button-D8gVKwe-.js} +1 -1
  19. package/dist/assets/{cache-panel-DTY1dqvi.js → cache-panel-Byolv2ht.js} +1 -1
  20. package/dist/assets/{capabilities-BJvf-MD4.js → capabilities-Pq1YNPlK.js} +1 -1
  21. package/dist/assets/{cell-editor-CR-tZNnc.js → cell-editor-C6xeN3x0.js} +6 -6
  22. package/dist/assets/cell-link-BNDZZ97N.js +1 -0
  23. package/dist/assets/{cells-rA_jsZCj.js → cells-0e2dpq3z.js} +56 -56
  24. package/dist/assets/{chat-display-luF7psRA.js → chat-display-D6TNcsmz.js} +1 -1
  25. package/dist/assets/chat-panel-CN45Q9wF.js +4 -0
  26. package/dist/assets/{chat-ui-nV_m4Btr.js → chat-ui-BGl1jPPe.js} +1 -1
  27. package/dist/assets/{circle-DXf-VWZG.js → circle-B6D_6D8w.js} +1 -1
  28. package/dist/assets/code-visibility-CV3S4xuf.js +1 -0
  29. package/dist/assets/coerce-DWjFeXOY.js +1 -0
  30. package/dist/assets/{column-preview-uosAAL4X.js → column-preview-D7sTOokc.js} +1 -1
  31. package/dist/assets/command-palette-CP5KmR-S.js +1 -0
  32. package/dist/assets/{common-lisZ0l6a.js → common-GvwCMUGF.js} +1 -1
  33. package/dist/assets/{components-CP_UoFtT.js → components-DrU8dOzy.js} +1 -1
  34. package/dist/assets/{components-CXfO-F47.js → components-lDm0qi2t.js} +1 -1
  35. package/dist/assets/{components-S7ZwOrvO.js → components-nnFZuekV.js} +1 -1
  36. package/dist/assets/config-CjQ4WJnJ.js +1 -0
  37. package/dist/assets/config-DGX7JYor.js +1 -0
  38. package/dist/assets/config-DzdxZb17.js +1 -0
  39. package/dist/assets/{copy-D8O_CYCG.js → copy-KlhazlhB.js} +1 -1
  40. package/dist/assets/{copy-icon-BIiRXh_3.js → copy-icon-8-a5vovc.js} +1 -1
  41. package/dist/assets/{createReducer-DgRODTW6.js → createReducer-HKXUbqyz.js} +1 -1
  42. package/dist/assets/{datasource-V0-52XOh.js → datasource-BpMPWJoj.js} +1 -1
  43. package/dist/assets/{dates-CfmdTL6B.js → dates-CQMwFko2.js} +1 -1
  44. package/dist/assets/{dependency-graph-panel-B0uP-_id.js → dependency-graph-panel-lyJ3aygI.js} +1 -1
  45. package/dist/assets/{dist-iaThVDkA.js → dist-jlhMTKo_.js} +1 -1
  46. package/dist/assets/{documentation-panel-DVl_ebWy.js → documentation-panel-CTUWNQQy.js} +1 -1
  47. package/dist/assets/{download-Bx55LMki.js → download-Csw35OD4.js} +1 -1
  48. package/dist/assets/{dropdown-menu-C1rnl-0o.js → dropdown-menu-DS6umAnH.js} +1 -1
  49. package/dist/assets/{edit-page-CGyjT-CQ.js → edit-page-Dwf3-IB6.js} +6 -6
  50. package/dist/assets/{error-banner-Cd69vvyX.js → error-banner-B5kzVf_0.js} +1 -1
  51. package/dist/assets/{error-entries-DOWpdGvI.js → error-entries-D3H6JH3A.js} +1 -1
  52. package/dist/assets/{error-panel-C-uxLOHF.js → error-panel-CgpCPUEO.js} +1 -1
  53. package/dist/assets/{errors-DCrsa1nH.js → errors-CNsgAw6m.js} +1 -1
  54. package/dist/assets/{es-Cqst59WX.js → es-N9SHpmG7.js} +1 -1
  55. package/dist/assets/feedback-button-B8idT199.js +1 -0
  56. package/dist/assets/{feedback-button-B99ThNJW.js → feedback-button-BEBY1q2a.js} +2 -2
  57. package/dist/assets/file-explorer-panel-MnNgzxxE.js +1 -0
  58. package/dist/assets/{file-name-input-ChnBsDE_.js → file-name-input-DrtIQ1VP.js} +1 -1
  59. package/dist/assets/{floating-outline-MYqQW4Vp.js → floating-outline-Dtc8YhnE.js} +1 -1
  60. package/dist/assets/{formats-yZ06h1Pl.js → formats-zylfwejq.js} +1 -1
  61. package/dist/assets/{formatting-BqrP-n49.js → formatting-uom1es4b.js} +1 -1
  62. package/dist/assets/{fullscreen-B9tHcfpV.js → fullscreen-BWTs8pYZ.js} +1 -1
  63. package/dist/assets/{gallery-page-DSL0J4md.js → gallery-page-DL4SSfun.js} +1 -1
  64. package/dist/assets/{ganttDiagram-EL5Y4UJY-2n7Ig5Jm.js → ganttDiagram-EL5Y4UJY-CYqkCfFG.js} +1 -1
  65. package/dist/assets/{glide-data-editor-B1MWlKeM.js → glide-data-editor-BTlU9F_s.js} +2 -2
  66. package/dist/assets/{glide-utils-CIrAxdjv.js → glide-utils-HFqhvWHI.js} +2 -2
  67. package/dist/assets/{home-page-B1M3X9Yf.js → home-page-BOmrrw3X.js} +3 -3
  68. package/dist/assets/{hooks-Bj0C0zrZ.js → hooks-DRNEKPFW.js} +1 -1
  69. package/dist/assets/{html-to-image-DK9Zl1lU.js → html-to-image-D_0rd3_B.js} +1 -1
  70. package/dist/assets/index-BdCbOYjS.js +30 -0
  71. package/dist/assets/index-evFWHKmM.css +2 -0
  72. package/dist/assets/{input-BoBxR50a.js → input-ByHt6aoV.js} +1 -1
  73. package/dist/assets/{kiosk-mode-BZECfg9k.js → kiosk-mode-BGmMSc7A.js} +1 -1
  74. package/dist/assets/{layout-DBuMeWh0.js → layout-DY2TXsTM.js} +5 -5
  75. package/dist/assets/linear-Bma8J3iM.js +1 -0
  76. package/dist/assets/links-CXcpNIM0.js +1 -0
  77. package/dist/assets/{logs-panel-y0XnfulJ.js → logs-panel-9f0amGf0.js} +1 -1
  78. package/dist/assets/{markdown-renderer-Q5AhbRU3.js → markdown-renderer-BRDCZeXA.js} +1 -1
  79. package/dist/assets/{menu-items-BrwnTgyK.js → menu-items-BgUyNUpu.js} +1 -1
  80. package/dist/assets/{mermaid-a3xYymTy.js → mermaid-B6mqMm5_.js} +2 -2
  81. package/dist/assets/{name-cell-input-BNOnF6-0.js → name-cell-input-13mN6CiO.js} +1 -1
  82. package/dist/assets/numbers-CsZVw3Dc.js +1 -0
  83. package/dist/assets/{objects-snlMn4yk.js → objects-rLPlQ3X_.js} +1 -1
  84. package/dist/assets/{once-Haz_uxEL.js → once-6KNTRW0u.js} +1 -1
  85. package/dist/assets/{outline-panel-Be7stWwv.js → outline-panel-DxC82nfD.js} +1 -1
  86. package/dist/assets/{packages-panel-9Qs1npCZ.js → packages-panel-Bi_mcFbl.js} +1 -1
  87. package/dist/assets/{panel-accordion-state-GeMEdCPw.js → panel-accordion-state-D_2i5aDC.js} +1 -1
  88. package/dist/assets/panels-C-ygF1Rv.js +107 -0
  89. package/dist/assets/precisionRound-BxlUs8G4.js +1 -0
  90. package/dist/assets/process-output-DlZH3EId.js +1 -0
  91. package/dist/assets/{quadrantDiagram-AXDQQJYC-yBhCDI7E.js → quadrantDiagram-AXDQQJYC-D9KH5Zge.js} +1 -1
  92. package/dist/assets/react-vega-BTNeboR2.js +189 -0
  93. package/dist/assets/{readonly-code-display-YULOXf4h.js → readonly-code-display-C8kpTYRT.js} +1 -1
  94. package/dist/assets/{readonly-python-code-CadgXgRu.js → readonly-python-code-XeDpkiXX.js} +1 -1
  95. package/dist/assets/{renderShortcut-BkVJQ_Zh.js → renderShortcut-H60uiHBp.js} +1 -1
  96. package/dist/assets/{reveal-component-B9FLjTg_.js → reveal-component-DgYlZOla.js} +37 -37
  97. package/dist/assets/run-page-C_A8W1eR.js +1 -0
  98. package/dist/assets/{runs-BLp5jezv.js → runs-6lJxKV1w.js} +1 -1
  99. package/dist/assets/{runtime-details-state-DuChzsA6.js → runtime-details-state-BeyT-Z-4.js} +1 -1
  100. package/dist/assets/{schemas-Dv42wLFq.js → schemas-ChRqMOTL.js} +1 -1
  101. package/dist/assets/{scratchpad-panel-DtB0A8xj.js → scratchpad-panel-Fb-8g4-S.js} +1 -1
  102. package/dist/assets/{scroll-to-bottom-button-1FyowpWV.js → scroll-to-bottom-button-CIkON2WJ.js} +1 -1
  103. package/dist/assets/{secrets-panel-Bctbtkrp.js → secrets-panel-CmLZsNfp.js} +1 -1
  104. package/dist/assets/{select-DTBn5eTb.js → select-3CVGlYrC.js} +1 -1
  105. package/dist/assets/{session-DqoWmb7X.js → session-B8Y-GJnS.js} +1 -1
  106. package/dist/assets/{session-panel-B6tA28BD.js → session-panel-Cl85FUT5.js} +1 -1
  107. package/dist/assets/{snippets-panel-CQ1dn3lA.js → snippets-panel-1hl_ey1w.js} +1 -1
  108. package/dist/assets/{spec-BfSBcO5B.js → spec-uCpVvaAR.js} +1 -1
  109. package/dist/assets/{state-uwRvJLb8.js → state-BY4_P6ko.js} +1 -1
  110. package/dist/assets/{state-BAJYRhmO.js → state-C0irhlOZ.js} +1 -1
  111. package/dist/assets/{state-BUsmcyaT.js → state-CbjD81T1.js} +3 -3
  112. package/dist/assets/{state-DxQnC_1I.js → state-Ck7FMD5A.js} +1 -1
  113. package/dist/assets/{state-Bfh_2SLl.js → state-ClkxCKxQ.js} +1 -1
  114. package/dist/assets/{state-C3oDoyFe.js → state-DaWgt-rn.js} +1 -1
  115. package/dist/assets/{strings-B2vv-ENv.js → strings-C25fhMR_.js} +1 -1
  116. package/dist/assets/{swiper-component-a07domrZ.js → swiper-component-CRGRy5_O.js} +1 -1
  117. package/dist/assets/{switch-CTaiAjrz.js → switch-1h011wlH.js} +1 -1
  118. package/dist/assets/{tabs-BuQlZFbt.js → tabs-CY8E4r9U.js} +1 -1
  119. package/dist/assets/{terminal-Ck_vK-34.js → terminal-D__Z_QZ0.js} +1 -1
  120. package/dist/assets/{time-MgToa8VM.js → time-DswSXBDk.js} +1 -1
  121. package/dist/assets/{toast-BGzLGnvw.js → toast-Gzxi-le_.js} +1 -1
  122. package/dist/assets/tooltip-Brya4Ghn.js +61 -0
  123. package/dist/assets/{tooltip-C9TuY18o.js → tooltip-CkGm8X7m.js} +1 -1
  124. package/dist/assets/tracing-DcFczEy0.js +1 -0
  125. package/dist/assets/{tracing-panel-dgnr2fIN.js → tracing-panel-EWvfWPFQ.js} +2 -2
  126. package/dist/assets/{tree-actions-DAd80MbP.js → tree-actions-Dof5VISm.js} +1 -1
  127. package/dist/assets/{use-restore-focus-BxEGwIbk.js → use-restore-focus-DdS7Tl0F.js} +1 -1
  128. package/dist/assets/{useAddCell-DGstJK0S.js → useAddCell-CqnFgwhm.js} +1 -1
  129. package/dist/assets/useAsyncData-DhhdOGGd.js +1 -0
  130. package/dist/assets/useBoolean-CMgj9hnq.js +1 -0
  131. package/dist/assets/{useCellActionButton-DY9RlJTb.js → useCellActionButton--Sq8PDBs.js} +1 -1
  132. package/dist/assets/{useDeleteCell-DFBGlSQk.js → useDeleteCell-DNTqIwU8.js} +1 -1
  133. package/dist/assets/{useDependencyPanelTab-DydxsE5d.js → useDependencyPanelTab-C4_EiuVH.js} +1 -1
  134. package/dist/assets/{useEventListener-D9cftcHj.js → useEventListener-CjDeLqFC.js} +1 -1
  135. package/dist/assets/{useIframeCapabilities-CwTkczVN.js → useIframeCapabilities-Czr9e4uG.js} +1 -1
  136. package/dist/assets/{useInstallPackage-iX1eufdl.js → useInstallPackage-DDjpV5RE.js} +1 -1
  137. package/dist/assets/{useInterval--x3s1VpI.js → useInterval-DJdQmXnq.js} +1 -1
  138. package/dist/assets/{useNotebookActions-CupIPSlg.js → useNotebookActions-C00MOhyT.js} +1 -1
  139. package/dist/assets/{useRunCells-BFjFX3hz.js → useRunCells-DqLsZnRn.js} +1 -1
  140. package/dist/assets/{useSplitCell-Tqv5pPtL.js → useSplitCell-Daxc689Z.js} +1 -1
  141. package/dist/assets/{useTheme-COhSHkCj.js → useTheme-DLtPc-39.js} +1 -1
  142. package/dist/assets/{utils-CaQYvazl.js → utils-DfElfBpz.js} +1 -1
  143. package/dist/assets/vega-component-D7JFthDD.js +1 -0
  144. package/dist/assets/{vega-embed-container-DJPNkHPb.js → vega-embed-container-DtArSJz1.js} +1 -1
  145. package/dist/assets/vega-loader.browser-Bu25TKax.js +6 -0
  146. package/dist/assets/{write-secret-modal-DzKAInL2.js → write-secret-modal-usRSi1bb.js} +1 -1
  147. package/dist/assets/{xychartDiagram-S5SC5T6Z-KbGzG6-u.js → xychartDiagram-S5SC5T6Z-CeRnBS5e.js} +1 -1
  148. package/dist/index.html +73 -73
  149. package/package.json +4 -4
  150. package/src/__tests__/fixtures/{pair-preview.ts → pair-config.ts} +3 -2
  151. package/src/__tests__/host-imports.test.ts +1 -0
  152. package/src/__tests__/mount.test.ts +8 -8
  153. package/src/components/app-config/ai-config.tsx +5 -1
  154. package/src/components/chat/__tests__/message-queue.test.tsx +17 -0
  155. package/src/components/chat/chat-panel.tsx +3 -7
  156. package/src/components/chat/chat-utils.ts +4 -8
  157. package/src/components/data-table/__tests__/context-menu-interaction.test.tsx +130 -0
  158. package/src/components/data-table/__tests__/date-popover.test.tsx +72 -0
  159. package/src/components/data-table/__tests__/export-actions.test.tsx +417 -6
  160. package/src/components/data-table/column-visibility-dropdown.tsx +8 -13
  161. package/src/components/data-table/columns.tsx +2 -1
  162. package/src/components/data-table/context-menu.tsx +36 -20
  163. package/src/components/data-table/date-popover.tsx +6 -4
  164. package/src/components/data-table/export-actions.tsx +263 -161
  165. package/src/components/data-table/row-viewer-panel/row-viewer.tsx +2 -2
  166. package/src/components/data-table/schemas.ts +14 -36
  167. package/src/components/editor/Output.tsx +5 -1
  168. package/src/components/editor/__tests__/dynamic-favicon.test.tsx +111 -18
  169. package/src/components/editor/actions/__tests__/pair-with-agent-commands.test.ts +80 -252
  170. package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +186 -34
  171. package/src/components/editor/actions/pair-with-agent-commands.ts +42 -51
  172. package/src/components/editor/actions/pair-with-agent-modal.tsx +96 -36
  173. package/src/components/editor/ai/add-cell-with-ai.tsx +3 -3
  174. package/src/components/editor/cell/CreateCellButton.tsx +8 -10
  175. package/src/components/editor/cell/code/__tests__/language-toggle.test.tsx +54 -0
  176. package/src/components/editor/cell/code/cell-editor.tsx +1 -1
  177. package/src/components/editor/cell/code/language-toggle.tsx +8 -7
  178. package/src/components/editor/chrome/wrapper/__tests__/attachment-status.test.tsx +277 -78
  179. package/src/components/editor/chrome/wrapper/footer-items/attachment-status.tsx +196 -41
  180. package/src/components/editor/connections/components.tsx +1 -1
  181. package/src/components/editor/controls/__tests__/command-palette.test.tsx +53 -0
  182. package/src/components/editor/controls/command-palette.tsx +22 -10
  183. package/src/components/editor/dynamic-favicon.tsx +21 -40
  184. package/src/components/editor/errors/__tests__/send-error-report-button.test.tsx +139 -36
  185. package/src/components/editor/errors/send-error-report-button.tsx +10 -7
  186. package/src/components/editor/file-tree/file-viewer.tsx +4 -2
  187. package/src/components/editor/output/MarimoTracebackOutput.tsx +28 -22
  188. package/src/components/editor/output/console/ConsoleOutput.tsx +8 -18
  189. package/src/components/pages/home-page.tsx +4 -4
  190. package/src/components/slides/slide-cell-view.tsx +1 -1
  191. package/src/components/tracing/tracing.tsx +2 -2
  192. package/src/core/attachments/__tests__/toast.test.tsx +58 -0
  193. package/src/core/attachments/state.ts +5 -8
  194. package/src/core/attachments/toast.ts +15 -0
  195. package/src/core/cells/__tests__/error-report.test.ts +53 -3
  196. package/src/core/cells/__tests__/notebook-outline.test.ts +113 -0
  197. package/src/core/cells/__tests__/session.test.ts +18 -3
  198. package/src/core/cells/cells.ts +2 -1
  199. package/src/core/cells/error-report.ts +14 -6
  200. package/src/core/cells/pending-delete-service.ts +2 -6
  201. package/src/core/cells/session.ts +19 -1
  202. package/src/core/config/pair.ts +5 -3
  203. package/src/core/datasets/__tests__/data-source-discovery.test.ts +4 -4
  204. package/src/core/datasets/data-source-discovery.ts +4 -6
  205. package/src/core/edit-app.tsx +2 -2
  206. package/src/core/host/AGENTS.md +11 -2
  207. package/src/core/host/__tests__/attachments.test.ts +56 -0
  208. package/src/core/host/__tests__/document.test.ts +126 -0
  209. package/src/core/host/__tests__/events.test.ts +49 -0
  210. package/src/core/host/__tests__/fixtures.ts +41 -0
  211. package/src/core/host/__tests__/notebook-client.test.ts +496 -0
  212. package/src/core/host/connection.ts +81 -0
  213. package/src/core/host/events.ts +68 -0
  214. package/src/core/host/notebook-client.ts +316 -0
  215. package/src/core/host/resources/attachments.ts +19 -0
  216. package/src/core/host/resources/document.ts +101 -0
  217. package/src/core/hotkeys/actions.ts +2 -4
  218. package/src/core/islands/__tests__/bootstrap.test.ts +0 -26
  219. package/src/core/islands/bootstrap.ts +0 -1
  220. package/src/core/network/connection.ts +4 -2
  221. package/src/core/run-app.tsx +2 -2
  222. package/src/core/runtime/__tests__/runtime.test.ts +5 -12
  223. package/src/core/runtime/runtime.ts +5 -5
  224. package/src/core/static/files.ts +2 -0
  225. package/src/core/websocket/__tests__/{useMarimoKernelConnection.test.ts → connection-state.test.ts} +15 -17
  226. package/src/core/websocket/__tests__/{useWebSocket.test.ts → createConnectionTransport.test.ts} +1 -1
  227. package/src/core/websocket/__tests__/useNotebookClient.hook.test.tsx +149 -0
  228. package/src/core/websocket/__tests__/{useMarimoKernelConnection.hook.test.tsx → useNotebookSession.hook.test.tsx} +168 -253
  229. package/src/core/websocket/connection-state.ts +70 -0
  230. package/src/core/websocket/state.ts +7 -0
  231. package/src/core/websocket/transports/__tests__/sse.test.ts +18 -4
  232. package/src/core/websocket/transports/create.ts +31 -0
  233. package/src/core/websocket/transports/sse.ts +14 -2
  234. package/src/core/websocket/transports/transport.ts +12 -23
  235. package/src/core/websocket/types.ts +9 -39
  236. package/src/core/websocket/useNotebookClient.ts +78 -0
  237. package/src/core/websocket/{useMarimoKernelConnection.tsx → useNotebookSession.tsx} +53 -233
  238. package/src/hooks/__tests__/useAsyncData.test.tsx +148 -0
  239. package/src/hooks/useAsyncData.ts +3 -3
  240. package/src/hooks/useDataSourceDiscovery.ts +6 -4
  241. package/src/hooks/useElapsedTime.ts +3 -3
  242. package/src/hooks/useInputHistory.ts +4 -7
  243. package/src/hooks/useResizeObserver.ts +4 -7
  244. package/src/mount.tsx +3 -3
  245. package/src/plugins/core/registerReactComponent.tsx +1 -1
  246. package/src/plugins/impl/DropdownPlugin.tsx +2 -6
  247. package/src/plugins/impl/FormPlugin.tsx +1 -1
  248. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +84 -0
  249. package/src/plugins/impl/anywidget/__tests__/registry.test.ts +2 -0
  250. package/src/plugins/impl/anywidget/__tests__/widget-binding.test.ts +241 -2
  251. package/src/plugins/impl/anywidget/runtime.ts +21 -9
  252. package/src/plugins/impl/anywidget/widget-binding.ts +160 -82
  253. package/src/plugins/impl/code/any-language-editor.tsx +2 -2
  254. package/src/plugins/impl/data-editor/glide-data-editor.tsx +8 -5
  255. package/src/plugins/impl/data-editor/glide-utils.ts +3 -1
  256. package/src/plugins/impl/mpl-interactive/MplInteractivePlugin.tsx +5 -3
  257. package/src/plugins/impl/panel/PanelPlugin.tsx +15 -16
  258. package/src/plugins/impl/panel/__tests__/utils.test.ts +39 -1
  259. package/src/plugins/impl/panel/utils.ts +17 -0
  260. package/src/plugins/impl/vega/make-selectable.ts +3 -6
  261. package/src/stories/__tests__/editor-story.test.tsx +33 -0
  262. package/src/stories/editor.stories.tsx +24 -17
  263. package/src/utils/__tests__/arrays.test.ts +35 -0
  264. package/src/utils/__tests__/numbers.test.ts +48 -1
  265. package/src/utils/__tests__/objects.test.ts +21 -0
  266. package/src/utils/arrays.ts +10 -0
  267. package/src/utils/numbers.ts +28 -17
  268. package/src/utils/objects.ts +3 -7
  269. package/src/utils/once.ts +19 -19
  270. package/dist/assets/CellStatus-nZpuDkm7.js +0 -1
  271. package/dist/assets/JsonOutput-d-k8v_17.js +0 -11
  272. package/dist/assets/MarimoErrorOutput-CLYUxiKW.js +0 -10
  273. package/dist/assets/ai-model-dropdown-C6GHHEdR.js +0 -5
  274. package/dist/assets/any-language-editor-BLCAD3yx.js +0 -1
  275. package/dist/assets/arrays-BqUx5USx.js +0 -1
  276. package/dist/assets/cell-link-1CynTVGQ.js +0 -1
  277. package/dist/assets/chat-panel-DDDTnLvB.js +0 -4
  278. package/dist/assets/code-visibility-B-_GvwR5.js +0 -1
  279. package/dist/assets/coerce-CpE6kUdX.js +0 -1
  280. package/dist/assets/command-palette-BZ13RKDJ.js +0 -1
  281. package/dist/assets/config-DX8Y2WbJ.js +0 -1
  282. package/dist/assets/config-FzDtjF1-.js +0 -1
  283. package/dist/assets/config-VPSq73n8.js +0 -1
  284. package/dist/assets/feedback-button-DlqZkJwz.js +0 -1
  285. package/dist/assets/file-explorer-panel-D3CphidS.js +0 -1
  286. package/dist/assets/index-CXIE-QEG.css +0 -2
  287. package/dist/assets/index-DnIgeCyQ.js +0 -29
  288. package/dist/assets/linear-0eij_aAG.js +0 -1
  289. package/dist/assets/links-DkkL9DVa.js +0 -1
  290. package/dist/assets/numbers-Mk3-CcoU.js +0 -1
  291. package/dist/assets/panels-B9x935By.js +0 -4
  292. package/dist/assets/precisionRound-Bq_nmf5u.js +0 -1
  293. package/dist/assets/process-output-DNFKMODr.js +0 -1
  294. package/dist/assets/react-vega-C3rYGtP6.js +0 -189
  295. package/dist/assets/run-page-CjdGaic3.js +0 -1
  296. package/dist/assets/tooltip-mT3CGest.js +0 -61
  297. package/dist/assets/tracing-BARlJ_Dk.js +0 -1
  298. package/dist/assets/useAsyncData-C7aJJz0Y.js +0 -1
  299. package/dist/assets/useBoolean-BDD6_xQQ.js +0 -1
  300. package/dist/assets/vega-component-CnadTgoE.js +0 -1
  301. package/dist/assets/vega-loader.browser-CLRkNgm7.js +0 -6
  302. package/src/core/host/__tests__/protocol.test.ts +0 -214
  303. package/src/core/host/protocol.ts +0 -1943
  304. package/src/core/websocket/useWebSocket.tsx +0 -88
@@ -34,6 +34,7 @@ import { DelayMount } from "@/components/utils/delay-mount";
34
34
  import { useAsyncData } from "@/hooks/useAsyncData";
35
35
  import { Banner, ErrorBanner } from "@/plugins/impl/common/error-banner";
36
36
  import type { GetRowResult } from "@/plugins/impl/DataTablePlugin";
37
+ import { Objects } from "@/utils/objects";
37
38
  import { NAMELESS_COLUMN_PREFIX, renderCellValue } from "../columns";
38
39
  import { prettifyRowCount } from "../pagination";
39
40
  import {
@@ -88,8 +89,7 @@ export const RowViewerPanel: React.FC<RowViewerPanelProps> = ({
88
89
  handleRowSelectionChange?.((prev) => {
89
90
  if (isRowSelected) {
90
91
  // Remove this row from selection
91
- const { [rowIdx]: removedRow, ...rest } = prev;
92
- return rest;
92
+ return Objects.filter(prev, (_, key) => key !== String(rowIdx));
93
93
  }
94
94
  // Add this row to selection
95
95
  return { ...prev, [rowIdx]: true };
@@ -3,42 +3,6 @@
3
3
  import z from "zod";
4
4
  import { rpc } from "@/plugins/core/rpc";
5
5
 
6
- export type DownloadFormat = "csv" | "json" | "parquet" | "tsv" | "geojson";
7
-
8
- /**
9
- * Per-request export options. Each field is optional. A missing field keeps
10
- * the widget's default for that setting.
11
- */
12
- export interface DownloadAsOptions {
13
- separator?: string;
14
- encoding?: string;
15
- ensure_ascii?: boolean;
16
- }
17
-
18
- export interface DownloadAsRequest {
19
- format: DownloadFormat;
20
- options?: DownloadAsOptions;
21
- geometry_column?: string | null;
22
- }
23
-
24
- export type DownloadAsArgs = (req: DownloadAsRequest) => Promise<{
25
- url: string;
26
- filename: string;
27
- error?: string | null;
28
- missing_packages?: string[] | null;
29
- code?:
30
- | "geometry_required"
31
- | "invalid_geometry"
32
- | "invalid_metadata"
33
- | "unsupported_representation"
34
- | "unsupported_version"
35
- | "missing_packages"
36
- | "missing_crs"
37
- | "conversion_failed"
38
- | null;
39
- column?: string | null;
40
- }>;
41
-
42
6
  const DownloadRequestSchema = z.object({
43
7
  geometry_column: z.string().nullish(),
44
8
  options: z
@@ -88,6 +52,20 @@ export const DownloadGeoJSONSchema = rpc
88
52
  }),
89
53
  );
90
54
 
55
+ export type DownloadAsRequest =
56
+ | z.infer<typeof DownloadAsSchema.input>
57
+ | z.infer<typeof DownloadGeoJSONSchema.input>;
58
+
59
+ type DownloadResponse =
60
+ | z.infer<typeof DownloadAsSchema.output>
61
+ | z.infer<typeof DownloadGeoJSONSchema.output>;
62
+
63
+ export type DownloadFormat = DownloadAsRequest["format"];
64
+ export type DownloadAsOptions = NonNullable<DownloadAsRequest["options"]>;
65
+ export type DownloadAsArgs = (
66
+ req: DownloadAsRequest,
67
+ ) => Promise<DownloadResponse>;
68
+
91
69
  export type DownloadAsFunction = (
92
70
  req: z.infer<typeof DownloadAsSchema.input>,
93
71
  ) => Promise<z.infer<typeof DownloadAsSchema.output>>;
@@ -66,7 +66,10 @@ export type OnRefactorWithAI = (opts: {
66
66
  * Renders an output based on an OutputMessage.
67
67
  */
68
68
  export const OutputRenderer: React.FC<{
69
- message: Pick<OutputMessage, "channel" | "data" | "mimetype" | "code">;
69
+ message: Pick<
70
+ OutputMessage,
71
+ "channel" | "data" | "mimetype" | "code" | "traceback_format"
72
+ >;
70
73
  cellId?: CellId;
71
74
  onRefactorWithAI?: OnRefactorWithAI;
72
75
  wrapText?: boolean;
@@ -185,6 +188,7 @@ export const OutputRenderer: React.FC<{
185
188
  <MarimoTracebackOutput
186
189
  onRefactorWithAI={onRefactorWithAI}
187
190
  traceback={data}
191
+ tracebackFormat={message.traceback_format}
188
192
  code={message.code}
189
193
  cellId={cellId}
190
194
  />
@@ -1,17 +1,41 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
- import { render, waitFor } from "@testing-library/react";
3
+ import {
4
+ act,
5
+ render as renderComponent,
6
+ waitFor,
7
+ } from "@testing-library/react";
4
8
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
5
- import { useCellErrors } from "@/core/cells/cells";
9
+ import { Provider, createStore } from "jotai";
10
+ import type { ReactNode } from "react";
11
+ import { MockNotebook } from "@/__mocks__/notebook";
12
+ import { cellId } from "@/__tests__/branded";
13
+ import { notebookAtom } from "@/core/cells/cells";
6
14
  import { DynamicFavicon } from "../dynamic-favicon";
7
15
 
8
- // Mock useCellErrors hook
9
- vi.mock("@/core/cells/cells", () => ({
10
- useCellErrors: vi.fn(),
11
- }));
12
-
13
16
  describe("DynamicFavicon", () => {
14
17
  let favicon: HTMLLinkElement;
18
+ let store: ReturnType<typeof createStore>;
19
+ const id = cellId("cell");
20
+
21
+ function render(ui: ReactNode) {
22
+ return renderComponent(ui, {
23
+ wrapper: ({ children }) => <Provider store={store}>{children}</Provider>,
24
+ });
25
+ }
26
+
27
+ function setErrors() {
28
+ store.set(
29
+ notebookAtom,
30
+ MockNotebook.notebookStateWithErrors([
31
+ {
32
+ cellId: id,
33
+ cellName: "cell",
34
+ errorData: [MockNotebook.errors.syntax("Invalid syntax")],
35
+ },
36
+ ]),
37
+ );
38
+ }
15
39
 
16
40
  beforeEach(() => {
17
41
  document
@@ -27,15 +51,20 @@ describe("DynamicFavicon", () => {
27
51
  // Mock document.hasFocus
28
52
  vi.spyOn(document, "hasFocus").mockReturnValue(true);
29
53
 
30
- // Mock useCellErrors to return no errors by default
31
- (useCellErrors as ReturnType<typeof vi.fn>).mockReturnValue([]);
54
+ store = createStore();
55
+ store.set(
56
+ notebookAtom,
57
+ MockNotebook.notebookState({
58
+ cellData: { [id]: { code: "x = 1" } },
59
+ }),
60
+ );
32
61
  });
33
62
 
34
63
  afterEach(() => {
35
64
  document
36
65
  .querySelectorAll("link[rel~='icon']")
37
66
  .forEach((element) => element.remove());
38
- vi.clearAllMocks();
67
+ vi.restoreAllMocks();
39
68
  vi.useRealTimers();
40
69
  });
41
70
 
@@ -67,9 +96,7 @@ describe("DynamicFavicon", () => {
67
96
  });
68
97
 
69
98
  it("should show error favicon when run completes with errors", async () => {
70
- (useCellErrors as ReturnType<typeof vi.fn>).mockReturnValue([
71
- { error: "mock error" },
72
- ]);
99
+ setErrors();
73
100
 
74
101
  const { rerender } = render(<DynamicFavicon isRunning={true} />);
75
102
 
@@ -147,6 +174,72 @@ describe("DynamicFavicon", () => {
147
174
  });
148
175
  });
149
176
 
177
+ it("does not look up or rewrite the favicon when code changes", async () => {
178
+ const { rerender } = render(<DynamicFavicon isRunning={true} />);
179
+ await waitFor(() => expect(favicon.href).toContain("circle-play.ico"));
180
+ rerender(<DynamicFavicon isRunning={false} />);
181
+ await waitFor(() => expect(favicon.href).toContain("circle-check.ico"));
182
+ const lookup = vi.spyOn(document, "querySelector");
183
+ const write = vi.spyOn(favicon, "href", "set");
184
+
185
+ await act(async () => {
186
+ store.set(notebookAtom, (state) => ({
187
+ ...state,
188
+ cellData: {
189
+ ...state.cellData,
190
+ [id]: { ...state.cellData[id], code: "x = 2" },
191
+ },
192
+ }));
193
+ });
194
+
195
+ expect(
196
+ lookup.mock.calls.filter(
197
+ ([selector]) => selector === "link[rel~='icon']",
198
+ ),
199
+ ).toEqual([]);
200
+ expect(write).not.toHaveBeenCalled();
201
+ lookup.mockRestore();
202
+ write.mockRestore();
203
+ });
204
+
205
+ it("updates the favicon when the error count changes", async () => {
206
+ const { rerender } = render(<DynamicFavicon isRunning={true} />);
207
+ await waitFor(() => expect(favicon.href).toContain("circle-play.ico"));
208
+ rerender(<DynamicFavicon isRunning={false} />);
209
+ await waitFor(() => expect(favicon.href).toContain("circle-check.ico"));
210
+
211
+ act(() => setErrors());
212
+ await waitFor(() => expect(favicon.href).toContain("circle-x.ico"));
213
+
214
+ act(() =>
215
+ store.set(
216
+ notebookAtom,
217
+ MockNotebook.notebookState({ cellData: { [id]: {} } }),
218
+ ),
219
+ );
220
+ await waitFor(() => expect(favicon.href).toContain("circle-check.ico"));
221
+ });
222
+
223
+ it("keeps the completion icon until its own reset timer expires", async () => {
224
+ vi.useFakeTimers();
225
+ const { rerender } = render(<DynamicFavicon isRunning={true} />);
226
+ await act(() => vi.advanceTimersByTimeAsync(1000));
227
+ rerender(<DynamicFavicon isRunning={false} />);
228
+ await act(() => vi.advanceTimersByTimeAsync(2000));
229
+ expect(favicon.href).toContain("circle-check.ico");
230
+ await act(() => vi.advanceTimersByTimeAsync(1000));
231
+ expect(favicon.href).toContain("favicon.ico");
232
+ });
233
+
234
+ it("cancels the reset timer when unmounted", async () => {
235
+ vi.useFakeTimers();
236
+ const { unmount } = render(<DynamicFavicon isRunning={true} />);
237
+ await act(() => vi.advanceTimersByTimeAsync(0));
238
+ expect(vi.getTimerCount()).toBe(1);
239
+ unmount();
240
+ expect(vi.getTimerCount()).toBe(0);
241
+ });
242
+
150
243
  describe("notifications", () => {
151
244
  beforeEach(() => {
152
245
  vi.spyOn(document, "visibilityState", "get").mockReturnValue("hidden");
@@ -156,7 +249,7 @@ describe("DynamicFavicon", () => {
156
249
  global.Notification.permission = "granted";
157
250
  });
158
251
 
159
- it("should send success notification when run completes without errors", () => {
252
+ it("should send success notification when run completes without errors", async () => {
160
253
  // @ts-expect-error ok in tests
161
254
  global.Notification = vi
162
255
  .fn()
@@ -172,12 +265,11 @@ describe("DynamicFavicon", () => {
172
265
 
173
266
  const { rerender } = render(<DynamicFavicon isRunning={true} />);
174
267
  rerender(<DynamicFavicon isRunning={false} />);
268
+ await waitFor(() => expect(Notification).toHaveBeenCalledOnce());
175
269
  });
176
270
 
177
- it("should send error notification when run completes with errors", () => {
178
- (useCellErrors as ReturnType<typeof vi.fn>).mockReturnValue([
179
- { error: "mock error" },
180
- ]);
271
+ it("should send error notification when run completes with errors", async () => {
272
+ setErrors();
181
273
 
182
274
  // @ts-expect-error ok in tests
183
275
  global.Notification = vi
@@ -194,6 +286,7 @@ describe("DynamicFavicon", () => {
194
286
 
195
287
  const { rerender } = render(<DynamicFavicon isRunning={true} />);
196
288
  rerender(<DynamicFavicon isRunning={false} />);
289
+ await waitFor(() => expect(Notification).toHaveBeenCalledOnce());
197
290
  });
198
291
 
199
292
  it("should not send notification when document is visible", () => {